diff --git a/Paginator/RawPaginatorAdapter.php b/Paginator/RawPaginatorAdapter.php index 8bd4ee2..9136bc0 100644 --- a/Paginator/RawPaginatorAdapter.php +++ b/Paginator/RawPaginatorAdapter.php @@ -126,4 +126,14 @@ class RawPaginatorAdapter implements PaginatorAdapterInterface return $this->facets; } + + /** + * Returns the Query + * + * @return Query the search query + */ + public function getQuery() + { + return $this->query; + } } diff --git a/Resources/config/config.xml b/Resources/config/config.xml index 4419b4a..b9da716 100644 --- a/Resources/config/config.xml +++ b/Resources/config/config.xml @@ -86,6 +86,9 @@ + + + diff --git a/Subscriber/PaginateElasticaQuerySubscriber.php b/Subscriber/PaginateElasticaQuerySubscriber.php index cbe508d..fc775c7 100644 --- a/Subscriber/PaginateElasticaQuerySubscriber.php +++ b/Subscriber/PaginateElasticaQuerySubscriber.php @@ -9,9 +9,20 @@ use FOS\ElasticaBundle\Paginator\PartialResultsInterface; class PaginateElasticaQuerySubscriber implements EventSubscriberInterface { + private $container; + + public function setContainer($container) + { + $this->container = $container; + } + public function items(ItemsEvent $event) { if ($event->target instanceof PaginatorAdapterInterface) { + + // Add sort to query + $this->addPagingSort($event); + /** @var $results PartialResultsInterface */ $results = $event->target->getResults($event->getOffset(), $event->getLimit()); @@ -26,6 +37,38 @@ class PaginateElasticaQuerySubscriber implements EventSubscriberInterface } } + /** + * Adds knp paging sort to query + * + * @param ItemsEvent $event + * @return void + */ + protected function addPagingSort(ItemsEvent $event) + { + $request = $this->container->get('request'); + $options = $event->options; + $sortField = $request->get($options['sortFieldParameterName']); + + if (!empty($sortField)) { + // determine sort direction + $dir = 'asc'; + $sortDirection = $request->get($options['sortDirectionParameterName']); + if ('desc' === strtolower($sortDirection)) { + $dir = 'desc'; + } + + // check if the requested sort field is in the sort whitelist + if (isset($options['sortFieldWhitelist']) && !in_array($sortField, $options['sortFieldWhitelist'])) { + throw new \UnexpectedValueException(sprintf('Cannot sort by: [%s] this field is not in whitelist', $sortField)); + } + + // set sort on active query + $event->target->getQuery()->setSort(array( + $sortField => array('order' => $dir), + )); + } + } + public static function getSubscribedEvents() { return array(