Twig шаблонизатор

Прошлый раз статья про Twig была в «Экспериментах и исследования», с тех пор все, что было нужно, исследовали, и эксперимент успешно завершен. По итогу можно отметить такие плюсы использования Twig:

  • мощный шаблонизатор с кучей возможностей из коробки (при этом разработчик может добавить недостающий функционал несколькими способами) и подробной документацией;
  • дополнительная безопасность за счет того, что Twig по умолчанию экранирует весь вывод, а подсунуть со стороны пользователя тэги MODX не получится, так как шаблонизатору они глубоко безразличны;
  • все работает ровно так, как написано в шаблоне, не нужно вникать, что на каком этапе парсится;
  • шаблоны хранятся в файлах, а значит можно использовать GIT и полноценные редакторы, в которых предусмотрена подсветка синтаксиса Twig;
  • отпадает необходимость создавать в админке чанки и мелкие сниппеты; при желании можно легко подменять шаблоны в зависимости от каких-то параметров документа;
  • в два счета можно сменить дизайн прямо на работающем сайте;
  • полученный опыт пригодится в любой системе, использующей шаблонизатор (не обязательно Twig, но принципы работы у всех схожи), пусть даже MODX Revo;
  • вся суета, происходящая в парсере Evo, просто пройдет мимо вас (:

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

Установка

Можно глянуть видео: www.youtube.com/watch?v=lVI1dCR1-VM
Для установки необходимо наличие Composer. Для чего он нужен и как его установить — на эту тему немало статей в интернете. В OpenServer он уже установлен.

Открываем консоль, переходим в корень сайта и выполняем команду:

  composer require pathologic/evo-twig  

По этой команде Composer загрузит все необходимое и подготовит автозагрузчик классов:
Twig шаблонизатор

Если Composer отработал успешно, то дальше нужно установить компонент EvoTwig. Взять его можно здесь: github.com/pathologic/evotwig

Компонент состоит из двух плагинов и сниппета.

Плагин replaceTemplateTwig, собственно, реализует интеграцию.

Плагин cacheDocumentObject кэширует данные страниц. Так как при полноценном использовании Twig кэширование страниц чаще всего отключается, то было бы неплохо не дергать каждый раз базу для вывода страниц, что и делает этот плагин. Этот плагин в списке событий должен обязательно быть перед плагином replaceTemplateTwig, иначе работать не будет.

Сниппет getCache позволяет кэшировать вывод сниппетов, по ключу или на определенное время. Часто бывает нужно. Параметры этого сниппета:


  • snippetName — имя сниппета для запуска, необязательный параметр;
  • key — ключ кэша, обязательный параметр;
  • lifetime — время жизни кэша в секундах, если нужно кэшировать на время, необязательный параметр;
  • keyGenerator — имя сниппета или функция для генерации ключа, необязательный параметр.

Настройка

Все настраивается в свойствах плагина replaceTemplateTwig:

  • Debug — включает режим отладки. При этом отключается кэширование страниц MODX, а в шаблонах Twig появляется возможность использовать функцию dump для вывода значений переменных.
  • MODX cache — разрешает кэширование MODX. Если включить при использовании Twig-шаблонов, то сайт станет почти статическим, поэтому по умолчанию отключено.
  • Disable Twig for templates — отключает Twig для шаблонов (: Но при этом остается возможность использовать Twig в чанках, загружать шаблоны (уже просто MODX-шаблоны) из файлов, а также кэшировать все, что под руку попадет.
  • Conditional — не очень понятная настройка, включение которой приведет к тому, что MODX будет отдавать при необходимости заголовки Last-modified и Etag.

  • Templates Folder — папка, в которой хранятся файлы шаблонов.
  • Templates Folder for Developers — то же самое, что и Templates Folder,
    но использоваться она будет, когда пользователь залогинен в админке. Пригодится при редактировании шаблонов на живом сайте — скопировали шаблоны в эту папку, отредактировали и после одобрения залили в основную папку.
  • Template extension — расширение у файла с шаблоном. По умолчанию tpl, потому что мне нравится так, но вообще принято вроде как .tpl.html или .html.
  • Cacher — здесь можно выбрать, каким образом кэшировать данные. По умолчанию используется файловая система. Бездумные эксперименты с этой настройкой могут закончиться крахом сайта (:
  • Allowed functions — здесь можно указать, какие PHP-функции разрешено использовать в шаблонах Twig.

Шаблоны

Как уже говорилось, шаблоны хранятся в файлах и могут быть загружены разными способами:

  • файл выбирается в зависимости от шаблона документа и id документа. Для шаблона 2 и id 4 имя файла будет: tpl-2_doc-4.tpl;
  • файл выбирается в зависимости от id документа. Для id 4 имя файла будет: doc-4.tpl;
  • файл выбирается в зависимости от шаблона документа. Для шаблона 2 имя файла будет: tpl-2.tpl.

Очевидно, что такой подход во многих случаях неудобен. Поэтому файлы можно называть произвольно, а в содержимом шаблона в админке писать: @FILE:main.tpl, @FILE:article.tpl и т.п. Для документа с шаблоном _blank такой вызов можно написать прямо в содержимом документа.

Если файл шаблона не найден, то будет использоваться парсер MODX.

Теперь можно перейти к тому, что в этих шаблонах писать. Как и MODX, Twig использует несколько конструкций для вывода данных:


  • переменные — {{ var_name }}
  • функции — {{ function_name() }}
  • фильтры — {{ var_name | striptags | nl2br }}
  • управляющие элементы (теги) — {% if var_name == ‘foo’ %}{{ var_name }}{% endif %}

{% %} — такими скобками обозначаются условия, циклы и другие управляющие элементы шаблонизатора, а такие скобки {{ }} используются для вывода.

Разницу между MODX и Twig можно изобразить примерно так:

MODX Twig
[*pagetitle*] {{ resource.pagetitle }}
[+placeholder+] {{ plh.placeholder }}
{{ data.placeholder }} (при обработке чанков DLTemplate)
{{ modx.getPlaceholder(‘placeholder’) }}
[(site_name)] {{ config.site_name }}
[!snippet? &foo=`bar`!]
{{ runSnippet(‘snippet’, {foo:’bar’}) }}
{{chunkname}} {{ getChunk(‘chunkname’) }}
{% include ‘chunks/chunkname.tpl’ %}

А вот ссылки на страницы можно использовать по-прежнему в стиле MODX: [~3~], то же самое относится и к служебным тегам [^qt^], [^q^], [^p^], [^t^], [^s^], [^m^].

Важное отличие от MODX — в шаблоне Twig переменная может быть чем угодно, не только строкой, а задать переменную можно прямо в шаблоне (в MODX это возможно только с помощью плагинов или сниппетов, которые устанавливают глобальные плейсхолдеры).

Все это подробно изложено в документации, поэтому остановлюсь на особенностях интеграции в Evo.

Переменные

В шаблонах страниц можно использовать переменные:

  • modx — тут понятно и так, объект DocumentParser, соответственно можно использовать все api-функции;
  • documentObject — массив $modx->documentObject, в котором содержится вся информация о документе;
  • resource — упрощенный вариант documentObject, в котором все поля хранятся в виде ключ-значение, включая и tv (resource.pagetitle, resource.longtitle, resource.price, resource[‘product-color’] — это есть в документации Twig, но еще раз обратите внимание, как происходит обращение к массиву);
  • debug — значение соответствующей настройки плагина;
  • config — массив настроек MODX;
  • plh — массив глобальных плейсхолдеров, которые задаются методом setPlaceholder;
  • ajax — по значению этой переменной можно определить был ли ajax-запрос к текущей странице (проверяется заголовок HTTP_X_REQUESTED_WITH);
  • _GET, _POST, _COOKIE, _SESSION — соответствующие массивы.

Для использования Twig в чанках нужно, для начала, чтобы эти чанки обрабатывались классом DLTemplate. То есть такая возможность есть, как минимум, в DocLister, FormLister и их производных. Чтобы применить к чанку Twig, к префиксу этого чанка нужно дописать T_:

  &tpl=`@T_FILE:chunks/product` //загрузит из файла, обратите внимание, что имя файла без расширения; папка с файлами и расширение задаются отдельно  &tpl=`@T_CHUNK:product` //использует обычный MODX-чанк  &tpl=`@T_CODE:<p>{{ data.pagetitle }}</p><img src="{{ data['tv.image'] }}">` //почему-то работает и такое  

Какие переменные использовать в чанках, зависит от сниппетов, в которых эти чанки обрабатываются. В первую очередь переменные modx и data.
В DocLister добавится переменная DocLister c объектом контроллера.
В FormLister — аналогичная переменная FormLister, а также errors (массив с данными об ошибках), messages (массив сообщений контроллера), plh (массив плейсхолдеров формы).

Расширения Twig

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

Фильтр modxParser

Обрабатывает строку парсером MODX.

  {{ resource.content | modxParser }}  {{ '[*pagetitle*]' | modxParser }}  
Фильтр plural

Предназначен для вывода существительных после числительных. Например, такой код выведет «Осталось 11 часов»:

{{ ['Остался %d час', 'Осталось %d часа', 'Осталось %d часов']|plural(11) }}

А такой — «Осталось 2 часа»:

{{ ['Остался %d час', 'Осталось %d часа', 'Осталось %d часов']|plural(2) }}
Функция makeUrl

Генерирует ссылку на документ. Принимает три аргумента:


  • id документа,
  • массив параметров ссылки,
  • флаг типа ссылки, true — если нужно построить абсолютную ссылку, false — относительную (по умолчанию — true).
  {{ makeUrl(2) }}  {{ makeUrl(2, {foo: 'bar'}) }}  {{ makeUrl(2, {}, true) }}  {{ makeUrl(2, {bar: 'foo'}, false) }}  
Функция runSnippet

Запускает сниппет. Аргументами являются имя сниппета и массив параметров.

Функции getChunk, parseChunk

Вывод чанка и вывод чанка с обработкой. В первом случае функции передается имя чанка, во втором — имя чанка и массив параметров. В обоих случаях используется класс DLTemplate.

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

В общем-то добавлять собственные фильтры и функции в Twig несложно, описанные выше расширения простые и их можно использовать как пример. Для добавления расширений лучше всего создать плагин на события OnManagerPageInit, OnWebPageInit, OnPageNotFound и вызывать его после плагина replaceTemplateTwig.

На этом вводная часть закончена, вышеизложенного достаточно для старта, главное не лениться читать документацию. В следующих частях я возьму готовую верстку и покажу как я использую Twig на практике и почему больше не вернусь к парсеру MODX (:

modx.im


Твиг — современный шаблонизатор для PHP

Twig как шаблонизатор по синтаксису чем-то похож на Smarty и не уступает в гибкости XSLT

Основные его особенности:

  • Быстрый: компилирует шаблоны в PHP код. Добавочный, относительно нативного PHP, код был сведен к минимуму.
  • Безопасный:  есть режим «песочницы» для проверки сомнительного кода в шаблонах. Это позволяет использовать Twig в качестве языка шаблонов для приложений, где пользователи могут менять дизайн шаблонов.
  • Гибкий: основан на пластичном лексере и парсере. Это позволяет разработчику определять свои собственные тэги и фильтры, создавать свой DSL.

Зачем нужен еще один шаблонизатор?

Twig использует гибко настраиваемые лексический и грамматический анализаторы. Это позволяет разработчику определять свои теги и фильтры, создавать собственный DSL.

  1. Краткость: Язык PHP многословен и даже слишком многословен, когда нужно экранировать вывод данных:
      echo $var;  echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8');

  2. Twig имеет более лаконичный синтаксис, который позволяет легко читать шаблоны:

      {{ var }}  {{ var|escape }}  {{ var|e }} {# сокращение для escape #}
  3. Ориентированный на шаблоны синтаксис: Twig имеет сокращения для многих общих паттернов, например, отображение текста по умолчанию, если вы перебираете пустой массив:
      {% for user in users %}  	* {{ user.name }}  {% else %}  	Пользователи не найдены.  {% endfor %}  
  4. Полнофункциональный: поддерживает все, что необходимо для использования шаблонов: множественное наследование, блоки, автоматическое экранирование и многое другое:
      {% extends "layout.html" %}    {% block content %}  	Содержимое страницы...  {% endblock %}  
  5. Легок в изучении: Синтаксис прост в изучении и оптимален для верстальщиков, что позволяет им быстро выполнять свою работу.

Конечно, для PHP написано большое число шаблонизаторов. Но большинство из них написаны под PHP4 и не используют лучшие практики разработки:

  1. Расширяемость: Твиг это гибкий движок для любых ваших потребностей, даже самых сложных. Благодаря открытой архитектуре, вы можете определять новые языковые конструкции (тэги и фильтры) для создания своего собственного DSL.
  2. Юнит-тестирование: Твиг полностью покрыт тестами. Библиотека стабильна и готова к использованию в больших проектах.
  3. Документация: Tвиг полностью документирован, вся документация доступна на сайте, и, конечно, имеет полное описание API.
  4. Безопасность: В отношении безопасности, имеется несколько совершенно уникальных особенностей:
    1. Автоматическое экранирование вывода: Для безопасного вывода данных, вы можете включить экранирование как глобально, так и для отдельных блоков:
        {% autoescape on %}  {% var %}  {% var|safe %} {# var не экранируется #}  {% var|escape %} {# var не экранируется дважды #}  {% endautoescape %}
    2. Песочница: Twig позволяет использовать для любого шаблона "песочницу", где пользователи имеют ограниченный набор тэгов, фильтров и методов объектов, определенных разработчиком. Режим "песочницы" может быть включен как глобально, так и локально, для определенных шаблонов:
        {{ include "user.html" sandboxed }}
  5. Чистые сообщения об ошибках: Каждый раз, когда у вас возникают синтаксические ошибки в шаблоне, шаблонизатор выводит сообщение о имени файла с ошибкой и номере строки, которая ее вызвала. Это очень упрощает отладку.
  6. Быстрый: Одна из целей создания данного шаблонизатора — сделать его настолько быстрым, насколько это возможно. Для достижения максимальной скорости работы, Twig компилирует шаблоны в оптимизированный PHP код. Использование памяти по сравнению с обычным PHP кодом сведено к минимуму.

Кто создал Twig?

Twig написан Fabien Potencier, создателем фреймворка Symfony и распространяется по новой лицензии BSD.

x-twig.ru

Установка

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

Основы

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

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

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

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

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

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

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

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

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

Условия

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

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

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

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

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

А вот и вывод:

Циклы

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

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

Результат:

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

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

Результат:

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

Дамп данных

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

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

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

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

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

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

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

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

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

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

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

Результат:

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

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

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

Результат:

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

Результат:

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

Результат:

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

Результат:

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

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

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

lred.ru

Today’s:
Продакшн сервера на Fornex

  • Linux Смена пользователя в консоли (терминал) — Как зайти под пользователем (перелогиниться)
  • git check-ignore Список игнорируемых файлов по .gitignore — команда вывода. Проверить какие папки игнорируются, а какие не
  • telegram Как ответить на сообщение — как цитировать/ переслать сообщение
  • .gitignore Пример файла — как исключать из репозитория (контроля версий) файлы и папки
  • python Число элементов в списке ("массиве") — длина списка — len — как узнать
  • Деплой — что это в программировании (deploy)
  • python super — Метод super() в Python
  • [!] LaTeX СПРАВОЧНИК — Примеры символов, кода, обозначений и команд [латекс, латех]
  • latex Cистема уравнений. Фигурная скобка — пример команд
  • [!] Паскаль — Онлайн Учебник для начинающих изучать программирование с нуля. Справочник. Примеры кода. [Pascal]
  • telegram Сделать админом в группе (чате) — как дать права
  • pgAdmin 4 — создать подключение — Create new server
  • linux Перенос строки в одной команде (терминал, консоль) — как это сделать
  • linux Как подключиться по SSH к компьютеру (серверу) по сети (через командную строку, терминал)
  • Mysql JOIN, LEFT JOIN, RIGHT JOIN — отличия — какая разница. Виды джойнов
  • latex Texmaker Файл с логом не найден — Ошибка — что делать
  • mysql Добавить столбец пример — ALTER TABLE ADD — пример sql
  • Ошибка 404 SimpleMVC
  • linux Удалить все файлы в данной директории — рекурсивно и нереукрсивно. В том числе скрытые
  • latex Больше или равно Меньше или равно — команды, "как выводится" (с прямой и обычной чертой равенства)
  • #3 Типы данных в языке Pascal. Объявление переменных. Целые числа integer. Оператор присваивания. Инициализация в Паскаль
  • telegram Как отправить сообщение "самому себе"
  • latex Жирный шрифт — пример команды
  • отзывы о фкн вгу и гугу
  • Latex размер шрифта текста
  • php Два знака вопроса что это ?? — Null-коалесцентный оператор
  • mysql LIMIT OFFSET синтаксис. Примеры sql запросов
  • "Черта над" символом — что означает в математике. Значения
  • Представление кириллицы в UTF-8 — русские символы — таблица
  • linux Как скопировать папку с содержимым в другую папку/директорию — пример команд

fkn.ktu10.com

Особенности Twig

  • феноменально быстрая скорость работы (в сравнении с другими шаблонизаторами)
  • компиляция шаблонов в хорошо оптимизированный PHP код
  • применение “наследования” (можно определить базовый и дочерние шаблоны)
  • позволяет создавать и использовать макросы

Установка

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

Структура проекта

Ну а теперь давайте приступим к делу и рассмотрим структуру нашего небольшого проекта:

  • compilation_cache
  • lib
    • Twig
  • templates
    • base.html
    • books.html
  • index.php

Весь функционал, связанный с подключением и настройкой Twig-а, содержится в файле index.php.

В папке templates мы будем хранить файлы шаблонов. В нашем случае, этих файлов 2: base.html с базовым html кодом и books.html с выводом списка книг.

В каталоге compilation_cache будут помещаться PHP файлы, созданные Twig-ом для работы.

Подключение и базовая конфигурация Twig-a

Итак, первое что нам необходимо сделать, так это подключить Twig:

После этого сообщаем шаблонизатору, где у нас хранятся файлы шаблонов. В качестве аргумента передаём путь к каталогу templates:

Затем создаём объект шаблонизатора и указываем ещё несколько опций:

Параметру cache передаём путь к каталогу compilation_cache. Активируем опцию auto_reload, для того чтобы при обновлении страницы Twig заново обрабатывал шаблоны, и мы видели изменения. Если этого не сделать, то шаблонизатор просто закэширует страницы. Когда же работа над проектом будет завершена, эту опцию можно убрать, чтобы ваши страницы закэшировались и грузились ещё быстрее.

Данные

Для реализации нашего небольшого примера, возьмём список книг и сформируем массив вида ключ — значение:

Загрузка файла и передача данных

Для того чтобы передать данные в какой-то шаблон и вывести html результат, нам необходимо воспользоваться методом render(); В качестве первого аргумента передаём название файла шаблона, который будем выводить. В качестве второго -массив вида ключ — значение. В дальнейшем по заданным ключам мы будем получать доступ к нашим данным в самих шаблонах.

index.php

Общий вид файла index.php

Настройка базового шаблона

Базовый шаблон представляет собой обычный html документ со специальными вставками:

В нашем главном шаблоне мы прописываем 2 блока: title и content. Названия блоков выбираем сами.

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

Настройка шаблона вывода книг

Для начала в дочернем шаблоне нам необходимо указать шаблон родителя:

Далее в блок title запишем название дочерней страницы, которая обработается Twig-ом и вставится между тегами title в базовом шаблоне:

Затем, пишем содержание, которое внедрится в блок под названием content в базовом шаблоне:

Тут же в цикле for (Twig for) мы проходимся по всем книгам, которые передали в данный шаблон с помощью записи $twig->render('books.html', array('books' => $books)); и для извлечения значений обращаемся к элементам массива по ключам: {{book.number}}, {{book.title}} и так далее.

Таким образом, после срабатывания метода $twig->render('books.html', array('books' => $books)), Twig подгрузит шаблон books.html и сформирует html содержание. Далее он распознает, что books.html — это дочерний шаблон base.html, и поместит сформированное содержание в базовый шаблон. После всего этого Twig вернёт нам полноценную html страницу.

Итог

Пример работы данного скрипта вы можете посмотреть в demo или скачать архив с готовым примером.

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

ruseller.com

Шаблоны Bitrix — мощнейший инструмент кастомизации вашего сайта. Однако, подход, выбранный Bitrix сильно отличается от принятого в современных фреймворках. Но мало кто знает (а еще меньше используют), что Bitrix позволяет использовать шаблонизаторы в шаблонах компонентов (да-да, шаблон сайта придется писать по-старому). Сегодня мы рассмотрим один из простейших вариантов работы.

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

Для нашего небольшого эксперимента нам потребуется веб-сервер с PHP на борту (я использую OpenServer), Composer в качестве пакетного менеджера и минимальные навыки работы в консоли.

Установка Composer тривиальна. Идем на сайт https://getcomposer.org/, переходим в раздел Download и следуем простым инструкциям. Для пользователей Windows все сводится к скачиванию и установке Composer-Setup.exe и последовательному копипасту четырех команд в консоль:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfb50076874187bd9f21f65d8991d46ec5cc90518f447387fb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Для более удобной работы с Composer, я создам bat-файл:

touch composer.bat

…и помещу в него вызов composer.phar:

@php "%~dp0composer.phar" %*

Теперь вместо длинной записи «php composer.phar» можно будет использовать сокращенную «composer».

Дальше нам необходимо задать некоторые настройки Composer. Дело в том, что по умолчанию, все пакеты зависимостей будут установлены в директорию /vendor. Мне это не нравится. Все дополнительные библиотеки я хочу видеть в папке /local/php_interface/lib/ и подключать их в init.php.

К счастью, пакетный менеджер позволяет легко это настроить. Создадим в корне сайта файл composer.json:

touch composer.json

И зададим нужную нам директорию таким вот образом:

{   "config": {   "vendor-dir": "local/php_interface/lib"   }  }

Теперь можно выполнить команду добавления зависимости Twig в проект и произвести установку:

composer require twig/twig

Готово. После завершения установки в директории local/php_interface/lib/ должны появиться папки composer, twig и файл autoload.php.
Структура composer Autoload.php необходимо подключить в init.php для работы всех установленных с помощью composer пакетов:

<?php  if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/lib/autoload.php'))          require_once $_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/lib/autoload.php';  

Теперь напишем обработчик. Для начала опишем в глобальной переменной $arCustomTemplateEngines список расширений и функцию-обработчик.

global $arCustomTemplateEngines;   $arCustomTemplateEngines['twig'] = array(      'templateExt' => array(          'twig',      ),      'function'    => 'renderTwig'  );  

Ну и опишем саму функцию-обработчик (в том же init.php). Функция принимает в себя все данные, с которыми работает шаблон. Из интересного тут: задание папки хранения кеша и его сброс при нажатии на Битриксовскую кнопку «Сбросить кеш». Остальное тривиально и описано в Basic API Usage на сайте Twig.

function renderTwig(      $templateFile,      $arResult,      $arParams,      $arLangMessages,      $templateFolder,      $parentTemplateFolder,      $template  )  {      $loader = new Twig_Loader_Filesystem($_SERVER['DOCUMENT_ROOT']);      $twig = new Twig_Environment($loader, array(          'cache' => '/bitrix/cache/twig/',          'auto_reload' => isset( $_GET[ 'clear_cache' ] ) && strtoupper($_GET[ 'clear_cache' ]) == 'Y',      ));      echo $twig->render(          $templateFile,          array(              'arResult' => $arResult,              'arParams' => $arParams,              'arLangMessages' => $arLangMessages,              'template' => $template,              'templateFolder' => $templateFolder,              'parentTemplateFolder' => $parentTemplateFolder,          )      );  }  

Давайте начнем экспериментировать. Добавим на тестовую страницу компонент списка новостей и настроим на вывод какого-нибудь инфоблока:

<?require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php')?>  <?$APPLICATION->IncludeComponent(  "bitrix:news.list",  ".default",  array(  "COMPONENT_TEMPLATE" => ".default",  "IBLOCK_TYPE" => "portfolio",  "IBLOCK_ID" => "2",  "NEWS_COUNT" => "10",  "SORT_BY1" => "ACTIVE_FROM",  "SORT_ORDER1" => "DESC",  "SORT_BY2" => "SORT",  "SORT_ORDER2" => "ASC",  "FILTER_NAME" => "",  "FIELD_CODE" => array(  0 => "",  ),  "PROPERTY_CODE" => array(  0 => "",  ),  "CHECK_DATES" => "Y",  "DETAIL_URL" => "",  "AJAX_MODE" => "N",  "AJAX_OPTION_JUMP" => "N",  "AJAX_OPTION_STYLE" => "Y",   "AJAX_OPTION_HISTORY" => "N",  "AJAX_OPTION_ADDITIONAL" => "",  "CACHE_TYPE" => "A",  "CACHE_TIME" => "36000000",  "CACHE_FILTER" => "N",  "CACHE_GROUPS" => "Y",  "PREVIEW_TRUNCATE_LEN" => "",  "ACTIVE_DATE_FORMAT" => "d.m.Y",  "SET_TITLE" => "Y",  "SET_BROWSER_TITLE" => "Y",  "SET_META_KEYWORDS" => "Y",  "SET_META_DESCRIPTION" => "Y",  "SET_LAST_MODIFIED" => "N",  "INCLUDE_IBLOCK_INTO_CHAIN" => "Y",  "ADD_SECTIONS_CHAIN" => "Y",  "HIDE_LINK_WHEN_NO_DETAIL" => "N",  "PARENT_SECTION" => "",  "PARENT_SECTION_CODE" => "",  "INCLUDE_SUBSECTIONS" => "Y",  "DISPLAY_DATE" => "Y",  "DISPLAY_NAME" => "Y",  "DISPLAY_PICTURE" => "Y",  "DISPLAY_PREVIEW_TEXT" => "Y",  "PAGER_TEMPLATE" => ".default",  "DISPLAY_TOP_PAGER" => "N",  "DISPLAY_BOTTOM_PAGER" => "Y",  "PAGER_TITLE" => "Новости",  "PAGER_SHOW_ALWAYS" => "N",  "PAGER_DESC_NUMBERING" => "N",  "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",  "PAGER_SHOW_ALL" => "N",  "PAGER_BASE_LINK_ENABLE" => "N",  "SET_STATUS_404" => "N",  "SHOW_404" => "N",  "MESSAGE_404" => ""  ),  false  );  ?>    <?require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php')?>

Скопируем дефолтный шаблон и назовем его twig_test
Копирование шаблона компонента Вот наша структура шаблона:
Структура шаблона Смотрим, любуемся, а теперь берем и удаляем файл template.php. Вместо него создаем файл template.twig. Вот код файла template.twig целиком:

{% for item in arResult.ITEMS %}       <div class="text_block">           <h2><               <a href="{{ item.DETAIL_PAGE_URL }}">{{ item.NAME }}</a>           </h2>           < img alt="{{ item.PREVIEW_PICTURE.ALT }}" src="{{ item.PREVIEW_PICTURE.SRC }}">       </div>   {% endfor %}

Судя по моим наблюдениям, twig с включенным кешированием не уступает в скорости шаблонам Bitrix с включенным композитом. Цифры примерно такие.

Шаблоны Bitrix + Кеш + Композит:
Скорость в композитном режиме Twig + Кеш:
Скорость с кешированием twig Как итог: шаблонизаторы в Bitrix использовать можно. Как минимум, это избавит разработчиков от вредной привычки получать данные в шаблоне компонента.

ydmitry.ru

Why yet another template engine?

When it comes to template engines in PHP, many people will tell you that PHP itself is a template engine. But even if PHP started its life as a template language, it did not evolve like one in the recent years. As a matter of fact, it doesn’t support many features modern template engines should have nowadays:

  • Concise: The PHP language is verbose and becomes ridiculously verbose when it comes to output escaping:

    In comparison, Twig has a very concise syntax, which make templates more readable:

  • Template oriented syntax: Twig has shortcuts for common patterns, like having a default text displayed when you iterate over an empty array:

  • Full Featured: Twig supports everything you need to build powerful templates with ease: multiple inheritance, blocks, automatic output-escaping, and much more:

  • Easy to learn: The syntax is easy to learn and has been optimized to allow web designers to get their job done fast without getting in their way.

Of course, PHP is also the language for which you can find the more template engine projects. But most of them do not embrace web development best practices yet:

  • Extensibility: Twig is flexible enough for all your needs, even the most complex ones. Thanks to an open architecture, you can implement your own language constructs (tags, filters, functions, and even operators) to create your very own DSL.

  • Unit tested: Twig is fully unit-tested. The library is stable and ready to be used in large projects.

  • Documented: Twig is fully documented, with a dedicated online book, and of course a full API documentation.

  • Secure: When it comes to security, Twig has some unique features:

    • Automatic output escaping: To be on the safe side, you can enable automatic output escaping globally or for a block of code:

    • Sandboxing: Twig can evaluate any template in a sandbox environment where the user has access to a limited set of tags, filters, and object methods defined by the developer. Sandboxing can be enabled globally or locally for just some templates:

  • Clean Error Messages: Whenever you have a syntax problem within a template, Twig outputs a helpful message with the filename and the line number where the problem occurred. It eases the debugging a lot.

  • Fast: One of the goals of Twig is to be as fast as possible. To achieve the best speed possible, Twig compiles templates down to plain optimized PHP code. The overhead compared to regular PHP code was reduced to the very minimum.

Who is behind Twig?

Twig is brought to you by Fabien Potencier, the creator of the Symfony framework. Twig is released under the new BSD license.

twig.symfony.com

Это — документация по Twig, гибкому, быстрому и надежному шаблонизатору для PHP.
Если у вас есть некая склонность к другим тексто-ориентированным языкам шаблонов, вроде Smarty, Django или Jinja, с Twig вы почувствуете себя как дома. Он ориентирован как на программистов, так и на дизайнеров благодаря использованию принципов PHP и добавочному функционалу для разработки шаблонов.

Основные особенности состоят в следующем:

  • Быстрый: Twig компилирует шаблоны для простого и ясного PHP кода. Добавочный, относительно нативного PHP, код был сведен к минимуму.
  • Безопасный: у Twig есть режим «песочницы» для проверки сомнительного кода в шаблонах. Это позволяет использовать Twig в качестве языка шаблонов для приложений, где пользователи могут менять дизайн шаблонов.
  • Гибкий: Twig основан на пластичном лексере и парсере. Это позволяет разработчику определять свои собственные тэги и фильтры, создавать свой DSL.

Требования
Twig для запуска необходим как минимум PHP 5.2.4

Установка
Есть несколько вариантов установки Twig. Если вы не знаете, с чего начать, скачайте архив.

Релиз из архива
1.Скачайте наиболее актуальный архив со страницы закачек
2.Распакуйте его
3.Переместите файлы куда-нибудь в свой проект

Установка разрабатываемой версии
1.Скачайте Subversion или Git
2.Для Subversion: svn co http://svn.twig-project.org/trunk/ twig
Для Git: git clone git://github.com/fabpot/Twig.git

Установка пакета PEAR
1.Установите PEAR
2.pear channel-discover pear.twig-project.org
3.pear install twig/Twig (или pear install twig/Twig-beta)

Основное использование API
Этот раздел даст вам основное представление о PHP API для Twig
Первый шаг к использованию Twig — зарегистрировать его автозагрузчик:

Замените путь /path/to/lib/ на тот, который вы использовали при установке Twig
Twig придерживается стандартов кодирования PEAR для классов, это означает, что вы можете легко интегрировать загрузку классов Twig в свой автозагрузчик.

Twig использует загрузчик (Twig_Loader_String) для нахождения шаблонов и среду разработки (Twig_Environment) для хранения настроек.
Метод loadTemplate() использует загрузчик для нахождения и загрузки шаблонов и возвращает объект шаблона (Twig_Template), который подходит для рендеринга методом display().
В состав Twig также входит загрузчик файловой системы:

Оригинал лежит тут: http://www.twig-project.org/doc/intro.html

olesya-lara.livejournal.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector