2017-01-27 2 views
2

In einem ActiveDataProvider Sie Schließungen als Werte verwenden können, wie:Verwenden Verschlüsse in Yii2 ArrayDataProvider

$dataprovider = new ArrayDataProvider([ 
    'allModels' => $array 
]); 

$gridColumns = [ 
    'attrib_1', 
    [ 
     'attribute' => 'attrib_2', 
     'label' => 'Label_2', 
     'value' => function($model) { 
      return Html::encode($model->value_2); 
     } 
    ], 
    'attrib_3' 
]; 

echo GridView::widget([ 
    'dataProvider'=> $dataprovider, 
    'columns' => $gridColumns 
]); 

Ist es möglich, die gleiche oder so etwas, in einem ArrayDataProvider zu tun?

Antwort

2

Ja. Der einzige Unterschied ist, dass $ Modell so nicht Objekt, sondern Array ist:

'value' => function($model) { 
    return Html::encode($model['value_2']); 
} 
+0

Danke. Ich dachte, es gibt kein Modell, weil der Datenprovider auf einem selbst erstellten Array basiert. – JK87

1

Zu diesem Zweck habe ich eine erweiterte Version von ActiveDataProvider erstellt, dass für jedes Modell bekam von Provider nenne ich einen Rückruf.

  1. Dies ist der benutzerdefinierte ActiveDataProvider, der in diesem Fall in den Namespace common \ components eingefügt wird.

    <?php 
    
    namespace common\components; 
    
    class CustomActiveDataProvider extends \yii\data\ActiveDataProvider 
    { 
    public $formatModelOutput = null; 
    
    public function getModels() 
    { 
        $inputModels = parent::getModels(); 
        $outputModels = []; 
    
        if($this->formatModelOutput != null) 
        { 
         for($k=0;$k<count($inputModels);$k++) 
         { 
          $outputModels[] = call_user_func($this->formatModelOutput, $k , $inputModels[$k]); 
         } 
        } 
        else 
        { 
         $outputModels = $inputModels;   
        } 
    
    
        return $outputModels; 
    } 
    } 
    
  2. Dies ist die Aktion in der Steuerung, die es verwendet. Für die Wiederverwendbarkeit rufe ich eine Modellmethode auf, anstatt eine Clousure zu nennen, aber Sie können auch eine Clourure aufrufen.

    public function actionIndex() 
    { 
         $query = Model::find(); 
    
    $dataProvider = new \common\components\CustomActiveDataProvider([ 
        'query' => $query, 
        'pagination' => ['pageSize' => null], 
        'formatModelOutput' => function($id, $model) { 
         return $model->dataModelPerActiveProvider; 
        } 
    ]); 
    
    return $dataProvider; 
    } 
    
  3. Endlich ist dies die Methode getDataModelPerActiveProvider in Modell:

    public function getDataModelPerActiveProvider() 
    { 
        $this->id = 1; 
        // here you can customize other fields 
        // OR you can also return a custom array, for example: 
        // return ['field1' => 'test', 'field2' => 'foo', 'field3' => $this->id]; 
        return $this; 
    } 
    
+0

Danke! Werde das auch versuchen! – JK87