Foros del Web » Programando para Internet » PHP »

Mostrar una tabla completa

Estas en el tema de Mostrar una tabla completa en el foro de PHP en Foros del Web. Hola, Tengo una base de datos de imágenes. Una de las tablas corresponde a unos códigos de clasificación de las imágenes. La tabla tiene tres ...
  #1 (permalink)  
Antiguo 07/09/2009, 07:59
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Mostrar una tabla completa

Hola,

Tengo una base de datos de imágenes. Una de las tablas corresponde a unos códigos de clasificación de las imágenes.

La tabla tiene tres campos, Identificador del código, descripción y padre. El padre es el código del que cuelga. Por ejemplo: Paisajes será el padre de paisajes de montaña, y éste el padre de paisajes de montaña nevados.

Puedo querer mostrar todas las imágenes de paisajes o todas las imágenes de paisajes de montaña nevados.

La tabla de códigos puede tener todos los niveles que sea necesario sin límite, dependiendo de los códigos que vayan introduciendo los usuarios.

Quiero mostrar toda la tabla de códigos declasificación, pero no ordenada según el orden que ocupa cada registro, sino según la jerarquía, es decir, los hijos debajo de cada padre.

Mis preguntas son las siguientes: la primera es si alguien tiene un código hecho similar, porque aunque sé cómo hacerlo quiero ver si hay formas mejores.

La segunda es: yo pienso que lo mejor es en primer lugar hacer una consulta de la tabla y crear un array, y luego trabajar con él, más que irme moviendo por la base de datos buscando padres e hijos, ya que la manera de hacer las consultas en mysql a base de resultados me parece farragosa, aparte de que será más rápido consultar la base de datos sólo una vez. ¿Es así?
  #2 (permalink)  
Antiguo 07/09/2009, 11:39
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Mostrar una tabla completa

Hola como te va, hace poco me meti en un lio con las categorias, tenia una estructura similar a la que usas,
tabla categorias
Cita:
id
categoria_id // padre
nombre
luego tengo una tabla de asignacion de categorias
tabla categorias_post
Cita:
id
categoria_id
post_id
y una tabla post

En mi caso podia tener post asignados para la categoria padre sin depender que tuviera hijos, y se me complicaba cuando necesitaba mostrar al padre si alguno de sus hijos tenian asignado post.
Despues de varios dias lo pude solucionar asi que pongo lo que utilice quizas no sea lo mismo que tenes que hacer vos pero algo te puede orientar.

Código php:
Ver original
  1. function getPostByCategoriaId($catId){
  2.         global $DbConn;
  3.         $sql = 'SELECT post_id, titulo FROM categorias_post AS tcat
  4.                 LEFT JOIN categorias AS tc ON tcat.categoria_id = tc.id
  5.                 LEFT JOIN post AS tp ON tcat.post_id = tp.id
  6.                 WHERE tcat.categoria_id ='.$catId ;
  7.         $res = $DbConn->query($sql);
  8.         $i = 0;
  9.         while($row = $DbConn->fetchAssoc($res)){
  10.             $data[$i]=$row;
  11.             $i++;
  12.         }
  13.         return $data;
  14.       }
  15.      
  16.     function getNumPostByCategoria($idCategoria){
  17.         global $DbConn;
  18.         $sql = 'SELECT COUNT(p.id) AS NUM FROM post p
  19.                 LEFT JOIN categorias_post cp ON p.id = cp.post_id
  20.                 WHERE cp.categoria_id = '.$idCategoria;
  21.         $resul = $DbConn->fetchArray($DbConn->query($sql));
  22.         return $resul['NUM'];
  23.     }  
  24.    
  25.     function getNumHijosByCategoria($idCategoria){
  26.         global $DbConn;
  27.         $sql = 'SELECT COUNT(id) AS NUM FROM categorias WHERE categoria_id ='.$idCategoria;
  28.         $resul = $DbConn->fetchArray($DbConn->query($sql));
  29.         return $resul['NUM'];
  30.     }
  31.  
  32. function crearArboles($parent='0',$ini){
  33.         global $DbConn;
  34.         //buscamos las categorias con el parent
  35.         $sql = 'SELECT * FROM categorias WHERE categoria_id ='.$parent;
  36.         $res = $DbConn->query($sql);
  37.         $numR = $DbConn->numRows($res);
  38.         while($arr = $DbConn->fetchArray($res)){
  39.             //comenzamos a recorrer una por una, primero vamos a comprobar si tiene post
  40.                 $arrRet[$ini]['id'] = $arr['id'];
  41.                 $arrRet[$ini]['categoria'] = $arr['Nombre'];
  42.                 if($this->getNumPostByCategoria($arr['id'])>0){
  43.                    $arrRet[$ini]['post'] = $this->getPostByCategoriaId($arr['id']);
  44.                 }
  45.                
  46.                 if($this->getNumHijosByCategoria($arr['id'])>0){
  47.                    $arrRet[$ini]['hijo'] = $this->crearArboles($arr['id'],$ini);
  48.                 }
  49.                 $ini++;            
  50.            
  51.         }                  
  52.                
  53.        
  54.        
  55.         return $arrRet;
  56.        
  57.     }

esto me devuelve un array asi


despues utilizo una funcion para recorrer y mostrar el array cocultando con javascript las subcategorias:

Código php:
Ver original
  1. function recorrer($array){
  2.         foreach($array as $num => $padre){
  3.             $mTitulo = false;
  4.             // si tiene post
  5.                 if(!empty($padre['post'])){
  6.                     $mTitulo = true;
  7.                 }
  8.             // si tiene hijos
  9.                 if(!empty($padre['hijo'])){
  10.                     //buscamos que tengan post, en el caso de tener hijos volveria a hacer la recursiva
  11.                     //y al cumplir la condicion retornaria el dato
  12.                     foreach($padre['hijo'] as $num => $hijo){
  13.                         // si tiene un post debe mostrar el titulo del padre
  14.                             if(!empty($hijo['post'])){
  15.                                 $mTitulo = true;
  16.                             }else{
  17.                                 if(!empty($hijo['hijo'])){
  18.                                     recorrer($hijo['hijo']);
  19.                                 }
  20.                             }
  21.                     }
  22.                 }
  23.                 if($mTitulo){
  24.                     $html .= '
  25.                              <li class="closed"><span class="folder">'.$padre['categoria'].'</span>
  26.                                 <ul>';
  27.            
  28.                     //recorremos los datos del post
  29.                         foreach($padre['post'] as $num => $post){
  30.                             $html .= '
  31.                                     <li><span class="file"><a href="'.ROOT_PATH.'/post/ver/id/'.$post['post_id'].'"> '.$post['titulo'].'</a></span></li>';
  32.                         }
  33.            
  34.                     // verificamos si tiene hijos
  35.                         if(!empty($padre['hijo'])){
  36.                             $html .= recorrer($padre['hijo']);
  37.                         }
  38.                     $html .= '      </ul>
  39.                         </li>';
  40.                 }else{
  41.             $html .= '';
  42.             }
  43.            
  44.         }
  45.         return $html;
  46.     }
  #3 (permalink)  
Antiguo 07/09/2009, 13:49
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Respuesta: Mostrar una tabla completa

No entiendo qué tiene que ver que los hijos tengan post para mostrar al padre. En cualquier caso siempre que muestre una categoría mostraré a los hijos. Si alguien quiere ver todas las fotos de paisajes, se le mostraran los paisajes nevados.

El problema que yo veo es que por ejemplo alguien introduce una foto de peces marinos y la mete en la categoría mar, luego otro mete una igual y crea la categoría fauna marina para su foto. Automáticamente, la anterior foto queda en la categoría mar cuando debería estar en fauna marina, que es hija de mar. Es el problema de dejar lo de las categorías abierto.
Pero bueno, es problema de los usuarios, simplemente se deja abierta la opción de cambiar una foto de categoría.

Ya estudiaré con calma tus códigos. Gracias
  #4 (permalink)  
Antiguo 07/09/2009, 23:42
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Mostrar una tabla completa

