Введение. Общие сведения и основные понятия. Как работает движок шаблонов CoTemplate и примеры его использования.
1. Что такое "CoTemplate"?
CoTemplate - это движок шаблонов, шаблонизатор CMS Cotonti.
CoTemplate позволяtn хранить HTML-код отдельно от вашего PHP-кода (в отличие от многих других движков шаблонов, таких как Smarty). CoTemplate основан на классе XTemplate — быстром и легком движке блочных шаблонов, но расширяет его множеством полезных функций, таких как вложенные блоки, различные виды интерполяции переменных, обратные вызовы и т.д., и по-прежнему очень короткий и очень оптимизированный.
Если вы уже легко читаете php-код, - можете сразу заглянуть в cotemplate.php
2. Cotonti и CoTemplate
CoTemplate использует блоки для вывода HTML-кода. Вы можете рассматривать их как инструкции для Cotonti, куда выводить конкретный код.
3. Синтаксис блоков CoTemplate в примерах.
Вот реальный блок из шаблона страницы полной новости/статьи page.tpl, куда мы выводим HTML-код отдельно от PHP-кода.
<!-- BEGIN: PAGE_ADMIN -->
<div class="block">
<h2 class="admin">{PHP.L.Adminpanel}</h2>
<ul class="bullets">
<!-- IF {PHP.usr.isadmin} -->
<li><a href="{PHP|cot_url('admin')}">{PHP.L.Adminpanel}</a></li>
<!-- ENDIF -->
<li><a href="{PAGE_CAT|cot_url('page','m=add&c=$this')}">{PHP.L.page_addtitle}</a></li>
<li>{PAGE_ADMIN_UNVALIDATE}</li>
<li>{PAGE_ADMIN_EDIT}</li>
<li>{PAGE_ADMIN_CLONE}</li>
<li>{PAGE_ADMIN_DELETE}</li>
<!-- IF {PAGE_I18N_TRANSLATE} -->
<li>{PAGE_I18N_TRANSLATE}</li>
<!-- ENDIF -->
</ul>
</div>
<!-- END: PAGE_ADMIN -->
Скришот сделан специально, что бы вы обратили внимание, на некоторые крайне важные моменты, которые новички зачастую принимают за простое комментирование HTML-кода в шаблонах.
Блоки являются основой структуры шаблонов. Шаблон содержит блоки, блоки могут содержать другие блоки, выражения, условия, теги и обычный текст.
HTML-код или любой текст, который находится за пределами корневых блоков, - движком Cotonti игнорируется.
Большинство блоков состоят из единственного корневого блока 'MAIN'.
Шаблон допускает применение нескольких корневых блоков одновременно.
Блок идентифицируется и выводится контроллером. Блоки могут быть идентифицированы по их полному имени: 'PARENT_BLOCK.BLOCK_NAME'. Блоки самые быстрые структуры в шаблонах. Эти три основные момента делают их основой всех остальных конструкций шаблонизатора.
И так, исходя из блока выше, немного разберем:
<!-- BEGIN: PAGE_ADMIN --> Содержимое блока в виде HTML кода <!-- END: PAGE_ADMIN -->
Где "PAGE_ADMIN" — это имя/название блока.
Правила для задания имен блоков CoTemplate:
1. Названия блоков задаются только в верхнем регистре (заглавные буквы)
2. Только латинские и символ подчеркивания.
Из самого названия блока "PAGE_ADMIN" , мы уже интуитивно понимаем, что всё, что внутри этого блока элементы взаимодействия для администраторов или пользователей имеющие права внесения определенных изменений и записей в БД Cotonti.
Такие правила, в данном конкретном примере, для элементов взаимодействия, а именно, тегов для администрирования страницы задаются в page.functions.php, а уже видимость этих тегов устанавливается в page.main.php, где тут же указывается название блока, в котором они будут показываться и срабатывать:
if (\Cot::$usr['isadmin'] || \Cot::$usr['id'] == $pag['page_ownerid']) {
$t->parse('MAIN.PAGE_ADMIN');
}
Конкретно файл шаблона page.tpl также указывается в самом page.main.php черех XTemplate:
$mskin = cot_tplfile(array('page', $cat['tpl']));
.... .... ...
/* === Hook === */
foreach (cot_getextplugins('page.main') as $pl) {
include $pl;
}
/* ============ */
.... ..... ...
$t = new XTemplate($mskin);
А уже затем, CoTemplate генерирует строковое представление для заданного набора блоков или блока в cotemplate.php
protected function blocks_toString(&$blocks)
{
$str = '';
foreach ($blocks as $name => $block)
{
if (is_string($name) && !is_numeric($name))
{
$str .= "<!-- BEGIN: $name -->\n" . $block->__toString() . "<!-- END: $name -->\n";
}
else
{
$str .= $block->__toString();
}
}
return $str;
}
Вот откуда у нас появилось <!-- BEGIN: NAME_BLOCK --> и <!-- END: NAME_BLOCK -->, которые новички и начинающие пользователи-котоводы очень часто принимают за простое комментирование (сокрытие от вывода в браузер) html-кода.
Закрепим понимание блоков CoTemplate в CMS Cotonti, на основе примера выше:
1. У нас в шаблоне полной новости, - page.tpl есть ссылки на управление этой статьей или создание новой.
2. Все эти ссылки представленны ввиде тегов пользователю с правами на запись (администрирование, частичное администрирование).
3. Все эти теги формируются в page.functions.php
4. Создаем блок CoTemplate и определяем его видимость в page.main.php, указывая название таком блоку, - PAGE_ADMIN.
5. Шаблонизатор CoTemplate обрабатывает, выводит, разбирает в строки эти теги внутри указанного блока <!-- BEGIN: PAGE_ADMIN --> и <!-- END: PAGE_ADMIN -->
Кто-то скажет, да что за бред!? Зачем обрачивать в блок, если уже в page.functions.php понятно, что это для администраторов ссылки
<li>{PAGE_ADMIN_UNVALIDATE}</li>
<li>{PAGE_ADMIN_EDIT}</li>
<li>{PAGE_ADMIN_CLONE}</li>
<li>{PAGE_ADMIN_DELETE}</li>
и гостям, или пользователям без права на запись ссылки в списке не будут отображены!
Посмотрите внимательно на скриншот в начале темы.
Кроме ссылок в тегах {PAGE_ADMIN_XXXX} у нас внутри блока CoTemplate PAGE_ADMIN находятся
1. Название html-блока. (Не путать с CoTemplate блоком)
<h2 class="admin">{PHP.L.Adminpanel}</h2>
2. Доступ в админку для администраторов
<!-- IF {PHP.usr.isadmin} -->
<li><a href="{PHP|cot_url('admin')}">{PHP.L.Adminpanel}</a></li>
<!-- ENDIF -->
3. Ссылка на создание новости или статьи
<li><a href="{PAGE_CAT|cot_url('page','m=add&c=$this')}">{PHP.L.page_addtitle}</a></li>
4. Ссылка на перевод контента статьи или новости на другие языки, установленные в системе
<!-- IF {PAGE_I18N_TRANSLATE} -->
<li>{PAGE_I18N_TRANSLATE}</li>
<!-- ENDIF -->
И если, мы решим вывести, всё что внутри блока CoTemplate без определения <!-- BEGIN: PAGE_ADMIN --> и <!-- END: PAGE_ADMIN -->, что это блок CoTemplate, и без указания названия блока, мы получим тогда действительно бред:

а по клику на ссылку "Создать страницу" вот такое сообщение, если например, это гость

Автор: webitproff
