【问题标题】:Use closures in Yii2 ArrayDataProvider在 Yii2 ArrayDataProvider 中使用闭包
【发布时间】:2017-01-27 09:15:19
【问题描述】:

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

【问题讨论】:

    标签: yii2 dataprovider


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我以为,没有模型,因为dataprovider是基于一个自创数组的。
    【解决方案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;
      }
      

    【讨论】:

    • 谢谢!也会试试这个!
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多