Cita:
Iniciado por PacoRuiz Ver Mensaje
No entiendo qué tiene que ver que los hijos tengan post para mostrar al padre. En cualquier caso siempre que muestre una categoría mostraré a los hijos. Si alguien quiere ver todas las fotos de paisajes, se le mostraran los paisajes nevados.

El problema que yo veo es que por ejemplo alguien introduce una foto de peces marinos y la mete en la categoría mar, luego otro mete una igual y crea la categoría fauna marina para su foto. Automáticamente, la anterior foto queda en la categoría mar cuando debería estar en fauna marina, que es hija de mar. Es el problema de dejar lo de las categorías abierto.
Pero bueno, es problema de los usuarios, simplemente se deja abierta la opción de cambiar una foto de categoría.

Ya estudiaré con calma tus códigos. Gracias
lo que pasa es que necesitaba filtrar las categorias vacias, porque las mismas se mostraban para la seccion multimedia, y no valia la pena listar el arbol completo de categorias cuando no tuvieran ningun post asignado, o ningun archivo enlazado, por lo cual necesitaba filtrar las categorias que estuvieran vacias, pero en el caso de que el padre que fuera la categoria vacia pero uno de sus hijos no tenia que listar igualmente el titulo del padre para que quedara un orden intuitivo y prolijo, como en esta imagen:


en este caso es facil de deducir si deberia mostrar Economía y Empresas, ya que esa categoria tiene minimo un post asignado (Entrevista sobre monsanto, por ejemplo).

pero en el siguiente caso, no podria usar un bucle que solo se fijara si tiene un post asignado a la categoria, ya que no cumpliria la condicion, pero si uno de sus hijos


en mi caso el articulo o el archivo multimedia puede pertenecer a varias categorias, por lo cual el mismo id puede estar en biologia, como en cambios climaticos sin afectar en nada el funcionamiento de las categorias

yo si quciera filtrar todos los articulos de ecologia, sin hacer distincion de la categoria padre recorreria el array completo, mostrando el dato del post sin ninguna comprobacion extra que saber si tiene almenos un post, en el padre o en el hijo, solo habria que cambiar que no liste el nombre de la categoria, y cuando necesitas mostrar en orden con distincion, le agregas la parte donde muestra el padre
  #5 (permalink)  
Antiguo 08/09/2009, 09:21
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Respuesta: Mostrar una tabla completa

ya, es un problema diferente al mío. En mi caso habría demasiadas categorías e imágenes, y un listado como el tuyo sería enorme. Sólo quiero listar las categorías para que la persona que meta una imagen se oriente para poder asignarla.

Luego listaría las imágenes de una determinada categoría.

Me gusta este proyecto, porque resulta un problema interesante el hecho de que haya diferentes clasificaciones posibles para cada imagen, distintos posibles padres para una categoría determinada, etc.

Por ejemplo, fotos de peces dominicanos puede venir de fauna->peces o de naturaleza -> océano o de República Dominicana ->fauna dominicana ->fauna marina dominicana, pero al final la categoría resultante es única, y aparecería si se selecciona a cualquiera de sus padres.
  #6 (permalink)  
Antiguo 09/09/2009, 13:23
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Mostrar una tabla completa

