在使用自定义分隔符时,在smarty3中写入包含其他变量的变量名称时出错

时间:2014-09-24 13:37:28

标签: php smarty 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 -->

直到现在听起来不错,但是如果我们使用自定义分隔符,智能引擎会停止编写包含其他变量的变量

例如,如果我们使用&lt; - [as left delimiter and] - &gt;作为正确的分隔符

例如

<?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]-->]-->   

错误返回

致命错误:未捕获 - &gt; Smarty编译器:模板中的语法错误&#34;。\ tpl.tpl&#34;在第1行&#34;&lt; - [$ foo_&lt; - [$ x] - &gt;] - &gt;&#34; - 意外&#34; - &#34; &lt; - 在第1行的E:\ Program Files \ EasyPHP-DevServer-14.1VC11 \ data \ localweb \ projects \ vac \ source \ smarty \ sysplugins \ smarty_internal_templatecompilerbase.php中抛出

任何建议?

1 个答案:

答案 0 :(得分:0)

经过一番搜索和很多头痛我找到了解决方案

看一下这个聪明的修饰符插件http://smarty.incutio.com/?page=VarVar

它是为Smarty2编写的,我只是将其修改为服务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 被指定为又名