Completed
Branch BUG-10626-dst-unit-test (b2e779)
by
unknown
23:16 queued 12:00
created

EEM_Event::instance()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 5

Duplication

Lines 12
Ratio 100 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 1
dl 12
loc 12
rs 9.4285
c 0
b 0
f 0
1
<?php use EventEspresso\core\services\orm\ModelFieldFactory;
2
3
if (! defined('EVENT_ESPRESSO_VERSION')) {
4
    exit('No direct script access allowed');
5
}
6
require_once(EE_MODELS . 'EEM_CPT_Base.model.php');
7
8
9
10
/**
11
 * EEM_Event Model
12
 * extends EEM_CPT_Base which extends EEM_Base
13
 *
14
 * @package               Event Espresso
15
 * @subpackage            includes/models/
16
 * @author                Michael Nelson, Brent Christensen
17
 */
18
class EEM_Event extends EEM_CPT_Base
19
{
20
21
    /**
22
     * constant used by status(), indicating that no more tickets can be purchased for any of the datetimes for the
23
     * event
24
     */
25
    const sold_out = 'sold_out';
26
27
    /**
28
     * constant used by status(), indicating that upcoming event dates have been postponed (may be pushed to a later
29
     * date)
30
     */
31
    const postponed = 'postponed';
32
33
    /**
34
     * constant used by status(), indicating that the event will no longer occur
35
     */
36
    const cancelled = 'cancelled';
37
38
39
    /**
40
     * @var string
41
     */
42
    protected static $_default_reg_status;
43
44
45
    /**
46
     * This is the default for the additional limit field.
47
     * @var int
48
     */
49
    protected static $_default_additional_limit = 10;
50
51
52
    /**
53
     * private instance of the Event object
54
     *
55
     * @var EEM_Event
56
     */
57
    protected static $_instance;
58
59
60
61
62
    /**
63
     * Adds a relationship to Term_Taxonomy for each CPT_Base
64
     *
65
     * @param string $timezone
66
     * @throws \EE_Error
67
     */
68
    protected function __construct($timezone = null)
69
    {
70
        EE_Registry::instance()->load_model('Registration');
71
        $this->singular_item = esc_html__('Event', 'event_espresso');
72
        $this->plural_item = esc_html__('Events', 'event_espresso');
73
        // to remove Cancelled events from the frontend, copy the following filter to your functions.php file
74
        // add_filter( 'AFEE__EEM_Event__construct___custom_stati__cancelled__Public', '__return_false' );
75
        // to remove Postponed events from the frontend, copy the following filter to your functions.php file
76
        // add_filter( 'AFEE__EEM_Event__construct___custom_stati__postponed__Public', '__return_false' );
77
        // to remove Sold Out events from the frontend, copy the following filter to your functions.php file
78
        //	add_filter( 'AFEE__EEM_Event__construct___custom_stati__sold_out__Public', '__return_false' );
79
        $this->_custom_stati = apply_filters(
80
            'AFEE__EEM_Event__construct___custom_stati',
81
            array(
82
                EEM_Event::cancelled => array(
83
                    'label'  => esc_html__('Cancelled', 'event_espresso'),
84
                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__cancelled__Public', true),
85
                ),
86
                EEM_Event::postponed => array(
87
                    'label'  => esc_html__('Postponed', 'event_espresso'),
88
                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__postponed__Public', true),
89
                ),
90
                EEM_Event::sold_out  => array(
91
                    'label'  => esc_html__('Sold Out', 'event_espresso'),
92
                    'public' => apply_filters('AFEE__EEM_Event__construct___custom_stati__sold_out__Public', true),
93
                ),
94
            )
95
        );
96
        self::$_default_reg_status = empty(self::$_default_reg_status) ? EEM_Registration::status_id_pending_payment
97
            : self::$_default_reg_status;
98
        $this->_tables = array(
99
            'Event_CPT'  => new EE_Primary_Table('posts', 'ID'),
100
            'Event_Meta' => new EE_Secondary_Table('esp_event_meta', 'EVTM_ID', 'EVT_ID'),
101
        );
102
        $this->_fields = array(
103
            'Event_CPT'  => array(
104
                'EVT_ID'         => new EE_Primary_Key_Int_Field('ID',
105
                    esc_html__('Post ID for Event', 'event_espresso')),
106
                'EVT_name'       => new EE_Plain_Text_Field('post_title', esc_html__('Event Name', 'event_espresso'),
107
                    false,
108
                    ''),
109
                'EVT_desc'       => new EE_Post_Content_Field('post_content',
110
                    esc_html__('Event Description', 'event_espresso'),
111
                    false, ''),
112
                'EVT_slug'       => new EE_Slug_Field('post_name', esc_html__('Event Slug', 'event_espresso'), false,
113
                    ''),
114
                'EVT_created'    => new EE_Datetime_Field('post_date',
115
                    esc_html__('Date/Time Event Created', 'event_espresso'),
116
                    false, EE_Datetime_Field::now),
117
                'EVT_short_desc' => new EE_Simple_HTML_Field('post_excerpt',
118
                    esc_html__('Event Short Description', 'event_espresso'), false, ''),
119
                'EVT_modified'   => new EE_Datetime_Field('post_modified',
120
                    esc_html__('Date/Time Event Modified', 'event_espresso'), false, EE_Datetime_Field::now),
121
                'EVT_wp_user'    => new EE_WP_User_Field('post_author',
122
                    esc_html__('Event Creator ID', 'event_espresso'),
123
                    false),
124
                'parent'         => new EE_Integer_Field('post_parent', esc_html__('Event Parent ID', 'event_espresso'),
125
                    false,
126
                    0),
127
                'EVT_order'      => new EE_Integer_Field('menu_order', esc_html__('Event Menu Order', 'event_espresso'),
128
                    false,
129
                    1),
130
                'post_type'      => new EE_WP_Post_Type_Field('espresso_events'),
131
                // EE_Plain_Text_Field( 'post_type', esc_html__( 'Event Post Type', 'event_espresso' ), FALSE, 'espresso_events' ),
132
                'status'         => new EE_WP_Post_Status_Field('post_status',
133
                    esc_html__('Event Status', 'event_espresso'),
134
                    false, 'draft', $this->_custom_stati),
135
            ),
136
            'Event_Meta' => array(
137
                'EVTM_ID'                         => new EE_DB_Only_Float_Field('EVTM_ID',
138
                    esc_html__('Event Meta Row ID', 'event_espresso'), false),
139
                'EVT_ID_fk'                       => new EE_DB_Only_Int_Field('EVT_ID',
140
                    esc_html__('Foreign key to Event ID from Event Meta table', 'event_espresso'), false),
141
                'EVT_display_desc'                => new EE_Boolean_Field('EVT_display_desc',
142
                    esc_html__('Display Description Flag', 'event_espresso'), false, 1),
143
                'EVT_display_ticket_selector'     => new EE_Boolean_Field('EVT_display_ticket_selector',
144
                    esc_html__('Display Ticket Selector Flag', 'event_espresso'), false, 1),
145
                'EVT_visible_on'                  => new EE_Datetime_Field('EVT_visible_on',
146
                    esc_html__('Event Visible Date', 'event_espresso'), true, EE_Datetime_Field::now),
147
                'EVT_additional_limit'            => new EE_Integer_Field(
148
                    'EVT_additional_limit',
149
                    esc_html__('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
150
                    true,
151
                    self::$_default_additional_limit
152
                ),
153
                'EVT_default_registration_status' => new EE_Enum_Text_Field(
154
                    'EVT_default_registration_status',
155
                    esc_html__('Default Registration Status on this Event', 'event_espresso'), false,
156
                    EEM_Event::$_default_reg_status, EEM_Registration::reg_status_array()
157
                ),
158
                'EVT_member_only'                 => new EE_Boolean_Field('EVT_member_only',
159
                    esc_html__('Member-Only Event Flag', 'event_espresso'), false, false),
160
                'EVT_phone'                       => new EE_Plain_Text_Field('EVT_phone',
161
                    esc_html__('Event Phone Number', 'event_espresso'), false),
162
                'EVT_allow_overflow'              => new EE_Boolean_Field('EVT_allow_overflow',
163
                    esc_html__('Allow Overflow on Event', 'event_espresso'), false, false),
164
                'EVT_timezone_string'             => new EE_Plain_Text_Field('EVT_timezone_string',
165
                    esc_html__('Timezone (name) for Event times', 'event_espresso'), false),
166
                'EVT_external_URL'                => new EE_Plain_Text_Field('EVT_external_URL',
167
                    esc_html__('URL of Event Page if hosted elsewhere', 'event_espresso'), true),
168
                'EVT_donations'                   => new EE_Boolean_Field('EVT_donations',
169
                    esc_html__('Accept Donations?', 'event_espresso'), false, false),
170
            ),
171
        );
172
        $this->_model_relations = array(
173
            'Registration'           => new EE_Has_Many_Relation(),
174
            'Datetime'               => new EE_Has_Many_Relation(),
175
            'Question_Group'         => new EE_HABTM_Relation('Event_Question_Group'),
176
            'Venue'                  => new EE_HABTM_Relation('Event_Venue'),
177
            'Term_Relationship'      => new EE_Has_Many_Relation(),
178
            'Term_Taxonomy'          => new EE_HABTM_Relation('Term_Relationship'),
179
            'Message_Template_Group' => new EE_HABTM_Relation('Event_Message_Template'),
180
            'Attendee'               => new EE_HABTM_Relation('Registration'),
181
            'WP_User'                => new EE_Belongs_To_Relation(),
182
        );
183
        //this model is generally available for reading
184
        $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
185
        parent::__construct($timezone);
186
    }
187
188
189
190
    /**
191
     * @param string $default_reg_status
192
     */
193
    public static function set_default_reg_status($default_reg_status)
194
    {
195
        self::$_default_reg_status = $default_reg_status;
196
        // if EEM_Event has already been instantiated,
197
        // then we need to reset the `EVT_default_reg_status` field to use the new default.
198
        if (self::$_instance instanceof EEM_Event) {
199
            $default_reg_status = new EE_Enum_Text_Field(
200
                'EVT_default_registration_status',
201
                esc_html__('Default Registration Status on this Event', 'event_espresso'),
202
                false,
203
                $default_reg_status,
204
                EEM_Registration::reg_status_array()
205
            );
206
            $default_reg_status->_construct_finalize(
207
                'Event_Meta',
208
                'EVT_default_registration_status',
209
                'EEM_Event'
210
            );
211
            self::$_instance->_fields['Event_Meta']['EVT_default_registration_status'] = $default_reg_status;
212
        }
213
    }
214
215
216
    /**
217
     * Used to override the default for the additional limit field.
218
     * @param $additional_limit
219
     */
220
    public static function set_default_additional_limit($additional_limit)
221
    {
222
        self::$_default_additional_limit = (int) $additional_limit;
223
        if (self::$_instance instanceof EEM_Event) {
224
            self::$_instance->_fields['Event_Meta']['EVT_additional_limit'] = new EE_Integer_Field(
225
                'EVT_additional_limit',
226
                __('Limit of Additional Registrations on Same Transaction', 'event_espresso'),
227
                true,
228
                self::$_default_additional_limit
229
            );
230
            self::$_instance->_fields['Event_Meta']['EVT_additional_limit']->_construct_finalize(
231
                'Event_Meta',
232
                'EVT_additional_limit',
233
                'EEM_Event'
234
            );
235
        }
236
    }
237
238
239
    /**
240
     * Return what is currently set as the default additional limit for the event.
241
     * @return int
242
     */
243
    public static function get_default_additional_limit()
244
    {
245
        return apply_filters('FHEE__EEM_Event__get_default_additional_limit', self::$_default_additional_limit);
246
    }
247
248
249
    /**
250
     * get_question_groups
251
     *
252
     * @return array
253
     * @throws \EE_Error
254
     */
255
    public function get_all_question_groups()
256
    {
257
        return EE_Registry::instance()->load_model('Question_Group')->get_all(
258
            array(
259
                array('QSG_deleted' => false),
260
                'order_by' => array('QSG_order' => 'ASC'),
261
            )
262
        );
263
    }
264
265
266
267
    /**
268
     * get_question_groups
269
     *
270
     * @param int $EVT_ID
271
     * @return array|bool
272
     * @throws \EE_Error
273
     */
274 View Code Duplication
    public function get_all_event_question_groups($EVT_ID = 0)
275
    {
276
        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
277
            EE_Error::add_error(
278
                esc_html__(
279
                    'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
280
                    'event_espresso'
281
                ),
282
                __FILE__, __FUNCTION__, __LINE__
283
            );
284
            return false;
285
        }
286
        return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
287
            array(
288
                array('EVT_ID' => $EVT_ID),
289
            )
290
        );
291
    }
292
293
294
295
    /**
296
     * get_question_groups
297
     *
298
     * @param int     $EVT_ID
299
     * @param boolean $for_primary_attendee
300
     * @return array|bool
301
     * @throws \EE_Error
302
     */
303 View Code Duplication
    public function get_event_question_groups($EVT_ID = 0, $for_primary_attendee = true)
304
    {
305
        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
306
            EE_Error::add_error(
307
                esc_html__(
308
                    'An error occurred. No Event Question Groups could be retrieved because an Event ID was not received.',
309
                    'event_espresso'
310
                ),
311
                __FILE__, __FUNCTION__, __LINE__
312
            );
313
            return false;
314
        }
315
        return EE_Registry::instance()->load_model('Event_Question_Group')->get_all(
316
            array(
317
                array(
318
                    'EVT_ID'      => $EVT_ID,
319
                    'EQG_primary' => $for_primary_attendee,
320
                ),
321
            )
322
        );
323
    }
324
325
326
327
    /**
328
     * get_question_groups
329
     *
330
     * @param int             $EVT_ID
331
     * @param EE_Registration $registration
332
     * @return array|bool
333
     * @throws \EE_Error
334
     */
335
    public function get_question_groups_for_event($EVT_ID = 0, EE_Registration $registration)
336
    {
337
        if (! isset($EVT_ID) || ! absint($EVT_ID)) {
338
            EE_Error::add_error(
339
                esc_html__(
340
                    'An error occurred. No Question Groups could be retrieved because an Event ID was not received.',
341
                    'event_espresso'
342
                ),
343
                __FILE__, __FUNCTION__, __LINE__
344
            );
345
            return false;
346
        }
347
        $where_params = array(
348
            'Event_Question_Group.EVT_ID'      => $EVT_ID,
349
            'Event_Question_Group.EQG_primary' => $registration->count() === 1 ? true : false,
350
            'QSG_deleted'                      => false,
351
        );
352
        return EE_Registry::instance()->load_model('Question_Group')->get_all(
353
            array(
354
                $where_params,
355
                'order_by' => array('QSG_order' => 'ASC'),
356
            )
357
        );
358
    }
