Filtros CGridView no funcionan

Hola a todos, les cuento la complicación que me ha surgido (una de tantas hasta ahora) por si alguien conoce la solución y me puede dar una mano, tengo un CGridView que carga los datos con los tratamientos realizados a un paciente pasando como parametro el id de la ficha de este paciente (tengo una tabla en mi bd para pacientes que está relacionada con ficha, ficha con una tabla tratamientos_realizados, y esta se relaciona con tratamientos que es solo la tabla que contiene los nombres y la descripción de estos ), los datos se cargan sin ninguna complicación, el problema surge a la hora de filtrar ya que no ocurre nada, ni se recarga la página ni se lanza un mensaje de error por lo cual acudo a ustedes por si han pasado por esto antes, para que me indiquen si me falta algo o estoy haciendo algo mal. Gracias desde ya, saludos.

Mi código es el siguiente

El mantenedor es este y se encuentra en la view de FichaDental


<?php

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

    'data' => $model,

    'attributes' => array(

        array(

            'label' => 'Nombre:',

            'value' => obtieneNombre($model),

        ),

    ),

));

?>


<h3><?php echo 'Tratamientos del paciente'; ?></h3>


<?php

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

    'id' => 'TratamientosRealizados',

    'dataProvider' => TratamientoRealizado::model()->searchByPaciente($model->id_ficha),

    'filter' => TratamientoRealizado::model(),

    'columns' => array(

        'id_realizado',

        'id_ficha',

        'id_tratamiento',

        'comentario',

        'valor',

        'fecha',

        array(

            'class' => 'CButtonColumn',

            'template' => '{view}{update}{delete}', // botones a mostrar

            'updateButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/update&id=$data->id_realizado" )', // url de la acción 'update'

            'deleteButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/delete&id=$data->id_realizado" )', // url de la acción 'delete'

            'viewButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/view&id=$data->id_realizado" )', // url de la acción 'delete'

            'deleteConfirmation' => 'Seguro que quiere eliminar el elemento?', // mensaje de confirmación de borrado

            'afterDelete' => '$.fn.yiiGridView.update("TratamientosRealizados");', // actualiza el grid después de borrar

        ),

    ),

));


//Funciones


function obtieneNombre($model) {

    $idFicha = FichaDental::model()->findByAttributes(array('id_ficha' => $model->id_ficha));

    $nombrePaciente = Paciente::model()->findByAttributes(array('rut_paciente' => $idFicha->rut_paciente));

    return $nombrePaciente->nombre_paciente . " " . $nombrePaciente->apellidos_paciente;

}

?>

En el controller de Ficha dental tengo este action


public function actionTratamientoPaciente($id) {

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

            'model' => $this->loadModel($id),

        ));

    }

En el modelo tratamiento realizado tengo el método que realiza la búsqueda


public function searchByPaciente($id)

        {

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


                $criteria=new CDbCriteria;


                $criteria->compare('id_ficha',$id,true);

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

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

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

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

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

                

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

        }

Te falta agregar los valores del filtro al model

Tienes


public function actionTratamientoPaciente($id) {

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

            'model' => $this->loadModel($id),

        ));

    }

y debes tener


public function actionTratamientoPaciente($id) {

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

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

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

            'model' => $this->loadModel($id),

        ));

    }

Hola de nuevo, disculpa ese $model que aparece en


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

a que debe hacer referencia? Probé con


$model = new TratamientoRealizado('search');

y con


$model = new Ficha('search');

y ninguna de las dos me llegó a funcionar.

Un Saludo

Debe ser


public function actionTratamientoPaciente($id) {

        $model=$this->loadModel($id)

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

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

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

            'model' => $model,

        ));

    }

Sigue sin funcionar, tendrá algo que ver con la estructura de directorios que tengo? me refiero a que el método actionTratamientoPaciente($id) se encuentra dentro de FichaDentalController y no dentro de TratamientoRealizadoController?

Lo que importa es que modelo carga la función loadModel del controller, si el modelo que carga no es el de TratamientoRealizado entonces puedes hacerlo manualmente.


public function actionTratamientoPaciente($id) {

        $model=TratamientoRealizado::model()->findByPk($id);

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

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

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

            'model' => $model,

        ));

    }

Ahora que veo tu view Corrijo.

En el controller tu debes mandar a la vista dos modelos, el de la ficha dental y el de los tratamientos, entonces debes tener en tu controller


public function actionTratamientoPaciente($id) {

        $modelTratamiento = new TratamientoRealizado('search');

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

            $modelTratamiento->attributes = $_GET ['TratamientoRealizado'];

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

            'model' => $this->loadModel($id),

            'modelTratamiento' => $modelTratamiento,

        ));

    }

y en tu view debes usar el modelTratamiento en el gridview


<?php

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

    'data' => $model,

    'attributes' => array(

        array(

            'label' => 'Nombre:',

            'value' => obtieneNombre($model),

        ),

    ),

));

?>


<h3><?php echo 'Tratamientos del paciente'; ?></h3>


<?php

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

    'id' => 'TratamientosRealizados',

    'dataProvider' => $modelTratamiento->searchByPaciente($model->id_ficha),

    'filter' => $modelTratamiento,

    'columns' => array(

        'id_realizado',

        'id_ficha',

        'id_tratamiento',

        'comentario',

        'valor',

        'fecha',

        array(

            'class' => 'CButtonColumn',

            'template' => '{view}{update}{delete}', // botones a mostrar

            'updateButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/update&id=$data->id_realizado" )', // url de la acción 'update'

            'deleteButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/delete&id=$data->id_realizado" )', // url de la acción 'delete'

            'viewButtonUrl' => 'Yii::app()->createUrl("/TratamientoRealizado/view&id=$data->id_realizado" )', // url de la acción 'delete'

            'deleteConfirmation' => 'Seguro que quiere eliminar el elemento?', // mensaje de confirmación de borrado

            'afterDelete' => '$.fn.yiiGridView.update("TratamientosRealizados");', // actualiza el grid después de borrar

        ),

    ),

));


//Funciones


function obtieneNombre($model) {

    $idFicha = FichaDental::model()->findByAttributes(array('id_ficha' => $model->id_ficha));

    $nombrePaciente = Paciente::model()->findByAttributes(array('rut_paciente' => $idFicha->rut_paciente));

    return $nombrePaciente->nombre_paciente . " " . $nombrePaciente->apellidos_paciente;

}

?>

Funcionó perfecto! muchas gracias :)