$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;我该如何解决这个问题?
答案 0 :(得分:2)
$ Smarty-&gt; register_function()和{make_menu parent_id = $ P.menu_bilder_data}导致函数被调用($ params,&amp; $ 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>';
}
来自smarty:
{0|make_menu}