I'm trying to add a hero image and text when a node goes from unpublished to published. The things include:
- Add an image from my media library to a media field on the node
- 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);
}
}
}