Score:0

ตั้งค่าคำอธิบายลิงก์เมนูใน hook_entity_presave()

ธง cn

ฉันจะอัปเดตคำอธิบายลิงก์เมนูด้วยได้อย่างไร hook_ENTITY_TYPE_presave()?

ฉันสามารถพิมพ์ชื่อลิงค์เมนูและคำอธิบายลิงค์เมนูด้วยรหัสต่อไปนี้

kint($entity->menu['ชื่อเรื่อง']);  
kint($entity->menu['คำอธิบาย']);

ฉันต้องการอัปเดตคำอธิบายลิงก์เมนูเมื่อชื่อลิงก์เมนูไม่ใช่ NULL เท่านั้น ดังนั้นลิงก์เมนูจึงจะมีอยู่ อันที่จริง ฉันต้องการคัดลอกชื่อลิงก์เมนูไปยังคำอธิบายลิงก์เมนู (เมื่อชื่อลิงก์เมนูไม่ว่างเปล่า)

รหัสต่อไปนี้อัปเดตชื่อโหนด แต่ฉันต้องการทราบวิธีอัปเดตคำอธิบายลิงก์เมนู

/**
 * ใช้ hook_ENTITY_TYPE_presave()
 */
ฟังก์ชัน hook_entity_presave (Drupal\Core\Entity\EntityInterface $entity) {
  
  ถ้า ($entity->bundle() == 'หน้า') {

    // บันทึกค่าอื่นเป็นชื่อเรื่อง
    $entity->title = 'ชื่อเรื่องใหม่';

    // ด้านล่างแสดง 'ชื่อ' และ 'คำอธิบาย' ของลิงก์เมนู
    kint($entity->menu['ชื่อเรื่อง']);
    kint($entity->menu['คำอธิบาย']);

    // ฉันจะอัปเดตคำอธิบายเมนูได้อย่างไร
    // ด้านล่างไม่ทำงาน?
    $entity->menu['description'] = "คำอธิบายลิงค์เมนูใหม่";
    
  }
}
Score:0
ธง in

ลิงก์เมนูเป็นตัวของตัวเอง เว้นแต่ว่าคุณได้ทำสิ่งพิเศษเพื่อสร้างประเภทเอนทิตีลิงก์เมนูใหม่ พวกมันจะเป็นประเภทเอนทิตี menu_link_content.

คุณสามารถใช้ได้ hook_ENTITY_TYPE_presave() เพื่อทำการเปลี่ยนแปลงของคุณ โปรดทราบว่าเมื่อคุณเห็นส่วนตัวพิมพ์ใหญ่ทั้งหมดของตะขอ นั่นหมายความว่าควรแทนที่ด้วยค่าเฉพาะ เช่น hook_node_presave() หรือ hook_menu_link_content_presave() ความแตกต่างระหว่างสิ่งเหล่านี้และ hook_entity_presave() คือว่าหลังจะยิงเมื่อ ใดๆ มีการบันทึกเอนทิตี ในขณะที่ hooks เฉพาะประเภทเอนทิตีจะเริ่มทำงานเมื่อมีการบันทึกเอนทิตีของประเภทเฉพาะนั้นเท่านั้น

จากทั้งหมดนี้ สิ่งต่อไปนี้ควรใช้งานได้:

// ด้านบนของไฟล์.
ใช้ Drupal\menu_link_content\MenuLinkContentInterface;

/**
 * ตรวจสอบให้แน่ใจว่าลิงค์เมนูที่มีชื่อมีคำอธิบายที่ตรงกัน
 *
 * ใช้ hook_ENTITY_TYPE_presave()
 */
MY_MODULE_menu_link_content_presave (เมนูLinkContentInterface $menu_link) {
  ถ้า (!$menu_link->title->isEmpty()) {
    $menu_link->set('คำอธิบาย', $menu_link->title->value);
  }
}
websoft avatar
cn flag
สวัสดี ขอบคุณมาก ฉันลองทำตามข้างต้นแล้ว แต่ได้รับข้อผิดพลาดดังต่อไปนี้?
websoft avatar
cn flag
TypeError: อาร์กิวเมนต์ 1 ที่ส่งผ่านไปยัง addmenudesc_menu_link_content_presave() ต้องเป็นอินสแตนซ์ของ Drupal\menu_link_content\Entity\MenuLinkContentInterface อินสแตนซ์ของ Drupal\menu_link_content\Entity\MenuLinkContent ที่กำหนดใน addmenudesc_menu_link_content_presave() (บรรทัดที่ 11 ของ /Users/mikereid/Sites/dev/d8 /craftedbydesign/web/modules/custom/addmenudesc/addmenudesc.module)
websoft avatar
cn flag
ฉันใช้ฟังก์ชัน addmenudesc_menu_link_content_presave($menu_link) { } และตอนนี้ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ ฉันละเว้น MenuLinkContentInterface? มีเหตุผลใดบ้างที่ควรมี MenuLinkContentInterface
sonfd avatar
in flag
โอ้ ความผิดพลาดของฉัน ฉันมีเส้นทางที่ไม่ถูกต้องสำหรับคลาส MenuLinkContentInterface ฉันอัปเดตคำตอบแล้ว - คำสั่งการใช้งานที่ถูกต้องคือ `use Drupal\menu_link_content\MenuLinkContentInterface;`
sonfd avatar
in flag
การพิมพ์พารามิเตอร์เมื่อทำได้จะเป็นประโยชน์ ผลข้างเคียงคือช่วยให้ IDE ของคุณรู้ว่าตัวแปรคืออะไร แต่ที่สำคัญกว่านั้นคือต้องแน่ใจว่าตัวแปรที่ส่งไปยังฟังก์ชันนั้นเป็นประเภทที่ฟังก์ชันคาดหวัง (หรือข้อผิดพลาด)มีบางประเด็นที่ดีเกี่ยวกับ [เมื่อใดที่ฉันควรใช้การบอกใบ้ประเภทใน PHP](https://stackoverflow.com/questions/536514/when-should-i-use-type-hinting-in-php)

โพสต์คำตอบ

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