CGridView y el search

Hola a todos :D

Soy nueva en Yii y tengo un detalle al emplear el search en el CGridView, he visto varios post que tiene el mismo detalle y aunque ya según hice de todo aun sigo teniendo el mismo problema, explico, mi detalle consiste en que al agregar el search no me aparecen los text de busqueda :(

Agradecería muchísimo que alguien pudiera ayudarme a resolver esto, de antemano gracias :D

mi index esta de la siguiente forma

$this->widget(‘zii.widgets.grid.CGridView’,array(

  'id'=>'gridDominios',


 'dataProvider'=>$dataProvider->search(),


 'columns'=> array(





	           array(


                        'class'=>'CLinkColumn',


                        'labelExpression'=>'$data->nombre',


		    'urlExpression'=>'"index.php?r=dominiosMails/index&id=".$data->id_dominio',


		   )  , 


		  array(


		    'name'=>'Usuario',


		    'type'=>'raw',


		    'value'=>'$data->idUsuario->nombre." ".$data->idUsuario->ap_paterno." ".$data->idUsuario->ap_materno',


		  ),


		  array(


		    'class'=>'CButtonColumn',


						


					 ),      


				),





 ));

en el modelo agregue la relacion para obtener algunos datos como el ap_paterno y materno que utilizo en grid

( ‘value’=>’$data->idUsuario->nombre." “.$data->idUsuario->ap_paterno.” ".$data->idUsuario->ap_materno’)

public function relations()

{


	// NOTE: you may need to adjust the relation name and the related


	// class name for the relations automatically generated below.


	return array(


		'idUsuario' => array(self::BELONGS_TO, 'CatUsuarios', 'id_usuario'),


   	);





}

de igual forma modifique el search

public function search()

{

	// Warning: Please modify the following code to remove attributes that


	// should not be searched.








$criteria=new CDbCriteria;


    $criteria->with = 'idUsuario';// esto es nuevo, si no me equivoco es equivalente a un join en SQL.





    $criteria->compare('nombre',$this->nombre,true);


    $criteria->compare('idUsuario.nombre',$this->id_usuario,true);


   	return new CActiveDataProvider(get_class($this), array(


		'criteria'=>$criteria,


     ));

}

Bienvenido/a!

No entendí muy bien lo que querés hacer.

¿Lo que querés lograr es que en el Grid te aparezca el campo para filtrar por un registro relacionado?

Si es eso ¿viste este link?

En ese caso hay varios pasos.

Confirmános si es eso y vemos cómo te ayudamos.

Hola, :D sii creo que no soy muy buena explicando lo que necesito hacer :P, pero si, lo que necesito hacer es eso que en el Grid aparezca el campo para filtrar por un registro relacionado, agrego el search, y dentro del grid me deberían aparecer los textfield de búsqueda para ir filtrando pero no me aparecen.

Revise la página que me recomendaste pero según yo lo tengo tengo todo, agregada la relación, la regla, modificado el search pero aun así no me aparece, debo tener algún error o algo que no deja que me aparezcan los textfield de búsqueda.

Gracias de antemano por tu ayuda :D

Ok! No hay problema.

Siguiendo la guía esa hay varios pasos.

El primero es agregar en la clase una propiedad para usar en la búsqueda, por ejemplo:




<?php

class Dominio extends CActiveRecord

{

	/**

	 * Para filtrar en la búsqueda

	 * http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/

	 */ 

	public $usuario_nombre;

	...

	...



Más abajo, en el método rules() agregás la nueva propiedad como "safe" en la búsqueda:




	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			// Primero las reglas ya definidas

			// ...

			// ...

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('nombre,usuario_nombre', 'safe', 'on'=>'search'),

		);

	}



Y en el método search lo siguiente:




	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.




		$criteria=new CDbCriteria;

		$criteria->with = 'idUsuario';// esto es nuevo, si no me equivoco es equivalente a un join en SQL.


		$criteria->compare('nombre',$this->nombre,true);

		//

		$criteria->compare('idUsuario.nombre',$this->usuario_nombre,true); // Acá lo cambié

		//		

		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

		));

	}



Y si no me equivoco, por último falta sólo el Grid, que en tu caso quedaría algo como:




