Обновление 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. Если это невозможно, каков самый чистый способ поддержки обе версии временно?


person undefined    schedule 15.08.2012    source источник
comment
искал вокруг, нашел это, возможно, вы сможете адаптировать: qfox.nl/notes/79   -  person Charles Forest    schedule 16.08.2012
comment
Он пытается решить другую проблему, потому что в версии 2 простой синтаксис php работает в блоке {if}, но идея прекомпиляции — это идея, о которой я не подумал. Мне все равно придется изменить шаблоны для соответствия целям, но я посмотрю на это дальше. Спасибо.   -  person undefined    schedule 16.08.2012


Ответы (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}

И никто не хочет это поддерживать.

person undefined    schedule 15.08.2012

Насколько я понимаю, эти константы всегда будут интерпретироваться как строки в v3.

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

$smarty->assign( 'constant', CONSTANT );

В любом случае вам нужно будет изменить свой код, если вы хотите выполнить обновление. Возможно, вам следует взвесить все за и против обновления v2->v3 и исходить из этого.

person Matthew Blancarte    schedule 15.08.2012
comment
Спасибо. Основное преимущество, которое нам нужно, — это наследование шаблонов, чего мне всегда не хватало в Django. - person undefined; 16.08.2012