TWIG : Tableau associatif passé à une macro

Impossible d'accéder à la clé

a marqué ce sujet comme résolu.

Bonjour,

Quelqu’un peut-il m’expliquer pourquoi lorsque je fais la chose ci-dessous, j’ai un message d’erreur qui m’indique qu’il n’est pas possible d’accéder à la clé X sur une chaîne.

Je comprends ce que signifie le message mais je ne comprends pas pourquoi il est généré étant donné que je passe bien un tableau à ma macro :

{% import ":macro:elementMacro.html.twig" as em %}
 
 
        {% set args = 
            {
                'cleTest': 'valeur pour cleTest',
                'autreNomDeCle' : 'une valeur quelconque'
            }
        %}
        {{ em.button_p(args) }}

Voici ma macro :

{% macro button_p(args) %}
    {{ dump(args) }}
{% endmacro %}

Le rendu après exécution : Image utilisateur

Maintenant, si je fais :

{% macro button_p(args) %}
    {{ dump(args.cleTest) }}
    {{ dump(args['cleTest']) }}
{% endmacro %}

J’ai un message d’erreur qui indique que le clé "cleTest" n’existe pas ce qui est illogique par rapport à l’image précédente : Impossible to access an attribute ("cleTest") on a string variable J’ai même un message m’indiquant les clés disponibles si je mets un nom de clé qui n’existe pas :

{% macro button_p(args) %}
    {{ dump(args.nomInexistant) }}
{% endmacro %}

Cela me donne le message suivant :

Key "nomInexistant" for array with keys "cleTest, autreNomDeCle" does not exist.

J’ai donc bien deux clés mais je ne peux pas les utiliser ! C’est cela que je ne comprends pas.

Je sais que je peux y accéder depuis une boucle (mais ce n’est pas ce que je veux faire) :

{% macro button_p(args) %}
    {% for key, value in args %}
 
        {{ dump(args.cleTest) }}
 
    {% endfor %}
{% endmacro %}

Donc voici mes questions :

  • pourquoi n’est-il pas possible de faire args.cleTest ?

  • pourquoi args.cleTest fonctionne dans la boucle ?

  • comment faire pour pouvoir faire args.cleTest hors boucle ?

Merci beaucoup

Salut !

Je serais curieux de savoir quelle ligne de la macro de test renvoie l’erreur, et avec quelle version de Twig tu fonctionnes. Je sais que jusqu’à une certaine version, il y avait deux manières d’accéder à un index d’un tableau ['truc', 'chose'] (tableau[0] ettableau.0) et que seule la version avec les crochets est avec les versions récentes (je n’arrive plus à dire si c’est limité à Twig 1.x, cependant). Il me paraîtrait du coup logique quand tu créés un tableau associatif {'premier': 'truc', 'second': 'chose'} que seule une des syntaxes soit acceptée.

+0 -0

Bonjour Ymox,

J’ai la version 2.x

J’avais effectivement tenté avec tableau[0] ou tableau.0pour voir si j’avais un résultat mais j’ai le même message d’erreur qui m’indique que la clé 0 n’existe pas et que la variable a deux clés. Donc le message me dit que j’ai deux clé mais je ne peux pas les utiliser. C’est complètement dingue. J’ai fait pas mal de recherches en vain. Le problème, c’est que du coup, je ne peux pas passer un tableau d’argument à mes macros ce qui rend leur signature trop complexe à utiliser (bonjour la dette technique !) Si je crée un objet avec des propriétés, ça fonctionne mais ce n’est pas ce que je veux faire. Comme c’est une macro pour rendre un bouton, je ne me vois pas créer autant d’objets qu’il y a de bouton dans ma vue. Le développeur "twig" doit pouvoir le faire sans toucher aux classes. Le tableau à créer doit donc l’être dans la vue et non dans la méthode qui rend la vue.

Vraiment, quelque chose m’échappe. Il y a forcément une explication !

Si je comprends bien, dans ta macro, même si tu n’utilises qu’une des deux syntaxes, tu as le même message d’erreur quelle que soit celle que tu choisis ?

Si c’est bien le cas, est-ce que par hasard il n’existerait pas dans la macro une variable cleTest et une autre autreNomDeCle ? Je me demande si (voulu ou non) un tableau n’est pas "extrait" dans une macro.

+0 -0

J’ai réduit la macro au scrict minimum, c’est à dire à ce que j’ai mis dans mon message à savoir :

{% macro button_p(args) %}
    {{ dump(args.cleTest) }}
{% endmacro %}

Effectivement pour comprendre, j’ai réduit le contenu à celui là. Et pourtant, dump(args) m’affiche bien le contenu de la variable comme étant un Array avec clés et valeurs ! : Image utilisateur

Oui oui :

J’avais effectivement tenté avec tableau[0] ou tableau.0 pour voir si j’avais un résultat mais j’ai le même message d’erreur qui m’indique que la clé 0 n’existe pas et que la variable a deux clés. Donc le message me dit que j’ai deux clé mais je ne peux pas les utiliser. C’est complètement dingue.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte