[Resuelto] Filtro DropDown personal en el CrgidView

Saludos a toda la comunidad…

Tengo una duda en la creación de un filtro personalizado en el CGridView. La cuestión es simple ejemplo: tengo 2 modelos y quiero hacer un filtro en el CgridView utilizando un DropDownList, ahora donde se complica un poco la cuestión es que no quiero cargar en el “FILTRO” todos los datos del 2do modelo (modelo del que voy a cargar el DropDown) solo quiero cargar los datos que están siendo usados por el 1er modelo así siempre voy a tener resultado de consultar y no van a existir los molestos “No se encontraron resultados”. Más Clarificado:

-Personas(id,nombre,id_model2)

-Paises(id,nombre)

Valores:

Personas= array((1=>Francisco, 3), (2=>Eduardo, 1), (3=>Francisco, 3))

Paises= array(1=>Cuba, 2=>Italia, 3=>Alemania, 4=>España)

Como pueden Observar aquí solo se usaron 2 países de 4 y para mí es muy molesto que si solo se usaron 2 en el filtro me salgan los 4, pues si son 100 paises y solo se usan 50 van a existir 50 busquedas vacias. Hasta ahora he logrado que me salgan solo los países que están siendo usados pero el filtro no me muestra el valor correspondiente al país sino que me lo pone vacío, filtra y todo bien pero hay que ser adivino para saber por qué valor estas filtrando. Aquí pongo los códigos ejemplo de lo que tengo hasta ahora.

Columna en el admin.php de Personas




'pais_id'=>array(

	'name' => 'pais_id',

	'value' => '$data->pais->nombre_pai',

	'filter'=> CHtml::listData(Personas::model()->findAll(), 'pais_id', 'pais->nombre_pai'),

),



Relación en el Model1




'pais' => array(self::BELONGS_TO, 'Paises', 'pais_id'),



Criteria se mantiene por default




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



Este código funciona y filtra bien. Ahora el problema es en los valores a mostrar en el filtro no me salen. Lo que hago aquí en vez de buscar por Por Paises para que no me salgan todos y nada más las ocurrencias de ellos en Personas busco por la relación país_id y funciona muy bien hasta la parte donde solo muestra espacios vacíos o los id, pero no los nombre de paises. He probado algunos métodos para arreglar este problema pero no me deja ponerlos en el 3er argumento del listData, me da error. Así que comunidad que estoy haciendo mal. Por favor alguna ayuda para si no se puede, no seguir rompiéndome la cabeza.

Resuelto. Aunque tube que rebuscar un poco. Para los que le sirva o quieran probar aqui pongo la respuesta:

Este codigo lo pueden poner en el modelo 1 o en el modelo2 da igual funciona indistintamente. la diferencia solo esta en llamarlo desde el view.

Modelo Pais.php o Persona.php




	public function getFilterPais()

	{

		 $paises=Pais::model()->with(array( //aqui lo que estoy buscando que son paises

	            'personas'=>array( // aqui la relacion Many que esta en Pais con el Modelo1

	            'select'=>'nacionalidad_id', //este es el campo que guarda la relacion BELONGS en Personas

	            'joinType'=>'INNER JOIN', // Sin explicacion ...

	            //'condition'=>, //No la necesite pero se puede usar tambien.

	        ),

	        ))->findAll();

		

	  return $paises; 

	}



Vista admin.php de Personas que es donde queremos que se muestre el filtro




array(

    'name' => 'nacionalidad_id',

    'value' => '$data->nacionalidad->nombre_pai',

    'filter'=> CHtml::listData(Persona::getFilterPais(), 'id', 'nombre_pai'), //Aqui si pusiste el metodo en Pais es

),                                                                           // Pais::getFilterPais()



Saludos espero que les haya servido. Si tienen alguna duda no duden en preguntarme.

Resuelto. Aunque tube que rebuscar un poco. Para los que le sirva o quieran probar aqui pongo la respuesta:

Este codigo lo pueden poner en el modelo 1 o en el modelo2 da igual funciona indistintamente. la diferencia solo esta en llamarlo desde el view.

Modelo Pais.php o Persona.php




        public function getFilterPais()

        {

                 $paises=Pais::model()->with(array( //aqui lo que estoy buscando que son paises

                    'personas'=>array( // aqui la relacion Many que esta en Pais con el Modelo1

                    'select'=>'nacionalidad_id', //este es el campo que guarda la relacion BELONGS en Personas

                    'joinType'=>'INNER JOIN', // Sin explicacion ...

                    //'condition'=>, //No la necesite pero se puede usar tambien.

                ),

                ))->findAll();

                

          return $paises; 

        }



Vista admin.php de Personas que es donde queremos que se muestre el filtro




array(

    'name' => 'nacionalidad_id',

    'value' => '$data->nacionalidad->nombre_pai',

    'filter'=> CHtml::listData(Persona::getFilterPais(), 'id', 'nombre_pai'), //Aqui si pusiste el metodo en Pais es

),                                                                           // Pais::getFilterPais()



Saludos espero que les haya servido. Si tienen alguna duda no duden en preguntarme.