我有ArrayDataProvider,其字段类型为DateTime-birthdate.
我将dataprovider用于view部分中的gridview.
由于出生日期包括出生年份,因此排序无法按预期进行.
是否有办法以某种方式告诉排序机制不会计年,而仅按月和日排序?自定义排序功能?
编辑:类似于C中的排序,您可以在其中传递比较功能.
编辑当前解决方案说明:
我目前的解决方案是将出生年份作为一个单独的字段包含在数组中,并将出生日期的年份设置为当前年份.现在,日期是从同一年开始的,并且进行分类.但是,单独的出生年份字段感觉不对.我希望我可以从一个日期对象中获取所有必要的数据.
这个单独的领域磨我的齿轮.这不是完美的.
编辑:
哦,它的Yii2
更新资料
还有一个PHP数组排序函数接受比较回调-例如uasort可以在像我的关联数组上使用:
uasort($persons, function($a, $b){
return strcasecmp( $b['date']->format('m-d'), $a['date']->format('m-d') );
});
现在,我需要找到将其实施到ArrayDataProvider中的方法.这里有什么想法吗?
解决方法:
如果您有数组数据提供程序,那么您当然不能使用数据库排序.
使用Yii的解决方案
要允许按某种表达式排序,您必须事先计算值并配置属性的排序以使用所计算的值而不是原始值:
// assuming $data contains your data and 'birthdate' is the value you want to use for sorting
foreach($data as $key => $value) {
$data[$key]['sort_birthdate'] = date('m-d', strtotime($value['birthdate']));
}
$dataProvider = new \yii\data\ArrayDataProvider([
'allModels' => $data,
'sort' => [
'attributes' => [
'birthdate' => [
'asc' => [
'sort_birthdate' => SORT_ASC,
],
'desc' => [
'sort_birthdate' => SORT_DESC,
],
'label' => 'Date',
'default' => SORT_ASC
],
// list all other attributes here
],
]
]);
解决方案扩展Yii
如果需要自定义比较功能,则必须扩展Yii类以支持此功能.
您可以创建一个自定义ArrayDataProvider类,该类继承自Yii附带的类,并覆盖sortModels()方法.