Smarty 不识别分隔符
Smarty doesn't recognise delimiters
我将项目从 PHP 5.X 迁移到 7.0.4。连同这一步,我还必须将旧的Smarty 2.6.27升级到3.1.29。
出于某种原因,呈现的模板包含原始的 smarty 序列,而不是预期的呈现版本。
示例:
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如何理解和识别分隔符?
我花了很长时间才理解 smarty 的作用。官方的 smarty 分隔符是“{”和“}”。但是,如果定界符被空格包围,则它们不会作为定界符处理。原因是为了方便将 javascript 代码写入模板。例如:
<html>
<head>
<script type="text/javascript" >
function init() {
alert( 42 );
}
</script>
</head>
<body>
<h1>{$greeting}</h1>
<p>{ $message }</p>
</body>
</html>
在这里,javascript 代码中的 { 和 } 是 而不是 聪明的定界符,因为它们周围是空格。另一方面,H1 标签内的大括号,嗯,它们是。 P 标签中的那些又是 而不是 。
不幸的是,在左大括号之后和右大括号之前添加空格,这是该项目中代码格式标准的一部分。那么,我们现在可以做什么?
更改 smarty 模板。删除 { 之后和 } 符号之前的空格。如果您只有几个开始标签,这是一个很好的解决方案。
在我的项目中有 7600 个起始分隔符,所以我不得不选择其他解决方案。我只是简单地重新定义了分隔符。我告诉 smarty 使用“{”和“}”分隔符而不是“{”和“}”。为此,我简单地在 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/";
}
}
幸运的是,这工作正常。
我将项目从 PHP 5.X 迁移到 7.0.4。连同这一步,我还必须将旧的Smarty 2.6.27升级到3.1.29。
出于某种原因,呈现的模板包含原始的 smarty 序列,而不是预期的呈现版本。
示例:
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如何理解和识别分隔符?
我花了很长时间才理解 smarty 的作用。官方的 smarty 分隔符是“{”和“}”。但是,如果定界符被空格包围,则它们不会作为定界符处理。原因是为了方便将 javascript 代码写入模板。例如:
<html>
<head>
<script type="text/javascript" >
function init() {
alert( 42 );
}
</script>
</head>
<body>
<h1>{$greeting}</h1>
<p>{ $message }</p>
</body>
</html>
在这里,javascript 代码中的 { 和 } 是 而不是 聪明的定界符,因为它们周围是空格。另一方面,H1 标签内的大括号,嗯,它们是。 P 标签中的那些又是 而不是 。
不幸的是,在左大括号之后和右大括号之前添加空格,这是该项目中代码格式标准的一部分。那么,我们现在可以做什么?
更改 smarty 模板。删除 { 之后和 } 符号之前的空格。如果您只有几个开始标签,这是一个很好的解决方案。
在我的项目中有 7600 个起始分隔符,所以我不得不选择其他解决方案。我只是简单地重新定义了分隔符。我告诉 smarty 使用“{”和“}”分隔符而不是“{”和“}”。为此,我简单地在 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/"; } }
幸运的是,这工作正常。