Foros del Web » Programando para Internet » PHP »

Menu recursivo

Estas en el tema de Menu recursivo en el foro de PHP en Foros del Web. Hola qué tal, traté de usar este código: http://www.finalwebsites.com/tutorials/dynamic-navigation-list.php para un menú recursivo en base a una tabla MySql pero me tira muchos errores, como ...
  #1 (permalink)  
Antiguo 29/07/2011, 14:28
Avatar de Martriay  
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 14 años
Puntos: 5
Menu recursivo

Hola qué tal, traté de usar este código:

http://www.finalwebsites.com/tutorials/dynamic-navigation-list.php

para un menú recursivo en base a una tabla MySql pero me tira muchos errores, como que faltan brackets (que ya lo solucioné, falta cerrar un foreach), después me dice que están mal los parámetros.

Quisiera saber si podrían decirme si a alguien le funciona y si cambió algo qué cambio.

Gracias
  #2 (permalink)  
Antiguo 29/07/2011, 15:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Menu recursivo

Con la poca información que das es imposible deducir que haces exactamente mal.

Ver el código en el que te basas no dice nada en realidad, si adaptarlo directamente no funciona, entonces tampoco funciona que lo muestres.

Lo que si sería útil es el código actual que tienes, creo yo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 29/07/2011, 17:05
Avatar de Martriay  
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 14 años
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.
  #4 (permalink)  
Antiguo 29/07/2011, 17:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Menu recursivo

¿Dices que recibes mensajes de error? ¿Cuales?

Edito, ya vi el mensaje que colocaste.

Sin embargo, ¿el foreach() del error está fuera de la función?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 29/07/2011, 17:10
Avatar de Martriay  
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 14 años
Puntos: 5
Respuesta: Menu recursivo

Creo que no leíste la última edición.

También aclaro que el menú no funciona, solamente se listan los items, no se despliegan los hijos ni nada.
  #6 (permalink)  
Antiguo 29/07/2011, 17:16
Avatar de Martriay  
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 14 años
Puntos: 5
Respuesta: Menu recursivo

Cambié eso y ya no tira más error, pero el problema de los <li> hijos persiste :S

Explico mejor:

Hasta el 2do nivel (1.1) el menú se despliega correctamente, pero a partir del 3ro (1.1.1) ya directamente ni se despliega, aparece un <li> en blanco entre los items con parent = 0 por cada sección de 3er nivel, en lugar de posicionarse dentro de una <ul> dentro de su correspondiente padre de nivel 2, es decir, primer nivel de subsecciones.

¿Alguna manera de solucionarlo?

Más detalles

Mi tabla es así

Cita:
id -> int, primary key
label -> varchar (25)
parent -> int
content -> varchar (200)
y modifiqué el código del menú, que es así:

Código PHP:
<?php
include ("mysqlconn.php");
$sql "SELECT id, label, parent FROM secciones ORDER BY parent, id ASC"
$items mysql_query($sql);
while (
$obj mysql_fetch_object($items)) {
    if (
$obj->parent == 0) {
        
$parent_menu[$obj->id]['label'] = $obj->label;
        
$parent_menu[$obj->id]['link'] = $obj->id;
    } else {
        
$sub_menu[$obj->id]['parent'] = $obj->parent;
        
$sub_menu[$obj->id]['label'] = $obj->label;
        
$sub_menu[$obj->id]['link'] = $obj->id;
        
$parent_menu[$obj->parent]['count']++;
    }
}
mysql_free_result($items);
function 
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=\""."?"."id=".$pval['link']."&".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n";
        } else {
            
$menu .= "  <li><a class=\"".$extra_style."\" href=\""."?"."id=".$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=\""."?id=".rebuild_link($sval['link'], $qs_val$sval['parent'])."\">".$sval['label']."</a></li>\n";
                }
            }
            
$menu .= "</ul>\n";
        }
    }
    
$menu .= "</ul>\n";
    return 
$menu;
}
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 
menu($parent_menu$sub_menu"menu""nav""subnav");
?>
Me podrían ayudar? Gracias

Última edición por Martriay; 29/07/2011 a las 17:25
  #7 (permalink)  
Antiguo 30/07/2011, 13:53
 
Fecha de Ingreso: julio-2011
Mensajes: 1
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Menu recursivo

Lo solucionaste? si es así podrías postear tu código? Necesito uno parecido.
  #8 (permalink)  
Antiguo 01/08/2011, 09:08
Avatar de Martriay  
Fecha de Ingreso: noviembre-2010
Mensajes: 80
Antigüedad: 14 años
Puntos: 5
Respuesta: Menu recursivo

No, aún no, asique si alguien puede darme una mano lo agradecería mucho (:

Etiquetas: mysql, recursivo, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:47.