以编程方式更新字段的值


14

我想在更新节点时更新节点字段的值。

使用此处提到的代码尝试过以编程方式更新节点Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

但它没有用。保存节点后出现500错误。我也尝试取出if语句并指定节点ID$node = Node::load(1);

我还尝试在Drupal 8中以编程方式使用更新节点/实体

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

但也没有运气。

另外,我尝试使用不同的钩子entity_presave,entity_update,node_update,但没有任何区别。

Answers:


25

您可以尝试以下代码:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

感谢这项工作,如果其他人想添加其他可能的变体,请随时添加其他答案。
没有Sssweat

1
@NoSssweat:我是否认为回答这个问题实际上并不需要在代码中带有“ body”的行?那条线反而说明了您如何用(例如)身体做类似的事情?另外,由于您的问题是关于“字段”的,您是否可以使用类似的行作为带有机器名(例如)field_my_extra_field的自定义字段的“ body”行?抱歉,有人似乎劫持了提出新问题的答案,但在答案中“完全显示代码”(根本没有任何解释)在这里也不被认为是一种好习惯,对吗?
Pierre.Vriens

1
@ Pierre.Vriens为了简单起见,我在我的Q中使用了title。我想知道是否知道如何更改标题,对于任何字段都一样,只是更改计算机名称。事实证明,此答案使用一种特定的方法来更改标题,该标题不适用于任何其他字段,因此,他为身体显示该方法实际上很重要。
没有Sssweat

我无法解决这个问题。我编辑一个内容类型,单击提交,但是什么也没有。
Pablo先生

7

这是使用最初尝试使用的钩子的另一个变体。

我认为您的代码存在的问题是您尝试加载该节点的新实例,但是您应该使用作为参数提供的节点$entity

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

编辑:

在代码中添加了use语句。


1
刚刚尝试过您的代码,但它破坏了网站,获得了经典The website encountered an unexpected error. Please try again later.
No Sssweat

1
此代码仅用于演示如何使用该钩子。您需要正确的使用声明。如果您查看看门狗(/ admin / reports / dblog),则可以找到答案。
4k4,6:56

1
添加use Drupal\node\NodeInterface;代码不再自动中断站点,但是保存节点后,出现500错误,就像我遇到的问题一样,日志未记录任何有关它的信息。
没有Sssweat

1
我只想指出问题:不要加载该节点的新实例,而要使用提供的那个作为函数参数。500后面有什么错误?请检查您的日志文件或打开错误日志记录。
4k4,7

1
我清除了日志,因此我不会与之前的所有其他错误混淆,但是在多次保存并获取错误之后,日志文件为空
No Sssweat

3

Drupal 8中的标题设置与标准字段不同;他们有自己的功能。使用$node->setTitle('New Title');一个节点或$entity->setLabel('New Title');一个通用的实体。有关更多信息,请参见Node :: setTitle

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.