Une des grandes forces de Drupal réside en son architecture à base de modules. Que ce soit pour la gestion des blogs ou celle d’un forum, chaque fonction fondamentale est en réalité un simple module interagissant avec le cœur de Drupal. Et si les modules fournis en standard ne suffisent pas, des centaines d’autres sont disponibles couvrant à peu prés tous les usages.
Mais malgré cette richesse, il arrive parfois que l’on ne trouve pas LE module « qui va bien ». Alors pourquoi ne pas le fabriquer soi-même et ainsi découvrir à quel point Drupal s'adapte facilement à des besoins spécifiques.
Les seuls pré-requis pour développer un module sont une bonne connaissance des concepts clés de Drupal (blocks, node, type de contenu, taxinomie, etc.), une relative maîtrise de PHP.
Armé de tout cela, nous allons commencer en douceur avec la création d'un module dont le seul but est de nous fournir un bloc avec du texte dedans, rien de plus. Ce module 'Liste des courses', sera ensuite étendu pour en faire un module complet de gestion de vos achats quotidien. Tant qu'à prendre un exemple, autant qu'il serve à quelque chose (quoi ? vous n'avez pas tous un intranet domestique sous Drupal ???
). Et tout cela pour Drupal 6.x.
Avant de poursuivre, il est important de comprendre ce qu'est réellement un module. Un module Drupal est un bout de code PHP que l'on peut activer ou désactiver, et qui implémente des "hooks".
Un hook (en français, "Crochet") est un prototype de fonction dédié à une tâche spécifique, comme par obtenir la liste des blocs disponibles et le contenu de chacun d'entre eux.
Chaque module peut ainsi implémenter ce hook sous la forme d'une fonction ayant des paramètres calqués sur ceux du prototype. Dans le cas d'un bloc, le prototype se nomme hook_view:
Ainsi un module désirant implémenter ce hook, devra comporter le code suivant :
Lorsque Drupal aura besoin d'obtenir la liste des blocs, il cherchera dans la liste de toutes les fonctions PHP disponibles, c'est-à-dire les fonctions contenues dans tous les modules activés, celles dont le nom commence par le nom d'un module et se termine par _block, le nom du hook.
La manière dont Drupal utilise un hook est assez simple. Pour rester sur notre exemple, lorsqu'il a besoin d'obtenir la liste des blocs, il va appeler tout les fonctions _block qu'il trouve, les unes après les autres, en leur passant en premier paramètre la chaîne list. Et réponse, chacune va donner un tableau contenant les noms et descriptions des blocs qu'elles prennent en charge.
Ensuite lorsque Drupal va devoir afficher un bloc en particulier, il effectue la même opération mais cette fois en passant en paramètre view suivi du nom du bloc.
Maintenant au delà du mode d'exécution des hooks de même type, chacun est spécifique tant par les paramètres qu'il reçoit que par les valeurs que Drupal s'attend à recevoir. Vous pouvez obtenir leur description dans la documentation de l'API Drupal.
Un module est donc un fournisseur d'implémentation de hooks. En conséquence, la majeure partie de son code va s'insérer dans les traitements de Drupal et étendre son comportement. Maintenant de manière plus prosaïque, un module est simplement un dossier qui contient au minimum deux fichiers.
Ce dossier doit porter le nom du module et doit être placé dans l'arborescence de Drupal, à un endroit qui soit approprié pour que ce dernier puisse le voir. Techniquement il est possible de les mettre dans modules/ mais vous seriez vite embêtés lors d'un changement de version. Il est donc préconisé de mettre cela dans un dossier sites/all/modules/mes_modules que vous créerez si nécessaire. Ainsi lorsque vous changez de version, il suffit de déplacer le dossier sites à sa place dans la nouvelle arborescence.
Dans ce dossier mes_modules, vous allez donc créer le sous-dossier du module lui-même, dans notre cas courses. A l'intérieur de celui-ci, vous devez avoir au minimum deux fichiers, portant le même nom de base que le dossier parent : courses.info et courses.module. Ce qui nous donne l'arborescence suivante :
Le fichier statistiques.info est un simple fichier texte contenant des informations sur le module comme son nom, sa description, la version de Drupal avec lequel il est compatible, etc. Ce qui nous donne pour notre exemple, le contenu suivant :
package indique dans quelle catégorie le module doit être affiché. name, description sont des informations textuelles qui seront affiché dans le panneau d'administration des modules. name reprend le nom du module (qui est aussi le nom du dossier). version indique quant à lui la version du module. C'est d'ailleurs plus une norme qu'autre chose qui se lit "Module version 0.1 pour Drupal 6.x". Enfin core prévient Drupal que le module est seulement compatible avec sa version 6.x. Tout autre version de Drupal empêchera le module de s'activer.
Si nous avions eu besoin de définir une dépendance avec un autre module, nous aurions ajouté une clause de la forme dependencies[] = autre_module. Enfin, si vous désirez ajouter des commentaires, il suffit d'utiliser le symbole ; suivi du texte du commentaire.
Le second fichier est le code PHP du module. C'est lui qui va héberger les hooks que nous souhaitons implémenter. Pour l'instant, nous allons faire simple et n'en mettre aucun. Notre fichier va donc contenir une simple balise de démarrage de code PHP :

