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 标签中的那些又是 而不是

不幸的是,在左大括号之后和右大括号之前添加空格,这是该项目中代码格式标准的一部分。那么,我们现在可以做什么?

  1. 更改 smarty 模板。删除 { 之后和 } 符号之前的空格。如果您只有几个开始标签,这是一个很好的解决方案。

  2. 在我的项目中有 7600 个起始分隔符,所以我不得不选择其他解决方案。我只是简单地重新定义了分隔符。我告诉 smarty 使用“{”和“}”分隔符而不是“{”和“}”。为此,我简单地在 SmartyExtend 构造函数的末尾添加了以下几行:

    $this -> left_delimiter  = "{ ";
    $this -> right_delimiter = " }";
    

    在此之后一切开始正常工作。

  3. 前面的解决方案的问题是,如果有人尽管有编码标准,但忘记在定界符内添加空格,那么简明版本将不会被识别为定界符,只有间隔符.也就是说,{ $dummy } 有效,但 {$dummy} 无效。如果您事先不知道这是一个潜在的错误并且不知道要查找什么,则很难找到这些错误。

    幸运的是,smarty 的这种行为可以关闭。这很简单,只需将以下行添加到构造函数而不是修改分隔符:

    class SmartyExtend extends Smarty {
        function __construct() {
            parent::__construct();
            $this -> auto_literal = false;  // this is the remedy :)
            $this -> compile_dir = "template_c/";
        }       
    }
    

幸运的是,这工作正常。