busqueda simultanea sobre muchos modelos

Hola… generalmente siempre vengo con preguntas que son retos al conocimiento del framework y esta vez no es la excepcion…

En mi aplicación estoy creando un buscador que por palabras claves encuentre registros relacionados en diferentes modelos… los resultados son mostrados en un zii.widgets.CListView … y hasta aqui todo bien… Los resultados encontrados son mostrados en l CListView de forma separada por cada modelo…

Solo que el problema es cuando un CListView trae mas de una pagina de resultados, porque al intentar pasar a la pagina 2 no realiza correctamente el filtro de busqueda…

Veo que la peticion enviada por ajax va mas o menos asi:

http://localhost/celestic/?r=site/results&Tasks_page=2&ajax=yw10

Entonces sera posible que se pueda agregar algo a esa cadena que me indique desde que lista envie la peticion… y yo asi saber en que modelo buscar ??

Alguien tiene alguna mejor idea de como resolver esto ?? alguna recomendacion ??

Hola

Yo he implementado un buscador para mi aplicación y lo he resuelto de esta forma:




$sql = "SELECT  1 UNION SELECT ...  UNION SELECT  n)";

$count = sizeof(Yii::app()->db->createCommand($sql)->queryAll());


$dataProvider = new CSqlDataProvider($sql, array(

                    'totalItemCount' => $count,

                    'sort' => array(

                        'attributes' => array(

                            'id', 'atributo1', ... , 'atributoN',

                        )

                    ),

                    'pagination' => array(

                        'pageSize' => 5,

                    ),

                ));       

        $this->render('tuVista', array('dataProvider' => $dataProvider)); //Es lo que necesita el zii.widgets.CListView



Hacerlo por modelos, tiene su equivalente, pero directamente lo hago así ;)

Bueno, mi buscador funciona y busca en n cantidad de modelos que les sea indicado… mi problema es que el render de los resultados los hago en un cListView … y al paginar es donde llegan los errores… creo que voy a ver la forma de extender cListView para que haga ajax update de la paginacion tomando algun parametro…

Ahora con respecto a lo que tienes ese $dataProvider lo pasas a algun grid o lista… ya probaste la paginacion …

El código anterior lo tengo en el controlador actionBuscar

Esto lo tengo en la vista

$this->widget(‘zii.widgets.CListView’, array(‘dataProvider’=>$dataProvider,‘itemView’=>’./../productos/_viewEncontrados’,));

y en _viewEncontrados:

Imprimo los atributos que quiero, ejemplo

$data[‘id’]

A mi me funciona, estoy intentado subir una foto ;)

Y ya que utilizas una sola vista para los resultados… supongo que tienes en todas tus tablas campos por ej id, descripcion, nombre… etc… me refiero a una nomenclatura de atributos similares… a diferencia de lo que yo tengo cada tabla tiene campos con atributos diferentes por lo que necesite un _result por cada modelo generado…

Este es mi caso

Si buscas "cosmética" te saldrán todos los productos de todas las subcategorias de cosmética, + todos los productos que contenga esa palabra en su nombre o descripcion, ya me entiendes, pero lo que pasa es que sí, busco en esas tres tablas pero sólo muestro información de una.

Estoy pensando una posible solución a tu problema ;) pero no se me ocurre

ahh ya entendi… tu busqueda solo lo hace en un solo modulo por ej… cosmetica…

mi busqueda es un poco mas complicada… porque se pueden seleccionar diferentes modelos de una lista, en los que se buscaria un termino…

Entiendo que lo quieres es buscar:

Perros y gatos de una tabla que cumplan una condición,

coches y motos de otra tabla que cumplan esa misma condición o otra

faldas y pantalones de otra que cumplan …

El resultado de cada una unirlo en un zii.widgets.CListView

No lo pones fácil

De hecho la lista de resultados no se pueden unir en un mismo cListView porque el itemView no funcionaria para todos los atritutos de diferentes modelos … es por eso que tengo un _result para cada modelo del que se encuentra informacion…

Se, parace complejo pero ya supere esa parte… :D

Intentaria hacer un cactivedataprovider cuyo array de contenidos fuese tal que asi:

array(‘nombremodelo’=>id) y en el view obtendria ese modelo porque sabes que modelo es y loadmodel por su id, solo haria falta implementar una especie de tostring en cada modelo que te devuelva lo que quieres mostrar de la forma que lo quieras mostrar.

No se si es posible pero suerte y estare pendiente de tu solucion un saludo.