2010-01-24 6 views
2

Я хочу быть доступ к некоторым переменным я присвоенный динамически из PHP в Smarty, вот пример:Динамические имена переменных в 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 и т. д., так как их valus будет конфликтовать друг с другом.

Учитывая, что я знаю, что хочу получить доступ к переменным названия и тела на основе содержимого content_name, которое я установил, как я могу достичь этого в smarty?

+2

Люди по-прежнему используют smarty? – carl

+0

Думали ли вы о назначении переменных в массив, который затем можно было бы зацикливать на Smarty? –

+1

@cvondrick я все еще использую smarty - почему бы и нет? –

ответ

2

В соответствии с моим комментарием об использовании массива вместо динамических переменных, вот пример того, как добавить ВАР в массив:

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

Это сделало это, ура! –

0

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

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

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

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

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