16 votes

Twig rend la clé du tableau avec un tiret dedans

Comment rendre la valeur de la clé d'un tableau lorsqu'elle comporte un tiret dans son nom ?

J'ai cet extrait :

$snippet = "
    {{ one }}
    {{ four['five-six'] }}
    {{ ['two-three'] }}
";

$data = [
    'one' => 1,
    'two-three' => '2-3',
    'four' => [
        'five-six' => '5-6',
    ],
];

$twig = new \Twig_Environment(new \Twig_Loader_String());
echo $twig->render($snippet, $data);

Le résultat est

1
5-6
Notice: Array to string conversion in path/twig/twig/lib/Twig/Environment.php(320) : eval()'d code on line 34

Et il rend four['five-six'] fin. Mais il y a une erreur sur ['two-three'] .

28voto

Niels Keurentjes Points 19255

Cela ne peut pas fonctionner, puisque vous ne devriez pas utiliser d'opérateurs natifs dans les noms de variables - Twig compile en interne en PHP et ne peut donc pas gérer cela.

Pour les attributs (méthodes ou propriétés d'un objet PHP, ou éléments d'un tableau PHP), il existe une solution de contournement, de la documentation :

Lorsque l'attribut contient des caractères spéciaux (comme - qui serait interprété comme l'opérateur moins), utilisez plutôt la fonction d'attribut pour accéder à l'attribut de la variable :

{# equivalent to the non-working foo.data-foo #}
{{ attribute(foo, 'data-foo') }}

7voto

Playnox Points 121

En fait, cela peut fonctionner, et cela fonctionne :

        $data = [
            "list" => [
                "one" => [
                    "title" => "Hello world"
                ],
                "one-two" => [
                    "title" => "Hello world 2"
                ],
                "one-three" => [
                    "title" => "Hello world 3"
                ]
            ]
        ];
        $theme = new Twig_Loader_Filesystem("path_to_your_theme_directory");
        $twig = new Twig_Environment($theme, array("debug" => true));
        $index = "index.tmpl"; // your index template file
        echo $this->twig->render($index, $data);

Et les snippets à utiliser dans le fichier de modèle :

{{ list["one-two"]}} - Returns: Array
{{ list["one-two"].title }} - Returns: "Hello world 2"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X