Merge pull request #17741 from eileenmcnaughton/eventcart
[civicrm-core.git] / CRM / Report / Utils / Get.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
5 | |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
10 */
11
12 /**
13 *
14 * @package CRM
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
16 * $Id$
17 *
18 */
19 class CRM_Report_Utils_Get {
20
21 /**
22 * @param string $name
23 * @param $type
24 *
25 * @return mixed|null
26 */
27 public static function getTypedValue($name, $type) {
28 $value = $_GET[$name] ?? NULL;
29 if ($value === NULL) {
30 return NULL;
31 }
32 return CRM_Utils_Type::escape($value,
33 CRM_Utils_Type::typeToString($type),
34 FALSE
35 );
36 }
37
38 /**
39 * @param string $fieldName
40 * @param $field
41 * @param $defaults
42 *
43 * @return bool
44 */
45 public static function dateParam($fieldName, &$field, &$defaults) {
46 // type = 12 (datetime) is not recognized by Utils_Type::escape() method,
47 // and therefore the below hack
48 $type = 4;
49
50 $from = self::getTypedValue("{$fieldName}_from", $type);
51 $to = self::getTypedValue("{$fieldName}_to", $type);
52
53 $relative = self::getTypedValue("{$fieldName}_relative", CRM_Utils_Type::T_STRING);
54 if ($relative !== NULL) {
55 $defaults["{$fieldName}_relative"] = $relative;
56 }
57 if ($relative) {
58 list($from, $to) = CRM_Utils_Date::getFromTo($relative, NULL, NULL);
59 $from = substr($from, 0, 8);
60 $to = substr($to, 0, 8);
61 }
62
63 if (!($from || $to)) {
64 return FALSE;
65 }
66
67 if ($from !== NULL) {
68 $dateFrom = CRM_Utils_Date::setDateDefaults($from);
69 if ($dateFrom !== NULL &&
70 !empty($dateFrom[0])
71 ) {
72 $defaults["{$fieldName}_from"] = $dateFrom[0];
73 }
74 }
75
76 if ($to !== NULL) {
77 $dateTo = CRM_Utils_Date::setDateDefaults($to);
78 if ($dateTo !== NULL &&
79 !empty($dateTo[0])
80 ) {
81 $defaults["{$fieldName}_to"] = $dateTo[0];
82 }
83 }
84 }
85
86 /**
87 * @param string $fieldName
88 * @param $field
89 * @param $defaults
90 */
91 public static function stringParam($fieldName, &$field, &$defaults) {
92 $fieldOP = CRM_Utils_Array::value("{$fieldName}_op", $_GET, 'like');
93
94 switch ($fieldOP) {
95 case 'has':
96 case 'sw':
97 case 'ew':
98 case 'nhas':
99 case 'like':
100 case 'eq':
101 case 'neq':
102 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Array::value('type', $field));
103 if ($value !== NULL) {
104 $defaults["{$fieldName}_value"] = $value;
105 $defaults["{$fieldName}_op"] = $fieldOP;
106 }
107 break;
108
109 case 'nll':
110 case 'nnll':
111 $defaults["{$fieldName}_op"] = $fieldOP;
112 break;
113
114 case 'in':
115 case 'notin':
116 case 'mhas':
117 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Type::T_STRING);
118 if ($value !== NULL) {
119 $defaults["{$fieldName}_value"] = explode(",", $value);
120 $defaults["{$fieldName}_op"] = $fieldOP;
121 }
122 break;
123 }
124 }
125
126 /**
127 * @param string $fieldName
128 * @param $field
129 * @param $defaults
130 */
131 public static function intParam($fieldName, &$field, &$defaults) {
132 $fieldOP = CRM_Utils_Array::value("{$fieldName}_op", $_GET, 'eq');
133
134 switch ($fieldOP) {
135 case 'lte':
136 case 'gte':
137 case 'eq':
138 case 'lt':
139 case 'gt':
140 case 'neq':
141 $value = self::getTypedValue("{$fieldName}_value", $field['type']);
142 if ($value !== NULL) {
143 $defaults["{$fieldName}_value"] = $value;
144 $defaults["{$fieldName}_op"] = $fieldOP;
145 }
146 break;
147
148 case 'bw':
149 case 'nbw':
150 $minValue = self::getTypedValue("{$fieldName}_min", $field['type']);
151 $maxValue = self::getTypedValue("{$fieldName}_max", $field['type']);
152 if ($minValue !== NULL ||
153 $maxValue !== NULL
154 ) {
155 if ($minValue !== NULL) {
156 $defaults["{$fieldName}_min"] = $minValue;
157 }
158 if ($maxValue !== NULL) {
159 $defaults["{$fieldName}_max"] = $maxValue;
160 }
161 $defaults["{$fieldName}_op"] = $fieldOP;
162 }
163 break;
164
165 case 'nll':
166 case 'nnll':
167 $defaults["{$fieldName}_op"] = $fieldOP;
168 break;
169
170 case 'in':
171 case 'notin':
172 // send the type as string so that multiple values can also be retrieved from url.
173 // for e.g url like - "memtype_in=in&memtype_value=1,2,3"
174 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Type::T_STRING);
175 if (!preg_match('/^(\d+)(,\d+){0,14}$/', $value)) {
176 // extra check. Also put a limit of 15 max values.
177 $value = NULL;
178 }
179 if ($value !== NULL) {
180 $defaults["{$fieldName}_value"] = explode(",", $value);
181 $defaults["{$fieldName}_op"] = $fieldOP;
182 }
183 break;
184 }
185 }
186
187 /**
188 * @param $defaults
189 */
190 public static function processChart(&$defaults) {
191 $chartType = $_GET["charts"] ?? NULL;
192 if (in_array($chartType, [
193 'barChart',
194 'pieChart',
195 ])) {
196 $defaults["charts"] = $chartType;
197 }
198 }
199
200 /**
201 * @param $fieldGrp
202 * @param $defaults
203 */
204 public static function processFilter(&$fieldGrp, &$defaults) {
205 // process only filters for now
206 foreach ($fieldGrp as $tableName => $fields) {
207 foreach ($fields as $fieldName => $field) {
208 switch (CRM_Utils_Array::value('type', $field)) {
209 case CRM_Utils_Type::T_INT:
210 case CRM_Utils_Type::T_FLOAT:
211 case CRM_Utils_Type::T_MONEY:
212 self::intParam($fieldName, $field, $defaults);
213 break;
214
215 case CRM_Utils_Type::T_DATE:
216 case CRM_Utils_Type::T_DATE | CRM_Utils_Type::T_TIME:
217 self::dateParam($fieldName, $field, $defaults);
218 break;
219
220 case CRM_Utils_Type::T_STRING:
221 default:
222 self::stringParam($fieldName, $field, $defaults);
223 break;
224 }
225 }
226 }
227 }
228
229 /**
230 * unset default filters.
231 * @param $defaults
232 */
233 public static function unsetFilters(&$defaults) {
234 static $unsetFlag = TRUE;
235 if ($unsetFlag) {
236 foreach ($defaults as $field_name => $field_value) {
237 $newstr = substr($field_name, strrpos($field_name, '_'));
238 if ($newstr == '_value' || $newstr == '_op' ||
239 $newstr == '_min' || $newstr == '_max' ||
240 $newstr == '_from' || $newstr == '_to' ||
241 $newstr == '_relative'
242 ) {
243 unset($defaults[$field_name]);
244 }
245 }
246 $unsetFlag = FALSE;
247 }
248 }
249
250 /**
251 * @param $fieldGrp
252 * @param $defaults
253 */
254 public static function processGroupBy(&$fieldGrp, &$defaults) {
255 // process only group_bys for now
256 $flag = FALSE;
257
258 if (is_array($fieldGrp)) {
259 foreach ($fieldGrp as $tableName => $fields) {
260 if ($groupBys = CRM_Utils_Array::value("gby", $_GET)) {
261 $groupBys = explode(' ', $groupBys);
262 if (!empty($groupBys)) {
263 if (!$flag) {
264 unset($defaults['group_bys']);
265 $flag = TRUE;
266 }
267 foreach ($groupBys as $gby) {
268 if (array_key_exists($gby, $fields)) {
269 $defaults['group_bys'][$gby] = 1;
270 }
271 }
272 }
273 }
274 }
275 }
276 }
277
278 /**
279 * @param $reportFields
280 * @param $defaults
281 */
282 public static function processFields(&$reportFields, &$defaults) {
283 //add filters from url
284 if (is_array($reportFields)) {
285 if ($urlFields = CRM_Utils_Array::value("fld", $_GET)) {
286 $urlFields = explode(',', $urlFields);
287 }
288 if (CRM_Utils_Array::value("ufld", $_GET) == 1) {
289 // unset all display columns
290 $defaults['fields'] = [];
291 }
292 if (!empty($urlFields)) {
293 foreach ($reportFields as $tableName => $fields) {
294 foreach ($urlFields as $fld) {
295 if (array_key_exists($fld, $fields)) {
296 $defaults['fields'][$fld] = 1;
297 }
298 }
299 }
300 }
301 }
302 }
303
304 }