Foros del Web » Programando para Internet » PHP »

Problema con función recursiva

Estas en el tema de Problema con función recursiva en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 29/10/2008, 20:44
 
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, 6 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
  #2 (permalink)  
Antiguo 29/10/2008, 20:50
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con función recursiva

Y cuál es el problema? Te muestra algún error?

Si te fijas en el código que publicaste, en la linea de la consulta SQL hay una comilla ' de más.

Saludos,
  #3 (permalink)  
Antiguo 29/10/2008, 20:55
 
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, 6 meses
Puntos: 0
Respuesta: Problema con función recursiva

Gracias por tu rápida respuesta.

Lo de la comilla fue que borré una parte de la query que no valía la pena mostrar para no confundir más :) Gracias, ya lo he arreglado.


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)


¿Ahora me explico donde está el problema? ..... Ok, tal vez no sea un problema,es un feature nuevo que no se como lograr.
Gracias
__________________
ratamaster
  #4 (permalink)  
Antiguo 29/10/2008, 21:09
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con función recursiva

Se me ocurre que extraigas primero de tu tabla de productos las categorias que contienen productos coincidentes con tu búsqueda, algo como

Código sql:
Ver original
  1. SELECT DISTINCT CatId FROM imported_data_copy WHERE ProdName LIKE '%manolo%'
Guardas los ids devueltos en un array. Luego, al ejecutar tu función recursiva, antes de re-ejecutar la función, vez si la categoría que deseas "abrir" se encuentra en el array que has creado. Si no está, no la "abres".

Saludos,
  #5 (permalink)  
Antiguo 29/10/2008, 21:24
 
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, 6 meses
Puntos: 0
Respuesta: Problema con función recursiva

Cita:
Iniciado por okram Ver Mensaje
Guardas los ids devueltos en un array. Luego, al ejecutar tu función recursiva, antes de re-ejecutar la función, vez si la categoría que deseas "abrir" se encuentra en el array que has creado. Si no está, no la "abres".

Saludos,
1)No es una cuestión de abrir o dejar cerrado N nodos del árbol que no posea productos que hagan match, sino no mostrarlos, Solo debo mostrar los nodos (desde el root) hasta llegar a los productos. Todos los Nodos que no esten relacionados con los productos, no los debo mostar.

2) Si hago lo que me dices, estaría dejando afuera a las categorias padres del producto, o sea:

Ejecuto....:
Código PHP:
SELECT DISTINCT CatId FROM imported_data_copy WHERE ProdName LIKE '%manolo%' 
Basandome en esta tabla:

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

...esto me trae los CatId: 3,6, y entonces:

xxxx0 (CatId=1, CatParentId=0) ->>>>>>>>>>>>NO SE MOSTRARÍA
------xxxx0-2 (CatId=3, CatParentId=1)
xxxx1 (CatId=6, CatParentId=0)


Y yo quiero mostrar xxxx0, dado que está relacionado con el producto, es la categoría "más" superior del producto.

Tienes alguna otra idea?

Muchas Gracias
__________________
ratamaster
  #6 (permalink)  
Antiguo 30/10/2008, 07:20
 
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, 6 meses
Puntos: 0
Respuesta: Problema con función recursiva

Alguien tiene otra idea????
__________________
ratamaster
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 07:39.