359
360
361
362
    /**
363
     * get_question_target_db_column
364
     *
365
     * @param string $QSG_IDs csv list of $QSG IDs
366
     * @return array|bool
367
     * @throws \EE_Error
368
     */
369 View Code Duplication
    public function get_questions_in_groups($QSG_IDs = '')
370
    {
371
        if (empty($QSG_IDs)) {
372
            EE_Error::add_error(
373
                esc_html__('An error occurred. No Question Group IDs were received.', 'event_espresso'),
374
                __FILE__, __FUNCTION__, __LINE__
375
            );
376
            return false;
377
        }
378
        return EE_Registry::instance()->load_model('Question')->get_all(
379
            array(
380
                array(
381
                    'Question_Group.QSG_ID' => array('IN', $QSG_IDs),
382
                    'QST_deleted'           => false,
383
                    'QST_admin_only'        => is_admin(),
384
                ),
385
                'order_by' => 'QST_order',
386
            )
387
        );
388
    }
389
390
391
392
    /**
393
     * get_options_for_question
394
     *
395
     * @param string $QST_IDs csv list of $QST IDs
396
     * @return array|bool
397
     * @throws \EE_Error
398
     */
399 View Code Duplication
    public function get_options_for_question($QST_IDs)
400
    {
401
        if (empty($QST_IDs)) {
402
            EE_Error::add_error(
403
                esc_html__('An error occurred. No Question IDs were received.', 'event_espresso'),
404
                __FILE__, __FUNCTION__, __LINE__
405
            );
406
            return false;
407
        }
408
        return EE_Registry::instance()->load_model('Question_Option')->get_all(
409
            array(
410
                array(
411
                    'Question.QST_ID' => array('IN', $QST_IDs),
412
                    'QSO_deleted'     => false,
413
                ),
414
                'order_by' => 'QSO_ID',
415
            )
416
        );
417
    }
