From ee5ece1cf87c7e4ad244d0b31eb75a9487af21ce Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Mon, 20 Jan 2025 10:51:19 +0100 Subject: [PATCH] Properly apply given default sort CompatController::createSortControl(): - Set Default before assembling to set the correct value for the sort dropdown. - Throw error if 3rd param is given but is not present in $columns SortControl::apply(): - Remove unused param and code. --- src/Compat/CompatController.php | 19 +++++++++++++++---- src/Control/SortControl.php | 7 +------ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Compat/CompatController.php b/src/Compat/CompatController.php index f4c2fb0b..735d0da9 100644 --- a/src/Compat/CompatController.php +++ b/src/Compat/CompatController.php @@ -10,6 +10,7 @@ use ipl\Html\HtmlDocument; use ipl\Html\HtmlString; use ipl\Html\ValidHtml; +use ipl\Orm\Common\SortUtil; use ipl\Orm\Query; use ipl\Stdlib\Contract\Paginatable; use ipl\Web\Control\LimitControl; @@ -294,15 +295,25 @@ public function createSortControl(Query $query, array $columns): SortControl $this->params->shift($sortControl->getSortParam()); - $sortControl->handleRequest($this->getServerRequest()); - $defaultSort = null; - if (func_num_args() === 3) { $defaultSort = func_get_args()[2]; } - return $sortControl->apply($query, $defaultSort); + $default = $defaultSort ?? $query->getModel()->getDefaultSort(); + if (! empty($default)) { + $sortControl->setDefault(SortUtil::normalizeSortSpec($default)); + + $columns = $sortControl->getColumns(); + $default = $sortControl->getDefault(); + if (! empty($defaultSort) && ! isset($columns[$default])) { + throw new InvalidArgumentException(sprintf('Invalid default sort "%s" given', $default)); + } + } + + $sortControl->handleRequest($this->getServerRequest()); + + return $sortControl->apply($query); } /** diff --git a/src/Control/SortControl.php b/src/Control/SortControl.php index 65c2c3d7..cdb0e75b 100644 --- a/src/Control/SortControl.php +++ b/src/Control/SortControl.php @@ -201,7 +201,7 @@ public function getSort(): ?string * * @return $this */ - public function apply(Query $query, $defaultSort = null): self + public function apply(Query $query): self { if ($this->getRequest() === null) { // handleRequest() has not been called yet @@ -209,11 +209,6 @@ public function apply(Query $query, $defaultSort = null): self $this->handleRequest(ServerRequest::fromGlobals()); } - $default = $defaultSort ?? (array) $query->getModel()->getDefaultSort(); - if (! empty($default)) { - $this->setDefault(SortUtil::normalizeSortSpec($default)); - } - $sort = $this->getSort(); if (! empty($sort)) { $query->orderBy(SortUtil::createOrderBy($sort));