Smarty不承认分隔符

时间:2016-03-09 15:03:03

标签: smarty delimiter detection

我将项目从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理解并识别分隔符?

1 个答案:

答案 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标签内的那些不再

不幸的是,在打开之后和结束大括号之前添加空格,它是此项目中代码格式标准的一部分。那么,我们现在能做什么呢?

  1. 更改智能模板。删除{和}符号后面的空格。如果您只有很少的开始标记,这是一个很好的解决方案。

  2. 在我的项目中有7600个开放分隔符,所以我不得不选择另一个解决方案。我只是简单地重新定义了分隔符。我告诉smarty使用&#34; {&#34;和&#34; }&#34;分隔符而不是&#34; {&#34;和&#34;}&#34;。为此,我只需在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/";
        }       
    }
    
  4. 幸运的是,这很好用。