418
419
420
421
422
423
424
425
    /**
426
     * Gets all events that are published
427
     * and have event start time earlier than now and an event end time later than now
428
     *
429
     * @param  array $query_params An array of query params to further filter on
430
     *                             (note that status and DTT_EVT_start and DTT_EVT_end will be overridden)
431
     * @param bool   $count        whether to return the count or not (default FALSE)
432
     * @return EE_Event[]|int
433
     * @throws \EE_Error
434
     */
435
    public function get_active_events($query_params, $count = false)
436
    {
437
        if (array_key_exists(0, $query_params)) {
438
            $where_params = $query_params[0];
439
            unset($query_params[0]);
440
        } else {
441
            $where_params = array();
442
        }
443
        // if we have count make sure we don't include group by
444
        if ($count && isset($query_params['group_by'])) {
445
            unset($query_params['group_by']);
446
        }
447
        // let's add specific query_params for active_events
448
        // keep in mind this will override any sent status in the query AND any date queries.
449
        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
450
        //if already have where params for DTT_EVT_start or DTT_EVT_end then append these conditions
451
        if (isset($where_params['Datetime.DTT_EVT_start'])) {
452
            $where_params['Datetime.DTT_EVT_start******'] = array(
453
                '<',
454
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
455
            );
456
        } else {
457
            $where_params['Datetime.DTT_EVT_start'] = array(
458
                '<',
459
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
460
            );
461
        }
462
        if (isset($where_params['Datetime.DTT_EVT_end'])) {
463
            $where_params['Datetime.DTT_EVT_end*****'] = array(
464
                '>',
465
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
466
            );
467
        } else {
468
            $where_params['Datetime.DTT_EVT_end'] = array(
469
                '>',
470
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
471
            );
472
        }
473
        $query_params[0] = $where_params;
474
        // don't use $query_params with count()
475
        // because we don't want to include additional query clauses like "GROUP BY"
476
        return $count
477
            ? $this->count(array($where_params), 'EVT_ID', true)
478
            : $this->get_all($query_params);
479
    }
