Представляю вашему вниманию PHP шаблонизатор, который я разрабатывал несколько лет и только недавно выложил в сеть.
Как все началось и зачем вообще нужен еще один шаблонизатор?
Smarty и другие популярные шаблонизаторы мне показались слишком громоздкими для простых проектов и я решил разработать собственный шаблонизатор. Первая версия появилась еще в 2004 году. В процессе разработки интернет проектов я постоянно внедрял новые идеи и прочие улучшения. В настояший момент движок шаблонизатора состоит из всего одного файла и все равно имеет ряд уникальных возможностей.
На сайте separate.esud.info/ вы можете скачать исходный код. Также там доступна подробная документация всех функций на трех языках – русском, английском и немецком. Я надеюсь что проект заинтересует людей и будет в будущем активно развиваться. Поэтому код я выложил в Github на сайте github.com/esud/separate
Подробное описание вы найдете на сайте ru.separate.esud.info/documentation/
Ниже я коротко опишу ключевые возможности.
Заранее должен сказать что данный шаблонизатор хоть и является относительно быстрым, но тем не менее у меня не было цели сделать его самым быстрым в исполнении. В первую очередь у меня была цель спроектировать его удобным, простым и уникальным в использовании.
Самое простое что есть – присвоение значений.
Шаблон (index.htm):
${MY_VARIABLE}
PHP код:
require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('MY_VARIABLE', 'my value');
$t->display();
Вывод:
my value
Можно генерировать списки с динамической информацией.
Шаблон (index.htm):
<ul>
<!-- BEGIN my_block -->
<li>${ROW_NUMBER}</li>
<!-- END my_block -->
</ul>
PHP код:
require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
for($row = 1; $row <= 3; $row++)
{
$myBlock = $t->fetch('my_block');
$myBlock->assign('ROW_NUMBER', $row);
$t->assign('my_block', $myBlock);
}
$t->display();
Вывод:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
Одна из уникальных возможностей, это форматирование значений. В данном случае форматер «Time» конвертирует Unix-Timestamp значение в читаемое время.
Шаблон (index.htm):
${(Time)UNIX_TIMESTAMP}
PHP код:
require_once './separate/SeparateTemplate.php';
require_once './separate/formatter/TimeFormatter.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('UNIX_TIMESTAMP', time());
$t->display();
Вывод:
08:55
Также можно использовать собственные классы, которые будут форматировать значения. В ниже указанном примере форматер ToUpper преобразует строковую информацию в верхний регистр.
Шаблон (index.htm):
${(ToUpper)MY_VARIABLE}
PHP код:
require_once './separate/SeparateTemplate.php';
class ToUpperFormatter extends AbstractValueFormatter
{
public function formatValue($value)
{
return strtoupper($value);
}
}
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('MY_VARIABLE', 'my value');
$t->display();
Вывод:
MY VALUE
Кроме SeparateTemplate.assign(...) есть и другие методы присвоения значений. Например SeparateTemplate.assignForBlock(...). Этим методом можно присвоить значение к переменной, которая находится в определенном блоке (включая дальнейшие под-блоки). Переменные, находящиеся в других блоках, игнорируются. Метод SeparateTemplate.assignForGlobal(...) присваивает значения ко всем переменным, независимо от того, в каком блоке они находятся.
В основной шаблонный файл можно интегрировать дополнительные файлы, например:
Header-файл (header.htm):
<html>
<body>
Footer-файл (footer.htm):
</body>
</html>
Код основного шаблона (index.htm):
<!-- INCLUDE header.htm -->
<p>Привет</p>
<!-- INCLUDE footer.htm -->
Вывод:
<html>
<body>
<p>Привет</p>
</body>
</html>
В шаблонном коде также поддерживаются IF-условия:
<!-- IF '${MY_VARIABLE}' == 'hello' -->
HTML код...
<!-- END IF -->
С помощью параметров можно установить любые настройки в самом коде шаблона. В PHP коде все доступные параметры прочитываются методом SeparateTemplate.getParameters().
Шаблон (index.htm):
<!-- PARAMETER NUMBER_OF_ROWS '100' -->
PHP код:
require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
print_r($t->getParameters());
Вывод:
Array
(
[NUMBER_OF_ROWS] => 100
)
PS: Это моя первая статья на сайте habrahabr.ru. Если она вам понравилась и вы хотите поддержать распространение шаблонизатора Separate, то я буду очень рад если вы поставите ей +1. В комментах я постараюсь ответить на все ваши вопросы.
Автор: esudnik