CGridView que muestre datos solo de una fecha concreta

tengo una base de datos para inasistencias que se ve así

y busco las asistencias mediante un formulario que se ve asi en el cual debo ingresar la fecha

el problema es que cuando le doy buscar me muestra todos las asistencias de todos los días

aqui dejo el codigo del CGridView




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

	'id'=>'inasistencias-grid',

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

	'filter'=>$model,

	'columns'=>array(

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

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

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

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

		'fecha',

		'hora_entrada',

		'hora_salida',


	),

)); ?>



y este es el código del search en el modelo de inasistencias




	public function search($fechaB)

	{

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

		$criteria=new CDbCriteria;

		$fechaB = $this->fechaB;

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

		$criteria->addSearchCondition('LOWER(empleados.cedula)', strtolower($this->empleados_id));

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

		$criteria->addSearchCondition('LOWER(empleados.nombre)', strtolower($this->empleados_id));

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

		$criteria->addSearchCondition('LOWER(empleados.apellido)', strtolower($this->empleados_id));

		$criteria->compare('fecha', $fechaB);

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

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


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}



De verdad espero puedan ayudarme ya que tengo un par de días con ese problema y nada que logro resolverlo

Hola,

Has mirado que en el modelo inasistencias, en las rules tengas los atributos de búsqueda en el escenario search?

array(‘fechaB, …’, ‘safe’, ‘on’ => ‘search’),

si amigo en el rules en el escenario search tengo la linea




    array('fechaB, ...', 'safe', 'on' => 'search'),



En la función de búsqueda:




   $criteria->with = array('empleados');   <--- Con ponerlo una vez vale, 

   $fechaB = $this->fechaB;                <--- Esto esta al revés debe ser $this->fechaB = $fechaB;



No te esta haciendo el filtro porque al hacer $fechaB = $this->fechaB; estas eliminando la condición de búsqueda.

Paso a paso lo que tienes que hacer es lo siguientes

  1. Revisar en el model que tengas la variable public $fechaB y que sea "safe" en el rules de ecenario search

  2. Revisar en el controller que le estas pasando el POST O GET del formulario al model, debes tener algo como $model->fechaB=$_POST[‘Model’][‘fechaB’]; donde Model es el nombre de tu modelo

  3. En el view, en el cgridview, llama al metodo search (no necesitas pasarle la fechaB) ‘dataProvider’=>$model->search(),

  4. En el model,en el metodo search, quita el parametro fechaB, debe ser public function serach()

  5. Igual en el model, en el metodo search, agrega la comparación con la fechaB, $criteria->compare(‘fecha’, $this->fechaB);

  6. Si sigue sin funcionar en el model,en el metodo search, trata de usar solamente $criteria->addSearchCondition y solamente $criteria->compare.

Notas:

Cuando usas $this->fechaB en el view es porque debes tener una variable llamada $fechaB en el controller y normanlmente las variables se ponen en el model.

En el formulario de busqueda el input debe ser de la variable $fechaB por ejemplo <?php echo $form->textField($model,‘fechaB’); ?>

Lo solucione ayer, hice algo parecido a lo que dice a18327 mas tarde o mañana publico bien la corrección, muchas gracias

Hi forum, I have a question, I would like to know how I can set an empty date on action create and enter the date on update.

Thanks and hope we can help me.

Publicando la solucion:

Primero el CGridView hice esta modificación, en el dataprovider, ya no envio parametros a traves del search().




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

	'id'=>'inasistencias-grid',

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

	'filter'=>$model,

	'columns'=>array(

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

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

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

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

		'hora_entrada',

		'hora_salida',


	),

)); ?>



hice una modificacion al controlador en el action, como veran cree un $_GET que sera el que me guarde lo que envie en el campo de texto.




	public function actionSearch()

	{

		$model=new Inasistencias;

		$this->performAjaxValidation($model);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Inasistencias']))

		{

			$model->attributes=$_POST['Inasistencias'];

			$_GET['fecha'] = $model->fechaB;

			$this->redirect(array('admin', 'fecha'=>$model->fechaB));

		}


		$this->render('search', array(

			'model'=>$model,

		));

	}



Y por ultimo modifique el modelo en la function search() quedando así

, como veran en el compare con el campo fecha, lo hago con el GET que cree en el controlador.




	public function search()

	{

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

		$criteria=new CDbCriteria;

		$criteria->compare('fecha', $_GET['fecha'], true);

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

		$criteria->addSearchCondition('LOWER(empleados.cedula)', strtolower($this->empleados_id));

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

		$criteria->addSearchCondition('LOWER(empleados.nombre)', strtolower($this->empleados_id));

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

		$criteria->addSearchCondition('LOWER(empleados.apellido)', strtolower($this->empleados_id));

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

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


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}



Luego de hacer esto funciona perfecto