Foros del Web » Programando para Internet » PHP »

Formatear output Recursivo

Estas en el tema de Formatear output Recursivo en el foro de PHP en Foros del Web. Hola Gente, me estoy volviendo loco resolviendo un problem respecto a un menu tipo arbol. Lo que quiero conseguir es un menu exactamente igual como ...
  #1 (permalink)  
Antiguo 27/02/2008, 16:16
 
Fecha de Ingreso: febrero-2008
Mensajes: 7
Antigüedad: 16 años, 2 meses
Puntos: 0
De acuerdo Formatear output Recursivo - SOLUCIONADO

Hola Gente, me estoy volviendo loco resolviendo un problem respecto a un menu tipo arbol. Lo que quiero conseguir es un menu exactamente igual como este: http://www.eurocabos.com

Pero tengo el siguiente el problema:

Tenemos un menu:
  • Cables
  • Router
  • Armarios

Si pinchas en cables te saldria

Cables
- Cables Fibra óptico
- Cables de Redes
Router
Armario

Si ponchas en Cable de Redes

Te saldria

Cables
- Cables de Fibra óptica
- Cables de Redes
-Cable FTP
-Cable UTP
-etc.

Router
Armarios


Los titulos del menu se consigue a través de una tabla (Categorias) de una base de dato MySQL con los siguientes campos.

id
nombre
id_padre

Todos los menus princiaples tienen como padre la entrada 0, y cada submenu tiene como id_padre la id de su padre correspondiente. La id de cada cateogria se incrementa automaticamente.

Cables id_padre = 0, id=1
- Cables de Fibra óptica id_padre = 1, id=19
- Cables de Redes id_padre = 1, id=21
-Cable FTP id_padre = 21, id=30
-Cable UTP id_padre = 21, id=35
-etc. id_padre = 21, id=n

Router id_padre = 0, id=2
Armarios id_padre = 0, id=3


El problema es como solucionar el problema para que no se te cierren los otros ?

Porque si hago un select con el id = 21 solo me saldría

-Cable FTP id_padre = 21, id=30
-Cable UTP id_padre = 21, id=35
-etc. id_padre = 21, id=n

y no lo demás.

Si guardo los id_padre de orden inverso de todos los submenus hasta llegar al 0, el problema es que al reconstruir el menu, el menu me quedaría así.

Cables
Router
Armarios
- Cables de Fibra óptica
- Cables de Redes
-Cable FTP
-Cable UTP

Y Sea como lo haga no podré guardar la estructura del menu.
Toy perdísisisimo.

Tienen alguna solucion, no tiene que ser codigo, de eso ya me encargo yo, pero una solucion, una idea, que podría ayudar, o alguna idea como lo hizo akella gente de www.eurocabos.com para abrir el menu tal cual al actualizar la pagina, y que tienen una estructura aunque si lo miran la variabla ccat de todos los puntos del menu tiene un valor aleatorio, osea no esta guardado, no se como tienen guardado esa estructura de menu.

Gracias de antemano
Un saludo!

Última edición por BenjiRS; 28/02/2008 a las 17:45 Razón: Porque se ha solucionado
  #2 (permalink)  
Antiguo 27/02/2008, 20:22
 
Fecha de Ingreso: febrero-2008
Mensajes: 7
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problema con un menu tipo Arbol.

Ya lo de arriba lo tengo solucionado!!! He encontrado el algoritmo aquí en los FAQs.

Base de dato:
Código:
id  id_padre  nombre  tabindex  
1       0    Juguetes      0 
2       1      Autos       2 
3       1     Muñecas      1 
4       0     Juegos       0 
5       4     Mesa         0 
6       4    Ingenio       0 
7       5    Adultos       0 
8       5    Infantil      0 
10      1     Test         3 
11      0     Test2        1
Quiero lo siguiente:
Cargo las categorias de la base de dato y la quiero estructurar de la siguiente manera, para luego formatearlo con CSS

Código HTML:
<ul id="treemenu2" class="treeview">
<li>Juguetes
	<ul>
	<li>Muñecas</li>
	<li>Autos</li>
	<li>Test</li>
	</ul>
</li>
<li>Juegos
	<ul>
	<li>Mesa
		<ul>
		<li>Adultos</li>
		<li>Infantil</li>
		</ul>
	</li>
                <li>Ingenio</li>
</ul>
</li>
<li>JTest2</li>
</ul> 
Mi PHP es este, pero lo que sale no se parece ni de lejos a lo que quiero (tal y como lo he escrito arriba)

Código PHP:

mysql_connect
('localhost''root'''); 
mysql_select_db('xx'); 

function 
arbol$padre$nivel){

    
$nivel++;
    if(
$y <$nivel ) echo '<ul id="treemenu1" class="treeview">';
 
    
$r mysql_query"SELECT * FROM test where id_padre ='$padre' ORDER BY tabindex" );

    while( 
$rs mysql_fetch_assoc$r ) ){

        echo 
"<li>".$rs["nombre"]. "</li>";
        
arbol$rs["id"], $nivel);
        
    } 
mysql_free_result$r );
if(
$y <$nivel ) echo"</ul>";
}

$nivel 0;
arbol0$nivel ); 
Me podeiss ayudar? Se lo agradeceria un munton.

