Операторы в конструкциях тегов Cotonti в TPL-шаблонах и синтаксис XTemplate

Cotonti использует собственный шаблонизатор под названием CoTemplate, который основан на классическом XTemplate (с существенными улучшениями и адаптациями). Это легковесный движок шаблонов, который разделяет HTML-разметку от PHP-кода

Filed under: Cotonti Siena CMF

Операторы в конструкциях тегов 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)

HTML
<!-- 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):

PHP
$t->assign('PAGE_ROW', $row); // или $t->assign(array('PAGE_ROW_TITLE' => $row['page_title'], ...));
$t->parse('MAIN.PAGE_ROW'); // парсим блок внутри MAIN

Результат: блок PAGE_ROW будет повторен столько раз, сколько элементов в массиве.

Вложенные блоки работают аналогично:

HTML
<!-- 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 -->

Базовый синтаксис:

HTML
<!-- IF {some_tag} == "value" -->
 Показывается, если {some_tag} равно "value"
<!-- ELSE -->
 Иначе
<!-- ENDIF -->

Поддерживаемые операторы сравнения и не только (таблица):

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

 

Примеры:

HTML
<!-- 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:

HTML
<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} OR {PHP.usr.maingrp} == 5 -->
 владелец страницы или администратор может видеть то, что внутри этого условия, например ссылку на редактирование статьи
<!-- ENDIF -->

4. Выражения и операторы внутри тегов

CoTemplate позволяет простые вычисления и конкатенацию прямо в тегах.

Поддерживаемые операторы (арифметические и строковые):

  • + — сложение / конкатенация
  • - — вычитание
  • * — умножение
  • / — деление
  • % — остаток от деления

     

Примеры:

HTML
<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 --> — часто используется для плагинов (они добавляют свои блоки динамически)
  • Вывод тега без парсинга (экранирование):
HTML
{{LITERAL_TAG}} <!-- выводит {LITERAL_TAG} как есть -->
  • Доступ к глобальным переменным:
HTML
{PHP.env.index} 
{PHP.usr.id} 
{PHP.sys.now} 
  • Условный класс CSS:
HTML
<div class="item <!-- IF {ITEM_ACTIVE} -->active<!-- ENDIF -->">

6. Отличия от других шаблонизаторов

КонструкцияCotonti (CoTemplate)SmartyTwigBlade (Laravel)
ЦиклFOR; EXTRA_BLOCK_ROW{foreach}{% for %}@foreach
Условие<!-- FOR {KEY}, {VALUE} IN {MY_ARRAY} -->
Используем {KEY} и {VALUE}
<!-- ENDFOR -->
{if}{% if %}@if
Переменная{VAR}{$var}{{ var }}{{ $var }}
Фильтры/модификаторы{VARfunc}{$varmodifier}
Вложенность условийДаДаДаДа
СкоростьОчень высокаяСредняяВысокая (компилируется)Высокая

CoTemplate специально сделан легким и быстрым — без компиляции в PHP-классы, парсинг происходит на лету, но кэшируется.

7. Полезные советы по использованию

  • Всегда используйте префиксы блоков (например, MAIN., PAGE., USERS.) — это предотвращает конфликты имен.
  • Для отладки включите $cfg['debugmode'] = true; — Cotonti покажет неиспользованные теги.
  • Плагины часто добавляют блоки вида <!-- BEGIN: PLUGIN_NAME --> — проверяйте их в документации плагина.
  • Для сложной логики лучше вынести её в PHP (в модуль или плагин), а в шаблоне оставить только простые условия.

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

Если вы разрабатываете тему для Cotonti Siena — начните с копирования стандартной темы (NEMESIS) и экспериментируйте с блоками и условиями. Сообщество Cotonti до активно помогает в форуме и на GitHub.

5 minutes read Sodium Carbonate

Comments (0)

No comments yet
Only registered users can post new comments

Recommended Products and Services

Cotonti CMF: Plugin Installation, Integration, and Adaptation

Cotonti CMF: Plugin Installation, Integration, and Adaptation

professional services for the installation, deep integration and adaptation of plug-ins for Cotonti

Content author

webitproff

Offline

Sodium Carbonate

Last logged: 2026-09-01 22:41

About me briefly
Support and development of web projects on the CMF Cotonti: private messengers via the website, open and closed small social networks, trading platforms and marketplaces, freelance and services exchange portal, catalogs of goods from wholesale suppliers, dropshipping platforms, online stores, and much more.
View developments and download
Public portfolio of my works and developments
Telegram for messages
@webitproff
Telegram channel
@s/aBuyFILE
  • Page published: 2026-02-19 22:48
  • Last update: 2026-02-26 23:06

Связанные статьи

Similar pages

XTemplate. Функции (методы) parse(), text() и out() в Cotonti Siena
1 Техническое руководство по функциям парсера шаблонов, в частности функциям parse() и out(), а также основам работы с
Cotonti Siena CMF • 2026-02-22 20:11 webitproff
Руководство по методам parse(), text() и out() в XTemplate Cotonti Siena
2 Руководство для новичков: методы assign(), parse(), text() и out() в XTemplate (CoTemplate) Cotonti Siena
Cotonti Siena CMF • 2026-02-22 20:28 webitproff
TPL - список доступных тегов в шаблонах
3 Шаблоны Cotonti и фриланс-биржи. Список доступных тегов и блоков в шаблоне на странице модуля или плагина.
User Blog • 2020-07-17 05:15 webitproff
Список тегов и блоков в шаблонах Cotonti
4 Список доступных тегов и блоков в шаблоне на странице модуля или плагина. Документация, что происходит и как это
Примеры использования тегов для вывода дат разных форматов в шаблонах
5 Примеры использования стандартных форматов в шаблонахНиже приведены примеры шаблонных тегов для каждого

Recommended forum topics for this article

Как получить доступные теги и их список в CMS Cotonti?

Как получить доступные теги и их список в CMS Cotonti?

Инструкция новичкам, как в котонти, в любой локации сайта и на любой странице вывести и получить
#29 | Постов: 1 | Просмотров: 894
Дополнительные возможности шаблонизатора CoTemplate

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

Справочник операторов. Условные блоки использующие оператор `IF`. Расширенные возможности движка
#35 | Постов: 1 | Просмотров: 1668