Bamboo Twig, Beyond Twig in Drupal 8

Kevin

Kevin


Jul 18th 2018 in code

Travis | StyleCI | Downloads | Latest Stable Version

Bamboo Twig permet d'améliorer la gestion des layouts par le code. Ce module Drupal met en place quelques bonnes pratiques ainsi que le code dont on a fréquemment besoin pour permettre au développeur de découper plus facilement les templates tout en maintenant les projets évolutifs

Drupal 8 a une infrastructure très "découplée": il permet de générer des Blocks indépendants, de créer des Entités (Nodes, Taxonomies, Comments, Files, …) pour le contenu, de leur attribuer des Fields ou encore d’y configurer des View Modes (Teaser, Card, Full, …). Autant de fonctionnalités qui servent un objectif, celui de découpler les logiques métiers en favorisant les petits composants. L’ensemble du Core est construit selon cette philosophie.

Malgré tout cela, Drupal 8 comporte de grosses lacunes dans son implémentation Twig. Le Core n'expose effectivement qu'une dizaine d'outils Twig, ce qui rend les possibilités extensibilité et sa réutilisabilité au niveau Twig extrêmement faible.

L'un des exemples les plus flagrants est la gestion des Blocks. Il est impossible de gérer nos différents Blocks sans passer par une interface monolithique, Block Layout. En utilisant cette dernière, on se trouve alors rapidement confronté à maintenir une multitude de Blocks apparaissant sur quelques pages uniquement. Nous devons également maintenir des logiques de visibilité directement dans la Configuration Drupal. Une horreur dès que le site atteint une taille et une personalisation avancées.

Sans tomber dans le paradigme "Buisness Logic into Frontend", cette fonctionnalité est faite, de mon point de vue, pour gérer les Blocks principaux de votre CMS tels que Header, Footer, Breadcrumbs, Navigations… Quant aux autres Blocks, il serait bien plus agréable, maintenable et évolutif d'en gérer l'appel directement depuis leurs contextes associés, autrement dit: depuis leur template Twig.

Voilà comment est né le module Bamboo Twig.

Qu'est-ce que Bamboo Twig et comment ça marche?

Bamboo Twig va venir se greffer directement au système Twig de Drupal 8 et va étendre ses fonctionnalités avec une multitude de Filters et Functions supplémentaires.

J'ai opté pour une approche sous la forme de sous-module(s) afin de permettre l'activation des outils dont vous avez besoin plutôt que de submerger votre environnement Twig avec la panoplie complète qui ne vous sera pas nécessairement utile. L’activation de plusieurs dizaines de Filters et Functions Twigs pouvant aussi avoir quelques conséquences non négligeables sur les performances, suivez mon conseil et n'activez que les sous-modules dont vous avez besoin. Pour installer Bamboo Twig, lancez donc la commande composer require drupal/bamboo_twig et activez les sous-modules un par un!

L'une des fonctionnalités principales de ce module est sa capacité à rendre des View Modes d'entité ou des Blocks directement via une Function Twig. Je ne vais pas vous lister l'ensemble des fonctionnalités du module, celui-ci expose plus de 25 nouveaux Filters et Functions, que je vous laisse découvrir dans la documentation officielle, voici cependant les features principales :

Write programs that do one thing and do it well.
- Peter H. Salus in A Quarter-Century of Unix (1994)

Renderer

Ce module permet de gérer le rendu de tous les objets Drupal 8. En partant des entités, des champs, des formulaires jusqu'à une région spécifique ou un bloc, tout peut-être rendu selon le fonctionnement interne de Drupal 8.

Le cas d'utilisation le plus courant étant le rendu d'une entité spécifique, ex: Rendre le teaser d'un node de type Article.
Il est également souvent utiliser pour rendre un Block, un Form ou encore un ImageStyle.

Loader

Ce module permet de gérer le chargement de tous les objets Drupal 8. A contrario du Renderer qui permet de gérer l'affichage, le Loader se situe au plus près du code en permettant de manipuler directement les entités.

Internationalisation

Drupal 8 propose bien sa propre implémentation format_date afin d'utiliser le \Drupal\Core\Datetime\DateFormatter, permettant de formatter des dates tout en utilisant le système d'internationalisation. Cependant, celui-ci fonctionne uniquement avec la réception d'un objet de type Drupal\Core\Datetime\DrupalDateTime. Le Filter Bamboo Twig est capable de fonctionne avec une String, un Timestamp ou un Object Date: une utilisation bien plus simple et flexible.

