Есть ли хорошие способы использовать циклы while и repeat в Twig? Это такая простая задача, но без макросов я не могу найти ничего приятного и простого.
По крайней мере сделать бесконечный цикл, а затем нарушить его в состоянии?
РЕДАКТИРОВАТЬ:
Я имею в виду что-то вроде
do {
// loop code
} while (condition)
или же
while (condition) {
// loop code
}
Изменить 2:
Похоже, что он не поддерживается изначально по той же причине, что и не поддерживается. continue;
или же break;
заявления.
В двух словах: нет. Эта функциональность подразумевает расширенную логику, которая должна быть в вашей бизнес-логике, а не на уровне шаблонов. Это яркий пример разделения интересов в MVC.
Twig поддерживает for
-loops полностью, что должно быть достаточно, если вы правильно кодируете — это те сложные условные решения о том, какие данные отображать, принимаются в бизнес-логике, которой они принадлежат, которые затем передают результирующий массив, «готовый к отображению», в шаблоны. Затем Twig поддерживает все приятные функции, необходимые только для рендеринга.
Я смог реализовать простой цикл в ветке. Итак, следующее заявление php:
for ($x = 0; $x <= 10; $x++) {
echo "The number is: $x <br>";
}
при переводе на веточку это:
{% for i in 0..10 %}
* {{ i }}
{% endfor %}
Это не временная петля, а потенциальный обходной путь. Лучшее предложение — оставить такую бизнес-логику вне уровня шаблона.
Вы можете подражать этому с for ... in ... if
используя достаточно высокий предел петли (10000?)
PHP:
$precondition = true;
while ($precondition) {
$precondition = false;
}
Twig:
{% set precondition = true %}
{% for i in 0..10000 if precondition %}
{% set precondition = false %}
{% endfor %}
PHP:
do {
$condition = false;
} while ($condition)
Twig:
{% set condition = true %} {# you still need this to enter the loop#}
{% for i in 0..10000 if condition %}
{% set condition = false %}
{% endfor %}
Это возможно, но немного сложнее.
Ты можешь использовать {% include ... %}
обрабатывать вложенные массивы, которые из комментариев, которые я прочитал, — то, что вам нужно сделать.
Рассмотрим следующий код:
nested_array_display.html
<ul>
{% for key, val in arr %}
<li>
{{ key }}:
{% if val is iterable %}
{% include 'nested_array_display.html' %}
{% else %}
{{ val }}
{% endif %}
</li>
{% endfor %}
</ul>