Completed
Push — refonte ( 804dc8...c1472e )
by Arnaud
01:48
created

ORMSubscriber   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 7
dl 0
loc 86
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getSubscribedEvents() 0 9 1
A addOrder() 0 21 3
A addFilters() 0 23 3
1
<?php
2
3
namespace LAG\AdminBundle\Bridge\Doctrine\ORM\Event\Subscriber;
4
5
use LAG\AdminBundle\Event\AdminEvents;
6
use LAG\AdminBundle\Event\DoctrineOrmFilterEvent;
7
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8
use Symfony\Component\HttpFoundation\RequestStack;
9
10
class ORMSubscriber implements EventSubscriberInterface
11
{
12
    /**
13
     * @var RequestStack
14
     */
15
    private $requestStack;
16
17
    /**
18
     * ORMSubscriber constructor.
19
     *
20
     * @param RequestStack $requestStack
21
     */
22
    public function __construct(RequestStack $requestStack)
23
    {
24
        $this->requestStack = $requestStack;
25
    }
26
27
    /**
28
     * @return array
29
     */
30
    public static function getSubscribedEvents()
31
    {
32
        return [
33
            AdminEvents::DOCTRINE_ORM_FILTER => [
34
                ['addOrder'],
35
                ['addFilters'],
36
            ],
37
        ];
38
    }
39
40
    /**
41
     * Add the order to query builder according to the configuration.
42
     *
43
     * @param DoctrineOrmFilterEvent $event
44
     */
45
    public function addOrder(DoctrineOrmFilterEvent $event)
46
    {
47
        $queryBuilder = $event->getQueryBuilder();
48
        $admin = $event->getAdmin();
49
        $actionConfiguration = $admin->getAction()->getConfiguration();
50
51
        $request = $this->requestStack->getMasterRequest();
52
        $sort = $request->get('sort');
53
        $alias = $queryBuilder->getRootAliases()[0];
54
55
        if ($sort) {
56
            $order = $request->get('order', 'asc');
57
58
            $queryBuilder->addOrderBy($alias.'.'.$sort, $order);
59
        } else {
60
            foreach ($actionConfiguration->getParameter('order') as $field => $order) {
61
62
                $queryBuilder->addOrderBy($alias.'.'.$field, $order);
63
            }
64
        }
65
    }
66
67
    /**
68
     * Add filter to the query builder.
69
     *
70
     * @param DoctrineOrmFilterEvent $event
71
     */
72
    public function addFilters(DoctrineOrmFilterEvent $event)
73
    {
74
        $queryBuilder = $event->getQueryBuilder();
75
76
        foreach ($event->getFilters() as $filter) {
77
            $alias = $queryBuilder->getRootAliases()[0];
78
            $parameterName = 'filter_'.$filter->getName();
79
            $value = $filter->getValue();
80
81
            if ('like' === $filter->getOperator()) {
82
                $value = '%'.$value.'%';
83
            }
84
85
            $queryBuilder->andWhere(sprintf(
86
                '%s.%s %s %s',
87
                $alias,
88
                $filter->getName(),
89
                $filter->getOperator(),
90
                ':'.$parameterName
91
            ));
92
            $queryBuilder->setParameter($parameterName, $value);
93
        }
94
    }
95
}
96