Подтвердить что ты не робот

Проверьте, является ли переменная строкой или массивом в Twig

Можно ли проверить, является ли заданная переменная строкой в ​​ Twig?

Ожидаемое решение:

messages.en.yml:

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

Twig шаблон:

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

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

Можно ли это сделать так? Или, может быть, у вас есть лучшее решение?

4b9b3361

Ответ 1

Может быть выполнено с тестом iterable, добавленным в twig1.7, как указано в комментарии Wouter J:

{# 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 %}

Ссылка: iterable

Ответ 2

Хорошо, я сделал это с помощью

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

Уродливо, но работает.

Ответ 3

Я обнаружил, что iterable недостаточно хорош, так как другие объекты также могут быть итерабельными и явно отличаются от array.

Поэтому добавление нового Twig_SimpleTest для проверки того, является ли элемент is_array более явным. Вы можете добавить это в свою конфигурацию приложения/после того, как веточка загружена.

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

Использование становится очень чистым:

{% if value is array %}
    <!-- handle array -->
{% else %}
    <!-- handle non-array -->
{% endif % }