在Yii2 ArrayDataProvider中使用闭包

时间:2017-01-27 09:15:20

标签: yii2 dataprovider

ActiveDataProvider 中,您可以将闭包用作值,例如:

$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
]);

是否可以在 ArrayDataProvider 中执行相同或类似的操作?

2 个答案:

答案 0 :(得分:2)

是。唯一的区别是$ model不是一个对象,而是数组:

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

答案 1 :(得分:1)

为此,我创建了一个ActiveDataProvider的扩展版本,对于从提供者处获得的每个模型,我都会调用一个回调。

  1. 这是自定义的ActiveDataProvider,在这种情况下放在common \ components命名空间中。

    <?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. 这是使用它的控制器中的操作。为了可重用性,我调用模型方法而不是调用clousure,但你也可以调用clousure。

     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. 最后,这是模型中的方法getDataModelPerActiveProvider:

    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;
    }