480
481
482
483
    /**
484
     * get all events that are published and have an event start time later than now
485
     *
486
     * @param  array $query_params An array of query params to further filter on
487
     *                             (Note that status and DTT_EVT_start will be overridden)
488
     * @param bool   $count        whether to return the count or not (default FALSE)
489
     * @return EE_Event[]|int
490
     * @throws \EE_Error
491
     */
492 View Code Duplication
    public function get_upcoming_events($query_params, $count = false)
493
    {
494
        if (array_key_exists(0, $query_params)) {
495
            $where_params = $query_params[0];
496
            unset($query_params[0]);
497
        } else {
498
            $where_params = array();
499
        }
500
        // if we have count make sure we don't include group by
501
        if ($count && isset($query_params['group_by'])) {
502
            unset($query_params['group_by']);
503
        }
504
        // let's add specific query_params for active_events
505
        // keep in mind this will override any sent status in the query AND any date queries.
506
        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
507
        // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
508
        if (isset($where_params['Datetime.DTT_EVT_start'])) {
509
            $where_params['Datetime.DTT_EVT_start*****'] = array(
510
                '>',
511
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
512
            );
513
        } else {
514
            $where_params['Datetime.DTT_EVT_start'] = array(
515
                '>',
516
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
517
            );
518
        }
519
        $query_params[0] = $where_params;
520
        // don't use $query_params with count()
521
        // because we don't want to include additional query clauses like "GROUP BY"
522
        return $count
523
            ? $this->count(array($where_params), 'EVT_ID', true)
524
            : $this->get_all($query_params);
525
    }
