Как мне создать и использовать пользовательский хук?

10

Я отправил вопрос здесь , что было одно предложение, но нет ответа. Кто-нибудь есть какие-либо советы о том, как реализовать пользовательский хук в Drupal 8, который позволит другим модулям обновлять оглавление, которое создается родительским модулем? Оглавление будет неупорядоченным списком.

Кевин Новачик
источник
2
Взгляните на раздел «Чтобы определить хук:» здесь , это помогает?
Клайв
Только частично. Это объясняет, как создать хук для использования дочерней функцией, но ничего не говорится о том, как родительский модуль отображает содержимое. Использует ли родительский контроллер для добавления содержимого, скажем, в $ output ['table_of_contents'], а затем хук родителя добавляет данные, возвращаемые дочерним объектом, в этот массив?
Кевин Новачик
2
@KevinNowaczyk это зависит от цели крючка. Хук не специфичен для рендеринга, но может использоваться для него. Если вы хотите создать пользовательский хук для предоставления контента, и вы вызываете хук в том месте, где вам нужен контент, он будет работать. А так как ловушка является пользовательской и новой для вашей функции, вы должны определить, как ловушка должна предоставлять свои результаты. Затем, если вы вызовете ловушку во время родительской функции рендеринга, вы можете получить результаты в удобном для вас формате.
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 для использования другими разработчиками

Во-первых, чтобы помочь другим определить использование вашего хука в файле 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) {
Таггарт Дженсен
источник