Программно обновить значение поля

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 и указать идентификатор узла$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, но безрезультатно.

Нет Sssweat
источник

Ответы:

25

Вы можете попробовать этот код:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
источник
Спасибо, это сработало, если кто-то еще хочет добавить другие возможные варианты, не стесняйтесь добавлять еще один ответ.
Нет Sssweat
1
@ NoSssweat: я прав, предполагая, что строка с «телом» в коде, показанном в этом ответе, не нужна для ответа на ваш вопрос? И что эта строка скорее иллюстрирует, как вы можете делать подобные вещи с (например) телом? Кроме того, поскольку ваш вопрос касался «поля», можете ли вы использовать строку, аналогичную строке с «телом» для настраиваемого поля с именем машины (скажем) field_my_extra_field? Извините за то, что вы, похоже, угоняете ответ, чтобы задавать новые вопросы, но просто «показ кода» в ответе (без объяснений) здесь тоже не считается хорошей практикой, верно?
Pierre.Vriens
1
@ Pierre.Vriens Я использовал заголовок в своем вопросе Q для простоты. Я подумал, что если я знаю, как изменить заголовок, он будет одинаковым для любого поля, просто измените имя машины. Оказывается, этот ответ использует определенный метод для изменения заголовка, который не будет работать для любого другого поля, поэтому на самом деле важно, чтобы он показал метод для тела.
Нет Sssweat
Я не могу заставить этот крючок выстрелить. Я редактирую тип контента, нажимаю «Отправить», но ничего.
Мистер Пабло
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)
  }
}

Редактировать:

Добавлен оператор использования в код.

4k4
источник
1
только что попробовал ваш код, но он ломает сайт, получая классикуThe website encountered an unexpected error. Please try again later.
No Sssweat
1
Этот код предназначен только для демонстрации использования хука. Вам нужны правильные заявления использования. Вы можете узнать это, если загляните в watchdog (/ admin / reports / dblog).
4k4
1
добавление use Drupal\node\NodeInterface;кода больше не нарушает работу сайта автоматически, но после сохранения узла я получаю ошибку 500, как будто я получаю в своем вопросе, и в журналах ничего не записывается.
Нет Sssweat
1
Я только хотел указать на проблему: не загружайте новый экземпляр узла, а используйте предоставленный в качестве параметра функции. Какая ошибка за 500? Пожалуйста, проверьте свои файлы журнала или включите регистрацию ошибок.
4k4
1
Я очищаю журнал, так что я не путаюсь со всеми другими предыдущими ошибками, но после сохранения и получения ошибки несколько раз пустые файлы журнала
Нет Sssweat
3

Заголовки в Drupal 8 не устанавливаются как стандартные поля; у них есть своя функция. Используйте $node->setTitle('New Title');для узла или $entity->setLabel('New Title');для общего объекта. Смотрите Node :: setTitle для получения дополнительной информации.

Том Бисглия
источник