Files

Ce module expose l'un des filtres les plus utiles de Bamboo Twig, bamboo_file_url_absolute. Alors que le Core drupal propose la Function file_url permettant de générer une URL relative à partir d'une URI, le Core ne propose pas de méthode pour la génération d’URL absolue. bamboo_file_url_absolute vient pallier a ce manque.

Le cas le plus flagrant d'utilisation est dans les templates de mails transactionnels, ou les URLs se doivent d'être absolues.

Twig Extensions

Ce module intègre l'ensemble des fonctionnalités provenant du très célèbre package "Twig Extension" — twig-extensions.readthedocs.io. Vous y retrouverez tous les filtres et fonctions les plus utiles lors du développement avec Twig. Il contient également quelques méthodes utiles comme strpad et quelques autres.

Configurations

Ce sous-module permet de récupérer les valeurs de configurations provenants des 3 types de configurations inclues dans le Core Drupal 8, soit: State API, Settings & Config API.

Token

Implémentation complète des fonctionnalités Token directement accessible dans vos templates Twig.

Security

Permet de définir l'appartenance à des rôles ou des permissions selon un utilisateur donné ou selon l'utilisateur courant.

Stability & Testing

Why do most developers fear to make continuous changes to their code? They are afraid they’ll break it! Why are they afraid they’ll break it? Because they don’t have tests.”
- Robert C. Martin, The Clean Coder: A Code of Conduct for Professional Programmers

Pour l'ensemble des projets Open Source, il est crucial de respecter les conventions et les Bests Practices de l’outil. Afin d’être les plus proches possible des conventions Drupal 8, que ce soit dans le fonctionnement ou dans l'implémentation du code, nous avons intégré plusieurs outils automatisant le Contrôle de Qualité tels que PHPMD, PHPCD, PHPCPD.

Ce module intègre également plus de 34 tests unitaires pour un total de 89 assertions. Ceci afin de garantir une stabilité complète aux utilisateurs du module, mais également une compatibilité avec les futures versions de Drupal 8. En effet, nous ne nous contentons pas de lancer des tests journaliers sur la version actuelle de Drupal 8 mais également nous le faisons également sur les prochaines versions majeures en cours de développement.

De plus, afin d’aller encore plus loin, nous avons mis en place un repository Github Mirroir afin d’y intégrer StyleCI et TravisCI pour le contrôle continu à l’extérieur de l’environnement Drupal. Ceci nous permet de mieux gérer les contributions externes et les reviews de codes.

En utilisant Bamboo Twig, vous êtes certains que votre code sera supporté sur l'ensemble des versions 8.x de Drupal et également porté sur Drupal 9.

Le mot de la fin

Great power involves great responsibility.”
- Franklin D. Roosevelt, 32nd U.S. President

Bamboo Twig apporte beaucoup davantage, que ce soit dans sont idéologie d'homogéinisation, de l'apport conséquent d'outils ou par sa facilité d'utilisation, il faut cependant être vigilant: Bamboo Twig peut être dangereux !

En effet, lorsque vous l’utiliserez, vous serez capable d'effectuer un très grand nombre d'opérations directement depuis les templates Twig et cela vous rendra capable du meilleur comme du pire.
Ne tomber pas dans de mauvais travers et garder à l'esprit qu'il faut utiliser ce module avec parcimonie, éviter d'intégrer des logiques dans vos templates ou d'utiliser à tort et à travers les fonctions et filtres Twig pour résoudre - Quick & Dirty - des problèmes qui méritent parfois une plus grande réflexion.

Use cases

Voici quelques exemples et cas d'utilisation dans lequel Bamboo Twig expose son plein potentiel:


Sources

La documentation officielle.

Pour les plus curieux d'entre vous, voici quelques sources d'informations complémentaires ayant inspiré la création de cet article.

Robert C. Martin (Juillet 17, 2008). Clean Code: A Handbook of Agile Software Craftsmanship.

Emmanuel Deloget (02 octobre 2014). Le principe "ouvert/fermé". Retrieved from http://blog.emmanueldeloget.com/

Robert C. Martin (Juillet 17, 2008). Object Oriented Software Construction.

Fabien Potencier (Septembre 9, 2009). Découpler votre code pour assurer la réutilisabilité et la maintenabilite. Retrieved from http://slideshare.net/