Совсем недавно вышла финальная версия популярного шаблонизатора Smarty 3. Нововведения этой версии:
— Переписан под PHP5, с PHP4 больше не работает (требует PHP 5.1)
— Использует свой загрузчик классов
— Собственные настоящие парсер и лексер для шаблонов, что позволило ввести такие новшества, как сложная математика в шаблонах, сообщения об ошибках с точностью до строки и вложенные вызовы шаблонных функций
— Доступны объекты шаблонов
— Объекты данных:
— Поддержка потоков PHP
В этих случаях вначале будет произведен поиск зарегистрированного ресурса foo для загрузки шаблона. Если такового не обнаружится, Smarty проверит наличие потока foo://
— Наследование шаблонов
— Автоматическое игнорирование фигурных скобок "{", "}", если они окружены пробелами (больше не требуется окружать Javascript {literal}{/literal} или использовать другой маркер тега).
— Фильтр для вывода всех переменных шаблона по умолчанию
— Функции в шаблонах
— Управление кешированием на уровне элементов
— Почти полная совместимость со Smarty 2.
— Использование тега {php} по умолчанию отключено и считается устаревшим.
— Smarty теперь по умолчанию полагает, что кодировка шаблонов UTF-8.
Тройка получилась довольно легкой. Основной файл со всеми классами занимает всего 27Кб. Большая часть функционала, включая даже служебные теги вроде foreach вынесена в плагины и подгружается, если это требуется для компиляции шаблона. Однако следует иметь ввиду, что при самой компиляции будут загружены как минимум плагины smarty_internal_templatelexer + smarty_internal_templateparser.php, а это уже ~200Кб. Впрочем, на тяжело нагруженном сайте компилировать шаблоны, в общем-то, в нормальном режиме работы не требуется, поэтому 30Кб кода приятно радуют.
— Переписан под PHP5, с PHP4 больше не работает (требует PHP 5.1)
— Использует свой загрузчик классов
— Собственные настоящие парсер и лексер для шаблонов, что позволило ввести такие новшества, как сложная математика в шаблонах, сообщения об ошибках с точностью до строки и вложенные вызовы шаблонных функций
— Доступны объекты шаблонов
$tpl = $smarty->createTemplate('my.tpl');
$tpl->assign('foo','bar');
$smarty->display($tpl); // or $tpl->display();
— Объекты данных:
$data = new Smarty_Data;
$data->assign('foo','bar');
$smarty->display('my.tpl',$data);
$tpl = $smarty->createTemplate('my.tpl',$data);
— Поддержка потоков PHP
$smarty->display('foo:bar.tpl');
{include file="foo:bar.tpl"}
В этих случаях вначале будет произведен поиск зарегистрированного ресурса foo для загрузки шаблона. Если такового не обнаружится, Smarty проверит наличие потока foo://
— Наследование шаблонов
parent .tpl
<html>
<head>
<title>{block name=title}default title{/block}<title>
</head>
<body>
{block name=body}default body{/block}
</body>
</html>
child .tpl
{extends file="parent.tpl"}
{block name=title}My Child Title{/block}
{block name=body}My Child Body{/block}
Результат $smarty->display('child.tpl');
<html>
<head>
<title>My Child Title<title>
</head>
<body>
My Child Body
</body>
</html>
— Автоматическое игнорирование фигурных скобок "{", "}", если они окружены пробелами (больше не требуется окружать Javascript {literal}{/literal} или использовать другой маркер тега).
— Фильтр для вывода всех переменных шаблона по умолчанию
$smarty->registerFilter('variable','htmlspecialchars');
— Функции в шаблонах
{* определяем функцию *}
{function name=menu level=0}
<ul class="level{$level}">
{foreach $data as $entry}
{if is_array($entry)}
<li>{$entry@key}</li>
{menu data=$entry level=$level+1}
{else}
<li>{$entry}</li>
{/if}
{/foreach}
</ul>
{/function}
{* Создаем массив *}
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}
{* прогоняем его через функцию *}
{menu data=$menu}
<pre>
Вывод
* item1
* item2
* item3
o item3-1
o item3-2
o item3-3
+ item3-3-1
+ item3-3-2
* item4
— Управление кешированием на уровне элементов
{$foo nocache} - не кешировать содержимое этой переменной
{include file="foo.tpl" nocache} - не кешировать содержимое включаемого файла
— Почти полная совместимость со Smarty 2.
— Использование тега {php} по умолчанию отключено и считается устаревшим.
— Smarty теперь по умолчанию полагает, что кодировка шаблонов UTF-8.
Тройка получилась довольно легкой. Основной файл со всеми классами занимает всего 27Кб. Большая часть функционала, включая даже служебные теги вроде foreach вынесена в плагины и подгружается, если это требуется для компиляции шаблона. Однако следует иметь ввиду, что при самой компиляции будут загружены как минимум плагины smarty_internal_templatelexer + smarty_internal_templateparser.php, а это уже ~200Кб. Впрочем, на тяжело нагруженном сайте компилировать шаблоны, в общем-то, в нормальном режиме работы не требуется, поэтому 30Кб кода приятно радуют.