Voilà, nous avons maintenant un module aussi simple qu'inutile, que Drupal est cependant capable de voir et d'activer. Pour s'en convaincre, il suffit d'aller faire un tour en http://mon_site_drupal/?q=/admin/build/modules pour le voir apparaître dans la liste. Vous constatez que les informations affichées sont les champs name et description de notre fichier courses.info.
A ce stade nous pourrions donc activer notre module, mais ne le faites pas tout de suite, nous avons encore quelque chose à rajouter.
Il est maintenant temps d'implémenter notre premier hook. Comme nous l'avons vu plus haut, celui qui est responsable de la génération de bloc est hook_block. Il nous faut donc ajouter son implémentation à la suite, dans notre fichier statistiques.modules:
Le paramètre important de ce hook est $op. Lorsque Drupal a besoin de la liste des blocs disponible, il appelle cette fonction avec $op=='list'. Drupal s'attend alors à ce que la fonction renvoie un tableau associant un id (ici courses) à une définition de bloc. Cette définition est elle aussi un tableau associant une propriété du bloc à sa valeur. Cette organisation des données est un grand classique dans Drupal.
Ici nous renvoyons à Drupal un seul bloc ayant pour description (propriété info) affichage des statistiques. Notez l'utilisation de la fonction t(...) qui permet de prévoir une prise en charge ultérieure de la traduction du module. Pensez à utiliser systématiquement cette fonction pour tous les textes.
Vous pouvez dés maintenant voir le hook en action en allant sur l'URL http://mon_site_drupal?q=admin/build/block. Vous devriez alors le voir apparaître dans la liste des blocs désactivés.

Sélectionnez maintenant dans la liste une position pour votre bloc et sauvegardez l'ensemble. Il devrait apparaître à l'endroit désiré.
Passons maintenant à la possibilité d'ajoute un formulaire de paramétrage pour notre bloc. Cela se passe toujours dans hook_bloc mais nous nous adressons cette fois aux opérations $op==configure et $op==save. La première fabrique un mini formulaire Drupal. La seconde sauvegarde le résultat du formulaire modifié par l'utilisateur.
Le formulaire est construit dans la variable $form dont la structure de stockage est la même que pour $blocks. C'est à dire un double tableau associatif, contenant la liste par id des champs. Puis par champ, la liste des propriétés et leurs valeurs.
La propriété #type détermine le type du champ (zone de texte,liste déroulante, etc). Ici nous choisissions un champ texte (textfield). La liste de complète des types et de leurs propriétés associées est disponible dans la documentation de Drupal.
Mais la propriété vraiment intéressante est #default_value. Elle définit la valeur que dois prendre le champ au moment de l'affichage du formulaire. Cette valeur est extraite des propriétés générales de Drupal par la fonction variable_get(...), par l'intermédiaire de la fonction courses_nombre_item_max(). En effet, Drupal met à disposition des modules un système de variables persistantes très simple à mettre en oeuvre. Passer par une fonction intermédiaire nous permet seulement de définir la valeur par défaut ((ici 5) de cette variable à un seul endroit et d'utiliser cette fonction partout où nous auront besoin de ce paramétrage.
La dernière propriété #title définit le titre du champ. Là aussi nous utilisons la fonction t(...) en prévision d'éventuelles traductions à venir.
Notre micro formulaire est maintenant prêt à être utilisé par Drupal. Vous pouvez le tester en retournant dans l'administration des blocs, en allant à la ligne que vous avez activée plus haut et en cliquant sur le lien configurer.

