Php 将Smarty从Smarty v2升级到v3

Php 将Smarty从Smarty v2升级到v3,php,smarty,smarty3,smarty2,Php,Smarty,Smarty3,Smarty2,我正在将一个基于PHP的站点从Smarty2升级到Smarty3。通过将require\u once('Smarty.class.php')替换为以下内容,我成功地在这两个版本上实现了大部分功能: @ include_once('SmartyBC.class.php'); if (class_exists('SmartyBC')) { $smarty = new SmartyBC(); //this is for use outside templates. inside te

我正在将一个基于PHP的站点从Smarty2升级到Smarty3。通过将
require\u 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中工作。如果这不可能,那么暂时支持这两个版本的最干净的方法是什么?

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

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

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

无论哪种方式,如果您想要升级,您都需要修改代码。也许您应该权衡v2->v3更新的利弊,然后从那里开始。

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

{if $dynVal == $smarty.const.SOME_CONSTANT}dynamic content{/if}
我会坚持下去,看看还有什么其他答案,因为如果不需要的话,我仍然希望不必更改模板,但我认为这可能是进行更改的最干净的方式。我担心我将不得不这样做:

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

没有人愿意维护这一点。

在四处搜索时,发现了这一点,您可能能够适应:他试图解决一个不同的问题,因为在v2中,普通php语法在{if}中工作块,但预编译是我没有想到的一个想法。我仍然需要更改模板以进行匹配,但我会进一步研究。谢谢。谢谢。我们追求的主要专业是模板继承,这是Django一直忽略的一点。