9.2. Que signifie un « hook » dans Drupal ?
Cet article a pour but de vous familiariser avec Drupal. Nous écrirons des exemples de code plus tard, après avoir ajouté notre module personnalisé.
Drupal n’est pas un système monolithique où tout est parfait et rien ne doit être modifié. Très souvent, les clients demandent d’ajouter telle ou telle fonctionnalité au site. Pour pouvoir maintenir le code du noyau Drupal tout en ajoutant des fonctionnalités, nous utilisons des modules. Le système modulaire permet d’étendre les capacités de Drupal. Mais que faire si l’on souhaite étendre un module prêt à l’emploi, comme un module de compteur ? Bien sûr, on peut soumettre une demande d’évolution sur drupal.org et attendre un mois, deux, voire un ou deux ans pour que la fonctionnalité apparaisse. Mais on peut aussi agir autrement et écrire soi-même le code nécessaire. Pour étendre les fonctionnalités des modules additionnels et de Drupal lui-même, nous utilisons les hooks et plugins dans nos propres modules.
L’idée principale est qu’on ne doit pas modifier le code de Drupal ni celui des modules additionnels, ce qui permet de réaliser de grandes économies sur le travail du développeur. Pour pouvoir mettre à jour facilement Drupal et ses modules, il ne faut pas modifier le cœur Drupal ni les modules contributeurs. Sinon, toutes vos modifications seront écrasées lors des mises à jour.
Pour permettre l’interconnexion entre le cœur Drupal et les modules, ainsi qu’entre modules, Drupal utilise un système de hooks. Un hook est un rappel (callback) de fonction : lorsque l’exécution atteint ce hook, le code de notre fonction est exécuté, celui que nous ajoutons dans notre module. Ainsi, nous pouvons intervenir sur les données utilisateur, menus, taxonomies, nœuds de différents types de contenu à tout moment : modification, ajout, suppression, ou simplement lors du chargement et de l’affichage. Il existe beaucoup de hooks pour Drupal 8, mais moins qu’en Drupal 7, car beaucoup ont été remplacés par des composants Symfony tiers :
https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x
Si l’on regarde la version 7, il faut faire défiler longtemps :
https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x
Cela ne signifie pas que Drupal 8 est moins puissant, mais que tout ce qui était implémenté via hooks en 7 doit être fait via des plugins en 8.
Si vous regardez la liste des hooks dans Drupal 8, vous verrez souvent _alter
à la fin de leur nom, ce qui signifie que ce hook sert à modifier des valeurs, par exemple :
hook_form_alter()
permet de modifier le tableau d’un formulaire lors de son traitement dans Drupal. Nous verrons plus tard comment les formulaires sont générés à partir de tableaux dans Drupal. Pour appliquer ce hook dans un module, comme pour les autres hooks, on écrit simplement une fonction :
function mymodule_form_alter() {
// modifier le tableau du formulaire
}
J’ai simplifié l’exemple, sans écrire les arguments ni namespaces, pour l’instant il s’agit de comprendre comment fonctionnent les hooks. mymodule
est le nom de notre module, on remplace hook
par ce nom et la fonction est automatiquement reconnue et modifie le tableau du formulaire. Comment cela fonctionne ? Dans la méthode prepareForm
, une autre méthode alter()
est appelée :
$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);
Cela signifie que chaque module Drupal qui implémente hook_form_alter()
insère son code ici. Donc, si on veut ajouter du code dans Drupal, on commence toujours par un hook, puis par un plugin et si vraiment on ne peut pas faire autrement, on patch, hack ou modifie le module (ce qu’il vaut mieux éviter). Pour l’instant, nous n’avons pas eu besoin de modifier les plugins, commençons donc par apprendre à écrire nos propres modules.