Score: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 flag
1. ลบเนมสเปซเหล่านั้น - ไม่ควรมีอยู่ 2. ชื่อเครื่องของโมดูลของคุณคืออะไร และตะขอเก็บล่วงหน้าอยู่ที่ตำแหน่งใดในโมดูลของคุณ 3. `$entity->get('field_event_type')->toString() === '30'` ควรจะทำอะไร? ฉันไม่คิดว่ามันกำลังทำในสิ่งที่คุณต้องการ field_event_type คือการอ้างอิงเอนทิตีและ 30 คือรหัสของเอนทิตีที่คุณกำลังตรวจสอบใช่หรือไม่
scaffolding avatar
es flag
1. หายไปแล้ว! 2. ชื่อเครื่องของโมดูลและไดเร็กทอรีคือ `running_event_add_default_content` เบ็ดที่บันทึกล่วงหน้าอยู่ในไฟล์โมดูลซึ่งบันทึกไว้ในไดเร็กทอรีโมดูล รหัสในไฟล์โมดูลถูกวางด้านบน 3. คุณพูดถูก บรรทัดนี้มีไว้เพื่อดูฟิลด์ 'field_event_type' ของประเภทเหตุการณ์ จากนั้นเปลี่ยนค่านั้นเป็นสตริง ประเภทเหตุการณ์เป็นวิธีที่เรานำเทมเพลตเหตุการณ์กลับมาใช้ใหม่สำหรับเหตุการณ์ประเภทต่างๆ เหตุการณ์ที่กำลังทำงานอยู่มีค่าเท่ากับ '30'
sonfd avatar
in flag
ขอชื่อของคุณไม่ถูกต้องควรเป็น `running_event_add_default_content_node_presave` เช่น `NAME_OF_MODULE_node_presave`
scaffolding avatar
es flag
ขอโทษ ฉันพิมพ์ผิด; พวกเขาตั้งชื่ออย่างถูกต้องในรหัสของฉัน ฉันได้ลบ ` if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {` และน่าเสียดายที่มันเหมือนกัน ผลลัพธ์ - ไม่มีการเพิ่มรูปภาพและข้อความฮีโร่ใหม่
sonfd avatar
in flag
รหัสที่คุณแสดงควรใช้งานได้ คุณแน่ใจหรือว่าฟิลด์ว่างเปล่าและโมดูลของคุณเปิดใช้งานอยู่
scaffolding avatar
es flag
ขอบคุณ - ฉันคิดว่ามันเกี่ยวข้องกับวิธีที่ฉันอ้างถึงเขตข้อมูลหรือไม่ ขณะนี้ฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามบันทึกโหนดเหตุการณ์: `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 flag
ให้เรา [สนทนาต่อในแชท](https://chat.stackexchange.com/rooms/128041/discussion-between-scaffolding-and-sonfd)
Score:2
ธง in

คุณไม่สามารถใช้ hook_ENTITY_TYPE_update() เพื่ออัปเดตข้อมูลของเอนทิตี สิ่งนี้ถูกบันทึกไว้ในเอกสารของ hook:

ตะขอนี้ทำงานเมื่อมีการอัปเดตที่เก็บข้อมูลเอนทิตี โปรดทราบว่าการใช้งาน hook ไม่สามารถแก้ไขข้อมูลเอนทิตีที่เก็บไว้ได้ รับวัตถุเอนทิตีดั้งเดิมจาก $entity->original

หากคุณต้องการอัปเดตข้อมูลของเอนทิตี ให้ใช้ hook_ENTITY_TYPE_presave() แทน. โปรดทราบว่าด้วย hook_ENTITY_TYPE_presave() คุณต้องไม่โทร $entity->บันทึก()คุณเพียงแค่ตั้งค่าของเอนทิตีและปล่อยให้เอนทิตีบันทึกด้วยตัวเอง

scaffolding avatar
es flag
ขอบคุณ @sonfd! ฉันลองแล้ว แต่ยังไม่เห็นการอัปเดตโหนดเหตุการณ์หลังจากการเผยแพร่ รหัสที่ฉันใช้คือ: getType() == 'event') { //update the fundraising target field, 'field_target' $entity->set("field_target", "109"); } } ```
scaffolding avatar
es flag
สิ่งที่ควรเกิดขึ้นคือ: โหนดถูกสร้างขึ้นและบันทึกในสถานะที่ไม่ได้เผยแพร่ บรรณาธิการตรวจสอบแล้วเผยแพร่ เมื่อเผยแพร่ ฟังก์ชันควรเพิ่มค่าเพิ่มเติม ฉันไม่สามารถทำให้ส่วนนั้นทำงานได้ - แม้แต่ตัวอย่างที่ง่ายกว่าในความคิดเห็นของฉันด้านบนก็ไม่ได้สร้างคุณค่าใหม่เมื่อเผยแพร่
sonfd avatar
in flag
คุณสามารถโพสต์รหัสที่อัปเดตในคำถามของคุณได้หรือไม่? ดูเหมือนว่าคุณได้กำหนดเนมสเปซหลายรายการ แต่สิ่งเหล่านั้นควรจะเป็นคำสั่งการใช้งานหรือไม่ คุณแน่ใจหรือว่ารหัสของคุณกำลังทำงานอยู่
scaffolding avatar
es flag
ขอบคุณ @sonfd - ตอนนี้รหัสที่อัปเดตรวมอยู่ในคำถามของฉันแล้วรหัสดูเหมือนจะเริ่มทำงาน ถ้าฉันพิมพ์ผิด Drupal จะตอบกลับพร้อมแสดงข้อผิดพลาด

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา