Foros del Web » Programando para Internet » PHP »

Menu recursivo con esta tabla

Estas en el tema de Menu recursivo con esta tabla en el foro de PHP en Foros del Web. Hola a todos, Tengo esta tabla: Familia varchar4 Subfamilia varchar4 Descripcion varchar40 Subfamiliadependiente varchar4 Mi problema es que tengo que hacer un menu recursivo, cojo ...
  #1 (permalink)  
Antiguo 03/12/2009, 06:03
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 17 años, 3 meses
Puntos: 1
Busqueda Menu recursivo con esta tabla

Hola a todos,

Tengo esta tabla:

Familia varchar4
Subfamilia varchar4
Descripcion varchar40
Subfamiliadependiente varchar4

Mi problema es que tengo que hacer un menu recursivo, cojo los datos de una tabla en la que no se cuantas familias ni subfamilias hay.

Espero haberme explicado bien, cualquier cosa me preguntan.

Gacias de antemano y saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #2 (permalink)  
Antiguo 03/12/2009, 07:06
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Menu recursivo con esta tabla

con una función recursiva, algo así

Código PHP:

//RECURSIVO:
    
function getPrivilegios(connection $c,recordset $priv$level,$id_usuario,$id_empresa){
        
$event='';
        
$class='privilegio';
        
//verificando existencia de nodos:
        
$recnode $c->pg_elemento_menu->doQuery($c, new criteria(sqlEQUAL,$c->pg_elemento_menu->id_padre,$priv->id_elemento_menu))->orderBy($c->pg_elemento_menu->def_order)->orderBy($c->pg_elemento_menu->nombre)->doSelect();
        if(
$recnode){
            if(
$recnode->getNumRows()!=0){
                if(
$level==20 || $level==40){
                    
$display="display:none;";
                    
                    
$sl=($level==20) ? '_p':'_p2';
                    
$class="menuprivilegio_close";
                }else{
                    
$class="menuprivilegio";
                }
                
$html.='<div style="'.$display.'" id="container'.$priv->id_elemento_menu.'">';
                
$event='onclick="switch_priv(this,'.$priv->id_elemento_menu.');"';
                
//$class="menuprivilegio";
                
foreach($recnode as $e){//RECURSION:
                    
$html.=getPrivilegios($c,$e,$level+20,$id_usuario,$id_empresa);
                }
                
$html.='</div>';
            }
        }
        
//leer los privilegiso del usuario por la empresa:
        
$recu=$c->pg_menu_usuario->doSelect($c,new criteria(sqlAND,array(
            new 
criteria(sqlEQUAL,$c->pg_menu_usuario->id_usuario,$id_usuario),
            new 
criteria(sqlEQUAL,$c->pg_menu_usuario->id_empresa,"'".$id_empresa."'"),            
            new 
criteria(sqlEQUAL,$c->pg_menu_usuario->id_elemento_menu,$priv->id_elemento_menu)
        )));
//...
return $html;

  #3 (permalink)  
Antiguo 03/12/2009, 08:42
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: Menu recursivo con esta tabla

hola maycolalvarez,

Gracias por la repuesta pero no me sirve. Si te fijas en mi tabla no tengo ningun indice ni nada que me sirva contar los niveles son todos varchar y no le puedo añadir ningun campo.

Yo antes lo tenia asi:

Código PHP:
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 Idfamilia, familia, nivel, padre FROM familia WHERE padre = $padre";   
    $result=mysql_query($sql);
    
    while($row = mysql_fetch_array($result)){
        
        $clase = $row['nivel'];
        
        switch ($clase) {
            case 0:
                $clase_fin = "clase1";
                $span_folder = "folder";
                break;
            case 1:
                $clase_fin = "clase2";
                $span_folder = "folder2";
                break;
            case 2:
                $clase_fin = "clase3";
                $span_folder = "folder3";
                break;
            case 3:
                $clase_fin = "clase4";
                $span_folder = "folder4";
                break;
        }
        
        if($GLOBALS['nivel']==""){
            //si la goblal nivel está vacia es que acaba de empecar el ciclo recursivo
            echo "<li class= 'closed $clase_fin'>";
        }else{
            //según la diferencia de nivel actual con el anterior guardada en $GLOBALS['nivel'] se cierran o abren etiquetas <Li>
            $diferencia = $row['nivel'] - $GLOBALS['nivel'];
            if($diferencia==0) echo "</li>\n<li class='closed $clase_fin'>\n"; //no ha cambiado de nivel de subfamilia respecto al anterior
            if($diferencia==1) echo "<ul>\n<li class='closed $clase_fin'>\n"; //ha subido un nivel de subfamilia respecto al anterior
            if($diferencia==-1) echo "</span></li>\n</ul>\n<li class='closed $clase_fin'>\n"; //ha bajado un nivel de subfamilia respecto al anterior
            if($diferencia < (-1)){
                //baja varios niveles de subfamilia respecto al anterior
                echo "</span></li>";
                for($i>=$diferencia;$i<0;$i++)
                    echo "</ul>\n</li>\n"; 
                echo "<li class='closed $clase_fin'>\n";
            }
        }
        //crea el enlace
        
        $padre2 = $row['padre'];
        $familia = $row['Descripcio'];
        echo "<div class='hitarea'><a href='productos.php?fam=$padre2&familia=$familia' class=$span_folder $clase_fin><span class='$span_folder'><span class='espacio'>".$row['familia']."</span></span></a></div>";
        
        //actualiza $GLOBALS['nivel'] al nivel actual
        $GLOBALS['nivel'] = $row['nivel'];
        //se llama a si mismo para comprovar quienes son los hijos de la familia actual
        recorrer_menu_familias($row['Idfamilia'],$row['nivel']);
    }
}
//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";
}
?>
<div id="main">
    <ul id="browser" class="filetree">
        <?php muestra_menu_familias(); ?>
    </ul>