Lorsque vous aurez paramétré votre bloc, le fait de clicker sur le bouton Enregistrer le bloc provoquer un nouvel appel de notre hook, mais cette fois avec le paramètre save renvoyant les résultats du formulaire définit à l'étape précédente. Ces résultats sont contenus dans le tableau associatif $edit et notre seule tâche est d'utiliser la fonction Drupal permettant de stocker une variable persistante, variable_set(...);, en lui passant la valeur du champ courses_nombre_item_max.
La dernière étape est la génération du code HTML du bloc. C'est le rôle de l'opération $op==view qui utilise le paramètre du hook $delta.
hook_block permettant de créer autant de blocs que désiré, $delta contient l'ID du bloc à créer. Ici nous n'en avons qu'un mais autant prévoir l'avenir et effectuer tout de même le test. Ensuite, nous définissons une fois de plus un tableau associatif contenant deux propriétés, le titre du node (subject) et le contenu HTML du node (content).
Il est maintenant temps d'afficher notre bloc en sélectionnant une position dans la page d'administration. Une fois ce paramétrage sauvegardé (bouton enregistrer les blocs, le nouveau bloc devrait apparaître là où vous l'avez décidé.
Maintenant que notre bloc est prêt, passons à l'affichage de son contenu. Pour cela nous allons remplacer la ligne content' => 'Un bloc vide'); par 'content' => statistiques_contenu()); et ajouter la fonction de rendu HTML de notre bloc. Bien évidemment, vu que nous n'avons pour l'instant pas de base de données contenant la liste réelle de nos courses, nous allons mettre dans ce bloc des items poétiques :
Voilà, rien de sorcier dans cette fonction, juste la création de code HTML que l'on renvoie à hook_block. Il ne reste maintenant plus qu'à apprécier le résultat.
Voilà, nous avons terminé notre premier module totalement fonctionnel en espérant que vous avoir montré à quel point, une fois quelques notions de base assimilées Drupal est facile à adapter à des besoins même très particuliers.
- reply
anti-pixel (not verified), le 15 May, 2008 - 19:36Ca m'a l'air d'être un très bon tuto que je vais tester très bientôt...
- reply
Ulhume, le 15 May, 2008 - 20:45Et bien écoute merci
C'est un des plus long que j'ai eu à réaliser et il est encore incomplet à mon sens. Il lui manque :
- Une vue custom pour un node
- La validation des formulaires, le problème est que dans mon exemple je n'ai rien à valider
- La gestion des droits
- Un panneau d'administration associé
C'est pour cela qu'il est encore en béta, avec cela en plus, ça devrait être complet. Si j'ai oublié quelque chose, ne pas hésiter !!
- reply
anti-pixel (not verified), le 16 May, 2008 - 14:5916h00 je m'ennuie au boulot, et j'ai une heure à tuer, je commence le tuto
- reply
anti-pixel (not verified), le 16 May, 2008 - 15:4945mn plus tard, et bien que cette fin de semaine me laisse que très peu de neurones, je te donne, mon avis...
J'ai suivi (bêtement) le tuto sans trop réfléchir, et j'ai un résultat qui fonctionne relativement (et qui marcherait parfaitement si je m'étais appliqué). Selon moi, ce n'est pas une bonne idée de rajouter tous les élements dont tu parles à la suite mais plutot comme une seconde partie du tuto (l'idée étant de fournir différents niveaux pour aider à la compréhension par échelon). Un autre truc sympa serait de fournir les fichiers de ton module pour les fainéants qui sont fatigués du copier-coller
Et puis sinon (dsl), attention aux fautes
Voila, tuto très utile pour les dev drupal !
- reply
Ulhume, le 16 May, 2008 - 16:41@Antipixel tu parles de fainéants qui auraient du mal à lire ?
)) Bon, j'avoue que c'est pas super facile à voir, juste après la conclusion, tu as un petit encadré :
L'ensemble des sources de ce tutoriel est disponible ici.
Là tu as accès à tous les sources sur un serveur subversion.
Sinon, ok pour le tuto "niveau avancé", c'est effectivement une bonne idée.
En tout cas merci pour ton aide.
PS: pour l'orthographe j'atteins là mon seuil d'incompétence. J'appartiens à un bout de génération qui en france est passé dans une faille temporelle d'apprentissage du sujet. l'époque les instit's n'avaient que le mot "éveil" à la bouche... j'ai découvert le concept de "dictées" un peu tard... Si tu as un tuto pour moi à ce sujet je suis preneur !
- reply
anti-pixel (not verified), le 17 May, 2008 - 14:42mea culpa, j'avais pas vu le petit encadré pour les sources

