Предположим, у меня есть модель User
которая имеет много-много отношение к себе, называемое friends
. поэтому $user->friends
(или $model->friends
in view) дает мне массив объектов User
. Я хотел показать друзей как gridview. Но CGridView
данные как объект dataProvider
. Googling для него нашел способ преобразования массива объектов модели в объект dataProvider
как указано ниже.
$this->widget('zii.widgets.grid.CGridView', array( 'id' => 'gridUser', 'dataProvider' => new CArrayDataProvider($model->friends, array()), ));
Теперь, используя это, я получаю сообщение об ошибке
Свойство «User.id» не определено.
ОБНОВИТЬ
public function relations() { return array( 'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'), ); }
Я использую двухэтапное построение провайдера, показанного ниже. Но я обнаружил, что это создает проблемы с точки зрения разбивки на страницы. Я не потрудился решить эту проблему, так как делаю другие вещи
$dataProvider = new CArrayDataProvider('User'); $dataProvider->setData($model->friends); $this->widget('zii.widgets.grid.CGridView', array( 'id' => 'gridUser', 'dataProvider' =>$dataProvider, ));
При этом ваш код должен работать (см. Пример ниже из документации API). Я подозреваю, что в ваших отношениях есть неправильный атрибут, чем предоставленный код. Повторно проверьте определение отношения, если оно в порядке
Из документов Yii:
$rawData=Yii::app()->db->createCommand('SELECT * FROM tbl_user')->queryAll(); // or using: $rawData=User::model()->findAll(); <--this better represents your question $dataProvider=new CArrayDataProvider($rawData, array( 'id'=>'user', 'sort'=>array( 'attributes'=>array( 'id', 'username', 'email', ), ), 'pagination'=>array( 'pageSize'=>10, ), ));
Получил это :), я могу использовать CActiveDataProvider
вместо CArrayDataProvider
как указано ниже
$this->widget('zii.widgets.grid.CGridView', array( 'id' => 'gridUser', 'dataProvider' => new CActiveDataProvider('User', array( 'data'=>$model->friends, )), //...... columns display list..... ));
В любом случае спасибо за ответ @Stefano