2016-03-09 62 views
1

我將我的項目從PHP 5.X遷移到7.0.4。與這一步一起,我還必須將舊的Smarty 2.6.27升級到3.1.29。Smarty不識別分隔符

由於某些原因,呈現的模板包含原始的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瞭解並識別分隔符?

回答

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. 更改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/"; 
        }  
    } 
    

幸運能正常工作。