Twig: Как написать цикл for с интегрированным условием if, основанным на значении - PullRequest
0 голосов
/ 01 ноября 2019

ситуация

  • У меня есть небольшое приложение Symfony Twig, где я запускаю цикл for для отображения всех элементов.
  • Я хочу разрешитьпользователь решает, будет ли его содержимое отображаться в определенном порядке или случайным образом, для чего я буду использовать функцию расширения ветки shuffle ().
  • Если пользователь активирует переключатель тасования в бэкэнде, он выдаст yes дляпеременная activShuffle.
  • Я хочу активировать расширение twig shuffle (), если вышеупомянутая переменная имеет значение yes

проблема

Я нашел способ справиться с требованием. Но следующим образом мне нужно продублировать некоторый код, который мне кажется очень неправильным.

Текущий код:

{% if activateShuffle == 'yes' %}
    {% for item in images|shuffle() %}
        <div>
            <h1>{{ item.title }}</h1>
            <img src="{{ asset('images/')}}{{ item.imagename }}"/>
        </div>
    {% endfor %}
{% else %}
    {% for item in images %}
        <div>
            <h1>{{ item.title }}</h1>
            <img src="{{ asset('images/')}}{{ item.imagename }}"/>
        </div>
    {% endfor %}
{% endif %}

решение

есть ли способ определить условие if в цикле for? чтобы он проверял, имеет ли переменная конкретное значение, и добавляет расширение? Так что, может быть, что-то вроде этого:

{% for item in images if activateShuffle == 'yes' add |shuffle() %}
    <div>
        <h1>{{ item.title }}</h1>
        <img src="{{ asset('images/')}}{{ item.imagename }}"/>
    </div>
{% endfor %}

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы можете изменить переменную images в зависимости от значения activateShuffle перед циклом следующим образом:

{% if activateShuffle == 'yes' %}
    {% set images = images|shuffle() %}
{% endif %}

{% for item in images %}
    <div>
        <h1>{{ item.title }}</h1>
        <img src="{{ asset('images/')}}{{ item.imagename }}"/>
    </div>
{% endfor %}
0 голосов
/ 01 ноября 2019

Использование макроса:

{% macro render_images_conditional(images, doShuffle) %}
    {% if doShuffle %}
        {% set images = images|shuffle() %}
    {⅜ endif %}

    {% for item in images %}
        ...
{% endmacro %}

{{ _self.render_images_conditional(images, shuffle) }}
...