Pregunta respecto a CGridView

Buenas tardes, comunidad Yii, soy Esteban de Colombia y soy nuevo en el framework, me ha parecido muy interesante y práctico.

Tengo un pequeño problema para mostrar algunos datos con CGridView; explico el contexto.

Tengo una columna ciudad y una departamento en la base de datos, están asociadas con el id del departamento. Al hacer el Crud con Gii se genera todo bien, pero en las vistas, admin y view, muestran el id del departamento, lo que quiero es que en vez del id se muestre el nombre del departamento.

Agradecería mucho una luz, he revisado la documentación de cGridView y veo que se puede agregar un array en el widget de cgridView, pero no encuentro como hacerlo.

Muchas Gracias y quedo atento!

Mira mi respuesta aqui http://www.yiiframework.com/forum/index.php/topic/58441-problema-con-filtros/page__p__264407#entry264407

Te recomiendo instalar la extensión de bootstrap, pero debe funcionar de esta forma.

La columna la haces array

Yo lo hago de esta forma.




'nombre',

array('name'=>'departamento_id',

      'value'=>'$data->departamento->nombre',

     'filter'=>CHtml::listData(Departamento::model()->findAll('nombre IS NOT NULL'), 'id', 'nombre'),

      'htmlOptions'=>array('class'=>'span2')

),

array('class'=>'bootstrap.widgets.TbButtonColumn'),



Es importante tener las relaciones en el modelo.

Hola, Gracias a los 2 por contestar.

Aún no me funciona, traté de hacer como estaba tu respuesta a18327 te muestro como lo tengo:

el modelo




class Ciudad extends CActiveRecord


private $_nombredepartamento;


:::


array('idciudad, ciudadcod, nombreciudad, departamento_iddepartamento, fechaingreso, nombredepartamento', 'safe', 'on'=>'search'),//function rules


:::


'departamento_iddepartamento' => array(self::BELONGS_TO, 'Departamento', 'departamento_iddepartamento'),//function relations


:::


public function searchDepto()

	{

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


		$criteria=new CDbCriteria;


		$criteria->with=array('departamento_iddepartamento.iddepartamento');

		$criteria->compare('iddepartamento.nombredepartamento',$this->nombredepartamento, true);

		

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

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

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

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

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

		

		$sort=new CSort();

		$sort->attributes=array(

                        'nombredepartamento'=>array(

                                        'asc'=>'iddepartamento.nombredepartamento ASC',

                                        'desc'=>'iddepartamento.nombredepartamento DESC',

                        ),

                        '*',

                );            


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'sort'=>$sort,

		));

	}


public function getDepto(){//<-------La funcion get

            if(!isset($this->_nombredepartamento)){

                if(isset($this->departamento_iddepartamento)){

                    if(isset($this->departamento_iddepartamento->iddepartamento)){

                        $this->nombredepartamento=$this->departamento_iddepartamento->iddepartamento->nombre_departamento;

                    }

                }

            }

            return $this->_nombredepartamento;

        }

        public function setDepto($nombredepartamento){//<----------La funcion set

            $this->nombredepartamento=$nombredepartamento;        

        }






la vista:




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

	'id'=>'ciudad-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'idciudad',

		'ciudadcod',

		'nombreciudad',

		array(

			'name'=>'nombredepatamento',

			//'value'=>'$data->departamento->departamento_iddepartamento',

			),

		//'nombre'=>array(

			//'name'=>'departamento_iddepartamento',

			//'value'=>'',

		//	),

		'fechaingreso',

		array(

			'class'=>'CButtonColumn',

		),



Agredecería tu ayuda de nuevo.

Me sale: La propiedad "Ciudad"."nombredepartamento" no se encuentra definida.

ahora intentaré lo que dice Roberto Zamarripa

Gracias

mira… parece que tienes un error en la declaracion de la varible.

esta es la tu declaracion.

private [color="#FF0000"]$_nombredepartamento[/color];

porque al momento de hacer uso de $this-> para acceder a dicha propiedad no es la misma declarada anteriormente

[color="#0000FF"]$this->nombredepartamento[/color],

A demas debes agregar ese nuevo atributo en el arreglo de rules. donde se declaran estos como safe para realizar poder realizar la busqueda y no realize validaciones de los tros atributos.

        array('nombredepartamento' 'safe', 'on' =&gt; 'search'),

es verdad EddiRiascos, tienes razón en cuanto a la declaración de la variable. En cuanto a agregar el atributo en rules, ya está, lo puedes ver en el código posteado. Ya corregí la declaración, pero aún sale el mismo error :s.

Muchas gracias!

en el código solo están los apartes más importantes en este caso, creo

Bueno ahora veo que realizas un with en el metodo

[color="#FF0000"]$criteria->with=array(‘departamento_iddepartamento.iddepartamento’);

[/color]

en este solo debes de decir el nombre de la relacion

[color="#0000FF"]$criteria->with=array(‘departamento_iddepartamento’);[/color]

