web-dev-qa-db-fra.com

Vérifiez si la variable est une chaîne ou un tableau dans Twig

Est-il possible de vérifier si la variable donnée est une chaîne dans Twig?

Solution attendue:

messages.en.yml:

hello:
  stranger: Hello stranger !
  known: Hello %name% !

Twig modèle:

{% set title='hello.stranger' %}
{% set title=['hello.known',{'%name%' : 'hsz'}] %}

{% if title is string %}
  {{ title|trans }}
{% else %}
  {{ title[0]|trans(title[1]) }}
{% endif %}

Est-il possible de procéder de cette façon? Ou peut-être avez-vous une meilleure solution?

44
hsz

Peut être fait avec le test iterable, ajouté dans twig1.7, comme Wouter J l'a déclaré dans le commentaire:

{# evaluates to true if the foo variable is iterable #}
{% if users is iterable %}
    {% for user in users %}
        Hello {{ user }}!
    {% endfor %}
{% else %}
    {# users is probably a string #}
    Hello {{ users }}!
{% endif %}

Référence: itérable

115
DarkBee

Ok, je l'ai fait avec:

{% if title[0] is not defined %}
    {{ title|trans }}
{% else %}
    {{ title[0]|trans(title[1]) }}
{% endif %}

Laid, mais ça marche.

9
hsz

J'ai trouvé que iterable n'était pas assez bon car d'autres objets peuvent également être itérables, et sont clairement différents d'un array.

Par conséquent, l'ajout d'un nouveau Twig_SimpleTest pour vérifier si un élément is_array est beaucoup plus explicite. Vous pouvez l'ajouter à la configuration de votre application/après twig is bootstrapped.

$isArray= new Twig_SimpleTest('array', function ($value) {
    return is_array($value);
});
$twig->addTest($isArray);

L'utilisation devient très propre:

{% if value is array %}
    <!-- handle array -->
{% else %}
    <!-- handle non-array -->
{% endif % }
8
Sir.Nathan Stassen