$this->widget('zii.widgets.grid.CGridView',array(

	'id'=>'gridDominios',

	'dataProvider'=>$dataProvider->search(),

	'columns'=> array(

		array(

			'class'=>'CLinkColumn',

			'labelExpression'=>'$data->nombre',

			'urlExpression'=>'"index.php?r=dominiosMails/index&id=".$data->id_dominio',

		) ,

		array(

			'header'=>'Usuario',

			'name'=>'usuario_nombre',

			'value'=>'$data->idUsuario->nombre',

		),

		array(

			'class'=>'CButtonColumn',

		),

	),

));



Por ahora podrías probarlo así que la columa del Grid está simplificada, sólo para ver si funca.

Si al menos aparece el cuadrito para filtrar es porque algo avanzamos!

De verdad muchas gracias por tu ayuda :D

Probe como me sugeriste y nada, siguen sin salir los text para filtrar.

Una pena.

Yo tengo varias pantallas así y funcionan, así que el detalle debe ser mínimo.

Sería bueno si pudieras subir la aplicación funcionando a algún lado así la podemos ver.

Mmmh…seremos?

Falta algo.




$this->widget('zii.widgets.grid.CGridView',array(

        'id'=>'gridDominios',

        'dataProvider'=>$dataProvider->search(),

        'filter'=>$dataProvider, // Esto?

        'columns'=> array(

                array(

                        'class'=>'CLinkColumn',

                        'labelExpression'=>'$data->nombre',

                        'urlExpression'=>'"index.php?r=dominiosMails/index&id=".$data->id_dominio',

                ) ,

                array(

                        'header'=>'Usuario',

                        'name'=>'usuario_nombre',

                        'value'=>'$data->idUsuario->nombre',

                ),

                array(

                        'class'=>'CButtonColumn',

                ),

        ),

));



Pufffff, si sereee, siiiiii!!!! graciassss ya sale el text de filtrooo :D me marca error al buscar pero ya salee el cuadrito

^_^

Mientras salga el cuadrito, yo soy feliz…

jajajaja, creemeee yo igual, mas que feliz, sabia que era algo pero no veía quee, asiii abusando de tu ayudaa, la cual agredezcoo muchisisisimooo no tienes idea de cuantooo, tengo una duda enorme, en mi controlador que llama a ese grid, se supone que debo agregar algo asi:

$dataProvider= new UsuariosDominios(‘search’);

$dataProvider->unsetAttributes(); // clear any default values

if(isset($_GET[‘UsuariosDominios’]))

&#036;dataProvider-&gt;attributes=&#036;_GET['UsuariosDominios'];

$this->render(‘index’, array(‘dataProvider’ => $dataProvider));

pero yo lo tenia de la siguiente forma el dataprovider que le enviaba al grid

$criterios = new CDbCriteria;

$criterios->select="u.id_usuario,t.nombre,t.id_dominio ";

$criterios->join=" LEFT JOIN t_usuarios_accesos ua on ua.id_usuario=t.id_usuario

	 LEFT JOIN cat_usuarios u on u.id_usuario=t.id_usuario&quot;;

$criterios->condition="ua.id_reseller=$idUsuario or t.id_usuario=$idUsuario";

