Цикл if в twigs

Цикл if в twigs thumbnail

Вы здесь: Главная – PHP – PHP Основы – Циклы и условия в Twig

Циклы и условия в Twig

Twig представляет собой шаблонизатор сопоставимый с возможностями самого языка PHP, а порой и превосходит его. Да, что там говорить, Twig изначально ведь и создавался для того, чтобы максимально упростить сложный синтаксис шаблонов PHP.

Поэтому, нет ничего удивительного в том, что в Twig есть все необходимые базовые конструкции, аналогичные PHP – циклы и условия.

В предыдущих статьях мы уже видели, что представляет собой цикл в Twig. Обычно, мы используем тег for, назначая алиас для каждого элемента из некоторого определенного массива. В нашем случае с сотрудниками школы, в качестве алиаса у нас выступает staffer (сотрудник) из массива сотрудников (staff). Через алиас можно затем получить доступ ко всем атрибутам объекта, на который это алиас указывает с помощью оператора точки (.). Для обозначения окончания тега for используется тег endfor.

Twig предоставляет много разных фишек, синтаксических улучшений, таких как например оператор двоеточие (..), который является короткой альтернативой функции range в PHP. Т.е. с помощью него можно перебирать перечисляемые значения.

Вот пример:

{% for number in 0..100 %}

{{ number }}

{% endfor %}

Подобное возможно и для букв

{% for letter in ‘a’..’z’ %}

{{ letter }}

{% endfor %}

Также, очень полезной может оказаться возможность добавления условия прямо в определение цикла. С помощью условия мы сможем отфильтровать элементы по тому или иному критерию. Допустим нам необходимо отфильтровать список продуктов по цене – их цена должна быть менее 150 у.е. Вот как это будет выглядеть в Twig:

<tbody>

{% for product in products if product.value < 150 %}

<tr>

<td>{{ product.name }}</td>

<td>{{ product.description }}</td>

<td>{{ product.value }}</td>

<td>{{ product._register|(“m/d/Y”) }}</td>

</tr>

{% endfor %}

</tbody>

Условия

Как и циклы, Twig поддерживает тег условия -if, elseif, if not и else. Это вполне стандартные конструкции, которые аналогичны конструкциям в PHP. Они могут использоваться для фильтрации значений.

Допустим в некотором приложении нам необходимо отфильтровать товары, отобразив только те, у которых цена больше 300 у.е.:

<tbody>

{% for product in products %}

{% if product.value > 300 %}

<tr>

<td>{{ product.name }}</td>

<td>{{ product.description }}</td>

<td>{{ product.value }}</td>

<td>{{ product._register|(“m/d/Y”) }}</td>

</tr>

{% endif %}

{% endfor %}

</tbody>

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

  • Создано 29.11.2018 10:02:07

  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.

Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,

то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так:

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Источник

Цикл 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>

Источник

В PHP у вас есть возможность выйти из цикла или перейти к следующей итерации. Мне было интересно, есть ли у вас такая же функциональность в Twig Symfony.

Например, в PHP я могу сделать:

foreach ($array as $key => $value) { if ($value == ‘something’) { continue; } elseif ($value == ‘somethingElse’) { break; } echo $value; }

Есть ли что-то похожее на Twig? Например что-то вроде:

{% for value in array %} {% if value == ‘something’ %} {% continue %} {% endif %} {% if value == ‘somethingElse’ %} {% break %} {% endif %} {{ value }} {% endfor %}

13

Решение

Вы можете сделать что-то вроде этого, чтобы смоделировать шаблон:

{% set breakLoop = false %} {% for value in array if breakLoop == false %} {% if value == ‘somethingElse’ %} {% breakLoop = true %} {% endif %} {% if value != ‘something’ and breakLoop == false %}{{ value }} {% endif %} {% endfor %}

Просто оберните код внутри условия, чтобы не продолжать.

Для взлома используйте переменную, видимую снаружи цикла for.

Думаю, вы могли бы написать свой собственный цикл for.

14

