Обновление Smarty с Smarty v2 до v3
Я нахожусь в процессе обновления сайта на основе PHP с Smarty2 до Smarty3. Мне удалось получить почти все, что работает на обеих версиях, заменив require_once('Smarty.class.php'
со следующим:
@ include_once('SmartyBC.class.php');
if (class_exists('SmartyBC')) {
$smarty = new SmartyBC();
//this is for use outside templates. inside templates, $smarty.version == 'Smarty-3.x.y.z'
$smartyVersion = 3;
}
//catch (Exception $e) {
else {
require_once('Smarty.class.php');
$smarty = new Smarty();
$smartyVersion = 2;
}
Затем у меня есть символическая ссылка в /usr/local/lib/php/Smarty, которая указывает либо на версию 2, либо на версию 3. Чтобы переключиться между ними, мне нужно только изменить символическую ссылку. Используя класс уровня совместимости (SmartyBC), почти все уже работает с обеими версиями. Я хотел бы поддерживать совместимость с обеими версиями, пока все не будет полностью протестировано, и внести как можно меньше изменений в старые шаблоны. Имея это в виду, вот фрагмент кода, который я пытаюсь обновить:
//someinclude.php:
define('SOME_CONSTANT', 'someConst');
//somepage.tpl:
{if $dynVal == SOME_CONSTANT}dynamic content{/if}
Это не работает в V3, но это будет:
{if $dynVal == $smarty.const.SOME_CONSTANT}dynamic content{/if}
Эти константы (их довольно много) используются повсеместно, поэтому в идеале я хотел бы найти способ заставить первый способ работать в версии 3. Если это невозможно, то какой самый чистый способ поддержки обе версии временно?
2 ответа
Я не понял, что изменение, которое я описал в вопросе, также работает с версией 2:
{if $dynVal == $smarty.const.SOME_CONSTANT}dynamic content{/if}
Я постараюсь посмотреть, какие еще ответы придут, так как я все же предпочел бы не менять шаблоны, если мне это не нужно, но я думаю, что это, вероятно, будет самым чистым способом внести изменения. Я волновался, что мне придется сделать что-то вроде этого:
{if ($newSmarty && $dynVal == $smarty.const.SOME_CONSTANT) || (!newSmarty && 'dynVal' == SOME_CONSTANT) }dynamic content{/if}
И никто не хочет поддерживать это.
Насколько я понимаю, эти константы всегда будут интерпретироваться как строки в v3.
Везде, где вы определяете эти константы, используйте
$smarty->assign( 'constant', CONSTANT );
В любом случае, вам нужно будет изменить свой код, если вы хотите обновить. Возможно, вам стоит взвесить все за и против обновления v2->v3 и перейти оттуда.