Un Saludo!!!
  #3 (permalink)  
Antiguo 28/02/2008, 04:10
 
Fecha de Ingreso: febrero-2008
Mensajes: 7
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Problema con un menu tipo Arbol.

Sigo son solucionarlo, pero ya avanze. El Siguiente codigo

Código PHP:
mysql_connect('localhost''root'''); 
mysql_select_db('xx'); 

function 
arbol$padre$nivel){

    
$nivel++;

 
    
$r mysql_query"SELECT * FROM test where id_padre ='$padre' ORDER BY tabindex" );
    
        echo 
'<ul id="treemenu3" class="treeview">';

    while( 
$rs mysql_fetch_assoc$r ) ){

        echo 
"<li>".$rs["nombre"];
        
arbol$rs["id"], $nivel);
        echo 
"</li>";
        
    } 
mysql_free_result$r );
        
     echo 
"</ul>";
}

$nivel 0;
arbol0$nivel ); 
Tiene este output

Código HTML:
<ul id="treemenu3" class="treeview">
<li>Juguetes
	<ul id="treemenu3" class="treeview">
		<li>Muñecas<ul id="treemenu3" class="treeview"></ul></li>
        <li>Autos<ul id="treemenu3" class="treeview"></ul></li>
        <li>Test<ul id="treemenu3" class="treeview"></ul></li>
   </ul>
</li>
<li>Juegos
	<ul id="treemenu3" class="treeview">
    	<li>Mesa
        	<ul id="treemenu3" class="treeview">
            	<li>Adultos<ul id="treemenu3" class="treeview"></ul></li>
                <li>Infantil<ul id="treemenu3" class="treeview"></ul></li>
            </ul>
        </li>
     	<li>Ingenio<ul id="treemenu3" class="treeview"></ul></li>
    </ul>
</li>
<li>Test2<ul id="treemenu3" class="treeview"></ul></li>
</ul> 
O sea, casi. el unico problema es que me hace <ul></ul> cndo no deberia y la id y class solo necesistaria en el primero.....
  #4 (permalink)  
Antiguo 28/02/2008, 07:21
 
Fecha de Ingreso: febrero-2008
Mensajes: 7
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Formatear output Recursivo

Alguna idea?
  #5 (permalink)  
Antiguo 28/02/2008, 09:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Formatear output Recursivo

En tu función arbol estas imprimiendo siempre el id y el class, si no quieres que se repitan, imprimelos tu primero fuera de tu función arbol y luego ya imprimes el contenido dentro de tu función arbol.

Saludos.
  #6 (permalink)  
Antiguo 28/02/2008, 10:08
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Formatear output Recursivo

Dado que en cada item ejecutas la función árbol, entonces debes verificar que la consulta que ejecutas te devuelve algún resultado para imprimir <ul></ul> ¿Me explico?, Al imprimir Adultos o Infantil, ejecutas la función árbol para ver si esas categorías tienen algún hijo, y al ejecutarla, imprimes el <ul>, pero como no hay datos para mostrar, se imprime inmediatamente el cierre </ul>. Haz algo así:

Código PHP:
function arbol$padre $primero false ){ 

    
$r mysql_query"SELECT * FROM test where id_padre ='$padre' ORDER BY tabindex" ); 
    
    if(
mysql_num_rows($r) > 0) {
        echo 
'<ul';
        if(
$primero == true) {
            echo 
' id="treemenu3" class="treeview"'
        }
        echo 
'>';

        while( 
$rs mysql_fetch_assoc$r ) ){ 
    
            echo 
"<li>".$rs["nombre"]; 
            
arbol$rs["id"] ); 
            echo 
"</li>"
         
        } 
mysql_free_result$r ); 
         
        echo 
"</ul>"
    }

 
arboltrue ); 
Saludos,
  #7 (permalink)  
Antiguo 28/02/2008, 17:43
 
Fecha de Ingreso: febrero-2008
Mensajes: 7
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Formatear output Recursivo

Muchas Gracias Gente!!

Ya lo conseguí

El truco era el

Código PHP:

if (mysql_num_rows($r) > 0)



entre el while.

Código PHP:
                        mysql_connect('localhost''root'''); 
                        
mysql_select_db('xx'); 
                        
                        function 
arbol$padre$nivel,$id){
                            
$nivel++;
                
                        
                            
$r mysql_query"SELECT * FROM test where id_padre ='$padre' ORDER BY tabindex" );
                            if (
mysql_num_rows($r) > 0)
                            {
                            if(
$nivel>1)
                                echo 
"<ul>\n";
                        
                                while( 
$rs mysql_fetch_assoc$r ) ){
                                    echo 
"<li><a href=\"index.php?id=".$rs["id"]."\">".$rs["nombre"]."</a>";
                        
                                    
arbol$rs["id"], $nivel,$id);
                                    echo 
"</li>\n";
                                    
                                } 
                                
mysql_free_result$r );
                            if(
$nivel>1)
                                echo 
"</ul>\n";
                            }
                        } 
                        
                        echo 
"<ul id=\"treemenu1\" class=\"treeview\"".$x.">\n";
                        
arbol('',0,$id);
                        echo 
"</ul>\n"
Gracias por todo!

Un Saludo!
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 20:11.