【问题标题】:Drupal 8: updating node programmatically does not update the state of the node in a viewDrupal 8:以编程方式更新节点不会更新视图中节点的状态
【发布时间】:2018-10-15 18:26:00
【问题描述】:

我有一个“代理”节点类型,它有一个名为“has_subscription”的布尔字段。

然后我有一个视图,它只显示“has_subscription”为 true 的代理机构。

一切都好。

我正在像这样以编程方式更新字段的值:

$node = node_load($nid);
$node->set("field_has_subscription", 1);
$node->save();

如果我随后编辑节点,我可以看到布尔字段的复选框现在已选中。太好了。

但是,视图仍未显示此节点。只有当我保存节点编辑页面时它才会开始出现。

我需要在代码中添加什么吗?

【问题讨论】:

  • 我刚刚注意到这只发生在生产站点上。在我的本地环境中,它运行良好。所以也许它与缓存有关? (如果我通过编辑页面保存节点,但如果我以编程方式保存节点,它怎么会起作用?)

标签: drupal-8 drupal-views


【解决方案1】:

将节点设置为在保存时发布

use Drupal\node\Entity\Node;

$node = Node::load($nid); 
//set value for field
$node->field_has_subscription->value = TRUE;
// set node to publish 
$node->setPublished(TRUE);
//save to update node
$node->save();

【讨论】:

  • 感谢您的提示。我会将这个答案标记为已接受的答案,因为它对我有用,但很可能其他两个答案也有效 - 关键可能是使用 $node = Node::load($nid);而不是 node_load($nid)。
  • 是的 node_load 将会贬值,并且会在 Drupal 9.0 之前被移除。使用 \Drupal\node\Entity\Node::load() 是加载节点的最佳方法。
【解决方案2】:

如果您使用的是 Drupal 8,请在您的文件中重写以下代码并检查它。

use Drupal\node\Entity\Node;

$node = Node::load($nid);

//set value for field
$node->field_has_subscription->value = TRUE;

//save to update node
$node->save();

【讨论】:

  • 谢谢,不幸的是它似乎没有什么不同。它工作正常并更新节点上的字段,但视图仍然不显示节点。只有当我转到节点编辑表单并提交它时它才会这样做。
【解决方案3】:

使用下面的代码

$node  =  \Drupal\node\Entity\Node::load($nid);
$node->set('field_has_subscription', 1);
$node->save();

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多