noms de variables dynamiques dans Smarty
-
22-09-2019 - |
Question
Je veux être accéder à certaines variables que j'ai attribué dynamiquement à partir de PHP dans Smarty, voici un exemple:
$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
La raison pour laquelle je veux y accéder est dynamique parce que j'appelle plusieurs versions d'une fonction qui inclut le code ci-dessus, ils utilisent tous le même modèle et donc ne veulent pas utiliser simplement le titre de $, le corps $ etc comme valus va entrer en conflit.
Étant donné que je sais que je veux accéder aux variables de titre et le corps sur la base du content_name je mis, comment puis-je obtenu cela dans Smarty?
La solution
Comme par mon commentaire sur l'utilisation d'un tableau au lieu de variables dynamiques, voici un exemple de la façon d'ajouter les vars à un tableau:
php:
$vars = array();
function whatever() {
global $vars;
$vars[] = array(
'firstname' => 'Mike',
'surname' => 'Smith'
);
}
$smarty->assign('vars', $vars);
Smarty:
{section name=loop loop=$vars}
Name: {$vars[loop].firstname} {$vars[loop].surname}
{/section}
Autres conseils
Même si ce poste est très ancienne, la answere donnée est accpeted mais pas answere pour la question. Son seul un autre oppertunity pour traiter principal problème.
La question est de savoir comment utiliser des variables dynamiques ...
pour l'échantillon donné, il devrait être quelque chose comme
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
Ceci est la façon dynamique à l'utiliser. Même si ce ne est pas la meilleure façon dans ce cas:)
Si vous avez type d'objets ou tableau multidimensionnel ... et vous aimez les itérer, vous devez prendre soin de la chaîne entière et non pas seulement le nombre ...
Par exemple:
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}
Mais en utilisant {$foobar{$i}}
sur un simple tableau fonctionnerait.
Pour tous ceux qui en ont besoin, en profiter.