在 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,对于从提供商那里获得的每个模型,我都会调用一个回调。
这是自定义的 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;
}
}
这是控制器中使用它的动作。为了可重用性,我调用模型方法而不是调用 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;
}
最后是模型中的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;
}
在 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,对于从提供商那里获得的每个模型,我都会调用一个回调。
这是自定义的 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; } }
这是控制器中使用它的动作。为了可重用性,我调用模型方法而不是调用 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; }
最后是模型中的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; }