From df67260a0bd21d2893e58eb9e83d26c937849be3 Mon Sep 17 00:00:00 2001 From: Malik Meyer-Heder Date: Fri, 24 Jan 2020 14:57:31 +0100 Subject: [PATCH] #5540: implemented natural sorting --- .../Admin/DataObject/DataObjectController.php | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php index 981bf5b8366..1dc72f128a4 100644 --- a/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php +++ b/bundles/AdminBundle/Controller/Admin/DataObject/DataObjectController.php @@ -154,19 +154,13 @@ public function treeGetChildsByIdAction(Request $request, EventDispatcherInterfa $childsList->setLimit($limit); $childsList->setOffset($offset); - $sort = 'ASC'; - if($object->getReverseSort()) { - $sort = 'DESC'; - } - if ($object->getChildrenSortBy() === 'index') { - $childsList->setOrderKey(sprintf('objects.o_index %s', $sort), false); + $childsList->setOrderKey('objects.o_index ASC', false); } else { $childsList->setOrderKey( sprintf( - 'CAST(objects.o_%s AS CHAR CHARACTER SET utf8) COLLATE utf8_general_ci %s', - $object->getChildrenSortBy(), - $sort + 'CAST(objects.o_%s AS CHAR CHARACTER SET utf8) COLLATE utf8_general_ci ASC', + $object->getChildrenSortBy() ), false ); @@ -204,7 +198,9 @@ public function treeGetChildsByIdAction(Request $request, EventDispatcherInterfa 'objects' => $objects, ]); $eventDispatcher->dispatch(AdminEvents::OBJECT_TREE_GET_CHILDREN_BY_ID_PRE_SEND_DATA, $event); + $objects = $event->getArgument('objects'); + $objects = $this->sortChildrenNaturally($objects, $object->getChildrenSortBy(), $object->getReverseSort()); if ($limit) { return $this->adminJson([ @@ -222,6 +218,26 @@ public function treeGetChildsByIdAction(Request $request, EventDispatcherInterfa return $this->adminJson($objects); } + private function sortChildrenNaturally(array $objects, string $sortBy, bool $reverse): array + { + if('index' === $sortBy) { + $sortBy = 'idx'; + } + + usort( + $objects, + function ($a, $b) use ($sortBy) { + return strnatcasecmp($a[$sortBy], $b[$sortBy]); + } + ); + + if($reverse) { + $objects = array_reverse($objects); + } + + return $objects; + } + /** * @param DataObject\AbstractObject $element * @@ -234,6 +250,7 @@ protected function getTreeNodeConfig($element) $tmpObject = [ 'id' => $child->getId(), 'idx' => intval($child->getIndex()), + 'key' => $child->getKey(), 'sortBy' => $child->getChildrenSortBy(), 'text' => htmlspecialchars($child->getKey()), 'type' => $child->getType(),