DevGang
Авторизоваться

Twig

Русскоязычная документация по Twig - PHP шаблонизатору. Руководство по Твиг на русском языке

Цикл for осуществляет перебор последовательности. Например, выведем список пользователей users:

<h1>Members</h1>
<ul>
    {% for user in users %}
        <li>{{ user.username|e }}</li>
    {% endfor %}
</ul>

Последовательность может быть массивом или объектом, реализующим Traversable интерфейс.

Если цикл проходит по массиву чисел, можно использовать оператор .. :

{% for i in 0..10 %}
    * {{ i }}
{% endfor %}

Приведенный выше фрагмент кода выводит все числа от 0 до 10. Также оператор .. может быть полезен при работе с буквами:

{% for letter in 'a'..'z' %}
    * {{ letter }}
{% endfor %}

The .. operator can take any expression at both sides:

{% for letter in 'a'|upper..'z'|upper %}
    * {{ letter }}
{% endfor %}

Переменные цикла

loop.index Текущая итерация цикла (начиная от 1)
loop.index0 Текущая итерация цикла (начиная от 0)
loop.revindex Количество интераций с конца цикла (начиная от 1)
loop.revindex0 Количество интераций с конца цикла (начиная от 0)
loop.first выставляется в True если текущая итерация является первой
loop.last выставляется в True если текущая итерация является последней
loop.length Количество элементов в последовательности
loop.parent Родительский контекст
{% for user in users %}
    {{ loop.index }} - {{ user.username }}
{% endfor %}

Переменные цикла loop.length, loop.revindex, loop.revindex0, and loop.last могут быть использованы только при работе с PHP массивами или объектами, реализующими Countable интерфейс (т.е. интерфейс возвращающий значение фукнции count - количество элементов в массиве или количество свойств объекта). Данные переменные недоступны, если цикл содержит условия.

Добавление условий

В отличие от PHP, в данном случае нельзя прервать или продолжить цикл. Однако можно создавать правила прохождения последовательностей во время итераций, позволяющие пропускать или отбирать элементы по установленным критериям. В примере ниже неактивные пользователи пропускаются:

<ul>
    {% for user in users if user.active %}
        <li>{{ user.username|e }}</li>
    {% endfor %}
</ul>

Преимущество состоит в том, что переменная цикла будет считать корректно. Keep in mind that properties like loop.last will not be defined when using loop conditions.

Использовать переменную цикла одновременно с условиями не рекомендуется, поскольку вы получите не тот результат, который ожидаете. Например, добавление условия loop.index > 4 работать не будет, поскольку индекс увеличивается только в том случае, если условие истинно.

Условный оператор "else"

Если итерация не состоялась из-за того, что последовательность была пуста, вы можете осуществить замену/подстановку блока, используя оператор else:

<ul>
    {% for user in users %}
        <li>{{ user.username|e }}</li>
    {% else %}
        <li><em>no user found</em></li>
    {% endfor %}
</ul>

Итерации с ипользованием фильтра Keys

По умолчанию, цикл проходит по всем значениям последовательности. С помощью фильтра keys можно организовать перебор ключей массива:

<h1>Members</h1>
<ul>
    {% for key in users|keys %}
        <li>{{ key }}</li>
    {% endfor %}
</ul>

Итерации с ипользованием фильтров Keys и Value

Также вы можете вывести ключи и значеня одновременно

<h1>Members</h1>
<ul>
    {% for key, user in users %}
        <li>{{ key }}: {{ user.username|e }}</li>
    {% endfor %}
</ul>

Итерации на подмножествах

При необходимости перебрать подмножество значений/определенную часть элементов множества, можно использовать фильтр slice:

Вы также можете организовать цикл, который переберет ключи массива по определенным параметрам/свойствам:

<h1>Top Ten Members</h1>
<ul>
    {% for user in users|slice(0, 10) %}
        <li>{{ user.username|e }}</li>
    {% endfor %}
</ul>
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться