Completed
Pull Request — master (#1133)
by
unknown
49:36 queued 29:51
created
core/libraries/shortcodes/EE_Shortcodes.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -352,7 +352,7 @@
 block discarded – undo
352 352
      *
353 353
      * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
354 354
      *
355
-     * @param $shortcode
355
+     * @param string $shortcode
356 356
      * @since 4.9.32
357 357
      * @return string
358 358
      */
Please login to merge, or discard this patch.
Indentation   +453 added lines, -453 removed lines patch added patch discarded remove patch
@@ -17,457 +17,457 @@
 block discarded – undo
17 17
 abstract class EE_Shortcodes extends EE_Base
18 18
 {
19 19
 
20
-    /**
21
-     * holds label for library
22
-     * This is used for referencing the library label
23
-     *
24
-     * @access public
25
-     * @var string
26
-     */
27
-    public $label;
28
-
29
-
30
-    /**
31
-     * This property is used for referencing a short description of the library
32
-     *
33
-     * @access public
34
-     * @var string
35
-     */
36
-    public $description;
37
-
38
-
39
-    /**
40
-     * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
41
-     * label/description for the shortcode.
42
-     *
43
-     * @access protected
44
-     * @var array
45
-     */
46
-    protected $_shortcodes;
47
-
48
-
49
-    /**
50
-     * This will hold the incoming data item sent to the parser method
51
-     *
52
-     * @access protected
53
-     * @var mixed (array|object)
54
-     */
55
-    protected $_data;
56
-
57
-
58
-    /**
59
-     * some shortcodes may require extra data to parse.  This property is provided for that.
60
-     *
61
-     * @var array
62
-     */
63
-    protected $_extra_data;
64
-
65
-
66
-    /**
67
-     * EE_messenger used to generate the template being parsed.
68
-     *
69
-     * @since 4.5.0
70
-     * @var EE_messenger
71
-     */
72
-    protected $_messenger;
73
-
74
-
75
-    /**
76
-     * message type used to generate the template being parsed.
77
-     *
78
-     * @since 4.5.0
79
-     * @var EE_message_type
80
-     */
81
-    protected $_message_type;
82
-
83
-
84
-    /**
85
-     * context used for the template being parsed
86
-     *
87
-     * @since 4.5.0
88
-     * @var string
89
-     */
90
-    protected $_context;
91
-
92
-
93
-    /**
94
-     * Specific Message Template Group ID
95
-     *
96
-     * @since 4.5.0
97
-     * @var int
98
-     */
99
-    protected $_GRP_ID;
100
-
101
-
102
-    /**
103
-     * @since 4.9.0
104
-     * @type EE_Message
105
-     */
106
-    protected $_message;
107
-
108
-
109
-    /**
110
-     * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
111
-     * shortcodes
112
-     *
113
-     * @var EEH_Parse_Shortcodes
114
-     */
115
-    protected $_shortcode_helper;
116
-
117
-
118
-    public function __construct()
119
-    {
120
-        $this->_set_defaults();
121
-        $this->_init_props();
122
-    }
123
-
124
-
125
-    /**
126
-     * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
127
-     * method
128
-     */
129
-    private function _set_defaults()
130
-    {
131
-        $this->name = $this->description = '';
132
-        $this->_shortcodes = array();
133
-        $this->_set_shortcode_helper();
134
-    }
135
-
136
-
137
-    /**
138
-     * loads an instance of the EE_Shortcode_Parser helper when requested
139
-     */
140
-    protected function _set_shortcode_helper()
141
-    {
142
-        // get shortcode_replace instance- set when _get_messages is called in child...
143
-        $this->_shortcode_helper = new EEH_Parse_Shortcodes();
144
-    }
145
-
146
-
147
-    public function get_shortcode_helper()
148
-    {
149
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150
-            $this->_set_shortcode_helper();
151
-        }
152
-        return $this->_shortcode_helper;
153
-    }
154
-
155
-
156
-    /**
157
-     * This is the public method for kicking of the parser included with each child.  It can be overridden by child
158
-     * classes if necessary (see EE_Questions_Answers for example)
159
-     *
160
-     * @param  string $shortcode incoming shortcode to be parsed
161
-     * @param  mixed (object|array) $data       incoming data to be be used for parsing
162
-     * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
163
-     * @return string            parsed shortcode.
164
-     */
165
-    public function parser($shortcode, $data, $extra_data = array())
166
-    {
167
-
168
-        // filter setup shortcodes
169
-        $this->_shortcodes = $this->get_shortcodes();
170
-
171
-        // we need to setup any dynamic shortcodes so that they work with the array_key_exists
172
-        $sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
174
-
175
-        // first we want to make sure this is a valid shortcode
176
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177
-            return false;
178
-        } //get out, this parser doesn't handle the incoming shortcode.
179
-        $this->_data = $data;
180
-        $this->_extra_data = $extra_data;
181
-        $this->_set_messages_properties();
182
-        $parsed = apply_filters(
183
-            'FHEE__' . get_class($this) . '__parser_after',
184
-            $this->_parser($shortcode),
185
-            $shortcode,
186
-            $data,
187
-            $extra_data,
188
-            $this
189
-        );
190
-
191
-        // note the below filter applies to ALL shortcode parsers... be careful!
192
-        $parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
193
-        return $parsed;
194
-    }
195
-
196
-
197
-    /**
198
-     * This method just returns the shortcodes in the $_shortcodes array property.
199
-     *
200
-     * @access public
201
-     * @return array array of shortcodes => description pairs
202
-     */
203
-    public function get_shortcodes()
204
-    {
205
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
206
-
207
-        // note the below filter applies to ALL shortcode parsers... be careful!
208
-        $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
209
-
210
-        return $this->_shortcodes;
211
-    }
212
-
213
-
214
-    /**
215
-     * Child classes use this method to set the $name, $description, and $_shortcodes properties.
216
-     *
217
-     * @abstract
218
-     * @access protected
219
-     * @return void
220
-     */
221
-    abstract protected function _init_props();
222
-
223
-
224
-    /**
225
-     * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
226
-     * will have to take care of handling.
227
-     *
228
-     * @abstract
229
-     * @access protected
230
-     * @param string $shortcode    the shortcode to be parsed.
231
-     * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
232
-     *                             array because there are some shortcodes that might be replaced by prepared data that
233
-     *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
234
-     *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
235
-     *                             the data shoudl be in a properly formatted object.  The
236
-     *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
237
-     * @return string parsed shortcode
238
-     */
239
-    abstract protected function _parser($shortcode);
240
-
241
-
242
-    /**
243
-     * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
244
-     * meets their requirements
245
-     *
246
-     * @return mixed (void|exception) If validation fails we'll throw an exception.
247
-     */
248
-    protected function _validate_list_requirements()
249
-    {
250
-
251
-        // first test to make sure we've got an array!
252
-        if (! is_array($this->_data)) {
253
-            throw new EE_Error(
254
-                sprintf(
255
-                    __(
256
-                        'Expecting an array for the data sent to %s. Instead it was %s',
257
-                        'event_espresso'
258
-                    ),
259
-                    get_class($this),
260
-                    gettype($this->_data)
261
-                )
262
-            );
263
-        }
264
-
265
-        // next test to make sure we've got the required template in the index!
266
-        if (! isset($this->_data['template'])) {
267
-            throw new EE_Error(
268
-                sprintf(
269
-                    __(
270
-                        'The incoming data does not have the required template index in its array',
271
-                        'event_espresso'
272
-                    )
273
-                )
274
-            );
275
-        }
276
-
277
-        // next test to make sure we've got got a data index in the incoming data array
278
-        if (! isset($this->_data['data'])) {
279
-            throw new EE_Error(
280
-                __(
281
-                    'The incoming data does not have the required data index in its array',
282
-                    'event_espresso'
283
-                )
284
-            );
285
-        }
286
-
287
-        // all is well let's make sure _extra_data always has the values needed.
288
-        // let's make sure that extra_data includes all templates (for later parsing if necessary)
289
-        if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
290
-            $this->_extra_data['data'] = $this->_data['data'];
291
-            $this->_extra_data['template'] = $this->_data['template'];
292
-        }
293
-    }
294
-
295
-
296
-    /**
297
-     * This returns any attributes that may be existing on an EE_Shortcode
298
-     *
299
-     * @since 4.5.0
300
-     * @param string $shortcode incoming shortcode
301
-     * @return array An array with the attributes
302
-     */
303
-    protected function _get_shortcode_attrs($shortcode)
304
-    {
305
-        // make sure the required wp helper function is present
306
-        // require the shortcode file if necessary
307
-        if (! function_exists('shortcode_parse_atts')) {
308
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
309
-        }
310
-
311
-        // let's get any attributes that may be present and set the defaults.
312
-        $shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
313
-        return shortcode_parse_atts($shortcode_to_parse);
314
-    }
315
-
316
-
317
-    /**
318
-     * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
319
-     * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever
320
-     * conditions existed in the opening tag.  This method handles parsing the actual template to show/hide this
321
-     * conditional content.
322
-     *
323
-     * @since 4.9.32
324
-     *
325
-     * @param string $shortcode This should be original shortcode as used in the template and passed to the parser.
326
-     * @param bool   $show      true means the opening and closing tags are removed and the content is left showing,
327
-     *                          false means the opening and closing tags and the contained content are removed.
328
-     * @return string     The template for the shortcode is returned.
329
-     */
330
-    protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331
-    {
332
-        // first let's get all the matches in the template for this particular shortcode.
333
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
334
-
335
-        if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336
-            // we need to hide all instances of the matches
337
-            foreach ($matches[0] as $index => $content_to_show_or_hide) {
338
-                $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
-                $replacement = $show ? $matches[4][ $index ] : '';
340
-                $this->_data['template'] = preg_replace(
341
-                    '~' . $content_to_show_or_hide . '~',
342
-                    $replacement,
343
-                    $this->_data['template']
344
-                );
345
-            }
346
-        }
347
-        // return $template
348
-        return $this->_data['template'];
349
-    }
350
-
351
-
352
-    /**
353
-     * This returns the regex pattern to use for conditional shortcodes parsing.
354
-     *
355
-     * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
356
-     *
357
-     * @param $shortcode
358
-     * @since 4.9.32
359
-     * @return string
360
-     */
361
-    private function _get_conditional_block_regex($shortcode)
362
-    {
363
-        // get just the shortcode tag for the match
364
-        preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
365
-        if (empty($shortcode_tag_matches[1])) {
366
-            return $this->_data['template'];
367
-        }
368
-
369
-        $shortcode_tag = $shortcode_tag_matches[1];
370
-        // get attributes_part_of_tag
371
-        $attributes_part = preg_quote(str_replace(array($shortcode_tag, '[', ']'), '', $shortcode));
372
-        // escape
373
-        $shortcode_tag = preg_quote($shortcode_tag);
374
-
375
-        return
376
-            '\['                                  // Opening Bracket
377
-            . "($shortcode_tag)$attributes_part"    // 1: Shortcode Name
378
-            . '(?![\w-])'                           // Not followed by word character or hyphen
379
-            . '('                                   // 2: Unroll the loop: Inside the opening shortcode tag
380
-            . '[^\]\/]*'                          // Not a closing bracket or forward slash
381
-            . '(?:'
382
-            . '\/(?!\])'                      // A forward slash not followed by a closing bracket
383
-            . '[^\]\/]*'                      // Not a closing bracket or forward slash.
384
-            . ')*?'
385
-            . ')'
386
-            . '(?:'
387
-            . '(\/)'                              // 3. Self closing tag ...
388
-            . '\]'                                // ... and closing bracket
389
-            . '|'
390
-            . '\]'                                // Closing bracket
391
-            . '(?:'
392
-            . '('                             // 4: Unroll the loop: Optionally, anything between the opening and closing brackets
393
-            . '[^\[]*+'                   // Not an opening bracket
394
-            . '(?:'
395
-            . '\[(?!\/\1\])'          // An opening bracket not followed by the closing shortcode tag.
396
-            . '[^\[]*+'               // Not an opening bracket
397
-            . ')*+'
398
-            . ')'
399
-            . '\[\/\1\]'                      // Closing shortcode tag
400
-            . ')?'
401
-            . ')';
402
-    }
403
-
404
-
405
-    /**
406
-     * This sets the properties related to the messages system
407
-     *
408
-     * @since 4.5.0
409
-     * @return void
410
-     */
411
-    protected function _set_messages_properties()
412
-    {
413
-        // should be in _extra_data
414
-        if (isset($this->_extra_data['messenger'])) {
415
-            $this->_messenger = $this->_extra_data['messenger'];
416
-            $this->_message_type = $this->_extra_data['message_type'];
417
-            $this->_context = $this->_extra_data['message'] instanceof EE_Message
418
-                ? $this->_extra_data['message']->context() : '';
419
-            $this->_GRP_ID = $this->_extra_data['message'] instanceof EE_Message
420
-                ? $this->_extra_data['message']->GRP_ID() : 0;
421
-            $this->_message = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']
422
-                : null;
423
-        }
424
-    }
425
-
426
-
427
-    /**
428
-     * This returns whatever the set message type object is that was set on this shortcode parser.
429
-     *
430
-     * @since 4.5.0
431
-     * @return EE_message_type
432
-     */
433
-    public function get_set_message_type()
434
-    {
435
-        return $this->_message_type;
436
-    }
437
-
438
-
439
-    /**
440
-     * This returns whatever the set messenger object is that was set on this shortcode parser
441
-     *
442
-     * @since 4.5.0
443
-     * @return EE_messenger
444
-     */
445
-    public function get_set_messenger()
446
-    {
447
-        return $this->_messenger;
448
-    }
449
-
450
-
451
-    /**
452
-     * This returns whatever the set context string is on this shortcode parser.
453
-     *
454
-     * @since 4.5.0
455
-     * @return string
456
-     */
457
-    public function get_set_context()
458
-    {
459
-        return $this->_context;
460
-    }
461
-
462
-
463
-    /**
464
-     * This returns whatever the set EE_Message object is on this shortcode.
465
-     *
466
-     * @since 4.9.0
467
-     * @return EE_Message
468
-     */
469
-    public function get_set_message()
470
-    {
471
-        return $this->_message;
472
-    }
20
+	/**
21
+	 * holds label for library
22
+	 * This is used for referencing the library label
23
+	 *
24
+	 * @access public
25
+	 * @var string
26
+	 */
27
+	public $label;
28
+
29
+
30
+	/**
31
+	 * This property is used for referencing a short description of the library
32
+	 *
33
+	 * @access public
34
+	 * @var string
35
+	 */
36
+	public $description;
37
+
38
+
39
+	/**
40
+	 * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
41
+	 * label/description for the shortcode.
42
+	 *
43
+	 * @access protected
44
+	 * @var array
45
+	 */
46
+	protected $_shortcodes;
47
+
48
+
49
+	/**
50
+	 * This will hold the incoming data item sent to the parser method
51
+	 *
52
+	 * @access protected
53
+	 * @var mixed (array|object)
54
+	 */
55
+	protected $_data;
56
+
57
+
58
+	/**
59
+	 * some shortcodes may require extra data to parse.  This property is provided for that.
60
+	 *
61
+	 * @var array
62
+	 */
63
+	protected $_extra_data;
64
+
65
+
66
+	/**
67
+	 * EE_messenger used to generate the template being parsed.
68
+	 *
69
+	 * @since 4.5.0
70
+	 * @var EE_messenger
71
+	 */
72
+	protected $_messenger;
73
+
74
+
75
+	/**
76
+	 * message type used to generate the template being parsed.
77
+	 *
78
+	 * @since 4.5.0
79
+	 * @var EE_message_type
80
+	 */
81
+	protected $_message_type;
82
+
83
+
84
+	/**
85
+	 * context used for the template being parsed
86
+	 *
87
+	 * @since 4.5.0
88
+	 * @var string
89
+	 */
90
+	protected $_context;
91
+
92
+
93
+	/**
94
+	 * Specific Message Template Group ID
95
+	 *
96
+	 * @since 4.5.0
97
+	 * @var int
98
+	 */
99
+	protected $_GRP_ID;
100
+
101
+
102
+	/**
103
+	 * @since 4.9.0
104
+	 * @type EE_Message
105
+	 */
106
+	protected $_message;
107
+
108
+
109
+	/**
110
+	 * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
111
+	 * shortcodes
112
+	 *
113
+	 * @var EEH_Parse_Shortcodes
114
+	 */
115
+	protected $_shortcode_helper;
116
+
117
+
118
+	public function __construct()
119
+	{
120
+		$this->_set_defaults();
121
+		$this->_init_props();
122
+	}
123
+
124
+
125
+	/**
126
+	 * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
127
+	 * method
128
+	 */
129
+	private function _set_defaults()
130
+	{
131
+		$this->name = $this->description = '';
132
+		$this->_shortcodes = array();
133
+		$this->_set_shortcode_helper();
134
+	}
135
+
136
+
137
+	/**
138
+	 * loads an instance of the EE_Shortcode_Parser helper when requested
139
+	 */
140
+	protected function _set_shortcode_helper()
141
+	{
142
+		// get shortcode_replace instance- set when _get_messages is called in child...
143
+		$this->_shortcode_helper = new EEH_Parse_Shortcodes();
144
+	}
145
+
146
+
147
+	public function get_shortcode_helper()
148
+	{
149
+		if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150
+			$this->_set_shortcode_helper();
151
+		}
152
+		return $this->_shortcode_helper;
153
+	}
154
+
155
+
156
+	/**
157
+	 * This is the public method for kicking of the parser included with each child.  It can be overridden by child
158
+	 * classes if necessary (see EE_Questions_Answers for example)
159
+	 *
160
+	 * @param  string $shortcode incoming shortcode to be parsed
161
+	 * @param  mixed (object|array) $data       incoming data to be be used for parsing
162
+	 * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
163
+	 * @return string            parsed shortcode.
164
+	 */
165
+	public function parser($shortcode, $data, $extra_data = array())
166
+	{
167
+
168
+		// filter setup shortcodes
169
+		$this->_shortcodes = $this->get_shortcodes();
170
+
171
+		// we need to setup any dynamic shortcodes so that they work with the array_key_exists
172
+		$sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
+		$sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
174
+
175
+		// first we want to make sure this is a valid shortcode
176
+		if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177
+			return false;
178
+		} //get out, this parser doesn't handle the incoming shortcode.
179
+		$this->_data = $data;
180
+		$this->_extra_data = $extra_data;
181
+		$this->_set_messages_properties();
182
+		$parsed = apply_filters(
183
+			'FHEE__' . get_class($this) . '__parser_after',
184
+			$this->_parser($shortcode),
185
+			$shortcode,
186
+			$data,
187
+			$extra_data,
188
+			$this
189
+		);
190
+
191
+		// note the below filter applies to ALL shortcode parsers... be careful!
192
+		$parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
193
+		return $parsed;
194
+	}
195
+
196
+
197
+	/**
198
+	 * This method just returns the shortcodes in the $_shortcodes array property.
199
+	 *
200
+	 * @access public
201
+	 * @return array array of shortcodes => description pairs
202
+	 */
203
+	public function get_shortcodes()
204
+	{
205
+		$this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
206
+
207
+		// note the below filter applies to ALL shortcode parsers... be careful!
208
+		$this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
209
+
210
+		return $this->_shortcodes;
211
+	}
212
+
213
+
214
+	/**
215
+	 * Child classes use this method to set the $name, $description, and $_shortcodes properties.
216
+	 *
217
+	 * @abstract
218
+	 * @access protected
219
+	 * @return void
220
+	 */
221
+	abstract protected function _init_props();
222
+
223
+
224
+	/**
225
+	 * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
226
+	 * will have to take care of handling.
227
+	 *
228
+	 * @abstract
229
+	 * @access protected
230
+	 * @param string $shortcode    the shortcode to be parsed.
231
+	 * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
232
+	 *                             array because there are some shortcodes that might be replaced by prepared data that
233
+	 *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
234
+	 *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
235
+	 *                             the data shoudl be in a properly formatted object.  The
236
+	 *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
237
+	 * @return string parsed shortcode
238
+	 */
239
+	abstract protected function _parser($shortcode);
240
+
241
+
242
+	/**
243
+	 * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
244
+	 * meets their requirements
245
+	 *
246
+	 * @return mixed (void|exception) If validation fails we'll throw an exception.
247
+	 */
248
+	protected function _validate_list_requirements()
249
+	{
250
+
251
+		// first test to make sure we've got an array!
252
+		if (! is_array($this->_data)) {
253
+			throw new EE_Error(
254
+				sprintf(
255
+					__(
256
+						'Expecting an array for the data sent to %s. Instead it was %s',
257
+						'event_espresso'
258
+					),
259
+					get_class($this),
260
+					gettype($this->_data)
261
+				)
262
+			);
263
+		}
264
+
265
+		// next test to make sure we've got the required template in the index!
266
+		if (! isset($this->_data['template'])) {
267
+			throw new EE_Error(
268
+				sprintf(
269
+					__(
270
+						'The incoming data does not have the required template index in its array',
271
+						'event_espresso'
272
+					)
273
+				)
274
+			);
275
+		}
276
+
277
+		// next test to make sure we've got got a data index in the incoming data array
278
+		if (! isset($this->_data['data'])) {
279
+			throw new EE_Error(
280
+				__(
281
+					'The incoming data does not have the required data index in its array',
282
+					'event_espresso'
283
+				)
284
+			);
285
+		}
286
+
287
+		// all is well let's make sure _extra_data always has the values needed.
288
+		// let's make sure that extra_data includes all templates (for later parsing if necessary)
289
+		if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
290
+			$this->_extra_data['data'] = $this->_data['data'];
291
+			$this->_extra_data['template'] = $this->_data['template'];
292
+		}
293
+	}
294
+
295
+
296
+	/**
297
+	 * This returns any attributes that may be existing on an EE_Shortcode
298
+	 *
299
+	 * @since 4.5.0
300
+	 * @param string $shortcode incoming shortcode
301
+	 * @return array An array with the attributes
302
+	 */
303
+	protected function _get_shortcode_attrs($shortcode)
304
+	{
305
+		// make sure the required wp helper function is present
306
+		// require the shortcode file if necessary
307
+		if (! function_exists('shortcode_parse_atts')) {
308
+			require_once(ABSPATH . WPINC . '/shortcodes.php');
309
+		}
310
+
311
+		// let's get any attributes that may be present and set the defaults.
312
+		$shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
313
+		return shortcode_parse_atts($shortcode_to_parse);
314
+	}
315
+
316
+
317
+	/**
318
+	 * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
319
+	 * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever
320
+	 * conditions existed in the opening tag.  This method handles parsing the actual template to show/hide this
321
+	 * conditional content.
322
+	 *
323
+	 * @since 4.9.32
324
+	 *
325
+	 * @param string $shortcode This should be original shortcode as used in the template and passed to the parser.
326
+	 * @param bool   $show      true means the opening and closing tags are removed and the content is left showing,
327
+	 *                          false means the opening and closing tags and the contained content are removed.
328
+	 * @return string     The template for the shortcode is returned.
329
+	 */
330
+	protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331
+	{
332
+		// first let's get all the matches in the template for this particular shortcode.
333
+		preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
334
+
335
+		if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336
+			// we need to hide all instances of the matches
337
+			foreach ($matches[0] as $index => $content_to_show_or_hide) {
338
+				$content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
+				$replacement = $show ? $matches[4][ $index ] : '';
340
+				$this->_data['template'] = preg_replace(
341
+					'~' . $content_to_show_or_hide . '~',
342
+					$replacement,
343
+					$this->_data['template']
344
+				);
345
+			}
346
+		}
347
+		// return $template
348
+		return $this->_data['template'];
349
+	}
350
+
351
+
352
+	/**
353
+	 * This returns the regex pattern to use for conditional shortcodes parsing.
354
+	 *
355
+	 * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
356
+	 *
357
+	 * @param $shortcode
358
+	 * @since 4.9.32
359
+	 * @return string
360
+	 */
361
+	private function _get_conditional_block_regex($shortcode)
362
+	{
363
+		// get just the shortcode tag for the match
364
+		preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
365
+		if (empty($shortcode_tag_matches[1])) {
366
+			return $this->_data['template'];
367
+		}
368
+
369
+		$shortcode_tag = $shortcode_tag_matches[1];
370
+		// get attributes_part_of_tag
371
+		$attributes_part = preg_quote(str_replace(array($shortcode_tag, '[', ']'), '', $shortcode));
372
+		// escape
373
+		$shortcode_tag = preg_quote($shortcode_tag);
374
+
375
+		return
376
+			'\['                                  // Opening Bracket
377
+			. "($shortcode_tag)$attributes_part"    // 1: Shortcode Name
378
+			. '(?![\w-])'                           // Not followed by word character or hyphen
379
+			. '('                                   // 2: Unroll the loop: Inside the opening shortcode tag
380
+			. '[^\]\/]*'                          // Not a closing bracket or forward slash
381
+			. '(?:'
382
+			. '\/(?!\])'                      // A forward slash not followed by a closing bracket
383
+			. '[^\]\/]*'                      // Not a closing bracket or forward slash.
384
+			. ')*?'
385
+			. ')'
386
+			. '(?:'
387
+			. '(\/)'                              // 3. Self closing tag ...
388
+			. '\]'                                // ... and closing bracket
389
+			. '|'
390
+			. '\]'                                // Closing bracket
391
+			. '(?:'
392
+			. '('                             // 4: Unroll the loop: Optionally, anything between the opening and closing brackets
393
+			. '[^\[]*+'                   // Not an opening bracket
394
+			. '(?:'
395
+			. '\[(?!\/\1\])'          // An opening bracket not followed by the closing shortcode tag.
396
+			. '[^\[]*+'               // Not an opening bracket
397
+			. ')*+'
398
+			. ')'
399
+			. '\[\/\1\]'                      // Closing shortcode tag
400
+			. ')?'
401
+			. ')';
402
+	}
403
+
404
+
405
+	/**
406
+	 * This sets the properties related to the messages system
407
+	 *
408
+	 * @since 4.5.0
409
+	 * @return void
410
+	 */
411
+	protected function _set_messages_properties()
412
+	{
413
+		// should be in _extra_data
414
+		if (isset($this->_extra_data['messenger'])) {
415
+			$this->_messenger = $this->_extra_data['messenger'];
416
+			$this->_message_type = $this->_extra_data['message_type'];
417
+			$this->_context = $this->_extra_data['message'] instanceof EE_Message
418
+				? $this->_extra_data['message']->context() : '';
419
+			$this->_GRP_ID = $this->_extra_data['message'] instanceof EE_Message
420
+				? $this->_extra_data['message']->GRP_ID() : 0;
421
+			$this->_message = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']
422
+				: null;
423
+		}
424
+	}
425
+
426
+
427
+	/**
428
+	 * This returns whatever the set message type object is that was set on this shortcode parser.
429
+	 *
430
+	 * @since 4.5.0
431
+	 * @return EE_message_type
432
+	 */
433
+	public function get_set_message_type()
434
+	{
435
+		return $this->_message_type;
436
+	}
437
+
438
+
439
+	/**
440
+	 * This returns whatever the set messenger object is that was set on this shortcode parser
441
+	 *
442
+	 * @since 4.5.0
443
+	 * @return EE_messenger
444
+	 */
445
+	public function get_set_messenger()
446
+	{
447
+		return $this->_messenger;
448
+	}
449
+
450
+
451
+	/**
452
+	 * This returns whatever the set context string is on this shortcode parser.
453
+	 *
454
+	 * @since 4.5.0
455
+	 * @return string
456
+	 */
457
+	public function get_set_context()
458
+	{
459
+		return $this->_context;
460
+	}
461
+
462
+
463
+	/**
464
+	 * This returns whatever the set EE_Message object is on this shortcode.
465
+	 *
466
+	 * @since 4.9.0
467
+	 * @return EE_Message
468
+	 */
469
+	public function get_set_message()
470
+	{
471
+		return $this->_message;
472
+	}
473 473
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 
147 147
     public function get_shortcode_helper()
148 148
     {
149
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
149
+        if ( ! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150 150
             $this->_set_shortcode_helper();
151 151
         }
152 152
         return $this->_shortcode_helper;
@@ -170,17 +170,17 @@  discard block
 block discarded – undo
170 170
 
171 171
         // we need to setup any dynamic shortcodes so that they work with the array_key_exists
172 172
         $sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
173
+        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0].']' : $shortcode;
174 174
 
175 175
         // first we want to make sure this is a valid shortcode
176
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
176
+        if ( ! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177 177
             return false;
178 178
         } //get out, this parser doesn't handle the incoming shortcode.
179 179
         $this->_data = $data;
180 180
         $this->_extra_data = $extra_data;
181 181
         $this->_set_messages_properties();
182 182
         $parsed = apply_filters(
183
-            'FHEE__' . get_class($this) . '__parser_after',
183
+            'FHEE__'.get_class($this).'__parser_after',
184 184
             $this->_parser($shortcode),
185 185
             $shortcode,
186 186
             $data,
@@ -202,7 +202,7 @@  discard block
 block discarded – undo
202 202
      */
203 203
     public function get_shortcodes()
204 204
     {
205
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
205
+        $this->_shortcodes = apply_filters('FHEE__'.get_class($this).'__shortcodes', $this->_shortcodes, $this);
206 206
 
207 207
         // note the below filter applies to ALL shortcode parsers... be careful!
208 208
         $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
@@ -249,7 +249,7 @@  discard block
 block discarded – undo
249 249
     {
250 250
 
251 251
         // first test to make sure we've got an array!
252
-        if (! is_array($this->_data)) {
252
+        if ( ! is_array($this->_data)) {
253 253
             throw new EE_Error(
254 254
                 sprintf(
255 255
                     __(
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
         }
264 264
 
265 265
         // next test to make sure we've got the required template in the index!
266
-        if (! isset($this->_data['template'])) {
266
+        if ( ! isset($this->_data['template'])) {
267 267
             throw new EE_Error(
268 268
                 sprintf(
269 269
                     __(
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
         }
276 276
 
277 277
         // next test to make sure we've got got a data index in the incoming data array
278
-        if (! isset($this->_data['data'])) {
278
+        if ( ! isset($this->_data['data'])) {
279 279
             throw new EE_Error(
280 280
                 __(
281 281
                     'The incoming data does not have the required data index in its array',
@@ -304,8 +304,8 @@  discard block
 block discarded – undo
304 304
     {
305 305
         // make sure the required wp helper function is present
306 306
         // require the shortcode file if necessary
307
-        if (! function_exists('shortcode_parse_atts')) {
308
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
307
+        if ( ! function_exists('shortcode_parse_atts')) {
308
+            require_once(ABSPATH.WPINC.'/shortcodes.php');
309 309
         }
310 310
 
311 311
         // let's get any attributes that may be present and set the defaults.
@@ -330,15 +330,15 @@  discard block
 block discarded – undo
330 330
     protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331 331
     {
332 332
         // first let's get all the matches in the template for this particular shortcode.
333
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
333
+        preg_match_all('~'.$this->_get_conditional_block_regex($shortcode).'~', $this->_data['template'], $matches);
334 334
 
335 335
         if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336 336
             // we need to hide all instances of the matches
337 337
             foreach ($matches[0] as $index => $content_to_show_or_hide) {
338 338
                 $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
-                $replacement = $show ? $matches[4][ $index ] : '';
339
+                $replacement = $show ? $matches[4][$index] : '';
340 340
                 $this->_data['template'] = preg_replace(
341
-                    '~' . $content_to_show_or_hide . '~',
341
+                    '~'.$content_to_show_or_hide.'~',
342 342
                     $replacement,
343 343
                     $this->_data['template']
344 344
                 );
Please login to merge, or discard this patch.
core/services/commands/transaction/CreateTransactionCommand.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
     public function getCapCheck()
58 58
     {
59 59
         // need cap for non-AJAX admin requests
60
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
60
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
61 61
             // there's no specific caps for editing/creating transactions,
62 62
             // so that's why we are using ee_edit_registrations
63 63
             return new CapCheck('ee_edit_registrations', 'create_new_transaction');
Please login to merge, or discard this patch.
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -20,60 +20,60 @@
 block discarded – undo
20 20
 class CreateTransactionCommand extends Command implements CommandRequiresCapCheckInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @var EE_Checkout $checkout
25
-     */
26
-    protected $checkout;
23
+	/**
24
+	 * @var EE_Checkout $checkout
25
+	 */
26
+	protected $checkout;
27 27
 
28
-    /**
29
-     * @var array $transaction_details
30
-     */
31
-    protected $transaction_details;
28
+	/**
29
+	 * @var array $transaction_details
30
+	 */
31
+	protected $transaction_details;
32 32
 
33 33
 
34
-    /**
35
-     * CreateTransactionCommand constructor.
36
-     *
37
-     * @param EE_Checkout $checkout
38
-     * @param array       $transaction_details
39
-     */
40
-    public function __construct(EE_Checkout $checkout = null, array $transaction_details = array())
41
-    {
42
-        $this->checkout = $checkout;
43
-        $this->transaction_details = $transaction_details;
44
-    }
34
+	/**
35
+	 * CreateTransactionCommand constructor.
36
+	 *
37
+	 * @param EE_Checkout $checkout
38
+	 * @param array       $transaction_details
39
+	 */
40
+	public function __construct(EE_Checkout $checkout = null, array $transaction_details = array())
41
+	{
42
+		$this->checkout = $checkout;
43
+		$this->transaction_details = $transaction_details;
44
+	}
45 45
 
46 46
 
47
-    /**
48
-     * @return CapCheckInterface
49
-     * @throws InvalidDataTypeException
50
-     */
51
-    public function getCapCheck()
52
-    {
53
-        // need cap for non-AJAX admin requests
54
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
55
-            // there's no specific caps for editing/creating transactions,
56
-            // so that's why we are using ee_edit_registrations
57
-            return new CapCheck('ee_edit_registrations', 'create_new_transaction');
58
-        }
59
-        return new PublicCapabilities('', 'create_new_transaction');
60
-    }
47
+	/**
48
+	 * @return CapCheckInterface
49
+	 * @throws InvalidDataTypeException
50
+	 */
51
+	public function getCapCheck()
52
+	{
53
+		// need cap for non-AJAX admin requests
54
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
55
+			// there's no specific caps for editing/creating transactions,
56
+			// so that's why we are using ee_edit_registrations
57
+			return new CapCheck('ee_edit_registrations', 'create_new_transaction');
58
+		}
59
+		return new PublicCapabilities('', 'create_new_transaction');
60
+	}
61 61
 
62 62
 
63
-    /**
64
-     * @return EE_Checkout
65
-     */
66
-    public function checkout()
67
-    {
68
-        return $this->checkout;
69
-    }
63
+	/**
64
+	 * @return EE_Checkout
65
+	 */
66
+	public function checkout()
67
+	{
68
+		return $this->checkout;
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * @return array
74
-     */
75
-    public function transactionDetails()
76
-    {
77
-        return $this->transaction_details;
78
-    }
72
+	/**
73
+	 * @return array
74
+	 */
75
+	public function transactionDetails()
76
+	{
77
+		return $this->transaction_details;
78
+	}
79 79
 }
Please login to merge, or discard this patch.
core/services/commands/attendee/CreateAttendeeCommand.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -81,7 +81,7 @@
 block discarded – undo
81 81
     public function getCapCheck()
82 82
     {
83 83
         // need cap for non-AJAX admin requests
84
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
84
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
85 85
             return new CapCheck('ee_edit_contacts', 'create_new_contact');
86 86
         }
87 87
         return new PublicCapabilities('', 'create_new_contact');
Please login to merge, or discard this patch.
Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -20,62 +20,62 @@
 block discarded – undo
20 20
 class CreateAttendeeCommand extends Command implements CommandRequiresCapCheckInterface
21 21
 {
22 22
 
23
-    /**
24
-     * array of details where keys are names of EEM_Attendee model fields
25
-     *
26
-     * @var array $attendee_details
27
-     */
28
-    protected $attendee_details;
23
+	/**
24
+	 * array of details where keys are names of EEM_Attendee model fields
25
+	 *
26
+	 * @var array $attendee_details
27
+	 */
28
+	protected $attendee_details;
29 29
 
30
-    /**
31
-     * an existing registration to associate this attendee with
32
-     *
33
-     * @var EE_Registration $registration
34
-     */
35
-    protected $registration;
30
+	/**
31
+	 * an existing registration to associate this attendee with
32
+	 *
33
+	 * @var EE_Registration $registration
34
+	 */
35
+	protected $registration;
36 36
 
37 37
 
38
-    /**
39
-     * CreateAttendeeCommand constructor.
40
-     *
41
-     * @param array           $attendee_details
42
-     * @param EE_Registration $registration
43
-     */
44
-    public function __construct(array $attendee_details, EE_Registration $registration)
45
-    {
46
-        $this->attendee_details = $attendee_details;
47
-        $this->registration = $registration;
48
-    }
38
+	/**
39
+	 * CreateAttendeeCommand constructor.
40
+	 *
41
+	 * @param array           $attendee_details
42
+	 * @param EE_Registration $registration
43
+	 */
44
+	public function __construct(array $attendee_details, EE_Registration $registration)
45
+	{
46
+		$this->attendee_details = $attendee_details;
47
+		$this->registration = $registration;
48
+	}
49 49
 
50 50
 
51
-    /**
52
-     * @return array
53
-     */
54
-    public function attendeeDetails()
55
-    {
56
-        return $this->attendee_details;
57
-    }
51
+	/**
52
+	 * @return array
53
+	 */
54
+	public function attendeeDetails()
55
+	{
56
+		return $this->attendee_details;
57
+	}
58 58
 
59 59
 
60
-    /**
61
-     * @return EE_Registration
62
-     */
63
-    public function registration()
64
-    {
65
-        return $this->registration;
66
-    }
60
+	/**
61
+	 * @return EE_Registration
62
+	 */
63
+	public function registration()
64
+	{
65
+		return $this->registration;
66
+	}
67 67
 
68 68
 
69
-    /**
70
-     * @return CapCheckInterface
71
-     * @throws InvalidDataTypeException
72
-     */
73
-    public function getCapCheck()
74
-    {
75
-        // need cap for non-AJAX admin requests
76
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
77
-            return new CapCheck('ee_edit_contacts', 'create_new_contact');
78
-        }
79
-        return new PublicCapabilities('', 'create_new_contact');
80
-    }
69
+	/**
70
+	 * @return CapCheckInterface
71
+	 * @throws InvalidDataTypeException
72
+	 */
73
+	public function getCapCheck()
74
+	{
75
+		// need cap for non-AJAX admin requests
76
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
77
+			return new CapCheck('ee_edit_contacts', 'create_new_contact');
78
+		}
79
+		return new PublicCapabilities('', 'create_new_contact');
80
+	}
81 81
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/Base.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -314,7 +314,7 @@
 block discarded – undo
314 314
      *
315 315
      * @param string $route
316 316
      * @param string $regex
317
-     * @param array  $match_keys EXCLUDING matching the entire regex
317
+     * @param string[]  $match_keys EXCLUDING matching the entire regex
318 318
      * @return array where  $match_keys are the keys (the first value of $match_keys
319 319
      *                           becomes the first key of the return value, etc. Eg passing in $match_keys of
320 320
      *                           array( 'model', 'id' ), will, if the regex is successful, will return
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
      */
97 97
     protected function setDebugInfo($key, $info)
98 98
     {
99
-        $this->debug_info[ $key ] = $info;
99
+        $this->debug_info[$key] = $info;
100 100
     }
101 101
 
102 102
 
@@ -113,11 +113,11 @@  discard block
 block discarded – undo
113 113
     {
114 114
         if (is_array($value)) {
115 115
             foreach ($value as $value_key => $value_value) {
116
-                $this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
116
+                $this->setResponseHeader($header_key.'['.$value_key.']', $value_value);
117 117
             }
118 118
         } else {
119 119
             $prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
-            $this->response_headers[ $prefix . $header_key ] = $value;
120
+            $this->response_headers[$prefix.$header_key] = $value;
121 121
         }
122 122
     }
123 123
 
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
     protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148 148
     {
149 149
         $notices_during_checkin = EE_Error::get_raw_notices();
150
-        if (! empty($notices_during_checkin['errors'])) {
150
+        if ( ! empty($notices_during_checkin['errors'])) {
151 151
             foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152 152
                 $wp_error_response->add(
153 153
                     sanitize_key($error_code),
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
                 if (is_array($debug_info)) {
191 191
                     $debug_info = wp_json_encode($debug_info);
192 192
                 }
193
-                $headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
193
+                $headers['X-EE4-Debug-'.ucwords($debug_key)] = $debug_info;
194 194
             }
195 195
         }
196 196
         $headers = array_merge(
@@ -249,15 +249,15 @@  discard block
 block discarded – undo
249 249
         $headers = array();
250 250
         $notices = EE_Error::get_raw_notices();
251 251
         foreach ($notices as $notice_type => $sub_notices) {
252
-            if (! is_array($sub_notices)) {
252
+            if ( ! is_array($sub_notices)) {
253 253
                 continue;
254 254
             }
255 255
             foreach ($sub_notices as $notice_code => $sub_notice) {
256
-                $headers[ 'X-EE4-Notices-'
256
+                $headers['X-EE4-Notices-'
257 257
                           . EEH_Inflector::humanize($notice_type)
258 258
                           . '['
259 259
                           . $notice_code
260
-                          . ']' ] = strip_tags($sub_notice);
260
+                          . ']'] = strip_tags($sub_notice);
261 261
             }
262 262
         }
263 263
         return apply_filters(
@@ -286,7 +286,7 @@  discard block
 block discarded – undo
286 286
         }
287 287
         $matches = $this->parseRoute(
288 288
             $route,
289
-            '~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
289
+            '~'.EED_Core_Rest_Api::ee_api_namespace_for_regex.'~',
290 290
             array('version')
291 291
         );
292 292
         if (isset($matches['version'])) {
@@ -320,14 +320,14 @@  discard block
 block discarded – undo
320 320
         if (is_array($matches)) {
321 321
             // skip the overall regex match. Who cares
322 322
             for ($i = 1; $i <= count($match_keys); $i++) {
323
-                if (! isset($matches[ $i ])) {
323
+                if ( ! isset($matches[$i])) {
324 324
                     $success = false;
325 325
                 } else {
326
-                    $indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
326
+                    $indexed_matches[$match_keys[$i - 1]] = $matches[$i];
327 327
                 }
328 328
             }
329 329
         }
330
-        if (! $success) {
330
+        if ( ! $success) {
331 331
             throw new EE_Error(
332 332
                 __('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333 333
                 'endpoint_parsing_error'
Please login to merge, or discard this patch.
Indentation   +334 added lines, -334 removed lines patch added patch discarded remove patch
@@ -22,338 +22,338 @@
 block discarded – undo
22 22
 class Base
23 23
 {
24 24
 
25
-    /**
26
-     * @deprecated use all-caps version
27
-     */
28
-    // @codingStandardsIgnoreStart
29
-    const header_prefix_for_ee = 'X-EE-';
30
-    // @codingStandardsIgnoreEnd
31
-
32
-    const HEADER_PREFIX_FOR_EE = 'X-EE-';
33
-
34
-    /**
35
-     * @deprecated use all-caps version instead
36
-     */
37
-    // @codingStandardsIgnoreStart
38
-    const header_prefix_for_wp = 'X-WP-';
39
-    // @codingStandardsIgnoreEnd
40
-
41
-    const HEADER_PREFIX_FOR_WP = 'X-WP-';
42
-
43
-    /**
44
-     * Contains debug info we'll send back in the response headers
45
-     *
46
-     * @var array
47
-     */
48
-    protected $debug_info = array();
49
-
50
-    /**
51
-     * Indicates whether or not the API is in debug mode
52
-     *
53
-     * @var boolean
54
-     */
55
-    protected $debug_mode = false;
56
-
57
-    /**
58
-     * Indicates the version that was requested
59
-     *
60
-     * @var string
61
-     */
62
-    protected $requested_version;
63
-
64
-    /**
65
-     * flat array of headers to send in the response
66
-     *
67
-     * @var array
68
-     */
69
-    protected $response_headers = array();
70
-
71
-
72
-    public function __construct()
73
-    {
74
-        $this->debug_mode = EED_Core_Rest_Api::debugMode();
75
-        // we are handling a REST request. Don't show a fancy HTML error message is any error comes up
76
-        add_filter('FHEE__EE_Error__get_error__show_normal_exceptions', '__return_true');
77
-    }
78
-
79
-
80
-    /**
81
-     * Sets the version the user requested
82
-     *
83
-     * @param string $version eg '4.8'
84
-     */
85
-    public function setRequestedVersion($version)
86
-    {
87
-        $this->requested_version = $version;
88
-    }
89
-
90
-
91
-    /**
92
-     * Sets some debug info that we'll send back in headers
93
-     *
94
-     * @param string       $key
95
-     * @param string|array $info
96
-     */
97
-    protected function setDebugInfo($key, $info)
98
-    {
99
-        $this->debug_info[ $key ] = $info;
100
-    }
101
-
102
-
103
-    /**
104
-     * Sets headers for the response
105
-     *
106
-     * @param string       $header_key    , excluding the "X-EE-" part
107
-     * @param array|string $value         if an array, multiple headers will be added, one
108
-     *                                    for each key in the array
109
-     * @param boolean      $use_ee_prefix whether to use the EE prefix on the header, or fallback to
110
-     *                                    the standard WP one
111
-     */
112
-    protected function setResponseHeader($header_key, $value, $use_ee_prefix = true)
113
-    {
114
-        if (is_array($value)) {
115
-            foreach ($value as $value_key => $value_value) {
116
-                $this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
117
-            }
118
-        } else {
119
-            $prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
-            $this->response_headers[ $prefix . $header_key ] = $value;
121
-        }
122
-    }
123
-
124
-
125
-    /**
126
-     * Returns a flat array of headers to be added to the response
127
-     *
128
-     * @return array
129
-     */
130
-    protected function getResponseHeaders()
131
-    {
132
-        return apply_filters(
133
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
134
-            $this->response_headers,
135
-            $this,
136
-            $this->requested_version
137
-        );
138
-    }
139
-
140
-
141
-    /**
142
-     * Adds error notices from EE_Error onto the provided \WP_Error
143
-     *
144
-     * @param WP_Error $wp_error_response
145
-     * @return WP_Error
146
-     */
147
-    protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148
-    {
149
-        $notices_during_checkin = EE_Error::get_raw_notices();
150
-        if (! empty($notices_during_checkin['errors'])) {
151
-            foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152
-                $wp_error_response->add(
153
-                    sanitize_key($error_code),
154
-                    strip_tags($error_message)
155
-                );
156
-            }
157
-        }
158
-        return $wp_error_response;
159
-    }
160
-
161
-
162
-    /**
163
-     * Sends a response, but also makes sure to attach headers that
164
-     * are handy for debugging.
165
-     * Specifically, we assume folks will want to know what exactly was the DB query that got run,
166
-     * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from
167
-     * the response, others?
168
-     *
169
-     * @param array|WP_Error|Exception|RestException $response
170
-     * @return WP_REST_Response
171
-     */
172
-    public function sendResponse($response)
173
-    {
174
-        if ($response instanceof RestException) {
175
-            $response = new WP_Error($response->getStringCode(), $response->getMessage(), $response->getData());
176
-        }
177
-        if ($response instanceof Exception) {
178
-            $code = $response->getCode() ? $response->getCode() : 'error_occurred';
179
-            $response = new WP_Error($code, $response->getMessage());
180
-        }
181
-        if ($response instanceof WP_Error) {
182
-            $response = $this->addEeErrorsToResponse($response);
183
-            $rest_response = $this->createRestResponseFromWpError($response);
184
-        } else {
185
-            $rest_response = new WP_REST_Response($response, 200);
186
-        }
187
-        $headers = array();
188
-        if ($this->debug_mode && is_array($this->debug_info)) {
189
-            foreach ($this->debug_info as $debug_key => $debug_info) {
190
-                if (is_array($debug_info)) {
191
-                    $debug_info = wp_json_encode($debug_info);
192
-                }
193
-                $headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
194
-            }
195
-        }
196
-        $headers = array_merge(
197
-            $headers,
198
-            $this->getResponseHeaders(),
199
-            $this->getHeadersFromEeNotices()
200
-        );
201
-        $rest_response->set_headers($headers);
202
-        return $rest_response;
203
-    }
204
-
205
-
206
-    /**
207
-     * Converts the \WP_Error into `WP_REST_Response.
208
-     * Mostly this is just a copy-and-paste from \WP_REST_Server::error_to_response
209
-     * (which is protected)
210
-     *
211
-     * @param WP_Error $wp_error
212
-     * @return WP_REST_Response
213
-     */
214
-    protected function createRestResponseFromWpError(WP_Error $wp_error)
215
-    {
216
-        $error_data = $wp_error->get_error_data();
217
-        if (is_array($error_data) && isset($error_data['status'])) {
218
-            $status = $error_data['status'];
219
-        } else {
220
-            $status = 500;
221
-        }
222
-        $errors = array();
223
-        foreach ((array) $wp_error->errors as $code => $messages) {
224
-            foreach ((array) $messages as $message) {
225
-                $errors[] = array(
226
-                    'code'    => $code,
227
-                    'message' => $message,
228
-                    'data'    => $wp_error->get_error_data($code),
229
-                );
230
-            }
231
-        }
232
-        $data = isset($errors[0]) ? $errors[0] : array();
233
-        if (count($errors) > 1) {
234
-            // Remove the primary error.
235
-            array_shift($errors);
236
-            $data['additional_errors'] = $errors;
237
-        }
238
-        return new WP_REST_Response($data, $status);
239
-    }
240
-
241
-
242
-    /**
243
-     * Array of headers derived from EE success, attention, and error messages
244
-     *
245
-     * @return array
246
-     */
247
-    protected function getHeadersFromEeNotices()
248
-    {
249
-        $headers = array();
250
-        $notices = EE_Error::get_raw_notices();
251
-        foreach ($notices as $notice_type => $sub_notices) {
252
-            if (! is_array($sub_notices)) {
253
-                continue;
254
-            }
255
-            foreach ($sub_notices as $notice_code => $sub_notice) {
256
-                $headers[ 'X-EE4-Notices-'
257
-                          . EEH_Inflector::humanize($notice_type)
258
-                          . '['
259
-                          . $notice_code
260
-                          . ']' ] = strip_tags($sub_notice);
261
-            }
262
-        }
263
-        return apply_filters(
264
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_headers_from_ee_notices__return',
265
-            $headers,
266
-            $this->requested_version,
267
-            $notices
268
-        );
269
-    }
270
-
271
-
272
-    /**
273
-     * Finds which version of the API was requested given the route, and returns it.
274
-     * eg in a request to "mysite.com/wp-json/ee/v4.8.29/events/123" this would return
275
-     * "4.8.29".
276
-     * We should know hte requested version in this model though, so if no route is
277
-     * provided just use what we set earlier
278
-     *
279
-     * @param string $route
280
-     * @return string
281
-     */
282
-    public function getRequestedVersion($route = null)
283
-    {
284
-        if ($route === null) {
285
-            return $this->requested_version;
286
-        }
287
-        $matches = $this->parseRoute(
288
-            $route,
289
-            '~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
290
-            array('version')
291
-        );
292
-        if (isset($matches['version'])) {
293
-            return $matches['version'];
294
-        } else {
295
-            return EED_Core_Rest_Api::latest_rest_api_version();
296
-        }
297
-    }
298
-
299
-
300
-    /**
301
-     * Applies the regex to the route, then creates an array using the values of
302
-     * $match_keys as keys (but ignores the full pattern match). Returns the array of matches.
303
-     * For example, if you call
304
-     * parse_route( '/ee/v4.8/events', '~\/ee\/v([^/]*)\/(.*)~', array( 'version', 'model' ) )
305
-     * it will return array( 'version' => '4.8', 'model' => 'events' )
306
-     *
307
-     * @param string $route
308
-     * @param string $regex
309
-     * @param array  $match_keys EXCLUDING matching the entire regex
310
-     * @return array where  $match_keys are the keys (the first value of $match_keys
311
-     *                           becomes the first key of the return value, etc. Eg passing in $match_keys of
312
-     *                           array( 'model', 'id' ), will, if the regex is successful, will return
313
-     *                           array( 'model' => 'foo', 'id' => 'bar' )
314
-     * @throws EE_Error if it couldn't be parsed
315
-     */
316
-    public function parseRoute($route, $regex, $match_keys)
317
-    {
318
-        $indexed_matches = array();
319
-        $success = preg_match($regex, $route, $matches);
320
-        if (is_array($matches)) {
321
-            // skip the overall regex match. Who cares
322
-            for ($i = 1; $i <= count($match_keys); $i++) {
323
-                if (! isset($matches[ $i ])) {
324
-                    $success = false;
325
-                } else {
326
-                    $indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
327
-                }
328
-            }
329
-        }
330
-        if (! $success) {
331
-            throw new EE_Error(
332
-                __('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333
-                'endpoint_parsing_error'
334
-            );
335
-        }
336
-        return $indexed_matches;
337
-    }
338
-
339
-
340
-    /**
341
-     * Gets the body's params (either from JSON or parsed body), which EXCLUDES the GET params and URL params
342
-     *
343
-     * @param \WP_REST_Request $request
344
-     * @return array
345
-     */
346
-    protected function getBodyParams(\WP_REST_Request $request)
347
-    {
348
-        // $request->get_params();
349
-        return array_merge(
350
-            (array) $request->get_body_params(),
351
-            (array) $request->get_json_params()
352
-        );
353
-        // return array_diff_key(
354
-        //    $request->get_params(),
355
-        //     $request->get_url_params(),
356
-        //     $request->get_query_params()
357
-        // );
358
-    }
25
+	/**
26
+	 * @deprecated use all-caps version
27
+	 */
28
+	// @codingStandardsIgnoreStart
29
+	const header_prefix_for_ee = 'X-EE-';
30
+	// @codingStandardsIgnoreEnd
31
+
32
+	const HEADER_PREFIX_FOR_EE = 'X-EE-';
33
+
34
+	/**
35
+	 * @deprecated use all-caps version instead
36
+	 */
37
+	// @codingStandardsIgnoreStart
38
+	const header_prefix_for_wp = 'X-WP-';
39
+	// @codingStandardsIgnoreEnd
40
+
41
+	const HEADER_PREFIX_FOR_WP = 'X-WP-';
42
+
43
+	/**
44
+	 * Contains debug info we'll send back in the response headers
45
+	 *
46
+	 * @var array
47
+	 */
48
+	protected $debug_info = array();
49
+
50
+	/**
51
+	 * Indicates whether or not the API is in debug mode
52
+	 *
53
+	 * @var boolean
54
+	 */
55
+	protected $debug_mode = false;
56
+
57
+	/**
58
+	 * Indicates the version that was requested
59
+	 *
60
+	 * @var string
61
+	 */
62
+	protected $requested_version;
63
+
64
+	/**
65
+	 * flat array of headers to send in the response
66
+	 *
67
+	 * @var array
68
+	 */
69
+	protected $response_headers = array();
70
+
71
+
72
+	public function __construct()
73
+	{
74
+		$this->debug_mode = EED_Core_Rest_Api::debugMode();
75
+		// we are handling a REST request. Don't show a fancy HTML error message is any error comes up
76
+		add_filter('FHEE__EE_Error__get_error__show_normal_exceptions', '__return_true');
77
+	}
78
+
79
+
80
+	/**
81
+	 * Sets the version the user requested
82
+	 *
83
+	 * @param string $version eg '4.8'
84
+	 */
85
+	public function setRequestedVersion($version)
86
+	{
87
+		$this->requested_version = $version;
88
+	}
89
+
90
+
91
+	/**
92
+	 * Sets some debug info that we'll send back in headers
93
+	 *
94
+	 * @param string       $key
95
+	 * @param string|array $info
96
+	 */
97
+	protected function setDebugInfo($key, $info)
98
+	{
99
+		$this->debug_info[ $key ] = $info;
100
+	}
101
+
102
+
103
+	/**
104
+	 * Sets headers for the response
105
+	 *
106
+	 * @param string       $header_key    , excluding the "X-EE-" part
107
+	 * @param array|string $value         if an array, multiple headers will be added, one
108
+	 *                                    for each key in the array
109
+	 * @param boolean      $use_ee_prefix whether to use the EE prefix on the header, or fallback to
110
+	 *                                    the standard WP one
111
+	 */
112
+	protected function setResponseHeader($header_key, $value, $use_ee_prefix = true)
113
+	{
114
+		if (is_array($value)) {
115
+			foreach ($value as $value_key => $value_value) {
116
+				$this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
117
+			}
118
+		} else {
119
+			$prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
+			$this->response_headers[ $prefix . $header_key ] = $value;
121
+		}
122
+	}
123
+
124
+
125
+	/**
126
+	 * Returns a flat array of headers to be added to the response
127
+	 *
128
+	 * @return array
129
+	 */
130
+	protected function getResponseHeaders()
131
+	{
132
+		return apply_filters(
133
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
134
+			$this->response_headers,
135
+			$this,
136
+			$this->requested_version
137
+		);
138
+	}
139
+
140
+
141
+	/**
142
+	 * Adds error notices from EE_Error onto the provided \WP_Error
143
+	 *
144
+	 * @param WP_Error $wp_error_response
145
+	 * @return WP_Error
146
+	 */
147
+	protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148
+	{
149
+		$notices_during_checkin = EE_Error::get_raw_notices();
150
+		if (! empty($notices_during_checkin['errors'])) {
151
+			foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152
+				$wp_error_response->add(
153
+					sanitize_key($error_code),
154
+					strip_tags($error_message)
155
+				);
156
+			}
157
+		}
158
+		return $wp_error_response;
159
+	}
160
+
161
+
162
+	/**
163
+	 * Sends a response, but also makes sure to attach headers that
164
+	 * are handy for debugging.
165
+	 * Specifically, we assume folks will want to know what exactly was the DB query that got run,
166
+	 * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from
167
+	 * the response, others?
168
+	 *
169
+	 * @param array|WP_Error|Exception|RestException $response
170
+	 * @return WP_REST_Response
171
+	 */
172
+	public function sendResponse($response)
173
+	{
174
+		if ($response instanceof RestException) {
175
+			$response = new WP_Error($response->getStringCode(), $response->getMessage(), $response->getData());
176
+		}
177
+		if ($response instanceof Exception) {
178
+			$code = $response->getCode() ? $response->getCode() : 'error_occurred';
179
+			$response = new WP_Error($code, $response->getMessage());
180
+		}
181
+		if ($response instanceof WP_Error) {
182
+			$response = $this->addEeErrorsToResponse($response);
183
+			$rest_response = $this->createRestResponseFromWpError($response);
184
+		} else {
185
+			$rest_response = new WP_REST_Response($response, 200);
186
+		}
187
+		$headers = array();
188
+		if ($this->debug_mode && is_array($this->debug_info)) {
189
+			foreach ($this->debug_info as $debug_key => $debug_info) {
190
+				if (is_array($debug_info)) {
191
+					$debug_info = wp_json_encode($debug_info);
192
+				}
193
+				$headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
194
+			}
195
+		}
196
+		$headers = array_merge(
197
+			$headers,
198
+			$this->getResponseHeaders(),
199
+			$this->getHeadersFromEeNotices()
200
+		);
201
+		$rest_response->set_headers($headers);
202
+		return $rest_response;
203
+	}
204
+
205
+
206
+	/**
207
+	 * Converts the \WP_Error into `WP_REST_Response.
208
+	 * Mostly this is just a copy-and-paste from \WP_REST_Server::error_to_response
209
+	 * (which is protected)
210
+	 *
211
+	 * @param WP_Error $wp_error
212
+	 * @return WP_REST_Response
213
+	 */
214
+	protected function createRestResponseFromWpError(WP_Error $wp_error)
215
+	{
216
+		$error_data = $wp_error->get_error_data();
217
+		if (is_array($error_data) && isset($error_data['status'])) {
218
+			$status = $error_data['status'];
219
+		} else {
220
+			$status = 500;
221
+		}
222
+		$errors = array();
223
+		foreach ((array) $wp_error->errors as $code => $messages) {
224
+			foreach ((array) $messages as $message) {
225
+				$errors[] = array(
226
+					'code'    => $code,
227
+					'message' => $message,
228
+					'data'    => $wp_error->get_error_data($code),
229
+				);
230
+			}
231
+		}
232
+		$data = isset($errors[0]) ? $errors[0] : array();
233
+		if (count($errors) > 1) {
234
+			// Remove the primary error.
235
+			array_shift($errors);
236
+			$data['additional_errors'] = $errors;
237
+		}
238
+		return new WP_REST_Response($data, $status);
239
+	}
240
+
241
+
242
+	/**
243
+	 * Array of headers derived from EE success, attention, and error messages
244
+	 *
245
+	 * @return array
246
+	 */
247
+	protected function getHeadersFromEeNotices()
248
+	{
249
+		$headers = array();
250
+		$notices = EE_Error::get_raw_notices();
251
+		foreach ($notices as $notice_type => $sub_notices) {
252
+			if (! is_array($sub_notices)) {
253
+				continue;
254
+			}
255
+			foreach ($sub_notices as $notice_code => $sub_notice) {
256
+				$headers[ 'X-EE4-Notices-'
257
+						  . EEH_Inflector::humanize($notice_type)
258
+						  . '['
259
+						  . $notice_code
260
+						  . ']' ] = strip_tags($sub_notice);
261
+			}
262
+		}
263
+		return apply_filters(
264
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_headers_from_ee_notices__return',
265
+			$headers,
266
+			$this->requested_version,
267
+			$notices
268
+		);
269
+	}
270
+
271
+
272
+	/**
273
+	 * Finds which version of the API was requested given the route, and returns it.
274
+	 * eg in a request to "mysite.com/wp-json/ee/v4.8.29/events/123" this would return
275
+	 * "4.8.29".
276
+	 * We should know hte requested version in this model though, so if no route is
277
+	 * provided just use what we set earlier
278
+	 *
279
+	 * @param string $route
280
+	 * @return string
281
+	 */
282
+	public function getRequestedVersion($route = null)
283
+	{
284
+		if ($route === null) {
285
+			return $this->requested_version;
286
+		}
287
+		$matches = $this->parseRoute(
288
+			$route,
289
+			'~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
290
+			array('version')
291
+		);
292
+		if (isset($matches['version'])) {
293
+			return $matches['version'];
294
+		} else {
295
+			return EED_Core_Rest_Api::latest_rest_api_version();
296
+		}
297
+	}
298
+
299
+
300
+	/**
301
+	 * Applies the regex to the route, then creates an array using the values of
302
+	 * $match_keys as keys (but ignores the full pattern match). Returns the array of matches.
303
+	 * For example, if you call
304
+	 * parse_route( '/ee/v4.8/events', '~\/ee\/v([^/]*)\/(.*)~', array( 'version', 'model' ) )
305
+	 * it will return array( 'version' => '4.8', 'model' => 'events' )
306
+	 *
307
+	 * @param string $route
308
+	 * @param string $regex
309
+	 * @param array  $match_keys EXCLUDING matching the entire regex
310
+	 * @return array where  $match_keys are the keys (the first value of $match_keys
311
+	 *                           becomes the first key of the return value, etc. Eg passing in $match_keys of
312
+	 *                           array( 'model', 'id' ), will, if the regex is successful, will return
313
+	 *                           array( 'model' => 'foo', 'id' => 'bar' )
314
+	 * @throws EE_Error if it couldn't be parsed
315
+	 */
316
+	public function parseRoute($route, $regex, $match_keys)
317
+	{
318
+		$indexed_matches = array();
319
+		$success = preg_match($regex, $route, $matches);
320
+		if (is_array($matches)) {
321
+			// skip the overall regex match. Who cares
322
+			for ($i = 1; $i <= count($match_keys); $i++) {
323
+				if (! isset($matches[ $i ])) {
324
+					$success = false;
325
+				} else {
326
+					$indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
327
+				}
328
+			}
329
+		}
330
+		if (! $success) {
331
+			throw new EE_Error(
332
+				__('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333
+				'endpoint_parsing_error'
334
+			);
335
+		}
336
+		return $indexed_matches;
337
+	}
338
+
339
+
340
+	/**
341
+	 * Gets the body's params (either from JSON or parsed body), which EXCLUDES the GET params and URL params
342
+	 *
343
+	 * @param \WP_REST_Request $request
344
+	 * @return array
345
+	 */
346
+	protected function getBodyParams(\WP_REST_Request $request)
347
+	{
348
+		// $request->get_params();
349
+		return array_merge(
350
+			(array) $request->get_body_params(),
351
+			(array) $request->get_json_params()
352
+		);
353
+		// return array_diff_key(
354
+		//    $request->get_params(),
355
+		//     $request->get_url_params(),
356
+		//     $request->get_query_params()
357
+		// );
358
+	}
359 359
 }
Please login to merge, or discard this patch.
core/interfaces/line_items/EEI_Line_Item_Display.interface.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -9,12 +9,12 @@
 block discarded – undo
9 9
 interface EEI_Line_Item_Display
10 10
 {
11 11
 
12
-    /**
13
-     * @param EE_Line_Item $line_item
14
-     * @param array        $options
15
-     * @return mixed
16
-     */
17
-    public function display_line_item(EE_Line_Item $line_item, $options = array());
12
+	/**
13
+	 * @param EE_Line_Item $line_item
14
+	 * @param array        $options
15
+	 * @return mixed
16
+	 */
17
+	public function display_line_item(EE_Line_Item $line_item, $options = array());
18 18
 
19 19
 }
20 20
 
Please login to merge, or discard this patch.
form_sections/strategies/normalization/EE_Int_Normalization.strategy.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@
 block discarded – undo
17 17
 
18 18
     /**
19 19
      * @param string $value_to_normalize
20
-     * @return int|mixed|string
20
+     * @return null|integer
21 21
      * @throws \EE_Validation_Error
22 22
      */
23 23
     public function normalize($value_to_normalize)
Please login to merge, or discard this patch.
Indentation   +74 added lines, -74 removed lines patch added patch discarded remove patch
@@ -10,88 +10,88 @@
 block discarded – undo
10 10
 class EE_Int_Normalization extends EE_Normalization_Strategy_Base
11 11
 {
12 12
 
13
-    /*
13
+	/*
14 14
      * regex pattern that matches for the following:
15 15
      *      * optional negative sign
16 16
      *      * one or more digits
17 17
      */
18
-    const REGEX = '/^(-?)(\d+)(?:\.0+)?$/';
18
+	const REGEX = '/^(-?)(\d+)(?:\.0+)?$/';
19 19
 
20 20
 
21 21
 
22
-    /**
23
-     * @param string $value_to_normalize
24
-     * @return int|mixed|string
25
-     * @throws \EE_Validation_Error
26
-     */
27
-    public function normalize($value_to_normalize)
28
-    {
29
-        if ($value_to_normalize === null) {
30
-            return null;
31
-        }
32
-        if (is_int($value_to_normalize) || is_float($value_to_normalize)) {
33
-            return (int) $value_to_normalize;
34
-        }
35
-        if (! is_string($value_to_normalize)) {
36
-            throw new EE_Validation_Error(
37
-                sprintf(
38
-                    __('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'),
39
-                    print_r($value_to_normalize, true),
40
-                    gettype($value_to_normalize)
41
-                )
42
-            );
43
-        }
44
-        $value_to_normalize = filter_var(
45
-            $value_to_normalize,
46
-            FILTER_SANITIZE_NUMBER_FLOAT,
47
-            FILTER_FLAG_ALLOW_FRACTION
48
-        );
49
-        if ($value_to_normalize === '') {
50
-            return null;
51
-        }
52
-        $matches = array();
53
-        if (preg_match(EE_Int_Normalization::REGEX, $value_to_normalize, $matches)) {
54
-            if (count($matches) === 3) {
55
-                // if first match is the negative sign,
56
-                // then the number needs to be multiplied by -1 to remain negative
57
-                return $matches[1] === '-'
58
-                    ? (int) $matches[2] * -1
59
-                    : (int) $matches[2];
60
-            }
61
-        }
62
-        // find if this input has a int validation strategy
63
-        // in which case, use its message
64
-        $validation_error_message = null;
65
-        foreach ($this->_input->get_validation_strategies() as $validation_strategy) {
66
-            if ($validation_strategy instanceof EE_Int_Validation_Strategy) {
67
-                $validation_error_message = $validation_strategy->get_validation_error_message();
68
-            }
69
-        }
70
-        // this really shouldn't ever happen because fields with a int normalization strategy
71
-        // should also have a int validation strategy, but in case it doesn't use the default
72
-        if (! $validation_error_message) {
73
-            $default_validation_strategy = new EE_Int_Validation_Strategy();
74
-            $validation_error_message = $default_validation_strategy->get_validation_error_message();
75
-        }
76
-        throw new EE_Validation_Error($validation_error_message, 'numeric_only');
77
-    }
22
+	/**
23
+	 * @param string $value_to_normalize
24
+	 * @return int|mixed|string
25
+	 * @throws \EE_Validation_Error
26
+	 */
27
+	public function normalize($value_to_normalize)
28
+	{
29
+		if ($value_to_normalize === null) {
30
+			return null;
31
+		}
32
+		if (is_int($value_to_normalize) || is_float($value_to_normalize)) {
33
+			return (int) $value_to_normalize;
34
+		}
35
+		if (! is_string($value_to_normalize)) {
36
+			throw new EE_Validation_Error(
37
+				sprintf(
38
+					__('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'),
39
+					print_r($value_to_normalize, true),
40
+					gettype($value_to_normalize)
41
+				)
42
+			);
43
+		}
44
+		$value_to_normalize = filter_var(
45
+			$value_to_normalize,
46
+			FILTER_SANITIZE_NUMBER_FLOAT,
47
+			FILTER_FLAG_ALLOW_FRACTION
48
+		);
49
+		if ($value_to_normalize === '') {
50
+			return null;
51
+		}
52
+		$matches = array();
53
+		if (preg_match(EE_Int_Normalization::REGEX, $value_to_normalize, $matches)) {
54
+			if (count($matches) === 3) {
55
+				// if first match is the negative sign,
56
+				// then the number needs to be multiplied by -1 to remain negative
57
+				return $matches[1] === '-'
58
+					? (int) $matches[2] * -1
59
+					: (int) $matches[2];
60
+			}
61
+		}
62
+		// find if this input has a int validation strategy
63
+		// in which case, use its message
64
+		$validation_error_message = null;
65
+		foreach ($this->_input->get_validation_strategies() as $validation_strategy) {
66
+			if ($validation_strategy instanceof EE_Int_Validation_Strategy) {
67
+				$validation_error_message = $validation_strategy->get_validation_error_message();
68
+			}
69
+		}
70
+		// this really shouldn't ever happen because fields with a int normalization strategy
71
+		// should also have a int validation strategy, but in case it doesn't use the default
72
+		if (! $validation_error_message) {
73
+			$default_validation_strategy = new EE_Int_Validation_Strategy();
74
+			$validation_error_message = $default_validation_strategy->get_validation_error_message();
75
+		}
76
+		throw new EE_Validation_Error($validation_error_message, 'numeric_only');
77
+	}
78 78
 
79 79
 
80 80
 
81
-    /**
82
-     * Converts the int into a string for use in teh html form
83
-     *
84
-     * @param int $normalized_value
85
-     * @return string
86
-     */
87
-    public function unnormalize($normalized_value)
88
-    {
89
-        if ($normalized_value === null || $normalized_value === '') {
90
-            return '';
91
-        }
92
-        if (empty($normalized_value)) {
93
-            return '0';
94
-        }
95
-        return "$normalized_value";
96
-    }
81
+	/**
82
+	 * Converts the int into a string for use in teh html form
83
+	 *
84
+	 * @param int $normalized_value
85
+	 * @return string
86
+	 */
87
+	public function unnormalize($normalized_value)
88
+	{
89
+		if ($normalized_value === null || $normalized_value === '') {
90
+			return '';
91
+		}
92
+		if (empty($normalized_value)) {
93
+			return '0';
94
+		}
95
+		return "$normalized_value";
96
+	}
97 97
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
32 32
         if (is_int($value_to_normalize) || is_float($value_to_normalize)) {
33 33
             return (int) $value_to_normalize;
34 34
         }
35
-        if (! is_string($value_to_normalize)) {
35
+        if ( ! is_string($value_to_normalize)) {
36 36
             throw new EE_Validation_Error(
37 37
                 sprintf(
38 38
                     __('The value "%s" must be a string submitted for normalization, it was %s', 'event_espresso'),
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
         }
70 70
         // this really shouldn't ever happen because fields with a int normalization strategy
71 71
         // should also have a int validation strategy, but in case it doesn't use the default
72
-        if (! $validation_error_message) {
72
+        if ( ! $validation_error_message) {
73 73
             $default_validation_strategy = new EE_Int_Validation_Strategy();
74 74
             $validation_error_message = $default_validation_strategy->get_validation_error_message();
75 75
         }
Please login to merge, or discard this patch.
core/db_models/EEM_Event.model.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -217,7 +217,7 @@
 block discarded – undo
217 217
 
218 218
     /**
219 219
      * Used to override the default for the additional limit field.
220
-     * @param $additional_limit
220
+     * @param integer $additional_limit
221 221
      */
222 222
     public static function set_default_additional_limit($additional_limit)
223 223
     {
Please login to merge, or discard this patch.
Indentation   +895 added lines, -895 removed lines patch added patch discarded remove patch
@@ -13,899 +13,899 @@
 block discarded – undo
13 13
 class EEM_Event extends EEM_CPT_Base
14 14
 {
15 15
 
16
-    /**
17
-     * constant used by status(), indicating that no more tickets can be purchased for any of the datetimes for the
18
-     * event
19
-     */
20
-    const sold_out = 'sold_out';
21
-
22
-    /**
23
-     * constant used by status(), indicating that upcoming event dates have been postponed (may be pushed to a later
24
-     * date)
25
-     */
26
-    const postponed = 'postponed';
27
-
28
-    /**
29
-     * constant used by status(), indicating that the event will no longer occur
30
-     */
31
-    const cancelled = 'cancelled';
32
-
33
-
34
-    /**
35
-     * @var string
36
-     */
37
-    protected static $_default_reg_status;
38
-
39
-
40
-    /**
41
-     * This is the default for the additional limit field.
42
-     * @var int
43
-     */
44
-    protected static $_default_additional_limit = 10;
45
-
46
-
47
-    /**
48
-     * private instance of the Event object
49
-     *
50
-     * @var EEM_Event
51
-     */
52
-    protected static $_instance;
53
-
54
-
55
-
56
-
57
-    /**
58
-     * Adds a relationship to Term_Taxonomy for each CPT_Base
59
-     *
60
-     * @param string $timezone
61
-     * @throws \EE_Error
62
-     */
63
-    protected function __construct($timezone = null)
64
-    {
65
-        EE_Registry::instance()->load_model('Registration');
66
-        $this->singular_item = esc_html__('Event', 'event_espresso');
67
-        $this->plural_item = esc_html__('Events', 'event_espresso');
68
-        // to remove Cancelled events from the frontend, copy the following filter to your functions.php file
69
-        // add_filter( 'AFEE__EEM_Event__construct___custom_stati__cancelled__Public', '__return_false' );
70
-        // to remove Postponed events from the frontend, copy the following filter to your functions.php file
71
-        // add_filter( 'AFEE__EEM_Event__construct___custom_stati__postponed__Public', '__return_false' );
72
-        // to remove Sold Out events from the frontend, copy the following filter to your functions.php file
73
-        //  add_filter( 'AFEE__EEM_Event__construct___custom_stati__sold_out__Public', '__return_false' );
74
-        $this->_custom_stati = apply_filters(
75
-            'AFEE__EEM_Event__construct___custom_stati',
76
-            array(
77
-                EEM_Event::cancelled => array(
78
-                    'label'  => esc_html__('Cancelled', 'event_espresso'),
79
-                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__cancelled__Public', true),
80
-                ),
81
-                EEM_Event::postponed => array(
82
-                    'label'  => esc_html__('Postponed', 'event_espresso'),
83
-                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__postponed__Public', true),
84
-                ),
85
-                EEM_Event::sold_out  => array(
86
-                    'label'  => esc_html__('Sold Out', 'event_espresso'),
87
-                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__sold_out__Public', true),
88
-                ),
89
-            )
90
-        );
91
-        self::$_default_reg_status = empty(self::$_default_reg_status) ? EEM_Registration::status_id_pending_payment
92
-            : self::$_default_reg_status;
93
-        $this->_tables = array(
94
-            'Event_CPT'  => new EE_Primary_Table('posts', 'ID'),
95
-            'Event_Meta' => new EE_Secondary_Table('esp_event_meta', 'EVTM_ID', 'EVT_ID'),
96
-        );
97
-        $this->_fields = array(
98
-            'Event_CPT'  => array(
99
-                'EVT_ID'         => new EE_Primary_Key_Int_Field(
100
-                    'ID',
101
-                    esc_html__('Post ID for Event', 'event_espresso')
102
-                ),
103
-                'EVT_name'       => new EE_Plain_Text_Field(
104
-                    'post_title',
105
-                    esc_html__('Event Name', 'event_espresso'),
106
-                    false,
107
-                    ''
108
-                ),
109
-                'EVT_desc'       => new EE_Post_Content_Field(
110
-                    'post_content',
111
-                    esc_html__('Event Description', 'event_espresso'),
112
-                    false,
113
-                    ''
114
-                ),
115
-                'EVT_slug'       => new EE_Slug_Field(
116
-                    'post_name',
117
-                    esc_html__('Event Slug', 'event_espresso'),
118
-                    false,
119
-                    ''
120
-                ),
121
-                'EVT_created'    => new EE_Datetime_Field(
122
-                    'post_date',
123
-                    esc_html__('Date/Time Event Created', 'event_espresso'),
124
-                    false,
125
-                    EE_Datetime_Field::now
126
-                ),
127
-                'EVT_short_desc' => new EE_Simple_HTML_Field(
128
-                    'post_excerpt',
129
-                    esc_html__('Event Short Description', 'event_espresso'),
130
-                    false,
131
-                    ''
132
-                ),
133
-                'EVT_modified'   => new EE_Datetime_Field(
134
-                    'post_modified',
135
-                    esc_html__('Date/Time Event Modified', 'event_espresso'),
136
-                    false,
137
-                    EE_Datetime_Field::now
138
-                ),
139
-                'EVT_wp_user'    => new EE_WP_User_Field(
140
-                    'post_author',
141
-                    esc_html__('Event Creator ID', 'event_espresso'),
142
-                    false
143
-                ),
144
-                'parent'         => new EE_Integer_Field(
145
-                    'post_parent',
146
-                    esc_html__('Event Parent ID', 'event_espresso'),
147
-                    false,
148
-                    0
149
-                ),
150
-                'EVT_order'      => new EE_Integer_Field(
151
-                    'menu_order',
152
-                    esc_html__('Event Menu Order', 'event_espresso'),
153
-                    false,
154
-                    1
155
-                ),
156
-                'post_type'      => new EE_WP_Post_Type_Field('espresso_events'),
157
-                // EE_Plain_Text_Field( 'post_type', esc_html__( 'Event Post Type', 'event_espresso' ), FALSE, 'espresso_events' ),
158
-                'status'         => new EE_WP_Post_Status_Field(
159
-                    'post_status',
160
-                    esc_html__('Event Status', 'event_espresso'),
161
-                    false,
162
-                    'draft',
163
-                    $this->_custom_stati
164
-                ),
165
-                'password' => new EE_Password_Field(
166
-                    'post_password',
167
-                    __('Password', 'event_espresso'),
168
-                    false,
169
-                    '',
170
-                    array(
171
-                        'EVT_desc',
172
-                        'EVT_short_desc',
173
-                        'EVT_display_desc',
174
-                        'EVT_display_ticket_selector',
175
-                        'EVT_visible_on',
176
-                        'EVT_additional_limit',
177
-                        'EVT_default_registration_status',
178
-                        'EVT_member_only',
179
-                        'EVT_phone',
180
-                        'EVT_allow_overflow',
181
-                        'EVT_timezone_string',
182
-                        'EVT_external_URL',
183
-                        'EVT_donations'
184
-                    )
185
-                )
186
-            ),
187
-            'Event_Meta' => array(
188
-                'EVTM_ID'                         => new EE_DB_Only_Float_Field(
189
-                    'EVTM_ID',
190
-                    esc_html__('Event Meta Row ID', 'event_espresso'),
191
-                    false
192
-                ),
193
-                'EVT_ID_fk'                       => new EE_DB_Only_Int_Field(
194
-                    'EVT_ID',
195
-                    esc_html__('Foreign key to Event ID from Event Meta table', 'event_espresso'),
196
-                    false
197
-                ),
198
-                'EVT_display_desc'                => new EE_Boolean_Field(
199
-                    'EVT_display_desc',
200
-                    esc_html__('Display Description Flag', 'event_espresso'),
201
-                    false,
202
-                    true
203
-                ),
204
-                'EVT_display_ticket_selector'     => new EE_Boolean_Field(
205
-                    'EVT_display_ticket_selector',
206
-                    esc_html__('Display Ticket Selector Flag', 'event_espresso'),
207
-                    false,
208
-                    true
209
-                ),
210
-                'EVT_visible_on'                  => new EE_Datetime_Field(
211
-                    'EVT_visible_on',
212
-                    esc_html__('Event Visible Date', 'event_espresso'),
213
-                    true,
214
-                    EE_Datetime_Field::now
215
-                ),
216
-                'EVT_additional_limit'            => new EE_Integer_Field(
217
-                    'EVT_additional_limit',
218
-                    esc_html__('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
219
-                    true,
220
-                    self::$_default_additional_limit
221
-                ),
222
-                'EVT_default_registration_status' => new EE_Enum_Text_Field(
223
-                    'EVT_default_registration_status',
224
-                    esc_html__('Default Registration Status on this Event', 'event_espresso'),
225
-                    false,
226
-                    EEM_Event::$_default_reg_status,
227
-                    EEM_Registration::reg_status_array()
228
-                ),
229
-                'EVT_member_only'                 => new EE_Boolean_Field(
230
-                    'EVT_member_only',
231
-                    esc_html__('Member-Only Event Flag', 'event_espresso'),
232
-                    false,
233
-                    false
234
-                ),
235
-                'EVT_phone'                       => new EE_Plain_Text_Field(
236
-                    'EVT_phone',
237
-                    esc_html__('Event Phone Number', 'event_espresso'),
238
-                    false,
239
-                    ''
240
-                ),
241
-                'EVT_allow_overflow'              => new EE_Boolean_Field(
242
-                    'EVT_allow_overflow',
243
-                    esc_html__('Allow Overflow on Event', 'event_espresso'),
244
-                    false,
245
-                    false
246
-                ),
247
-                'EVT_timezone_string'             => new EE_Plain_Text_Field(
248
-                    'EVT_timezone_string',
249
-                    esc_html__('Timezone (name) for Event times', 'event_espresso'),
250
-                    false,
251
-                    ''
252
-                ),
253
-                'EVT_external_URL'                => new EE_Plain_Text_Field(
254
-                    'EVT_external_URL',
255
-                    esc_html__('URL of Event Page if hosted elsewhere', 'event_espresso'),
256
-                    true
257
-                ),
258
-                'EVT_donations'                   => new EE_Boolean_Field(
259
-                    'EVT_donations',
260
-                    esc_html__('Accept Donations?', 'event_espresso'),
261
-                    false,
262
-                    false
263
-                ),
264
-            ),
265
-        );
266
-        $this->_model_relations = array(
267
-            'Registration'           => new EE_Has_Many_Relation(),
268
-            'Datetime'               => new EE_Has_Many_Relation(),
269
-            'Question_Group'         => new EE_HABTM_Relation('Event_Question_Group'),
270
-            'Venue'                  => new EE_HABTM_Relation('Event_Venue'),
271
-            'Term_Relationship'      => new EE_Has_Many_Relation(),
272
-            'Term_Taxonomy'          => new EE_HABTM_Relation('Term_Relationship'),
273
-            'Message_Template_Group' => new EE_HABTM_Relation('Event_Message_Template'),
274
-            'Attendee'               => new EE_HABTM_Relation('Registration'),
275
-            'WP_User'                => new EE_Belongs_To_Relation(),
276
-        );
277
-        // this model is generally available for reading
278
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Public();
279
-        $this->model_chain_to_password = '';
280
-        parent::__construct($timezone);
281
-    }
282
-
283
-
284
-
285
-    /**
286
-     * @param string $default_reg_status
287
-     */
288
-    public static function set_default_reg_status($default_reg_status)
289
-    {
290
-        self::$_default_reg_status = $default_reg_status;
291
-        // if EEM_Event has already been instantiated,
292
-        // then we need to reset the `EVT_default_reg_status` field to use the new default.
293
-        if (self::$_instance instanceof EEM_Event) {
294
-            $default_reg_status = new EE_Enum_Text_Field(
295
-                'EVT_default_registration_status',
296
-                esc_html__('Default Registration Status on this Event', 'event_espresso'),
297
-                false,
298
-                $default_reg_status,
299
-                EEM_Registration::reg_status_array()
300
-            );
301
-            $default_reg_status->_construct_finalize(
302
-                'Event_Meta',
303
-                'EVT_default_registration_status',
304
-                'EEM_Event'
305
-            );
306
-            self::$_instance->_fields['Event_Meta']['EVT_default_registration_status'] = $default_reg_status;
307
-        }
308
-    }
309
-
310
-
311
-    /**
312
-     * Used to override the default for the additional limit field.
313
-     * @param $additional_limit
314
-     */
315
-    public static function set_default_additional_limit($additional_limit)
316
-    {
317
-        self::$_default_additional_limit = (int) $additional_limit;
318
-        if (self::$_instance instanceof EEM_Event) {
319
-            self::$_instance->_fields['Event_Meta']['EVT_additional_limit'] = new EE_Integer_Field(
320
-                'EVT_additional_limit',
321
-                __('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
322
-                true,
323
-                self::$_default_additional_limit
324
-            );
325
-            self::$_instance->_fields['Event_Meta']['EVT_additional_limit']->_construct_finalize(
326
-                'Event_Meta',
327
-                'EVT_additional_limit',
328
-                'EEM_Event'
329
-            );
330
-        }
331
-    }
332
-
333
-
334
-    /**
335
-     * Return what is currently set as the default additional limit for the event.
336
-     * @return int
337
-     */
338
-    public static function get_default_additional_limit()
339
-    {
340
-        return apply_filters('FHEE__EEM_Event__get_default_additional_limit', self::$_default_additional_limit);
341
-    }
342
-
343
-
344
-    /**
345
-     * get_question_groups
346
-     *
347
-     * @return array
348
-     * @throws \EE_Error
349
-     */
350
-    public function get_all_question_groups()
351
-    {
352
-        return EE_Registry::instance()->load_model('Question_Group')->get_all(
353
-            array(
354
-                array('QSG_deleted' => false),
355
-                'order_by' => array('QSG_order' => 'ASC'),
356
-            )
357
-        );
358
-    }
359
-
360
-
361
-
362
-    /**
363
-     * get_question_groups
364
-     *
365
-     * @param int $EVT_ID
366
-     * @return array|bool
367
-     * @throws \EE_Error
368
-     */
369
-    public function get_all_event_question_groups($EVT_ID = 0)
370
-    {
371
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
372
-            EE_Error::add_error(
373
-                esc_html__(
374
-                    'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
375
-                    'event_espresso'
376
-                ),
377
-                __FILE__,
378
-                __FUNCTION__,
379
-                __LINE__
380
-            );
381
-            return false;
382
-        }
383
-        return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
384
-            array(
385
-                array('EVT_ID' => $EVT_ID),
386
-            )
387
-        );
388
-    }
389
-
390
-
391
-
392
-    /**
393
-     * get_question_groups
394
-     *
395
-     * @param int     $EVT_ID
396
-     * @param boolean $for_primary_attendee
397
-     * @return array|bool
398
-     * @throws \EE_Error
399
-     */
400
-    public function get_event_question_groups($EVT_ID = 0, $for_primary_attendee = true)
401
-    {
402
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
403
-            EE_Error::add_error(
404
-                esc_html__(
405
-                    'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
406
-                    'event_espresso'
407
-                ),
408
-                __FILE__,
409
-                __FUNCTION__,
410
-                __LINE__
411
-            );
412
-            return false;
413
-        }
414
-        return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
415
-            array(
416
-                array(
417
-                    'EVT_ID'      => $EVT_ID,
418
-                    'EQG_primary' => $for_primary_attendee,
419
-                ),
420
-            )
421
-        );
422
-    }
423
-
424
-
425
-
426
-    /**
427
-     * get_question_groups
428
-     *
429
-     * @param int             $EVT_ID
430
-     * @param EE_Registration $registration
431
-     * @return array|bool
432
-     * @throws \EE_Error
433
-     */
434
-    public function get_question_groups_for_event($EVT_ID = 0, EE_Registration $registration)
435
-    {
436
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
437
-            EE_Error::add_error(
438
-                esc_html__(
439
-                    'An error occurred. No Question Groups could be retrieved because an Event ID was not received.',
440
-                    'event_espresso'
441
-                ),
442
-                __FILE__,
443
-                __FUNCTION__,
444
-                __LINE__
445
-            );
446
-            return false;
447
-        }
448
-        $where_params = array(
449
-            'Event_Question_Group.EVT_ID'      => $EVT_ID,
450
-            'Event_Question_Group.EQG_primary' => $registration->count() === 1 ? true : false,
451
-            'QSG_deleted'                      => false,
452
-        );
453
-        return EE_Registry::instance()->load_model('Question_Group')->get_all(
454
-            array(
455
-                $where_params,
456
-                'order_by' => array('QSG_order' => 'ASC'),
457
-            )
458
-        );
459
-    }
460
-
461
-
462
-
463
-    /**
464
-     * get_question_target_db_column
465
-     *
466
-     * @param string $QSG_IDs csv list of $QSG IDs
467
-     * @return array|bool
468
-     * @throws \EE_Error
469
-     */
470
-    public function get_questions_in_groups($QSG_IDs = '')
471
-    {
472
-        if (empty($QSG_IDs)) {
473
-            EE_Error::add_error(
474
-                esc_html__('An error occurred. No Question Group IDs were received.', 'event_espresso'),
475
-                __FILE__,
476
-                __FUNCTION__,
477
-                __LINE__
478
-            );
479
-            return false;
480
-        }
481
-        return EE_Registry::instance()->load_model('Question')->get_all(
482
-            array(
483
-                array(
484
-                    'Question_Group.QSG_ID' => array('IN', $QSG_IDs),
485
-                    'QST_deleted'           => false,
486
-                    'QST_admin_only'        => is_admin(),
487
-                ),
488
-                'order_by' => 'QST_order',
489
-            )
490
-        );
491
-    }
492
-
493
-
494
-
495
-    /**
496
-     * get_options_for_question
497
-     *
498
-     * @param string $QST_IDs csv list of $QST IDs
499
-     * @return array|bool
500
-     * @throws \EE_Error
501
-     */
502
-    public function get_options_for_question($QST_IDs)
503
-    {
504
-        if (empty($QST_IDs)) {
505
-            EE_Error::add_error(
506
-                esc_html__('An error occurred. No Question IDs were received.', 'event_espresso'),
507
-                __FILE__,
508
-                __FUNCTION__,
509
-                __LINE__
510
-            );
511
-            return false;
512
-        }
513
-        return EE_Registry::instance()->load_model('Question_Option')->get_all(
514
-            array(
515
-                array(
516
-                    'Question.QST_ID' => array('IN', $QST_IDs),
517
-                    'QSO_deleted'     => false,
518
-                ),
519
-                'order_by' => 'QSO_ID',
520
-            )
521
-        );
522
-    }
523
-
524
-
525
-
526
-
527
-
528
-
529
-
530
-    /**
531
-     * Gets all events that are published
532
-     * and have event start time earlier than now and an event end time later than now
533
-     *
534
-     * @param  array $query_params An array of query params to further filter on
535
-     *                             (note that status and DTT_EVT_start and DTT_EVT_end will be overridden)
536
-     * @param bool   $count        whether to return the count or not (default FALSE)
537
-     * @return EE_Event[]|int
538
-     * @throws \EE_Error
539
-     */
540
-    public function get_active_events($query_params, $count = false)
541
-    {
542
-        if (array_key_exists(0, $query_params)) {
543
-            $where_params = $query_params[0];
544
-            unset($query_params[0]);
545
-        } else {
546
-            $where_params = array();
547
-        }
548
-        // if we have count make sure we don't include group by
549
-        if ($count && isset($query_params['group_by'])) {
550
-            unset($query_params['group_by']);
551
-        }
552
-        // let's add specific query_params for active_events
553
-        // keep in mind this will override any sent status in the query AND any date queries.
554
-        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
555
-        // if already have where params for DTT_EVT_start or DTT_EVT_end then append these conditions
556
-        if (isset($where_params['Datetime.DTT_EVT_start'])) {
557
-            $where_params['Datetime.DTT_EVT_start******'] = array(
558
-                '<',
559
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
560
-            );
561
-        } else {
562
-            $where_params['Datetime.DTT_EVT_start'] = array(
563
-                '<',
564
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
565
-            );
566
-        }
567
-        if (isset($where_params['Datetime.DTT_EVT_end'])) {
568
-            $where_params['Datetime.DTT_EVT_end*****'] = array(
569
-                '>',
570
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
571
-            );
572
-        } else {
573
-            $where_params['Datetime.DTT_EVT_end'] = array(
574
-                '>',
575
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
576
-            );
577
-        }
578
-        $query_params[0] = $where_params;
579
-        // don't use $query_params with count()
580
-        // because we don't want to include additional query clauses like "GROUP BY"
581
-        return $count
582
-            ? $this->count(array($where_params), 'EVT_ID', true)
583
-            : $this->get_all($query_params);
584
-    }
585
-
586
-
587
-
588
-    /**
589
-     * get all events that are published and have an event start time later than now
590
-     *
591
-     * @param  array $query_params An array of query params to further filter on
592
-     *                             (Note that status and DTT_EVT_start will be overridden)
593
-     * @param bool   $count        whether to return the count or not (default FALSE)
594
-     * @return EE_Event[]|int
595
-     * @throws \EE_Error
596
-     */
597
-    public function get_upcoming_events($query_params, $count = false)
598
-    {
599
-        if (array_key_exists(0, $query_params)) {
600
-            $where_params = $query_params[0];
601
-            unset($query_params[0]);
602
-        } else {
603
-            $where_params = array();
604
-        }
605
-        // if we have count make sure we don't include group by
606
-        if ($count && isset($query_params['group_by'])) {
607
-            unset($query_params['group_by']);
608
-        }
609
-        // let's add specific query_params for active_events
610
-        // keep in mind this will override any sent status in the query AND any date queries.
611
-        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
612
-        // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
613
-        if (isset($where_params['Datetime.DTT_EVT_start'])) {
614
-            $where_params['Datetime.DTT_EVT_start*****'] = array(
615
-                '>',
616
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
617
-            );
618
-        } else {
619
-            $where_params['Datetime.DTT_EVT_start'] = array(
620
-                '>',
621
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
622
-            );
623
-        }
624
-        $query_params[0] = $where_params;
625
-        // don't use $query_params with count()
626
-        // because we don't want to include additional query clauses like "GROUP BY"
627
-        return $count
628
-            ? $this->count(array($where_params), 'EVT_ID', true)
629
-            : $this->get_all($query_params);
630
-    }
631
-
632
-
633
-
634
-    /**
635
-     * Gets all events that are published
636
-     * and have an event end time later than now
637
-     *
638
-     * @param  array $query_params An array of query params to further filter on
639
-     *                             (note that status and DTT_EVT_end will be overridden)
640
-     * @param bool   $count        whether to return the count or not (default FALSE)
641
-     * @return EE_Event[]|int
642
-     * @throws \EE_Error
643
-     */
644
-    public function get_active_and_upcoming_events($query_params, $count = false)
645
-    {
646
-        if (array_key_exists(0, $query_params)) {
647
-            $where_params = $query_params[0];
648
-            unset($query_params[0]);
649
-        } else {
650
-            $where_params = array();
651
-        }
652
-        // if we have count make sure we don't include group by
653
-        if ($count && isset($query_params['group_by'])) {
654
-            unset($query_params['group_by']);
655
-        }
656
-        // let's add specific query_params for active_events
657
-        // keep in mind this will override any sent status in the query AND any date queries.
658
-        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
659
-        // add where params for DTT_EVT_end
660
-        if (isset($where_params['Datetime.DTT_EVT_end'])) {
661
-            $where_params['Datetime.DTT_EVT_end*****'] = array(
662
-                '>',
663
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
664
-            );
665
-        } else {
666
-            $where_params['Datetime.DTT_EVT_end'] = array(
667
-                '>',
668
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
669
-            );
670
-        }
671
-        $query_params[0] = $where_params;
672
-        // don't use $query_params with count()
673
-        // because we don't want to include additional query clauses like "GROUP BY"
674
-        return $count
675
-            ? $this->count(array($where_params), 'EVT_ID', true)
676
-            : $this->get_all($query_params);
677
-    }
678
-
679
-
680
-
681
-    /**
682
-     * This only returns events that are expired.
683
-     * They may still be published but all their datetimes have expired.
684
-     *
685
-     * @param  array $query_params An array of query params to further filter on
686
-     *                             (note that status and DTT_EVT_end will be overridden)
687
-     * @param bool   $count        whether to return the count or not (default FALSE)
688
-     * @return EE_Event[]|int
689
-     * @throws \EE_Error
690
-     */
691
-    public function get_expired_events($query_params, $count = false)
692
-    {
693
-        $where_params = isset($query_params[0]) ? $query_params[0] : array();
694
-        // if we have count make sure we don't include group by
695
-        if ($count && isset($query_params['group_by'])) {
696
-            unset($query_params['group_by']);
697
-        }
698
-        // let's add specific query_params for active_events
699
-        // keep in mind this will override any sent status in the query AND any date queries.
700
-        if (isset($where_params['status'])) {
701
-            unset($where_params['status']);
702
-        }
703
-        $exclude_query = $query_params;
704
-        if (isset($exclude_query[0])) {
705
-            unset($exclude_query[0]);
706
-        }
707
-        $exclude_query[0] = array(
708
-            'Datetime.DTT_EVT_end' => array(
709
-                '>',
710
-                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
711
-            ),
712
-        );
713
-        // first get all events that have datetimes where its not expired.
714
-        $event_ids = $this->_get_all_wpdb_results($exclude_query, OBJECT_K, 'Event_CPT.ID');
715
-        $event_ids = array_keys($event_ids);
716
-        // if we have any additional query_params, let's add them to the 'AND' condition
717
-        $and_condition = array(
718
-            'Datetime.DTT_EVT_end' => array('<', EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end')),
719
-            'EVT_ID'               => array('NOT IN', $event_ids),
720
-        );
721
-        if (isset($where_params['OR'])) {
722
-            $and_condition['OR'] = $where_params['OR'];
723
-            unset($where_params['OR']);
724
-        }
725
-        if (isset($where_params['Datetime.DTT_EVT_end'])) {
726
-            $and_condition['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
727
-            unset($where_params['Datetime.DTT_EVT_end']);
728
-        }
729
-        if (isset($where_params['Datetime.DTT_EVT_start'])) {
730
-            $and_condition['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
731
-            unset($where_params['Datetime.DTT_EVT_start']);
732
-        }
733
-        // merge remaining $where params with the and conditions.
734
-        $where_params['AND'] = array_merge($and_condition, $where_params);
735
-        $query_params[0] = $where_params;
736
-        // don't use $query_params with count()
737
-        // because we don't want to include additional query clauses like "GROUP BY"
738
-        return $count
739
-            ? $this->count(array($where_params), 'EVT_ID', true)
740
-            : $this->get_all($query_params);
741
-    }
742
-
743
-
744
-
745
-    /**
746
-     * This basically just returns the events that do not have the publish status.
747
-     *
748
-     * @param  array   $query_params An array of query params to further filter on
749
-     *                               (note that status will be overwritten)
750
-     * @param  boolean $count        whether to return the count or not (default FALSE)
751
-     * @return EE_Event[]|int
752
-     * @throws \EE_Error
753
-     */
754
-    public function get_inactive_events($query_params, $count = false)
755
-    {
756
-        $where_params = isset($query_params[0]) ? $query_params[0] : array();
757
-        // let's add in specific query_params for inactive events.
758
-        if (isset($where_params['status'])) {
759
-            unset($where_params['status']);
760
-        }
761
-        // if we have count make sure we don't include group by
762
-        if ($count && isset($query_params['group_by'])) {
763
-            unset($query_params['group_by']);
764
-        }
765
-        // if we have any additional query_params, let's add them to the 'AND' condition
766
-        $where_params['AND']['status'] = array('!=', 'publish');
767
-        if (isset($where_params['OR'])) {
768
-            $where_params['AND']['OR'] = $where_params['OR'];
769
-            unset($where_params['OR']);
770
-        }
771
-        if (isset($where_params['Datetime.DTT_EVT_end'])) {
772
-            $where_params['AND']['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
773
-            unset($where_params['Datetime.DTT_EVT_end']);
774
-        }
775
-        if (isset($where_params['Datetime.DTT_EVT_start'])) {
776
-            $where_params['AND']['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
777
-            unset($where_params['Datetime.DTT_EVT_start']);
778
-        }
779
-        $query_params[0] = $where_params;
780
-        // don't use $query_params with count()
781
-        // because we don't want to include additional query clauses like "GROUP BY"
782
-        return $count
783
-            ? $this->count(array($where_params), 'EVT_ID', true)
784
-            : $this->get_all($query_params);
785
-    }
786
-
787
-
788
-
789
-    /**
790
-     * This is just injecting into the parent add_relationship_to so we do special handling on price relationships
791
-     * because we don't want to override any existing global default prices but instead insert NEW prices that get
792
-     * attached to the event. See parent for param descriptions
793
-     *
794
-     * @param        $id_or_obj
795
-     * @param        $other_model_id_or_obj
796
-     * @param string $relationName
797
-     * @param array  $where_query
798
-     * @return EE_Base_Class
799
-     * @throws EE_Error
800
-     */
801
-    public function add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query = array())
802
-    {
803
-        if ($relationName === 'Price') {
804
-            // let's get the PRC object for the given ID to make sure that we aren't dealing with a default
805
-            $prc_chk = $this->get_related_model_obj($relationName)->ensure_is_obj($other_model_id_or_obj);
806
-            // if EVT_ID = 0, then this is a default
807
-            if ((int) $prc_chk->get('EVT_ID') === 0) {
808
-                // let's set the prc_id as 0 so we force an insert on the add_relation_to carried out by relation
809
-                $prc_chk->set('PRC_ID', 0);
810
-            }
811
-            // run parent
812
-            return parent::add_relationship_to($id_or_obj, $prc_chk, $relationName, $where_query);
813
-        }
814
-        // otherwise carry on as normal
815
-        return parent::add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query);
816
-    }
817
-
818
-
819
-
820
-    /******************** DEPRECATED METHODS ********************/
821
-
822
-
823
-
824
-    /**
825
-     * _get_question_target_db_column
826
-     *
827
-     * @deprecated as of 4.8.32.rc.001. Instead consider using
828
-     *             EE_Registration_Custom_Questions_Form located in
829
-     *             admin_pages/registrations/form_sections/EE_Registration_Custom_Questions_Form.form.php
830
-     * @access     public
831
-     * @param    EE_Registration $registration (so existing answers for registration are included)
832
-     * @param    int             $EVT_ID       so all question groups are included for event (not just answers from
833
-     *                                         registration).
834
-     * @throws EE_Error
835
-     * @return    array
836
-     */
837
-    public function assemble_array_of_groups_questions_and_options(EE_Registration $registration, $EVT_ID = 0)
838
-    {
839
-        if (empty($EVT_ID)) {
840
-            throw new EE_Error(__(
841
-                'An error occurred. No EVT_ID is included.  Needed to know which question groups to retrieve.',
842
-                'event_espresso'
843
-            ));
844
-        }
845
-        $questions = array();
846
-        // get all question groups for event
847
-        $qgs = $this->get_question_groups_for_event($EVT_ID, $registration);
848
-        if (! empty($qgs)) {
849
-            foreach ($qgs as $qg) {
850
-                $qsts = $qg->questions();
851
-                $questions[ $qg->ID() ] = $qg->model_field_array();
852
-                $questions[ $qg->ID() ]['QSG_questions'] = array();
853
-                foreach ($qsts as $qst) {
854
-                    if ($qst->is_system_question()) {
855
-                        continue;
856
-                    }
857
-                    $answer = EEM_Answer::instance()->get_one(array(
858
-                        array(
859
-                            'QST_ID' => $qst->ID(),
860
-                            'REG_ID' => $registration->ID(),
861
-                        ),
862
-                    ));
863
-                    $answer = $answer instanceof EE_Answer ? $answer : EEM_Answer::instance()->create_default_object();
864
-                    $qst_name = $qstn_id = $qst->ID();
865
-                    $ans_id = $answer->ID();
866
-                    $qst_name = ! empty($ans_id) ? '[' . $qst_name . '][' . $ans_id . ']' : '[' . $qst_name . ']';
867
-                    $input_name = '';
868
-                    $input_id = sanitize_key($qst->display_text());
869
-                    $input_class = '';
870
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ] = $qst->model_field_array();
871
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_name'] = 'qstn'
872
-                                                                                           . $input_name
873
-                                                                                           . $qst_name;
874
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_id'] = $input_id . '-' . $qstn_id;
875
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_class'] = $input_class;
876
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'] = array();
877
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['qst_obj'] = $qst;
878
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['ans_obj'] = $answer;
879
-                    // leave responses as-is, don't convert stuff into html entities please!
880
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['htmlentities'] = false;
881
-                    if ($qst->type() == 'RADIO_BTN' || $qst->type() == 'CHECKBOX' || $qst->type() == 'DROPDOWN') {
882
-                        $QSOs = $qst->options(true, $answer->value());
883
-                        if (is_array($QSOs)) {
884
-                            foreach ($QSOs as $QSO_ID => $QSO) {
885
-                                $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'][ $QSO_ID ] = $QSO->model_field_array();
886
-                            }
887
-                        }
888
-                    }
889
-                }
890
-            }
891
-        }
892
-        return $questions;
893
-    }
894
-
895
-
896
-    /**
897
-     * @param mixed $cols_n_values either an array of where each key is the name of a field, and the value is its value
898
-     *                             or an stdClass where each property is the name of a column,
899
-     * @return EE_Base_Class
900
-     * @throws \EE_Error
901
-     */
902
-    public function instantiate_class_from_array_or_object($cols_n_values)
903
-    {
904
-        $classInstance = parent::instantiate_class_from_array_or_object($cols_n_values);
905
-        if ($classInstance instanceof EE_Event) {
906
-            // events have their timezone defined in the DB, so use it immediately
907
-            $this->set_timezone($classInstance->get_timezone());
908
-        }
909
-        return $classInstance;
910
-    }
16
+	/**
17
+	 * constant used by status(), indicating that no more tickets can be purchased for any of the datetimes for the
18
+	 * event
19
+	 */
20
+	const sold_out = 'sold_out';
21
+
22
+	/**
23
+	 * constant used by status(), indicating that upcoming event dates have been postponed (may be pushed to a later
24
+	 * date)
25
+	 */
26
+	const postponed = 'postponed';
27
+
28
+	/**
29
+	 * constant used by status(), indicating that the event will no longer occur
30
+	 */
31
+	const cancelled = 'cancelled';
32
+
33
+
34
+	/**
35
+	 * @var string
36
+	 */
37
+	protected static $_default_reg_status;
38
+
39
+
40
+	/**
41
+	 * This is the default for the additional limit field.
42
+	 * @var int
43
+	 */
44
+	protected static $_default_additional_limit = 10;
45
+
46
+
47
+	/**
48
+	 * private instance of the Event object
49
+	 *
50
+	 * @var EEM_Event
51
+	 */
52
+	protected static $_instance;
53
+
54
+
55
+
56
+
57
+	/**
58
+	 * Adds a relationship to Term_Taxonomy for each CPT_Base
59
+	 *
60
+	 * @param string $timezone
61
+	 * @throws \EE_Error
62
+	 */
63
+	protected function __construct($timezone = null)
64
+	{
65
+		EE_Registry::instance()->load_model('Registration');
66
+		$this->singular_item = esc_html__('Event', 'event_espresso');
67
+		$this->plural_item = esc_html__('Events', 'event_espresso');
68
+		// to remove Cancelled events from the frontend, copy the following filter to your functions.php file
69
+		// add_filter( 'AFEE__EEM_Event__construct___custom_stati__cancelled__Public', '__return_false' );
70
+		// to remove Postponed events from the frontend, copy the following filter to your functions.php file
71
+		// add_filter( 'AFEE__EEM_Event__construct___custom_stati__postponed__Public', '__return_false' );
72
+		// to remove Sold Out events from the frontend, copy the following filter to your functions.php file
73
+		//  add_filter( 'AFEE__EEM_Event__construct___custom_stati__sold_out__Public', '__return_false' );
74
+		$this->_custom_stati = apply_filters(
75
+			'AFEE__EEM_Event__construct___custom_stati',
76
+			array(
77
+				EEM_Event::cancelled => array(
78
+					'label'  => esc_html__('Cancelled', 'event_espresso'),
79
+					'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__cancelled__Public', true),
80
+				),
81
+				EEM_Event::postponed => array(
82
+					'label'  => esc_html__('Postponed', 'event_espresso'),
83
+					'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__postponed__Public', true),
84
+				),
85
+				EEM_Event::sold_out  => array(
86
+					'label'  => esc_html__('Sold Out', 'event_espresso'),
87
+					'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__sold_out__Public', true),
88
+				),
89
+			)
90
+		);
91
+		self::$_default_reg_status = empty(self::$_default_reg_status) ? EEM_Registration::status_id_pending_payment
92
+			: self::$_default_reg_status;
93
+		$this->_tables = array(
94
+			'Event_CPT'  => new EE_Primary_Table('posts', 'ID'),
95
+			'Event_Meta' => new EE_Secondary_Table('esp_event_meta', 'EVTM_ID', 'EVT_ID'),
96
+		);
97
+		$this->_fields = array(
98
+			'Event_CPT'  => array(
99
+				'EVT_ID'         => new EE_Primary_Key_Int_Field(
100
+					'ID',
101
+					esc_html__('Post ID for Event', 'event_espresso')
102
+				),
103
+				'EVT_name'       => new EE_Plain_Text_Field(
104
+					'post_title',
105
+					esc_html__('Event Name', 'event_espresso'),
106
+					false,
107
+					''
108
+				),
109
+				'EVT_desc'       => new EE_Post_Content_Field(
110
+					'post_content',
111
+					esc_html__('Event Description', 'event_espresso'),
112
+					false,
113
+					''
114
+				),
115
+				'EVT_slug'       => new EE_Slug_Field(
116
+					'post_name',
117
+					esc_html__('Event Slug', 'event_espresso'),
118
+					false,
119
+					''
120
+				),
121
+				'EVT_created'    => new EE_Datetime_Field(
122
+					'post_date',
123
+					esc_html__('Date/Time Event Created', 'event_espresso'),
124
+					false,
125
+					EE_Datetime_Field::now
126
+				),
127
+				'EVT_short_desc' => new EE_Simple_HTML_Field(
128
+					'post_excerpt',
129
+					esc_html__('Event Short Description', 'event_espresso'),
130
+					false,
131
+					''
132
+				),
133
+				'EVT_modified'   => new EE_Datetime_Field(
134
+					'post_modified',
135
+					esc_html__('Date/Time Event Modified', 'event_espresso'),
136
+					false,
137
+					EE_Datetime_Field::now
138
+				),
139
+				'EVT_wp_user'    => new EE_WP_User_Field(
140
+					'post_author',
141
+					esc_html__('Event Creator ID', 'event_espresso'),
142
+					false
143
+				),
144
+				'parent'         => new EE_Integer_Field(
145
+					'post_parent',
146
+					esc_html__('Event Parent ID', 'event_espresso'),
147
+					false,
148
+					0
149
+				),
150
+				'EVT_order'      => new EE_Integer_Field(
151
+					'menu_order',
152
+					esc_html__('Event Menu Order', 'event_espresso'),
153
+					false,
154
+					1
155
+				),
156
+				'post_type'      => new EE_WP_Post_Type_Field('espresso_events'),
157
+				// EE_Plain_Text_Field( 'post_type', esc_html__( 'Event Post Type', 'event_espresso' ), FALSE, 'espresso_events' ),
158
+				'status'         => new EE_WP_Post_Status_Field(
159
+					'post_status',
160
+					esc_html__('Event Status', 'event_espresso'),
161
+					false,
162
+					'draft',
163
+					$this->_custom_stati
164
+				),
165
+				'password' => new EE_Password_Field(
166
+					'post_password',
167
+					__('Password', 'event_espresso'),
168
+					false,
169
+					'',
170
+					array(
171
+						'EVT_desc',
172
+						'EVT_short_desc',
173
+						'EVT_display_desc',
174
+						'EVT_display_ticket_selector',
175
+						'EVT_visible_on',
176
+						'EVT_additional_limit',
177
+						'EVT_default_registration_status',
178
+						'EVT_member_only',
179
+						'EVT_phone',
180
+						'EVT_allow_overflow',
181
+						'EVT_timezone_string',
182
+						'EVT_external_URL',
183
+						'EVT_donations'
184
+					)
185
+				)
186
+			),
187
+			'Event_Meta' => array(
188
+				'EVTM_ID'                         => new EE_DB_Only_Float_Field(
189
+					'EVTM_ID',
190
+					esc_html__('Event Meta Row ID', 'event_espresso'),
191
+					false
192
+				),
193
+				'EVT_ID_fk'                       => new EE_DB_Only_Int_Field(
194
+					'EVT_ID',
195
+					esc_html__('Foreign key to Event ID from Event Meta table', 'event_espresso'),
196
+					false
197
+				),
198
+				'EVT_display_desc'                => new EE_Boolean_Field(
199
+					'EVT_display_desc',
200
+					esc_html__('Display Description Flag', 'event_espresso'),
201
+					false,
202
+					true
203
+				),
204
+				'EVT_display_ticket_selector'     => new EE_Boolean_Field(
205
+					'EVT_display_ticket_selector',
206
+					esc_html__('Display Ticket Selector Flag', 'event_espresso'),
207
+					false,
208
+					true
209
+				),
210
+				'EVT_visible_on'                  => new EE_Datetime_Field(
211
+					'EVT_visible_on',
212
+					esc_html__('Event Visible Date', 'event_espresso'),
213
+					true,
214
+					EE_Datetime_Field::now
215
+				),
216
+				'EVT_additional_limit'            => new EE_Integer_Field(
217
+					'EVT_additional_limit',
218
+					esc_html__('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
219
+					true,
220
+					self::$_default_additional_limit
221
+				),
222
+				'EVT_default_registration_status' => new EE_Enum_Text_Field(
223
+					'EVT_default_registration_status',
224
+					esc_html__('Default Registration Status on this Event', 'event_espresso'),
225
+					false,
226
+					EEM_Event::$_default_reg_status,
227
+					EEM_Registration::reg_status_array()
228
+				),
229
+				'EVT_member_only'                 => new EE_Boolean_Field(
230
+					'EVT_member_only',
231
+					esc_html__('Member-Only Event Flag', 'event_espresso'),
232
+					false,
233
+					false
234
+				),
235
+				'EVT_phone'                       => new EE_Plain_Text_Field(
236
+					'EVT_phone',
237
+					esc_html__('Event Phone Number', 'event_espresso'),
238
+					false,
239
+					''
240
+				),
241
+				'EVT_allow_overflow'              => new EE_Boolean_Field(
242
+					'EVT_allow_overflow',
243
+					esc_html__('Allow Overflow on Event', 'event_espresso'),
244
+					false,
245
+					false
246
+				),
247
+				'EVT_timezone_string'             => new EE_Plain_Text_Field(
248
+					'EVT_timezone_string',
249
+					esc_html__('Timezone (name) for Event times', 'event_espresso'),
250
+					false,
251
+					''
252
+				),
253
+				'EVT_external_URL'                => new EE_Plain_Text_Field(
254
+					'EVT_external_URL',
255
+					esc_html__('URL of Event Page if hosted elsewhere', 'event_espresso'),
256
+					true
257
+				),
258
+				'EVT_donations'                   => new EE_Boolean_Field(
259
+					'EVT_donations',
260
+					esc_html__('Accept Donations?', 'event_espresso'),
261
+					false,
262
+					false
263
+				),
264
+			),
265
+		);
266
+		$this->_model_relations = array(
267
+			'Registration'           => new EE_Has_Many_Relation(),
268
+			'Datetime'               => new EE_Has_Many_Relation(),
269
+			'Question_Group'         => new EE_HABTM_Relation('Event_Question_Group'),
270
+			'Venue'                  => new EE_HABTM_Relation('Event_Venue'),
271
+			'Term_Relationship'      => new EE_Has_Many_Relation(),
272
+			'Term_Taxonomy'          => new EE_HABTM_Relation('Term_Relationship'),
273
+			'Message_Template_Group' => new EE_HABTM_Relation('Event_Message_Template'),
274
+			'Attendee'               => new EE_HABTM_Relation('Registration'),
275
+			'WP_User'                => new EE_Belongs_To_Relation(),
276
+		);
277
+		// this model is generally available for reading
278
+		$this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Public();
279
+		$this->model_chain_to_password = '';
280
+		parent::__construct($timezone);
281
+	}
282
+
283
+
284
+
285
+	/**
286
+	 * @param string $default_reg_status
287
+	 */
288
+	public static function set_default_reg_status($default_reg_status)
289
+	{
290
+		self::$_default_reg_status = $default_reg_status;
291
+		// if EEM_Event has already been instantiated,
292
+		// then we need to reset the `EVT_default_reg_status` field to use the new default.
293
+		if (self::$_instance instanceof EEM_Event) {
294
+			$default_reg_status = new EE_Enum_Text_Field(
295
+				'EVT_default_registration_status',
296
+				esc_html__('Default Registration Status on this Event', 'event_espresso'),
297
+				false,
298
+				$default_reg_status,
299
+				EEM_Registration::reg_status_array()
300
+			);
301
+			$default_reg_status->_construct_finalize(
302
+				'Event_Meta',
303
+				'EVT_default_registration_status',
304
+				'EEM_Event'
305
+			);
306
+			self::$_instance->_fields['Event_Meta']['EVT_default_registration_status'] = $default_reg_status;
307
+		}
308
+	}
309
+
310
+
311
+	/**
312
+	 * Used to override the default for the additional limit field.
313
+	 * @param $additional_limit
314
+	 */
315
+	public static function set_default_additional_limit($additional_limit)
316
+	{
317
+		self::$_default_additional_limit = (int) $additional_limit;
318
+		if (self::$_instance instanceof EEM_Event) {
319
+			self::$_instance->_fields['Event_Meta']['EVT_additional_limit'] = new EE_Integer_Field(
320
+				'EVT_additional_limit',
321
+				__('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
322
+				true,
323
+				self::$_default_additional_limit
324
+			);
325
+			self::$_instance->_fields['Event_Meta']['EVT_additional_limit']->_construct_finalize(
326
+				'Event_Meta',
327
+				'EVT_additional_limit',
328
+				'EEM_Event'
329
+			);
330
+		}
331
+	}
332
+
333
+
334
+	/**
335
+	 * Return what is currently set as the default additional limit for the event.
336
+	 * @return int
337
+	 */
338
+	public static function get_default_additional_limit()
339
+	{
340
+		return apply_filters('FHEE__EEM_Event__get_default_additional_limit', self::$_default_additional_limit);
341
+	}
342
+
343
+
344
+	/**
345
+	 * get_question_groups
346
+	 *
347
+	 * @return array
348
+	 * @throws \EE_Error
349
+	 */
350
+	public function get_all_question_groups()
351
+	{
352
+		return EE_Registry::instance()->load_model('Question_Group')->get_all(
353
+			array(
354
+				array('QSG_deleted' => false),
355
+				'order_by' => array('QSG_order' => 'ASC'),
356
+			)
357
+		);
358
+	}
359
+
360
+
361
+
362
+	/**
363
+	 * get_question_groups
364
+	 *
365
+	 * @param int $EVT_ID
366
+	 * @return array|bool
367
+	 * @throws \EE_Error
368
+	 */
369
+	public function get_all_event_question_groups($EVT_ID = 0)
370
+	{
371
+		if (! isset($EVT_ID) || ! absint($EVT_ID)) {
372
+			EE_Error::add_error(
373
+				esc_html__(
374
+					'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
375
+					'event_espresso'
376
+				),
377
+				__FILE__,
378
+				__FUNCTION__,
379
+				__LINE__
380
+			);
381
+			return false;
382
+		}
383
+		return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
384
+			array(
385
+				array('EVT_ID' => $EVT_ID),
386
+			)
387
+		);
388
+	}
389
+
390
+
391
+
392
+	/**
393
+	 * get_question_groups
394
+	 *
395
+	 * @param int     $EVT_ID
396
+	 * @param boolean $for_primary_attendee
397
+	 * @return array|bool
398
+	 * @throws \EE_Error
399
+	 */
400
+	public function get_event_question_groups($EVT_ID = 0, $for_primary_attendee = true)
401
+	{
402
+		if (! isset($EVT_ID) || ! absint($EVT_ID)) {
403
+			EE_Error::add_error(
404
+				esc_html__(
405
+					'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
406
+					'event_espresso'
407
+				),
408
+				__FILE__,
409
+				__FUNCTION__,
410
+				__LINE__
411
+			);
412
+			return false;
413
+		}
414
+		return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
415
+			array(
416
+				array(
417
+					'EVT_ID'      => $EVT_ID,
418
+					'EQG_primary' => $for_primary_attendee,
419
+				),
420
+			)
421
+		);
422
+	}
423
+
424
+
425
+
426
+	/**
427
+	 * get_question_groups
428
+	 *
429
+	 * @param int             $EVT_ID
430
+	 * @param EE_Registration $registration
431
+	 * @return array|bool
432
+	 * @throws \EE_Error
433
+	 */
434
+	public function get_question_groups_for_event($EVT_ID = 0, EE_Registration $registration)
435
+	{
436
+		if (! isset($EVT_ID) || ! absint($EVT_ID)) {
437
+			EE_Error::add_error(
438
+				esc_html__(
439
+					'An error occurred. No Question Groups could be retrieved because an Event ID was not received.',
440
+					'event_espresso'
441
+				),
442
+				__FILE__,
443
+				__FUNCTION__,
444
+				__LINE__
445
+			);
446
+			return false;
447
+		}
448
+		$where_params = array(
449
+			'Event_Question_Group.EVT_ID'      => $EVT_ID,
450
+			'Event_Question_Group.EQG_primary' => $registration->count() === 1 ? true : false,
451
+			'QSG_deleted'                      => false,
452
+		);
453
+		return EE_Registry::instance()->load_model('Question_Group')->get_all(
454
+			array(
455
+				$where_params,
456
+				'order_by' => array('QSG_order' => 'ASC'),
457
+			)
458
+		);
459
+	}
460
+
461
+
462
+
463
+	/**
464
+	 * get_question_target_db_column
465
+	 *
466
+	 * @param string $QSG_IDs csv list of $QSG IDs
467
+	 * @return array|bool
468
+	 * @throws \EE_Error
469
+	 */
470
+	public function get_questions_in_groups($QSG_IDs = '')
471
+	{
472
+		if (empty($QSG_IDs)) {
473
+			EE_Error::add_error(
474
+				esc_html__('An error occurred. No Question Group IDs were received.', 'event_espresso'),
475
+				__FILE__,
476
+				__FUNCTION__,
477
+				__LINE__
478
+			);
479
+			return false;
480
+		}
481
+		return EE_Registry::instance()->load_model('Question')->get_all(
482
+			array(
483
+				array(
484
+					'Question_Group.QSG_ID' => array('IN', $QSG_IDs),
485
+					'QST_deleted'           => false,
486
+					'QST_admin_only'        => is_admin(),
487
+				),
488
+				'order_by' => 'QST_order',
489
+			)
490
+		);
491
+	}
492
+
493
+
494
+
495
+	/**
496
+	 * get_options_for_question
497
+	 *
498
+	 * @param string $QST_IDs csv list of $QST IDs
499
+	 * @return array|bool
500
+	 * @throws \EE_Error
501
+	 */
502
+	public function get_options_for_question($QST_IDs)
503
+	{
504
+		if (empty($QST_IDs)) {
505
+			EE_Error::add_error(
506
+				esc_html__('An error occurred. No Question IDs were received.', 'event_espresso'),
507
+				__FILE__,
508
+				__FUNCTION__,
509
+				__LINE__
510
+			);
511
+			return false;
512
+		}
513
+		return EE_Registry::instance()->load_model('Question_Option')->get_all(
514
+			array(
515
+				array(
516
+					'Question.QST_ID' => array('IN', $QST_IDs),
517
+					'QSO_deleted'     => false,
518
+				),
519
+				'order_by' => 'QSO_ID',
520
+			)
521
+		);
522
+	}
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+	/**
531
+	 * Gets all events that are published
532
+	 * and have event start time earlier than now and an event end time later than now
533
+	 *
534
+	 * @param  array $query_params An array of query params to further filter on
535
+	 *                             (note that status and DTT_EVT_start and DTT_EVT_end will be overridden)
536
+	 * @param bool   $count        whether to return the count or not (default FALSE)
537
+	 * @return EE_Event[]|int
538
+	 * @throws \EE_Error
539
+	 */
540
+	public function get_active_events($query_params, $count = false)
541
+	{
542
+		if (array_key_exists(0, $query_params)) {
543
+			$where_params = $query_params[0];
544
+			unset($query_params[0]);
545
+		} else {
546
+			$where_params = array();
547
+		}
548
+		// if we have count make sure we don't include group by
549
+		if ($count && isset($query_params['group_by'])) {
550
+			unset($query_params['group_by']);
551
+		}
552
+		// let's add specific query_params for active_events
553
+		// keep in mind this will override any sent status in the query AND any date queries.
554
+		$where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
555
+		// if already have where params for DTT_EVT_start or DTT_EVT_end then append these conditions
556
+		if (isset($where_params['Datetime.DTT_EVT_start'])) {
557
+			$where_params['Datetime.DTT_EVT_start******'] = array(
558
+				'<',
559
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
560
+			);
561
+		} else {
562
+			$where_params['Datetime.DTT_EVT_start'] = array(
563
+				'<',
564
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
565
+			);
566
+		}
567
+		if (isset($where_params['Datetime.DTT_EVT_end'])) {
568
+			$where_params['Datetime.DTT_EVT_end*****'] = array(
569
+				'>',
570
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
571
+			);
572
+		} else {
573
+			$where_params['Datetime.DTT_EVT_end'] = array(
574
+				'>',
575
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
576
+			);
577
+		}
578
+		$query_params[0] = $where_params;
579
+		// don't use $query_params with count()
580
+		// because we don't want to include additional query clauses like "GROUP BY"
581
+		return $count
582
+			? $this->count(array($where_params), 'EVT_ID', true)
583
+			: $this->get_all($query_params);
584
+	}
585
+
586
+
587
+
588
+	/**
589
+	 * get all events that are published and have an event start time later than now
590
+	 *
591
+	 * @param  array $query_params An array of query params to further filter on
592
+	 *                             (Note that status and DTT_EVT_start will be overridden)
593
+	 * @param bool   $count        whether to return the count or not (default FALSE)
594
+	 * @return EE_Event[]|int
595
+	 * @throws \EE_Error
596
+	 */
597
+	public function get_upcoming_events($query_params, $count = false)
598
+	{
599
+		if (array_key_exists(0, $query_params)) {
600
+			$where_params = $query_params[0];
601
+			unset($query_params[0]);
602
+		} else {
603
+			$where_params = array();
604
+		}
605
+		// if we have count make sure we don't include group by
606
+		if ($count && isset($query_params['group_by'])) {
607
+			unset($query_params['group_by']);
608
+		}
609
+		// let's add specific query_params for active_events
610
+		// keep in mind this will override any sent status in the query AND any date queries.
611
+		$where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
612
+		// if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
613
+		if (isset($where_params['Datetime.DTT_EVT_start'])) {
614
+			$where_params['Datetime.DTT_EVT_start*****'] = array(
615
+				'>',
616
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
617
+			);
618
+		} else {
619
+			$where_params['Datetime.DTT_EVT_start'] = array(
620
+				'>',
621
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
622
+			);
623
+		}
624
+		$query_params[0] = $where_params;
625
+		// don't use $query_params with count()
626
+		// because we don't want to include additional query clauses like "GROUP BY"
627
+		return $count
628
+			? $this->count(array($where_params), 'EVT_ID', true)
629
+			: $this->get_all($query_params);
630
+	}
631
+
632
+
633
+
634
+	/**
635
+	 * Gets all events that are published
636
+	 * and have an event end time later than now
637
+	 *
638
+	 * @param  array $query_params An array of query params to further filter on
639
+	 *                             (note that status and DTT_EVT_end will be overridden)
640
+	 * @param bool   $count        whether to return the count or not (default FALSE)
641
+	 * @return EE_Event[]|int
642
+	 * @throws \EE_Error
643
+	 */
644
+	public function get_active_and_upcoming_events($query_params, $count = false)
645
+	{
646
+		if (array_key_exists(0, $query_params)) {
647
+			$where_params = $query_params[0];
648
+			unset($query_params[0]);
649
+		} else {
650
+			$where_params = array();
651
+		}
652
+		// if we have count make sure we don't include group by
653
+		if ($count && isset($query_params['group_by'])) {
654
+			unset($query_params['group_by']);
655
+		}
656
+		// let's add specific query_params for active_events
657
+		// keep in mind this will override any sent status in the query AND any date queries.
658
+		$where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
659
+		// add where params for DTT_EVT_end
660
+		if (isset($where_params['Datetime.DTT_EVT_end'])) {
661
+			$where_params['Datetime.DTT_EVT_end*****'] = array(
662
+				'>',
663
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
664
+			);
665
+		} else {
666
+			$where_params['Datetime.DTT_EVT_end'] = array(
667
+				'>',
668
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
669
+			);
670
+		}
671
+		$query_params[0] = $where_params;
672
+		// don't use $query_params with count()
673
+		// because we don't want to include additional query clauses like "GROUP BY"
674
+		return $count
675
+			? $this->count(array($where_params), 'EVT_ID', true)
676
+			: $this->get_all($query_params);
677
+	}
678
+
679
+
680
+
681
+	/**
682
+	 * This only returns events that are expired.
683
+	 * They may still be published but all their datetimes have expired.
684
+	 *
685
+	 * @param  array $query_params An array of query params to further filter on
686
+	 *                             (note that status and DTT_EVT_end will be overridden)
687
+	 * @param bool   $count        whether to return the count or not (default FALSE)
688
+	 * @return EE_Event[]|int
689
+	 * @throws \EE_Error
690
+	 */
691
+	public function get_expired_events($query_params, $count = false)
692
+	{
693
+		$where_params = isset($query_params[0]) ? $query_params[0] : array();
694
+		// if we have count make sure we don't include group by
695
+		if ($count && isset($query_params['group_by'])) {
696
+			unset($query_params['group_by']);
697
+		}
698
+		// let's add specific query_params for active_events
699
+		// keep in mind this will override any sent status in the query AND any date queries.
700
+		if (isset($where_params['status'])) {
701
+			unset($where_params['status']);
702
+		}
703
+		$exclude_query = $query_params;
704
+		if (isset($exclude_query[0])) {
705
+			unset($exclude_query[0]);
706
+		}
707
+		$exclude_query[0] = array(
708
+			'Datetime.DTT_EVT_end' => array(
709
+				'>',
710
+				EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
711
+			),
712
+		);
713
+		// first get all events that have datetimes where its not expired.
714
+		$event_ids = $this->_get_all_wpdb_results($exclude_query, OBJECT_K, 'Event_CPT.ID');
715
+		$event_ids = array_keys($event_ids);
716
+		// if we have any additional query_params, let's add them to the 'AND' condition
717
+		$and_condition = array(
718
+			'Datetime.DTT_EVT_end' => array('<', EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end')),
719
+			'EVT_ID'               => array('NOT IN', $event_ids),
720
+		);
721
+		if (isset($where_params['OR'])) {
722
+			$and_condition['OR'] = $where_params['OR'];
723
+			unset($where_params['OR']);
724
+		}
725
+		if (isset($where_params['Datetime.DTT_EVT_end'])) {
726
+			$and_condition['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
727
+			unset($where_params['Datetime.DTT_EVT_end']);
728
+		}
729
+		if (isset($where_params['Datetime.DTT_EVT_start'])) {
730
+			$and_condition['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
731
+			unset($where_params['Datetime.DTT_EVT_start']);
732
+		}
733
+		// merge remaining $where params with the and conditions.
734
+		$where_params['AND'] = array_merge($and_condition, $where_params);
735
+		$query_params[0] = $where_params;
736
+		// don't use $query_params with count()
737
+		// because we don't want to include additional query clauses like "GROUP BY"
738
+		return $count
739
+			? $this->count(array($where_params), 'EVT_ID', true)
740
+			: $this->get_all($query_params);
741
+	}
742
+
743
+
744
+
745
+	/**
746
+	 * This basically just returns the events that do not have the publish status.
747
+	 *
748
+	 * @param  array   $query_params An array of query params to further filter on
749
+	 *                               (note that status will be overwritten)
750
+	 * @param  boolean $count        whether to return the count or not (default FALSE)
751
+	 * @return EE_Event[]|int
752
+	 * @throws \EE_Error
753
+	 */
754
+	public function get_inactive_events($query_params, $count = false)
755
+	{
756
+		$where_params = isset($query_params[0]) ? $query_params[0] : array();
757
+		// let's add in specific query_params for inactive events.
758
+		if (isset($where_params['status'])) {
759
+			unset($where_params['status']);
760
+		}
761
+		// if we have count make sure we don't include group by
762
+		if ($count && isset($query_params['group_by'])) {
763
+			unset($query_params['group_by']);
764
+		}
765
+		// if we have any additional query_params, let's add them to the 'AND' condition
766
+		$where_params['AND']['status'] = array('!=', 'publish');
767
+		if (isset($where_params['OR'])) {
768
+			$where_params['AND']['OR'] = $where_params['OR'];
769
+			unset($where_params['OR']);
770
+		}
771
+		if (isset($where_params['Datetime.DTT_EVT_end'])) {
772
+			$where_params['AND']['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
773
+			unset($where_params['Datetime.DTT_EVT_end']);
774
+		}
775
+		if (isset($where_params['Datetime.DTT_EVT_start'])) {
776
+			$where_params['AND']['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
777
+			unset($where_params['Datetime.DTT_EVT_start']);
778
+		}
779
+		$query_params[0] = $where_params;
780
+		// don't use $query_params with count()
781
+		// because we don't want to include additional query clauses like "GROUP BY"
782
+		return $count
783
+			? $this->count(array($where_params), 'EVT_ID', true)
784
+			: $this->get_all($query_params);
785
+	}
786
+
787
+
788
+
789
+	/**
790
+	 * This is just injecting into the parent add_relationship_to so we do special handling on price relationships
791
+	 * because we don't want to override any existing global default prices but instead insert NEW prices that get
792
+	 * attached to the event. See parent for param descriptions
793
+	 *
794
+	 * @param        $id_or_obj
795
+	 * @param        $other_model_id_or_obj
796
+	 * @param string $relationName
797
+	 * @param array  $where_query
798
+	 * @return EE_Base_Class
799
+	 * @throws EE_Error
800
+	 */
801
+	public function add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query = array())
802
+	{
803
+		if ($relationName === 'Price') {
804
+			// let's get the PRC object for the given ID to make sure that we aren't dealing with a default
805
+			$prc_chk = $this->get_related_model_obj($relationName)->ensure_is_obj($other_model_id_or_obj);
806
+			// if EVT_ID = 0, then this is a default
807
+			if ((int) $prc_chk->get('EVT_ID') === 0) {
808
+				// let's set the prc_id as 0 so we force an insert on the add_relation_to carried out by relation
809
+				$prc_chk->set('PRC_ID', 0);
810
+			}
811
+			// run parent
812
+			return parent::add_relationship_to($id_or_obj, $prc_chk, $relationName, $where_query);
813
+		}
814
+		// otherwise carry on as normal
815
+		return parent::add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query);
816
+	}
817
+
818
+
819
+
820
+	/******************** DEPRECATED METHODS ********************/
821
+
822
+
823
+
824
+	/**
825
+	 * _get_question_target_db_column
826
+	 *
827
+	 * @deprecated as of 4.8.32.rc.001. Instead consider using
828
+	 *             EE_Registration_Custom_Questions_Form located in
829
+	 *             admin_pages/registrations/form_sections/EE_Registration_Custom_Questions_Form.form.php
830
+	 * @access     public
831
+	 * @param    EE_Registration $registration (so existing answers for registration are included)
832
+	 * @param    int             $EVT_ID       so all question groups are included for event (not just answers from
833
+	 *                                         registration).
834
+	 * @throws EE_Error
835
+	 * @return    array
836
+	 */
837
+	public function assemble_array_of_groups_questions_and_options(EE_Registration $registration, $EVT_ID = 0)
838
+	{
839
+		if (empty($EVT_ID)) {
840
+			throw new EE_Error(__(
841
+				'An error occurred. No EVT_ID is included.  Needed to know which question groups to retrieve.',
842
+				'event_espresso'
843
+			));
844
+		}
845
+		$questions = array();
846
+		// get all question groups for event
847
+		$qgs = $this->get_question_groups_for_event($EVT_ID, $registration);
848
+		if (! empty($qgs)) {
849
+			foreach ($qgs as $qg) {
850
+				$qsts = $qg->questions();
851
+				$questions[ $qg->ID() ] = $qg->model_field_array();
852
+				$questions[ $qg->ID() ]['QSG_questions'] = array();
853
+				foreach ($qsts as $qst) {
854
+					if ($qst->is_system_question()) {
855
+						continue;
856
+					}
857
+					$answer = EEM_Answer::instance()->get_one(array(
858
+						array(
859
+							'QST_ID' => $qst->ID(),
860
+							'REG_ID' => $registration->ID(),
861
+						),
862
+					));
863
+					$answer = $answer instanceof EE_Answer ? $answer : EEM_Answer::instance()->create_default_object();
864
+					$qst_name = $qstn_id = $qst->ID();
865
+					$ans_id = $answer->ID();
866
+					$qst_name = ! empty($ans_id) ? '[' . $qst_name . '][' . $ans_id . ']' : '[' . $qst_name . ']';
867
+					$input_name = '';
868
+					$input_id = sanitize_key($qst->display_text());
869
+					$input_class = '';
870
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ] = $qst->model_field_array();
871
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_name'] = 'qstn'
872
+																						   . $input_name
873
+																						   . $qst_name;
874
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_id'] = $input_id . '-' . $qstn_id;
875
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_class'] = $input_class;
876
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'] = array();
877
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['qst_obj'] = $qst;
878
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['ans_obj'] = $answer;
879
+					// leave responses as-is, don't convert stuff into html entities please!
880
+					$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['htmlentities'] = false;
881
+					if ($qst->type() == 'RADIO_BTN' || $qst->type() == 'CHECKBOX' || $qst->type() == 'DROPDOWN') {
882
+						$QSOs = $qst->options(true, $answer->value());
883
+						if (is_array($QSOs)) {
884
+							foreach ($QSOs as $QSO_ID => $QSO) {
885
+								$questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'][ $QSO_ID ] = $QSO->model_field_array();
886
+							}
887
+						}
888
+					}
889
+				}
890
+			}
891
+		}
892
+		return $questions;
893
+	}
894
+
895
+
896
+	/**
897
+	 * @param mixed $cols_n_values either an array of where each key is the name of a field, and the value is its value
898
+	 *                             or an stdClass where each property is the name of a column,
899
+	 * @return EE_Base_Class
900
+	 * @throws \EE_Error
901
+	 */
902
+	public function instantiate_class_from_array_or_object($cols_n_values)
903
+	{
904
+		$classInstance = parent::instantiate_class_from_array_or_object($cols_n_values);
905
+		if ($classInstance instanceof EE_Event) {
906
+			// events have their timezone defined in the DB, so use it immediately
907
+			$this->set_timezone($classInstance->get_timezone());
908
+		}
909
+		return $classInstance;
910
+	}
911 911
 }
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
             'WP_User'                => new EE_Belongs_To_Relation(),
276 276
         );
277 277
         // this model is generally available for reading
278
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Public();
278
+        $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
279 279
         $this->model_chain_to_password = '';
280 280
         parent::__construct($timezone);
281 281
     }
@@ -368,7 +368,7 @@  discard block
 block discarded – undo
368 368
      */
369 369
     public function get_all_event_question_groups($EVT_ID = 0)
370 370
     {
371
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
371
+        if ( ! isset($EVT_ID) || ! absint($EVT_ID)) {
372 372
             EE_Error::add_error(
373 373
                 esc_html__(
374 374
                     'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
      */
400 400
     public function get_event_question_groups($EVT_ID = 0, $for_primary_attendee = true)
401 401
     {
402
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
402
+        if ( ! isset($EVT_ID) || ! absint($EVT_ID)) {
403 403
             EE_Error::add_error(
404 404
                 esc_html__(
405 405
                     'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
@@ -433,7 +433,7 @@  discard block
 block discarded – undo
433 433
      */
434 434
     public function get_question_groups_for_event($EVT_ID = 0, EE_Registration $registration)
435 435
     {
436
-        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
436
+        if ( ! isset($EVT_ID) || ! absint($EVT_ID)) {
437 437
             EE_Error::add_error(
438 438
                 esc_html__(
439 439
                     'An error occurred. No Question Groups could be retrieved because an Event ID was not received.',
@@ -845,11 +845,11 @@  discard block
 block discarded – undo
845 845
         $questions = array();
846 846
         // get all question groups for event
847 847
         $qgs = $this->get_question_groups_for_event($EVT_ID, $registration);
848
-        if (! empty($qgs)) {
848
+        if ( ! empty($qgs)) {
849 849
             foreach ($qgs as $qg) {
850 850
                 $qsts = $qg->questions();
851
-                $questions[ $qg->ID() ] = $qg->model_field_array();
852
-                $questions[ $qg->ID() ]['QSG_questions'] = array();
851
+                $questions[$qg->ID()] = $qg->model_field_array();
852
+                $questions[$qg->ID()]['QSG_questions'] = array();
853 853
                 foreach ($qsts as $qst) {
854 854
                     if ($qst->is_system_question()) {
855 855
                         continue;
@@ -863,26 +863,26 @@  discard block
 block discarded – undo
863 863
                     $answer = $answer instanceof EE_Answer ? $answer : EEM_Answer::instance()->create_default_object();
864 864
                     $qst_name = $qstn_id = $qst->ID();
865 865
                     $ans_id = $answer->ID();
866
-                    $qst_name = ! empty($ans_id) ? '[' . $qst_name . '][' . $ans_id . ']' : '[' . $qst_name . ']';
866
+                    $qst_name = ! empty($ans_id) ? '['.$qst_name.']['.$ans_id.']' : '['.$qst_name.']';
867 867
                     $input_name = '';
868 868
                     $input_id = sanitize_key($qst->display_text());
869 869
                     $input_class = '';
870
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ] = $qst->model_field_array();
871
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_name'] = 'qstn'
870
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()] = $qst->model_field_array();
871
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_name'] = 'qstn'
872 872
                                                                                            . $input_name
873 873
                                                                                            . $qst_name;
874
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_id'] = $input_id . '-' . $qstn_id;
875
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_input_class'] = $input_class;
876
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'] = array();
877
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['qst_obj'] = $qst;
878
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['ans_obj'] = $answer;
874
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_id'] = $input_id.'-'.$qstn_id;
875
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_class'] = $input_class;
876
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_options'] = array();
877
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['qst_obj'] = $qst;
878
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['ans_obj'] = $answer;
879 879
                     // leave responses as-is, don't convert stuff into html entities please!
880
-                    $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['htmlentities'] = false;
880
+                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['htmlentities'] = false;
881 881
                     if ($qst->type() == 'RADIO_BTN' || $qst->type() == 'CHECKBOX' || $qst->type() == 'DROPDOWN') {
882 882
                         $QSOs = $qst->options(true, $answer->value());
883 883
                         if (is_array($QSOs)) {
884 884
                             foreach ($QSOs as $QSO_ID => $QSO) {
885
-                                $questions[ $qg->ID() ]['QSG_questions'][ $qst->ID() ]['QST_options'][ $QSO_ID ] = $QSO->model_field_array();
885
+                                $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_options'][$QSO_ID] = $QSO->model_field_array();
886 886
                             }
887 887
                         }
888 888
                     }
Please login to merge, or discard this patch.
events/help_tabs/events_default_settings_max_tickets.help_tab.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <p>
2 2
     <?php esc_html_e(
3
-        'Use this to control what the default will be for maximum tickets on an order when creating a new event.',
4
-        'event_espresso'
5
-    ); ?>
3
+		'Use this to control what the default will be for maximum tickets on an order when creating a new event.',
4
+		'event_espresso'
5
+	); ?>
6 6
 </p>
7 7
\ No newline at end of file
Please login to merge, or discard this patch.
core/services/notices/ConvertNoticesToEeErrors.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@
 block discarded – undo
43 43
             $error_string = esc_html__('The following errors occurred:', 'event_espresso');
44 44
             foreach ($notices->getError() as $notice) {
45 45
                 if ($this->getThrowExceptions()) {
46
-                    $error_string .= '<br />' . $notice->message();
46
+                    $error_string .= '<br />'.$notice->message();
47 47
                 } else {
48 48
                     EE_Error::add_error(
49 49
                         $notice->message(),
Please login to merge, or discard this patch.
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -19,56 +19,56 @@
 block discarded – undo
19 19
 class ConvertNoticesToEeErrors extends NoticeConverter
20 20
 {
21 21
 
22
-    /**
23
-     * Converts Notice objects into EE_Error notifications
24
-     *
25
-     * @param NoticesContainerInterface $notices
26
-     * @throws EE_Error
27
-     */
28
-    public function process(NoticesContainerInterface $notices)
29
-    {
30
-        $this->setNotices($notices);
31
-        $notices = $this->getNotices();
32
-        if ($notices->hasAttention()) {
33
-            foreach ($notices->getAttention() as $notice) {
34
-                EE_Error::add_attention(
35
-                    $notice->message(),
36
-                    $notice->file(),
37
-                    $notice->func(),
38
-                    $notice->line()
39
-                );
40
-            }
41
-        }
42
-        if ($notices->hasError()) {
43
-            $error_string = esc_html__('The following errors occurred:', 'event_espresso');
44
-            foreach ($notices->getError() as $notice) {
45
-                if ($this->getThrowExceptions()) {
46
-                    $error_string .= '<br />' . $notice->message();
47
-                } else {
48
-                    EE_Error::add_error(
49
-                        $notice->message(),
50
-                        $notice->file(),
51
-                        $notice->func(),
52
-                        $notice->line()
53
-                    );
54
-                }
55
-            }
56
-            if ($this->getThrowExceptions()) {
57
-                throw new EE_Error($error_string);
58
-            }
59
-        }
60
-        if ($notices->hasSuccess()) {
61
-            foreach ($notices->getSuccess() as $notice) {
62
-                EE_Error::add_success(
63
-                    $notice->message(),
64
-                    $notice->file(),
65
-                    $notice->func(),
66
-                    $notice->line()
67
-                );
68
-            }
69
-        }
70
-        $this->clearNotices();
71
-    }
22
+	/**
23
+	 * Converts Notice objects into EE_Error notifications
24
+	 *
25
+	 * @param NoticesContainerInterface $notices
26
+	 * @throws EE_Error
27
+	 */
28
+	public function process(NoticesContainerInterface $notices)
29
+	{
30
+		$this->setNotices($notices);
31
+		$notices = $this->getNotices();
32
+		if ($notices->hasAttention()) {
33
+			foreach ($notices->getAttention() as $notice) {
34
+				EE_Error::add_attention(
35
+					$notice->message(),
36
+					$notice->file(),
37
+					$notice->func(),
38
+					$notice->line()
39
+				);
40
+			}
41
+		}
42
+		if ($notices->hasError()) {
43
+			$error_string = esc_html__('The following errors occurred:', 'event_espresso');
44
+			foreach ($notices->getError() as $notice) {
45
+				if ($this->getThrowExceptions()) {
46
+					$error_string .= '<br />' . $notice->message();
47
+				} else {
48
+					EE_Error::add_error(
49
+						$notice->message(),
50
+						$notice->file(),
51
+						$notice->func(),
52
+						$notice->line()
53
+					);
54
+				}
55
+			}
56
+			if ($this->getThrowExceptions()) {
57
+				throw new EE_Error($error_string);
58
+			}
59
+		}
60
+		if ($notices->hasSuccess()) {
61
+			foreach ($notices->getSuccess() as $notice) {
62
+				EE_Error::add_success(
63
+					$notice->message(),
64
+					$notice->file(),
65
+					$notice->func(),
66
+					$notice->line()
67
+				);
68
+			}
69
+		}
70
+		$this->clearNotices();
71
+	}
72 72
 
73 73
 
74 74
 }
Please login to merge, or discard this patch.