2017-09-07 2 views
1

Ich habe das Problem, dass ich die notwendigen Werte nicht in das Feld für die Checkbox meines GridViews bringen kann. Das Kontrollkästchen kann aktiviert oder deaktiviert werden. Daher gibt es in der Datenbank ein boolesches Feld namens member, für DataGrid-Werte mit 0 ist nicht überprüft und 1 ist überprüft.

Normalerweise hat die Gridview vier Spalten. Zu Testzwecken drucke ich die Spalte 'member' der Datenbanktabelle in ein extra Feld vor der Checkbox-Spalte, um zu sehen, ob die Werte der Tabellenspalte 'member' richtig sind.

Da die Sicht zwei verschiedene DataProvdider hat, $ dataProvider und $ dataProviderMembers, kann ich das $ model-Objekt nicht verwenden. Das $ model-Objekt gehört zum Inhalt von $ dataProvider. Das dataviewgrid wird vom zweiten Datenprovider $ dataProviderMembers gefüllt.

<?= GridView::widget([ 
     'dataProvider' => $dataProviderMembers, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 
      'id', 
      'firstname', 
      'lastname', 
      'member', 
      ['class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => function($model, $key, $index, $column){ 
       return ['checked' => 'member']; 
      }, 'header' => 'Mitglied' 
      ], 
      ] 
    ]); ?> 

Controller-Methode:

$searchModel = new PeriodeClassSubjectMembersSearch(); 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

$modelPeriodeClassSubjectMembers = new PeriodeClassSubjectMembers(); 
     $dataProviderMembers = $modelPeriodeClassSubjectMembers->getPeriodeClassMembers($class_id, $periode_id, false); 
     $dataProviderMembers->key = 'id'; //set this to make the id column as value columns in the gridview for javascript getselectedrows instead of the gridrow number 
     return $this->render('viewmysubject', [ 
      'model' => $this->findModel($id), 
      'searchModel' => $searchModel, 
      'dataProvider' => $dataProvider, 
      'dataProviderMembers' => $dataProviderMembers 
     ]); 

Modell Methode für $ dataProviderMembers:

$query = new Query(); 
     $query->select(..........); 

$dataProvider = new ActiveDataProvider([ 
    'query' => $query, 
]); 

return $dataProvider; 

Bei dieser Methode wird das Kontrollkästchen Feld correkt nicht gefüllt.

Normale die Checkbox Feld wird durch das Segment

return ['checked' => $model->member}; 

In diesem Fall gefüllt werden gibt es keine $ Modell mit Werten für Mitglied. $ model gehört zu den Daten von $ dataProvider.

Aber ich bekomme die Werte für Mitglied aus $ dataProviderMembers. Wie ich in der Spalte 'member' sehen kann, die vor dem Checkbox-Feld des Datagrids ist, werden die Werte aus der Datenbank rechts in das Grid gefüllt. Wie kann ich das Checkbox-Feld ohne $ model füllen, stattdessen mit Werten der Spalte 'member' (Member-Werte von $ dataProviderMembers) der SQL-Abfrage dahinter? Was bedeutet, so etwas wie:

return ['checked' => 'member']; 

Antwort

1

In Ihrem gridview der Datenprovider $ dataProviderMembers gleich sind, dann wird das $ Modell param in anonymer Funktion für checkboxOptions die Modelle zusammen, dass die Elementwerte enthalten sollte So könnte man zum Wert erhalten mit $ modell-> Mitglied

 [ 'class' => 'yii\grid\CheckboxColumn', 
      'checkboxOptions' => function($model, $key, $index, $column){ 
      return ['value' => $model->member]; 
      }, 
     ], 

oder wenn der Datenprovider ist ein Array

 [ 'class' => 'yii\grid\CheckboxColumn', 
      'checkboxOptions' => function($model, $key, $index, $column){ 
      return ['value' => $model['member']]; 
      }, 
     ], 
+0

wenn Iam $ modell- mit> m ember an dieser Position, die in normalen Fällen funktioniert, bekomme ich eine yii \ base \ ErrorException mit 'Versuch, Eigenschaft von Nicht-Objekt zu bekommen'. – Perino

+0

Sind Sie sicher, dass Ihr dataProvider $ dataProviderMembers ist und wirklich das Attribut member enthält .. versuchen Sie bitte, den Controller Action Code hinzuzufügen. – scaisEdge

+0

Ja, dataggridview wird von den $ dataProviderMembers korrekt gefüllt. Ich kann auch die richtigen Member-Werte in der zusätzlichen Spalte 'member' sehen, die ich zu Testzwecken erstellt habe (die Spalte vor der Checkbox-Spalte), ich habe jetzt auch den Hauptteil der Controller-Funktion hinzugefügt. – Perino