在 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 中执行相同或类似的操作?
答案 0 :(得分:2)
是。唯一的区别是$ model不是一个对象,而是数组:
'value' => function($model) {
return Html::encode($model['value_2']);
}
答案 1 :(得分:1)
为此,我创建了一个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;
}