CGridView

Hola a Todos

estot comenzando mi viaje po rle mundo de YII famework, hasta el momento estoy super contento con la gran cantidad de componentes y codigos generados a partir del CRUD me parece formidable,

Resulta que genere una tabla Departamento y otra Ciudad y el modelo de Ciudad tiene una relacion con Departamento, de BELONGS_TO y tengo dificultades con la vista de Search generada por el CRUD ya que estuve revisando como mostrar el nombre del Departamento en vez del id de la ciudad, pero ya revise par foros he hice lo que decia pero aun el filtro de la vista de Admin sigue si funcionar si alguien me puede colaborar les agradeceria ernormemente

Por favor pone el codigo que usas en la vista.

En especial el código del CGridView.


TENGO EL MISMO PROBLEMA SE ME DESAPARECIÓ EL FILTRO  




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

	'id'=>'tslciudad-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'ciudad_id',

		'ciudad_codigo',

		'ciudad_nombre',

		'departamento.departamento_nombre', //NOMBRE DE LA RELACIÓN ENTRE LAS DOS TABLAS EN EL MODELO Y NOMBRE DEL CAMPO QUE SE MUESTRA DE LA TABLA DEPARTAMENTO, ANTES ESTE CAMPO ESTABA DEPARTAMENTO_ID[/color] 

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>


//---------------- RELACIÓN DE LAS TABLAS


	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(

			'departamento' => array(self::BELONGS_TO, 'Tsldepartamento', 'departamento_id'),

			'tusmpersos' => array(self::HAS_MANY, 'Tusmperso', 'ciudad_id'),

		);

	}

Me pasa lo mismo, pudiste solucionarlo???

En la vista tienes que cambiar:

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

    'id'=&gt;'tslciudad-grid',


    'dataProvider'=&gt;&#036;model-&gt;search(),


    'filter'=&gt;&#036;model,


    'columns'=&gt;array(


            'ciudad_id',


            'ciudad_codigo',


            'ciudad_nombre',


            'departamento.departamento_nombre', //NOMBRE DE LA RELACIÓN ENTRE LAS DOS TABLAS EN EL MODELO Y NOMBRE DEL CAMPO QUE SE MUESTRA DE LA TABLA DEPARTAMENTO, ANTES ESTE CAMPO ESTABA DEPARTAMENTO_ID[/color] 


            array(


                    'class'=&gt;'CButtonColumn',


            ),


    ),

)); ?>

por

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

    'id'=&gt;'tslciudad-grid',


    'dataProvider'=&gt;&#036;model-&gt;search(),


    'filter'=&gt;&#036;model,


    'columns'=&gt;array(


            'ciudad_id',


            'ciudad_codigo',


            'ciudad_nombre',


            [b]array ('name'=&gt;'id_departamento', /*supongo que en ciudad el campo de BBDD se llama id_departamento */


                        'value'=&gt;'&#036;data-&gt;departamento-&gt;departamento_nombre',


                        'type'=&gt;'text',


                ),[/b]


            array(


                    'class'=&gt;'CButtonColumn',


            ),


    ),

)); ?>

Además en el metodo search del modelo Ciudad tienes que añadir algo asi:

$criteria->with =array(‘departamento’);

$criteria->addSearchCondition(‘departamento.departamento_nombre’, $this->id_departamento);

Es más o menos lo que hay que hacer, afinalo en función de tu código y nombre de los atributos del modelo.

Saludos.

Yo tenía el mismo problema. Ayer estuve toda la tarde intentando solucionarlo y no pude. Menos mal que encontré este post. rparra, muchas gracias.

Solo para agregar que también se puede ordenar por esa columna relacionada

en este post hay un ejemplo:

http://www.yiiframework.com/forum/index.php?/topic/9714-sort-user-defined-column-in-cgridview/page__view__findpost__p__48109

saludos

Holas soy nuevo en el tema YII framework llege a probar las opciones propuestas por rparra y me llego a funcionar todo bien, pero mi consulta esta en que pasa si quiero mostrar otro campo de las la misma tabla departamento es decir que aparte del departamento_nombre mostrar también departamento_ abreviatura

En la vista tendría que ser:

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

‘id’=>‘tslciudad-grid’,

‘dataProvider’=>$model->search(),

‘filter’=>$model,

‘columns’=>array(

‘ciudad_id’,

‘ciudad_codigo’,

‘ciudad_nombre’,

array (‘name’=>‘id_departamento’,

‘value’=>’$data->departamento->departamento_nombre’,

‘type’=>‘text’,

),

array (‘name’=>‘id_departamento’,

‘value’=>’$data->departamento->departamento_ abreviatura ,

‘type’=>‘text’,

),

array(

‘class’=>‘CButtonColumn’,

),

),

)); ?>

