Операторы в конструкциях тегов Cotonti в TPL-шаблонах и синтаксис XTemplate (CoTemplate)
Cotonti использует собственный шаблонизатор под названием CoTemplate, который основан на классическом XTemplate (с существенными улучшениями и адаптациями). Это легковесный движок шаблонов, который разделяет HTML-разметку от PHP-кода, делая темы независимыми от логики. В отличие от Smarty (который использует {foreach}, {/foreach}) или Twig ({% for %}), CoTemplate применяет синтаксис на основе комментариев HTML-стиля и тегов в фигурных скобках.
Основная идея: шаблон — это почти чистый HTML с вставками специальных конструкций. Cotonti парсит эти конструкции и заменяет их на реальные данные.
1. Основные типы тегов (TPL Tags)
В Cotonti есть два вида тегов:
- Простые теги (переменные) — заменяются на значения:
{PAGE_TITLE},{USER_NAME},{PHP.cfg.mainurl}Они выводятся напрямую. Префиксы вроде PHP. дают доступ к глобальным переменным PHP. - Блочные теги — управляют выводом участков HTML:
<!-- BEGIN: BLOCK_NAME -->...<!-- END: BLOCK_NAME -->
Блоки — это основа CoTemplate. Они позволяют повторять фрагменты (циклы), показывать/прятать участки (условия) и вкладывать друг в друга.
2. Синтаксис блоков (BEGIN / END)
Самая частая конструкция — цикл по массиву данных.
Пример: вывод списка новостей (pages)
<!-- BEGIN: PAGE_ROW -->
<div class="news-item">
<h3><a href="{PAGE_ROW_URL}">{PAGE_ROW_TITLE}</a></h3>
<p>{PAGE_ROW_DESC}</p>
<span>Автор: {PAGE_ROW_AUTHOR}</span>
</div>
<!-- END: PAGE_ROW -->В PHP-коде модуля (например, page.list.php):
$t->assign('PAGE_ROW', $row); // или $t->assign(array('PAGE_ROW_TITLE' => $row['page_title'], ...));
$t->parse('MAIN.PAGE_ROW'); // парсим блок внутри MAINРезультат: блок PAGE_ROW будет повторен столько раз, сколько элементов в массиве.
Вложенные блоки работают аналогично:
<!-- BEGIN: FORUM_TOPIC -->
<div class="topic">
<h4>{FORUM_TOPIC_TITLE}</h4>
<!-- BEGIN: FORUM_POST -->
<div class="post">
{FORUM_POST_TEXT}
<small>от {FORUM_POST_AUTHOR}</small>
</div>
<!-- END: FORUM_POST -->
</div>
<!-- END: FORUM_TOPIC -->3. Условные операторы: IF / ELSE / ENDIF
Шаблонизатор CoTemplate в Cotonti использует операторы внутри условных конструкций для проверки условий
<!-- IF {TAG_YOUR_COTONTI} -->
{TAG_YOUR_COTONTI}
<!-- ELSE -->
{OTHER_TAG_YOUR_COTONTI}
<!-- ENDIF -->Базовый синтаксис:
<!-- IF {some_tag} == "value" -->
Показывается, если {some_tag} равно "value"
<!-- ELSE -->
Иначе
<!-- ENDIF -->Поддерживаемые операторы сравнения и не только (таблица):
| Наименование | Оператор | Описание |
| Равно | == | значения равны |
| Не равно | != | значения не равны |
| Тождественно равно | === | значения равны и имеют тот же тип |
| Тождественно не равно | !== | значения не равны или они разных типов |
| Меньше чем | < | левое значение меньше правого |
| Больше чем | > | левое значение больше правого |
| Меньше или равно | <= | левое значение меньше или равно правому |
| Больше или равно | >= | левое значение больше или равно правому |
| Содержит | HAS | левое выражение (массив) содержит правое значение (строку) |
| Включает | ~= | левое значение (строка) включает в себя правое значение (строку) |
| Сложение | + | складывает 2 значения |
| Вычитание | - | вычитает значения |
| Умножение | * | умножает значения |
| Деление | / | делит значение |
| Остаток целочисленного деления | % | возвращает остаток от деления |
| Логическое `И` | AND | объединяет два значения, оба должны истинны (true) |
| Логическое `ИЛИ` | OR | объединяет два значения, хотя бы одно из них должно быть истинно (true) |
| Логическое `исключающее ИЛИ` | XOR | объединяет два значения, только одно может быть истинно (true) |
| Отрицание | ! | делает булевое значение (boolean) обратным |
Примеры:
<!-- IF {PHP.usr.id} > 0 -->
Привет, {PHP.usr.name}! <a href="{PHP|cot_url('users', 'm=profile')}">Профиль</a>
<!-- ELSE -->
<a href="{PHP|cot_url('login')}">Войти</a> / <a href="{PHP|cot_url('register')}">Регистрация</a>
<!-- ENDIF -->С ELSEIF использовать нельзя:
<!-- IF {USER_AGE} < 18 -->
<p>Доступ ограничен</p>
<!-- ELSEIF {USER_AGE} < 21 --> ELSEIF нет в cotonti
<p>Алкоголь запрещен</p>
<!-- ELSE -->
<p>Добро пожаловать!</p>
<!-- ENDIF -->а вот так ПРАВИЛЬНО:
<!-- IF {USER_AGE} < 18 -->
<p>Доступ ограничен</p>
<!-- ELSE -->
<!-- IF {USER_AGE} < 21 -->
<p>Алкоголь запрещен</p>
<!-- ELSE -->
<p>Добро пожаловать!</p>
<!-- ENDIF -->
<!-- ENDIF -->Логические операторы внутри IF:
<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} OR {PHP.usr.maingrp} == 5 -->
владелец страницы или администратор может видеть то, что внутри этого условия, например ссылку на редактирование статьи
<!-- ENDIF -->4. Выражения и операторы внутри тегов
CoTemplate позволяет простые вычисления и конкатенацию прямо в тегах.
Поддерживаемые операторы (арифметические и строковые):
- + — сложение / конкатенация
- - — вычитание
- * — умножение
- / — деление
% — остаток от деления
Примеры:
<span>Цена со скидкой: {ITEM_PRICE - (ITEM_PRICE * {DISCOUNT}/100)}</span>
<p>Полное имя: {USER_FIRSTNAME} {USER_LASTNAME}</p>
<div class="count">Товаров в корзине: {CART_COUNT}</div>
<!-- IF {CART_COUNT} > 0 -->
<a href="{PHP|cot_url('shop', 'm=cart')}">Перейти в корзину</a>
<!-- ENDIF -->Функции в тегах:
Реальные примеры использования $this в шаблонах Cotonti (в тегах вида {TAG|функция($this, ...)})
// 1. Обрезка текста страницы/статьи до 160 символов (очень частый случай в списках)
{PAGE_ROW_TEXT|strip_tags($this)|cot_cutstring($this,160)}
// 2. Обрезка описания страницы до 90–120 символов без HTML
{PAGE_ROW_DESC|strip_tags($this)|mb_substr($this,0,90,'UTF-8')}
// 3. Классическая обрезка заголовка (часто в блоках последних/популярных материалов)
{PAGE_ROW_TITLE|cot_cutstring($this,70,'…')}
// 4. Получение ссылки на недавние материалы за N дней (recentitems)
{PHP.daysUrl|cot_url('recentitems','$this&mode=pages')}
// 5. То же самое, но с категорией (пример из плагинов/тем)
{PHP.daysUrl|cot_url('recentitems','c=$this&mode=pages')}
// 6. Формирование ссылки на пользователя по его id (в списках авторов, комментариях и т.п.)
{PAGE_OWNER_ID|cot_url('users','m=details&id=$this')}
// 7. Формирование ссылки на вкладку поиска
{PHP|cot_url('search','tab=pag&sq=$this')}
// 8. Построение ссылки на профиль по имени пользователя
{PAGE_OWNER_NICKNAME|cot_url('users','m=details&u=$this')}
// 9. Обрезка подписи пользователя
{PAGE_OWNER_TEXT|strip_tags($this)|cot_cutstring($this,120,'…')}
// 10. Формирование ссылки на страницу создания статьи с кодом текущей категории
{PAGE_CAT|cot_url('page','m=add&c=$this')}Синтаксис: {TAG|function_name(param1, param2)} Часто используется cot_date(), cot_cutstring(), strip_tags() и пользовательские функции.
5. Специальные конструкции и полезные трюки
<!-- IF {TAG} -->— сокращенная формаISSET+!EMPTY- <!-- BEGIN: EXTRA_BLOCK --> — часто используется для плагинов (они добавляют свои блоки динамически)
- Вывод тега без парсинга (экранирование):
{{LITERAL_TAG}} <!-- выводит {LITERAL_TAG} как есть -->- Доступ к глобальным переменным:
{PHP.env.index}
{PHP.usr.id}
{PHP.sys.now} - Условный класс CSS:
<div class="item <!-- IF {ITEM_ACTIVE} -->active<!-- ENDIF -->">6. Отличия от других шаблонизаторов
| Конструкция | Cotonti (CoTemplate) | Smarty | Twig | Blade (Laravel) |
| Цикл | FOR; EXTRA_BLOCK_ROW | {foreach} | {% for %} | @foreach |
| Условие | <!-- FOR {KEY}, {VALUE} IN {MY_ARRAY} --> Используем {KEY} и {VALUE} <!-- ENDFOR --> | {if} | {% if %} | @if |
| Переменная | {VAR} | {$var} | {{ var }} | {{ $var }} |
| Фильтры/модификаторы | {VAR | func} | {$var | modifier} |
| Вложенность условий | Да | Да | Да | Да |
| Скорость | Очень высокая | Средняя | Высокая (компилируется) | Высокая |
CoTemplate специально сделан легким и быстрым — без компиляции в PHP-классы, парсинг происходит на лету, но кэшируется.
7. Полезные советы по использованию
- Всегда используйте префиксы блоков (например,
MAIN.,PAGE.,USERS.) — это предотвращает конфликты имен. - Для отладки включите
$cfg['debugmode'] = true;— Cotonti покажет неиспользованные теги. - Плагины часто добавляют блоки вида
<!-- BEGIN: PLUGIN_NAME -->— проверяйте их в документации плагина. - Для сложной логики лучше вынести её в PHP (в модуль или плагин), а в шаблоне оставить только простые условия.
CoTemplate — это баланс между мощностью и простотой. Он не такой выразительный, как Twig, но значительно быстрее и проще для тем, которые создают верстальщики без глубоких знаний PHP.
Если вы разрабатываете тему для Cotonti Siena — начните с копирования стандартной темы (NEMESIS) и экспериментируйте с блоками и условиями. Сообщество Cotonti до активно помогает в форуме и на GitHub.