Les hooks : connaître Drupal pour créer vos modules
Ce qu’il y a de bien avec Drupal c’est que l’on a l’impression de jouer aux lego, un module par ci, un module par là et le tout, imbriqué depuis l’interface d’administration de celui-ci. Mais comme moi, un jour vous avez voulu créer vous même vos structures et non plus seulement réaliser ce qu’il était possible de faire avec une simple boite de lego. Bref, vous avez déjà eu besoin de développer votre propre module afin de tordre le système et le faire coller à votre cahier des charges.
Cette nécessité de faire son propre module arrive bien plus vite qu’on ne le croit et c’est pour ça que je me suis dit qu’une petite liste des principales choses à connaître pour jouer avec Drupal serait utile. Du coup, j’ai essayé de me replacer quelques mois en arrière, à mes débuts avec Drupal et son api et je vous ai listé les principaux hooks que vous pourrez être amenés à utiliser au départ.
Concept et implémentation d’un hook
Avant d’aller plus loin, il y a une notion à comprendre pour développer un module avec Drupal et j’espère pour vous que vous avez déjà entendu ce mot : ‘hook’, sinon il va falloir réviser les bases de Drupal :p
Pour vous donner une bonne définition de ce qu’est un hook, rien de mieux que la documentation officielle.
Bon grossièrement, le système de hooks permet d’interagir avec le corps de Drupal et les modules installés, c’est tellement surpuissant que le module Chuck Norris utilise le concept de hook.
Un hook c’est quoi ? Un hook ce n’est ni plus ni moins qu’une fonction PHP nommée foo_bar(), ou “foo” désigne le nom de votre module (le nom du module serait donc foo.module) et “bar” le nom d’un hook spécifique. Chaque hook possède un nombre défini de paramètres et un résultat spécifique. Bref rien de compliqué si vous avez déjà programmé.
Oui mais concrètement comment ça marche ? Prenez l’exemple de la mise à jour d’un contenu. Vous faites des modifications et vous sauvegardez, Drupal va alors déclencher son processus de sauvegarde et afin que les modules puissent intervenir sur les données en cours, il va déterminer quel modules ont implémenté ce hook afin de leur donner la main.
Ce qu’il faut comprendre c’est que lorsqu’un hook est déclenché, Drupal parcourt tous les modules afin de connaître les modules voulant prendre la parole.
Si toutefois ce n’est toujours pas clair, voici la définition de wikipédia, mais je suis sûr qu’elle vous sera inutile :)
Les hooks à connaitre :
Vous l’aurez compris, pour maîtriser Drupal et en faire ce que vous voulez, il va vous falloir connaître les différents hooks à votre disposition. J’ai essayé ici de vous créer une petite liste de hooks qui vont vous permettre de débuter facilement, mais dîtes vous bien qu’il en existe beaucoup plus, je vous laisse le plaisir de les découvrir par vous même.
Note : Il y a eu plein d’évolutions entre D6 et D7 et l’une d’entre elle a consisté à diviser les hooks intervenant lors d’actions spécifiques. Par exemple le hook_nodeapi (que l’on verra par la suite) avait en D6 un deuxième paramètre nommé $op qui pouvait prendre différentes valeurs comme : load, insert, delete, view… Ainsi lorsque vous vouliez intervenir lors du chargement ou de la suppression d’un node, vous n’aviez qu’à implémenter ce hook et vérifier la valeur de la variable $op. Maintenant le hook_nodeapi n’existe plus, il a été remplacé par autant de hooks qu’il y avait d’actions. Grâce à cela, on a gagné en lisibilité du code mais on a augmenté le nombre de hooks disponibles. Ainsi plusieurs hooks que vous connaissiez en D6 ont été revus.
Gestion des blocs
Si vous utilisez Drupal, vous avez sûrement déjà dû créer un bloc depuis le back office. Comme souvent lorsqu’il est possible de faire quelque chose depuis l’interface d’administration, il est possible de le faire en code. Ainsi grâce à quelques hooks, il est facile de créer, gérer et de configurer les blocs.
hook_block_info : N’importe quel module peut ajouter des blocs, mais encore faut-il que drupal le sache, grâce à ce hook vous allez pouvoir déclarer l’ajout d’un ou de plusieurs blocs.
hook_block_view : Une fois que vous avez déclaré votre bloc il vous faut créer son contenu avec la fonction hook_block_view.
hook_block_configure : Pour chaque bloc vous pouvez ajouter un formulaire de configuration plus complet que celui fourni par défaut et pour cela il vous faut utiliser ce hook.
hook_block_save : Si vous avez mis en place le hook ci-dessus vous devez aussi utiliser le hook_bloc_save afin de sauvegarder les informations renseignées dans votre formulaire.
Liste des hooks liés aux blocs
Prenez vos contenus en main
Drupal étant un outil de gestion de contenus, vous vous doutez bien que c’est sur cette partie que l’on peut faire le plus de modifications :) Avec cette petite liste de hooks, vous trouverez forcément le bon moment pour interagir avec vos contenus.
hook_node_load – ce hook est exécuté lorsqu’un node est chargé depuis la base de données, c’est donc l’étape idéale si vous avez des données à modifier lors du chargement.
hook_node_view – à chaque fois que vous affichez un node sur votre site c’est le hook_view qui est invoqué. En gros c’est le hook que vous allez utiliser pour modifier le rendu à vos visiteurs.
hook_node_presave – c’est un hook utile puisqu’il permet d’intervenir sur les données juste avant la sauvegarde en base. Ce hook est appelé lors de l’insertion comme lors de la mise à jour.
hook_node_insert – le hook_node_insert est invoqué lors de la création du contenu en base et uniquement lors de la création
hook_node_update – à l’inverse celui-ci n’est invoqué que lors de la mise à jour du contenu.
hook_node_prepare – pour créer un nouveau contenu sur votre site vous devez utiliser le formulaire de création de contenus et justement le hook_node_prepare vous permet d’avoir la main sur celui-ci avant qu’il ne soit affiché à vos utilisateurs. Parfait si vous voulez remplir ou présélectionner des valeurs.
hook_node_delete : avec un nom si explicite, vous l’aurez compris qu’il s’agit du hook qui permet d’intervenir lorsqu’un contenu est supprimé.
Liste des hooks liés aux nodes
hook_permission : Dans la partie contenu on peut aussi y ajouter le hook_permission (connu sous le nom de hook_perm en D6) qui permet de créer de nouveaux droits d’accès que vous pourrez utiliser dans vos modules afin de restreindre ou non l’accès à vos fonctionnalités.
Les formulaires
hook_form_alter et hook_form_FORM_ID_alter : deux hooks qui ont leur importance puisque grâce à eux vous allez pouvoir modifier n’importe quel formulaire sur le site afin d’y ajouter des champs, ajouter des fonctions de validation ou encore altérer les données saisies.
Le hook_form_alter est appelé pour n’importe quel formulaire sur votre site, c’est à vous de savoir si vous êtes sur le formulaire souhaité. Si vous voulez modifier un formulaire en particulier, utilisez plutôt le deuxième hook qui ne sera invoqué que pour le FORM_ID précisé. Vous pouvez par exemple utiliser le hook_form_alter pour connaître la valeur de $form_id puis utiliser le hook_form_FORM_ID_alter.
L’administration de vos modules
Il y a trois hooks à connaître pour l’administration des modules, le hook_install et hook_uninstall qui vont de paire et le hook_update.
hook_install : ce hook est le premier invoqué lors de l’activation d’un module, c’est pendant cette étape que l’on doit par exemple installer les tables SQL nécessaires au module ainsi que la configuration par défaut de celui-ci.
hook_uninstall : C’est l’inverse du hook_install, celui-ci sert à supprimer tout ce qui touche au module, données en bases, schémas, variables… Notez que ce hook n’est pas exécuté à la désactivation du module mais lors de sa désinstallation.
hook_update_N : Le code d’un module n’est jamais figé et est souvent amené à évoluer. Grâce au hook_update_N vous allez pouvoir intervenir sur votre module afin de mettre à jour sa configuration, les données contenues dans ses tables ou même celles d’un autre module, (au passage, n’oubliez pas de mettre à jour le schéma de la base de données). N désigne le numéro de version à mettre et est découpé en 3 parties. Le premier chiffre correspond à la version de Drupal utilisé, le deuxième à la version de votre module et les deux derniers afin d’identifier les différentes mises à jour. Par exemple, la deuxième update d’un module en version 2.1 sur un Drupal 7 aura pour valeur : hook_update_7202
Pour installer vos mises à jour, il suffit de vous rendre sur la page /update.php ou alors d’utiliser les commandes Drush faites pour ça.
Gestion des urls de votre site
hook_menu : l’un des hooks les plus utilisés, mais bien que son nom évoque la gestion des menus, celui-ci permet en fait de créer de nouvelles urls sur votre site afin de mettre en place de nouvelles pages, de nouveaux formulaires ou n’importe quel service ayant besoin d’une adresse. C’est lors de la mise en place de ce hook que l’on peut utiliser le hook_permission afin de restreindre l’accès à une page en fonction d’un rôle.
hook_menu_alter : permet de modifier les propriétés de n’importe quelle url définie dans un hook_menu. Par exemple vous pouvez modifier, le titre d’une page, les droits d’accès, voir même surcharger la page callback.
Drupal et les hooks systems
hook_cron : ce hook vous permet d’exécuter des actions périodiques depuis votre Drupal, comme par exemple l’envoi de mail, la mise à jour de fichiers ou encore la génération de backup. Personnellement je préfère utiliser la cron du serveur plutôt que celle de Drupal, mais pour cela il faut avoir accès aux serveurs ce qui n’est pas possible sur un mutualisé.
hook_mail : c’est le hook à implémenter si vous voulez envoyer des emails via Drupal. Celui-ci permet aux modules de préparer des messages qui seront envoyés par la suite avec la fonction drupal_mail.
hook_mail_alter : permet de modifier les messages envoyés par les autres modules
Thème
hook_theme : recense toutes les fonctions de thème disponible sur votre site, ainsi lorsqu’un module doit implémenter une nouvelle fonction, il suffit de la déclarer au moyen de ce hook. Une fois connue par Drupal, celle-ci devient disponible à tout moment et peut être utilisée grâce à la fonction theme().
J’espère que cette liste et ces quelques explications sur le système de hook vous permettront de mieux comprendre et utiliser Drupal, il existe beaucoup plus de hook que ce qu’il y a dans cet article mais pour les découvrir il vous faudra explorer Drupal par vous même. En attendant vous trouverez ici la liste de tous les hooks que vous pourrez rencontrer avec Drupal 7