我将项目从PHP 5.X迁移到7.0.4。与此步骤一起,我还必须将旧的Smarty 2.6.27升级到3.1.29。
由于某种原因,渲染的模板包含原始的智能序列,而不是预期的渲染版本。
示例:
的index.php:
include_once( "Smarty-3.1.11/libs/SmartyBC.class.php" );
class SmartyExtend extends Smarty {
function __construct() {
parent::__construct();
$this -> compile_dir = "template_c/";
}
}
$smarty = new SmartyExtend();
$smarty -> assign( "greeting", "Hello World" );
$smarty -> display( "my_template.tpl" );
my_template.tpl:
The greeting is: { $greeting }!
预期结果:
The greeting is: Hello World!
真实结果:
The greeting is: { $greeting }!
由于某种原因,分隔符不作为分隔符处理。我删除了缓存文件夹,使用SmartyBC.class.php而不是Smarty.class.php并尝试了其他我希望它可以帮助的东西。我不知道php7或smarty3是否是罪魁祸首。或者,也许我做错了什么?
我应该如何让smarty 3理解并识别分隔符?
答案 0 :(得分:0)
花了很多时间来了解smarty的作用。官方聪明的分隔符是" {"和"}"。但是,如果分隔符被空格包围,则它们不会被处理为分隔符。原因是可以轻松地将javascript代码编写到模板中。例如:
<html>
<head>
<script type="text/javascript" >
function init() {
alert( 42 );
}
</script>
</head>
<body>
<h1>{$greeting}</h1>
<p>{ $message }</p>
</body>
</html>
在这里,javascript代码{和}是不 smarty分隔符,因为它们是围绕它们的空格。另一方面,H1标签内的花括号,好吧,它们是。 P标签内的那些不再。
不幸的是,在打开之后和结束大括号之前添加空格,它是此项目中代码格式标准的一部分。那么,我们现在能做什么呢?
更改智能模板。删除{和}符号后面的空格。如果您只有很少的开始标记,这是一个很好的解决方案。
在我的项目中有7600个开放分隔符,所以我不得不选择另一个解决方案。我只是简单地重新定义了分隔符。我告诉smarty使用&#34; {&#34;和&#34; }&#34;分隔符而不是&#34; {&#34;和&#34;}&#34;。为此,我只需在SmartyExtend构造函数的末尾添加以下行:
$this -> left_delimiter = "{ ";
$this -> right_delimiter = " }";
此后一切都开始正常。
以前的解决方案存在的问题是,如果有人,尽管有编码标准,忘记在分隔符内添加空格,那么简洁版本不会被识别为分隔符,只能识别分隔符。也就是说,{ $dummy }
会起作用,但{$dummy}
不起作用。如果您事先不知道这是一个潜在的错误并且不知道该怎么做,那么找到这些错误是非常困难的。
幸运的是,smarty的这种行为可以被关闭。这很简单,只需将以下行添加到构造函数中,而不是修改分隔符:
class SmartyExtend extends Smarty {
function __construct() {
parent::__construct();
$this -> auto_literal = false; // this is the remedy :)
$this -> compile_dir = "template_c/";
}
}
幸运的是,这很好用。