PHP*

Вышел Smarty 3 Final. Что нового?

FractalizeR 15 ноября 2010 в 17:51 7,8k
Совсем недавно вышла финальная версия популярного шаблонизатора Smarty 3. Нововведения этой версии:


— Переписан под 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Кб кода приятно радуют.
Проголосовать:
+54
Сохранить: