Comment créer et utiliser un crochet personnalisé?

10

J'ai posté une question ici , qui avait une suggestion, mais pas de réponse. Quelqu'un a-t-il des conseils sur la façon d'implémenter un hook personnalisé dans Drupal 8 qui permettra à d'autres modules de mettre à jour une table des matières créée par un module parent? La table des matières sera une liste non ordonnée.

Kevin Nowaczyk
la source
2
Jetez un oeil à la section sous "Pour définir un crochet:" ici , cela aide-t-il?
Clive
Seulement partiellement. Cela explique comment créer un hook pour la fonction enfant à utiliser, mais rien sur la façon dont le module parent rend le contenu. Le parent utilise-t-il un contrôleur pour ajouter, par exemple, du contenu à $ output ['table_of_contents'], puis le crochet du parent ajoute les données renvoyées par l'enfant à ce tableau?
Kevin Nowaczyk
2
@KevinNowaczyk cela dépend du but du crochet. Un crochet n'est pas spécifique au rendu, mais peut être utilisé pour cela. Si vous souhaitez créer un hook personnalisé pour fournir du contenu et que vous appelez le hook à l'endroit où vous avez besoin du contenu, cela fonctionnera. Et comme le crochet est personnalisé et nouveau pour votre fonction, vous devez définir comment le crochet doit fournir ses résultats. Ensuite, si vous appelez le hook pendant votre fonction de rendu parent, vous pouvez recevoir les résultats dans un format utilisable.
Neograph734

Réponses:

8

Cette section réside dans un contrôleur du module parent:

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

Et cela réside dans le fichier enfant [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);
}

Le parent crée un tableau et le transmet aux enfants par référence. Ils peuvent modifier le tableau en y ajoutant des éléments. Le parent l'ajoute ensuite au tableau de rendu.

Kevin Nowaczyk
la source
5

Par souci de simplicité, si vous souhaitez créer et utiliser un hook personnalisé dans Drupal 8 pour que d'autres développeurs l'utilisent

d'abord pour aider les autres à définir l'utilisation de votre crochet dans le fichier mymodule.api.php, ce crochet peut agir sur tout ce qui est nécessaire.

exemple:

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

puis en cas de besoin dans votre module.

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

alors l'autre développeur peut alors en faire usage en appelant

function MYOTHERMODULE_mymodule_alter_something($data) {
Taggart Jensen
la source