diff --git a/application/Module.php b/application/Module.php index 08bc26c68..6e9fd60d1 100644 --- a/application/Module.php +++ b/application/Module.php @@ -758,6 +758,12 @@ public function searchFulltext(ZendEvent $event) if (isset($query['sort_by_default']) || !$qb->getDQLPart('orderBy')) { $sortOrder = 'asc' === $query['sort_order'] ? 'ASC' : 'DESC'; + if (isset($query['sort_order_default']) && isset($query['fulltext_search'])) { + // The default sort order for fulltext searches must be + // descending to account for the natural order of relevance + // scores. + $sortOrder = 'DESC'; + } $qb->orderBy($match, $sortOrder); } } diff --git a/application/src/Mvc/Controller/Plugin/SetBrowseDefaults.php b/application/src/Mvc/Controller/Plugin/SetBrowseDefaults.php index 0d5b7b154..fa9115a43 100644 --- a/application/src/Mvc/Controller/Plugin/SetBrowseDefaults.php +++ b/application/src/Mvc/Controller/Plugin/SetBrowseDefaults.php @@ -19,8 +19,11 @@ class SetBrowseDefaults extends AbstractPlugin public function __invoke($sortBy, $sortOrder = 'desc', $page = 1) { $query = $this->getController()->getRequest()->getQuery(); - // Set the sort_by_default flag if the request doesn't pass a sort_by. - $query->set('sort_by_default', (null === $query->get('sort_by') || '' === $query->get('sort_by')) ? '' : null); + // Set the default sort flags if the request doesn't pass them. + $sortByDefault = (null === $query->get('sort_by') || '' === $query->get('sort_by')) ? '' : null; + $sortOrderDefault = (isset($sortByDefault) && (null === $query->get('sort_order') || '' === $query->get('sort_order'))) ? '' : null; + $query->set('sort_by_default', $sortByDefault); + $query->set('sort_order_default', $sortOrderDefault); $query->set('sort_by', $query->get('sort_by', $sortBy)); $query->set('sort_order', $query->get('sort_order', $sortOrder)); $query->set('page', $query->get('page', $page)); diff --git a/application/src/Site/BlockLayout/BrowsePreview.php b/application/src/Site/BlockLayout/BrowsePreview.php index 02099c117..069d9da6b 100644 --- a/application/src/Site/BlockLayout/BrowsePreview.php +++ b/application/src/Site/BlockLayout/BrowsePreview.php @@ -143,6 +143,7 @@ public function render(PhpRenderer $view, SitePageBlockRepresentation $block, $t $query['sort_by'] = 'created'; } if (!isset($query['sort_order'])) { + $query['sort_order_default'] = ''; $query['sort_order'] = 'desc'; } diff --git a/application/src/View/Helper/Browse.php b/application/src/View/Helper/Browse.php index 3ae49c2ed..a3c2b0069 100644 --- a/application/src/View/Helper/Browse.php +++ b/application/src/View/Helper/Browse.php @@ -59,7 +59,7 @@ public function renderSortSelector($resourceTypeOrSortConfig) : string $args = [ 'sortConfig' => $sortConfig, 'sortByQuery' => (isset($query['sort_by_default']) && $isFulltextSearch) ? '' : $view->params()->fromQuery('sort_by'), - 'sortOrderQuery' => $view->params()->fromQuery('sort_order'), + 'sortOrderQuery' => (isset($query['sort_order_default']) && $isFulltextSearch) ? 'desc' : $view->params()->fromQuery('sort_order'), ]; $args = $view->trigger('view.sort-selector', $args, true); return $view->partial('common/sort-selector', (array) $args); diff --git a/application/src/View/Helper/Pagination.php b/application/src/View/Helper/Pagination.php index b767c22d4..ea0e4eccc 100644 --- a/application/src/View/Helper/Pagination.php +++ b/application/src/View/Helper/Pagination.php @@ -128,12 +128,16 @@ protected function getUrl($page) { $query = $this->getView()->params()->fromQuery(); $query['page'] = (int) $page; + // Do not emit sorts if the corresponding default sort flags are set. if (isset($query['sort_by_default'])) { - // Do not emit sort_by if the sort_by_default flag is set. unset($query['sort_by']); } - // Do not emit the sort_by_default flag + if (isset($query['sort_order_default'])) { + unset($query['sort_order']); + } + // Do not emit default sort flags. unset($query['sort_by_default']); + unset($query['sort_order_default']); $options = ['query' => $query]; if (is_string($this->fragment)) { $options['fragment'] = $this->fragment; diff --git a/application/view/common/advanced-search/sort.phtml b/application/view/common/advanced-search/sort.phtml index 39d9cf603..1a45b59da 100644 --- a/application/view/common/advanced-search/sort.phtml +++ b/application/view/common/advanced-search/sort.phtml @@ -20,6 +20,7 @@ $sortBy->setAttribute('aria-label', 'Sort by'); // @translate $sortBy->setEmptyOption('Select sort by…'); // @translate $sortBy->setValueOptions($sortConfig); $sortBy->setValue((!isset($query['sort_by_default']) && isset($query['sort_by'])) ? $query['sort_by'] : ''); +$sortBy->setValue((!isset($query['sort_order_default']) && isset($query['sort_order'])) ? $query['sort_order'] : ''); $sortOrder = new Element\Select('sort_order'); $sortOrder->setAttribute('aria-label', 'Sort order'); // @translate diff --git a/application/view/common/pagination.phtml b/application/view/common/pagination.phtml index dea64cc19..48588cd4f 100644 --- a/application/view/common/pagination.phtml +++ b/application/view/common/pagination.phtml @@ -1,12 +1,15 @@ plugin('translate'); -// Do not emit the sort_by_default flag. -$removeQueries = ['page', 'sort_by_default']; +// Do not emit the sort default flags. +$removeQueries = ['page', 'sort_by_default', 'sort_order_default']; +// Do not emit sorts if the corresponding default sort flags are set. if (isset($query['sort_by_default'])) { - // Do not emit sort_by if the sort_by_default flag is set. $removeQueries[] = 'sort_by'; } +if (isset($query['sort_order_default'])) { + $removeQueries[] = 'sort_order'; +} ?>