</div>
pero no me sirve por la misma razon. Espero que alguien pueda ayudarme porque me estoy volviendo loco.

Gracias y saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #4 (permalink)  
Antiguo 04/12/2009, 02:26
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: Menu recursivo con esta tabla

Ya siento ser tan pesado, pero nadie sabe como hacerlo? sabeis si se puede hacer ningun campo numérico? eso es lo que no tengo muy claro. La posibilidad de hacerlo sin campos numéricos.

Gracias de antemano y saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #5 (permalink)  
Antiguo 09/12/2009, 02:28
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: Menu recursivo con esta tabla

hola,

Todavía no he conseguido hacerlo. Nadie, sabe coo se puede hacer?? gracias y salkudos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #6 (permalink)  
Antiguo 09/12/2009, 03:30
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 15 años
Puntos: 16
Respuesta: Menu recursivo con esta tabla

Una pregunta, esque tampoco sé que es un menú recursivo.

Tienes varios campos en el que pone la misma familia y son varias subfamilias? ¿o tienes una sola celda para todas las familias? :S.

Valla, para que me entiendas, yo por ejemplo tengo una tabla de ciudades, en las que viene cada uno el pais, entonces es facil llamar a cada ciudad por su respectivo pais(solicitando que me haga un buscar pais).

Valla, yo si me dices que es eso te lo pongo como lo tengo y un poco cambiado a tu sitio.

Pero valla, lo que hago yo es con dos for y cargar desde la tabla en un array.

Valla, más o menos así

(como no sé muy bien SQL, que más bien lo que hago es copiar y pegar, solo pondré lo que busco y lo que le digo).

Busca en tabla "ciudades".
$Valor1=$row['pais'];
B=0;

//entonces le meterias aquí un for:
for($a=0;$a<count($valor1);$h++)
{
echo "Valor1[$a]
//dentro del rows.
SELECT FROM paises WHERE pais = $valor1[$a]//sería la busqueda añadiendo también el array y el conect, ya te digo que no me acuerdo bien de esto, sé como es pero no ponerlo bien.
$valor2=$row['ciudad'];
for(;$b<count($valor2);$b++)
{
echo $valor2[b]
}
}

Ya te digo que ahí esta a "groso modo", no sé si lo entendrás, porque no sé que quieres, si te interesa eso, avisame por aquí y te pego el mio, me costó un rato hacerlo(unas 3 horas probando).

Pero para que lo entiendas, cargo una de las variables(la que incluye a las otras), y le digo que me la imprima y que busque que hay dentro de esa tabla.

Bueno, también es que yo tengo 2 tablas para ello, una "paises" y otra "ciudades", lo hice así porque era más facil, mira a ver si puedes hacer algo parecido :P
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 14:03.