Macros dans les templates Twig
D’après la documentation officielle de Twig : « Les macros sont comparables aux fonctions dans les langages de programmation classiques. Elles sont utiles pour placer des idiomes HTML fréquemment utilisés dans des éléments réutilisables, afin d’éviter les répétitions ».
{% macro input(name, value, type, size) %} <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" /> {% endmacro %}
Les macros diffèrent des fonctions PHP natives sur plusieurs points :
- Les valeurs par défaut des arguments sont définies avec le filtre default dans le corps du macro ;
- Les arguments du macro sont toujours optionnels.
- Si des arguments positionnels supplémentaires sont passés au macro, ils sont accessibles via la variable spéciale varargs sous forme de liste.
Cependant, comme pour les fonctions PHP, les macros n’ont pas accès aux variables du contexte actuel du template. Vous pouvez passer tout le contexte en argument en utilisant la variable spéciale _context.
Appeler un macro
Depuis _self
Un macro peut être défini dans le même fichier Twig depuis lequel il est appelé. Dans ce cas, on utilise le contexte _self
:
{{ _self.input(name, value, type, size) }}
Depuis un fichier externe
Cependant, il est recommandé de placer les macros dans un fichier séparé (par exemple macros.twig) afin de pouvoir les réutiliser dans plusieurs templates.
Par exemple, dans un thème personnalisé « mytheme », on place le fichier macro ici :
[site_root]/themes/custom/mytheme/templates/macros.twig
Note : le fichier de macro peut avoir n’importe quel nom avec extension .twig, mais pas .html.twig (ex. macros.html.twig ne fonctionne pas). Le fichier doit aussi être placé dans le dossier « templates » même si vous l’utilisez ailleurs (par exemple, pour les layouts Layout Builder placés dans ... /mytheme/layouts, le macro doit être dans ../mytheme/templates).
Dans le template où vous souhaitez utiliser le macro, ajoutez cette instruction d’import :
{% import '@mytheme/macros.twig' as myMacros %}
« @mytheme » trouve magiquement le dossier « templates » de votre thème, mais vous devez définir la structure de sous-dossiers dans l’import si besoin, par exemple :
{% import '@mytheme/foo/bar/macros.twig' as myMacros %}
Notez que dans des versions plus anciennes de la documentation, cette structure imbriquée n’était pas nécessaire, donc votre expérience peut varier. Pour un module personnalisé, utilisez la même technique avec le nom du module à la place du nom du thème (ex. @mycustommodule).
Ensuite, utilisez le macro ainsi :
{{ myMacros.input(name, value, type, size) }}
Exemples
Dans Drupal 8, un macro est utilisé par exemple pour générer la navigation principale (voir le fichier menu.html.twig).