Имена динамических переменных в Smarty - PullRequest
3 голосов
/ 24 января 2010

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

Ответы [ 2 ]

2 голосов
/ 24 января 2010

Согласно моему комментарию об использовании массива вместо динамических переменных, вот пример того, как добавить переменные в массив:

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}
0 голосов
/ 06 февраля 2018

Даже если этот пост очень старый, данный ответ принимается, но не отвечает на вопрос. Это всего лишь другая возможность решить главную проблему.

Вопрос в том, как использовать динамические переменные ...

для данного образца, это должно быть что-то вроде

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);

Smarty

{$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);

Smarty

{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}} в простом массиве будет работать.

Для всех, кому это нужно, наслаждайтесь.

...