Y en el metodo search del modelo Ciudad tienes que añadir algo asi:

$criteria->with =array(‘departamento’);

$criteria->addSearchCondition(‘departamento.departamento_nombre’, $this->id_departamento);

$criteria->addSearchCondition(‘departamento.departamento_ abreviatura’, $this->id_departamento);

[b]

Al probar esta opción los filtros no me llega a funcionar debido a que el nombre de las componente es id_departamento , alguien me puede ayudar :rolleyes:

[/b]

Supongamos que tenemos las tablas:

departamentos

IdDepartamento

NombreDepartamento

AbreviaturaDepartamento

ciudades

IdCiudad

IdDepartamento

NombreCiudad

Para mostrar NombreDepartamento y AbreviaturaDepartamento en un CGridView de por ejemplo la vista admin de Ciudades, se haría de la siguiente forma:

1- Definimos dos variables (propiedades) en la clase del modelo de Ciudades:




class Ciudades extends CActiveRecord

{

    public $NombreDepartamento; 

    public $AbreviaturaDepartamento;



2- Añadimos estas propiedades en la función rules del modelo Ciudades para que se pueda buscar por ellas:




    public function rules()

    {

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

        // will receive user inputs.

        return array(

                    array('IdDepartamento, NombreCiudad', 'required'),

                    array('IdDepartamento', 'numerical', 'integerOnly'=>true),

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

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

                    array('NombreCiudad, NombreDepartamento, AbreviaturaDepartamento', 'safe', 'on'=>'search'),

        );

    }



3- Las relaciones del modelo Ciudades:




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(

                    'FK_Departamentos_Ciudades' => array(self::BELONGS_TO, 'Departamentos', 'IdDepartamento'),

        );

    }



4- Preparamos la función search del modelo Ciudades:




public function search()

    {

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

        // should not be searched.


        $criteria=new CDbCriteria;

        $sort=new CSort;                                            


        $sort->defaultOrder='NombreCiudad ASC, FK_Departamentos_Ciudades.NombreDepartamento ASC,          FK_Departamentos_Ciudades.AbreviaturaDepartamento';                   

        $sort->attributes=array(

                                'NombreCiudad'=>array(

                                    'asc'=>'NombreCiudad ASC, 

                                            FK_Departamentos_Ciudades.NombreDepartamento ASC,          

                                            FK_Departamentos_Ciudades.AbreviaturaDepartamento ASC',

                                    'desc'=>'NombreCiudad DESC, 

                                            FK_Departamentos_Ciudades.NombreDepartamento ASC,   

                                            FK_Departamentos_Ciudades.AbreviaturaDepartamento ASC',

                                ),

                                'NombreDepartamento'=>array(

                                    'asc'=>'FK_Departamentos_Ciudades.NombreDepartamento ASC,          

                                            FK_Departamentos_Ciudades.AbreviaturaDepartamento ASC,

                                            NombreCiudad ASC',

                                    'desc'=>'FK_Departamentos_Ciudades.NombreDepartamento DESC,          

                                             FK_Departamentos_Ciudades.AbreviaturaDepartamento ASC,

                                             NombreCiudad ASC',

                                ),

                                'AbreviaturaDepartamento'=>array(

                                    'asc'=>'FK_Departamentos_Ciudades.AbreviaturaDepartamento ASC,          

                                            FK_Departamentos_Ciudades.NombreDepartamento ASC,

                                            NombreCiudad ASC',

                                    'desc'=>'FK_Departamentos_Ciudades.AbreviaturaDepartamento DESC,          

                                             FK_Departamentos_Ciudades.NombreDepartamento ASC,

                                             NombreCiudad ASC',

                                ),

        );                                                          


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

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

        $criteria->compare('FK_Departamentos_Ciudades.NombreDepartamento',$this->NombreDepartamento,true);

        $criteria->compare('FK_Departamentos_Ciudades.AbreviaturaDepartamento',

                          $this->AbreviaturaDepartamento,true);


        return new CActiveDataProvider($this, array(

                                                    'criteria'=>$criteria,

                                                    'sort'=>$sort,

        ));

    }



5- Y por último configuramos el CGridView:




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

                        'id'=>'id-grid',

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

                        'filter'=>$model,

                        'columns'=>array(

                                  'NombreCiudad',

                                  array(

                                        'name'=>'NombreDepartamento', 

                                        'value'=>'$data->FK_Departamentos_Ciudades->NombreDepartamento' 

                                       ),

                                  array(

                                        'name'=>'AbreviaturaDepartamento', 

                                        'value'=>'$data->FK_Departamentos_Ciudades->AbreviaturaDepartamento' 

                                       ),

                                        array('class'=>'CButtonColumn'),

                                    ),

    ));



Un saludo.

muchas gracias