Другие решения

Я прочитал все ответы и согласен с ними, но они не совсем верны, поэтому я решил написать и мои.

Во-первых, как указал @ CristiC777 в своем сообщении, если вы дойдете до случая, когда вам нужно сломать для, Вы делаете что-то не так до этого момента. Вы, вероятно, можете это исправить, просто ограничив ваши запросы или сбросив данные из ваших массивов. Это лучшее решение, потому что вы улучшите время отклика и сэкономите память сервера.

Взгляды на веточку должны быть глупыми. Если вы поместите в них несколько условий и переменных, вы только сделаете их нечитаемыми и не поддерживаемыми.

Если по какой-то причине вы не можете изменить предыдущий код, как указывал @Edgar Alloro, Twig позволяет вам ставить условия для (с версии 1.2). Ваш пример изменится на что-то вроде этого:

{% set keepFor = true %} {% for value in array if keepFor %} {% if value != ‘valueExpected’ %} {% keepFor = false %} {% endif %} {{ value }} {% endfor %}

Вы также можете сделать свою собственную реализацию, особенно если у вас нет Twig 1.2. Если у вас есть Twig 1.2 или выше Я не рекомендую это, потому что for будет перебирать весь массив, и вы будете тратить больше памяти:

{% set keepFor = true %} {% for value in array %} {% if keepFor %} {% if value != ‘valueExpected’ %} {% keepFor = false %} {% endif %} {{ value }} {% endif %} {% endfor %}

9

Прежде всего !

подготовить ваши данные в контроллер и отправить просто что нужно в веточке!

потому что веточка Посмотреть, и не рекомендуется играть с большими списками. Подумайте о том, что вы можете оказаться в ситуации, когда вы видите много объектов или объектов, которые вы не используете.

так что если вы все еще хотите иметь трудную жизнь, используйте решение Эдгара Аллоро с переменной, объявленной перед циклом. Или я знаю, что на этой итерации LastIndex пытается установить это, когда вы хотите затормозить цикл ..

Повеселись ! ????

8

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

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

6

