Nomes de variáveis dinâmicas no Smarty
-
22-09-2019 - |
Pergunta
Quero acessar algumas variáveis que atribuí dinamicamente do PHP no Smarty, aqui está um exemplo:
$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
A razão pela qual desejo acessá-los dinamicamente é porque chamo várias versões de uma função que inclui o código acima, todas elas usam o mesmo modelo e, portanto, não querem simplesmente usar $title, $body etc., pois seus valores entrarão em conflito com uns aos outros.
Dado que sei que quero acessar as variáveis de título e corpo com base no content_name que defini, como posso conseguir isso no smarty?
Solução
De acordo com meu comentário sobre o uso de um array em vez de variáveis dinâmicas, aqui está um exemplo de como adicionar vars a um array:
php:
$vars = array();
function whatever() {
global $vars;
$vars[] = array(
'firstname' => 'Mike',
'surname' => 'Smith'
);
}
$smarty->assign('vars', $vars);
espertinho:
{section name=loop loop=$vars}
Name: {$vars[loop].firstname} {$vars[loop].surname}
{/section}
Outras dicas
Mesmo que esta postagem seja muito antiga, a resposta dada é aceita, mas não é uma resposta para a pergunta.É apenas uma outra oportunidade para lidar com o problema principal.
A questão é como usar variáveis dinâmicas...
para a amostra dada, deveria ser algo como
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);
Esperto
{$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
Esta é a maneira dinâmica de usá-lo.Mesmo que não seja a melhor maneira neste caso :)
Se você tiver algum tipo de objeto ou matriz multidimensional ...e você gosta de iterá-los, você tem que se preocupar com a string inteira e não apenas com o número...
Por exemplo:
PHP
$arr = [
"attr1" => "hello ",
"attr2" => "world ",
"attr3" => "my body is awesome"
];
$smarty->assign('foobar', $arr);
Esperto
{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}
Mas usando {$foobar{$i}}
em uma matriz simples funcionaria.
Para todos que precisam, aproveitem.