Имена динамических переменных в Smarty
-
22-09-2019 - |
Вопрос
Я хочу иметь доступ к некоторым переменным, которые я динамически назначил из PHP в Smarty, вот пример:
$content_name = 'body'
$smarty->assign('content_name',$content_name);
$smarty->assign($content_name.'_title',$title);
$smarty->assign($content_name.'_body',$body);
// assigned values
// $content_name = home
// $home_title = $title
// $home_body = $body
Причина, по которой я хочу получить к ним динамический доступ, заключается в том, что я вызываю несколько версий функции, включающей приведенный выше код, все они используют один и тот же шаблон и, следовательно, не хотят просто использовать $title, $body и т. д., поскольку их значения будут конфликтовать с друг друга.
Учитывая, что я знаю, что хочу получить доступ к переменным title и body на основе установленного мной content_name, как я могу добиться этого в Smarty?
Решение
Согласно моему комментарию об использовании массива вместо динамических переменных, вот пример того, как добавить переменные в массив:
php:
$vars = array();
function whatever() {
global $vars;
$vars[] = array(
'firstname' => 'Mike',
'surname' => 'Smith'
);
}
$smarty->assign('vars', $vars);
умник:
{section name=loop loop=$vars}
Name: {$vars[loop].firstname} {$vars[loop].surname}
{/section}
Другие советы
Даже если этот пост очень старый, данный ответ принимается, но не является ответом на вопрос.Это единственная возможность решить главную проблему.
Вопрос в том, как использовать динамические переменные...
для данного образца это должно быть что-то вроде
PHP
$content_name = 'body';
$title = 'hello ';
$body = 'world';
$smarty->assign('content_name',$content_name);
$smarty->assign($content_name.'_title',$title);
$smarty->assign($content_name.'_body',$body);
Умник
{$content_name} //body
{${$content_name}_title} //hello
{${$content_name}_body} //world
{${$content_name}_title}{${$content_name}_body} my {$content_name} is awesome
//hello world my body is awesome
Это динамический способ его использования.Хотя в данном случае это не лучший вариант :)
Если у вас есть какие-то объекты или многомерный массив...и вам нравится их перебирать, вам нужно заботиться обо всей строке, а не только о числе...
Например:
PHP
$arr = [
"attr1" => "hello ",
"attr2" => "world ",
"attr3" => "my body is awesome"
];
$smarty->assign('foobar', $arr);
Умник
{for $i=1 to 3}
{$foobar.{"attr$i"}} //works (whole name must be string var mix)
//{$foobar.attr{"$i"}} //fails
//{$foobar.attr{$i}} //fails
{/for}
Но используя {$foobar{$i}}
на простом массиве будет работать.
Всем, кому это нужно, наслаждайтесь.