Estoy tratando de hacer un menu php a partir de una base de datos donde no haya límite de subsecciones, es por eso que me basé en este código
http://www.finalwebsites.com/tutorials/dynamic-navigation-list.php
le hice muy pequeñas modificaciones muy por encima, pero aún así no pasa del 2do nivel, me devuelve todos los items con parent id = 0, después las subsecciones hijas de 0, pero no más allá
En lugar de devolverme 0.1.1.1, se estanca en 0.1.1
alguien tiene idea de por qué?
Acá les dejo mi código
Cita:
<?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("&", "##", $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 = "&".implode("&", $newParts);
}
return $link_parts[0].$base_var.$qs;
} else {
return $link_parts[0].$base_var;
}
}
echo menu($parent_menu, $sub_menu, "menu", "nav", "subnav");56
?>
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("&", "##", $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 = "&".implode("&", $newParts);
}
return $link_parts[0].$base_var.$qs;
} else {
return $link_parts[0].$base_var;
}
}
echo menu($parent_menu, $sub_menu, "menu", "nav", "subnav");56
?>
Edit: como funciona a partir de la url, probé poniendo el parent id de 3er nivel en la url y efectivamente, me muestra sus subsecciones pero descolocadas, no debajo de su parent, sino por debajo de todo el menú, y bajo un <li> vacío.
Ese li vacío aparece únicamente si hay secciones de 3er nivel, es decir, estas que no aparecen.