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

    Совсем недавно вышла финальная версия популярного шаблонизатора 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Кб кода приятно радуют.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 74
    • +2
      Использование тега {php} по умолчанию отключено и считается устаревшим.

      Наконец-то!
      • +6
        — Автоматическое игнорирование фигурных скобок "{", "}", если они окружены пробелами (больше не требуется окружать Javascript {literal}{/literal} или использовать другой маркер тега).


        Ад для верстальщиков с jQuery и вообще Javаsscript окончен. Ура товарищи! Ну и за lazyload огромное спасибо, в паре с предкомпиляцией и раздельным кешированием должно быть ооочень шустро.
        • +1
          Не думаю, что создавать javascript и css в html-шаблонах — хорошее занятие. Джаваскрипт должен быть ненавязчивым. Стили, в общем-то тоже ))

          Так что это нововведение скорее деградация…

          Lazyload для плагинов вроде как и во второй версии был…
          • 0
            Деградация??
            • 0
              Да. Это как бы подталкивает: «Да да, мужики. Давайте, пишите свои js и css прямо в шаблонах».
              Гораздо приятнее оформить js-код в виде плагина (jquery или любым другим способом, который по нраву). И подключать на события к элементам по классу или id (как обычно и делается).

              Параметры можно передавать либо в, либо в свойствах элементов, на которые вешаются события… Тут уж по вкусу и цвету…

              А так получается, что происходит разделение на MVC в бакенде, но во фронтэнде остается полная каша.

              Это все ИМХО… Но как правило такая интеграция стилей и js в html до добра не доводит…
              • 0
                Вообще-то, мне кажется, это называется не «деградация», а «совместимость». С какой стати разработчики Smarty должны диктовать свою волю верстальщикам? Конечно, удобно, когда весь JS во внешних файлах и ничего в HTML не мешает. А если что-то все же кому-то нужно вставить именно в шаблон?
                • –2
                  Я не спорю, что это поможет новичкам быстрее освоить смарти. Но также и загонит их в ловушку турдукен-кода…

                  Впрочем вижу и положительную сторону этой медали. Будет проще вставить в шаблон великое многообразие счетчиков посещений )))

                  > С какой стати разработчики Smarty должны диктовать свою волю верстальщикам?

                  Нет, не должны… Они надеяться на сознательность ))) Которой у новичков нет…

                  > А если что-то все же кому-то нужно вставить именно в шаблон?

                  Тогда стоит пересмотреть архитектуру приложения )) И сделать немного по другому ))
                  • 0
                    Авторы jQuery тоже турдукены? :_)
                    • 0
                      docs.jquery.com/How_jQuery_Works
                      Посмотрите исходник страницы
                      • –2
                        Ахаха )))

                        И да, и нет )))

                        С одной стороны код действительно в коде страницы. С другой стороны так было делать совсем не обязательно ))) Этот код можно было бы вынести в отдельный файл и никто бы не потерял.

                        Возможно, что данное явление — лишь рабочий момент ))) Этот отрывок кода явно не для продакшена )))

                        Например:

                        //var items = [];
                        //source = source.replace(/\s*<(link|script).*?>\s\*/g, function(m){
                        //items.push(m);
                        //return "";
                        //}).replace("</head>", items.join("") + "</head>")
                        //*/

                        Или как Вам это?:

                        $(window).load(function(){
                        var doc = iframe.contentDocument || iframe.contentWindow.document;
                        source = source
                        .replace(/<script>([^<])/g,"<script>window.onload = (function(){\ntry{$1")
                        .replace(/([^>])<\/sc/g, '$1\n}catch(e){}});</sc');

                        source = source
                        .replace("</head>", "<style>html,body{border:0; margin:0; padding:0;}</style></head>");

                        doc.open();
                        doc.write( source );
                        doc.close();
                        });
                        • +1
                          А Артемий Лебедев тоже турдукен? :)
                          www.artlebedev.ru/

                          Вы вообще по гуглу ходили? :)

                          — БОЖЕ!!! Это не ЗЕМЛЯ!!! Это планета ТУРДУКИЯ!!! МАААМАААА!!!
                          • 0
                            Я искренне верю, что Артемий Лебедев занимается JS программингом ;) Особенно он пишет JS для своего сайта.
                            • 0
                              А причем тут это?
                              • 0
                                Действительно… ))
                                • –1
                                  Что действительно? Вы полагаете, ведущая российская студия дизайна набирает неграмотных дизайнеров, которые даже свой собственный сайт не могут нормально сделать? :)
                • 0
                  Могу привести пример, где интеграция JS и HTML дала обратный эффект. Скорость разработки выросла, понимание кода улучшилось, количество ошибок уменьшилось, код стал проще и понятнее. Нахождение ошибки не вызывает труда в любой промежуток времени, хоть через два года после создания функционала.

                  Что я делаю не так?
                  • 0
                    1. Сколько человек трудится над проектом? Ваш дизайнер понимает, что происходит в HTML?
                    2. Что, если нужно применить этот код на другой странице?
                    • 0
                      1. Конкретно HTML занимаются 2 человека. Дизайнер понимает. Но при чем тут дизайнер?
                      2. Просто берите и используйте его.
                      • 0
                        1. Просто не все дизайнеры владеют Javascript-ом… Или они меня обманывали? )))
                        2. Я предпочитаю просто подключать нужный плагин… ;)
                        • 0
                          1. Дизайнеры вообще не обязаны владеть JS. Это прямая обязанность кодера.
                          2. Просто подключить плагин для интерфейсного решения не получится.
                          • 0
                            1. Отлично, так а зачем же тогда заставлять дизайнера видеть этот JS-код? ИМХО, ни к чему…

                            2. Можно подключить JS-файл с дополнительным кодом, который и будет инициализировать плагин. Это можно делать где-нибудь в контроллере или команде. Возможно, добавлять еще какой-то функционал. Зато шаблон будет чистый.
                            И если человек, не разбирающийся в JS залезет в последующем в этот шаблон, ему будет проще разобраться. И больше вероятность, что он ничего не сломает ))

                            Для тех же целей и используется смарти. Для того же и запретили использовать {php}{/php}.
                            • 0
                              php тег не запретили, а просто отключили по умолчанию. И я думаю, скорее из-за безопасности, чем для навязывания своей точки зрения.
                              • 0
                                1. Дизайнер то и HTML не должен видеть. Это не его задача.
                                2. Это теория. На практике все гораздо хуже. Тонны настроечных скриптов, вызовов функций, кода по сращиванию плагинов в единый функционал.

                                А теперь сделайте нормальный ненавязчивый JS для полностью AJAX-ового интерфейса :) Вы знаете такой продукт?
                  • 0
                    * либо в <input type=«hidden» id=«my_key» value=«my_value» />
                • 0
                  Ну, для избавления от ада использовался переход на другие указатели смати-тэгов, вместо одиночных фигурных скобок.

                  Или вынос основной части джаваскрипта во внешние файлы. Или упомянутый в статье {literal}, наконец, где «уже никак».
                  • 0
                    Речь шла о смаРти-тэгах, конечно
              • 0
                Бездумно заменить Smarty 2.6 на 3, всё-таки, у меня сегодня не вышло, на что-то ругалось.
                Но нововведения не могут не радовать.
                • 0
                  Почитайте SMARTY2_BC_NOTES из дистрибутива. Наверняка, там найдется причина.
                • +1
                  Самое забавное что новые фичи убивают суть шаблонизатора — добавление функции, сложная математика.

                  А вот за наследование шаблонов спасибо авторам, молодцы.
                  • 0
                    Ни разу не придумал, как можно наследование использовать.
                    • +1
                      а как без него вообще шаблонизатор использовать-то можно?)
                      • +1
                        Использовали же во второй версии.
                    • 0
                      «функции» раньше заменялись многократным include file, например, в нутри итератора типа foreach или section.

                      Сложную математику, опять же, можно было писать и ранее с помощью math (если всё равно все исходные параметры передаются в шаблон, почему бы некую финальную величину и не посчитать уже прямо в шаблоне?)
                    • +10
                      Отделили представление от кода. Окончательно. Отделили. ппц.
                      • +8
                        а по-моему своего кучу налепили. минусуйте, но я считаю, что смарти это «компилятор условного кода в пхп на пхп». потому не понимаю его прелестей.
                        • 0
                          Я о том же. Только желчи больше.
                          • –1
                            Я согласен с Вами, мы не используем Smarty в новых проектах.

                            НО! Очень часто в жизни используются опенсорс разработки которые шаблонизируют как раз на Смарти, и те улучшения которые заявлены, действительно упрощают труд в первую очередь верстальщика, а уже потом интегратора.
                            • 0
                              А что вы используете в новых проектах?
                            • 0
                              а почему не предоставить верстальщику нормальный апи рнр шаблонизатоора? и за 10 лет опыта веб разработок ни разу не сталкивался с верстальщиком, кто б не знал пыха. уж или уж можно запомнить… остальное все одинаковое.
                      • +6
                        Шаблонизатор для шаблонизатора.
                        • +1
                          Оптимизацию по скорости делали? У меня на 50-ти килобайтном шаблоне третья версия бета примерно пятая или шестая тормозила раза в три-четыре по сравнению со второй версией.

                          Предугадывая вопросы отвечу.
                          Это уникальный шаблон, его переделать на много мелких файлов не получится.
                          Нет, содержимое не покажу.
                          • 0
                            Тормозила компиляция или отображение? Если компиляция, то это несущественно. Она ведь один раз всего выполняется и все, больше не нужна. Главное, чтобы отрисовка не тормозила.
                            • 0
                              Я смарти не первый год знаю.
                              Как раз все плохо с отрисовкой. Внутренние функции в третьем смарти компилируются в нечто невообразимое.
                              • 0
                                Факты можно?
                                • 0
                                  Можно, вот вам код, который делает компилятор Smarty2
                                  <?php /* Smarty version 2.6.26, created on 2010-11-16 14:48:36
                                  compiled from index2.tpl */ ?>
                                  <?php if (!function_exists('smarty_fun_foo')) { function smarty_fun_foo(&$smarty, $params) { $_fun_tpl_vars = $smarty->_tpl_vars; $smarty->assign($params); ?>
                                  <?php if (! is_null ( $smarty->_tpl_vars['exec'] )): ?>
                                  <?php $_from = $smarty->_tpl_vars['data']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array'); }if (count($_from)):
                                  foreach ($_from as $smarty->_tpl_vars['d']):
                                  ?>
                                  <div><?php echo $smarty->_tpl_vars['d']; ?>
                                  </div>
                                  <?php endforeach; endif; unset($_from); ?>
                                  <?php endif; ?>
                                  <?php $smarty->_tpl_vars = $_fun_tpl_vars; }} smarty_fun_foo($this, array('exec'=>null)); ?>

                                  <?php smarty_fun_foo($this, array('data'=>$this->_tpl_vars['data'],'exec'=>1)); ?>

                                  Скорость 10000 итераций: ~0.014

                                  Вот это делает Smarty3
                                  <?php /* Smarty version Smarty-3.0.4, created on 2010-11-16 14:49:08
                                  compiled from "./templates/index3.tpl" */ ?>
                                  <?php /*%%SmartyHeaderCode:1315927594ce27dc484bdd9-24256128%%*/if(!defined('SMARTY_DIR')) exit('no direct access allowed');
                                  $_smarty_tpl->decodeProperties(array (
                                  'file_dependency' =>
                                  array (
                                  'bdf3642ce8219fafc40cbd62ea1ae69117a48c72' =>
                                  array (
                                  0 => './templates/index3.tpl',
                                  1 => 1289907677,
                                  2 => 'file',
                                  ),
                                  ),
                                  'nocache_hash' => '1315927594ce27dc484bdd9-24256128',
                                  'function' =>
                                  array (
                                  'foo' =>
                                  array (
                                  'parameter' =>
                                  array (
                                  'nocache' => false,
                                  ),
                                  'compiled' => '
                                  <?php $_smarty_tpl->tpl_vars[\'d\'] = new Smarty_Variable;
                                  $_from = $_smarty_tpl->getVariable(\'data\')->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, \'array\');}
                                  if ($_smarty_tpl->_count($_from) > 0){
                                  foreach ($_from as $_smarty_tpl->tpl_vars[\'d\']->key => $_smarty_tpl->tpl_vars[\'d\']->value){
                                  ?>
                                  <div><?php echo (isset($_smarty_tpl->tpl_vars[\'d\']->value)? $_smarty_tpl->tpl_vars[\'d\']->value: null);?>
                                  </div>
                                  <?php }} ?>',
                                  'nocache_hash' => '1315927594ce27dc484bdd9-24256128',
                                  'has_nocache_code' => false,
                                  ),
                                  ),
                                  'has_nocache_code' => 0,
                                  )); /*/%%SmartyHeaderCode%%*/?>

                                  <?php Smarty_Internal_Function_Call_Handler::call ('foo',$_smarty_tpl,array('data'=>$_smarty_tpl->getVariable('data')->value),'1315927594ce27dc484bdd9_24256128',false);?>


                                  Скорость выполнения: ~0.065
                                  • 0
                                    Выложите на обменник, пожалуйста. Я бы глянул поближе.
                                    • +1
                                      ага и оригинальную .tpl пожалуйста
                            • 0
                              Да, еще, скорость работы функций смарти3 гораздо хуже примитивного defun/fun в смарти2. Это исправили, никто не знает?
                              • –1
                                Какой кошмар. Оно лагает еще больше.
                                • +9
                                  Smarty всё больше соответствует «слогану» «PHP на PHP»
                                  • +2
                                    думаю, что этому слогану больше соответствует zend framework )) (хоть и не в тему)
                                    • 0
                                      а кто то же еще и смарти к зенду прикручивает =)))))))) однажды столкнулся :-D
                                  • +2
                                    Продвинутый оператор ЯП Smarty ищет работу за еду.
                                    • +13
                                      Осталось реализовать eval и go to.
                                      • +1
                                        А зачем это нечто вааще нужно?

                                        В реальном бизнес-процессе почему его кто-то может использовать?

                                        Типа чтобы верстальщики не натворили бед? Ога, с тегом {php} походу не натворят :)

                                        Плюс неужели есть реальные бизнес-кейсы где за косяки верстальщиков им люлей не отвешивают?

                                        Хотя почитав www.smarty.net/best_practices начинаю понимать, что хотели товарищи изначально.

                                        А по поводу тормозов — у кого они есть, попробуйте дебаг выключить и кэш включить.
                                        • +5
                                          я так понимаю, что пост для тех, кто использует Smarty. а посему обращаюсь к тем, кто ругает этот шаблонизатор: почему бы Вам, уважаемые гении программирования, просто не пройти мимо. пост не про сравнительные характеристики технологий, но конкретно по новшествам конкретного шаблонизатора.
                                          автору топика респект. сам бы я долго переводил и ползал по форуму Smarty в поисках примеров для лучшего понимания нововведений.
                                          на самом деле новшеств больше, но автору удалось выделить основные моменты! особое спасибо за наследование и функции в шаблонах. теперь меньше кода, более гибче, читабильнее и быстрее, ибо кеширование отдельных элементов при правильном использовании!
                                          и да! отдельное спасибо разработчикам за отсутствие экранов для javascript, признаюсь, очень свободно вздохнул!
                                          • +1
                                            Качайте исходники и открывайте файл README, в нем все нововведения описаны.
                                            • +1
                                              Экраны решались просто: {{ }}
                                              • +1
                                                этого не знал. в мануале такого не нашёл. может мануал старый читал. спасибо за подсказку!
                                                • +2
                                                  Ну дык надо просто переопределить left_delimiter и right_delimiter :)
                                            • 0
                                              Теперь останется еще дождаться обновления SmartyPDT для Eclipse… :)
                                              • 0
                                                Отлично, многого давненько не хватало.
                                                • –2
                                                  Ну не нравится мне смарти, мне кажется лишний этот «парсер». Мне почему-то больше Zend_View импонирует. Вот здорово было бы иметь шаблонизатор как в django, но чтобы он не на PHP был ;)
                                                  • +3
                                                    есть аналог ninja — twig [twig-project.org]
                                                    • 0
                                                      Видел порт Django Templates на PHP но сам не пробовал https://github.com/speedmax/h2o-php
                                                    • –2
                                                      Очень неприятно осознавать, но Smarty ветки 2 отжирал на классе функций preg порядка 2000 вызовов и приложение (ориентированное на highload) теряло производительность на 28-35%. Вот такая грустная статистика…
                                                      • 0
                                                        А зачем приложение ориентированное на highload пользовалось шаблонизатором вообще или хотя бы Smarty в частности? Хоть бы blitz юзали тогда уже?
                                                        • 0
                                                          Смею предположить, что когда приложение только создавалось еще не было очевидно, что оно будет highload )))
                                                        • 0
                                                          И еще вопрос — откуда там preg_*? Компиляция шаблонов? Тогда это странный highload, где шаблоны постоянно компилировались на сервере.
                                                          • 0
                                                            Возможно профилирование проводилось на не производственных серверах без скомпилированных шаблонов.

                                                            Спасибо за замечание. Попробую провести профилирование на скомпилированных шаблонах.
                                                            • 0
                                                              А я вдобавок советую проверить кэширование и откэшировать всю статику, какую только можно. Возможно это выльется в десяток display() вместо одного на страницу, но больше половины — с условным кэшированием, когда все время, кроме исхода времени жизни кэша, или сброса всего кэша, в статических блоках будет напрямую отдаваться готовая статика из файловой системы.
                                                        • 0
                                                          настоящие парсер и лексер для шаблонов
                                                          Ну вот, теперь как у белых людей
                                                          • –1
                                                            А производительность как?
                                                            Smarty 2 работал до 4 раз медленнее, чем чистый PHP.
                                                            Как теперь дела с этим?

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.