Drupal 10 : Structure des fichiers d'un module

Découvrez quels sont les fichiers qui composent un module et où les placer pour implémenter vos fonctionnalités.

Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.

N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !

La structure des modules a évolué avec Drupal 8, le format YAML ayant pris le pas sur le format INI, le .info hérite logiquement de l'appendice .yml. C'est d'ailleurs le seul fichier obligatoire pour faire vivre un module. Ça n'avance pas forcément à grand chose s'il n'y a que ce fichier évidemment mais c'est la répercussion du fait que vous écrirez de moins en moins de hooks (souvent remplacés par des classes, nous y reviendrons).

Les modules ne peuvent plus être dans l’état désactivé, ils sont soit installés soit désinstallés et désinstaller un module retire du système sa configuration.

La conséquence directe de cela est la disparition des hooks suivants :

  • hook_modules_preenable()
  • hook_enable()
  • hook_modules_enabled()
  • hook_disable()
  • hook_modules_disabled()
  • hook_modules_preinstall()

Les fonctions module_enable() et module_disable() filent au musée car elles sont remplacées par une syntaxe à la sauce POO. Pour installer et désinstaller des modules, il faut maintenant utiliser la syntaxe suivante :

// Activation d'un module version D7.
module_enable(array('mymodule'));

// Activation d'un module version D8.
\Drupal::service('module_handler')->install(array('mymodule'), $enable_dependencies);

// Désinstallation d'un module version D7.
module_uninstall(array('mymodule'));

// Désinstallation d'un module version D8.
\Drupal::service('module_handler')->uninstall(array('mymodule'), $enable_dependencies); 

Les modules peuvent définir d’autres informations telles que :

  • Des librairies (<module_name>.libraries.yml)
  • Des entrées de routeur (<module_name>.routing.yml)
  • Des entrées de menu associées à des entrées de routeur (<module_name>.links.<type>.yml)
  • Des permissions (<module_name>.permissions.yml)
  • Des services (<module_name>.services.yml)

Votre code métier devrait glisser du fichier .module vers des classes. La norme PSR-4 est le standard embrassé pour organiser ces dernières. Elle en permet le chargement automatique, à la demande. Cela engendre l’apparition d’un dossier /src voire d’un dossier /tests afin de respectivement implémenter vos classes de code métier (ex : créer un bloc, créer un nouveau type de champ, widget ou formateur) et vos tests.

On retrouvera aussi de manière régulière les répertoires /config/install et /config/optional qui permettent de fournir les fichiers YAML de configuration par défaut de différents composants de Drupal (View mode, Type de contenu, Configuration, etc.).
Le dossier install contient les éléments qui seront obligatoirement utilisés par votre module, le dossier optional quant à lui contient les configurations utilisables par d'autres modules. Exemple : vous développez un module générique qui peut s'interfacer avec Views. Vous ne savez pas si Views sera utilisé sur le site, vous ne voulez donc pas ajouter une dépendance sur ce module dans le fichier .info.yml mais vous voulez tout de même fournir une vue le cas échéant. Dans ce scénario, il vous suffit alors de placer l'export de votre vue dans le dossier /config/optional et si un utilisateur installe Views sur son site, votre vue sera visible sans action supplémentaire de sa part.

Un dossier /config/schema/ peut également exister, il contient (entre autres) la description de la structure des données lorsqu'elles sont exportées via l'API de configuration.

Commentaires

Julien Lundi 1 février 2016 - 14:53
Bonjour, Merci pour ces infos, du coup trouvez-vous que c'est plus pratique avec cette version que l'ancienne ? Je vous avoue que l'on fait tourner beaucoup de sites avec Wordpress et on pense de plus en plus à aller vers Drupal... à réfléchir encore. Certaines choses ont l'air plus pratique tout de même et offre beaucoup d'avantages. On doit avouer que vos articles nous font beaucoup réfléchir... Julien de Korleon'Biz http://www.korleon-biz.com/
En réponse à par hamami.imed
Artusamak Mercredi 30 mars 2016 - 15:16
Quel nouveau type de données souhaiteriez-vous créer ? Un type de contenu ? Un type de configuration ? Un type de plugin ? Selon la nature de vos données leur implémentation trouvera sa place à un endroit plutôt qu'un autre.

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.
Pour lutter contre le spam notre système enregistre votre adresse IP et votre adresse e-mail si vous la partagez.
Nous vous invitons à consulter notre politique de confidentialité pour comprendre les traitements faits de ces données et comment les rectifier.

À propos de Julien

Co-fondateur - Scrum master & Expert technique

Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.

Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.