将Smarty从Smarty v2升级到v3

时间:2012-08-15 20:18:37

标签: php smarty smarty3 smarty2

我正在将基于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 个答案:

答案 0 :(得分:0)

我的理解是这些常量将始终在v3中被解释为字符串。

无论您在何处定义这些常量,请使用

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

无论哪种方式,如果要升级,都需要修改代码。也许你应该权衡v2-> v3更新的优缺点并从那里开始。

答案 1 :(得分:0)

我没有意识到我在问题中描述的更改也适用于版本2:

{if $dynVal == $smarty.const.SOME_CONSTANT}dynamic content{/if}

我会坚持看看有什么其他答案,因为如果我不需要,我仍然不想更改模板,但我认为这可能是最干净的方法。改变。我担心我将不得不做这样的事情:

{if ($newSmarty && $dynVal == $smarty.const.SOME_CONSTANT) || (!newSmarty && 'dynVal' == SOME_CONSTANT) }dynamic content{/if}

没有人愿意保持这一点。