Surcharger un gabarit
Ce billet explique sur un exemple simple, le processus mis en œuvre sous Drupal pour manipuler (et ajouter) des variables qui seront ensuite utilisées dans les fichiers de gabarit Twig de votre site. Il repose sur la création de fonctions de prétraitement, les Preprocess hooks, enregistrées dans le fichier d'extension .theme (exemple : dhv4.theme) de votre thème (qui se nomme dhv4 dans l'exemple).
Un exemple d'utilisation est présenté dans la partie version avec preprocess du billet "le bloc créé le :".
1. La syntaxe d'une fonction de prétraitement :
La syntaxe (imposée par Drupal) pour nommer la fonction à la structure suivante : "mytheme_preprocess_hook", dans la quelle :
mytheme est à remplacer par le nom du thème (dhv4 sur ce site) ;
hook est à remplacer par le nom du gabarit (template) à pré-traiter dans lequel les "-" sont remplacés par des "_".
Par exemple, le nom de la fonction de prétraitement pour le gabarit "field--node--created.html.twig" du thème "dhv4" sera "dhv4_preprocess_field--node--created".
L'argument unique de la fonction est la référence de l'objet usuellement nommé $variable : le tableau des variables du gabarit sur lequel porte le traitement.
Dans mon exemple, cette fonction de prétraitement sera donc :
function dhv4_preprocess_field--node--created(&$variables){
...
}

2. Ajouter une variable dans le tableau de variables :
Supposons que dans notre configuration de test, un gabarit nommé "node--180.html.twig", affiche la page d'adresse "/node/180" et ne contient que la ligne de code suivante :
{{ vardumper() }}
Cette page affiche donc la liste des variables disponibles.
La fonction de prétraitement du gabarit "node--180.html.twig", dont le code suit :
function dhv4_preprocess_node__180(&$variables){
$truc = [
"userName" => \Drupal::currentUser()->getAccountName(),
"userMail" => \Drupal::currentUser()->getEmail(),
"node_id" => \Drupal::routeMatch()->getParameter('node')->id(),
];
if (!(isset($variables['dh'] ))){
$variables['dh'] = $truc;
}
}
teste l'existence d'une clé nommée "dh" et s'il elle n'existe pas crée, dans le tableau des variables du gabarit, la paire ayant :
"dh" pour clé ;
pour valeur, le tableau contenant les paires :
clé : "userName" ; valeur : le nom de l'utilisateur courant ;
clé : "userMail" ; valeur : l'adresse courriel de l'utilisateur courant ;
clé : "node_id" ; valeur : le numéro identifiant la page courante.
Pour visualiser cette modification, il faudra vider les caches et recharger la page "/node/180" dont le gabarit est "node--180.html.twig" et l'on obtiendra l'image ci-dessous.

2. Accès, dans le gabarit, à la valeur créée :
La valeur créée dans le § précédent étant un tableau, son contenu sera affiché en plaçant dans le template "node--180.html.twig" pour lequel le prétraitement a été écrit, le code :
{% for value in dh %}
<li>
{{ value }}
</li>
{% endfor %}
ou encore :
{% for key, value in dh %}
<li>
{{ key }} : {{ value }}
</li>
{% endfor %}
Pour n'afficher que le nom et l'adresse le code pourrait être :
<pre style="background: #eee">{{dh.userName}} {{dh.userMail}} </pre>
Si la valeur créée dans le paragraphe précédent avait été une chaine de caractère, le code aurait simplement été :
{{ dh }}