$dataProvider = new CActiveDataProvider(‘UsuariosDominios’, array(

				   'criteria' =&gt;&#036;criterios));

$this->render(‘index’, array(‘dataProvider’ => $dataProvider));

me crea un poco de confusion esto “$dataProvider= new UsuariosDominios(‘search’);” como se lo pongo al dataprovider que tengo con las consultas??, o estoy mal o como se debe de hacer?, se que abuso de tu ayudaa, pero tengo esa duda que no entiendo como hacerlo, :D graciassss, muchas graciassss resolviste con lo que estuve un buen ratooo :D

Haha! Basta de agradecer…los dos estuvimos un buen rato y el problema era una…"sutileza"…

Ahora medio que te hiciste un matete con el dataProvider, eh…

Te pregunto algo porque parece que estuvieras programando todo desde cero.

¿Nunca utilizaste el CRUD generado por GII o por yiic?

Ahí está bien ejemplificado cómo funciona, sería bueno que para probar el código que genera lo uses al menos al principio.

En el controller vos deberías tener algo similar al ejemplo que ponés pero para que quede como lo genera YII te diría que hagas así, cambiando la variable $dataProvider por $model:




public function actionIndex(){

	$model = new UsuariosDominios('search');

	$model->unsetAttributes(); // clear any default values


	if(isset($_GET['UsuariosDominios']))

		$model->attributes=$_GET['UsuariosDominios'];

	$this->render('index', array('model' => $model));

}



Después, en el grid:




$this->widget('zii.widgets.grid.CGridView',array(

        'id'=>'gridDominios',

        'dataProvider'=>$model->search(), // acá

        'filter'=>$model,  // y acá

        'columns'=> array(

                array(

                        'class'=>'CLinkColumn',

                        'labelExpression'=>'$data->nombre',

                        'urlExpression'=>'"index.php?r=dominiosMails/index&id=".$data->id_dominio',

                ) ,

                array(

                        'header'=>'Usuario',

                        'name'=>'usuario_nombre',

                        'value'=>'$data->idUsuario->nombre',

                ),

                array(

                        'class'=>'CButtonColumn',

                ),

        ),

));



Fijáte que en este ejemplo el dataProvider del grid recién se genera en la llamada a $model->search().

Ese método search() es el que está en tu clase UsuariosDominios, y te devuelve una instancia de data provider ya con la criteria aplicada, así que ahí es donde tenés que generar la query.

El código normalmente es generado así, y te va a resultar más cómodo para seguir los ejemplos que hay dando vueltas.

Si la verdad creo que me revolvi bastantitoo :P, sii utilice el crud, pero me resulto algo confuso, por la parte administrador que tenía y todo lo que generaba, de ahi fui tomando como hacer el grid y la búsqueda, creo que ya entendí como debería de hacerlo, en el search colocaré la busqueda que realizo, de hecho ya busca, ya funciona, pero ahora sii, una última duda

array(‘class’=>‘CLinkColumn’,

   'labelExpression'=&gt;'&#036;data-&gt;nombre',                       


   'urlExpression'=&gt;'&quot;index.phpr=dominiosMails/index&amp;id=&quot;.&#036;data&gt;id_dominio',               

) ,

array(

   'header'=&gt;'Usuario',                        


   'name'=&gt;'usuario_nombre',                        


   'value'=&gt;'&#036;data-&gt;idUsuario-&gt;nombre',                

),

al ponerle el ‘name’ me dice “Propiedad “CLinkColumn” name” que no esta definida o algo asi, entndí que ‘name’ debo colocarlo para que realice la búsqueda, cómo lo coloco ahi??

Claro…CLinkColumn no tiene una propiedad "name", que sí la tiene CDataColumn (la clase de columna por defecto: http://www.yiiframework.com/doc/api/1.1/CDataColumn).

¿Podrías ser más específico acerca de qué tiene que mostrar esa columna y qué filtro tendría que tener?

si claro, algo asi es lo que debe de tener

array(‘class’=>‘CLinkColumn’,

‘labelExpression’=>’$data->nombre’,

‘urlExpression’=>’“index.phpr=dominiosMails/index&id=”.$data>id_dominio’,

) ,

array(

‘header’=>‘Usuario’,

‘name’=>‘usuario_nombre’,

‘value’=>’$data->idUsuario->nombre’,

),

la primera columna, que es el ‘CLinkColumn’ contiene los nombres de unos dominios y

en la segunda columna de usuario, es a quien pertenece ese dominio,

quiero filtrar asi como en usuario por nombre, el de dominios por nombre de ese dominio pero ese es un link que me lleva a otra acción, no se si me explique bien

No creo que se pueda filtrar con un CLinkColumn ya que sólo es para mostrar links.

Podrías cambiar el tipo de columna y que quede algo así:




array(

	'type'=>'raw',

	'header'=>'Nombre',

	'name'=>'nombre',

	'value'=>'CHtml::link($data->nombre, array("dominiosMails/index", "id"=>$data>id_dominio));',

),

array(

	'header'=>'Usuario',

	'name'=>'usuario_nombre',

	'value'=>'$data->idUsuario->nombre',

),



Pero ya no puedo asegurarte nada porque a estas horas de la madrugada empiezo a dejar de funcionar.

Siii!!! tenias toda la razón :D probado y comprobado, listo y funcionandooo, :D gracias por tu ayuda :D