Creo que tienes un error en el compare que realizas con el nombre del departamento

$criteria->compare(’[color="#FF0000"]iddepartamento.nombredepartamento[/color]’,$this->nombredepartamento, true);

en esa parte coloreada debes poner el nombre de la relacion asi [nombre de la relacion.propiedad]:

$criteria->compare([color="#0000FF"]‘departamento_iddepartamento.nombredepartamento’[/color],$this->nombredepartamento, true);

luego para terminar en la grilla. donde pones la columna [color="#FF0000"]nombredepatamento[/color] y lo correcto seria [color="#0000FF"]nombredepartamento[/color]

[color="#FF0000"]array(

‘name’=>‘nombredepatamento’, //‘value’=>’$data->departamento->departamento_iddepartamento’,

                    ),[/color]

debes asignar el value de la siguiente manera [relacion].[atributo privado que definistes]

[color="#0000FF"]

array(

‘name’=>‘nombredepartamento’, //‘value’=>’$data->departamento_iddepartamento->nombredepatamento’,

                    )[/color]

Cometiste algunos errores al seguir mi respuesta


class Ciudad extends CActiveRecord


private $_nombredepartamento;


:::


array('idciudad, ciudadcod, nombreciudad, departamento_iddepartamento, fechaingreso, nombredepartamento', 'safe', 'on'=>'search'),//function rules


:::


'departamento_iddepartamento0' => array(self::BELONGS_TO, 'Departamento', 'departamento_iddepartamento'),//<----Correción Aqui, la relacion y el foreign key deben ser diferentes


:::


public function searchDepto()

        {

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


                $criteria=new CDbCriteria;


                $criteria->with=array('departamento_iddepartamento0');//<---Correción Aqui, solo tenias que poner el nombre de la relacion

                $criteria->compare('departamento_iddepartamento0.nombredepartamento',$this->nombredepartamento, true);//<---Correción Aqui, debes comparar la columna nombredepartamento de la relacion

                

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

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

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

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

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

                

                $sort=new CSort();

                $sort->attributes=array(

                        'nombredepartamento'=>array(

                                        'asc'=>'departamento_iddepartamento0.nombredepartamento ASC',//<--Correcion Aqui, debes comparar ordenar por la columna nombredepartamento de la relación

                                        'desc'=>'departamento_iddepartamento0.nombredepartamento DESC',//<--Correcion Aqui, debes comparar ordenar por la columna nombredepartamento de la relación

                        ),

                        '*',

                );            


                return new CActiveDataProvider($this, array(

                        'criteria'=>$criteria,

                        'sort'=>$sort,

                ));

        }


public function getNombredepatamento(){//<-------Correción Aqui, el nombre de la función get debe coincidir con el nombre que usaste en la vista

            if(!isset($this->_nombredepartamento)){

                if(isset($this->departamento_iddepartamento)){

                    if(isset($this->departamento_iddepartamento0->nombredepartamento)){//<---Correción Aqui, debes comprobar que la columna nombredepartamento de este declarada

                        $this->_nombredepartamento=$this->departamento_iddepartamento0->nombredepartamento;//<---Varias correciones Aqui, el valor lo debes asignar a la variable declarada al principio, y debes asignarle el valor de la columna nombredepartamento de la relacion, el nombre de la columna de la relacion es nombredepartamento no nombre_departamento (verificalo yo no conozco tus tablas)

                    }

                }

            }

            return $this->_nombredepartamento;

        }

        public function setNombredepatamento($nombredepartamento){//<---------Correción Aqui, el nombre de la función set debe coincidir con el nombre que usaste en la vista

            $this->_nombredepartamento=$nombredepartamento; //<---Correcion Aqui, la asignación lo debes hacer a la variable declarada al principio       

        }



Te confundiste con los nombres de tus columnas y la relación, no puedes llamar a la relación de igual forma que la columna foreign key porque no te funcionaria la relación, la relacion la utilizas para comparar y ordenar es decir funciona como alias de la tabla relacionada, por eso cuando quieres comparar una columna de la relación pones la relacion (alias), un punto y el nombre de la columna, por ejemplo tablarelacionada.columna1 donde tablarelacionada es el nombre de la relación. Otra cosa que vi es que el nombre de la columna unas veces lo pones como nombredepartamento y otras como nombre_departamento. Tambien con la variable pones $this->nombredepartamento en lugar de $this->_nombredepartamento, la primera llama a la función getNombredepartamento y si no existe la función te marca un error, la seguna de llama a la variable del principio, la variable $this>_nombredepartamento la utilizas en las funciones get y set, y la función $this->nombredepartamento (fijate que se llama como una variable pero no lo es) la utilizas en los demas lugares, es decir, en la vista, en la función search, etc.

la columnas que define en la grilla no es [color="#0000FF"]nombredepartamento[/color] es [color="#0000FF"]nombredepatamento[/color]<- esta varible no es la misma que definistes -> [color="#0000FF"]private $nombredepartamento[/color]