lol j'ai pas de tuto pour l'orthographe dsl, je n'y fais pas trop attention dans les messages et les petits posts mais un peu plus sur les gros tutos
- reply
Anonymous (not verified), le 20 July, 2008 - 13:17Bonjour,
Avant tout merci pour ce tuto. Je me sens un peu moins seul...
J'ai suivi à la lettre vos instructions :
"A ce stade nous pourrions donc activer notre module, mais ne le faites pas tout
de suite, nous avons encore quelque chose à rajouter. ==> OK
j'ai continué :
"Vous pouvez dés maintenant voir le hook en action en allant sur l'URL
http://mon_site_drupal?q=admin/build/block. Vous devriez alors le voir apparaître
dans la liste des blocs désactivés."
==> Dans mon cas, rien n'apparait.
J'ai poursuivi cependant :
"Notre micro formulaire est maintenant prêt à être utilisé par Drupal. Vous
pouvez le tester en cliquant sur le lien configurer dans la page
d'administration, à la fin de la ligne du bloc statistiques, après sa
description."
==> rien n'apparait encore une fois
Merci de votre aide afin que je puisse continuer à avancer dans ma longue, difficile mais passionnante aventure de création d'un web !!!
Je souhaite également mettre gallery2 dans drupal. La config s'est bien passée mais au chargement de mon web je ne vois pas d'accès à la gallerie !
Existe-t-il un tuto dans le style du votre sur le sujet ?
Bien à vous
Onurbski
- reply
Ulhume, le 20 July, 2008 - 23:03Quelle version de Drupal utilisez-vous ? Est-ce un apache que vous hébergez ou mutualisé ?
Sinon, une bonne manière de tester d'où cela peu venir est de coller une trace en début de fonction "statistiques_block", quelque chose du genre
error_log("======> ".$op);
Et de regarder dans les traces apache si cela appairait.
- reply
onurbski, le 20 July, 2008 - 23:39J'utilise :
web server : zazoumiwebserver 1.2.8
DB : mysql 5.0.51 community
php version : 5.2.5 cgi-fcgi
Gallery2 : 2.2.5
OS : XP
Browser : Firefox 2.0.0.16
Pour l'instant, je suis en local sur mon PC et je fais des tests avant déploiement sur free.
J'ai pu créer un article sur drupal.
J'ai pu créer des albums sur gallery2.
Le problème est qu'au lancemnt de drupal je vois en première page du web mon article mais je ne vois rien pour avoir accès à gallery2.
J'ai mis gallery2 sous ...DRUPAL\sites\all\gallery2.
Etant tout débutant, je patauge mais persévère. Savez-vous s'il existe des tutos avec exemple pratique ?
Merci
Onurbski
- reply
Ulhume, le 21 July, 2008 - 06:41C'est de la version de DRUPAL dont j'avais besoin
Pour gallery2, je n'ai vraiement jamais utilisé, mais en toute logique cela doit marcher par node, comme les articles. Donc si vous fait un ?q=admin/content/node est-ce que vous voyez votre galerie dans la liste. Normalement, elle devrait avoir un "type" particulier. Et si oui, pouvez vous l'afficher en cliquant sur la 1iere colonne ?
Sinon, une possibilité classique est une erreur sur le système de fichier, pour cela, allez dans ?q=admin/reports/status et vérifiez que vous n'avez pas d'erreur affichée. Corrigez le cas échéant ?
Sinon pour le tuto sur les blocs, vous avez essayé les traces ?
- reply
Ben (not verified), le 13 August, 2008 - 15:47Pour répondre à ce problème :
**************
"Vous pouvez dés maintenant voir le hook en action en allant sur l'URL
http://mon_site_drupal?q=admin/build/block. Vous devriez alors le voir apparaître
dans la liste des blocs désactivés."
==> Dans mon cas, rien n'apparait.
**************
=> Il faut activer le module créé (?q=admin/build/modules) pour visualiser le bloc
- reply
Ulhume, le 13 August, 2008 - 22:50@Ben il me semble que c'est précisé dans le tuto ?
- reply
charly (not verified), le 19 August, 2008 - 20:47bonjour,
on accede comment a l'url du module ?
http://mon_site_drupal?q=statistiques
car avec cette url cela ne fonctionne pas
J'aimerais developper un module afin de gerer la liste des membres de mon site www.varouler.com
car la liste d'origine n'a pas de mise en page.
J'ai telecharger le module user_liste mais celui ci n'affiche pas les fotos en mini.
Je voudrais donc le modifier.
merci de votre aide
charlyy
- reply
Ulhume, le 24 August, 2008 - 08:12Que veux tu dire par "URL du module" exactement ?
- reply
Kyborash (not verified), le 18 November, 2008 - 10:22Bonjour,
Merci pour le tuto, je commence juste Drupal et je pense que ça va vraiment m'aider
Par contre, à propos du fait que rien n'apparaisse dans la liste des blocs désactivés, parce que - comme l'a dit Ben - il faut activer le module créé, tu lui as répondu : "@Ben il me semble que c'est précisé dans le tuto ?"
Je me permets de signaler que tu ne l'as pas précisé
Tu as bien dit "A ce stade nous pourrions donc activer notre module, mais ne le faites pas tout de suite, nous avons encore quelque chose à rajouter.", mais ensuite, tu ne dis pas "Vous pouvez maintenant activer votre module pour poursuivre" ou quelque chose du genre...
Donc c'est le coup d'oeil aux commentaires qui m'a permis effectivement d'avoir réponse au problème.
Mais en tout cas, merci pour le tuto
- reply
Kyborash (not verified), le 18 November, 2008 - 10:41Etant parvenue à bout du tuto, je vais me permettre encore quelques remarques
- "Ici nous choisissions une case à cocher (checkbox)." => Dans le morceau de code que tu donnes, il s'agit d'un champ texte plutôt, non ?
- "La dernière propriété #title définit le titre du champ. Là aussi nous utilisons la fonction t(...) en prévision d'éventuelles traductions à venir." => le titre de mon champ n'apparaît pas, même si j'enlève la fonction t(...). Une idée pour une solution ?
- "Il est maintenant temps d'afficher notre bloc en sélectionnant une position dans la page d'administration. Une fois ce paramétrage sauvegardé (bouton enregistrer les blocs, le nouveau bloc devrait apparaître là où vous l'avez décidé." => le problème étant que dans ton premier bout de code, on ne trouve pas "content' => 'Un bloc vide');" comme tu le dis ensuite mais "'content' => courses_contenu());"
Donc quand on enregistre le bloc, on a une erreur PHP puisque la fonction courses_contenu() n'existe pas encore !
A part ça, tout est très bien (sauf les fautes d'orthographe mais quelqu'un l'a déjà signalé et puis, il n'y en a pas tant que ça
), et je vais m'attaquer à la suite 
Merci encore
- reply
Marc (not verified), le 18 November, 2008 - 11:15Il me semble qu'il manque la balise fermante de la liste
dans le contenu du bloc.
Ce tutoriel est parfait on comprend tout et permet d'avoir un exemple tout de suite pour coder son propre module.
Merci beaucoup.
Marc
- reply
Ulhume, le 18 November, 2008 - 12:33@Kyborash C'est bon, j'ai normalement tout corrigé
En fait j'essaye de recadrer une série de tutos Drupal sur un même sujet (la liste de courses). C'est pour cela qui restait des incohérences liées à l'ancienne version (un bloc de statistiques). Et pour ce qui est de l'orthographe, c'est une longue route pour y arriver mais je persévère 
Merci pour ton aide.
- reply
Ulhume, le 18 November, 2008 - 12:34@Marc yep tu as raison, c'est corrigé, merci
- reply
Kyborash (not verified), le 20 November, 2008 - 10:59"C'est pour cela qui restait des incohérences liées à l'ancienne version (un bloc de statistiques)." => aaaah, c'est pour ça qu'il y avait le mot statistiques qui traînait un peu partout !
Et donc à part ça, une idée de pourquoi le titre de mon bloc ne s'affiche pas ?
Post new comment