Угробил я еще один выходной и всё же добился желаемого результата. Оно конечно никому не надо наверное, кроме меня, но похвастаться хочется, а главное хочется услышать критику.
Так вот, идея в двух словах была такая - убрать нафиг логику из шаблона. Как оказалось, это уже реализовано в таком шаблонизаторе, как Xtemplate. Но я хотел сделать немного не то, а хотел найти золотую середину между нативными шаблонами и "классическими" шаблонизаторами.
И вот что получилось. Собственно все очень просто - используются всего 5 методoв. Вернее их шесть, но два взаимоисключающие.
В чем фишка. Вернее фишки.
1. В шаблонах совершенно нет логической составляющей. Это упрощает работу с ними, они немногословны и их можно править даже без сервера.
2. А посему ничего не нужно "учить". Нет там никакого синтаксиса шаблонов.
3. Для любителей натива - он никуда не делся. И при желании можно использовать в шаблонах всю мощь PHP.
4. Для них же - не нужно инициализировать переменные, всё делается автоматически. Можно не бояться нотисов.
5. Ну и на десерт для гурманов - работает наследование шаблонов.
6. А уж для полных адептов - можно запретить PHP в шаблонах и пользоваться псевдопеременными. Какими-нибудь {var}. Ну практически аналог XTemplate, только с наследованием и немного более простым синтаксисом.
Компиляции тут нету - в ней нет смысла. Он и так довольно шустрый, потому что маленький и нативный. :) А кэширование, это не профильная задача для шаблонизатора. Как и мультиязычность.
Как это работает. Берем два шаблона. Родитель:
parent.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IRB_Template Example</title>
</head>
<!-- Пример вывода переменной в родителя -->
<?=$var; ?>
<!-- Этот блок будет заменен шаблоном-дочкой -->
<!--// table_parent -->
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Пример наследования шаблона</td>
</tr>
</table>
<!--// table_parent end -->
<!-- Этим блоком можно управлять из дочки -->
<!--// example_parent -->
Пример управления родительским шаблоном <?php echo $i; ?><br />
<!--// example_parent end -->
<!-- А это неопределенная вроде как переменная. Нотиса не будет. -->
<?=$dummy; ?>
<!-- А это просто php, как в обычных нативных шаблонах -->
<?php if(date('H') > 8 && date('H') < 22) : ?>
<strong>Сейчас день</strong>
<?php else : ?>
<strong>Пора спать</strong>
<?php endif; ?>
</body>
</html>
И дочка:
child.html
<!--// table -->
<table border="1" >
<!--// row -->
<tr>
<!--// cell -->
<td><?=$num; ?></td>
<!--// cell end -->
</tr>
<!--// row end -->
</table>
<!--// table end -->
Ну и сам скриптик:
index.php
<?php
include 'irb_template.php';
$tpl = new IRB_Template('child');
$num = 25;
// Подготовка таблицы.
for ($i = 0; $i < 6; $i++)
{
for ($j = 0; $j < 5; $j++)
{
$num = (--$num < 0) ? ' ' : $num;
// Заряжаем переменные в ячейку
$tpl->assign('num', $num);
// Устанавливаем ячейку
$tpl->setBlock('cell');
}
// Устанавливаем ряд
$tpl->setBlock('row');
// Очищаем ячейки
$tpl->clearBlock('cell');
}
// Устанавливаем таблицу
$tpl->setBlock('table');
//////////////////////////////////////////////
// Это для гурманов - наследование шаблонов
//////////////////////////////////////////////
// Заряжаем переменную в родительский шаблон
$tpl->assign('var', 'Пример вставки переменной в родительский шаблон');
//Пример управления родительским шаблоном
for ($i = 1; $i <= 3; $i++)
{
$tpl->assign('i', $i);
$tpl->setBlock('example_parent');
}
// Рендерим шаблоны. parent(.html) - родитель, table_parent - блок, куда вставлять дочку
$tpl->extendsTpl('parent', 'table_parent')->renderTpl();
Вообще при желании можно отказаться от натива, есть вариант переключить шаблонизатор на псевдотеги. Такие:
{var}
{arr.val}
{file template}
Но теряется весь смак.
По ссылке есть архив с более полными примерами. На картинке результат. Кому интересно поковыряться, вот тут есть рабочий пример.
Что скажите? :)
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
