close

Découvrez nos offres pour faire du digital le levier de votre croissance !

download
Modèles

Téléchargez le Guide Ultime de gestion de projet digitale pour vous aider à piloter vos transformations et faire les bons choix !

Image mise en avant pour l'article

Que sont les hooks dans Drupal ?

Les hooks sont l’un des moyens pour les modules d’interagir avec les modules contribués ou les principaux sous-systèmes de Drupal.


Les hooks sont utilisés pour une multitude d’actions comme le prétraitement des variables avant leurs affichages, la modification des listes d’information ou encore la manipulation des formulaires, etc.

Les hooks sont des fonctions spécialement nommées et appelées à des moments précis. Ils servent à modifier le comportement de base de Drupal. Chaque hook a un nom unique et un ensemble défini de paramètres.

 

Comment utiliser les hooks ?

Il faut savoir que n’importe quel nombre de modules peut implémenter le même hook (un même hook par module). Cela permet à plusieurs modules de contribuer au résultat final.

Par exemple, vous pouvez avoir deux ou trois modules différents qui implémentent le hook " hook_toolbar() " afin d’ajouter des liens dans la barre d’outils d’administration.

Un hook se déclare dans un fichier PHP à la racine d’un module (ou thème) et qui a pour extension " .module " pour les modules et " .theme " pour les thèmes. Mise à part l’extension qui est différente, l’utilisation est strictement identique.

Dans la documentation officielle1, la signature d’un hook est présentée sous la forme : " hook_nom_de_la_fonction(paramètres) ".

Le terme " hook " est à remplacer par le nom machine de votre module ou thème.

Par exemple, si je souhaite implémenter le hook hook_user_login($account) dans le module " my_module ", j’écrirais :


function my_module_user_login($account) {
}
 

 

Les hooks dans la pratique

Le hook hook_user_login est déclenché juste après que l’utilisateur se soit authentifié. Le paramètre " $account " est un objet User représentant l’utilisateur qui vient de se connecter et qui contient un tas d’informations sur lui.

Nous allons imaginer que je désire lui souhaiter la bienvenue avec un message personnalisé grâce au service Messenger. J’écrirais mon hook comme ceci dans mon fichier PHP " my_module.module " :


function my_module_user_login($account) {  

  $message = "Bienvenu " . $account->getAccountName() . " vous êtes désormais connecté !";  
  Drupal::messenger()->addMessage($message);  

} 

 

Quelques hooks courants

Voici une liste de quelques hooks fréquemment utilisés :

  • hook_entity_view - Ce hook est appelé au moment de construire le tableau de rendu afin de pour pouvoir faire des modifications en amount.
  • hook_entity_presave - Ce hook est appelé juste avant de sauvegarder une entité en base de données. On peut effectuer des modifications ou être alerté lorsque qu'un contenu est sur le point d’être enregistré (création d’une nouvelle entité ou modification d’une entité existante).
  • hook_entity_insert - Similaire au hook_entity_presave mais appelé juste après l’enregistrement en base de données (lors de la création seulement).
  • hook_entity_update - Similaire au hook_entity_insert mais seulement lors de la mise à jour d’une entité existante.
  • hook_entity_delete - Déclenché lorsqu’une entité vient d’être supprimée.
  • hook_form_alter - Ce hook est déclenché juste avant qu’un formulaire ne soit affiché. Il sera possible d’y ajouter des champs, des fonctions de validation/soumission ou encore altérer les données qu'il contient comme changer le nom d’un champ, changer sa valeur, changer ses attributs html ou restreindre son accès (ex : afficher certains champs seulement sous certaines conditions).
  • hook_cron - Ce hook permet d’exécuter des actions périodiques depuis votre Drupal, comme par exemple l’envoi de newsletter par mail. Ce hook est appelé lorsque l’on sollicite les taches planifiées Drupal, il faut donc les appeler avec un mécanisme externe. Principalement cela se fait via un cron job configuré sur le serveur qui effectue une requête vers une url du site Drupal spécifique au cron.
  • hook_mail - C’est le hook à implémenter pour envoyer des emails via Drupal. Celui-ci permet aux modules de préparer des messages qui seront envoyés par la suite.
  • hook_mail_alter - Ce hook permet de modifier les messages envoyés par les autres modules.
  • hook_theme - Ce hook permet de déclarer la manière dont un tableau de rendu doit être géré pour sa conversion en html. On utilise principalement ce hook pour déclarer des templates Twig personnalisés pour des tableaux de rendu personnalisés.

 

Comment définir ses propres hooks ?

Si vous souhaitez que d’autres modules puissent interagir avec votre code, il est possible de créer ses propres hook.

Le service Module Handler permet avec sa fonction " invokeAll " de déclencher le hook de votre choix. Je vais reprendre le hook user_login donné en exemple plus haut.

Imaginons que je souhaite permettre à d’autres modules de modifier le message qui s’ affichera :


$message = "Bienvenu " . $account->getAccountName() . " vous êtes désormais connecté !";  

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

\Drupal::messenger()->addMessage($message); 

 

Juste avant d'afficher le message j’ai ajouté l’invocation d’un hook que j’ai appelé arbitrairement " alter_message " en passant un tableau de paramètres en paramètre. Ici je n’ai besoin que d'un seul paramètre, le tableau ne contient donc qu'un seul élément, $message.

Maintenant, n’importe quel module peut implémenter mon hook " hook_alter_message($message) " :


function my_module_alter_message(&$message) { 

  $message = 'Nouveau message !!!!'; 

} 

 

En procédant ainsi, j’ai changé $message au moment de l'invocation du hook, juste avant qu'il ne soit afficher. Vous noterez qu’il n’y a pas besoin de retourner notre variable $message puisqu’elle est passée en référence dans l’argument de la fonction !

 

J’espère que cet article vous a permis de mieux comprendre le fonctionnement des hooks et qu’il vous aidera dans vos futurs projets. Si vous souhaitez approfondir vos connaissances sur Drupal, je vous conseille ces deux articles :

Vous avez aimé cet article, je vous conseille de lire également ces deux articles :

 

Source : Drupal

Crédit photo : Kosal Hor

Image mise en avant pour l'article
Sarven Gostanyan
Développeur Drupal 8/9 @ADIMEO
De l'urgence de migrer sur Drupal 9 : conseils et bonnes pratiques
Voir le webinar
Vous maitrisez la technologie Drupal et vous souhaitez participer à une aventure humaine ?
Adimeo recrute un Développeur Drupal Senior capable d’encadrer des projets et d’accompagner des développeurs juniors...
Voir notre offre d'emploi !
Pourquoi s'abonner à
notre newsletter ?
Pour recevoir tous les mois, un condensé de contenus utiles et pertinents pour votre transformation digitale !