Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/07/2011, 17:05
Avatar de Martriay
Martriay
 
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 15 años, 10 meses
Puntos: 5
Respuesta: Menu recursivo

Es que mi código es exacto al que está allí, pero bueno, lo muestro igual
Código PHP:
<?php
include ("mysqlconn.php");
$sql = "SELECT id, label, link_url, parent_id FROM secciones ORDER BY parent_id, id ASC"; 

$items = mysql_query($sql);
while (
$obj = mysql_fetch_object($items)) {
    if (
$obj->parent_id == 0) {
        
$parent_menu[$obj->id]['label'] = $obj->label;
        
$parent_menu[$obj->id]['link'] = $obj->link_url;
    } else {
        
$sub_menu[$obj->id]['parent'] = $obj->parent_id;
        
$sub_menu[$obj->id]['label'] = $obj->label;
        
$sub_menu[$obj->id]['link'] = $obj->link_url;
        
$parent_menu[$obj->parent_id]['count']++;
    }
}
mysql_free_result($items);
function 
dyn_menu($parent_array, $sub_array, $qs_val = "menu", $main_id = "nav", $sub_id = "subnav", $extra_style = "foldout") {
    
$menu = "<ul id=\"".$main_id."\">\n";
    foreach (
$parent_array as $pkey => $pval) {
        if (!empty(
$pval['count'])) {
            
$menu .= "  <li><a class=\"".$extra_style."\" href=\"".$pval['link']."?".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n";
        } else {
            
$menu .= "  <li><a href=\"".$pval['link']."\">".$pval['label']."</a></li>\n"; 
        }
        if (!empty(
$_REQUEST[$qs_val])) {
            
$menu .= "<ul id=\"".$sub_id."\">\n";
            foreach (
$sub_array as $sval) {
                if (
$pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) {
                    
$menu .= "<li><a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."\">".$sval['label']."</a></li>\n";
                }
            }
            
$menu .= "</ul>\n";
        }
    }
    
$menu .= "</ul>\n";
    return 
$menu;
}
foreach (
$parent_array as $pkey => $pval) {
    if (!empty(
$pval['count'])) {
        
$menu .= "  <li><a class=\"".$extra_style."\" href=\"".$pval['link']."?".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n";
    } else {
        
$menu .= "  <li><a href=\"".$pval['link']."\">".$pval['label']."</a></li>\n"; 
    }
    }
    if (!empty(
$_REQUEST[$qs_val])) {
    
$menu .= "<ul id=\"".$sub_id."\">\n";
    foreach (
$sub_array as $sval) {
        if (
$pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) {
            
$menu .= "<li><a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."\">".$sval['label']."</a></li>\n";
        }
    }
    
$menu .= "</ul>\n";
    }
    function 
rebuild_link($link, $parent_var, $parent_val) {
    
$link_parts = explode("?", $link);
    
$base_var = "?".$parent_var."=".$parent_val;
    if (!empty(
$link_parts[1])) {
        
$link_parts[1] = str_replace("&amp;", "##", $link_parts[1]);
        
$parts = explode("##", $link_parts[1]);
        
$newParts = array();
        foreach (
$parts as $val) {
            
$val_parts = explode("=", $val);
            if (
$val_parts[0] != $parent_var) {
                
array_push($newParts, $val);
            }
        }
        if (
count($newParts) != 0) {
            
$qs = "&amp;".implode("&amp;", $newParts);
        } 
        return 
$link_parts[0].$base_var.$qs;
    } else {
        return 
$link_parts[0].$base_var;
    }
}
echo 
dyn_menu($parent_menu, $sub_menu, "menu", "nav", "subnav");
?>
Y me devuelve esto:
Warning: Invalid argument supplied for foreach() in /home/a8437203/public_html/dynmenu.php on line 39

y el menú con un <li> vacío por cada subsección de 2do nivel (es decir 1.1.1), en lugar de posicionar esos <li> dentro del padre correspondiente y con su respectivo label.