Создать TwigExtension используя эти классы:

  • AppBundle Twig AppExtension.php:

    namespace AppBundleTwig; class AppExtension extends Twig_Extension { getTokenParsers() { return array( new BreakToken(), ); } public getName() { return ‘app_extension’; } }

  • AppBundle Twig BreakToken.php:

    namespace AppBundleTwig; class BreakToken extends Twig_TokenParser { public parse(Twig_Token $token) { $stream = $this->parser->getStream(); $stream->expect(Twig_Token::BLOCK_END_TYPE); // Trick to check if we are currently in a loop. $currentForLoop = 0; try { // This “try” is because look() will throws a PHP exception if $this->current – $i is negative (where $this is $stream). for ($i = 1; true; $i++) { $token = $stream->look(-$i); if ($token->test(Twig_Token::NAME_TYPE, ‘for’)) { $currentForLoop++; } else if ($token->test(Twig_Token::NAME_TYPE, ‘endfor’)) { $currentForLoop–; } } } catch (Exception $e) { } if ($currentForLoop < 1) { throw new Twig_Error_Syntax(‘Break tag is only allowed in ‘for’ loops.’, $stream->getCurrent()->getLine(), $stream->getSourceContext()->getName()); } return new BreakNode(); } public getTag() { return ‘break’; } }

  • AppBundle Twig BreakNode.php:

    namespace AppBundleTwig; class BreakNode extends Twig_Node { public compile(Twig_Compiler $compiler) { $compiler ->write(“break;n”) ; } }

Тогда вы можете просто использовать {% break %} чтобы выйти из петель, как это:

{% set var = [‘foo’, ‘bar’] %} {% for v in var %} {{ v }} {% break %} {% endfor %}

У меня нет достаточно времени, чтобы закодировать это, но вы могли бы написать continue заблокировать таким же образом.

Чтобы пойти еще дальше, вы можете справиться {% continue X %} а также {% break X %} выйти / продолжить несколько циклов, как в PHP.

Если кто-то хочет сделать это и поделиться им, не стесняйтесь редактировать мой ответ.

4

{% set break = false %} {% for value in array if not break %} {% if value == ‘something’ %} {% continue %} {% endif %} {% if value == ‘somethingElse’ %} {% set break = true %} {% endif %} {{ value }} {% endfor %}

1

Источник

sourse

Как правило, все шаблонизаторы похожи друг на друга и различаются только какими-то специфическими особенностями и деталями. Главная задача шаблонизаторов – разделить бизнес логику приложения и вывод данных на страницу, таким образом, позволив разработчикам и дизайнерам работать одновременно, не капая друг другу на мозги.

Многие PHP фрэймворки, включая: Zend Frameworkd, Agavi, CackPHP и CodeIgniter, по-своему реализуют разделение бизнес логики и вывод данных. Однако, если вы не любите фрэймворки или ваш проект слишком мал для их использования, то вы можете воспользоваться какой-то отдельной системой построения шаблонов. К счастью, нам есть из чего выбирать. Smartym Savant, Dwoo… этот список можно продолжать и продолжать, однако в этой статье я покажу вам, как работать с шаблонизатором Twig.

Установка

Существует множество способов установки Twig-a. Самый простой и быстрый – это скачивание компонента с GitHub, после чего архив необходимо распаковать, и перекинуть каталог lib в папку с нашим проектом.

Основы

Прежде чем приступить непосредственно к делу, давайте разберёмся с принципом работы шаблонизаторов. Обычное PHP приложение состоит из целого набора страниц, которые включают в себя как статический HTML код (меню, списки, изображения и т.д.), так и динамический контент (вывод данных из БД, xml файла, сервисы, …). С помощью Twig мы можем разделить данные процессы, создавая шаблоны со специальными маркерами, вместо которых в последствии будет вставляться динамический контент.

Значения для данных маркеров формируются в основном PHP скрипте; там же происходит общение с базой данных, xml парсинг и другие всевозможные операции. Таким образом, ваша страница будет строиться на основе 2х источников: шаблона с специальными вставками и PHP скриптов, где мы храним основной функционал. Это даёт возможность PHP разработчикам и дизайнерам одновременно работать над одними и теми же страницами.

Приступаем к делу

Для того чтобы посмотреть, как работает Twig, предлагаю рассмотреть простой пример:

<html> <></> <body> <h2>Account successfully created!</h2> <p>Hello {{ name }}</p> <p>Thank you for registering with us. Your account details are as follows: </p> <p style=”margin-left: 10px”> Username: {{ username }} <br/> Password: {{ password }} </p> <p>You’ve already been logged in, so go on in and have some fun!</p> </body> </html>

Сохраните данный файл templates/thanks.tmpl. Обратите внимание на то, что все маркеры, представляющие собой переменные, помещены в двойные фигурные скобки. Подобная запись подскажет Twig-у, где и как осуществлять вставку данных.

Затем, нам необходимо создать основной скрипт, где будет происходить формирование переменных и данных:

<?php // подгружаем и активируем авто-загрузчик Twig-а require_once ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { // указывае где хранятся шаблоны $loader = new Twig_Loader_Filesystem(‘templates’); // инициализируем Twig $twig = new Twig_Environment($loader); // подгружаем шаблон $template = $twig->loadTemplate(‘thanks.tmpl’); // передаём в шаблон переменные и значения // выводим сформированное содержание echo $template->render(array( ‘name’ => ‘Clark Kent’, ‘username’ => ‘ckent’, ‘password’ => ‘krypt0n1te’, )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

В результате, если вы откроете данную страницу в браузере, то увидите следующее:

Цикл if в twigs

Для использования Twig-а, вам нужно пройти следующие шаги:

  1. Инициализировать авто-загрузчик Twig-а, для того чтобы классы шаблонизатора подгружались автоматически.
  2. Инициализировать загрузчик шаблонов. В нашем случае эт Twig_Loader_FileSystem. В качестве аргумента передаём путь к каталогу с шаблонами.
  3. Создать объект самого Twig и передать ему уже сконфигурированные настройки.
  4. Подгрузить нужный нам шаблон с помощью метода loadTemplate, передав в него название используемого шаблона. В качестве результата метод вернёт экземпляр шаблона.
  5. Сформировать массив вида “ключ-значение”, где ключи – это названия переменных, а значения – данные, выводимые в шаблоне. Затем этот массив нужно передать в метод render(), который совместит шаблон с переданными данными и вернёт сгенерированный результат.

Условия

Twig также предоставляет нам возможность создавать условные выражения ‘if-else-endif’. Пример:

<html> <></> <body> <h2>Odd or Even</h2> {% if div == 0 %} {{ num }} is even. {% else %} {{ num }} is odd. {% endif %} </body> </html>

В зависимости от числа, которое генерируется в основном PHP скрипте, шаблон отобразит одно из двух сообщений. Вот и скрипт, где генерируется число от 0 до 30 и проверяется на чётность:

<?php include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘numbers.tmpl’); // генерируем случайное число // и проверяем его на чётность $num = rand (0,30); $div = ($num % 2); echo $template->render(array ( ‘num’ => $num, ‘div’ => $div )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

а вот и результат:

Также мы можем сделать многоуровневые проверки ‘if-elseif-else-endif’. Пример:

<html> <></> <body> <h2>Seasons</h2> {% if month > 0 and month <= 3 %} Spring is here, watch the flowers bloom! {% elseif month > 3 and month <= 6 %} Summer is here, to hit the beach! {% elseif month > 6 and month <= 9 %} Autumn is here, watch the leaves slowly fall! {% elseif month > 9 and month <= 12 %} Winter is here, to hit the slopes! {% endif %} </body> </html>

А вот и скрипт, где мы генерируем номер месяца и передаём его в шаблон:

<?php include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘seasons.tmpl’); // получаем номер месяца $month = (‘m’, mk()); echo $template->render(array ( ‘month’ => $month )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

