在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中抛出
任何建议?
答案 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 被指定为又名