أسماء متغيرة ديناميكية في Smarty
-
22-09-2019 - |
سؤال
أرغب في الوصول إلى بعض المتغيرات التي قمت بتعيينها ديناميكيًا من 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
السبب في أنني أرغب في الوصول إليها ديناميكيًا هو أنني أسمي إصدارات متعددة من الوظيفة التي تتضمن الكود أعلاه ، فهي تستخدم جميعًا نفس القالب وبالتالي لا ترغب ببساطة في استخدام عنوان $ ، و $ ، وما إلى ذلك. بعضهم البعض.
بالنظر إلى أنني أعلم أنني أريد الوصول إلى متغيرات العنوان والجسم بناءً على المحتوى الذي قمت بتعيينه ، كيف يمكنني تحقيق ذلك في Smarty؟
المحلول
وفقًا لتعليقي على استخدام صفيف بدلاً من المتغيرات الديناميكية ، إليك مثال على كيفية إضافة Vars إلى صفيف:
بي أتش بي:
$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}
نصائح أخرى
حتى لو كان هذا المنشور قديمًا جدًا ، فإن الإجابة المحددة هي محملة ولكن ليس إجابة على السؤال. انها فقط oppertunity الأخرى للتعامل مع المشكلة الرئيسية.
والسؤال هو كيفية استخدام المتغيرات الديناميكية ...
بالنسبة للعينة المحددة ، يجب أن يكون مثل
بي أتش بي
$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
هذه هي الطريقة الديناميكية لاستخدامه. حتى لو لم تكن أفضل طريقة في هذه الحالة :)
إذا كان لديك نوع من الكائنات أو صفيف متعدد الأبعاد ... وترغب في تكرارها ، عليك أن تهتم بالسلسلة بأكملها وليس فقط الرقم ...
علي سبيل المثال:
بي أتش بي
$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}}
على صفيف بسيط ستعمل.
لجميع الذين يحتاجون إليها ، استمتع.