3

我正在将基于 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 中工作。如果这不可能,那么最干净的支持方法是什么两个版本都暂时?

4

2 回答 2

0

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

无论您在哪里定义这些常量,请使用

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

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

于 2012-08-15T20:29:47.713 回答
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}

没有人愿意维持这一点。

于 2012-08-15T20:44:32.567 回答