Completed
Pull Request — master (#90)
by Arnaud
03:14
created

RequestParametersExtractor::extract()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 0
cts 15
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 12
nc 1
nop 3
crap 2
1
<?php
2
3
namespace LAG\AdminBundle\Admin\Request\Extractor;
4
5
use LAG\AdminBundle\Action\Configuration\ActionConfiguration;
6
use LAG\AdminBundle\Admin\AdminInterface;
7
use Symfony\Component\Form\FormInterface;
8
use Symfony\Component\HttpFoundation\Request;
9
10
class RequestParametersExtractor
11
{
12
    /**
13
     * Extract parameters for the load method from the Request.
14
     *
15
     * @param Request             $request
16
     * @param ActionConfiguration $configuration
17
     * @param FormInterface|null  $form
18
     *
19
     * @return array
20
     */
21
    public function extract(Request $request, ActionConfiguration $configuration, FormInterface $form = null)
22
    {
23
        $criteria = $this->getCriteriaValues($request, $configuration);
24
        $pagination = $this->getPaginationValues($request, $configuration);
25
        $orders = $this->getOrderValues($request, $configuration);
26
        $filters = $this->getFilterValues($request, $form);
27
        $criteria = array_merge($criteria, $filters['filters']);
28
    
29
        return [
30
            'criteria' => $criteria,
31
            'order' => $orders,
32
            'maxPerPage' => $pagination['maxPerPage'],
33
            'page' => $pagination['page'],
34
            'filterOptions' => $filters['filterOptions'],
35
        ];
36
    }
37
    
38
    /**
39
     * Get the criteria values.
40
     *
41
     * @param Request             $request
42
     * @param ActionConfiguration $configuration
43
     *
44
     * @return array
45
     */
46
    private function getCriteriaValues(Request $request, ActionConfiguration $configuration)
47
    {
48
        $values = [];
49
        $criteriaConfiguration = $configuration->getParameter('criteria');
50
    
51 View Code Duplication
        foreach ($criteriaConfiguration as $criterion) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
52
            $value = $request->get($criterion);
53
    
54
            if (null !== $value) {
55
                $values[$criterion] = $value;
56
            }
57
        }
58
        
59
        return $values;
60
    }
61
    
62
    /**
63
     * Get the sort and order values.
64
     *
65
     * @param Request             $request
66
     * @param ActionConfiguration $configuration
67
     *
68
     * @return array
69
     */
70
    private function getOrderValues(Request $request, ActionConfiguration $configuration)
71
    {
72
        if (true !== $configuration->getParameter('sortable')) {
73
            return [];
74
        }
75
        $values = [];
76
    
77
        if (null !== $request->get('sort')) {
78
            $values['sort'] = $request->get('sort');
79
        }
80
    
81
        if (null !== $request->get('order')) {
82
            $values['order'] = $request->get('order');
83
        }
84
    
85
        return $values;
86
    }
87
    
88
    /**
89
     * Get the pagination values.
90
     *
91
     * @param Request             $request
92
     * @param ActionConfiguration $configuration
93
     *
94
     * @return array
95
     */
96
    private function getPaginationValues(Request $request, ActionConfiguration $configuration)
97
    {
98
        $pagination = [
99
            'page' => null,
100
            'maxPerPage' => $configuration->getParameter('max_per_page'),
101
        ];
102
        // the pagination is required if the load strategy is multiple and the pagerfanta is configured
103
        $isPaginationRequired = AdminInterface::LOAD_STRATEGY_MULTIPLE === $configuration->getParameter('load_strategy')
104
            && 'pagerfanta' === $configuration->getParameter('pager');
105
    
106
        if ($isPaginationRequired) {
107
            // retrieve the page parameter value
108
            $pagination['page'] = $request->get('page', 1);
109
        }
110
    
111
        if (null !== $request->get('maxPerPage')) {
112
            $pagination['maxPerPage'] = $request->get('maxPerPage');
113
        }
114
    
115
        return $pagination;
116
    }
117
    
118
    /**
119
     * Handle the value of the filter form.
120
     *
121
     * @param Request            $request
122
     * @param FormInterface|null $form
123
     *
124
     * @return array|mixed
125
     */
126
    private function getFilterValues(Request $request, FormInterface $form = null)
127
    {
128
        // if no filter form was provided, nothing to do
129
        if (null === $form) {
130
            return [
131
                'filters' => [],
132
                'filterOptions' => [],
133
            ];
134
        }
135
        $filters = [];
136
        $filtersOptions = [];
137
        $form->handleRequest($request);
138
        
139
        if ($form->isValid()) {
140
            
141
            foreach ($form->getData() as $filter => $value) {
142
    
143
                if (null === $value) {
144
                    continue;
145
                }
146
                $filters[$filter] = $value;
147
                $filtersOptions[$filter] = [
148
                    'operator' => 'LIKE',
149
                ];
150
            }
151
        }
152
        
153
        return [
154
            'filters' => $filters,
155
            'filterOptions' => $filtersOptions,
156
        ];
157
    }
158
}
159