в 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]-->]-->
ошибка возврата с
Неустранимая ошибка: Uncaught -> Smarty Compiler: синтаксическая ошибка в шаблоне «. \ Tpl.tpl» в строке 1 «<- [$ foo_<- [$ x] ->] -> «- Неожиданно» — » <- добавляется в E: \ Program Files \ EasyPHP-DevServer-14.1VC11 \ data \ localweb \ projects \ vac \ source \ smarty \ sysplugins \ smarty_internal_templatecompilerbase.php в строке 1
какие-либо советы?
После некоторых поисков и головной боли я нашел решение
взгляните на этот плагин-модификатор smarty 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 назначается как ака
Других решений пока нет …