我正在将一个基于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上有一个symlink,它指向版本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中工作。如果这不可能,那么暂时支持两个版本的最干净的可能方法是什么?
发布于 2012-08-16 04:44:33
我没有意识到我在问题中描述的更改也适用于版本2:
{if $dynVal == $smarty.const.SOME_CONSTANT}dynamic content{/if}我将继续等待其他答案的出现,因为如果没有必要,我仍然希望不必更改模板,但我认为这可能是进行更改的最干净的方式。我担心我将不得不做这样的事情:
{if ($newSmarty && $dynVal == $smarty.const.SOME_CONSTANT) || (!newSmarty && 'dynVal' == SOME_CONSTANT) }dynamic content{/if}没有人想要保持这一点。
发布于 2012-08-16 04:29:48
我的理解是,在v3中,这些常量总是被解释为字符串。
无论您在何处定义这些常量,都可以使用
$smarty->assign( 'constant', CONSTANT );无论哪种方式,如果您想要升级,都需要修改您的代码。也许你应该权衡v2->v3更新的优缺点,然后从那里开始。
https://stackoverflow.com/questions/11976629
复制相似问题