Дополнительные возможности шаблонизатора CoTemplate

Расширенные возможности движка шаблонов: вложенные блоки условий и циклов, вызов функций.

Универсальность движка Котонти состоит в том числе и в использовании гибкого механизма шаблонов CoTemplate (ранее известного как XTemplate). CoTemplate добавляет новые возможности к обработке шаблонов: обработка вложенных блоков (поддерживаются циклы и условные блоки) и вызов дополнительных функций.

Условные блоки использующие оператор `IF` вероятно многим разработчикам уже знакомы. Однако здесь можно использовать не только обычные сравнения на равенство. Ниже приводится таблица операторов допустимых в условных блоках:

 

Наименование Оператор Описание
Равно == значения равны
Не равно != значения не равны
Тождественно равно === значения равны и имеют тот же тип
Тождественно не равно !== значения не равны или они разных типов
Меньше чем < левое значение меньше правого
Больше чем > левое значение больше правого
Меньше или равно <= левое значение меньше или равно правому
Больше или равно >= левое значение больше или равно правому
Содержит HAS левое выражение (массив) содержит правое значение (строку)
Включает ~= левое значение (строка) включает в себя правое значение (строку)
Сложение + складывает 2 значения
Вычитание - вычитает значения
Умножение * умножает значения
Деление / делит значение
Остаток целочисленного деления % возвращает остаток от деления
Логическое `И` AND объединяет два значения, оба должны истинны (true)
Логическое `ИЛИ` OR объединяет два значения, хотя бы одно из них должно быть истинно (true)
Логическое `исключающее ИЛИ` XOR объединяет два значения, только одно может быть истинно (true)
Отрицание ! делает булевское значение (boolean) обратным

Эти операторы могут использоваться в условных блоках файлов шаблонов. Ниже простой пример объединения нескольких условий:

<!-- IF {PHP.i} % 2 == 0 AND {PHP.usr.isadmin} -->
Строка четная и пользователь имеет права администратора.
<!-- ENDIF -->

Начиная с Siena 0.9.0, которая использует CoTemplate версии 2.5, условные блоки могут быть вложенными. Это значит, что вы можете использовать условные блоки или циклы внутри других блоков (условных илил циклов). Кроме того, это позволяет использовать конструкции типа «ELSE IF» (которые в таком виде не работают), просто добавив дополнительный условный блок (`IF`) внутри блока `ELSE`.

Еще одно мощное нововведение шаблонизатора CoTemplate версии 2.5 — это вызов функций (callback или «функция обратного вызова»). Здесь обратный вызов — это вызов функции PHP из вашего шаблона, с возможностью передать значение любого шаблонного тега как параметр функции. Тег с вызовом функци будет заменен на значение возвращаемое функцией. 
В качестве параметра функции может быть использован любой вид шаблонных тегов, включая ссылки на переменную PHP — {PHP.myvar} (которая ссылается на значение переменной $myvar вашего скрипта). Вызов функции инициируется добавлением знака вертикальной черты `|` (знак конвейера / pipe sign) к тегу с последующим указанием имени функции PHP (включая пользовательские функции и стандартные движка). Вызов функции практически аналогичен её же вызову в PHP — все параметры перечисляются в скобках, с той лишь разницей, что передача значения тега шаблона осуществляется через специальную переменную `$this`. Переменная `$this` при вызове будет заменена на значение тега шаблона, используемого перед знаком конвейера. 
Таким образом, к значению тегов шаблона можно применять обычные функции PHP, используя результат в шаблоне. Ниже приведено несколько примеров обратного вызова функций:

{PAGE_BEGIN_STAMP|cot_date('date_full', $this)} 2011-01-01
(зависит от локальных настроек)
{LIST_ROW_BEGIN_STAMP|cot_date('date_text', $this)} January 1, 2011
(зависит от локальных настроек)
Copyright {PHP|date('Y')} Copyright 2011
{PHP|cot_url('page', 'c=news')} page.php?c=news
(зависит от правил создания URL)
{PHP.sys.xk|cot_url('users', 'm=logout&x=$this')} users.php?m=logout&x=1234567890abcdef
(зависит от правил создания URL)

В примерах выше используется тег `PHP`. Этот тег сам по себе не имеет значения и используется для вызова функций в которые нет необходимости передавать значения каких-либо тегов.

Имейте в виду, что реализация механизма обратного вызова такова, что все параметры вызова интерпретируются программой как значения строкового (string) типа. Это значит, что передать «на прямую» в функцию значение `false` не удастся. Для выхода из этой ситуации используйте вместо `false` значение `0` (ноль). Однако помните, что метод не сработает, если в функции этот параметр проверяется с использованием строгой проверки (проверка с типом оператором `===`).

Учитывая возможность вызывать собственные функции (например добалвяя их в файл system/functions.custom.php), возможности шаблонов расширяются практически неограничено. Тем не менее, надо учитывать, что просто не значит правильно. Применение логики в ваших шаблоных имеет и обратные стороны. Во-первых, это снижает производительность, особенно если часто использовать такой подход. Во-вторых, это нарушает принципы MVC (методология программирования Модель-Вид-Контейнер), согласно которой логика приложения должна быть отделена от представления (отображения шаблонов). По мимо прочего, это может усложнить работу дизайнера. Особенно если он не разбирается в Котонти и тем более в PHP.



1. dedushka  27.06.2012 12:54

Как выполнить в теге функцию, не принимающую никаких параметров?

Вариант {|myfunc}, естесственно, не проходит...

2. Trustmaster  27.06.2012 17:22
Добавление комментариев доступно только зарегистрированным пользователям