А вот и вывод:

Циклы

Twig также поддерживает цикл ‘for’. Он очень удобен, если нам необходимо пройтись по массиву. Пример:

<html> <></> <body> <h2> list</h2> <ul> {% for item in items %} <li>{{ item }}</li> {% endfor %} </ul> </body> </html>

В данном примере у нас простой не ассоциативный массив. На каждой итерации мы будем получать по одному элементу и выводить его в элементе списка. Вот и скрипт:

<?php // формируем массив $items = array( ‘eye of newt’, ‘wing of bat’, ‘leg of frog’, ‘hair of beast’ ); include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘list.tmpl’); echo $template->render(array ( ‘items’ => $items )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

Результат:

Цикл if в twigs

Для того чтобы пройтись по ассоциативному массиву, мы можем обращаться к ключам через “точку”. Пример:

<?php // готовим ассоциативный массив $book = array( ‘title’ => ‘Harry Potter and the Deathly Hallows’, ” => ‘J. K. Rowling’, ‘publisher’ => ‘Scholastic’, ” => ‘Children’s fiction’, ‘pages’ => ‘784’ ); include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘book.tmpl’); echo $template->render(array ( ‘book’ => $book )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

Для того чтобы достучаться до значений массива в шаблоне, сначала пишем имя переменной, в которой хранится сам массив. Затем ставим точку и пишем название ключа, по которому достаём данные:

<html> <> <style type=”text/css”> table { border-collapse: collapse; } tr.ing { font-weight: bolder; } td { border: 1px solid black; padding: 0 0.5em; } </style> </> <body> <h2>Book details</h2> <table> <tr> <td><strong>Title</strong></td> <td>{{ book.title }}</td> </tr> <tr> <td><strong></strong></td> <td>{{ book. }}</td> </tr> <tr> <td><strong>Publisher</strong></td> <td>{{ book.publisher }}</td> </tr> <tr> <td><strong>Pages</strong></td> <td>{{ book.pages }}</td> </tr> <tr> <td><strong></strong></td> <td>{{ book. }}</td> </tr> </table> </body> </html>

