Créer un tag
Les tags sont utiliser pour facilité les l'écriture de logique plus ou moins complexe. Principalement, on va y intégrer des conditions, boucles, etc... et sortir une variable du contexte qui sera accessible entre les tags.
Pour la création d'une nouvelle tag, tapez la commande php dobby make:twig:tag <TagName>.
L'objectif de cette class est de configurer notre Tag en fonction de 2 paramètres principaux :
$node: Les paramètres du tag$body: Le contenu du bloc
On défini le nom du tag par la constante TAG.
Cette commande va générer la class suivante :
<?php namespace Elementum\Theme\Twig\Tags; use Elementum\Services\Twig\Traits\SimpleCompiler; class Tasks extends \Twig\Node\Node { public const string TAG = "tasks"; use SimpleCompiler; /** * @param \Twig\Node\Node $node : Paramètres du tag * @param \Twig\Node\Node $body : Le contenu du bloc * @param int $lineno : La ligne du token * @param string|null $tag : Le tag du noeud */ public function __construct(\Twig\Node\Node $node, \Twig\Node\Node $body, $lineno, $tag = null) { parent::__construct(['node' => $node, 'body' => $body], [], $lineno, $tag); } /** * @param \Twig\Compiler $compiler : Le compilateur * @return void */ public function compile(\Twig\Compiler $compiler) { /** * Pensez à échapper les variables par des anti-slashs. * La fonction simpleCompiler attend uniquement une chaine de caractère de code PHP. * Les vrai variables PHP doivent être interpolé par des accolades comme node et body. * Le context permet de créer une variable Twig disponible dans le body du tag. * La variable node peut être un nombre, un chaine de caractère mais principalement on utilisera un tableau. */ $content = <<<PHP \$node = {{ node }}; foreach(\$node["tasks"] as \$index => \$task) : \$context["task"] = \$task; \$context["index"] = \$index; {{ body }} endforeach; PHP; $this->simpleCompiler($compiler, $content); } }
simpleCompiler est une méthode créer pour simplifier la compilation du code par Twig. Initialement, il est assez fastidueux de créer un tag.
Ici, à part faire attention à bien échapper les variables, et interpoler les vrai variables PHP, il n'y a pas besoin de se soucier se soucier du fonctionnement plus interne de Twig.
Utilisation
Imaginons que nous avons une variable tasksList comme défini ci-dessous, que l'on envoie à notre template Twig.
$tasksList = [ 'tasks' => [ 'task-1' => 'Task 1', 'task-2' => 'Task 2', 'task-3' => 'Task 3', ], ];
{% tasks tasksList %} <p id="{{ index }}">{{ task }}</p> {% endtasks %} // <p id="task-1">Task 1</p> // <p id="task-2">Task 2</p> // <p id="task-3">Task 3</p>