给Yii2-GridView非模型中的字段增加排序功能
时间: 2024-03-01 15:52:42 浏览: 70
可排序,拖拽的GridView
Yii2-GridView默认情况下只支持对模型中的字段进行排序,如果需要对非模型中的字段进行排序,需要自定义排序函数。
首先,在GridView的dataProvider中指定自定义排序函数:
```php
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'attributes' => [
'non_model_field' => [
'asc' => ['custom_sort_function' => SORT_ASC],
'desc' => ['custom_sort_function' => SORT_DESC],
'label' => 'Non Model Field'
],
// 其他排序字段
]
]
]);
```
其中,`non_model_field`是非模型中的字段名,`custom_sort_function`是自定义排序函数名。
然后,在GridView的columns中使用`value`选项指定非模型中的字段,并在`sortLinkOptions`中指定排序链接的URL参数:
```php
[
'attribute' => 'non_model_field',
'value' => function ($model) {
// 返回非模型中的字段值
return $model->getNonModelFieldValue();
},
'sortLinkOptions' => [
'url' => ['index', 'sort' => 'non_model_field']
]
],
```
其中,`getNonModelFieldValue()`是获取非模型中的字段值的函数。
最后,定义自定义排序函数`custom_sort_function`,并在其中实现对非模型中的字段进行排序的逻辑:
```php
public function custom_sort_function($field, $order)
{
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
]);
$models = $dataProvider->getModels();
// 根据非模型中的字段排序
usort($models, function ($a, $b) use ($field, $order) {
$a_value = $a->getNonModelFieldValue();
$b_value = $b->getNonModelFieldValue();
if ($a_value == $b_value) {
return 0;
}
if ($order == SORT_ASC) {
return ($a_value < $b_value) ? -1 : 1;
} else {
return ($a_value > $b_value) ? -1 : 1;
}
});
$dataProvider->setModels($models);
return $dataProvider;
}
```
其中,`$field`和`$order`分别是排序字段和排序方式。
这样就可以给Yii2-GridView非模型中的字段增加排序功能了。
阅读全文