Результат:

Цикл if в twigs

Такой же подход может быть применён для работы с объектами.

Дамп данных

Безусловно циклы вам пригодиться при выводе данных из БД. Пример:

<html> <> <style type=”text/css”> table { border-collapse: collapse; } tr.ing { font-weight: bolder; } td { border: 1px solid black; padding: 0 0.5em; } </style> </> <body> <h2>Countries and capitals</h2> <table> <tr class=”ing”> <td>Country</td> <td>Region</td> <td>Population</td> <td>Capital</td> <td>Language</td> </tr> {% for d in data %} <tr> <td>{{ d.name|escape }}</td> <td>{{ d.region|escape }}</td> <td>{{ d.population|escape }}</td> <td>{{ d.capital|escape }}</td> <td>{{ d.language|escape }}</td> </tr> {% endfor %} </table> </body> </html>

В следующем фрагменте кода я использую PDO подключение к MySQL базе данных ‘world’. Если вы хотите попробовать данный пример, то вам нужно сформировать базу самим:

<?php include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); // подключение к бд try { $dbh = new PDO(‘mysql:dbname=world;host=localhost’, ‘root’, ‘guessme’); } catch (PDOException $e) { echo “Error: Could not connect. ” . $e->getMessage(); } // установка error режима $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // выполняем запрос try { // формируем SELECT запрос // в результате каждая строка таблицы будет объектом $sql = “SELECT country.Code AS code, country.Name AS name, country.Region AS region, country.Population AS population, countrylanguage.Language AS language, city.Name AS capital FROM country, city, countrylanguage WHERE country.Code = city.CountryCode AND country.Capital = city.ID AND country.Code = countrylanguage.CountryCode AND countrylanguage.IsOfficial = ‘T’ ORDER BY population DESC LIMIT 0,20”; $sth = $dbh->query($sql); while ($row = $sth->fetchObject()) { $data[] = $row; } // закрываем соединение unset($dbh); $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘countries2.tmpl’); echo $template->render(array ( ‘data’ => $data )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

Тут стоит отметить несколько вещей:

Мы используем метод getchObject(), который вернёт нам строки из таблицы в виде объектов. Названия полей будут соответствовать названиям колонок. Затем эти объекты мы помещаем в массив и передаём его в шаблон. В шаблоне, используем цикл и выводим данные.

В данном примере также используется встроенный в Twig фильтр `escape`. По умолчанию данный фильтр пользуется функцией htmlspecialchars() для фильтровки данных. Это неплохая защита от XSS атак.

Подгрузка шаблонов

Также в Twig-е есть ещё одна команда – `include`, которая позволяет подключать содержание других шаблонов. Это может пригодиться, когда вы захотите прикрепить к вашим файлам меню, заголовок или подвал.

Для демонстрации представьте, что данный код – это главный шаблон:

<html> <> < rel=”stylesheet” type=”text/css” href=”main.css” /> </> <body> <div id=”page”> <div id=”er”> {% include ‘primary.tmpl’ %} </div> <div id=”left”> {% include ‘secondary.tmpl’ %} </div> <div id=”right”> This is the main page content. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </div> <div id=””> {% include ‘.tmpl’ %} </div> </div> </body> </html>

Все секции данной страницы находятся в отдельных файлах и подключаются сюда с помощью команды `include`. Давайте посмотрим, как выглядят подключаемые файлы:

<!– begin: primary.tmpl –> <table> <tr> {% for item in .primary %} <td><a href=”{{ item.url }}”>{{ item.name|upper }}</a></td> {% endfor %} </tr> </table> <!– end: primary.tmpl –> <!– begin: secondary.tmpl –> <ul> {% for item in .secondary %} <li><a href=”{{ item.url }}”>{{ item.name }}</a></li> {% endfor %} </ul> <!– end: secondary.tmpl –> <!– begin: .tmpl –> <div style=”align:center”> This page licensed under a Creative Commons License. Last upd on: {{ upd }}. </div> <!– end: .tmpl –>

