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


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);

Я також спробував програмно оновити вузол / Entity в 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();

}

але не пощастило.

Окрім того, я спробував використовувати різні гачки entit_presave, entit_update, node_update, але нічого не змінило.

Відповіді:


25

Ви можете спробувати цей код:

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

Дякую, що це спрацювало, якщо хтось інший хоче додати інші можливі варіанти, не соромтесь додати ще одну відповідь.
Без зачистки

1
@NoSssweat: чи я маю рацію припускати, що рядок "body" у коді, показаному у цій відповіді, насправді не потрібен, щоб відповісти на ваше запитання? І що цей рядок швидше ілюструє, як ви можете робити подібні речі з (наприклад) тілом? Крім того, оскільки ваше запитання стосувалося "поля", чи не могли б ви використовувати подібний рядок, як рядок з "body" для користувацького поля, з назвою машини (скажімо) field_my_extra_field? Вибачте за те, що це здається викраденням відповіді на запитання нових питань, але просто "показ коду" у відповіді (без жодних пояснень) не сприймається як хороша практика і тут, правда?
Pierre.Vriens

1
@ Pierre.Vriens Я використовував заголовок у своєму Q для простоти. Я подумав, якби я знав, як змінити назву, це було б однаково для будь-якого поля, просто змінити ім’я машини. Виявляється, що у цій відповіді використовується специфічний метод для зміни заголовка, який би не працював для жодного іншого поля, тому насправді важливо, щоб він показав метод для тіла.
Без розмивання

Я не можу підключити цей гачок. Я редагую тип вмісту, натискаю надіслати, але нічого.
Пан Пабло

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)
  }
}

Редагувати:

До коду додано заяву про використання.


1
просто спробував ваш код, але він порушує сайт, отримуючи класикуThe website encountered an unexpected error. Please try again later.
No Sssweat

1
Цей код лише для того, щоб продемонструвати, як користуватися гачком. Вам потрібні правильні заяви про використання. Це можна дізнатись, якщо заглянути в сторожову службу (/ admin / report / dblog).
4k4

1
додавання use Drupal\node\NodeInterface;коду більше не розбиває сайт, але після збереження вузла я отримую помилку 500, як я потрапляв у своє запитання, і журнали нічого не записують про це.
Без розмивання

1
Я хотів лише вказати на проблему: не завантажуйте новий примірник вузла, а використовуйте той, який надається як функціональний параметр. Яка помилка стоїть за 500? Перевірте свої файли журналу або увімкніть журнал помилок.
4k4

1
Я очищую журнал, тому я не плутаюсь з усіма іншими попередніми помилками, але після збереження та отримання помилки кілька разів файли журналу порожні
Ні Sssweat

3

Назви в Drupal 8 не встановлюються як стандартні поля; вони мають свою функцію. Використовуйте $node->setTitle('New Title');для вузла або $entity->setLabel('New Title');для родової сутності. Для отримання додаткової інформації див. Node :: setTitle .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.