Oтзывы и предложения для Next Generation CMS
Идет загрузка

Введение в TWIG

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

40.jpg (19.33 Kb)

Итак, первый вопрос - ЗАЧЕМ?
У существующего шаблонизатора есть несколько серьёзных проблем, а именно:

  • работа с шаблонами как с обычным текстом (невозможно отделить переменные от элементов дизайна)
  • а это значит, что при каждой генерации страницы шаблонизатору приходится выполнять 200-600 символьных замен текста и около 100-200 замен текста при использовании регулярных выражений. итого - низкая производительность
  • работа в интерпретирующем режиме - обработка любого шаблона каждый раз требует достаточно много времени
  • каскадная обработка переменных - из-за использования функций символьной замены в шаблонизаторе возможны обработки переменных внутри переменных. например, попробуйте в текст новости добавить {mainblock} и можете увидеть (а можете и не получить) сюрприз (зависит от массы факторов)
  • отсутствие условных блоков, они заменяются регулярными выражениями (работают медленно, на очень длинных массивах данных возможно катастрофическое падение производительности), возможность отработки только тех условий, которые жестко внесены в код ядра/плагина
  • отсутствие циклов, для повторяющихся (даже крайне примитивных) действий требуется создавать новый шаблон

Преимущества TWIG'а:
  • компилирующий режим - первая генерация шаблона (после изменения текста шаблона) занимает относительно много времени, но все последующие генерации работают в сотни раз быстрее существующего шаблонизатора
  • модульный режим - медленный модуль компиляции (выполняемый редко) и очень быстрый модуль отображения (выполняется при каждом отображении шаблона)
  • чёткое разделение текста и переменных в шаблоне - а это значит, что у нас не будет проблем с множественной обработкой шаблона
  • наличие условных блоков и возможность создавать сложные условия. главное, чтобы нужные флаги были выставлены в коде ядра/плагине
  • наличие циклов - простые повторяющиеся действия можно сделать внутри шаблона

А всё же?
Действительно, полный функционал TWIG'а подавляет - это свой собственный мир, свой язык.
Но... возьмём, к примеру, есть среди нас хоть кто-то, кто использовал более 60% возможностей современного телевизора? Сильно сомневаюсь.
И при этом телевизором пользуются многие... думаю, аналогия ясна.

Практика - отличия для дизайнера
1) Формат переменных.
Старая запись: {variableName}
Новая запись: {{ variableName }}

2) Условные блоки.
Старая запись: [if-logged] тут_текст [/if-logged]
Новая запись: {% if (user.flags.logged) %} тут_текст {% endif %}

3) Простые циклы.
Старая запись:
* основной шаблон: {entries}
* дополнительный шаблон: имя: {name}, записей: {count} <br/>

Новая запись:
{% for entry in entries %}
имя {{ entry.name }}, записей: {{ entry.count }} <br/>
{% endfor %}

4) Отображение блока в случае, если активен конкретный плагин (например, xfields):
Старая запись: [isplugin xfields]...[/isplugin]
Новая запись: {% if pluginIsActive('xfields') %}...{% endif %}

Практика - новые возможности для дизайнера
Благодаря наличию глобальных переменных, появляется возможность использовать некоторую информацию абсолютно во всех шаблонах.
Давайте придумывать примеры:
1. Выводим логин пользователя или слово "гость", если пользователь не залогинен:
Привет, {% if (user.flags.logged) %}<b>{{user.name}}</b>{% else %}гость{% endif %}!

2. Персональный блок для пользователя с логином "vasya":
{% if (user.flags.logged and (user.name == 'vasya')) %} да здравствует Вася!{% endif %}
А теперь - самое важное
Чуть-чуть модифицированный TWIG (а у нас используется именно такой вариант) позволяет полностью сохранить существующие шаблоны сайта!

Достаточно существующего функционана? Продолжаем использовать, то, что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах.

Комментирование данной новости запрещено.

События в Core

События в Plugins