lo que podes hacer es algo similar a lo que hice yo, ya que en algun momento vas a necesitar saber de donde viene, solamente con el array completo podes trabajar todo desde una consulta. Lo que haria en tu caso es lo siguiente
Hago las consultas para crear el array con categorias iniciendo del padre (inicio) obtengo las imagenes de esa categoria
Código php:
Ver original
  1. function crearArboles($parent='0',$ini){
  2.  
  3.         global $DbConn;
  4.  
  5.         //buscamos las categorias con el parent
  6.  
  7.         $sql = 'SELECT * FROM categorias WHERE categoria_id ='.$parent;
  8.  
  9.         $res = $DbConn->query($sql);
  10.  
  11.         $numR = $DbConn->numRows($res);
  12.  
  13.         while($arr = $DbConn->fetchArray($res)){
  14.  
  15.            
  16.  
  17.                 $arrRet[$ini]['id'] = $arr['id'];
  18.  
  19.                 $arrRet[$ini]['categoria'] = $arr['Nombre'];
  20.                  
  21.                //comenzamos a recorrer una por una, primero vamos a comprobar si tiene post
  22.                //donde getImagenesByCategoriaId es una funcion que llama a la base de datos y extra las imagenes con ese id de categoria
  23.                if($this->getImagenesByCategoriaId($arr['id'])>0){
  24.  
  25.                    $arrRet[$ini]['imagenes'] = $this->getImagenesByCategoriaId($arr['id']);
  26.  
  27.                 }
  28.  
  29.                
  30.                 // buscas si tiene algun hijo. Si el numero es mayot a 0 te agrega el array hijo
  31.                 if($this->getNumHijosByCategoria($arr['id'])>0){
  32.                  
  33.                   // utilizo el metodo actual para hacer recursividad
  34.                    $arrRet[$ini]['hijo'] = $this->crearArboles($arr['id'],$ini);
  35.  
  36.                 }
  37.  
  38.                 $ini++;            
  39.  
  40.         }

con esta funcion crearas un array completo con toda la informacion y ordenado jerarquicamente, ahora para lo que necesitas vos es cuestion del recorrido del mismo,
supongamos que quiero mostrar todas las imagenes de la categoria padre, ejemplo fauna->peces o de naturaleza -> océano

el array quedaria de esta manera:
Cita:
(
[0] => Array (
[id] => 1
[categoria] => fauna
[imagenes]=> Array(
[0] => Array(
[id_imagen] =>1
[nombre] => fauna y diversidad
[path] => http://larala
)
)
[hijo] => Array (
[0] => Array{
[id] => 2
[categoria] => peces
[imagenes] => Array(
[0] => Array(
[id_imagen] =>1
[nombre] => fauna y diversidad
[path] => http://larala
)
)
)
)
)
luego para recorrer y poner las imagenes de fauna con las de sus hijos, habria que recorrerlo de la siguiente manera

Código php:
Ver original
  1. foreach($lista as $num => $categoria){
  2.             $ret ='<h1>'.$categoria['categoria'].'</h1>'; // devuelve fauna
  3.            
  4.             // recorremos las imagenes y las insertamos
  5.             // primero comprobamos que no esta vacio para que no tire error
  6.            
  7.             if(!empty($categoria['imagenes']){
  8.                 foreach($categoria['imagenes'] as $nImg => $imagen){
  9.                       $ret . = '<a href="'.$imagen['path'].'" ><img src="'.$imagen['path'].'" alt="'.$imagen['nombre'].'" /></a><br/>';
  10.                   }
  11.             }
  12.            // ahora recorremos las imagenes de las subcategorias
  13.           // aqui vamos a necesitar una funcion recursiva ya que al no saber cuantas subcategorias pueden existir es imposible determinar en una funcion cuantas veces tiene que recorrer, en principio una vez pero luego no sabemos
  14.          // en este caso la funcion recursiva solamente tiene que traer los datos
  15.          if(!empty($categoria['hijo']){
  16.                     $ret.= getImagen($categoria['hijo'];
  17.           }
  18. }
  19.                          
  20. function getImagen($lista){
  21.             foreach($lista as $num => $categoria){
  22.                
  23.                  // recorremos las imagenes y las insertamos
  24.                 // primero comprobamos que no esta vacio para que no tire error
  25.            
  26.                 if(!empty($categoria['imagenes']){
  27.                    foreach($categoria['imagenes'] as $nImg => $imagen){
  28.                      $ret . = '<a href="'.$imagen['path'].'" ><img src="'.$imagen['path'].'" alt="'.$imagen['nombre'].'" /></a><br/>';
  29.                    }
  30.                  }
  31.                  //recursiva para traer los imagenes de los hijos
  32.                  if(!empty($categoria['hijo']){
  33.                      $ret .= getImagen($categoria['hijo']);
  34.                   }
  35.               }
  36.        return $ret;
  37. }
  #7 (permalink)  
Antiguo 09/09/2009, 13:32
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Mostrar una tabla completa

si mis calculos no fallan deberia mostrarte algo como

Fauna







suponiendo que estas son de peces




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 06:54.