2016-03-09 6 views
1

Я перенес свой проект с 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 понять и распознать разделители?

ответ

0

Для понимания того, что делает smarty, потребовалось немало времени. Официальными разделителями смарт-карт являются «{» и «}». Однако, если разделитель окружен пробелами, то они не обрабатываются как разделители. Причина заключается в том, чтобы облегчить запись javascript-кода в шаблоны. Например:

<html> 
    <head> 
     <script type="text/javascript" > 
      function init() { 
       alert(42); 
      } 
     </script> 
    </head> 
    <body> 
     <h1>{$greeting}</h1> 
     <p>{ $message }</p> 
    </body> 
</html> 

Здесь, в яваскрипта коде {и} являются не Smarty разделители, потому что они являются пространства вокруг них. С другой стороны, фигурные скобки внутри тегов H1, ну, они есть. Те, что находятся в теге P, это , а не.

К сожалению, добавив пробелы после открытия и перед закрывающей фигурной скобкой, он был частью стандарта форматирования кода в этом проекте. Итак, что мы можем сделать сейчас?

  1. Измените шаблоны smarty. Удалите пробелы, которые находятся после символа {и до}. Это приятное решение, если у вас есть только несколько открывающих тегов.

  2. В моем проекте есть 7600 открывающих разделителей, поэтому мне пришлось выбрать другое решение. Я просто переформулировал разделители. Я сказал smarty использовать «{» и «}» разделители вместо «{» и «}». Для достижения этой цели, я просто добавил следующие строки в конце конструктора SmartyExtend:

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

    После этого все стало работать нормально.

  3. Проблема с предыдущим решением заключается в том, что если кто-то, несмотря на стандарты кодирования, забыл добавить пробелы внутри разделителей, то краткая версия не будет распознаваться как разделители, а только разнесенные. То есть { $dummy } будет работать, но {$dummy} не будет.Найти эти ошибки очень сложно, если вы заранее не знаете, что это потенциальная ошибка, и не знаете, что нужно для grep.

    К счастью это поведение smarty может быть отключено. Это довольно просто, добавьте следующую строку в конструктор вместо модификации разделителей:

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

К счастью, это работает отлично.

Смежные вопросы