А вот и главный PHP скрипт:

<?php // формируем массив $ = array( ‘primary’ => array( array(‘name’ => ‘Clothes’, ‘url’ => ‘/clothes’), array(‘name’ => ‘Shoes and Accessories’, ‘url’ => ‘/accessories’), array(‘name’ => ‘Toys and Gadgets’, ‘url’ => ‘/toys’), array(‘name’ => ‘Books and Movies’, ‘url’ => ‘/’), ), ‘secondary’ => array( array(‘name’ => ‘By Price’, ‘url’ => ‘/selector/v328ebs’), array(‘name’ => ‘By Brand’, ‘url’ => ‘/selector/gf843k2b’), array(‘name’ => ‘By Interest’, ‘url’ => ‘/selector/t31h393’), array(‘name’ => ‘By ation’, ‘url’ => ‘/selector/gf942hb’) ) ); include ‘Twig/Autoloader.php’; Twig_Autoloader::register(); try { $loader = new Twig_Loader_Filesystem(‘templates’); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate(‘shop.tmpl’); echo $template->render(array ( ” => $, ‘upd’ => ’24 Jan 2011′ )); } catch (Exception $e) { die (‘ERROR: ‘ . $e->getMessage()); } ?>

Обратите внимание, что нам не нужно загружать все шаблоны функцией loadTemplate. Главное подключить основной шаблон. Каждый мелкий под-шаблон загрузится автоматом. Переменные и значения, переданные в главный шаблон, будут доступны во всех подключаемых шаблонах.

Результат:

Цикл if в twigs

Фильтрация данных

В данной статье мы уже затронули тему фильтров. Давайте посмотрим, какие ещё возможности в данной сфере предоставляет нам Twig.

Давайте рассмотрим, к примеру, фильтр ”. Данный фильтр даёт нам возможность формировать дату и время, используя нативные для PHP маркеры. Пример:

<html> <></> <body> {{ “now”|(“d M Y h:i”) }} <br/> {{ “now”|(“d/m/y”) }} </body> </html>

Результат:

Также вы можете воспользоваться фильтрами `upper`, `lower`, `capitalize`, `title` для контроля заглавных и прописных букв:

<html> <></> <body> {{ “the cow jumped over the moon”|upper }} <br/> {{ “the cow jumped over the moon”|capitalize }} <br/> {{ “the cow jumped over the moon”|title }} <br/> {{ “The Cow jumped over the Moon”|lower }} <br/> </body> </html>

Результат:

Фильтр `strip` уберёт из текста все HTML и XML элементы:

<html> <></> <body> {{ “<div>I said “<b>Go away!</b>”</div>”|strip }} <br/> </body> </html>

Результат:

Фильтр `replace` позволяет быстро и просто заменять какие-то значения в строке на нужные нам. Пример:

<html> <></> <body> {{ “I want a red boat”|replace({“red” : “yellow”, “boat” : “sports car”}) }} <br/> </body> </html>

Результат:

Вы уже видели фильтр `escape` в действии. В Twig также есть фильтр, который делает абсолютно противоположное действие – `raw`. Его следует использовать только для html кода, который вы считаете 100% безопасным.

<html> <></> <body> Escaped output: {{ html|escape }} <br/> Raw output: {{ html|raw }} <br/> </body> </html>

Если же вам нужно применить `escape` к большому блоку кода, то вы можете воспользоваться синтаксисом `autoescape`, передав булево значение true/false для активации и дезактивации фильтрации `escape`. Пример:

<html> <></> <body> {% autoescape true %} Escaped output: {{ html }} <br/> {% endautoescape %} {% autoescape false %} Raw output: {{ html }} {% endautoescape %} </body> </html>

Теперь вы уже больше знаете о Twig-e и можете использовать условия, циклы и фильтры.

Источник

Читайте также:  Блок стих цикл о прекрасной даме