如何创建和使用自定义挂钩?


10

我在这里发布了一个问题,它有一个建议,但没有答案。有没有人对如何在Drupal 8中实现自定义钩子提供任何建议,该钩子将允许其他模块更新由父模块创建的目录?目录将是无序列表。


2
看看下部分的“定义挂钩:” 在这里,有何帮助?
克莱夫(Clive)

仅部分。这说明了如何为子函数创建一个挂钩以供使用,但对父模块如何呈现内容没有任何说明。父级是否使用控制器向$ output ['table_of_contents']中添加内容,然后父级的挂钩将子级返回的数据附加到此数组?
凯文·诺瓦奇

2
@KevinNowaczyk它取决于挂钩的目的。挂钩不是特定于渲染的,但可以用于它。如果您想创建一个自定义钩子来提供内容,并且在需要该内容的位置调用该钩子,则它将起作用。并且由于该挂钩是自定义的,并且是函数的新增功能,因此您必须定义挂钩应如何提供其结果。然后,如果您在父渲染函数中调用该挂钩,则可以使用可用格式接收结果。
Neograph734 '16

Answers:


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中创建并使用自定义钩子供其他开发人员使用

首先,要帮助其他人在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) {
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.