Проверьте, является ли переменная строкой или массивом в 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 %}
Можно ли это сделать так? Или, может быть, у вас есть лучшее решение?
Ответы
Ответ 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 % }