Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/08/2010, 03:28
xblanch
 
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>