Điểm:1

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

lá cờ 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
lá cờ in
1. Xóa những không gian tên đó - chúng không nên ở đó. 2. Tên máy của mô-đun của bạn là gì và móc lưu sẵn nằm ở đâu trong mô-đun của bạn. 3. `$entity->get('field_event_type')->toString() === '30'` được cho là đang làm gì? Tôi không nghĩ rằng nó đang làm những gì bạn muốn. field_event_type có phải là tham chiếu thực thể và 30 là id của thực thể mà bạn đang kiểm tra không?
scaffolding avatar
lá cờ es
1. Họ đi rồi! 2. Tên máy của mô-đun và thư mục của nó là `running_event_add_default_content`. Presave hook nằm trong tệp mô-đun, tệp này được lưu trong thư mục mô-đun. Mã trong tệp mô-đun được dán ở trên. 3. Bạn nói đúng, dòng đó có nghĩa là xem xét trường 'field_event_type' của loại sự kiện, sau đó biến giá trị đó thành một chuỗi. Loại sự kiện là một cách để chúng tôi sử dụng lại mẫu sự kiện cho các loại sự kiện khác nhau. Các sự kiện đang chạy bằng giá trị '30'.
sonfd avatar
lá cờ in
Móc của bạn được đặt tên không chính xác.Nó phải là `running_event_add_default_content_node_presave`, tức là `NAME_OF_MODULE_node_presave`
scaffolding avatar
lá cờ es
Xin lỗi, tôi gõ nhầm; chúng được đặt tên chính xác trong mã của tôi. Tôi đã xóa ` if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {` và rất tiếc là nó vẫn vậy kết quả - hình ảnh mới và văn bản chính không được thêm vào.
sonfd avatar
lá cờ in
Mã bạn hiển thị sẽ hoạt động. Bạn có chắc là các trường trống và mô-đun của bạn đã được bật chưa?
scaffolding avatar
lá cờ es
Cảm ơn - Tôi nghĩ nó liên quan đến cách tôi đề cập đến các trường? Tôi hiện đang gặp phải lỗi này khi cố gắng lưu một nút sự kiện: `Drupal\Core\Entity\EntityStorageException: Trường field_hero_tagline không xác định. trong Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (dòng 846 của core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php). `
scaffolding avatar
lá cờ es
Hãy để chúng tôi [tiếp tục cuộc thảo luận này trong cuộc trò chuyện](https://chat.stackexchange.com/rooms/128041/discussion-between-scaffolding-and-sonfd).
Điểm:2
lá cờ in

bạn không thể sử dụng hook_ENTITY_TYPE_update() để cập nhật dữ liệu của thực thể. Điều này được ghi chú trong tài liệu của hook:

Móc này chạy sau khi bộ lưu trữ thực thể đã được cập nhật. Lưu ý rằng việc triển khai hook có thể không làm thay đổi dữ liệu thực thể được lưu trữ. Lấy đối tượng thực thể ban đầu từ $entity-> original.

Nếu bạn cần cập nhật dữ liệu của thực thể, hãy sử dụng hook_ENTITY_TYPE_presave() thay thế. Lưu ý rằng với hook_ENTITY_TYPE_presave() bạn không được gọi $entity->save(), bạn chỉ cần đặt giá trị của thực thể và để thực thể tự lưu.

scaffolding avatar
lá cờ es
Cảm ơn bạn @sonfd! Tôi đã thử cách này nhưng vẫn không thấy cập nhật nút sự kiện sau khi xuất bản. Mã tôi đã sử dụng là: getType() == 'event') { //update the fundraising target field, 'field_target' $entity->set("field_target", "109"); } } ```
scaffolding avatar
lá cờ es
Điều lý tưởng nhất nên xảy ra là: Nút được tạo và lưu ở trạng thái chưa xuất bản. Một biên tập viên đánh giá, sau đó xuất bản. Khi họ xuất bản, chức năng sẽ thêm các giá trị bổ sung. Tôi không thể làm cho phần đó hoạt động - ngay cả ví dụ đơn giản hơn trong nhận xét của tôi ở trên cũng không tạo ra giá trị mới khi xuất bản.
sonfd avatar
lá cờ in
Bạn có thể đăng mã cập nhật trong câu hỏi của mình không? Ngoài ra, bạn dường như có nhiều không gian tên được xác định, nhưng đó có phải là các câu lệnh sử dụng không? Bạn có chắc là mã của bạn thậm chí còn kích hoạt không?
scaffolding avatar
lá cờ es
Cảm ơn bạn @sonfd - mã được cập nhật hiện được đưa vào câu hỏi của tôi.Mã dường như đang kích hoạt; nếu tôi bao gồm lỗi đánh máy trong đó, Drupal sẽ phản hồi với lỗi hiển thị.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.