2014-09-24 18 views
0

在Smarty3我們可以寫一個包含其他變量錯誤寫含其他變量smarty3同時使用自定義分隔符

例如

<?php 
$smarty = new Smarty; 
$smarty->assign("x",1); 
$smarty->assign("foo_1","aka"); 
$smarty->template_dir = "./"; 
$smarty->display("tpl.tpl"); 

文件./tpl.tpl內容變量名變量名:

{$foo_{$x}}    
<!-- will output aka because foo_1 is assigned as aka --> 

並且直到現在聽起來不錯,但是如果我們使用自定義分隔符,smarty引擎會停止編寫包含其他變量可變

例如,如果我們使用< - [左分隔符和] - >如權利定界符

例如

<?php 
$smarty = new Smarty; 
$smarty->left_delimiter = '<--['; 
$smarty->right_delimiter = ']-->'; 
$smarty->assign("x",1); 
$smarty->assign("foo_1","aka"); 
$smarty->template_dir = "./"; 
$smarty->display("tpl.tpl"); 

並且當./tpl.tpl文件包含

<--[$foo_<--[$x]-->]--> 

錯誤返回

致命錯誤:未捕獲 - > Smarty編譯器:模板「。\ tpl.tpl」第1行出現語法錯誤「< - [$ foo_ < - [$ x] - >] - >」 - 意外「 - 」 < - 在電子商務拋出:\ Program Files文件\的EasyPHP-DevServer-14.1VC11 \ DATA \ localweb \項目\ VAC \源\智者\ sysplugins \ smarty_internal_templatecompilerbase.php 1號線

有何意見?

+0

它看起來像你的設置分隔符爲括號,而不是括號。 – jkushner 2014-09-24 13:41:58

+0

smarty允許我們使用自定義分隔符evev大括號@see http://www.smarty.net/docsv2/en/variable.left.delimiter.tpl – 2014-09-24 13:48:57

+0

@MohammedShannaq但你應該在一個地方編輯你的問題你有'< - - {'定界符和其他'< - ''' – 2014-09-24 13:49:34

回答

0

一些搜索和很多頭痛後,我找到了解決辦法

看看這個智者修改插件http://smarty.incutio.com/?page=VarVar

它是爲SMARTY2寫的,我只是修改它以SERV爲Smarty3

我的問題和解決被

<?php 
$smarty = new Smarty; 
function smarty_modifier_varvar($string) { 
    global $smarty; 
    if (empty($string)) { 
     return; 
    } 
    $array = explode(".", $string); 
    $var = array_shift($array); 
    $val = $smarty->tpl_vars[$var]->value;   
    if (count($array) == 0) { 
     return $val; 
    } else { 
     $idx = "['" . join("']['", $array) . "']"; 
     eval("\$return = \$val$idx;"); 
     return $return; 
    } 
} 




$smarty->left_delimiter = '<--['; 
$smarty->right_delimiter = ']-->';  
$smarty->assign("x",1); 
$smarty->assign("foo_1","aka"); 
$smarty->template_dir = "./"; 
$smarty->display("tpl.tpl"); 

./tpl.tpl文件是

<--["foo_$x"|varvar]--> 

輸出功率爲 又名 becuse $ FOO_1被指定爲又名

+0

爲什麼你使用自定義分隔符?它使得模板不易移植並且難以被其他開發人員理解。我不會推薦它,除非你有很強的理由這樣做 – 2014-09-24 14:47:21

+0

我使用自定義分隔符來避免與其他javascript和css碰撞而不需要使用文字 – 2014-09-25 06:40:33

+0

您是否閱讀過這樣的內容:{{literal} {/ literal}標籤通常不是因爲Smarty忽略了被空白包圍的分隔符。確保你的JavaScript和CSS花括號被空白包圍。這是Smarty 3的新行爲。 – 2014-09-25 06:42:19