2013-01-03 9 views
11

Supponiamo di avere il modello User che ha molti a molti rapporti con se stesso denominato friends. quindi $user->friends (o $model->friends in visualizzazione) mi fornisce una serie di oggetti User. Volevo mostrare gli amici come gridview. Ma i dati CGridView come oggetto dataProvider. Googling per esso ha trovato il modo di convertire la matrice di oggetti del modello in oggetto dataProvider come indicato di seguito.Come convertire l'array di oggetti di dati del modello in dataProvider

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser', 
    'dataProvider' => new CArrayDataProvider($model->friends, array()), 
)); 

Ora, usando questo ottengo un errore

Proprietà "User.id" non è definito.

UPDATE

public function relations() 
{ 
    return array(
     'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'), 
    ); 
} 
+0

aggiungendo come la relazione definita e il modo in cui due modelli si riferiscono (PK e FK) è fondamentale per ottenere una risposta! –

risposta

18

Io uso due stadi costruzione del fornitore indicato di seguito. Ma ho scoperto che ti dà problemi in termini di impaginazione. Non ho preso la briga di risolvere tale problema dal momento che sto facendo altre cose

$dataProvider = new CArrayDataProvider('User'); 
$dataProvider->setData($model->friends); 
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser', 
    'dataProvider' =>$dataProvider, 
)); 

Detto questo, il codice dovrebbe funzionare (si veda l'esempio qui sotto da documentazione API). Sospetto che ci sia un attributo errato nelle tue relazioni rispetto al codice fornito. Ricontrollare la definizione rapporto se è ok

Da Yii documenti:

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

ha ottenuto la cosa esatta che stavo cercando, comunque grazie amico. il pollice in su anche alla tua risposta. – prashu132

+0

la risposta esatta che stavo cercando è riportata di seguito. si prega di controllare e upvote se è utile – prashu132

+2

Grande che ero di aiuto :) –

13

Got it :), posso usare CActiveDataProvider anziché CArrayDataProvider come indicato di seguito

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser', 
    'dataProvider' => new CActiveDataProvider('User', array(
      'data'=>$model->friends, 
    )), 
    //...... columns display list..... 
)); 

Comunque grazie per la risposta @Stefano

+4

questa è una risposta migliore, poiché consente a CGridView di recuperare le intestazioni di griglia dal CModel ... – Gero