Twig3: Как перенести "для элемента в элементах, если item.foo == 'bar'" с l oop bariable - PullRequest
1 голос
/ 24 января 2020

Я использую следующий код Twig 2:

{% for item in items if item.foo == 'bar' %}
   <span class="{% if loop.index % 2 %}special-class{% endif %}">
       {{ item.value }}
   </span>
{% else %}
    Nothing found
{% endfor %}

В документации по ветке: https://twig.symfony.com/doc/2.x/deprecated.html

Добавление условия if для for тег не рекомендуется в Twig 2.10. Вместо этого используйте filter фильтр или условие «if» внутри тела «for» (если ваше условие зависит от переменной, обновляемой внутри l oop)

Интересно, как перенести мой Код Twig 2 для Twig 3. Как видите, я использую переменную l oop и else для for l oop. Я знаю, что могу использовать новый параметр и увеличить его сам ... но разве это намерение? Как мне переписать этот код, используя filter?

Ответы [ 2 ]

4 голосов
/ 24 января 2020

У вас есть два варианта решения

  1. Поместите тег if внутри l oop
{% set i = 0 %}
{% for item in items %}
    {% if item.foo == 'foo' %}
        <span class="{% if i % 2 %}special-class{% endif %}">
            {{ item.value }}
        </span>
        {% set i = i + 1 %}
    {% endif %}
{% else %}
    Nothing found
{% endfor %}

С этим решением Вы не можете «полагаться» на внутреннюю переменную loop, поскольку счетчик продолжает увеличиваться независимо от того, было ли выполнено условие

Использовать filter - фильтр
{% for item in items | filter(item => item.foo == 'foo') %}
   <span class="{% if loop.index % 2 %}special-class{% endif %}">
       {{ item.value }}
   </span>
{% else %}
    Nothing found
{% endfor %}

обновленная демоверсия

3 голосов
/ 24 января 2020

При использовании фильтра filter ваш код будет выглядеть примерно так (см. Также https://twigfiddle.com/9hiayc и https://twigfiddle.com/9hiayc/2):

{% for item in items|filter(i => i.foo == 'bar') %}
   <span class="{% if loop.index % 2 %}special-class{% endif %}">
       {{ item.value }}
   </span>
{% else %}
    Nothing found
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...