Modificar Vista de la Acción Admin en Yii Framework

Cordial Saludo

Estoy dando mis primeros pasos con Yii Framework y he creado mi primer CRUD con el generador automático de código, más veo que la acción actionAdmin


public function actionAdmin()

	{

		$model=new Ciudad('search');

		$model->unsetAttributes();  // clear any default values

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

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


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

			'model'=>$model,

		));

	}

llama el listado de registros ya guardados en mi tabla de la BD, pero las llaves foráneas las imprime directamente, por lo cual necesito modificar esto, veo que la respectiva vista para imprimir este listado se genero el siguiente código:


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

		'id'=>'ciudad-grid',

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

		'filter'=>$model,

		'columns'=>array(

					'ciudad',

			'id_departamento',

			array(

				'class'=>'CButtonColumn',

			),

		),

	)); ?>

en el cual se hace referencia al método search del modelo


public function search()

	{

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

		// should not be searched.


		$criteria=new CDbCriteria;


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

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

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


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

en el cual según alcanzo a entender se hacen comparaciones para el buscador, más no encuentro la forma de hacer la respectiva modificación para que en el caso de las ciudades no me imprima el id del departamento en el cual está cada ciudad, sino más bien el nombre del departamento, por lo cual me veo en la necesidad de consultarles a ustedes, para saber cómo hacer esto.

Quedo atento a sus comentarios.

Muchas gracias.

Antes de trabajar con modelos relacionados debes asegurarte de que en tus modelos generados a partir de la base de datos (protected/models/) están definidas estas relaciones que mencionas.

Si en tu base de datos estás trabajando con el motor InnoDB u otro que soporte claves foraneas entonces lo más probable es que Yii haya identificado por ti las relaciones. Sin embargo no está de más revisar y personalizar éstas a gusto.

Puedes revisarlas en el método "relations()" de cada uno de tus modelos.

Según lo que entiendo, en tu modelo una Ciudad pertenece a un Departamento, pues la id del departamento baja a la tabla de la ciudad. Esto se vería reflejado en tu modelo con la siguiente relación:




// protected/models/Ciudad.php




public function relations() {

        return array(

            'departamento' => array(self::BELONGS_TO, 'Departamento', 'id_departamento'),

        );

}



Ahora, con esto implementado, puedes refinar tu método search de la siguiente forma:





    public function search() {

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

        // should not be searched.


        $criteria = new CDbCriteria;

        $criteria->with = 'departamento'; // esto es nuevo, si no me equivoco es equivalente a un join en SQL.


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

         $criteria->compare('departamento.nombre',$this->id_departamento,true); // reemplazar "nombre" con el campo del modelo Departamento que representa el nombre de éste.

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


        return new CActiveDataProvider($this, array(

                'criteria' => $criteria,

            ));

    }



Posteriormente, para mostrar correctamente en tu grid debes hacer lo siguiente:





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

	'id'=>'ciudad-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'ciudad',

		array(

			'name'=>'id_departamento',

			'value'=>'$data->departamento->nombre', // reemplazar acá el campo del modelo Departamento que representa el nombre.

		),

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>



Con esto incluso debería funcionar el filtro ajax.

Si te da problemas la relación BELONGS_TO, puedes probar la HAS_ONE, que sería algo como:




// protected/models/Ciudad.php




public function relations() {

        return array(

            'departamento' => array(self::HAS_ONE, 'Departamento', 'id_departamento'),

        );

}



Saludos.

Muchísimas!!! gracias por tu respuesta y amabilidad Mauricio, de verdad me funcionó sin problema, creo que por estos días voy a seguir “molestandote” mucho (por no decir demasiado) en este foro JAJAJAJJAJAJAA… ya que soy nuevo en el mundo de los frameworks de PHP y en mi nuevo empleo se desarrolla con Yii, más si tengo experiencia con OO y MVC. :D

Hola, ahora tengo otra pequeña duda, ¿cómo puedo generar un efecto similar para la acción actionView?


public function actionView($id)

	{

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

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

		));

	}

y su vista


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

	'data'=>$model,

	'attributes'=>array(

		//'id_ciudad',

		'id_departamento',

		'ciudad',

	),

)); ?>

hago mi consulta en este mismo comentario, ya que es mi día en este foro y no me dejo publicar una tercera nota.

Teniendo experiencia con MVC y OO no te será complicado, Yii es bien amigable.

Y respecto a las preguntas, no hay problemas que las sigas haciendo, para eso está el foro :D. Cada vez que tengo un tiempo vengo por acá a ver si puedo aportar con mi grano de arena.