Ça y est !! Je me suis sérieusement remis à Drupal 8. Par manque de temps, je n’avais pas réellement pu me pencher sur cette nouvelle version depuis sa sortie. J’avais écris quelques articles il y a un bout de temps, mais à cette époque D8 n’était pas encore mature et le noyau était appelé à changer. Depuis lors, je n’avais pas réussi à remettre l’ouvrage sur le métier, mais voilà qui est chose faite.
Créer un module avec Drupal… Ok, ouais, un nième article sur comment déclarer le module (.info.yml), un contrôleur et une route… Le truc bateau, quoi… Si c’est ce que vous vous dites en lisant ces lignes, c’est mal me connaître. Pour ceux qui ont eu l’habitude de lire mes articles, vous savez que j’aime bien comprendre les choses en profondeur et généralement j’explique mes trouvailles avec force de détails, afin que vous puissiez vous aussi mettre à profit ces explications.
Commençons par le commencement…
Drupal 8 ! Le commencement, c’est par où, d’abord ? Grande question car le sujet est tellement vaste qu’il ferait presque peur. On installe la bête, on commence à regarder l’administration, on fait des tests, on se dit « ça a l’air bien tout ça » mais on n’est pas forcément plus avancé, hein ? Le passage entre la version 7 et la version 8 a tellement changé la donne que beaucoup ne se sentent pas de s’y mettre, et pour tout avouer, j’en faisais partie.
Qu’à cela ne tienne ! Il y a un moment ou il faut se jeter à l’eau. Ce qui m’intéressait particulièrement, c’est de parcourir les entrailles de la bête et de commencer à comprendre son fonctionnement interne. Et pour ça, il n’y a pas 36 solutions : on prend son courage à 2 mains et on se lance.
De la lecture
Voilà en général ce qu’on fait en premier lieu. J’ai parcouru la documentation officielle pour apréhender les nouvelles API, j’ai lu moultes articles sur le sujet, du routing au contrôleur en passant par les entités, les plugins, et j’en passe. Mais là encore, je ne me sentais pas plus avancé. Puis je me suis posé la question suivante : que pourrais-je faire pour aller de l’avant ? Et la réponse était simple : tenter de développer un module. Etant confirmé dans le développement de modules personnalisés avec Drupal 7 et en ayant un bon stock desdits modules dans mon escarcelle, j’ai commencé à chercher de quel module intéressant je pourrais bien tenter le portage vers D8.
Et là, c’est le drame…
Dans la série de modules pas trop compliqués que j’ai pu développer jusqu’ici, la plupart se basent sur des modules de contribution. Malheureusement, vu la refonte et surtout la complexité qu’amène D8, je me suis rapidement rendu compte que beaucoup de modules de contribution n’ont pas été portés vers D8. Soit les contributeurs sont passés à d’autres technologies, soit ils n’ont pas franchi le pas, ce que je peux comprendre.
Avec D7, quand on commençait à comprendre l’utilisation des hooks et les API internes, il devenait plus ou moins simple de développer un petit module.
Avec D8 par contre, le challenge est tout autre. Déjà, on est passé d’un codage de type procédural à un codage de type objet. Et la programmation orientée objet, ça a l’air simple au départ, mais ça s’avère très abstrait au final. Quand on commence à utiliser des modèles de conception (design patterns) on se rend vite compte qu’il faut comprendre les mécanismes internes pour être efficace…
Bref… J’en étais toujours au même point. Porter un petit module basé sur un module de contribution, ça devenait compliqué si le module de contribution lui-même n’avait pas été porté.
Mon choix
Après avoir parcouru les nombreux modules customisés que j’ai pu développer en D7, mon choix s’est porté sur un module de moyenne envergure que j’ai nommé « internal link ».
Ce module est une sorte de mix entre plusieurs modules de contributions : alinks, word link et dynamic internal linking. Ces modules ont un même but commun : orientés SEO, ils permettent d’ajouter des liens, généralement internes, « par dessus » les textes affichés dans les contenus.
Lorsque j’ai développé internal link, c’était parce que les différents modules précités ne correspondaient pas au besoin que j’en avais. Soit il manquait un support multilingue, soit la logique de fonctionnement n’allait pas avec l’utilisation que je voulais en faire. Je me suis donc inspiré de ces différents modules pour créer le module qui correspondait à mes attentes.
Au final
Voilà pour l’introduction.
Dans les articles qui vont suivre, nous allons voir comment développer ce module et tenter de comprendre une partie des nouveautés de D8.
Nous allons utiliser drupal console, un petit outil très pratique. Nous allons générer des entités de contenu et de configuration, utiliser le nouveau système d’annotations intégré à D8. Nous allons également créer un plugin de type « Field » en utilisant le système d’héritage qu’introduit la programmation orientée objet. Nous survolerons aussi la notion de « services » et d’injection de dépendances.
En substance ? Que du bonheur ! ;-)
Voici enfin la liste des articles qui vont vous aider à défricher ces nouveautés. Cette liste est peut-être amenée à changer si le besoin s'en fait sentir, afin d'expliquer de manière plus ciblée certains éléments.
- Les besoins du module Internal link.
- Drupal Console, c’est bien.
- Installer un site Drupal 8.
- Générer un squelette de module ? trop facile.
- Les annotations de classes.
- Générer un type d'entité ? Drupal console c’est vraiment trop bien.
- Le type d'entité InternalLink.
- Les services, comment ça marche et à quoi ça sert.
- La surdéfinition de formulaires.
- Autocomplete, contrôleur et surdéfinition de champ.
- EntityReference, comment se faire passer pour celui qu’on n’est pas.
- InternalLink, les fonctions utiles.
- EntityListBuilder, ou l'art d'afficher sa liste d'entité.
- La configuration globale du module Internal Link.
- ConfigEntityBase, les entités pour la configuration.
- FormElement c’est clairement pratique.
- FieldType et FieldWidget, quelques subtilités.
- Finalisation du formulaire de configuration globale.
- ParserService, le service de parsing de contenu.
- Le bon vieux système de hook.
- La mise en cache avec Drupal 8.
- Conclusion à propos du module Internal Link pour Drupal 8.
La suite bientôt !