Completed
Pull Request — master (#1019)
by
unknown
05:36
created

PaginateElasticaQuerySubscriber::setRequestStack()   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

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
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\HttpFoundation\Request;
6
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7
use Knp\Component\Pager\Event\ItemsEvent;
8
use FOS\ElasticaBundle\Paginator\PaginatorAdapterInterface;
9
use FOS\ElasticaBundle\Paginator\PartialResultsInterface;
10
use Symfony\Component\HttpFoundation\RequestStack;
11
12
class PaginateElasticaQuerySubscriber implements EventSubscriberInterface
13
{
14
    /**
15
     * @var Request|null
16
     */
17
    private $request;
18
19
    /**
20
     * @var RequestStack|null
21
     */
22
    private $requestStack;
23
24
    /**
25
     * @param Request|null $request
26
     */
27
    public function setRequest(Request $request = null)
28
    {
29
        $this->request = $request;
30
    }
31
32
    /**
33
     * @param RequestStack|null $requestStack
34
     */
35
    public function setRequestStack(RequestStack $requestStack = null)
36
    {
37
        $this->requestStack = $requestStack;
38
    }
39
40
    /**
41
     * @return Request|null
42
     */
43
    private function getRequest()
44
    {
45
        if ($this->requestStack instanceof RequestStack) {
46
            return $this->requestStack->getMasterRequest();
47
        } elseif ($this->request instanceof Request) {
48
            return $this->request;
49
        } else {
50
            return null;
51
        }
52
    }
53
54
    public function items(ItemsEvent $event)
55
    {
56
        if ($event->target instanceof PaginatorAdapterInterface) {
57
            // Add sort to query
58
            $this->setSorting($event);
59
60
            /** @var $results PartialResultsInterface */
61
            $results = $event->target->getResults($event->getOffset(), $event->getLimit());
62
63
            $event->count = $results->getTotalHits();
64
            $event->items = $results->toArray();
65
            $facets = $results->getFacets();
66
            if (null != $facets) {
67
                $event->setCustomPaginationParameter('facets', $facets);
68
            }
69
            $aggregations = $results->getAggregations();
70
            if (null != $aggregations) {
71
                $event->setCustomPaginationParameter('aggregations', $aggregations);
72
            }
73
74
            $event->stopPropagation();
75
        }
76
    }
77
78
    /**
79
     * Adds knp paging sort to query.
80
     *
81
     * @param ItemsEvent $event
82
     */
83
    protected function setSorting(ItemsEvent $event)
84
    {
85
        $request = $this->getRequest();
86
87
        $options = $event->options;
88
        $sortField = $request instanceof Request ? $request->get($options['sortFieldParameterName']) : null;
89
90
        if (!empty($sortField)) {
91
            // determine sort direction
92
            $dir = 'asc';
93
            $sortDirection = $request instanceof Request ? $request->get($options['sortDirectionParameterName']) : null;
94
            if ('desc' === strtolower($sortDirection)) {
95
                $dir = 'desc';
96
            }
97
98
            // check if the requested sort field is in the sort whitelist
99
            if (isset($options['sortFieldWhitelist']) && !in_array($sortField, $options['sortFieldWhitelist'])) {
100
                throw new \UnexpectedValueException(sprintf('Cannot sort by: [%s] this field is not in whitelist', $sortField));
101
            }
102
103
            // set sort on active query
104
            $event->target->getQuery()->setSort(array(
105
                $sortField => array('order' => $dir),
106
            ));
107
        }
108
    }
109
110 4
    public static function getSubscribedEvents()
111
    {
112
        return array(
113 4
            'knp_pager.items' => array('items', 1),
114
        );
115
    }
116
}
117