Aller au contenu principal
Version: 0.6.0

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 :

app/Twig/Tags/MyTag.php
<?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);
    }
}
info

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.

app/Controller/MyController.php
$tasksList = [
    'tasks' => [
        'task-1' => 'Task 1',
        'task-2' => 'Task 2',
        'task-3' => 'Task 3',
    ],
];
views/my-template.twig
{% 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>