Некоторое время пользуюсь шаблонизатором Twig, где циклы в шаблонах задаются практически только с использованием оператора for:
{% for item in some_array %} {{ item }} {% endfor %}
При обходе массива (что и делается в большинстве случаев) вопросов не возникало. Но тут приспичило мне сделать цикл типа while. То есть подразумевалось нечто вроде
{% while item = some_array.next() %} {{ item }} {% endwhile %}однако, while не реализован в Twig.
Недолгий гуглёж привёл меня (внезапно!) на страницу документации Twig, где черным по английскому написано: "A sequence can be either an array or an object implementing the Traversable interface." Итак, решается задачка таким образом: создаётся объект, имплементирующий методы стандартного PHP-интерфейса Iterator, подаётся в оператор for и всё работает. Как-то так:
class SomeItems implements Iterator{
private $position = 0;
private $items = [];
public function add($item){
$this->items[] = $item;
}
public function current() {
return $this->items[$this->position];
}
public function key() {
return $this->position;
}
public function valid() {
return isset($this->items[$this->position]);
}
public function rewind() {
$this->position = 0;
}
public function next(){
++$this->position;
}
}
$items = new SomeItems();
$items->add('One');
$items->add('Two');
$twig->display('page.twig', ['items'=>$items]);
На странице page.twig используем обычную конструкцию:
{% for item in items %} {{ item }} {% endfor %}В результате на странице выведены слова "One" и "Two".
Комментариев нет:
Отправить комментарий