ошибка записи имени переменной, содержащей другую переменную, в 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]-->]-->

ошибка возврата с

Неустранимая ошибка: 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

какие-либо советы?

0

Решение

После некоторых поисков и головной боли я нашел решение

взгляните на этот плагин-модификатор 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 назначается как ака

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]