From a19dd48b79136cb3048a8c815056b77c81699c9a Mon Sep 17 00:00:00 2001 From: Arthur Skobara Date: Tue, 4 Feb 2020 15:56:35 +0700 Subject: [PATCH] Fix #7622: Allow `yii\data\ArrayDataProvider` to control the sort flags for `sortModels` through `yii\data\Sort::sortFlags` property --- framework/CHANGELOG.md | 1 + framework/data/ArrayDataProvider.php | 2 +- framework/data/Sort.php | 6 ++++++ tests/framework/data/ArrayDataProviderTest.php | 26 ++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9332ca0..6da7f8f 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,6 +7,7 @@ Yii Framework 2 Change Log - Bug #17843: Fix `yii\web\Session::setCookieParamsInternal` check param "samesite" (schevgeny) - Bug #17828: Fix `yii\web\UploadedFile::saveAs()` failing when error value in `$_FILES` entry is a string (haveyaseen) - Bug #17829: `yii\helpers\ArrayHelper::filter` now correctly filters data when passing a filter with more than 2 levels (rhertogh) +- Enh #7622: Allow `yii\data\ArrayDataProvider` to control the sort flags for `sortModels` through `yii\data\Sort::sortFlags` property (askobara) 2.0.32 January 21, 2020 diff --git a/framework/data/ArrayDataProvider.php b/framework/data/ArrayDataProvider.php index 45ee2ce..5e50780 100644 --- a/framework/data/ArrayDataProvider.php +++ b/framework/data/ArrayDataProvider.php @@ -136,7 +136,7 @@ class ArrayDataProvider extends BaseDataProvider { $orders = $sort->getOrders(); if (!empty($orders)) { - ArrayHelper::multisort($models, array_keys($orders), array_values($orders)); + ArrayHelper::multisort($models, array_keys($orders), array_values($orders), $sort->sortFlags); } return $models; diff --git a/framework/data/Sort.php b/framework/data/Sort.php index b01358d..b4a4c37 100644 --- a/framework/data/Sort.php +++ b/framework/data/Sort.php @@ -186,6 +186,12 @@ class Sort extends BaseObject */ public $urlManager; + /** + * @var int Allow to control a value of the fourth parameter which will be + * passed to [[ArrayHelper::multisort()]] + * @since 2.0.33 + */ + public $sortFlags = SORT_REGULAR; /** * Normalizes the [[attributes]] property. diff --git a/tests/framework/data/ArrayDataProviderTest.php b/tests/framework/data/ArrayDataProviderTest.php index 3d74535..a2da0e4 100644 --- a/tests/framework/data/ArrayDataProviderTest.php +++ b/tests/framework/data/ArrayDataProviderTest.php @@ -184,4 +184,30 @@ class ArrayDataProviderTest extends TestCase $dataProvider = new ArrayDataProvider(['allModels' => $mixedArray, 'pagination' => $pagination]); $this->assertEquals(['key1', 9], $dataProvider->getKeys()); } + + public function testSortFlags() + { + $simpleArray = [['sortField' => 1], ['sortField' => 2], ['sortField' => 11]]; + $dataProvider = new ArrayDataProvider( + [ + 'allModels' => $simpleArray, + 'sort' => [ + 'sortFlags' => SORT_STRING, + 'attributes' => [ + 'sort' => [ + 'asc' => ['sortField' => SORT_ASC], + 'desc' => ['sortField' => SORT_DESC], + 'label' => 'Sorting', + 'default' => 'asc', + ], + ], + 'defaultOrder' => [ + 'sort' => SORT_ASC, + ], + ], + ] + ); + $sortedArray = [['sortField' => 1], ['sortField' => 11], ['sortField' => 2]]; + $this->assertEquals($sortedArray, $dataProvider->getModels()); + } }