Pregunta

$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') ;

ok tengo esta sección de código para recuperar y pasar a Smarty.

He registrado mi función make_menu como una función de usuario personalizada con sabelotodo, y en la plantilla tengo este código:

{make_menu parent_id=$P.menu_bilder_data}

Estoy de paso en serie $P archivo de índice. Se debe trabajar, pero me da nada, porque es una función recursiva, devuelve una matriz en lugar de ULS anidados impresos; ¿Cómo puedo solucionar este problema?

¿Fue útil?

Solución

El problema

El smarty- $> register_function () y {make_menu parent_id = $ P.menu_bilder_data} hace que la función a ser llamada con ($ params, & $ smarty)
donde $ params =

array(
  'parent_id' => array(
     0 => array(
       1 => > "menu item 1",
)

Esta no es la estructura de datos la función de espera.

Solución

Se puede llamar a la función sin utilizar "register_function"

{$P.menu_bilder_data|@make_menu}

La tubería "|" pasará el $ P [ 'menu_bilder_data'] como primer argumento de la función. Y la "@" hace que la tubería pase la matriz. Sin el "@" la función se llama para todos los elementos de la matriz.

Sólo un consejo

Cambiar el parámetro de $ padre (que es una matriz) a $ parent_id, Todos los datos de menú está disponible desde el menú 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>';
}

A partir de Smarty:

{0|make_menu}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top