/
SortBuilder.php
199 lines (177 loc) · 5.01 KB
/
SortBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<?php
namespace Nadia\Bundle\PaginatorBundle\Configuration;
/**
* Class SortBuilder
*/
class SortBuilder
{
/**
* Sort information
*
* Format: array(
* 'foo field key' => array(
* 'ASC' => array (
* 'statement' => 'foo ASC',
* 'title' => 'foo ASC sort title'
* 'direction' => 'ASC',
* ),
* 'DESC' => array (
* 'statement' => 'foo DESC',
* 'title' => 'foo ASC sort title'
* 'direction' => 'DESC',
* ),
* ),
* 'foobar field key' => array(
* 'ASC' => array (
* 'statement' => 'foobar ASC',
* 'title' => 'foobar ASC sort title'
* 'direction' => 'ASC',
* ),
* 'DESC' => array (
* 'statement' => 'foobar DESC',
* 'title' => 'foobar ASC sort title'
* 'direction' => 'DESC',
* ),
* ),
* ...
* )
*
* @var array
*/
private $sorts = array();
/**
* Sort choices
*
* The value of choices is the array key of `$this->sorts`
*
* Format: array(
* 'foo ASC sort title' => 'foo ASC',
* 'foo DESC sort title' => 'foo DESC',
* 'foobar ASC sort title' => 'foobar ASC',
* 'foobar DESC sort title' => 'foobar DESC',
* )
*
* @var array
*/
private $choices = array();
/**
* Sort Form options
*
* @var array
*/
private $formOptions = array();
/**
* Add a sort information
*
* A sort information can only have two directions (SortInterface::ASC and SortInterface::DESC)
*
* @param string $key Sort field key
* @param string $direction SortInterface::ASC or SortInterface::DESC
* @param string $statement The sort statement, ex: 'foo', 'foo ASC', 'foo.abc ASC, bar.xzy DESC'
* @param string $title The sort title
*
* @return $this
*/
public function add($key, $direction, $statement = '', $title = '')
{
if (!array_key_exists($key, $this->sorts)) {
$this->sorts[$key] = array();
}
if (!in_array($direction, array(Sort::ASC, Sort::DESC))) {
$direction = Sort::ASC;
}
if (!array_key_exists($direction, $this->sorts[$key])) {
$this->sorts[$key][$direction] = array();
}
if (empty($statement)) {
$statement = $key.' '.$direction;
}
if (empty($title)) {
$title = ucfirst($key).' '.$direction;
}
$this->sorts[$key][$direction] = compact('statement', 'title', 'direction');
$this->choices[$title] = $this->getMapKey($key, $direction);
return $this;
}
/**
* Get a sort information
*
* @param string $key Sort field key
* @param string $direction SortInterface::ASC or SortInterface::DESC
*
* @return array Format: array('statement' => 'foo ASC sort title', 'title' => 'foo ASC sort title', 'direction' => 'ASC')
*/
public function get($key, $direction = Sort::ASC)
{
if (empty($this->sorts[$key])) {
throw new \InvalidArgumentException('The sort key "'.$key.'" is not exists!');
}
if (empty($this->sorts[$key][$direction])) {
throw new \InvalidArgumentException('The sort direction "'.$direction.'" is not exists!');
}
return $this->sorts[$key][$direction];
}
/**
* Get a sort information with reversed direction
*
* @param string $key Sort field key
* @param string $direction SortInterface::ASC or SortInterface::DESC
*
* @return array Format: array('statement' => 'foo ASC sort title', 'title' => 'foo ASC sort title', 'direction' => 'ASC')
*/
public function getReversed($key, $direction = Sort::ASC)
{
$direction = $direction !== Sort::DESC ? Sort::DESC : Sort::ASC;
return $this->get($key, $direction);
}
/**
* @return array
*/
public function all()
{
return $this->sorts;
}
/**
* @return array
*/
public function getChoices()
{
return $this->choices;
}
/**
* @return int
*/
public function count()
{
return count($this->sorts);
}
/**
* @return array
*/
public function getFormOptions()
{
return $this->formOptions;
}
/**
* @param array $formOptions
*
* @return SortBuilder
*/
public function setFormOptions(array $formOptions)
{
$this->formOptions = $formOptions;
return $this;
}
/**
* Get the array key of `$this->sorts`
*
* @param string $key Sort field key
* @param string $direction SortInterface::ASC or SortInterface::DESC
*
* @return string
*/
private function getMapKey($key, $direction)
{
return $key.' '.$direction;
}
}