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(