Completed
Pull Request — master (#1021)
by Eugene
08:38
created

PaginateElasticaQuerySubscriber::setRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2
Metric Value
dl 0
loc 4
ccs 0
cts 3
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
3
namespace FOS\ElasticaBundle\Subscriber;
4
5
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
6
use Knp\Component\Pager\Event\ItemsEvent;
7
use FOS\ElasticaBundle\Paginator\PaginatorAdapterInterface;
8
use FOS\ElasticaBundle\Paginator\PartialResultsInterface;
9
use Symfony\Component\HttpFoundation\RequestStack;
10
11
class PaginateElasticaQuerySubscriber implements EventSubscriberInterface
12
{
13
    private $requestStack;
14
15
    public function __construct(RequestStack $requestStack)
16
    {
17
        $this->requestStack = $requestStack;
18
    }
19
20
    public function items(ItemsEvent $event)
21
    {
22
        if ($event->target instanceof PaginatorAdapterInterface) {
23
            // Add sort to query
24
            $this->setSorting($event);
25
26
            /** @var $results PartialResultsInterface */
27
            $results = $event->target->getResults($event->getOffset(), $event->getLimit());
28
29
            $event->count = $results->getTotalHits();
30
            $event->items = $results->toArray();
31
            $facets = $results->getFacets();
32
            if (null != $facets) {
33
                $event->setCustomPaginationParameter('facets', $facets);
34
            }
35
            $aggregations = $results->getAggregations();
36
            if (null != $aggregations) {
37
                $event->setCustomPaginationParameter('aggregations', $aggregations);
38
            }
39
40
            $event->stopPropagation();
41
        }
42
    }
43
44
    /**
45
     * Adds knp paging sort to query.
46
     *
47
     * @param ItemsEvent $event
48
     */
49
    protected function setSorting(ItemsEvent $event)
50
    {
51
        $options = $event->options;
52
        $request = $this->requestStack->getCurrentRequest();
53
54
        $sortField = $request->get($options['sortFieldParameterName']);
55
        if (empty($sortField)) {
56
            return;
57
        }
58
59
        // determine sort direction
60
        $dir = 'asc';
61
        $sortDirection = $request->get($options['sortDirectionParameterName']);
62
        if ('desc' === strtolower($sortDirection)) {
63
            $dir = 'desc';
64
        }
65
66
        // check if the requested sort field is in the sort whitelist
67
        if (isset($options['sortFieldWhitelist']) && !in_array($sortField, $options['sortFieldWhitelist'])) {
68
            throw new \UnexpectedValueException(sprintf('Cannot sort by: [%s] this field is not in whitelist', $sortField));
69
        }
70
71
        // set sort on active query
72
        $event->target->getQuery()->setSort(array(
73
            $sortField => array('order' => $dir),
74
        ));
75
    }
76
77 4
    public static function getSubscribedEvents()
78
    {
79
        return array(
80 4
            'knp_pager.items' => array('items', 1),
81
        );
82
    }
83
}
84