Php 将Smarty从Smarty v2升级到v3
我正在将一个基于PHP的站点从Smarty2升级到Smarty3。通过将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
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一直忽略的一点。