Reputation: 163
I'm using Drupal 8 and trying to programmatically update fields of nodes that are:
I'd like to be able to publish multiple nodes at the same time, and have my hook run, programmatically adding standard values to all newly-published nodes.
I've looked at the solutions here: How to manipulate value before node is saved in Drupal 8? ...and here: https://drupal.stackexchange.com/questions/304363/add-a-hero-image-and-text-when-a-node-goes-from-unpublished-to-published
...but when I implement these recommendations (e.g. in my code below), the fields on my content nodes are not being updated, they remain empty.
If you know how I can update this, please advise. Thank you.
Module structure:
module_name
module_name.info
module_name.module
module_name.module:
<?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 module_name_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);
}
}
}
Upvotes: 1
Views: 2838
Reputation: 9022
The problem with your code is, that you are trying to set the whole media entity as a value (target_id). Instead, your field "field_hero_image" is probably a media reference field and thus you only need to set the target id. And as you already know the target id (53), there is no need to load the media entity at all:
$entity->set('field_hero_image', 53);
or if you want to set the whole entity:
$entity->field_hero_image->entity = $media;
Upvotes: 1