Шаблонизатор CoTemplate является ключевой частью Cotonti Siena CMF (Content Management Framework) — свободно распространяемой системы управления контентом на PHP. Это быстрый и легковесный движок шаблонов, который используется для разделения логики приложения от представления (HTML-кода) в Cotonti. Ниже я подробно расскажу всё, что достоверно известно о CoTemplate, основываясь на официальной документации и исходном коде Cotonti, избегая предположений.
Общая информация
CoTemplate — это эволюция шаблонизатора XTemplate, изначально разработанного для других PHP-проектов (например, phpXTemplate), но адаптированного и значительно расширенного для нужд Cotonti. Он был переименован в CoTemplate в процессе развития Cotonti Siena, начиная с версии 0.9.0 (примерно с 2011 года). Основные характеристики:
- Скорость: CoTemplate компилирует шаблоны в PHP-объекты, что делает его быстрее многих других шаблонизаторов, таких как Smarty, за счет минимизации накладных расходов на парсинг.
- Легковесность: Код CoTemplate компактный и оптимизированный, что снижает требования к ресурсам сервера.
- Совместимость: Он сохраняет обратную совместимость с синтаксисом XTemplate, но добавляет множество дополнительных функций, специфичных для Cotonti.
CoTemplate используется для обработки файлов с расширением .tpl, которые содержат HTML-код с внедренными тегами и блоками для динамического вывода данных.
Основные элементы CoTemplate
1. Блоки (Blocks)
Блоки — это фундаментальная единица структуры шаблонов в CoTemplate. Они определяют участки кода, которые выводятся или пропускаются в зависимости от условий или данных, переданных из PHP-кода. Синтаксис блоков:
<!-- BEGIN: BLOCK_NAME -->
Ваш HTML-код здесь
<!-- END: BLOCK_NAME -->
- Назначение: Блоки используются для вывода повторяющихся данных (например, списка записей) или условного контента.
- Имена блоков: По традиции пишутся в верхнем регистре (например, MAIN, HEADER, FOOTER).
- Иерархия: Блоки могут быть вложенными, что позволяет создавать сложные структуры. Например:
<!-- BEGIN: PARENT -->
<!-- BEGIN: CHILD -->
Контент
<!-- END: CHILD -->
<!-- END: PARENT -->
Управление: Вывод блоков активируется из PHP-кода контроллера через методы вроде $t->parse('BLOCK_NAME'), где $t — объект класса XTemplate.
2. Теги (Tags)
Теги — это переменные, которые подставляются в шаблон вместо плейсхолдеров. Они заключаются в фигурные скобки {}. Примеры:
{PAGE_TITLE} — выводит заголовок страницы.
{PHP.cfg.mainurl} — доступ к конфигурационной переменной mainurl из глобального массива $cfg.
- Типы тегов:
- Простые теги:
{VARIABLE} — заменяются значением переменной.
- Глобальные теги:
{PHP.var} — доступ к глобальным переменным PHP (например, $usr, $cfg).
- Ключ-значение: Теги не имеют стека или области видимости, все переменные находятся в общих рамках возможностей фреймворка.
3. Условные операторы (IF-ELSE)
CoTemplate поддерживает логические блоки для условного вывода контента.
Синтаксис:
<!-- IF {CONDITION} -->
Контент, если условие истинно
<!-- ELSE -->
Контент, если условие ложно
<!-- ENDIF -->
- Поддерживаемые операторы (начиная с версии 2.5 и выше):
- Логические:
AND, OR, XOR, ! (NOT).
- Сравнение:
==, !=, <, >, <=, >=.
- Строгое сравнение (с версии 2.7):
===, !==.
- Специальные:
HAS (проверка наличия элемента в массиве), ~= (проверка подстроки).
- Арифметические:
+, -, *, /, %.
- Пример:
<!-- IF {PHP.i} % 2 == 0 AND {PHP.usr.isadmin} -->
Четная строка и пользователь — админ
<!-- ENDIF -->
- Вложенность: С версии 0.9.0 (CoTemplate 2.5) поддерживаются вложенные условия.
4. Callback-функции
С версии 2.5 добавлена мощная функция — вызов PHP-функций прямо из шаблона через "трубу" (|). Это позволяет обрабатывать значение тега перед выводом.
Синтаксис:
{VARIABLE|function_name($param1, $param2)}
- Особенности:
$this — специальная переменная, содержащая значение тега перед вызовом функции.
- Поддерживаются как встроенные PHP-функции, так и пользовательские функции Cotonti.
- Примеры:
{PAGE_ROW_DATE_STAMP|cot_date('date_full', $this)} — форматирует дату.
{PHP.myvar|strtoupper} — преобразует строку в верхний регистр.
- Множественные аргументы (с версии 0.9.24): Можно передавать другие теги как параметры:
{PHP|cot_url('page', 'c=news')|var_dump({PHP.L.Home}, $this)}
5. Включение файлов (FILE)
CoTemplate позволяет включать другие .tpl-файлы с помощью оператора FILE:
<!-- FILE "{PHP.cfg.themes_dir}/mytheme/subtemplate.tpl" -->
- Особенность: Содержимое файла вставляется буквально на этапе парсинга, до дальнейшей обработки.
Технические детали
- Класс: CoTemplate реализован в классе XTemplate, который находится в файле system/cotemplate.php.
- Компиляция: Шаблоны компилируются в PHP-объекты, что ускоряет их выполнение. Код разбивается на блоки и кэшируется на диске.
- Кэширование: CoTemplate использует дисковый кэш для хранения скомпилированных шаблонов. Если файл .tpl изменяется, необходимо очистить кэш через админ-панель (Administration → Disk Cache → Purge All).
- Отладка (с версии 2.6, Cotonti 0.9.1):
- Режим отладки активируется в config.php через
$cfg['debug'] = true;.
- Добавление
&debug=1 к URL выводит дамп тегов и блоков текущей страницы.
- Callback dump (например,
{PAGE_TITLE|dump}) позволяет вывести содержимое переменной для анализа.
Поддерживаемые возможности
- Операторы в выражениях:
- Логические:
AND, OR, XOR, NOT.
- Сравнение:
==, !=, <, >, <=, >=, ===, !==.
- Специальные:
HAS, ~=.
- Арифметические:
+, -, *, /, %.
- Вложенные блоки: Поддержка с версии 2.5.
- Множественные корневые блоки: Один .tpl-файл может содержать несколько блоков на верхнем уровне (например,
MAIN, EXTRA), но HTML вне блоков игнорируется.
- Гибкость: Возможность использовать классы и их свойства в callback-функциях (с версии 0.9.19).
Ограничения
- Нет стека переменных: Все теги находятся шаблонах, что упрощает код, но ограничивает сложные сценарии с областями видимости.
- Производительность логики: Использование сложных условий и callback’ов в шаблонах может замедлить обработку. Для сложной логики рекомендуется выносить её в PHP-код (например, в плагины).
История версий
- CoTemplate 2.5 (Cotonti Siena 0.9.0): Добавлены вложенные условия и callback-функции.
- CoTemplate 2.6 (Cotonti Siena 0.9.1): Улучшена отладка (дампы тегов и переменных).
- CoTemplate 2.7 (Cotonti Siena 0.9.13 и выше): Добавлены строгие операторы сравнения (===, !==).
- 0.9.24 и выше: Поддержка множественных аргументов в callback-функциях.
Пример использования
Пример шаблона example.tpl:
<!-- BEGIN: MAIN -->
<h1>{PAGE_TITLE}</h1>
<!-- IF {PHP.usr.isadmin} -->
<p>Добро пожаловать, админ!</p>
<!-- ELSE -->
<p>Вы не админ.</p>
<!-- ENDIF -->
<ul>
<!-- BEGIN: ITEMS -->
<li>{ITEM_NAME}: {ITEM_VALUE|number_format}</li>
<!-- END: ITEMS -->
</ul>
<!-- END: MAIN -->
PHP-код для обработки:
$t = new XTemplate('example.tpl');
$t->assign('PAGE_TITLE', 'Моя страница');
foreach ($items as $item) {
$t->assign('ITEM_NAME', $item['name']);
$t->assign('ITEM_VALUE', $item['value']);
$t->parse('MAIN.ITEMS');
}
$t->parse('MAIN');
$t->out('MAIN');
Итог
CoTemplate — это мощный, быстрый и гибкий шаблонизатор, разработанный специально для Cotonti Siena CMF. Он сочетает простоту синтаксиса XTemplate с расширенными возможностями, такими как вложенные условия, callback-функции и поддержка сложных выражений. Его сильные стороны — скорость и легкость освоения даже для новичков, а слабые — ограничения в сложной логике и отсутствие стека переменных. Это делает его идеальным для типичных задач CMS/CMF, но для сложных приложений может потребоваться вынесение логики в PHP.