Tengo una función recursiva que lista categorias,sub-categorias y productos
La función comienza a iterar desde el root y así va creando el arbol. A continuación describo las 2 tablas que se usan:
Describo las tablas que se usan:
categories:
CatId---CatParentId--CatName
1--------0-----------------xxxx0
2--------1-----------------xxxx0-1
3--------1-----------------xxxx0-2
4--------3-----------------xxxx1-1
5--------3-----------------xxxx1-2
6--------0-----------------xxxx1
Esta sería una representación gráfica de lo que la función crea, en realidad son UL LI anidados:
xxxx0 (CatId=1, CatParentId=0)
------xxxx0-1 (CatId=2, CatParentId=1)
------xxxx0-2 (CatId=3, CatParentId=1)
-----------------xxxxx1-1 (CatId=4, CatParentId=3)
-----------------xxxxx1-2 (CatId=5, CatParentId=3)
xxxx1 (CatId=6, CatParentId=0)
La tabla de productos:
imported_data_copy ( productos )
ImpDatId----CatId---ProdName
1--------------1--------producto pepe
2--------------1--------producto juan
3--------------3--------producto manolo
4--------------3--------producto manolo perez
5--------------6--------producto manolo gimenez
Debido a que son miles los productos, he decidido no listar los productos en el árbol, una vez que la página se carga. Lo unico que la función despliega son las categorias. Cada vez que se hace click sobre una categoria ( el árbol está cerrado, o sea que solo se muestran las categorias "root", o sea, CatParentId=0), se produce una llamda ajax que devuelve los productos de la categoría cliqueada.
Hasta aquí todo bien :) Todo funciona a la perfección.
Como pueden ver, las categorias y los productos están relacionados con el fk CatId, este campo está en ambas tablas. Con CatId yo se a que categoría un producto pertenece.
El problema se crea al incorporar un buscador de productos. El objetivo de este buscador es SOLO mostrar las categorias que tengan los productos que hagan match con el nombre de producto seleccionado.
Por ejemplo, si ingreso manolo, el output debería ser:
xxxx0 (CatId=1, CatParentId=0)
------xxxx0-2 (CatId=3, CatParentId=1)
xxxx1 (CatId=6, CatParentId=0)
Este es mi código:
Código PHP:
function recursiveTree($categoryId){
$arrStr = array();
$sql='SELECT CatId, CatName FROM '.tblCATEGORIES.' WHERE CatParentId ='.$categoryId;
$result=mysql_query($sql);
if(mysql_num_rows($result)){
if($categoryId>0){
$arrStr[]='<ul style="display:none;" class="ulCat">';
}
while($row = mysql_fetch_array($result)){
$arrStr[]='<li id="idtree_'.$row['CatId'].'" class="catnode">'
.'<div class="divcat">'
.'<div style="float:left">'
.'<img src="./images/elbow-end-plus-nl.gif" style="cursor:pointer" onclick="defineImageNode(this);seekUl(document.getElementById(\'idtree_'.$row['CatId'].'\'));callProductsFromCat('.$row['CatId'].');" />'
.'</div>'
.'<div style="white-space: nowrap;padding-left:3px" id="catname_'.$row['CatId'].'">'
.$row['CatName'].$row['CatId']
.'</div>'
.'<div style="clear:both"></div>'
.'</div>'
.'<ul style="display:none;" id="ulProd_'.$row['CatId'].'"></ul>';
$arrStr[]=$this->recursiveTree($row['CatId']);
$arrStr[]='</li>';
}
$arrStr[]='</ul>';
}
return implode('',$arrStr);
}
Bueno, espero que alguno me pueda ayudar.
Gracias