bueno gente, pude acomodar este listado complicado, paso a detallar por si alguien se ve envuelto en una situacion tan engorrosa como la que tuve:
estructura de la base
-Tabla categorias
- Tabla categorias_post
-Tabla post
Código:
id
tipo_id
titulo
contenido
estado
fecha_ini
fecha_mod
keywords
esta ultima no hace haria falta mostrar pero es para mostrar todas las tablas que se nombran en el codigo del listado
Obtencion de los datos antes de recorrer e imprimir
modelo->multimedia
Código php:
Ver originalfunction getPostByCategoriaId($catId){
global $DbConn;
$sql = 'SELECT post_id, titulo FROM categorias_post AS tcat
LEFT JOIN categorias AS tc ON tcat.categoria_id = tc.id
LEFT JOIN post AS tp ON tcat.post_id = tp.id
WHERE tcat.categoria_id ='.$catId.' AND tipo_id ='.$this->get('tipo_id',$this->model);
// $this->get(tipo,$this->model) es una funcion que devuelve el tipo de post
// del modelo actual, podria ser noticias, multimedia, articulos, etc
$res = $DbConn->query($sql);
$i = 0;
while($row = $DbConn->fetchAssoc($res)){
$data[$i]=$row;
$i++;
}
return $data;
}
function getNumPostByCategoria($idCategoria){
global $DbConn;
$sql = 'SELECT COUNT(p.id) AS NUM FROM post p
LEFT JOIN categorias_post cp ON p.id = cp.post_id
WHERE cp.categoria_id = '.$idCategoria.' AND tipo_id = '.$this->get('tipo_id',$this->model);
$resul = $DbConn->fetchArray($DbConn->query($sql));
return $resul['NUM'];
}
function getNumHijosByCategoria($idCategoria){
global $DbConn;
$sql = 'SELECT COUNT(id) AS NUM FROM categorias WHERE categoria_id ='.$idCategoria;
$resul = $DbConn->fetchArray($DbConn->query($sql));
return $resul['NUM'];
}
function crearArboles($parent='0',$ini){
global $DbConn;
//buscamos las categorias con el parent
$sql = 'SELECT * FROM categorias WHERE categoria_id ='.$parent;
$res = $DbConn->query($sql);
$numR = $DbConn->numRows($res);
while($arr = $DbConn->fetchArray($res)){
//comenzamos a recorrer una por una, primero vamos a comprobar si tiene post
$arrRet[$ini]['id'] = $arr['id'];
$arrRet[$ini]['categoria'] = $arr['Nombre'];
if($this->getNumPostByCategoria($arr['id'])>0){
$arrRet[$ini]['post'] = $this->getPostByCategoriaId($arr['id']);
}
if($this->getNumHijosByCategoria($arr['id'])>0){
$arrRet[$ini]['hijo'] = $this->crearArboles($arr['id'],$ini);
}
$ini++;
}
return $arrRet;
}
esto nos devuelve un array con una estructura similar a
Código:
{
[0] =>Array
{
[id] => 1
[categoria] => Primera Categoria
// en el caso que exista un post asignado a esa categoria
[post] => Array
{
[0] => Array
{
[id] => 1
[titulo] => pos con categorias
}
}
// si tuviera algun hijo (seria un padre excelente)
[hijo] => Array
{
[0] => Array
(
[id] => 2
[categoria] => Educación ambiental
//estas a su vez si tuvieran post quedaria como la de arriba y lo mismo si tuviera hijos
)
}
}
}
ya tenemos nuestro array con los datos de la categorias
La vista se encarga de reccorer este array y hacer las comparaciones para que, si tiene algun post, o si no tiene pero alguno de sus hijos o nietos o bisnietos tiene liste la categoria y el desgrosado de la misma
vista -> index.php
Código php:
Ver originalfunction recorrer($objet){
foreach($objet as $num => $padre){
$mTitulo = false;
// si tiene post
if(!empty($padre['post'])){ $mTitulo = true;
}
// si tiene hijos
if(!empty($padre['hijo'])){ //buscamos que tengan post, en el caso de tener hijos volveria a hacer la recursiva
//y al cumplir la condicion retornaria el dato
foreach($padre['hijo'] as $num => $hijo){
// si tiene un post debe mostrar el titulo del padre
if(!empty($hijo['post'])){ $mTitulo = true;
}else{
if(!empty($hijo['hijo'])){ recorrer($hijo['hijo']);
}
}
}
}
if($mTitulo){
$html .= '<ul>';
$html .= '<h1><a href="javascript:void(0)">'.$padre['categoria'].'</a></h1>';
$html .= '<ul>';
//recorremos los datos del post
foreach($padre['post'] as $num => $post){
$html .= '<li><a href="'.ROOT_PATH.'/post/ver/id/'.$post['post_id'].'"> '.$post['titulo'].'</a></li>';
}
$html .= '</ul>';
// verificamos si tiene hijos
if(!empty($padre['hijo'])){ $html .= '<ul>';
$html .= recorrer($padre['hijo']);
$html .= '</ul>';
}
$html .= '</ul>';
}else{
$html .= '<ul></ul>';
}
}
return $html;
}
// $lista es el array que nos proporciona el modelo
echo recorrer($lista);