Pages, Articles & News
Tools & Plugins
Example / Placeholder Title


Description as an example placeholder. Sample text content for further customization of the "Index36" template.

You are free to edit and customize the template however you like. If you don’t have time or enough knowledge — you can always order template adaptation by contacting me via GitHub or private messages on the digital goods marketplace.

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

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

0 Published 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.

No comments yet
Only registered users can post new comments
Account