Главное меню
все форумы все темы форума добавить тему
Долгожданный Smarty 3.1
Как-то, утомившись ждать, я пропустил в конце июня выход новой (правда, пока еще релиз-кандидат) версии smarty. Да это и не удивительно - изначально она планировалась на конец февраля
Обещают много вкусного.
 
Из "животрепещущего" - наконец-то, вроде бы, пофиксили проблему с относительными путями, из-за которой приходилось патчить каждый новый релиз, чтобы он нормально работал.
 
Ввели класс для работы с key-value хранилищами, так что теперь не придется пользоваться собственным классом (точнее, его можно будет сильно упростить).
 
Изменили алгоритм проверки актуальности скомпилированной версии. Теперь можно настроить проверку только в том случае, если не найдена кэшированная копия. Думаю, это может быть полезным.
 
Появился новый тег
Smarty
{setfilter filter1|filter2|filter3....}...{/setfilter}

с его помощью можно применять различные фильтры к произвольным блокам кода. Пока еще не уверен в абсолютной его полезности, но выглядит интересно.
 
Столь же интересно и спорно выглядит опция escape_html, которая эскейпит все выводимые переменные.
 
Наконец-то все плагины переписаны с учетом существования других языков, кроме английского! Теперь они без допиливания должны нормально работать с многобайтовыми кодировками.
 
Прекращена поддержка обратной совместимости с версией 2.х. Для ее поддержки создан отдельный класс SmartyBC. Это радует - меньше "зоопарка" в синтаксисе, меньше старого кода.
 
Остальные нововведения меня не столь возбудили и больше касаются изменения внутреннего устройства, но и то что я перечислил, для меня, вполне показывает интересность данной версии.
Будем пробовать.
Мда... зато с путями ребята наворотили такого, что в пору за голову хвататься
Прежде всего, запретили при использовании методов fetch и display указывать пути начинающиеся с точки.
То есть вот так нельзя:
 
PHP
$smarty->fetch('../some.tpl');

 
при том, что вот так можно:
 
PHP
$smarty->fetch('sub/../../some.tpl');

 
Логику этого они пытались донести до меня на форуме, но либо я слишком глуп, либо сильно мешал языковой барьер, либо и то и другое сразу. В любом случае их увещевания про "неочевидность" и "небезопасность" на меня действия не возымели.
 
Это еще полбеды - перейти на абсолютные пути в коде не проблема... но что они удумали с с путями в шаблонах!
Как вы думаете, что сделает нижеприведенный код?
 
Smarty
{include file="../foo.tpl"}
{include file="bar.tpl"}
 

 
Ну очевидно вроде: первая строчка подключит файл foo.tpl, лежащий в родительском каталоге текущего каталога шаблонов ($template_dir), а вторая строчка подключит шаблон bar.tpl лежащий в $template_dir... Во всяком случае так было в прежних версиях.
 
Теперь же во главу угла поставлен каталог текущего шаблона. Думаете, пути будут отсчитываться от текущего шаблона? Ничего подобного!
 
Первая строчка будет отсчитываться от текущего шаблона, а вторая - от $template_dir. Все то начинается с точек отсчитывается от текущего, все что не с точек (ну за исключением абсолютных путей) - отсчитывается от $template_dir. Решение окончательное и обжалованию не подлежит
 
Будем с этим жить...
Loki, расскажите, как эти нововведения повлияли на новый релиз системы? Интересно, много ли мороки было. Какие модули претерпели изменений, в связи с новым смарти?
Ну кроме того, что я описал выше, изменения коснулись работы самих шаблонов. Появилась интересная возможность указывать из какого скина брать шаблон
 
Smarty
{include file="[skin]module/template.tpl"}

 
Я сделал так, чтобы список возможных скинов состоял из текущего и default скина. Так что теперь можно легко взять недостающий шаблон из базового дизайна
 
Smarty
{include file="[dafault]module/template.tpl"}

 
Более того, теперь удобно то, что смарти будет сам просматривать подключенные скины в поисках шаблона
 
Smarty
{include file="module/template.tpl"}
{*сначала проверит наличие шаблона в текущем скине, потом в скине default*}

 
со временем я планирую добавить к списку все доступные скины. Правда, это может сделать сильно неочевидной отладку для начинающих, так что пока не решил окончательно.
 
появилась возможность использовать для шаблонов различные хранилища. В LabCMS это пока не нашло отражения (и не уверен найдет ли), но сама возможность получить шаблон прямо, скажем, из БД - интересная.
 
Smarty
{include file="db:template.tpl"}

 
Появилась возможность "наследования" шаблонов, при котором они ведут себя подобно классам. Полезность этого я пока не понял, но сама функция интересная.
 
Немного доработали алгоритм проверки актуальности шаблонов. Раньше он работала в друх режимах:
включено, когда проверяется наличие шаблона, его дата, наличие скомпилированной копии и ее актуальности, а так же наличие кэша и его актуальности. Курочка по зернышку, но при большой посещаемости выливалось это в ощутимую нагрузку.
и выключено - когда проверялся только кэш и, при отсутствии кэша, скомпилированная копия. При этом после каждой правки шаблонов приходилось шаблоны принудительно перекомпилировать.
Теперь добавился алгоритм, который проверяет актуальность скомпилированной копии только в случае отсутствия кэша. Вроде все логично и удобно - если шаблон исправил, то код обновиться после истечения срока жизни кэша или принудительного его сброса.
Еще перекомпиляция должна происходить при обновлении версии смарти, но у меня сложилось впечатление что эта опция то ли не работает, то ли работает криво.
 
Так же порадовало что они включили поддержку многобайтовых кодировок во все плагины. Раньше некоторые плагины приходилось патчить руками при каждом обновлении. Благо, обновляли они их крайне редко. Но вроде я уже начал повторяться
со временем я планирую
добавить к списку все
доступные скины
Немного не понял. Разве в системе, кроме стандартного скина есть еще дэфолтные шаблоны?
Нет, базовый, он же стандартный, он же дефолтный - один
Но иногда бывает так, что в процессе жизни проекта дизайн меняется. Это приводит к такой ситуации:
Text

/skins
    /default
    /old_skin
        /my_module/temlate.tpl
    /new_skin
 

Переключились на новый скин, а шаблон temlate.tpl для модуля my_module не скопировали. В этом случае система попробует его подключить из скина new_skin, затем из default (где его тоже нет, так как модуль не из стандартной поставки), а потом выбросит ошибку что, в принципе, правильно. Но есть идея заставить ее просмотреть и другие каталоги скинов. В этом случае она шаблон все же подключит.
О, вот теперь понял