Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/10/2008, 20:44
ratamaster
 
Fecha de Ingreso: octubre-2004
Ubicación: En algún lugar de la República Oriental del Uruguay
Mensajes: 366
Antigüedad: 19 años, 7 meses
Puntos: 0
Problema con función recursiva

Hola
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
__________________
ratamaster

Última edición por ratamaster; 29/10/2008 a las 20:53