Foros del Web » Programando para Internet » PHP »

menú desde BD mostrando solo nodos abiertos

Estas en el tema de menú desde BD mostrando solo nodos abiertos en el foro de PHP en Foros del Web. Hola, Sé que el tema de crear un menú a partir de una BD es un tema recurrente por estos lares, pero me encuentro en ...
  #1 (permalink)  
Antiguo 25/08/2010, 03:28
 
Fecha de Ingreso: junio-2010
Mensajes: 6
Antigüedad: 13 años, 10 meses
Puntos: 0
menú desde BD mostrando solo nodos abiertos

Hola,
Sé que el tema de crear un menú a partir de una BD es un tema recurrente por estos lares, pero me encuentro en un caso en el que no se dar con la solución.
Se trata de, a partir de la bd, mostrar un menú, pero necesito que me muestre solo el nivel abierto. Lo más sencillo sería hacerlo mediante javascript, colapsando y expandiendo las ramas sobre las que va pinchando el usuario, pero en este proyecto prefiero no utilizar javascript para asegurar la accesibilidad y una visualización igual del menú independientemente de que el usuario disponga en su navegador de soporte javascript o no.

Como ejemplo, supongamos que tenemos esta estructura jerárquica:
Sección 1
Subsección 1
Subsección 2
Sección 2
Subsección 3
Subsección 4

El usuario accede a la subsección 1. EL menú debería aparecer así:
Sección 1
Subsección 1
Subsección 2
Sección 2

Espero haberme explicado bien.
He trabajado con un código pero que me lista todos los nodos y subnodos. Lo pego aquí por si sirve de base para hacer lo que necesito:
<!-- saved from url=(0022)http://internet.e-mail -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>EM</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="menu.css" type="text/css">

</head>
<body>

<?php
include "db/connectar.php";
$connexio=connectar();

//se declara la variable global $nivel para tener una referencia fuera de la función recursiva que indique el nivel de profundidad de subfamilia actual
$nivel = "";
global $nivel;
///funcion recursiva que recorre el menu
function recorrer_menu_familias($padre, $nivel_anterior){
//la consulta a la tabla familias busca los hijos del padre que entró como parametro a esta función

$sql="SELECT * FROM menucat WHERE pare = $padre";

$result=mysql_query($sql);
while($row = mysql_fetch_array($result)){
if($GLOBALS['nivel']=="")
//si la goblal nivel está vacia es que acaba de empecar el ciclo recursivo
echo "<li>\n";
else{
//según la diferencia de nivel actual con el anterior guardada en $GLOBALS['nivel'] se cierran o abren etiquetas <Li>
$diferencia = $row['nivell'] - $GLOBALS['nivel'];
if($diferencia==0) echo "</li>\n<li>\n"; //no ha cambiado de nivel de subfamilia respecto al anterior
if($diferencia==1) echo "<ul>\n<li>\n"; //ha subido un nivel de subfamilia respecto al anterior
if($diferencia==-1) echo "</li>\n</ul>\n<li>\n"; //ha bajado un nivel de subfamilia respecto al anterior
if($diferencia < (-1)){
//baja varios niveles de subfamilia respecto al anterior
echo "</li>";
for($i=$diferencia;$i<0;$i++)
echo "</ul>\n</li>\n";
echo "<li>\n";
}
}
//crea el enlace
if($row['tipus']=='0'){
echo '<a href="'.$row['ruta'].'">'.$row['nom'].'</a>';
}elseif($row['tipus']=='1'){
echo $row['nom'];
}
//actualiza $GLOBALS['nivel'] al nivel actual
$GLOBALS['nivel'] = $row['nivell'];
//se llama a si mismo para comprovar quienes son los hijos de la familia actual
recorrer_menu_familias($row['id_cat'],$row['nivell']);
}
}
//muestra menu
function muestra_menu_familias(){

recorrer_menu_familias(0, "");
echo "</li>\n";
for($i=0;$i==$GLOBALS['nivel'];$i++)
echo "</ul>\n</li>\n";
}
?>
<ul id="mainnav">
<?php muestra_menu_familias(); ?></ul>
<script type="text/javascript" src="onlyone.js"></script>
</body>
</html>

Etiquetas: bd, nodos
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 10:38.