كيفية استدعاء وظيفة التراكف في Smarty؟
سؤال
$sql = "select menu_id , menu_name , parent_id from menu " ;
$dbc->setFetchMode(DB_FETCHMODE_ASSOC);
$res = $dbc->query($sql);
while($row = $res->fetchRow()){
$menu[$row['parent_id']][$row['menu_id']] = $row['menu_name'];
}
function make_menu($parent)
{
global $menu ;
echo '<ul>';
foreach($parent as $menu_id=>$menu_name)
{
echo '<li>'.$menu_name ;
if(isset($menu[$menu_id]))
{
make_menu($menu[$menu_id]) ;
}
echo '</li>';
}
echo '</ul>';
}
$P['menu_bilder_data'] = $menu[0] ;
//menu :off
$smarty->register_function('make_menu' , 'make_menu') ;
حسنا، لدي هذا القسم من التعليمات البرمجية لاسترداد وتمرير إلى Smarty.
لقد سجلت بلدي make_menu
وظيفة كدالة مستخدم مخصصة مع Smarty، وفي القالب لدي هذا الرمز:
{make_menu parent_id=$P.menu_bilder_data}
أنا تمر $P
صفيف في ملف الفهرس. يجب أن تعمل ولكنها تعطيني شيئا لأنه وظيفة متكررة، فإنه يعيد مجموعة بدلا من ULS المتداخلة المطبوعة؛ كيف يمكنني إصلاح هذه المشكلة؟
المحلول
المشكلة
The $ smarty-> register_function () و {make_menu parent_id = $ p.menu_bilder_data} يؤدي الوظيفة المراد استدعاءها باستخدام ($ Params، & $ Smarty)
حيث $ params =
array(
'parent_id' => array(
0 => array(
1 => > "menu item 1",
)
هذا ليس هيكل البيانات التي تتوقعها الوظيفة.
المحلول
يمكنك استدعاء الوظيفة دون استخدام "Recorder_Function"
{$P.menu_bilder_data|@make_menu}
الأنابيب "|" سيتم تمرير $ p ['menu_bilder_data'] كحجة أول وظيفة. و "@" تسبب الأنبوب لتمرير الصفيف. بدون "@" سيتم استدعاء الوظيفة لجميع العناصر في الصفيف.
مجرد غيض
قم بتغيير المعلمة من $ الأصل (وهو صفيف) إلى $ Parent_ID، تتوفر جميع بيانات القائمة من القائمة العالمية.
function make_menu($parent_id)
{
global $menu;
if (!isset($menu[$parent_id])) {
return;
}
$nodes = $menu[$parent_id];
echo '<ul>';
foreach($nodes as $menu_id => $menu_name)
{
echo '<li>'.$menu_name ;
make_menu($menu_id) ;
echo '</li>';
}
echo '</ul>';
}
من Smarty:
{0|make_menu}