我正在将基于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中工作。如果这不可能,那么最干净的是什么?暂时支持这两个版本的方法?
答案 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}
没有人愿意保持这一点。