Рейтинг:1

Add a hero image and text when a node goes from unpublished to published

флаг es

I'm trying to add a hero image and text when a node goes from unpublished to published. The things include:

  1. Add an image from my media library to a media field on the node
  2. Add a page title to the node, drawing upon a field already saved on the node

I'm attempting to build a hook on hook_node_update() but it's not working. I'm not sure why.

The code I am using, part of the running_event_adding_header.module file, is the following.

namespace Drupal\Core\Field\EntityReferenceFieldItemList;
namespace Drupal\node\Entity;


/**
 * Implements hook_node_update()
 */
 
function running_event_adding_header_node_update(Drupal\Core\Entity\EntityInterface $entity) {
  // End function if the entity is not an event
  if ($entity->bundle() !== 'event') {
    return;
  }
  
  // End function if the event is not a running type of event (running events are '30' in my system)
  if ($entity->bundle() === 'event' && $entity->get('field_event_type')->getString() != '30') {
      return;
  }

  // Check if the new state is "published" and the old state was something other than "published".

  if ($entity->get('moderation_state')->getString() === 'published') {

    /**
    * Add hero image and text to running event page, if not already present
    * The hero image field is 'field_hero_image'
    * The hero text field is 'field_tagline'
    */

    if ($entity->get('field_hero_image')->isEmpty()) {
      $media = Media::load(53); // 53 is the media ID for the image I'm wanting to load on all running pages: .../media/53/edit
      $entity->set('field_hero_image', $media);
    }

    //'field_tagline' is the hero title field
    if ($entity->get('field_tagline')->isEmpty()) {
      $entity->set('field_tagline', $entity->label());
    }
    $entity->save();  
  }
}//close function

Updated code (29 July).

Per @sonfd's recommendation, this uses hook_node_presave(), but is still not changing the node pages:

<?php

namespace Drupal\Core\Field\EntityReferenceFieldItemList;
namespace Drupal\node\Entity;

//In the function below, I'm attempting to update
//'event' type nodes, specifically those with an event_type of '30'

//In those nodes, I'm attempting to use a Media library image 
//and use the page's title in the hero section


function running_event_add_default_node_presave(Drupal\node\NodeInterface $entity) {
  if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {
    if ($entity->get('field_hero_tagline')->isEmpty()) {
      $entity->set('field_hero_tagline', $entity->label());
    }
    if ($entity->get('field_hero_image')->isEmpty()) {
      $media = Media::load(53); 
      $entity->set('field_hero_image', $media);
    }
  }



}

sonfd avatar
флаг in
1. Удалите эти пространства имен - их там быть не должно. 2. Каково машинное имя вашего модуля и где в вашем модуле находится хук для сохранения. 3. Что должен делать `$entity->get('field_event_type')->toString() === '30'`? Я не думаю, что это делает то, что вы хотите. Является ли field_event_type ссылкой на сущность, а 30 — это идентификатор сущности, которую вы проверяете?
scaffolding avatar
флаг es
1. Они ушли! 2. Машинное имя модуля и его каталог — `running_event_add_default_content`. Хук presave находится в файле модуля, который сохраняется в каталоге модуля. Код в файле модуля вставлен выше. 3. Вы правы, эта строка предназначена для просмотра поля field_event_type типа события, а затем преобразования этого значения в строку. Тип события позволяет нам повторно использовать шаблон события для различных типов событий. Текущие события равны значению «30».
sonfd avatar
флаг in
Ваш хук назван неправильно.Это должно быть `running_event_add_default_content_node_presave`, то есть `NAME_OF_MODULE_node_presave`
scaffolding avatar
флаг es
Извините, я опечатался; они правильно названы в моем коде. Я удалил `if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {` и, к сожалению, это то же самое результат - новое изображение и основной текст не добавляются.
sonfd avatar
флаг in
Код, который вы показываете, должен работать. Вы уверены, что поля пусты и ваш модуль включен?
scaffolding avatar
флаг es
Спасибо - я думаю, это связано с тем, как я имею в виду поля? В настоящее время я получаю эту ошибку, когда пытаюсь сохранить узел события: `Drupal\Core\Entity\EntityStorageException: поле field_hero_tagline неизвестно. в Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (строка 846 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php). `
scaffolding avatar
флаг es
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/128041/discussion-between-scaffolding-and-sonfd).
Рейтинг:2
флаг in

Вы не можете использовать крючок_ENTITY_TYPE_update() для обновления данных объекта. Это отмечено в документации хука:

Этот хук запускается после обновления хранилища сущностей. Обратите внимание, что реализации ловушек не могут изменять сохраненные данные объекта. Получите исходный объект сущности из $entity->original.

Если вам нужно обновить данные объекта, используйте hook_ENTITY_TYPE_presave() вместо. Обратите внимание, что с помощью hook_ENTITY_TYPE_presave() ты не должен звонить $ сущность-> сохранить (), вы просто устанавливаете значения объекта и позволяете объекту сохраняться самостоятельно.

scaffolding avatar
флаг es
Спасибо @sonfd! Я пробовал это, но до сих пор не вижу обновления узла событий после публикации. Код, который я использовал: getType() == 'event') { //update the fundraising target field, 'field_target' $entity->set("field_target", "109"); } } ```
scaffolding avatar
флаг es
В идеале должно произойти следующее: узел создается и сохраняется в неопубликованном состоянии. Редактор просматривает, а затем публикует. Когда они публикуются, функция должна добавлять дополнительные значения. Я не могу заставить эту часть работать — даже более простой пример в моем комментарии выше не создает новое значение при публикации.
sonfd avatar
флаг in
Можете ли вы опубликовать обновленный код в своем вопросе? Также у вас, похоже, определено несколько пространств имен, но должны ли они быть операторами использования? Вы уверены, что ваш код вообще срабатывает?
scaffolding avatar
флаг es
Спасибо @sonfd - обновленный код теперь включен в мой вопрос.Код, кажется, срабатывает; если я включу в него опечатку, Drupal выдаст сообщение об ошибке.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.