Jak utworzyć niestandardowy hak i korzystać z niego?

10

Zadałem tutaj pytanie , które zawierało jedną sugestię, ale bez odpowiedzi. Czy ktoś ma jakieś porady, jak zaimplementować niestandardowy hak w Drupal 8, który pozwoli innym modułom zaktualizować spis treści, który jest tworzony przez moduł nadrzędny? Spis treści będzie listą nieuporządkowaną.

Kevin Nowaczyk
źródło
2
Spójrz na sekcję „Aby zdefiniować hak:” tutaj , czy to pomaga?
Clive
Tylko częściowo. Wyjaśnia to, jak utworzyć zaczep dla funkcji potomnej, ale nic na temat sposobu renderowania zawartości przez moduł nadrzędny. Czy rodzic używa kontrolera, aby dodać zawartość, powiedzmy, $ output ['table_of_contents'], a następnie haczyk rodzica dołącza dane, które są zwracane od dziecka, do tej tablicy?
Kevin Nowaczyk
2
@KevinNowaczyk to zależy od celu haka. Hak nie jest specyficzny dla renderowania, ale można do niego użyć. Jeśli chcesz utworzyć niestandardowy hak do dostarczania treści i wywołasz hak w miejscu, w którym potrzebujesz treści, zadziała. Ponieważ hak jest niestandardowy i nowy w Twojej funkcji, musisz zdefiniować, w jaki sposób hak powinien zapewniać wyniki. Następnie, jeśli wywołasz hak podczas nadrzędnej funkcji renderowania, możesz otrzymać wyniki w użytecznym formacie.
Neograph734

Odpowiedzi:

8

Ta sekcja znajduje się w kontrolerze w module nadrzędnym:

$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,
  ];
}

I to znajduje się w pliku podrzędnym [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);
}

Rodzic tworzy tablicę i przekazuje ją do dzieci przez odniesienie. Mogą zmieniać tablicę, dodając do niej elementy. Następnie rodzic dodaje go do tablicy renderowania.

Kevin Nowaczyk
źródło
5

Dla uproszczenia, jeśli chcesz stworzyć niestandardowy hak w Drupal 8, z którego mogą korzystać inni programiści

najpierw, aby pomóc innym zdefiniować użycie twojego haka w pliku mymodule.api.php, ten hak może działać na wszystko, co jest wymagane.

przykład:

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

wtedy gdy zajdzie taka potrzeba w twoim module.

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

wtedy drugi programista może to wykorzystać, dzwoniąc

function MYOTHERMODULE_mymodule_alter_something($data) {
taggartJ
źródło