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 대신 배열을 반환합니다. 이 문제를 어떻게 해결할 수 있습니까?
해결책
문제
$ 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로 매개 변수를 변경하면 모든 메뉴 데이터는 Global $ 메뉴에서 사용할 수 있습니다.
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}
제휴하지 않습니다 StackOverflow