Использование CGridView для отображения атрибутов другой модели - PullRequest
5 голосов
/ 30 января 2012

У меня есть база данных, как это

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

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

Теперь я могу использовать атрибуты таблицы члена Member в контроллере группы, просто используя multimodel . Так как я сделал многомодель, я могу легко создать и удалить обновление для обеих моделей с одной страницы просмотра. Теперь моя проблема заключается в том, что, когда я собираюсь показать обе модели в файле представления администратора группы, я должен показать оба файла в CGridView для отображения в сетке. Но моя проблема в CGridView, можно увидеть только первую модель. Я хочу, чтобы вторые модели были показаны в CGridView. Так как это сделать?

Ответы [ 3 ]

4 голосов
/ 30 января 2012

Я думаю, вам нужно объединить модели, используя Relational Active Record . В процессе самообучения, за которым я следую, надеюсь, у меня скоро будет пример для публикации здесь ...

РЕДАКТИРОВАТЬ наконец, я разработал пример. Я (возможно) нашел ошибку в Yii, так что это простая задача, требующая больше времени, чем необходимо ...

У меня есть две модели, User e Persona, полученные из gii, ранее не связанные. Затем я добавляю Персона к Пользователю в качестве необязательного атрибута: в 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')
    );
}

тогда модель для пользователя автоматически отображает выбранные поля из Persona при привязке к 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

Ошибка, которую я обнаружил (возможно, нужно исследовать больше): моя модель Persona имеет атрибут с акцентированным символом в имени, и если я использую его вместо этого, я получаю ошибку: то есть, если

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

тогда страница не может быть создана:

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];

Я думаю, что это регулярное выражение не соответствует ...

0 голосов
/ 30 января 2012

Определите некоторую функцию, такую ​​как 'getGroupNameById' в групповой модели, затем вызовите ее следующим образом

$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
    ),
),
));

Проверьте эту запись для получения более подробной информации CGridView-Render-Customized-Complex-DataColumns

0 голосов
/ 30 января 2012

Если вы добавите геттеры для groupId и groupName в модель Member, вы можете легко отобразить сетку для участников и включить данные их групп.Это не очень чистое решение, но самое простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...