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.

2024-02-18 18:14
Avatar" alt="" class="rounded-circle border border-2 border-light" width="54" height="54">

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

This post was edited by webitproff (2025-03-12 13:26, 1 year ago)
Account