Los filtros del CGridView me generan un error.

Buenas, se me presenta el siguiente problema a la hora de tratar de filtrar en todos los CGridView de mi aplicacion

Imagen

Pondre el codigo de uno de los CGridView a ver si alguien tiene idea de que pasa




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

	'id'=>'solicitudes-social-grid',

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

	'filter'=>$model,

	'columns'=>array(

		array ('header'=>Yii::t('app','Number'),'name'=>'id','value'=>'$data->id','type'=>'text'),

		array ('header'=>Yii::t('app','IdentificationCard'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->cedula','type'=>'text'),

		array ('header'=>Yii::t('app','Name'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->nombre','type'=>'text'),

		array ('header'=>Yii::t('app','LastName'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->apellido','type'=>'text'),

		array ('header'=>Yii::t('app','Type'),'name'=>'tipo_solicitudes_id','value'=>'$data->tipo_solicitudes->nombre','type'=>'text'),

		array ('header'=>Yii::t('app','Date'),'name'=>'fecha','value'=>'$data->fecha','type'=>'text'),

		array ('header'=>Yii::t('app','Description'),'name'=>'descripcion','value'=>'$data->descripcion','type'=>'text'),

		array ('header'=>Yii::t('app','Status'),'name'=>'estatus','value'=>'SolicitudesSocial::model()->getStatus($data->id)','type'=>'text'),

		array(

			'class'=>'CButtonColumn',

			'deleteConfirmation'=>Yii::t('app','DeleteSocialApplicantion'),

			'header'=>Yii::t('app','Actions'),

			'template'=>'{view}{update}{delete}{pdf}',

			'buttons'=>array(

			'view'=>array(

				'label'=>Yii::t('app','View'),

				'imageUrl'=>Yii::app()->theme->baseUrl."/img/icons/view-icon.png",

				'url'=>'Yii::app()->controller->createUrl("view", array("id"=>$data->id))',

			),

			'update'=>array(

				'label'=>Yii::t('app','Update'),

				'imageUrl'=>Yii::app()->theme->baseUrl."/img/icons/update-icon.png",

				'url'=>'Yii::app()->controller->createUrl("update", array("id"=>$data->id))',

				'visible'=>'Yii::app()->user->getIdCustomer() != "3"'

			),

			'delete'=>array(

				'label'=>Yii::t('app','Delete'),

				'imageUrl'=>Yii::app()->theme->baseUrl."/img/icons/delete-icon.png",

				'url'=>'Yii::app()->controller->createUrl("delete", array("id"=>$data->id))',

				'visible'=>'Yii::app()->user->getIdCustomer() == "1"'

			),

			'pdf'=>array(

				'label'=>'PDF',

				'imageUrl'=>Yii::app()->theme->baseUrl."/img/icons/pdf-icon.png",

				'url'=>'Yii::app()->controller->createUrl("viewpdf", array("id"=>$data->id))',

				'visible'=>'Yii::app()->user->getIdCustomer() == "1"'

			),

		),),

	),

)); ?>



y el código del function search del modelo




	public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id);

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

		$criteria->compare('descripcion', $this->descripcion);

		$criteria->compare('estatus',$this->estatus);

		$criteria->compare('solicitantes_id',$this->solicitantes_id);

		$criteria->with = array('solicitantes');

		$criteria->addSearchCondition('solicitantes.cedula', (string)$this->solicitantes_id, true);

		$criteria->addSearchCondition('LOWER(solicitantes.nombre)', strtolower((string)$this->solicitantes_id), true);

		$criteria->addSearchCondition('LOWER(solicitantes.apellido)', strtolower((string)$this->solicitantes_id), true);

		$criteria->with = array('tipo_solicitudes');

		$criteria->addSearchCondition('LOWER(tipo_solicitudes.nombre)', strtolower((string)$this->tipo_solicitudes_id), true);




		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'pagination'=>false,

		));

	}



Espero que puedan ayudarme muchas gracias de antemano

el error dice que columna id es ambigua (hay 2 tablas con la columna id), por lo que si identificas unívocamente la columna id estará resuelto.




 $criteria->compare('t.id',$this->id);



t es el alias para la tabla del modelo inicial.

osea yo tengo todas mis tablas con el campo clave id, no debería ser así?

Asi esta perfecto, lo único que tienes que hacer es diferenciarlas, es decir:

tabla1 -> id, nombre, precio, descripcion --> por ejemplo tabla artículos

tabla2 -> id, nombre, descripcion --> por ejemplo tabla clientes

Si haces una comparación utilizando las 2 tablas en un CDbCriteria tienes que decir donde




//aqui hay un problema con id, nombre, descripcion que pertenecen a ambas tablas

$criteria->compare('id',$this->id);                   <-- Yii no sabe de que tabla es

$criteria->compare('nombre',$this->nombre);           <-- Yii no sabe de que tabla es

$criteria->compare('descripcion',$this->descripcion); <-- Yii no sabe de que tabla es



Sin embargo si lo haces con el apellido mediante la relación solicitantes




$criteria->addSearchCondition('LOWER(solicitantes.apellido)', strtolower((string)$this->solicitantes_id), true);



Lo único tener en cuenta que t es el alias para la tabla del modelo inicial.

Por supuesto si en la query no hay campos con el mismo nombre no necesitas diferenciarlos

no amigo no me funciono, pero le cambie el nombre al campo id en la tabla y trabajo perfecto, pero ahora otro detalle, en el function search() hago un llamado de 3 campos de la misma relación "solicitantes"




public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;


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

		$criteria->with = array('tipo_solicitudes');

		$criteria->addSearchCondition('LOWER(tipo_solicitudes.nombre)', strtolower($this->tipo_solicitudes_id));

		$criteria->with = array('solicitantes');

		$criteria->addSearchCondition('LOWER(solicitantes.cedula)', strtolower($this->solicitantes_id), true); <- este es el 1ro, la cedula de la tabla solicitantes

		$criteria->with = array('solicitantes2');

		$criteria->addSearchCondition('LOWER(solicitantes.nombre)', strtolower((string)$this->solicitantes_id), true); <- este es el 2do, el nombre de la tabla solicitantes

                $criteria->addSearchCondition('LOWER(solicitantes.apellido)', strtolower((string)$this->solicitantes_id), true);  <- este es el 3ro, el apellido de la tabla solicitantes

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

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

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

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


		$_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'pagination'=>false,

		));

		

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'pagination'=>false,

		));

	}



pero cuando hago la búsqueda por filtro no me funciona




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

	'id'=>'solicitudes-social-grid',

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

	'filter'=>$model,

	'columns'=>array(

		array ('header'=>Yii::t('app','Number'),'name'=>'id_solsoc','value'=>'$data->id_solsoc','type'=>'text'),

		array ('header'=>Yii::t('app','IdentificationCard'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->cedula','type'=>'text'),

		array ('header'=>Yii::t('app','Name'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->nombre','type'=>'text'),

		array ('header'=>Yii::t('app','LastName'),'name'=>'solicitantes_id','value'=>'$data->solicitantes->apellido','type'=>'text'),

		array ('header'=>Yii::t('app','Type'),'name'=>'tipo_solicitudes_id','value'=>'$data->tipo_solicitudes->nombre','type'=>'text'),

		array ('header'=>Yii::t('app','Date'),'name'=>'fecha','value'=>'$data->fecha','type'=>'text'),

		array ('header'=>Yii::t('app','Description'),'name'=>'descripcion','value'=>'$data->descripcion','type'=>'text'),

		array ('header'=>Yii::t('app','Status'),'name'=>'estatus','value'=>'SolicitudesSocial::model()->getStatus($data->id_solsoc)','type'=>'text'),



El error esta creo en el name, ya que tanto cédula, nombre y apellido tienen el mismo name "solicitantes_id", porque cuando dejo uno solo en el CGridView funciona.

¿Que name debería usar en cada uno para que funcione?

Si cambiando el nombre esta claro que no hay problema, pero debería funcionar con el campo id también, que es el más común y el que utiliza yii por defecto.

Deberías resolver este problema con el campo id porque tarde o temprano lo volverás a tener.

Crea 2 variables en el modelo donde esta la función search, por ejemplo sol_nombre,sol_apellido y añadelas a las rules.




	public $sol_nombre;

	public $sol_apellido;


public function rules(){

        ....

        ['...,sol_nombre,sol_apellido', 'safe', 'on'=>'search'],

        ....

}


public function search() {

		$criteria=new CDbCriteria;


		$criteria->compare('id_solsoc',$this->id_solsoc);

		$criteria->with = array('tipo_solicitudes','solicitantes','solicitantes2');//comprueba si necesitas solicitantes2

		

		$criteria->addSearchCondition('LOWER(tipo_solicitudes.nombre)', $this->tipo_solicitudes_id);

		$criteria->addSearchCondition('LOWER(solicitantes.cedula)', $this->solicitantes_id, true);

		$criteria->addSearchCondition('LOWER(solicitantes.nombre)', $this->sol_nombre, true);

		$criteria->addSearchCondition('LOWER(solicitantes.apellido)', $this->sol_apellido, true);


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

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

		$criteria->compare('estatus',$this->estatus);

		$criteria->compare('asignada',$this->asignada);


		$provider = new CActiveDataProvider($this, array(

				'criteria'=>$criteria,

				'pagination'=>false,

		));

		

		$_SESSION['datos_filtrados'] = $provider;

		return $provider;

}



En el gridview en el name pon el de las nuevas variables, también ponlas en attributeLabels.

Las traducciones en los gridviews puedes ponerlas en attributeLabels y quitar los headers del gridview.

Espero que funcione, pero si no pon el error y veremos :rolleyes: ,