XTemplate – шаблонный движок для “маленьких”Прежде чем, пускаться в теоретические дебри и рассуждения, рассмотрим готовый продукт – шаблонизатор XTemplate, который можно прямо сейчас скачать (
http://www.phpxtemplate.org/XTemplateDownloads) и прямо сейчас использовать. Это одно из крайне простых решений, которое, тем не менее, содержит все необходимое для создания более-менее стройной архитектуры средне-статистического веб–сайта. Основные его приемущества заключаются в следующем:
- Маленький размер. Для работы требуется всего один небольшой php-файл.
- Крайне простой синтаксис шаблонов, на изучение которого уйдут считанные минуты.
- Написан на PHP и не использует никаких дополнительных расширений, т.е. вы 100% сможете его использовать везде, где будет работать или отлаживаться ваш проект. (Лично меня всегда удивляло, что для огромного количество разработчиков именно этот пункт является решающим фактором, но факт есть факт).
- Имеет “блочную идеологию” (В чем именно ее преимущество мы подробнее рассмотрим позднее).
Для работы с XTemplate надо скопировать файл
xtemplate.class.php, в удобное место в файловой структуре вашего проекта (ну например, в директорию libs), после чего подключить движок и создать объект парсера (php скрипт в котором производим все манипуляции над шаблоном, в дальнейшем будем называть контроллером):
include('libs/xtemplate.class.php'); // Подключаем файл
$xtpl = new XTemplate('templates/test.xtpl'); // Создаем объект
test.xtpl – собственно файл шаблона (их для удобства мы будем хранить в директории templates). Синтаксис шаблонов XTemplate представлен всего двумя основными конструкциями. Первой и основной является блок. Блоки имеют следующий вид:
<!– BEGIN:block –>
Содержимое блока
<!– END:block –>
Каждой инструкции открывающей блок <!– BEGIN:block –> должна обязательно соответствовать закрывающая инструкция <!– END:block –>, где “block” имя блока, которое вы можете давать по своему усмотрению исходя из контекста содержимого блока, коим может быть любой HTML код. Про блоки надо понять три вещи:
- Содержимое блока никаким образом не будет отображено, пока в контролере явно не будет указано это сделать. Данная операция называется парсинг блока и выполняется командой
$xtpl->parse(‘имя блока’); (В принципе, есть возможность задать вывод по умолчанию для не пропарсенных блоков с помощью функции set_null_block)
- Содержимое блока тиражируется, столько раз, сколько выполнена команда parse. Выглядит это следующим образом - представьте, что при первом вызове parse содержимое блока отображается в шаблоне, а каждом последующем вы как будто выполняете операции его выделения – копирования – вставки, снизу от предыдущего отображения.
- Блоки могут вкладываться друг в друга, при этом парсинг осуществляется по принципу от внутренних блоков к внешним. т.е. шаблон разворачивается как бы изнутри.
Пришло время, проиллюстрировать вышесказанное примером. Итак, пусть шаблон имеет вид:
Шаблон:
<!– BEGIN:index –>
<!– BEGIN:block –>
<p>Это содержимое блока</p>
<!– END:block –>
<!– END:index –>
Контроллер:
include('libs/xtemplate.class.php'); // Подключаем файл
$xtpl = new XTemplate('templates/test.xtpl'); // Создаем объект
for($i=0; $i<3; $i++)
{
$xtpl->parse('index.block'); // Парсим блок "block" три раза в цикле
}
$xtpl->parse('index'); // Парсим блок "index"
$xtpl->out('index');
Результат вывода:
<p>Это содержимое блока</p>
<p>Это содержимое блока</p>
<p>Это содержимое блока</p>
Обратите внимание, блок “block” вложен в блок “index”. Для доступа к внутренним блокам в качестве разделителя используется точка. Таким образом, парсинг внутреннего блока осуществляется командой
$xtpl->parse('index.block'); Команда
out выводит результат распарсенного блока на печать. Также есть команда
text, ее отличие в том, что результат парсинга просто возвращается. Т.е. можно писать:
$result = $xtpl->text('index');
Делаем что-то с $result
echo $result;
Это бывает необходимо, когда с результатом парсинга надо проделать те или иные действия, например, сохранить пропарсенный шаблон в кэше.
Второй основной конструкцией синтаксиса XTemplate является тег, имеющий следующий синтаксис:
{value}
Аналогично блоку, пока тегу не будет явно присвоено значение с помощью функции assign, никакого вывода в шаблон осуществляться не будет (В принципе, есть возможность задать вывод по умолчанию для не присвоенных блоков с помощью функции
set_null_string). Фактически тег – это переменная, значение которой устанавливается в котроллере командой assign. Для простоты понимания, представьте, что
{value} это примерно тоже самое, что
<?php echo $value; ?>Поправим наш пример так, чтоб в парсинге блока участвовала переменная – счетчик пропарсенных блоков:
Шаблон:
<!– BEGIN:index –>
<!– BEGIN:block –>
<p>{value}. Это содержимое блока </p>
<!– END:block –>
<!– END:index –>
Контроллер (инициализация и финальный вывод опущены, аналогично будет и в дальнейшем):
for($i=1; $i<=3; $i++)
{
$xtpl->assign('value', $i); // Устанавливаем тегу value значение $i
$xtpl->parse('index.block');
}
$xtpl->parse('index');
Результат вывода:
<p>1. Это содержимое блока</p>
<p>2. Это содержимое блока</p>
<p>3. Это содержимое блока</p>
С помощью команды assign можно устанавливать сразу целый массив, причем элементы массивов могут быть в свою очередь опять массивами. Цепочка вложенных ключей массива в теге отделяется точками. Например:
Шаблон:
<!– BEGIN:index –>
<p>{value.key1}</p>
<p>{value.key2.key2_1}</p>
<p>{value.key2.key2_2}</p>
<!– END:index –>
Контроллер:
$arr = array // Инициализируем массив сложной структуры
(
'key1' => 'Значение 1',
'key2' => array
(
'key2_1' => 'Значение 2_1',
'key2_2' => 'Значение 2_2'
)
);
$xtpl->assign('value', $arr); // Одним присваиванием передаем массив в шаблон
$xtpl->parse('index');
Результат вывода:
<p>Значение 1</p>
<p>Значение 2_1</p>
<p>Значение 2_2</p>
Что касается синтаксиса, то XTemplate позволяет переопределить основные его элементы. В начале файла xtemplate.class.php' легко найти следующие параметры:
public $block_start_delim = '<!– ';
public $block_end_delim = '–>';
public $block_start_word = 'BEGIN:';
public $block_end_word = 'END:';
public $tag_start_delim = '{';
public $tag_end_delim = '}';
Надо ли переопределять данные параметры – решайте сами. Смысла особого в этом нет. Сомнения вызывают лишь фигурные скобки, которые могут встретится внутри тегов <script> или <style>, однако XTemplate обрабатывает такие ситуации корректно. По все видимости именем тега, заключенного в скобки, может служить лишь простой набор символов, соответствующий валидным именам переменных php.
Реальный проект, как правило, имеет сложною систему шаблонов, части которых могут повторятся. Для включения шаблона в шаблон используется конструкция
{FILE "inside.xtpl"}. Имя включаемого файла может быть динамическим и подключаться с помощью функции
assign_file следующим образом:
Шаблон:
<!– BEGIN:index –>
<p>Это тект во внешнем шаблоне
{FILE {inside}}
<p>Это тект тоже во внешнем шаблоне
<!– END:index
Второй шаблон (inside.xtpl):
<p>Это тект во внутреннем шаблоне
Контроллер:
$xtpl->assign_file('inside', 'templates/inside.xtpl');
Результат вывода:
<p>Это тект во внешнем шаблоне
<p>Это тект во внутреннем шаблоне
<p>Это тект тоже во внешнем шаблоне
Ну и напоследок упомяну еще об одной фишке. XTemplate также предоставляет возможность “рекурсивного” парсинга с помощью функции
$xtpl->rparse(‘index’); Рекурсивного в кавычках, потому что реальной рекурсии здесь нет, просто при вызове данной функции будут один раз распарсены все внутренние блоки блока index. Честно говоря, реального применить этот функционал мне нигде не удалось – за не надобностью.
Вот вкратце, основные возможности XTemplate. Не смотря на простоту и лаконичность, на самом деле, присутствует все необходимое для построения HTML-ля любой сложности. Также можно порекомендовать посмотреть и погонять примеры кода, которые включены в скачиваемый дистрибутив.