2012-01-30 20 views
5

que tienen la base de datos al igual que esteUsando CGridView para mostrar los atributos de otro modelo

==== Group ===== 
id 
name 

==== Member ==== 
id 
group_id 
firstname 
lastname 

Ahora puedo utilizar miembro atribuye la mesa del miembro de grupo controlador sólo mediante el uso multimodel. Como ya hice multimodel, puedo crear fácilmente una eliminación de actualización para ambos modelos desde una sola página de vista. Ahora mi problema es cuando voy a usar ambos modelos en el archivo de vista administrativa del Grupo. Tengo que mostrar ambos archivos en CGridView para mostrarlos en una Grilla. Pero mi problema es que en CGridView solo se puede ver el primer modelo. Quiero que los segundos modelos se muestren en el CGridView. Entonces, ¿cómo hacer eso?

Respuesta

0

Si agrega getters para groupId y groupName al modelo de miembro, puede mostrar fácilmente la vista de cuadrícula para miembros e incluir sus datos de grupo. No es una solución extremadamente limpia, pero es la más fácil.

4

Creo que necesita combinar modelos usando el Relational Active Record. En el proceso de autoaprendizaje que sigo, espero que en breve tendré un ejemplo para publicar aquí ...

EDITAR finalmente, me salió un ejemplo. He encontrado (tal vez) un error en Yii, entonces ¿qué es una tarea fácil, requirió más tiempo de lo necesario ...

Tengo dos modelos, Usuario e Persona, obtenidos de gii, anteriormente no relacionados. Luego añadir un personaje al usuario como atributo opcional: en User.php

/** 
* @return array relational rules. 
*/ 
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(
     'persona' => array(self::HAS_ONE,'Persona','id') 
    ); 
} 

campos entonces el modelo para el usuario de forma automática pantalla seleccionada a partir Persona, cuando se une a CGridView:

<hr><?php 
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => new CActiveDataProvider('User'), 
    'columns' => array(
     'username', 
     'password', 
     'email', 
     'persona.indirizzo' 
     ), 
    )); 
?> 

screen capture of instanced page

El error que encontré (quizás, necesito investigar más): mi modelo Persona tiene un atributo con un carácter acentuado en el nombre, y si lo uso en su lugar obtengo un error: es decir, si

'columns' => array(
     'username', 
     'password', 
     'email', 
     'persona.identità' 
     ), 

entonces la página no pueden ser instanciadas:

The column must be specified in the format of "Name:Type:Label", where "Type" and "Label" are optional. 

/home/carlo/public/yii-1.1.8.r3324/framework/zii/widgets/grid/CGridView.php(332) 

320   foreach($this->columns as $column) 
321    $column->init(); 
322  } 
323 
324  /** 
325  * Creates a {@link CDataColumn} based on a shortcut column specification string. 
326  * @param string $text the column specification string 
327  * @return CDataColumn the column instance 
328  */ 
329  protected function createDataColumn($text) 
330  { 
331   if(!preg_match('/^([\w\.]+)(:(\w*))?(:(.*))?$/',$text,$matches)) 
332    throw new CException(Yii::t('zii','The column must be specified in the format of "Name:Type:Label", where "Type" and "Label" are optional.')); 
333   $column=new CDataColumn($this); 
334   $column->name=$matches[1]; 

creo que es la expresión regular que el desajuste ...

+0

gracias @chac por su respuesta. Pero los atributos del 2do. Modelo no se cargan en la Vista del 1er Modelo. – NewUser

+0

indirizzo (la última columna) está en el segundo modelo. No entiendo tu comentario ... – CapelliC

+0

ya sé que es del segundo modelo, pero ¿cómo obtener los valores de indirizzo del segundo modelo? – NewUser

0

definir algunas funciones como 'getGroupNameById' en el modelo de grupo, entonces lo llaman como siguiente

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider, //for members model 
'columns'=>array(
    'id',   
    'firstName', 
    'lastName', 
    array(
     'name'=>'groupName' 
     'value'=>'getGroupNameById($data->group_id)', 
     //$data is members row accessible in gridview 
    ), 
), 
)); 

Comprobar este post para más detalles CGridView-Render-Customized-Complex-DataColumns

Cuestiones relacionadas