ฉันจะสร้างและใช้เบ็ดที่กำหนดเองได้อย่างไร


10

ฉันโพสต์คำถามที่นี่ซึ่งมีหนึ่งข้อเสนอแนะ แต่ไม่มีคำตอบ ใครบ้างมีคำแนะนำเกี่ยวกับวิธีการใช้เบ็ดที่กำหนดเองใน Drupal 8 ซึ่งจะช่วยให้โมดูลอื่น ๆ ในการปรับปรุงสารบัญที่สร้างขึ้นโดยโมดูลแม่? สารบัญจะเป็นรายการที่ไม่ได้เรียงลำดับ


2
ดูหัวข้อใต้ "วิธีกำหนดเบ็ด:" ที่นี่ช่วยได้ไหม?
ไคลฟ์

เพียงบางส่วนเท่านั้น สิ่งนี้อธิบายถึงวิธีการสร้าง hook สำหรับฟังก์ชันลูกที่จะใช้ แต่ไม่มีอะไรเกี่ยวกับวิธีที่โมดูลหลักแสดงเนื้อหา พาเรนต์ใช้คอนโทรลเลอร์เพื่อเพิ่มเนื้อหาพูด $ output ['table_of_contents'] แล้วฮุกของพาเรนต์จะผนวกข้อมูลที่ส่งคืนจากเด็กไปยังอาร์เรย์นี้หรือไม่
Kevin Nowaczyk

2
@KevinNowaczyk มันขึ้นอยู่กับวัตถุประสงค์ของเบ็ด เบ็ดไม่ได้เฉพาะเจาะจงสำหรับการแสดงผล แต่สามารถนำมาใช้สำหรับมัน หากคุณต้องการสร้างเบ็ดที่กำหนดเองเพื่อให้เนื้อหาและคุณเรียกใช้เบ็ดในสถานที่ที่คุณต้องการเนื้อหามันจะทำงาน และเนื่องจาก hook เป็นแบบกำหนดเองและใหม่สำหรับฟังก์ชันของคุณคุณต้องกำหนดว่า hook ควรให้ผลลัพธ์อย่างไร จากนั้นหากคุณเรียกใช้ hook ในระหว่างฟังก์ชั่นการเรนเดอร์แม่คุณสามารถรับผลลัพธ์ในรูปแบบที่ใช้งานได้
Neograph734

คำตอบ:


8

ส่วนนี้อยู่ในคอนโทรลเลอร์ในโมดูลพาเรนต์:

$plugin_items = [];
// Call modules that implement the hook, and let them add items.
\Drupal::moduleHandler()->alter('flot_examples_toc', $plugin_items);
if (count($plugin_items > 0)) {
  $output['plugins'] = [
    '#title' => 'Plugins',
    '#theme' => 'item_list',
    '#items' => $plugin_items,
  ];
}

และสิ่งนี้จะอยู่ในไฟล์ย่อย [module] .module

use Drupal\Core\Url;

function mymodule_flot_examples_toc_alter(&$item_list) {
  $options = [
    ':one' => Url::fromRoute('flot_spider_examples.example')->toString(),
  ];
  $item_list[] = t('<a href=":one">Spider Chart</a> (with spider plugin)', $options);
}

ผู้ปกครองสร้างอาร์เรย์และส่งไปยังเด็ก ๆ โดยการอ้างอิง พวกเขาสามารถเปลี่ยนอาเรย์โดยการเพิ่มองค์ประกอบเข้าไป จากนั้นพาเรนต์จะเพิ่มลงในอาร์เรย์เรนเดอร์


5

เพียงเพื่อความง่ายถ้าคุณต้องการสร้างและใช้เบ็ดที่กำหนดเองใน drupal 8 สำหรับนักพัฒนาคนอื่นที่จะใช้

ก่อนอื่นเพื่อช่วยให้ผู้อื่นกำหนดการใช้งาน hook ของคุณในไฟล์ mymodule.api.php เบ็ดนี้สามารถทำอะไรก็ได้ที่ต้องการ

ตัวอย่าง:

 // my hook 
 function hook_mymodule_alter_something(array &$data) {
   // here others will make a module that will call this to alter "$data"
 }

จากนั้นเมื่อจำเป็นในโมดูลของคุณ

 \Drupal::moduleHandler()->invokeAll('mymodule_alter_something', [&$data]);

จากนั้นผู้พัฒนารายอื่นสามารถใช้สิ่งนี้ได้โดยการโทร

function MYOTHERMODULE_mymodule_alter_something($data) {
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.