Foros del Web » Programando para Internet » PHP »

Mostrar categorias en forma de arbol

Estas en el tema de Mostrar categorias en forma de arbol en el foro de PHP en Foros del Web. Hola, Hace mucho que no posteo aquí pero bueno ahora se me presento una duda y ya saben en los momentos de necesidad uno se ...
  #1 (permalink)  
Antiguo 20/07/2003, 22:28
 
Fecha de Ingreso: marzo-2002
Ubicación: No se!
Mensajes: 121
Antigüedad: 22 años
Puntos: 1
Mostrar categorias en forma de arbol

Hola,

Hace mucho que no posteo aquí pero bueno ahora se me presento una duda y ya saben en los momentos de necesidad uno se acuerda de FDW, bueno al grano, mi problema es el siguiente:

Tengo una tabla en una base de datos MySQL llamada categorias estructurada así:

id
nombre
descripcion
parent

En esta almaceno todas las categorias y subcategorias y muestro las categorias con:

Código PHP:
SELECT FROM categorias WHERE `id` = '0' 
y las subcategorias segun el valor de el campo parent, el problema es al querer mostrar todas las categorias y subcategorias ordenadas y agrupadas en forma de arbol, no se como hacerle, la verdad no se si se pueda solucionar con SQL ó con PHP, si me equivoque de foro por favor muevanlo.

Espero haberme explicado. GRACIAS!!!
  #2 (permalink)  
Antiguo 20/07/2003, 23:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
mm Pues una cosa es Ordenar o agrupar .. eso sería taréa de SQL (GROUP BY .. ORDEN By ... etc)

Pero el "efecto" visual de que esos datos queden con una estructura de arbol .. podrías usar técnicas de "nodos" y cosas así al estilo XML ..

Revisa en phpclasses.org
http://promoxy.mirrors.phpclasses.or...ee&go_search=1

Por ahí (buscando por 'tree' ) veras más de una aplicación para generar esas ramas y sub-ramas de tu arbol .. Tal vez te pidan un array (multidimiensional) y no lo hagan directamente desde tus consultas SQL .. pero bueno, decidete por alguna de estas classes y luego veremos como adaptarlo a tu consulta SQL que debes generar ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 21/07/2003, 14:54
 
Fecha de Ingreso: marzo-2002
Ubicación: No se!
Mensajes: 121
Antigüedad: 22 años
Puntos: 1
Gracias Cluster, lamentablemente tengo una conexión del asco y el enlace que me diste no me abre pero busque "tree" en hotscripts.com y me baje un script que al parecer genera el mapa de un sitio segun una base de datos y viendo el codigo vi que lo que hace es masomenos esto:

Código PHP:

    
echo "<select name=\"parent\">"
    echo 
"<option selected>-- Categoria</option>"

    
$sql "SELECT cat_id, parent, nombre FROM categorias WHERE parent = '0'"
    
$consulta mysql_query($sql) or die (mysql_error()); 

    if(
mysql_num_rows($consulta) != 0
    { 
        while(
$row mysql_fetch_array($consulta)) 
        { 
            
$Id $row["cat_id"]; 
            
$Nombre $row["nombre"]; 
            
$Parent $row["parent"]; 

            echo 
"<option value=\"$Id\">$Nombre</option>"

            
$sql2 "SELECT cat_id, parent, nombre FROM categorias WHERE parent = '$Id'"
            
$consulta2 mysql_query($sql2) or die (mysql_error()); 

            while(
$row mysql_fetch_array($consulta2)) 
            { 
                
$Id $row["cat_id"]; 
                
$Nombre $row["nombre"]; 
                
$Parent $row["parent"]; 

                echo 
"<option value=\"$Id\">-- $Nombre</option>"
            } 
        } 
    } 

    echo 
"</select><p>"
el codigo ya esta adaptado como quiero y me devuelve el select como quiero pero creo que esto puede afectar los recursos del servidor pues se genera una consulta por cada registro en la tabla, ¿sera esto malo? ó ¿solo es paranoia?

GRACIAS!!!!
  #4 (permalink)  
Antiguo 21/07/2003, 19:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Pues malo no es .. sólo es un gasto más de recursos de tu servidor .. Pero, si así lo requiere tu aplicacion .. lo deberas usar. Si es por "capricho" y tienes paranoias sobre el consumo no lo uses ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 19/01/2007, 09:28
 
Fecha de Ingreso: agosto-2006
Mensajes: 219
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Mostrar categorias en forma de arbol

hola, este script permite si hay n padres he hijos generarlos, o únicamente genera un padre y un hijo dependiente de un padre.

gracias.


oskar
  #6 (permalink)  
Antiguo 19/01/2007, 09:46
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 4 meses
Puntos: 34
Re: Mostrar categorias en forma de arbol

Tenes que usar recursividad. La db esta bien, así que la lógica sería algo así:
Código PHP:
function arbol$parent ){
    
$r mysql_query"SELECT * FROM categorias where parent ='$parent' " );
    while( 
$rs mysql_fetch_assoc$r ) ){
        echo 
$rs["nombre"] . "<br />";
        
arbol$rs["id"] );
    } 
