문제

$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}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top