Категории форума

Что такое CoTemplate в CMS Cotonti. Блоки.

Введение. Общие сведения и основные понятия. CoTemplate это шаблонизатор, движок шаблонов в котонти, который основан на классе XTemplate, который позволяет хранить HTML-код отдельно от вашего PHP-кода.


webitproff
webitproff • 18.02.2024 19:14 #1

Введение. Общие сведения и основные понятия. Как работает движок шаблонов 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

Отредактировано: webitproff (12.03.2025 14:26, 1 год назад)
3/3/0

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.