526
527
528
529
    /**
530
     * Gets all events that are published
531
     * and have an event end time later than now
532
     *
533
     * @param  array $query_params An array of query params to further filter on
534
     *                             (note that status and DTT_EVT_end will be overridden)
535
     * @param bool   $count        whether to return the count or not (default FALSE)
536
     * @return EE_Event[]|int
537
     * @throws \EE_Error
538
     */
539 View Code Duplication
    public function get_active_and_upcoming_events($query_params, $count = false)
540
    {
541
        if (array_key_exists(0, $query_params)) {
542
            $where_params = $query_params[0];
543
            unset($query_params[0]);
544
        } else {
545
            $where_params = array();
546
        }
547
        // if we have count make sure we don't include group by
548
        if ($count && isset($query_params['group_by'])) {
549
            unset($query_params['group_by']);
550
        }
551
        // let's add specific query_params for active_events
552
        // keep in mind this will override any sent status in the query AND any date queries.
553
        $where_params['status'] = array('IN', array('publish', EEM_Event::sold_out));
554
        // add where params for DTT_EVT_end
555
        if (isset($where_params['Datetime.DTT_EVT_end'])) {
556
            $where_params['Datetime.DTT_EVT_end*****'] = array(
557
                '>',
558
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
559
            );
560
        } else {
561
            $where_params['Datetime.DTT_EVT_end'] = array(
562
                '>',
563
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
564
            );
565
        }
566
        $query_params[0] = $where_params;
567
        // don't use $query_params with count()
568
        // because we don't want to include additional query clauses like "GROUP BY"
569
        return $count
570
            ? $this->count(array($where_params), 'EVT_ID', true)
571
            : $this->get_all($query_params);
572
    }
573
574
575
576
    /**
577
     * This only returns events that are expired.
578
     * They may still be published but all their datetimes have expired.
579
     *
580
     * @param  array $query_params An array of query params to further filter on
581
     *                             (note that status and DTT_EVT_end will be overridden)
582
     * @param bool   $count        whether to return the count or not (default FALSE)
583
     * @return EE_Event[]|int
584
     * @throws \EE_Error
585
     */
586
    public function get_expired_events($query_params, $count = false)
