Cotonti / Open Source PHP Content Management FrameworkContent Management Framework

XTemplate для программистов

Документация / Расширяем Cotonti / Расширения / XTemplate для программистов

Использование системы XTemplate, определение тегов и использование rows

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

При разработке плагина, важно знать, как определять теги и условные блоки в системе XTemplate. Раньше большинство плагинов использовали обычный способ получения HTML для разбора и отображения. Хотя использование XTemplate и свой собственный файл шаблона гораздо приятный способ построить свой плагин, вы все еще можете использовать классический способ для standalone плагинов. Это можно сделать с помощью переменных $plugin_title, $plugin_subtitle и $plugin_body. Они автоматически присваиваются тегам {PLUGIN_TITLE}, {PLUGIN_SUBTITLE} и {PLUGIN_BODY}. В этом случае, вам не нужно создавать свой собственный файл шаблона (и вы можете не включать tpl каталог). Cotonti будет использовать plugin.tpl из скина взамен него.

Итак, вы хотите использовать свой собственный файл шаблона. Вы начинаете с определения файла шаблона в качестве нового объекта XTemplate. Это верно, система XTemplate является объектно-ориентированной частью кода. После того как вы создали новый объект XTemplate, вы можете использовать набор методов (функций), поставляемых с классом XTemplate. Мы будем использовать только два из них: assign() и parse(). Сначала мы создаем новый объект XTemplate:

$t = new XTemplate(‘path/to/file.tpl’);

We are using $t as the XTemplate object variable name, but you can use any variable name you like. The ‘path/to/file.tpl’ is the path to the template file, from the Cotonti root folder. While this would work perfectly fine, it’s not a very flexible way to define the template file. Therefore we will use the cot_tplfile() function instead, like this:

$t = new XTemplate(cot_tplfile('pluginname', 'plug'));

Первым параметром является имя файла без расширения. Второй параметр должен быть установлен в 'plug', поскольку мы имеем дело с плагином. Другие возможные значения 'module' и 'core'.Функция cot_tplfile() будет искать правильный путь к файлу шаблона. Имя файла всегда должно начинаться с pluginname. Если вы хотите использовать несколько файлов шаблонов, вы должны использовать имена вроде этого: pluginname.secondary.tpl. Не забудьте опустить расширение при использовании cot_tplfile().

Следующим шагом является назначение некоторых тегов в шаблоне файла. Мы делаем это с помощью метода assign() нашего объекта XTemplate:

$t->assign();

Метод assign() может может принять один тег или массив тегов:

$t->assign('SINGLE_TAG', '<p>Piece of HTML</p>');
$t->assign(array(
	'TAG_ONE' => '<p>Piece of HTML</p>', 
	'TAG_TWO' => $somevariable
));

Как вы можете видеть, очень просто назначить кучу тегов сгенерированного PHP контента. Хотя это хороший способ для реализации шаблонов дизайна MVC, но не очень гибкий. Что делать, если вы хотите отобразить несколько строк контента из базы данных? XTemplate использует HTML-комментарий и метод parse(), чтобы позволить это. Допустим, вы только что выполнили SQL запрос, чтобы получить все страницы. Скорее всего, вы будете использовать цикл while для прохода по строкам. Рассмотрим следующий код:

while($row = $sql->fetch())
{
	$t->assign(array(
		'PAGE_ROW_ID' => $row['page_id'],
		'PAGE_ROW_TITLE' => $row['page_title']
	));
}

Этот код позволяет переопределять теги в каждой итерации цикла while, и в результате теги будут установлены в значение последней строки. Чтобы предотвратить это, мы должны заставить разбирать теги непосредственно после их определения. Это достигается с помощью метода parse().

$t->parse();

Метод parse() принимает один параметр: блок кода. Блок кода является уникальным кодом, который находится внутри файла шаблона в виде HTML комментариев. Он всегда содержит BEGIN и END, как здесь:

<!-- BEGIN: BLOCK_CODE -->
...
<!-- END: BLOCK_CODE -->

Возможно, вы заметили, что каждый файл шаблона Cotonti начинается и заканчивается таким тегом, фактически определяющим весь документ в виде блока. Как правило, это блок MAIN, но вы можете использовать другой, если вы действительно хотите этого.

В PHP-коде плагина мы добавим метод parse() к циклу while:

while($row = $sql->fetch())
{
	$t->assign(array(
		'PAGE_ROW_ID' => $row['page_id'],
		'PAGE_ROW_TITLE' => $row['page_title']
	));
	$t->parse('MAIN.PAGE_ROW');
}

Только что определенный блок называется ‘PAGE_ROW’, а поскольку он будет использоваться в блоке MAIN, мы добавляем блок с названием родительского блока и точку, чтобы разделить их. Наш шаблон может выглядеть следующим образом:

<!-- BEGIN: MAIN -->
	<h1>{SINGLE_TAG}</h1>

	<!-- BEGIN: PAGE_ROW -->
	<p>{PAGE_ROW_TITLE}</p>
	<!-- END: PAGE_ROW -->
<!-- END: MAIN -->

Если вы не хотите или не можете использовать блок MAIN, вы можете заменить его на другой код. Однако это потребует от вас сделать еще один разбор в конце кода плагина. Блок MAIN автоматически анализируется Cotonti, но любой другой блок должен быть обработан вручную вашим плагином. Просто вызовите метод parse() снова, и, наконец, выведите блок (для standalone):

$t->parse('ALTERNATIVE');
$t->out('ALTERNATIVE'); // Only for standalone

Лучше всего делать это непосредственно перед закрывающим тегом PHP.



1. McDuck  06.03.2012 19:49

Thanks: 0

сообщайте в ЛС замечания к переводу - поправлю

2. Oughtem  30.10.2013 22:32

Thanks: 0

Спасибо! Статья что надо. Такого контента по-больше бы!

Всего: 2, на странице: 2

Добавление комментариев доступно только зарегистрированным пользователям