在 Yii2 ArrayDataProvider 中使用闭包

Use closures in Yii2 ArrayDataProvider

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 中执行相同或类似的操作?

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

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

为此,我创建了一个扩展版本的 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;
    }