TUTORIAL YII FRAMEWORK (CAPÍTULO 6) – CLAVES FORÁNEAS EN VISTAS

Suponiendo que tenemos las siguientes tablas:

Donde id_estado es clave foránea en municipio y hace referencia al id de la tabla estado. Al crear el modelo y el CRUD para ambas tablas con la herramienta Gii tenemos como resultado que en las distintas vistas del modelo Municipio el estado al que pertenece dicho municipio siempre aparece reflejado con su id, para cambiar esto y que aparezca el nombre del estado en las distintas vistas debemos cambiar varias lineas de código, a continuación te explicamos como hacerlo. Si las relacionamos bien en el gestor de base de datos Yii por defecto nos configura la relación entre ellas, Definimos la relación en el modelo Municipio:

public function relations()

{
return array('estado' => array(self::BELONGS_TO, 'Estado', 'id_estado') );
}

La mejor forma de representar a los estados en los formularios de creación y modificación de municipios es con un combo box (drop down list), para eso colocamos la siguiente linea en el archivo /protected/views/municipio/_form.php

<?php echo $form->dropDownList($model,'id_estado', CHtml::listData(Estado::model()-
>findAll(), 'id', 'nombre_estado')); ?>

En lugar de:

<?php echo $form->textField($model,'id_estado'); ?>

Para colocar el nombre del estado en el “Detail View” de cada municipio nos vamos al archivo /protected/views/municipio/_view.php y modificamos las siguientes lineas:


<?php echo CHtml::encode($data->getAttributeLabel('id_estado')); ?>:
<?php echo CHtml::encode($data->id_estado); ?>

y colocamos:

<?php echo CHtml::encode($data->getAttributeLabel('Nombre Estado')); ?>:
<?php echo CHtml::encode($data->estado->nombre_estado); ?>

Si queremos que aparezca el nombre del estado en el View (Mostrar) del municipio abrimos el archivo /protected/views/municipio/view.php y nos fijamos en el siguiente código:

<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'nombre_municipio',
'id_estado',
),
)); ?>

Donde dice ‘id_estado’ cambiamos por ‘estado.nombre_estado’ . Si deseamos que aparezca el nombre del estado en el listado de municipios (Manage) modificamos en /protected/views/municipio/admin.php

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'municipio-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'nombre_municipio',
'id_estado',

cambiamos ‘id_estado’ por

array ('name'=>'id_estado','value'=>'$data->estado->nombre_estado','type'=>'text',)

Adicionalmente, para que la búsqueda pueda funcionar nos vamos a /protected/models/Municipio.php
y modificamos la función search.

Y donde aparece:

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

colocamos:

$criteria->with =array('estado');
$criteria->addSearchCondition('estado.nombre_estado', $this->id_estado);

Si queremos que traiga tanto con minúsculas o mayúsculas colocamos:

$criteria->addSearchCondition('LOWER(estado.nombre_estado)', strtolower($this->id_estado));

Si queremos que la búsqueda en el admin se haga mediante un combo colocamos:

array(
'header'=>'Estado',
// Nombre de la columna en el CGridView
'name'=>'id_estado',
// Nombre del dato en el modelo
'value' => '$data->estado->nombre_estado',
// Valor a mostrar
'htmlOptions'=>array('style'=>'text-align: center','width'=>'80px'),
// Opciones HTML
'filter' => CHtml::listData(TipoOrgG::model()->findAll(), 'id_estado',
'nombre_estado'), // Colocamos un combo en el filtro
),

Para crear un combo cuyos datos no provengan de la base de datos lo hacemos de esta forma:

$options = array(
array('id_tipo_org'=>1, 'descripcion'=>'Dato 1'), array('id_tipo_org'=>2, 'descripcion'=>'Dato 2'),
);
array( 'header'=>'Prueba', 'name'=>'id_tipo_org', 'value' => '$data->idTipoOrg->descripcion',
'htmlOptions'=>array('style'=>'text-align: center','width'=>'80px'),
'filter'=>CHtml::listData($options, 'id_tipo_org', 'descripcion'), ),

Anuncios

Publicado el 26/01/2012 en Yii Framework. Añade a favoritos el enlace permanente. 3 comentarios.

  1. Hola gabriel, estoy siguiendo tus publicaciones, y la verdad lo del combo si me funciona pero lo siguiente no, nada que ver $data->modelo->atributo no funciona, que sera, tendra algo que ver con la version del yii, estoy utilizando la ultima

    • saludos Julio, no es $data->modelo->atributo, es $data->relacion->atributo_en_la_tabla_foranea, avisame si es eso, gracias por leer el blog

    • Yo mismo me respondo, ya esta resuelto simplemente debia utilizar no el modelo vinculado sino el nombre definido en relations() del modelo el cual diferia y por eso no funcionaba, muy bien, gracias ….

Tu Opinión es Importante, Comenta!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s