Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/09/2009, 11:39
samu22
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años, 11 meses
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.     }