以编程方式更新 Drupal 8 上的节点字段
Updating node fields on Drupal 8 programmatically
我正在使用 Drupal 8 并尝试以编程方式更新以下节点的字段:
- 已经保存
- 未发表
我希望能够同时发布多个节点,并有我的钩子 运行,以编程方式将标准值添加到所有新发布的节点。
我在这里查看了解决方案:
How to manipulate value before node is saved in Drupal 8?
...和这里:
https://drupal.stackexchange.com/questions/304363/add-a-hero-image-and-text-when-a-node-goes-from-unpublished-to-published
...但是当我实施这些建议时(例如在我下面的代码中),我的内容节点上的字段没有更新,它们仍然是空的。
如果你知道我怎么更新这个,请指教。谢谢。
模块结构:
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);
}
}
}
您的代码存在问题,您试图将整个媒体实体设置为一个值 (target_id)。相反,您的字段“field_hero_image”可能是一个媒体参考字段,因此您只需要设置目标 ID。由于您已经知道目标 ID (53),因此根本不需要加载媒体实体:
$entity->set('field_hero_image', 53);
或者如果你想设置整个实体:
$entity->field_hero_image->entity = $media;
我正在使用 Drupal 8 并尝试以编程方式更新以下节点的字段:
- 已经保存
- 未发表
我希望能够同时发布多个节点,并有我的钩子 运行,以编程方式将标准值添加到所有新发布的节点。
我在这里查看了解决方案: How to manipulate value before node is saved in Drupal 8? ...和这里: https://drupal.stackexchange.com/questions/304363/add-a-hero-image-and-text-when-a-node-goes-from-unpublished-to-published
...但是当我实施这些建议时(例如在我下面的代码中),我的内容节点上的字段没有更新,它们仍然是空的。
如果你知道我怎么更新这个,请指教。谢谢。
模块结构:
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);
}
}
}
您的代码存在问题,您试图将整个媒体实体设置为一个值 (target_id)。相反,您的字段“field_hero_image”可能是一个媒体参考字段,因此您只需要设置目标 ID。由于您已经知道目标 ID (53),因此根本不需要加载媒体实体:
$entity->set('field_hero_image', 53);
或者如果你想设置整个实体:
$entity->field_hero_image->entity = $media;