587
    {
588
        $where_params = isset($query_params[0]) ? $query_params[0] : array();
589
        // if we have count make sure we don't include group by
590
        if ($count && isset($query_params['group_by'])) {
591
            unset($query_params['group_by']);
592
        }
593
        // let's add specific query_params for active_events
594
        // keep in mind this will override any sent status in the query AND any date queries.
595
        if (isset($where_params['status'])) {
596
            unset($where_params['status']);
597
        }
598
        $exclude_query = $query_params;
599
        if (isset($exclude_query[0])) {
600
            unset($exclude_query[0]);
601
        }
602
        $exclude_query[0] = array(
603
            'Datetime.DTT_EVT_end' => array(
604
                '>',
605
                EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end'),
606
            ),
607
        );
608
        // first get all events that have datetimes where its not expired.
609
        $event_ids = $this->_get_all_wpdb_results($exclude_query, OBJECT_K, 'Event_CPT.ID');
610
        $event_ids = array_keys($event_ids);
611
        // if we have any additional query_params, let's add them to the 'AND' condition
612
        $and_condition = array(
613
            'Datetime.DTT_EVT_end' => array('<', EEM_Datetime::instance()->current_time_for_query('DTT_EVT_end')),
614
            'EVT_ID'               => array('NOT IN', $event_ids),
615
        );
616 View Code Duplication
        if (isset($where_params['OR'])) {
617
            $and_condition['OR'] = $where_params['OR'];
618
            unset($where_params['OR']);
619
        }
620 View Code Duplication
        if (isset($where_params['Datetime.DTT_EVT_end'])) {
621
            $and_condition['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
622
            unset($where_params['Datetime.DTT_EVT_end']);
623
        }
624 View Code Duplication
        if (isset($where_params['Datetime.DTT_EVT_start'])) {
625
            $and_condition['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
626
            unset($where_params['Datetime.DTT_EVT_start']);
627
        }
628
        // merge remaining $where params with the and conditions.
629
        $where_params['AND'] = array_merge($and_condition, $where_params);
630
        $query_params[0] = $where_params;
631
        // don't use $query_params with count()
632
        // because we don't want to include additional query clauses like "GROUP BY"
633
        return $count
634
            ? $this->count(array($where_params), 'EVT_ID', true)
635
            : $this->get_all($query_params);
636
    }
637
638
639
640
    /**
641
     * This basically just returns the events that do not have the publish status.
642
     *
643
     * @param  array   $query_params An array of query params to further filter on
644
     *                               (note that status will be overwritten)
645
     * @param  boolean $count        whether to return the count or not (default FALSE)
646
     * @return EE_Event[]|int
647
     * @throws \EE_Error
648
     */
649
    public function get_inactive_events($query_params, $count = false)
650
    {
651
        $where_params = isset($query_params[0]) ? $query_params[0] : array();
652
        // let's add in specific query_params for inactive events.
653
        if (isset($where_params['status'])) {
654
            unset($where_params['status']);
655
        }
656
        // if we have count make sure we don't include group by
657
        if ($count && isset($query_params['group_by'])) {
658
            unset($query_params['group_by']);
659
        }
660
        // if we have any additional query_params, let's add them to the 'AND' condition
661
        $where_params['AND']['status'] = array('!=', 'publish');
662 View Code Duplication
        if (isset($where_params['OR'])) {
663
            $where_params['AND']['OR'] = $where_params['OR'];
664
            unset($where_params['OR']);
665
        }
666 View Code Duplication
        if (isset($where_params['Datetime.DTT_EVT_end'])) {
667
            $where_params['AND']['Datetime.DTT_EVT_end****'] = $where_params['Datetime.DTT_EVT_end'];
668
            unset($where_params['Datetime.DTT_EVT_end']);
669
        }
670 View Code Duplication
        if (isset($where_params['Datetime.DTT_EVT_start'])) {
671
            $where_params['AND']['Datetime.DTT_EVT_start'] = $where_params['Datetime.DTT_EVT_start'];
672
            unset($where_params['Datetime.DTT_EVT_start']);
673
        }
674
        $query_params[0] = $where_params;
675
        // don't use $query_params with count()
676
        // because we don't want to include additional query clauses like "GROUP BY"
677
        return $count
678
            ? $this->count(array($where_params), 'EVT_ID', true)
679
            : $this->get_all($query_params);
680
    }
681
682
683
684
    /**
685
     * This is just injecting into the parent add_relationship_to so we do special handling on price relationships
686
     * because we don't want to override any existing global default prices but instead insert NEW prices that get
687
     * attached to the event. See parent for param descriptions
688
     *
689
     * @param        $id_or_obj
690
     * @param        $other_model_id_or_obj
691
     * @param string $relationName
692
     * @param array  $where_query
693
     * @return EE_Base_Class
694
     * @throws EE_Error
695
     */
696
    public function add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query = array())
697
    {
698
        if ($relationName === 'Price') {
699
            //let's get the PRC object for the given ID to make sure that we aren't dealing with a default
700
            $prc_chk = $this->get_related_model_obj($relationName)->ensure_is_obj($other_model_id_or_obj);
701
            //if EVT_ID = 0, then this is a default
702
            if ((int) $prc_chk->get('EVT_ID') === 0) {
703
                //let's set the prc_id as 0 so we force an insert on the add_relation_to carried out by relation
704
                $prc_chk->set('PRC_ID', 0);
705
            }
706
            //run parent
707
            return parent::add_relationship_to($id_or_obj, $prc_chk, $relationName, $where_query);
708
        }
709
        //otherwise carry on as normal
710
        return parent::add_relationship_to($id_or_obj, $other_model_id_or_obj, $relationName, $where_query);
711
    }
712
713
714
715
    /******************** DEPRECATED METHODS ********************/
716
717
718
719
    /**
720
     * _get_question_target_db_column
721
     *
722
     * @deprecated as of 4.8.32.rc.001. Instead consider using
723
     *             EE_Registration_Custom_Questions_Form located in
724
     *             admin_pages/registrations/form_sections/EE_Registration_Custom_Questions_Form.form.php
725
     * @access     public
726
     * @param    EE_Registration $registration (so existing answers for registration are included)
727
     * @param    int             $EVT_ID       so all question groups are included for event (not just answers from
728
     *                                         registration).
729
     * @throws EE_Error
730
     * @return    array
731
     */
732
    public function assemble_array_of_groups_questions_and_options(EE_Registration $registration, $EVT_ID = 0)
733
    {
734
        if (empty($EVT_ID)) {
735
            throw new EE_Error(__('An error occurred. No EVT_ID is included.  Needed to know which question groups to retrieve.',
736
                'event_espresso'));
737
        }
738
        $questions = array();
739
        // get all question groups for event
740
        $qgs = $this->get_question_groups_for_event($EVT_ID, $registration);
741
        if (! empty($qgs)) {
742
            foreach ($qgs as $qg) {
0 ignored issues
show
Bug introduced by
The expression $qgs of type array|boolean is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
743
                $qsts = $qg->questions();
744
                $questions[$qg->ID()] = $qg->model_field_array();
745
                $questions[$qg->ID()]['QSG_questions'] = array();
746
                foreach ($qsts as $qst) {
747
                    if ($qst->is_system_question()) {
748
                        continue;
749
                    }
750
                    $answer = EEM_Answer::instance()->get_one(array(
751
                        array(
752
                            'QST_ID' => $qst->ID(),
753
                            'REG_ID' => $registration->ID(),
754
                        ),
755
                    ));
756
                    $answer = $answer instanceof EE_Answer ? $answer : EEM_Answer::instance()->create_default_object();
757
                    $qst_name = $qstn_id = $qst->ID();
758
                    $ans_id = $answer->ID();
759
                    $qst_name = ! empty($ans_id) ? '[' . $qst_name . '][' . $ans_id . ']' : '[' . $qst_name . ']';
760
                    $input_name = '';
761
                    $input_id = sanitize_key($qst->display_text());
762
                    $input_class = '';
763
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()] = $qst->model_field_array();
764
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_name'] = 'qstn'
765
                                                                                           . $input_name
766
                                                                                           . $qst_name;
767
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_id'] = $input_id . '-' . $qstn_id;
768
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_input_class'] = $input_class;
769
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_options'] = array();
770
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['qst_obj'] = $qst;
771
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['ans_obj'] = $answer;
772
                    //leave responses as-is, don't convert stuff into html entities please!
773
                    $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['htmlentities'] = false;
774
                    if ($qst->type() == 'RADIO_BTN' || $qst->type() == 'CHECKBOX' || $qst->type() == 'DROPDOWN') {
775
                        $QSOs = $qst->options(true, $answer->value());
776
                        if (is_array($QSOs)) {
777
                            foreach ($QSOs as $QSO_ID => $QSO) {
778
                                $questions[$qg->ID()]['QSG_questions'][$qst->ID()]['QST_options'][$QSO_ID] = $QSO->model_field_array();
779
                            }
780
                        }
781
                    }
782
                }
783
            }
784
        }
785
        return $questions;
786
    }
787
788
789
}
790
// End of file EEM_Event.model.php
791
// Location: /includes/models/EEM_Event.model.php
792