Вопрос

Я хочу иметь доступ к некоторым переменным, которые я динамически назначил из 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}} на простом массиве будет работать.

Всем, кому это нужно, наслаждайтесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top