Как вызвать рекурсивную функцию в 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; как я могу исправить эту проблему?
1 ответ
Эта проблема
$Smarty->register_function() и {make_menu parent_id=$P.menu_bilder_data} заставляют вызывать функцию с помощью ($params, &$smarty)
где $params =
array(
'parent_id' => array(
0 => array(
1 => > "menu item 1",
)
Это не та структура данных, которую ожидает функция.
Решение
Вы можете вызвать функцию, не используя "register_function"
{$P.menu_bilder_data|@make_menu}
Труба "|" передаст $P['menu_bilder_data'] в качестве первого аргумента функции. И "@" заставляет канал передавать массив. Без "@" функция будет вызываться для всех элементов в массиве.
Просто совет
Измените параметр с $parent (который является массивом) на $ 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>';
}
Из умницы:
{0|make_menu}