De quoi est composé un module Drupal 7 ?
Avant de commencer à créer notre module, je vais vous parler un peu des possibilités de l’API Drupal. L’API offre de larges fonctionnalités pour travailler avec la taxonomie, les nœuds, les utilisateurs, ainsi que pour l’entrée et la sortie depuis la base de données. Pour l’interaction entre les modules et le noyau de Drupal, ainsi qu’entre les modules eux-mêmes, Drupal dispose d’un système de hooks. Un hook est un callback, c’est-à-dire qu’au moment où l’exécution du code atteint un hook, le code de notre fonction ajoutée dans notre module est exécuté. Ainsi, nous pouvons traiter les données utilisateur, les menus, la taxonomie, les nœuds de différents types de contenu.
Sur la page
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
se trouve la liste des hooks du noyau Drupal. Notez que cette liste varie selon la version du noyau. Je vais créer un module pour Drupal version 7, donc nous utiliserons les hooks correspondants à la version 7.
Les hooks dans Drupal ont la forme suivante :
NomModule_NomDuHook
Donc là où vous voyez le mot hook, vous devez remplacer par le nom de votre module où ce hook s’applique.
Pour commencer, il faut créer le module lui-même.
1. Créez dans le dossier sites/all/modules un dossier avec le nom futur du module. Je nommerai mon module site-made.
2. Dans ce dossier, créez deux fichiers : NomModule.info et NomModule.module. Pour moi ce sera sitemade.info et sitemade.module.
3. Maintenant, dans le fichier sitemade.info, écrivez :
;$Id$ // ce commentaire facilite le chargement du module sur drupal.org name = Sitemade module // nom de notre module dans la liste des modules package = sitemade // nom du package auquel appartient notre module core = 7.x // version de Drupal ciblée files[] = sitemade.module // fichiers PHP du module
Dans le fichier sitemade.module, commencez par écrire le code PHP :
<?php // balise PHP (peut rester ouverte) //$Id$ // ajouté aussi pour faciliter le chargement sur drupal.org
Maintenant notre module devrait apparaître parmi les autres modules, activons-le :
Une fois activé, nous pouvons ajouter du code. Je propose de retirer le bloc texte « History » (Historique) de la page utilisateur :
Regardons d’abord comment cela fonctionne, nous aurons besoin du hook hook_user_view :
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view/7
Ce hook fonctionne ainsi : lorsque Drupal exécute le code pour afficher la page utilisateur, il inclut le hook de notre module. Dans notre module, nous allons supprimer du tableau $account les informations sur l’historique utilisateur. Ouvrez le fichier sitemade.module et ajoutez :
function sitemade_user_view($account, $view_mode, $langcode){ print_r($account); }
Enregistrez et videz le cache Drupal pour que le hook soit pris en compte. Vous verrez un bloc de texte avec des mots en haut de la page :
C’est en fait le tableau $account fourni par hook_user_view, et print_r est la fonction qui affiche ce tableau. Si vous utilisez Mozilla Firefox (que je recommande pour le développement), pressez CTRL+U (source de la page) et vous verrez la structure de ce tableau.
Notez les champs uid et name qui contiennent respectivement l’ID et le nom de l’utilisateur. Ces champs sont souvent utilisés pour créer des liens vers les profils ou contenus créés par l’utilisateur.
Vous voyez ici seulement les données utilisateur, aucune information sur le bloc History. Essayons un autre hook : hook_user_view_alter :
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view_alter/7
Changeons le code du module en :
function sitemade_user_view_alter($account, $view_mode, $langcode){ print_r($account); }
Enregistrez. Le tableau affiché devrait changer : $account est maintenant un champ dans ce tableau. Le champ summary contient les informations du bloc History. Essayons de supprimer cette information avec la fonction unset :
function sitemade_user_view_alter($account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
Le champ summary disparaît mais le bloc History reste. Pourquoi ? Parce que dans les paramètres, la variable $account est passée par valeur, ce qui signifie que les modifications ne se reflètent pas dans la variable originale. Pour modifier la variable originale, il faut passer $account par référence en ajoutant un & :
function sitemade_user_view_alter(&$account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
Enregistrez et videz le cache. Le bloc History doit maintenant disparaître. Le & crée une référence à la variable $account originale. Pour en savoir plus sur les références en PHP, consultez un manuel de PHP.