mysql_free_result$r );
}
arbol); 
Espero que no te haga un loop infinito :P, no la probé, pero debería funcionarte ;)


Ah, y esta de funcionar si permite n padres he hijos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #7 (permalink)  
Antiguo 28/02/2007, 10:55
 
Fecha de Ingreso: agosto-2006
Mensajes: 219
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Mostrar categorias en forma de arbol

no consigo que me salga, con el código que ha facilitado el compañero únicamente me sale "categoría" y cuando voy a desplegar no sale nada más.

mi código es este:

Código:
<?
//Conexion con la base
mysql_connect("localhost","daniel","daniel");

//selecciÑ?Ðn de la base de datos con la que vamos a trabajar
mysql_select_db("gestion");

echo 'localizacion:';

echo "<select name=\"id_padre\">";
echo "<option selected>-- categoria</option>";
$sql ="select id_localizacioni, id_padre, hijo from localizacion where id_padre ='0'";
$consulta = mysql_query ($sql) or die (mysql_error());
if(mysql_num_rows($consulta ) !=0)
{while($row = mysql_fetch_array($consulta))
{$id_localizacion=$row['id_localizacion'];
$hijo =$row['hijo'];
$id_padre=$row['id_padre'];

echo "<option value=\"$id_localizacioin\">$hijo</option>"; 
$sql2 = "select id_localizacion, id_padre, hijo from localizacion where id_padre = '.$id_localizacion'";
$consulta2 = mysql_query($sql2) or die (mysql_error());
while ($row = mysql_fetch_array ($consulta2));
{
$id_localizacion=$row['id_localizacion'];
$hijo =$row['hijo'];
$id_padre=$row['id_padre'];

  echo "<option value=\"$id_localizacion\">-- $hijo</option>"; 
            } 
        } 
    } 

    echo "</select><p>";  
	
	?>
yo tengo mi tabla en la que
id= id_localizacion
nombre = hijo
parent = id_padre

(no tengo descripcion).

si alguien me puede hechar un cable lo agradezco.

gracias

oskar calvo.
  #8 (permalink)  
Antiguo 28/02/2007, 11:18
Avatar de locojars  
Fecha de Ingreso: mayo-2002
Mensajes: 265
Antigüedad: 21 años, 10 meses
Puntos: 4
Re: Mostrar categorias en forma de arbol

Yahoo ha liberado una libreria muy buena (YUI) Donde ellos hacen la recursividad para la creacion del arbol.

Lo unico que necesitas hacer es bajarla y utilizar los archivo necesarios, en mi caso, te mando un script con el que he logrado ya armar un arbol de este tipo, espero lo comprendas :)

Código PHP:
<!-- Namespace source file -->  
<script src = "yahoo.js" ></script> 
<!-- Dependency source files -->  
<script src = "event.js" ></script> 
<!-- TreeView source file -->  
<script src = "treeview.js" ></script> 
<script src="treeview-debug.js" ></script>
<script src="logger.js"></script>

<script>
var tree; 
    function treeInit() { 
       tree = new YAHOO.widget.TreeView("treeDiv1"); 
       var root = tree.getRoot(); 
<?php
// Realizo la consulta de la tabla
$res $db->query("select ID,nombre,parent,nivel from proy_actividades where IDProyecto=".$ID);
while(
$row $res->fetchRow(DB_FETCHMODE_OBJECT))       
{
    
// Cambia las tíldes a código html para que no de errro el javascript
     
$nombre htmlentities($row->nombre);
     
?>    
// Genero las etiquetas de cada registo          
var label<?php echo $row->ID;?> = { label: "<?php echo $nombre;?>", href:"proyecto.php", target:"main" };            
<?php
    
// En mi caso como los registros de primer nivel tiene parent 0 hago la validacion para saber quienes iran en el root
    
if($row->parent==0)
    {
      
$parent "root";
    }
    else
    {
      
$parent "nodo".$row->parent;
    }
?>
// genero los nodos
       var nodo<?php echo $row->ID;?> = new YAHOO.widget.TextNode(label<?php echo $row->ID;?><?php echo $parent;?>, false); 
<?php
}     

?>
       tree.draw(); 
    }

</script>
<body onload="treeInit()">
<link rel="stylesheet" type="text/css" href="tree.css">
<link rel="stylesheet" type="text/css" href="screen.css">

 <div id="content">
      <h3>Mi árbol</h3>
      <div id="treeDiv1"></div>
    </div>
  </div>
</body>
Espero te funcione, al menos a mi me ayuda muchisimo y la recursividad se la dejo a los amigos de Yahoo.

Salu2,
Jars
__________________
No le digas a Jehová que tan grande es tu problema, dile a tu problema cuan grande es Jehová.
  #9 (permalink)  
Antiguo 01/03/2007, 05:46
 
Fecha de Ingreso: agosto-2006
Mensajes: 219
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Mostrar categorias en forma de arbol

muchas gracias, me lo apunto para otras cosas, pero para este caso en concreto necesito un menu con <select> para poder desplegarlo en un formulario.

alguna ayuda por favor.

un saludo

oskar calvo
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 06:14.