используя отношения с CGridView - PullRequest
1 голос
/ 13 июля 2010

Я опишу проблему как можно яснее.

У меня есть activeDataProvider:

$dataProvider=new CActiveDataProvider('Menu', array(
    'criteria'=>array(         
       'with' => array('roles'),
    ),
));

, тогда я использую CGridView с флажком:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'menu-grid',
    'selectableRows' => 2,
'dataProvider'=>$dataProvider,
'columns'=>array(
                   'id',
                   'title',
                   array(
                       'class'    => 'SCheckboxColumn',
                       'header'   => 'View',
                       'name'     => 'Roles[Actions][can_view]',
                       'id'       => 'roles_action_can_view',
                       'value'    => '$data->id',
                       'checkBoxHtmlOptions' =>
                                      array('checked' => $data->roles->can_view),
        ),
    ),
));

Затем в отношениях модели меню:

return array(
        'roles' => array(self::HAS_MANY, 'Rolesmenus', 'menu_id'),
    );

и в отношениях модели Rolesmenus:

return array(
        'menu' => array(self::BELONGS_TO, 'Menu', 'menu_id'),
    );

Итак, я не могу получить доступ к переменной $ data-> role-> can_view, когда я var_dumpвсе $ data object Я вижу эти атрибуты в приватном массиве _attributtes, но не могу получить к ним доступ через CGridView.

Любые идеи ??

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Если ваше отношение является HAS_MANY, то вызов этого отношения вернет массив этого ActiveRecord.CGridView не будет отображать массив, поэтому в прошлом я писал в модели функцию, которая содержит отношение, которое берет все значения в массиве и создает из них строку.Например, с вашим примером в модели меню сделайте что-то вроде

public function rolesToString()
{
    $roles = $this->roles;
    if($roles) {
        $string = '';
        foreach($roles as $role) {
            $string .= $role->can_view . ', ';
        }
        return substr($string,0,strlen($string)-1); // substr to remove trailing comma
    }
    return null;
}

, тогда атрибут 'value' CGridView для этого столбца должен выглядеть следующим образом

'value'=>'$data->rolesToString()'

больше информации об использовании HAS_MANY, с и CGridView Здесь

0 голосов
/ 16 сентября 2013

лучший способ убрать последнюю запятую это .. обрезать ( '', строка) С уважением

0 голосов
/ 13 июля 2010

массив ('флажок' => $ data-> role-> can_view,),

должно быть массив ('флажок' => '$ data-> role-> can_view',),

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