Completed
Branch EDTR/refactor-master (e18acd)
by
unknown
11:03 queued 02:08
created
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Indentation   +3690 added lines, -3690 removed lines patch added patch discarded remove patch
@@ -18,2227 +18,2227 @@  discard block
 block discarded – undo
18 18
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
19 19
 {
20 20
 
21
-    /**
22
-     * @var EE_Registration
23
-     */
24
-    private $_registration;
25
-
26
-    /**
27
-     * @var EE_Event
28
-     */
29
-    private $_reg_event;
30
-
31
-    /**
32
-     * @var EE_Session
33
-     */
34
-    private $_session;
35
-
36
-    private static $_reg_status;
37
-
38
-    /**
39
-     * Form for displaying the custom questions for this registration.
40
-     * This gets used a few times throughout the request so its best to cache it
41
-     *
42
-     * @var EE_Registration_Custom_Questions_Form
43
-     */
44
-    protected $_reg_custom_questions_form;
45
-
46
-    /**
47
-     * @var EEM_Registration $registration_model
48
-     */
49
-    private $registration_model;
50
-
51
-    /**
52
-     * @var EEM_Attendee $attendee_model
53
-     */
54
-    private $attendee_model;
55
-
56
-    /**
57
-     * @var EEM_Event $event_model
58
-     */
59
-    private $event_model;
60
-
61
-    /**
62
-     * @var EEM_Status $status_model
63
-     */
64
-    private $status_model;
65
-
66
-
67
-    /**
68
-     * @param bool $routing
69
-     * @throws EE_Error
70
-     * @throws InvalidArgumentException
71
-     * @throws InvalidDataTypeException
72
-     * @throws InvalidInterfaceException
73
-     * @throws ReflectionException
74
-     */
75
-    public function __construct($routing = true)
76
-    {
77
-        parent::__construct($routing);
78
-        add_action('wp_loaded', array($this, 'wp_loaded'));
79
-    }
80
-
81
-    /**
82
-     * @return EEM_Registration
83
-     * @throws InvalidArgumentException
84
-     * @throws InvalidDataTypeException
85
-     * @throws InvalidInterfaceException
86
-     * @since $VID:$
87
-     */
88
-    protected function getRegistrationModel()
89
-    {
90
-        if (! $this->registration_model instanceof EEM_Registration) {
91
-            $this->registration_model = $this->loader->getShared('EEM_Registration');
92
-        }
93
-        return $this->registration_model;
94
-    }
95
-
96
-    /**
97
-     * @return EEM_Attendee
98
-     * @throws InvalidArgumentException
99
-     * @throws InvalidDataTypeException
100
-     * @throws InvalidInterfaceException
101
-     * @since $VID:$
102
-     */
103
-    protected function getAttendeeModel()
104
-    {
105
-        if (! $this->attendee_model instanceof EEM_Attendee) {
106
-            $this->attendee_model = $this->loader->getShared('EEM_Attendee');
107
-        }
108
-        return $this->attendee_model;
109
-    }
110
-
111
-
112
-    /**
113
-     * @return EEM_Event
114
-     * @throws InvalidArgumentException
115
-     * @throws InvalidDataTypeException
116
-     * @throws InvalidInterfaceException
117
-     * @since $VID:$
118
-     */
119
-    protected function getEventModel()
120
-    {
121
-        if (! $this->event_model instanceof EEM_Event) {
122
-            $this->event_model = $this->loader->getShared('EEM_Event');
123
-        }
124
-        return $this->event_model;
125
-    }
126
-
127
-    /**
128
-     * @return EEM_Status
129
-     * @throws InvalidArgumentException
130
-     * @throws InvalidDataTypeException
131
-     * @throws InvalidInterfaceException
132
-     * @since $VID:$
133
-     */
134
-    protected function getStatusModel()
135
-    {
136
-        if (! $this->status_model instanceof EEM_Status) {
137
-            $this->status_model = $this->loader->getShared('EEM_Status');
138
-        }
139
-        return $this->status_model;
140
-    }
141
-
142
-
143
-    public function wp_loaded()
144
-    {
145
-        // when adding a new registration...
146
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147
-            EE_System::do_not_cache();
148
-            if (! isset($this->_req_data['processing_registration'])
149
-                || absint($this->_req_data['processing_registration']) !== 1
150
-            ) {
151
-                // and it's NOT the attendee information reg step
152
-                // force cookie expiration by setting time to last week
153
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
154
-                // and update the global
155
-                $_COOKIE['ee_registration_added'] = 0;
156
-            }
157
-        }
158
-    }
159
-
160
-
161
-    protected function _init_page_props()
162
-    {
163
-        $this->page_slug = REG_PG_SLUG;
164
-        $this->_admin_base_url = REG_ADMIN_URL;
165
-        $this->_admin_base_path = REG_ADMIN;
166
-        $this->page_label = esc_html__('Registrations', 'event_espresso');
167
-        $this->_cpt_routes = array(
168
-            'add_new_attendee' => 'espresso_attendees',
169
-            'edit_attendee'    => 'espresso_attendees',
170
-            'insert_attendee'  => 'espresso_attendees',
171
-            'update_attendee'  => 'espresso_attendees',
172
-        );
173
-        $this->_cpt_model_names = array(
174
-            'add_new_attendee' => 'EEM_Attendee',
175
-            'edit_attendee'    => 'EEM_Attendee',
176
-        );
177
-        $this->_cpt_edit_routes = array(
178
-            'espresso_attendees' => 'edit_attendee',
179
-        );
180
-        $this->_pagenow_map = array(
181
-            'add_new_attendee' => 'post-new.php',
182
-            'edit_attendee'    => 'post.php',
183
-            'trash'            => 'post.php',
184
-        );
185
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
186
-        // add filters so that the comment urls don't take users to a confusing 404 page
187
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
188
-    }
189
-
190
-
191
-    public function clear_comment_link($link, $comment, $args)
192
-    {
193
-        // gotta make sure this only happens on this route
194
-        $post_type = get_post_type($comment->comment_post_ID);
195
-        if ($post_type === 'espresso_attendees') {
196
-            return '#commentsdiv';
197
-        }
198
-        return $link;
199
-    }
200
-
201
-
202
-    protected function _ajax_hooks()
203
-    {
204
-        // todo: all hooks for registrations ajax goes in here
205
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
206
-    }
207
-
208
-
209
-    protected function _define_page_props()
210
-    {
211
-        $this->_admin_page_title = $this->page_label;
212
-        $this->_labels = array(
213
-            'buttons'                      => array(
214
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
215
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
216
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
217
-                'report'              => esc_html__('Event Registrations CSV Report', 'event_espresso'),
218
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
219
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
220
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
221
-                'contact_list_export' => esc_html__('Export Data', 'event_espresso'),
222
-            ),
223
-            'publishbox'                   => array(
224
-                'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'),
225
-                'edit_attendee'    => esc_html__('Update Contact Record', 'event_espresso'),
226
-            ),
227
-            'hide_add_button_on_cpt_route' => array(
228
-                'edit_attendee' => true,
229
-            ),
230
-        );
231
-    }
232
-
233
-
234
-    /**
235
-     *        grab url requests and route them
236
-     *
237
-     * @access private
238
-     * @return void
239
-     * @throws EE_Error
240
-     */
241
-    public function _set_page_routes()
242
-    {
243
-        $this->_get_registration_status_array();
244
-        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
245
-            ? $this->_req_data['_REG_ID'] : 0;
246
-        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
247
-            ? $this->_req_data['reg_status_change_form']['REG_ID']
248
-            : $reg_id;
249
-        $att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
250
-            ? $this->_req_data['ATT_ID'] : 0;
251
-        $att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
252
-            ? $this->_req_data['post']
253
-            : $att_id;
254
-        $this->_page_routes = array(
255
-            'default'                             => array(
256
-                'func'       => '_registrations_overview_list_table',
257
-                'capability' => 'ee_read_registrations',
258
-            ),
259
-            'view_registration'                   => array(
260
-                'func'       => '_registration_details',
261
-                'capability' => 'ee_read_registration',
262
-                'obj_id'     => $reg_id,
263
-            ),
264
-            'edit_registration'                   => array(
265
-                'func'               => '_update_attendee_registration_form',
266
-                'noheader'           => true,
267
-                'headers_sent_route' => 'view_registration',
268
-                'capability'         => 'ee_edit_registration',
269
-                'obj_id'             => $reg_id,
270
-                '_REG_ID'            => $reg_id,
271
-            ),
272
-            'trash_registrations'                 => array(
273
-                'func'       => '_trash_or_restore_registrations',
274
-                'args'       => array('trash' => true),
275
-                'noheader'   => true,
276
-                'capability' => 'ee_delete_registrations',
277
-            ),
278
-            'restore_registrations'               => array(
279
-                'func'       => '_trash_or_restore_registrations',
280
-                'args'       => array('trash' => false),
281
-                'noheader'   => true,
282
-                'capability' => 'ee_delete_registrations',
283
-            ),
284
-            'delete_registrations'                => array(
285
-                'func'       => '_delete_registrations',
286
-                'noheader'   => true,
287
-                'capability' => 'ee_delete_registrations',
288
-            ),
289
-            'new_registration'                    => array(
290
-                'func'       => 'new_registration',
291
-                'capability' => 'ee_edit_registrations',
292
-            ),
293
-            'process_reg_step'                    => array(
294
-                'func'       => 'process_reg_step',
295
-                'noheader'   => true,
296
-                'capability' => 'ee_edit_registrations',
297
-            ),
298
-            'redirect_to_txn'                     => array(
299
-                'func'       => 'redirect_to_txn',
300
-                'noheader'   => true,
301
-                'capability' => 'ee_edit_registrations',
302
-            ),
303
-            'change_reg_status'                   => array(
304
-                'func'       => '_change_reg_status',
305
-                'noheader'   => true,
306
-                'capability' => 'ee_edit_registration',
307
-                'obj_id'     => $reg_id,
308
-            ),
309
-            'approve_registration'                => array(
310
-                'func'       => 'approve_registration',
311
-                'noheader'   => true,
312
-                'capability' => 'ee_edit_registration',
313
-                'obj_id'     => $reg_id,
314
-            ),
315
-            'approve_and_notify_registration'     => array(
316
-                'func'       => 'approve_registration',
317
-                'noheader'   => true,
318
-                'args'       => array(true),
319
-                'capability' => 'ee_edit_registration',
320
-                'obj_id'     => $reg_id,
321
-            ),
322
-            'approve_registrations'               => array(
323
-                'func'       => 'bulk_action_on_registrations',
324
-                'noheader'   => true,
325
-                'capability' => 'ee_edit_registrations',
326
-                'args'       => array('approve'),
327
-            ),
328
-            'approve_and_notify_registrations'    => array(
329
-                'func'       => 'bulk_action_on_registrations',
330
-                'noheader'   => true,
331
-                'capability' => 'ee_edit_registrations',
332
-                'args'       => array('approve', true),
333
-            ),
334
-            'decline_registration'                => array(
335
-                'func'       => 'decline_registration',
336
-                'noheader'   => true,
337
-                'capability' => 'ee_edit_registration',
338
-                'obj_id'     => $reg_id,
339
-            ),
340
-            'decline_and_notify_registration'     => array(
341
-                'func'       => 'decline_registration',
342
-                'noheader'   => true,
343
-                'args'       => array(true),
344
-                'capability' => 'ee_edit_registration',
345
-                'obj_id'     => $reg_id,
346
-            ),
347
-            'decline_registrations'               => array(
348
-                'func'       => 'bulk_action_on_registrations',
349
-                'noheader'   => true,
350
-                'capability' => 'ee_edit_registrations',
351
-                'args'       => array('decline'),
352
-            ),
353
-            'decline_and_notify_registrations'    => array(
354
-                'func'       => 'bulk_action_on_registrations',
355
-                'noheader'   => true,
356
-                'capability' => 'ee_edit_registrations',
357
-                'args'       => array('decline', true),
358
-            ),
359
-            'pending_registration'                => array(
360
-                'func'       => 'pending_registration',
361
-                'noheader'   => true,
362
-                'capability' => 'ee_edit_registration',
363
-                'obj_id'     => $reg_id,
364
-            ),
365
-            'pending_and_notify_registration'     => array(
366
-                'func'       => 'pending_registration',
367
-                'noheader'   => true,
368
-                'args'       => array(true),
369
-                'capability' => 'ee_edit_registration',
370
-                'obj_id'     => $reg_id,
371
-            ),
372
-            'pending_registrations'               => array(
373
-                'func'       => 'bulk_action_on_registrations',
374
-                'noheader'   => true,
375
-                'capability' => 'ee_edit_registrations',
376
-                'args'       => array('pending'),
377
-            ),
378
-            'pending_and_notify_registrations'    => array(
379
-                'func'       => 'bulk_action_on_registrations',
380
-                'noheader'   => true,
381
-                'capability' => 'ee_edit_registrations',
382
-                'args'       => array('pending', true),
383
-            ),
384
-            'no_approve_registration'             => array(
385
-                'func'       => 'not_approve_registration',
386
-                'noheader'   => true,
387
-                'capability' => 'ee_edit_registration',
388
-                'obj_id'     => $reg_id,
389
-            ),
390
-            'no_approve_and_notify_registration'  => array(
391
-                'func'       => 'not_approve_registration',
392
-                'noheader'   => true,
393
-                'args'       => array(true),
394
-                'capability' => 'ee_edit_registration',
395
-                'obj_id'     => $reg_id,
396
-            ),
397
-            'no_approve_registrations'            => array(
398
-                'func'       => 'bulk_action_on_registrations',
399
-                'noheader'   => true,
400
-                'capability' => 'ee_edit_registrations',
401
-                'args'       => array('not_approve'),
402
-            ),
403
-            'no_approve_and_notify_registrations' => array(
404
-                'func'       => 'bulk_action_on_registrations',
405
-                'noheader'   => true,
406
-                'capability' => 'ee_edit_registrations',
407
-                'args'       => array('not_approve', true),
408
-            ),
409
-            'cancel_registration'                 => array(
410
-                'func'       => 'cancel_registration',
411
-                'noheader'   => true,
412
-                'capability' => 'ee_edit_registration',
413
-                'obj_id'     => $reg_id,
414
-            ),
415
-            'cancel_and_notify_registration'      => array(
416
-                'func'       => 'cancel_registration',
417
-                'noheader'   => true,
418
-                'args'       => array(true),
419
-                'capability' => 'ee_edit_registration',
420
-                'obj_id'     => $reg_id,
421
-            ),
422
-            'cancel_registrations'                => array(
423
-                'func'       => 'bulk_action_on_registrations',
424
-                'noheader'   => true,
425
-                'capability' => 'ee_edit_registrations',
426
-                'args'       => array('cancel'),
427
-            ),
428
-            'cancel_and_notify_registrations'     => array(
429
-                'func'       => 'bulk_action_on_registrations',
430
-                'noheader'   => true,
431
-                'capability' => 'ee_edit_registrations',
432
-                'args'       => array('cancel', true),
433
-            ),
434
-            'wait_list_registration'              => array(
435
-                'func'       => 'wait_list_registration',
436
-                'noheader'   => true,
437
-                'capability' => 'ee_edit_registration',
438
-                'obj_id'     => $reg_id,
439
-            ),
440
-            'wait_list_and_notify_registration'   => array(
441
-                'func'       => 'wait_list_registration',
442
-                'noheader'   => true,
443
-                'args'       => array(true),
444
-                'capability' => 'ee_edit_registration',
445
-                'obj_id'     => $reg_id,
446
-            ),
447
-            'contact_list'                        => array(
448
-                'func'       => '_attendee_contact_list_table',
449
-                'capability' => 'ee_read_contacts',
450
-            ),
451
-            'add_new_attendee'                    => array(
452
-                'func' => '_create_new_cpt_item',
453
-                'args' => array(
454
-                    'new_attendee' => true,
455
-                    'capability'   => 'ee_edit_contacts',
456
-                ),
457
-            ),
458
-            'edit_attendee'                       => array(
459
-                'func'       => '_edit_cpt_item',
460
-                'capability' => 'ee_edit_contacts',
461
-                'obj_id'     => $att_id,
462
-            ),
463
-            'duplicate_attendee'                  => array(
464
-                'func'       => '_duplicate_attendee',
465
-                'noheader'   => true,
466
-                'capability' => 'ee_edit_contacts',
467
-                'obj_id'     => $att_id,
468
-            ),
469
-            'insert_attendee'                     => array(
470
-                'func'       => '_insert_or_update_attendee',
471
-                'args'       => array(
472
-                    'new_attendee' => true,
473
-                ),
474
-                'noheader'   => true,
475
-                'capability' => 'ee_edit_contacts',
476
-            ),
477
-            'update_attendee'                     => array(
478
-                'func'       => '_insert_or_update_attendee',
479
-                'args'       => array(
480
-                    'new_attendee' => false,
481
-                ),
482
-                'noheader'   => true,
483
-                'capability' => 'ee_edit_contacts',
484
-                'obj_id'     => $att_id,
485
-            ),
486
-            'trash_attendees'                     => array(
487
-                'func'       => '_trash_or_restore_attendees',
488
-                'args'       => array(
489
-                    'trash' => 'true',
490
-                ),
491
-                'noheader'   => true,
492
-                'capability' => 'ee_delete_contacts',
493
-            ),
494
-            'trash_attendee'                      => array(
495
-                'func'       => '_trash_or_restore_attendees',
496
-                'args'       => array(
497
-                    'trash' => true,
498
-                ),
499
-                'noheader'   => true,
500
-                'capability' => 'ee_delete_contacts',
501
-                'obj_id'     => $att_id,
502
-            ),
503
-            'restore_attendees'                   => array(
504
-                'func'       => '_trash_or_restore_attendees',
505
-                'args'       => array(
506
-                    'trash' => false,
507
-                ),
508
-                'noheader'   => true,
509
-                'capability' => 'ee_delete_contacts',
510
-                'obj_id'     => $att_id,
511
-            ),
512
-            'resend_registration'                 => array(
513
-                'func'       => '_resend_registration',
514
-                'noheader'   => true,
515
-                'capability' => 'ee_send_message',
516
-            ),
517
-            'registrations_report'                => array(
518
-                'func'       => '_registrations_report',
519
-                'noheader'   => true,
520
-                'capability' => 'ee_read_registrations',
521
-            ),
522
-            'contact_list_export'                 => array(
523
-                'func'       => '_contact_list_export',
524
-                'noheader'   => true,
525
-                'capability' => 'export',
526
-            ),
527
-            'contact_list_report'                 => array(
528
-                'func'       => '_contact_list_report',
529
-                'noheader'   => true,
530
-                'capability' => 'ee_read_contacts',
531
-            ),
532
-        );
533
-    }
534
-
535
-
536
-    protected function _set_page_config()
537
-    {
538
-        $this->_page_config = array(
539
-            'default'           => array(
540
-                'nav'           => array(
541
-                    'label' => esc_html__('Overview', 'event_espresso'),
542
-                    'order' => 5,
543
-                ),
544
-                'help_tabs'     => array(
545
-                    'registrations_overview_help_tab'                       => array(
546
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
547
-                        'filename' => 'registrations_overview',
548
-                    ),
549
-                    'registrations_overview_table_column_headings_help_tab' => array(
550
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
551
-                        'filename' => 'registrations_overview_table_column_headings',
552
-                    ),
553
-                    'registrations_overview_filters_help_tab'               => array(
554
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
555
-                        'filename' => 'registrations_overview_filters',
556
-                    ),
557
-                    'registrations_overview_views_help_tab'                 => array(
558
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
559
-                        'filename' => 'registrations_overview_views',
560
-                    ),
561
-                    'registrations_regoverview_other_help_tab'              => array(
562
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
563
-                        'filename' => 'registrations_overview_other',
564
-                    ),
565
-                ),
566
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
567
-                'qtips'         => array('Registration_List_Table_Tips'),
568
-                'list_table'    => 'EE_Registrations_List_Table',
569
-                'require_nonce' => false,
570
-            ),
571
-            'view_registration' => array(
572
-                'nav'           => array(
573
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
574
-                    'order'      => 15,
575
-                    'url'        => isset($this->_req_data['_REG_ID'])
576
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
577
-                        : $this->_admin_base_url,
578
-                    'persistent' => false,
579
-                ),
580
-                'help_tabs'     => array(
581
-                    'registrations_details_help_tab'                    => array(
582
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
583
-                        'filename' => 'registrations_details',
584
-                    ),
585
-                    'registrations_details_table_help_tab'              => array(
586
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
587
-                        'filename' => 'registrations_details_table',
588
-                    ),
589
-                    'registrations_details_form_answers_help_tab'       => array(
590
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
591
-                        'filename' => 'registrations_details_form_answers',
592
-                    ),
593
-                    'registrations_details_registrant_details_help_tab' => array(
594
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
595
-                        'filename' => 'registrations_details_registrant_details',
596
-                    ),
597
-                ),
598
-                'help_tour'     => array('Registration_Details_Help_Tour'),
599
-                'metaboxes'     => array_merge(
600
-                    $this->_default_espresso_metaboxes,
601
-                    array('_registration_details_metaboxes')
602
-                ),
603
-                'require_nonce' => false,
604
-            ),
605
-            'new_registration'  => array(
606
-                'nav'           => array(
607
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
608
-                    'url'        => '#',
609
-                    'order'      => 15,
610
-                    'persistent' => false,
611
-                ),
612
-                'metaboxes'     => $this->_default_espresso_metaboxes,
613
-                'labels'        => array(
614
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
615
-                ),
616
-                'require_nonce' => false,
617
-            ),
618
-            'add_new_attendee'  => array(
619
-                'nav'           => array(
620
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
621
-                    'order'      => 15,
622
-                    'persistent' => false,
623
-                ),
624
-                'metaboxes'     => array_merge(
625
-                    $this->_default_espresso_metaboxes,
626
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
627
-                ),
628
-                'require_nonce' => false,
629
-            ),
630
-            'edit_attendee'     => array(
631
-                'nav'           => array(
632
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
633
-                    'order'      => 15,
634
-                    'persistent' => false,
635
-                    'url'        => isset($this->_req_data['ATT_ID'])
636
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
637
-                        : $this->_admin_base_url,
638
-                ),
639
-                'metaboxes'     => array('attendee_editor_metaboxes'),
640
-                'require_nonce' => false,
641
-            ),
642
-            'contact_list'      => array(
643
-                'nav'           => array(
644
-                    'label' => esc_html__('Contact List', 'event_espresso'),
645
-                    'order' => 20,
646
-                ),
647
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
648
-                'help_tabs'     => array(
649
-                    'registrations_contact_list_help_tab'                       => array(
650
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
651
-                        'filename' => 'registrations_contact_list',
652
-                    ),
653
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
654
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
655
-                        'filename' => 'registrations_contact_list_table_column_headings',
656
-                    ),
657
-                    'registrations_contact_list_views_help_tab'                 => array(
658
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
659
-                        'filename' => 'registrations_contact_list_views',
660
-                    ),
661
-                    'registrations_contact_list_other_help_tab'                 => array(
662
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
663
-                        'filename' => 'registrations_contact_list_other',
664
-                    ),
665
-                ),
666
-                'help_tour'     => array('Contact_List_Help_Tour'),
667
-                'metaboxes'     => array(),
668
-                'require_nonce' => false,
669
-            ),
670
-            // override default cpt routes
671
-            'create_new'        => '',
672
-            'edit'              => '',
673
-        );
674
-    }
675
-
676
-
677
-    /**
678
-     * The below methods aren't used by this class currently
679
-     */
680
-    protected function _add_screen_options()
681
-    {
682
-    }
683
-
684
-
685
-    protected function _add_feature_pointers()
686
-    {
687
-    }
688
-
689
-
690
-    public function admin_init()
691
-    {
692
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
693
-            'click "Update Registration Questions" to save your changes',
694
-            'event_espresso'
695
-        );
696
-    }
697
-
698
-
699
-    public function admin_notices()
700
-    {
701
-    }
702
-
703
-
704
-    public function admin_footer_scripts()
705
-    {
706
-    }
707
-
708
-
709
-    /**
710
-     *        get list of registration statuses
711
-     *
712
-     * @access private
713
-     * @return void
714
-     * @throws EE_Error
715
-     */
716
-    private function _get_registration_status_array()
717
-    {
718
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
719
-    }
720
-
721
-
722
-    /**
723
-     * @throws InvalidArgumentException
724
-     * @throws InvalidDataTypeException
725
-     * @throws InvalidInterfaceException
726
-     * @since $VID:$
727
-     */
728
-    protected function _add_screen_options_default()
729
-    {
730
-        $this->_per_page_screen_option();
731
-    }
732
-
733
-
734
-    /**
735
-     * @throws InvalidArgumentException
736
-     * @throws InvalidDataTypeException
737
-     * @throws InvalidInterfaceException
738
-     * @since $VID:$
739
-     */
740
-    protected function _add_screen_options_contact_list()
741
-    {
742
-        $page_title = $this->_admin_page_title;
743
-        $this->_admin_page_title = esc_html__('Contacts', 'event_espresso');
744
-        $this->_per_page_screen_option();
745
-        $this->_admin_page_title = $page_title;
746
-    }
747
-
748
-
749
-    public function load_scripts_styles()
750
-    {
751
-        // style
752
-        wp_register_style(
753
-            'espresso_reg',
754
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
755
-            array('ee-admin-css'),
756
-            EVENT_ESPRESSO_VERSION
757
-        );
758
-        wp_enqueue_style('espresso_reg');
759
-        // script
760
-        wp_register_script(
761
-            'espresso_reg',
762
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
763
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764
-            EVENT_ESPRESSO_VERSION,
765
-            true
766
-        );
767
-        wp_enqueue_script('espresso_reg');
768
-    }
769
-
770
-
771
-    /**
772
-     * @throws EE_Error
773
-     * @throws InvalidArgumentException
774
-     * @throws InvalidDataTypeException
775
-     * @throws InvalidInterfaceException
776
-     * @throws ReflectionException
777
-     * @since $VID:$
778
-     */
779
-    public function load_scripts_styles_edit_attendee()
780
-    {
781
-        // stuff to only show up on our attendee edit details page.
782
-        $attendee_details_translations = array(
783
-            'att_publish_text' => sprintf(
784
-                /* translators: The date and time */
785
-                wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
-                '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
787
-            ),
788
-        );
789
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
790
-        wp_enqueue_script('jquery-validate');
791
-    }
792
-
793
-
794
-    /**
795
-     * @throws EE_Error
796
-     * @throws InvalidArgumentException
797
-     * @throws InvalidDataTypeException
798
-     * @throws InvalidInterfaceException
799
-     * @throws ReflectionException
800
-     * @since $VID:$
801
-     */
802
-    public function load_scripts_styles_view_registration()
803
-    {
804
-        // styles
805
-        wp_enqueue_style('espresso-ui-theme');
806
-        // scripts
807
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
808
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
809
-    }
810
-
811
-
812
-    public function load_scripts_styles_contact_list()
813
-    {
814
-        wp_dequeue_style('espresso_reg');
815
-        wp_register_style(
816
-            'espresso_att',
817
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
818
-            array('ee-admin-css'),
819
-            EVENT_ESPRESSO_VERSION
820
-        );
821
-        wp_enqueue_style('espresso_att');
822
-    }
823
-
824
-
825
-    public function load_scripts_styles_new_registration()
826
-    {
827
-        wp_register_script(
828
-            'ee-spco-for-admin',
829
-            REG_ASSETS_URL . 'spco_for_admin.js',
830
-            array('underscore', 'jquery'),
831
-            EVENT_ESPRESSO_VERSION,
832
-            true
833
-        );
834
-        wp_enqueue_script('ee-spco-for-admin');
835
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
836
-        EE_Form_Section_Proper::wp_enqueue_scripts();
837
-        EED_Ticket_Selector::load_tckt_slctr_assets();
838
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
839
-    }
840
-
841
-
842
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
843
-    {
844
-        add_filter('FHEE_load_EE_messages', '__return_true');
845
-    }
846
-
847
-
848
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
849
-    {
850
-        add_filter('FHEE_load_EE_messages', '__return_true');
851
-    }
852
-
853
-
854
-    /**
855
-     * @throws EE_Error
856
-     * @throws InvalidArgumentException
857
-     * @throws InvalidDataTypeException
858
-     * @throws InvalidInterfaceException
859
-     * @throws ReflectionException
860
-     * @since $VID:$
861
-     */
862
-    protected function _set_list_table_views_default()
863
-    {
864
-        // for notification related bulk actions we need to make sure only active messengers have an option.
865
-        EED_Messages::set_autoloaders();
866
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
867
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
868
-        $active_mts = $message_resource_manager->list_of_active_message_types();
869
-        // key= bulk_action_slug, value= message type.
870
-        $match_array = array(
871
-            'approve_registrations'    => 'registration',
872
-            'decline_registrations'    => 'declined_registration',
873
-            'pending_registrations'    => 'pending_approval',
874
-            'no_approve_registrations' => 'not_approved_registration',
875
-            'cancel_registrations'     => 'cancelled_registration',
876
-        );
877
-        $can_send = EE_Registry::instance()->CAP->current_user_can(
878
-            'ee_send_message',
879
-            'batch_send_messages'
880
-        );
881
-        /** setup reg status bulk actions **/
882
-        $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
883
-        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
884
-            $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
885
-                'Approve and Notify Registrations',
886
-                'event_espresso'
887
-            );
888
-        }
889
-        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
890
-        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
891
-            $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
892
-                'Decline and Notify Registrations',
893
-                'event_espresso'
894
-            );
895
-        }
896
-        $def_reg_status_actions['pending_registrations'] = esc_html__(
897
-            'Set Registrations to Pending Payment',
898
-            'event_espresso'
899
-        );
900
-        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
901
-            $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
902
-                'Set Registrations to Pending Payment and Notify',
903
-                'event_espresso'
904
-            );
905
-        }
906
-        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
907
-            'Set Registrations to Not Approved',
908
-            'event_espresso'
909
-        );
910
-        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
911
-            $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
912
-                'Set Registrations to Not Approved and Notify',
913
-                'event_espresso'
914
-            );
915
-        }
916
-        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
917
-        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
918
-            $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
919
-                'Cancel Registrations and Notify',
920
-                'event_espresso'
921
-            );
922
-        }
923
-        $def_reg_status_actions = apply_filters(
924
-            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
925
-            $def_reg_status_actions,
926
-            $active_mts,
927
-            $can_send
928
-        );
929
-
930
-        $this->_views = array(
931
-            'all'   => array(
932
-                'slug'        => 'all',
933
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
934
-                'count'       => 0,
935
-                'bulk_action' => array_merge(
936
-                    $def_reg_status_actions,
937
-                    array(
938
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
939
-                    )
940
-                ),
941
-            ),
942
-            'month' => array(
943
-                'slug'        => 'month',
944
-                'label'       => esc_html__('This Month', 'event_espresso'),
945
-                'count'       => 0,
946
-                'bulk_action' => array_merge(
947
-                    $def_reg_status_actions,
948
-                    array(
949
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
950
-                    )
951
-                ),
952
-            ),
953
-            'today' => array(
954
-                'slug'        => 'today',
955
-                'label'       => sprintf(
956
-                    esc_html__('Today - %s', 'event_espresso'),
957
-                    date('M d, Y', current_time('timestamp'))
958
-                ),
959
-                'count'       => 0,
960
-                'bulk_action' => array_merge(
961
-                    $def_reg_status_actions,
962
-                    array(
963
-                        'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
964
-                    )
965
-                ),
966
-            ),
967
-        );
968
-        if (EE_Registry::instance()->CAP->current_user_can(
969
-            'ee_delete_registrations',
970
-            'espresso_registrations_delete_registration'
971
-        )) {
972
-            $this->_views['incomplete'] = array(
973
-                'slug'        => 'incomplete',
974
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
975
-                'count'       => 0,
976
-                'bulk_action' => array(
977
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
978
-                ),
979
-            );
980
-            $this->_views['trash'] = array(
981
-                'slug'        => 'trash',
982
-                'label'       => esc_html__('Trash', 'event_espresso'),
983
-                'count'       => 0,
984
-                'bulk_action' => array(
985
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
986
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
987
-                ),
988
-            );
989
-        }
990
-    }
991
-
992
-
993
-    protected function _set_list_table_views_contact_list()
994
-    {
995
-        $this->_views = array(
996
-            'in_use' => array(
997
-                'slug'        => 'in_use',
998
-                'label'       => esc_html__('In Use', 'event_espresso'),
999
-                'count'       => 0,
1000
-                'bulk_action' => array(
1001
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
1002
-                ),
1003
-            ),
1004
-        );
1005
-        if (EE_Registry::instance()->CAP->current_user_can(
1006
-            'ee_delete_contacts',
1007
-            'espresso_registrations_trash_attendees'
1008
-        )
1009
-        ) {
1010
-            $this->_views['trash'] = array(
1011
-                'slug'        => 'trash',
1012
-                'label'       => esc_html__('Trash', 'event_espresso'),
1013
-                'count'       => 0,
1014
-                'bulk_action' => array(
1015
-                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
1016
-                ),
1017
-            );
1018
-        }
1019
-    }
1020
-
1021
-
1022
-    protected function _registration_legend_items()
1023
-    {
1024
-        $fc_items = array(
1025
-            'star-icon'        => array(
1026
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1027
-                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
1028
-            ),
1029
-            'view_details'     => array(
1030
-                'class' => 'dashicons dashicons-clipboard',
1031
-                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
1032
-            ),
1033
-            'edit_attendee'    => array(
1034
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
1035
-                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
1036
-            ),
1037
-            'view_transaction' => array(
1038
-                'class' => 'dashicons dashicons-cart',
1039
-                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
1040
-            ),
1041
-            'view_invoice'     => array(
1042
-                'class' => 'dashicons dashicons-media-spreadsheet',
1043
-                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
1044
-            ),
1045
-        );
1046
-        if (EE_Registry::instance()->CAP->current_user_can(
1047
-            'ee_send_message',
1048
-            'espresso_registrations_resend_registration'
1049
-        )) {
1050
-            $fc_items['resend_registration'] = array(
1051
-                'class' => 'dashicons dashicons-email-alt',
1052
-                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
1053
-            );
1054
-        } else {
1055
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
1056
-        }
1057
-        if (EE_Registry::instance()->CAP->current_user_can(
1058
-            'ee_read_global_messages',
1059
-            'view_filtered_messages'
1060
-        )) {
1061
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
1062
-            if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) {
1063
-                $fc_items['view_related_messages'] = array(
1064
-                    'class' => $related_for_icon['css_class'],
1065
-                    'desc'  => $related_for_icon['label'],
1066
-                );
1067
-            }
1068
-        }
1069
-        $sc_items = array(
1070
-            'approved_status'   => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1072
-                'desc'  => EEH_Template::pretty_status(
1073
-                    EEM_Registration::status_id_approved,
1074
-                    false,
1075
-                    'sentence'
1076
-                ),
1077
-            ),
1078
-            'pending_status'    => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1080
-                'desc'  => EEH_Template::pretty_status(
1081
-                    EEM_Registration::status_id_pending_payment,
1082
-                    false,
1083
-                    'sentence'
1084
-                ),
1085
-            ),
1086
-            'wait_list'         => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1088
-                'desc'  => EEH_Template::pretty_status(
1089
-                    EEM_Registration::status_id_wait_list,
1090
-                    false,
1091
-                    'sentence'
1092
-                ),
1093
-            ),
1094
-            'incomplete_status' => array(
1095
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1096
-                'desc'  => EEH_Template::pretty_status(
1097
-                    EEM_Registration::status_id_incomplete,
1098
-                    false,
1099
-                    'sentence'
1100
-                ),
1101
-            ),
1102
-            'not_approved'      => array(
1103
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1104
-                'desc'  => EEH_Template::pretty_status(
1105
-                    EEM_Registration::status_id_not_approved,
1106
-                    false,
1107
-                    'sentence'
1108
-                ),
1109
-            ),
1110
-            'declined_status'   => array(
1111
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1112
-                'desc'  => EEH_Template::pretty_status(
1113
-                    EEM_Registration::status_id_declined,
1114
-                    false,
1115
-                    'sentence'
1116
-                ),
1117
-            ),
1118
-            'cancelled_status'  => array(
1119
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1120
-                'desc'  => EEH_Template::pretty_status(
1121
-                    EEM_Registration::status_id_cancelled,
1122
-                    false,
1123
-                    'sentence'
1124
-                ),
1125
-            ),
1126
-        );
1127
-        return array_merge($fc_items, $sc_items);
1128
-    }
1129
-
1130
-
1131
-
1132
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
1133
-
1134
-
1135
-
1136
-    /**
1137
-     * @throws DomainException
1138
-     * @throws EE_Error
1139
-     * @throws InvalidArgumentException
1140
-     * @throws InvalidDataTypeException
1141
-     * @throws InvalidInterfaceException
1142
-     * @throws ReflectionException
1143
-     */
1144
-    protected function _registrations_overview_list_table()
1145
-    {
1146
-        $this->appendAddNewRegistrationButtonToPageTitle();
1147
-        $header_text = '';
1148
-        $admin_page_header_decorators = [
1149
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader',
1150
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader',
1151
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader',
1152
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader',
1153
-        ];
1154
-        foreach ($admin_page_header_decorators as $admin_page_header_decorator) {
1155
-            $filter_header_decorator = $this->loader->getNew($admin_page_header_decorator);
1156
-            $header_text = $filter_header_decorator->getHeaderText($header_text);
1157
-        }
1158
-        $this->_template_args['admin_page_header'] = $header_text;
1159
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1160
-        $this->display_admin_list_table_page_with_no_sidebar();
1161
-    }
1162
-
1163
-
1164
-    /**
1165
-     * @throws EE_Error
1166
-     * @throws InvalidArgumentException
1167
-     * @throws InvalidDataTypeException
1168
-     * @throws InvalidInterfaceException
1169
-     */
1170
-    private function appendAddNewRegistrationButtonToPageTitle()
1171
-    {
1172
-        $EVT_ID = ! empty($this->_req_data['event_id'])
1173
-            ? absint($this->_req_data['event_id'])
1174
-            : 0;
1175
-        if ($EVT_ID
1176
-            && EE_Registry::instance()->CAP->current_user_can(
1177
-                'ee_edit_registrations',
1178
-                'espresso_registrations_new_registration',
1179
-                $EVT_ID
1180
-            )
1181
-        ) {
1182
-            $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1183
-                'new_registration',
1184
-                'add-registrant',
1185
-                array('event_id' => $EVT_ID),
1186
-                'add-new-h2'
1187
-            );
1188
-        }
1189
-    }
1190
-
1191
-
1192
-    /**
1193
-     * This sets the _registration property for the registration details screen
1194
-     *
1195
-     * @access private
1196
-     * @return bool
1197
-     * @throws EE_Error
1198
-     * @throws InvalidArgumentException
1199
-     * @throws InvalidDataTypeException
1200
-     * @throws InvalidInterfaceException
1201
-     */
1202
-    private function _set_registration_object()
1203
-    {
1204
-        // get out if we've already set the object
1205
-        if ($this->_registration instanceof EE_Registration) {
1206
-            return true;
1207
-        }
1208
-        $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209
-        if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210
-            return true;
1211
-        }
1212
-        $error_msg = sprintf(
1213
-            esc_html__(
1214
-                'An error occurred and the details for Registration ID #%s could not be retrieved.',
1215
-                'event_espresso'
1216
-            ),
1217
-            $REG_ID
1218
-        );
1219
-        EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1220
-        $this->_registration = null;
1221
-        return false;
1222
-    }
1223
-
1224
-
1225
-    /**
1226
-     * Used to retrieve registrations for the list table.
1227
-     *
1228
-     * @param int  $per_page
1229
-     * @param bool $count
1230
-     * @param bool $this_month
1231
-     * @param bool $today
1232
-     * @return EE_Registration[]|int
1233
-     * @throws EE_Error
1234
-     * @throws InvalidArgumentException
1235
-     * @throws InvalidDataTypeException
1236
-     * @throws InvalidInterfaceException
1237
-     */
1238
-    public function get_registrations(
1239
-        $per_page = 10,
1240
-        $count = false,
1241
-        $this_month = false,
1242
-        $today = false
1243
-    ) {
1244
-        if ($this_month) {
1245
-            $this->_req_data['status'] = 'month';
1246
-        }
1247
-        if ($today) {
1248
-            $this->_req_data['status'] = 'today';
1249
-        }
1250
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1251
-        /**
1252
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1253
-         *
1254
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1255
-         * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1256
-         *                             or if you have the development copy of EE you can view this at the path:
1257
-         *                             /docs/G--Model-System/model-query-params.md
1258
-         */
1259
-        $query_params['group_by'] = '';
1260
-
1261
-        return $count
1262
-            ? $this->getRegistrationModel()->count($query_params)
1263
-            /** @type EE_Registration[] */
1264
-            : $this->getRegistrationModel()->get_all($query_params);
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1270
-     * Note: this listens to values on the request for some of the query parameters.
1271
-     *
1272
-     * @param array $request
1273
-     * @param int   $per_page
1274
-     * @param bool  $count
1275
-     * @return array
1276
-     * @throws EE_Error
1277
-     * @throws InvalidArgumentException
1278
-     * @throws InvalidDataTypeException
1279
-     * @throws InvalidInterfaceException
1280
-     */
1281
-    protected function _get_registration_query_parameters(
1282
-        $request = array(),
1283
-        $per_page = 10,
1284
-        $count = false
1285
-    ) {
1286
-        /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287
-        $list_table_query_builder = $this->loader->getNew(
1288
-            'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
-            [ $request ]
1290
-        );
1291
-        return $list_table_query_builder->getQueryParams($per_page, $count);
1292
-    }
1293
-
1294
-
1295
-    public function get_registration_status_array()
1296
-    {
1297
-        return self::$_reg_status;
1298
-    }
1299
-
1300
-
1301
-
1302
-
1303
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1304
-    /**
1305
-     *        generates HTML for the View Registration Details Admin page
1306
-     *
1307
-     * @access protected
1308
-     * @return void
1309
-     * @throws DomainException
1310
-     * @throws EE_Error
1311
-     * @throws InvalidArgumentException
1312
-     * @throws InvalidDataTypeException
1313
-     * @throws InvalidInterfaceException
1314
-     * @throws EntityNotFoundException
1315
-     * @throws ReflectionException
1316
-     */
1317
-    protected function _registration_details()
1318
-    {
1319
-        $this->_template_args = array();
1320
-        $this->_set_registration_object();
1321
-        if (is_object($this->_registration)) {
1322
-            $transaction = $this->_registration->transaction()
1323
-                ? $this->_registration->transaction()
1324
-                : EE_Transaction::new_instance();
1325
-            $this->_session = $transaction->session_data();
1326
-            $event_id = $this->_registration->event_ID();
1327
-            $this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1328
-            $this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1329
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1330
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1331
-            $this->_template_args['grand_total'] = $transaction->total();
1332
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1333
-            // link back to overview
1334
-            $this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1335
-            $this->_template_args['registration'] = $this->_registration;
1336
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1337
-                array(
1338
-                    'action'   => 'default',
1339
-                    'event_id' => $event_id,
1340
-                ),
1341
-                REG_ADMIN_URL
1342
-            );
1343
-            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1344
-                array(
1345
-                    'action' => 'default',
1346
-                    'EVT_ID' => $event_id,
1347
-                    'page'   => 'espresso_transactions',
1348
-                ),
1349
-                admin_url('admin.php')
1350
-            );
1351
-            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1352
-                array(
1353
-                    'page'   => 'espresso_events',
1354
-                    'action' => 'edit',
1355
-                    'post'   => $event_id,
1356
-                ),
1357
-                admin_url('admin.php')
1358
-            );
1359
-            // next and previous links
1360
-            $next_reg = $this->_registration->next(
1361
-                null,
1362
-                array(),
1363
-                'REG_ID'
1364
-            );
1365
-            $this->_template_args['next_registration'] = $next_reg
1366
-                ? $this->_next_link(
1367
-                    EE_Admin_Page::add_query_args_and_nonce(
1368
-                        array(
1369
-                            'action'  => 'view_registration',
1370
-                            '_REG_ID' => $next_reg['REG_ID'],
1371
-                        ),
1372
-                        REG_ADMIN_URL
1373
-                    ),
1374
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1375
-                )
1376
-                : '';
1377
-            $previous_reg = $this->_registration->previous(
1378
-                null,
1379
-                array(),
1380
-                'REG_ID'
1381
-            );
1382
-            $this->_template_args['previous_registration'] = $previous_reg
1383
-                ? $this->_previous_link(
1384
-                    EE_Admin_Page::add_query_args_and_nonce(
1385
-                        array(
1386
-                            'action'  => 'view_registration',
1387
-                            '_REG_ID' => $previous_reg['REG_ID'],
1388
-                        ),
1389
-                        REG_ADMIN_URL
1390
-                    ),
1391
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1392
-                )
1393
-                : '';
1394
-            // grab header
1395
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1396
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
1397
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398
-                $template_path,
1399
-                $this->_template_args,
1400
-                true
1401
-            );
1402
-        } else {
1403
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1404
-        }
1405
-        // the details template wrapper
1406
-        $this->display_admin_page_with_sidebar();
1407
-    }
1408
-
1409
-
1410
-    /**
1411
-     * @throws EE_Error
1412
-     * @throws InvalidArgumentException
1413
-     * @throws InvalidDataTypeException
1414
-     * @throws InvalidInterfaceException
1415
-     * @throws ReflectionException
1416
-     * @since $VID:$
1417
-     */
1418
-    protected function _registration_details_metaboxes()
1419
-    {
1420
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1421
-        $this->_set_registration_object();
1422
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1423
-        add_meta_box(
1424
-            'edit-reg-status-mbox',
1425
-            esc_html__('Registration Status', 'event_espresso'),
1426
-            array($this, 'set_reg_status_buttons_metabox'),
1427
-            $this->wp_page_slug,
1428
-            'normal',
1429
-            'high'
1430
-        );
1431
-        add_meta_box(
1432
-            'edit-reg-details-mbox',
1433
-            esc_html__('Registration Details', 'event_espresso'),
1434
-            array($this, '_reg_details_meta_box'),
1435
-            $this->wp_page_slug,
1436
-            'normal',
1437
-            'high'
1438
-        );
1439
-        if ($attendee instanceof EE_Attendee
1440
-            && EE_Registry::instance()->CAP->current_user_can(
1441
-                'ee_read_registration',
1442
-                'edit-reg-questions-mbox',
1443
-                $this->_registration->ID()
1444
-            )
1445
-        ) {
1446
-            add_meta_box(
1447
-                'edit-reg-questions-mbox',
1448
-                esc_html__('Registration Form Answers', 'event_espresso'),
1449
-                array($this, '_reg_questions_meta_box'),
1450
-                $this->wp_page_slug,
1451
-                'normal',
1452
-                'high'
1453
-            );
1454
-        }
1455
-        add_meta_box(
1456
-            'edit-reg-registrant-mbox',
1457
-            esc_html__('Contact Details', 'event_espresso'),
1458
-            array($this, '_reg_registrant_side_meta_box'),
1459
-            $this->wp_page_slug,
1460
-            'side',
1461
-            'high'
1462
-        );
1463
-        if ($this->_registration->group_size() > 1) {
1464
-            add_meta_box(
1465
-                'edit-reg-attendees-mbox',
1466
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1467
-                array($this, '_reg_attendees_meta_box'),
1468
-                $this->wp_page_slug,
1469
-                'normal',
1470
-                'high'
1471
-            );
1472
-        }
1473
-    }
1474
-
1475
-
1476
-    /**
1477
-     * set_reg_status_buttons_metabox
1478
-     *
1479
-     * @access protected
1480
-     * @return string
1481
-     * @throws EE_Error
1482
-     * @throws EntityNotFoundException
1483
-     * @throws InvalidArgumentException
1484
-     * @throws InvalidDataTypeException
1485
-     * @throws InvalidInterfaceException
1486
-     * @throws ReflectionException
1487
-     */
1488
-    public function set_reg_status_buttons_metabox()
1489
-    {
1490
-        $this->_set_registration_object();
1491
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1492
-        echo $change_reg_status_form->form_open(
1493
-            self::add_query_args_and_nonce(
1494
-                array(
1495
-                    'action' => 'change_reg_status',
1496
-                ),
1497
-                REG_ADMIN_URL
1498
-            )
1499
-        );
1500
-        echo $change_reg_status_form->get_html();
1501
-        echo $change_reg_status_form->form_close();
1502
-    }
1503
-
1504
-
1505
-    /**
1506
-     * @return EE_Form_Section_Proper
1507
-     * @throws EE_Error
1508
-     * @throws InvalidArgumentException
1509
-     * @throws InvalidDataTypeException
1510
-     * @throws InvalidInterfaceException
1511
-     * @throws EntityNotFoundException
1512
-     * @throws ReflectionException
1513
-     */
1514
-    protected function _generate_reg_status_change_form()
1515
-    {
1516
-        $reg_status_change_form_array = array(
1517
-            'name'            => 'reg_status_change_form',
1518
-            'html_id'         => 'reg-status-change-form',
1519
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1520
-            'subsections'     => array(
1521
-                'return'             => new EE_Hidden_Input(
1522
-                    array(
1523
-                        'name'    => 'return',
1524
-                        'default' => 'view_registration',
1525
-                    )
1526
-                ),
1527
-                'REG_ID'             => new EE_Hidden_Input(
1528
-                    array(
1529
-                        'name'    => 'REG_ID',
1530
-                        'default' => $this->_registration->ID(),
1531
-                    )
1532
-                ),
1533
-                'current_status'     => new EE_Form_Section_HTML(
1534
-                    EEH_HTML::table(
1535
-                        EEH_HTML::tr(
1536
-                            EEH_HTML::th(
1537
-                                EEH_HTML::label(
1538
-                                    EEH_HTML::strong(
1539
-                                        esc_html__('Current Registration Status', 'event_espresso')
1540
-                                    )
1541
-                                )
1542
-                            )
1543
-                            . EEH_HTML::td(
1544
-                                EEH_HTML::strong(
1545
-                                    $this->_registration->pretty_status(),
1546
-                                    '',
1547
-                                    'status-' . $this->_registration->status_ID(),
1548
-                                    'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549
-                                )
1550
-                            )
1551
-                        )
1552
-                    )
1553
-                )
1554
-            )
1555
-        );
1556
-        if (EE_Registry::instance()->CAP->current_user_can(
1557
-            'ee_edit_registration',
1558
-            'toggle_registration_status',
1559
-            $this->_registration->ID()
1560
-        )) {
1561
-            $reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1562
-                $this->_get_reg_statuses(),
1563
-                array(
1564
-                    'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1565
-                    'default'         => $this->_registration->status_ID(),
1566
-                )
1567
-            );
1568
-            $reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1569
-                array(
1570
-                    'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1571
-                    'default'         => false,
1572
-                    'html_help_text'  => esc_html__(
1573
-                        'If set to "Yes", then the related messages will be sent to the registrant.',
1574
-                        'event_espresso'
1575
-                    )
1576
-                )
1577
-            );
1578
-            $reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1579
-                array(
1580
-                    'html_class'      => 'button-primary',
1581
-                    'html_label_text' => '&nbsp;',
1582
-                    'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1583
-                )
1584
-            );
1585
-        }
1586
-        return new EE_Form_Section_Proper($reg_status_change_form_array);
1587
-    }
1588
-
1589
-
1590
-    /**
1591
-     * Returns an array of all the buttons for the various statuses and switch status actions
1592
-     *
1593
-     * @return array
1594
-     * @throws EE_Error
1595
-     * @throws InvalidArgumentException
1596
-     * @throws InvalidDataTypeException
1597
-     * @throws InvalidInterfaceException
1598
-     * @throws EntityNotFoundException
1599
-     */
1600
-    protected function _get_reg_statuses()
1601
-    {
1602
-        $reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1604
-        // get current reg status
1605
-        $current_status = $this->_registration->status_ID();
1606
-        // is registration for free event? This will determine whether to display the pending payment option
1607
-        if ($current_status !== EEM_Registration::status_id_pending_payment
1608
-            && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609
-        ) {
1610
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1611
-        }
1612
-        return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613
-    }
1614
-
1615
-
1616
-    /**
1617
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1618
-     *
1619
-     * @param bool $status REG status given for changing registrations to.
1620
-     * @param bool $notify Whether to send messages notifications or not.
1621
-     * @return array (array with reg_id(s) updated and whether update was successful.
1622
-     * @throws DomainException
1623
-     * @throws EE_Error
1624
-     * @throws EntityNotFoundException
1625
-     * @throws InvalidArgumentException
1626
-     * @throws InvalidDataTypeException
1627
-     * @throws InvalidInterfaceException
1628
-     * @throws ReflectionException
1629
-     * @throws RuntimeException
1630
-     */
1631
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1632
-    {
1633
-        if (isset($this->_req_data['reg_status_change_form'])) {
1634
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1635
-                ? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1636
-                : array();
1637
-        } else {
1638
-            $REG_IDs = isset($this->_req_data['_REG_ID'])
1639
-                ? (array) $this->_req_data['_REG_ID']
1640
-                : array();
1641
-        }
1642
-        // sanitize $REG_IDs
1643
-        $REG_IDs = array_map('absint', $REG_IDs);
1644
-        // and remove empty entries
1645
-        $REG_IDs = array_filter($REG_IDs);
1646
-
1647
-        $result = $this->_set_registration_status($REG_IDs, $status, $notify);
1648
-
1649
-        /**
1650
-         * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1651
-         * Currently this value is used downstream by the _process_resend_registration method.
1652
-         *
1653
-         * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1654
-         * @param bool                     $status           The status registrations were changed to.
1655
-         * @param bool                     $success          If the status was changed successfully for all registrations.
1656
-         * @param Registrations_Admin_Page $admin_page_object
1657
-         */
1658
-        $this->_req_data['_REG_ID'] = apply_filters(
1659
-            'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1660
-            $result['REG_ID'],
1661
-            $status,
1662
-            $result['success'],
1663
-            $this
1664
-        );
1665
-
1666
-        // notify?
1667
-        if ($notify
1668
-            && $result['success']
1669
-            && ! empty($this->_req_data['_REG_ID'])
1670
-            && EE_Registry::instance()->CAP->current_user_can(
1671
-                'ee_send_message',
1672
-                'espresso_registrations_resend_registration'
1673
-            )
1674
-        ) {
1675
-            $this->_process_resend_registration();
1676
-        }
1677
-        return $result;
1678
-    }
1679
-
1680
-
1681
-    /**
1682
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1683
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1684
-     *
1685
-     * @param array  $REG_IDs
1686
-     * @param string $status
1687
-     * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1688
-     *                        slug sent with setting the registration status.
1689
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1690
-     * @throws EE_Error
1691
-     * @throws InvalidArgumentException
1692
-     * @throws InvalidDataTypeException
1693
-     * @throws InvalidInterfaceException
1694
-     * @throws ReflectionException
1695
-     * @throws RuntimeException
1696
-     * @throws EntityNotFoundException
1697
-     * @throws DomainException
1698
-     */
1699
-    protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1700
-    {
1701
-        $success = false;
1702
-        // typecast $REG_IDs
1703
-        $REG_IDs = (array) $REG_IDs;
1704
-        if (! empty($REG_IDs)) {
1705
-            $success = true;
1706
-            // set default status if none is passed
1707
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1708
-            $status_context = $notify
1709
-                ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1710
-                : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1711
-            // loop through REG_ID's and change status
1712
-            foreach ($REG_IDs as $REG_ID) {
1713
-                $registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
1714
-                if ($registration instanceof EE_Registration) {
1715
-                    $registration->set_status(
1716
-                        $status,
1717
-                        false,
1718
-                        new Context(
1719
-                            $status_context,
1720
-                            esc_html__(
1721
-                                'Manually triggered status change on a Registration Admin Page route.',
1722
-                                'event_espresso'
1723
-                            )
1724
-                        )
1725
-                    );
1726
-                    $result = $registration->save();
1727
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1728
-                    $success = $result !== false ? $success : false;
1729
-                }
1730
-            }
1731
-        }
1732
-
1733
-        // return $success and processed registrations
1734
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1735
-    }
1736
-
1737
-
1738
-    /**
1739
-     * Common logic for setting up success message and redirecting to appropriate route
1740
-     *
1741
-     * @param string $STS_ID status id for the registration changed to
1742
-     * @param bool   $notify indicates whether the _set_registration_status_from_request does notifications or not.
1743
-     * @return void
1744
-     * @throws DomainException
1745
-     * @throws EE_Error
1746
-     * @throws EntityNotFoundException
1747
-     * @throws InvalidArgumentException
1748
-     * @throws InvalidDataTypeException
1749
-     * @throws InvalidInterfaceException
1750
-     * @throws ReflectionException
1751
-     * @throws RuntimeException
1752
-     */
1753
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1754
-    {
1755
-        $result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1756
-            : array('success' => false);
1757
-        $success = isset($result['success']) && $result['success'];
1758
-        // setup success message
1759
-        if ($success) {
1760
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1761
-                $msg = sprintf(
1762
-                    esc_html__('Registration status has been set to %s', 'event_espresso'),
1763
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
1764
-                );
1765
-            } else {
1766
-                $msg = sprintf(
1767
-                    esc_html__('Registrations have been set to %s.', 'event_espresso'),
1768
-                    EEH_Template::pretty_status($STS_ID, false, 'lower')
1769
-                );
1770
-            }
1771
-            EE_Error::add_success($msg);
1772
-        } else {
1773
-            EE_Error::add_error(
1774
-                esc_html__(
1775
-                    'Something went wrong, and the status was not changed',
1776
-                    'event_espresso'
1777
-                ),
1778
-                __FILE__,
1779
-                __LINE__,
1780
-                __FUNCTION__
1781
-            );
1782
-        }
1783
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') {
1784
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1785
-        } else {
1786
-            $route = array('action' => 'default');
1787
-        }
1788
-        $route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
1789
-        $this->_redirect_after_action($success, '', '', $route, true);
1790
-    }
1791
-
1792
-
1793
-    /**
1794
-     * incoming reg status change from reg details page.
1795
-     *
1796
-     * @return void
1797
-     * @throws EE_Error
1798
-     * @throws EntityNotFoundException
1799
-     * @throws InvalidArgumentException
1800
-     * @throws InvalidDataTypeException
1801
-     * @throws InvalidInterfaceException
1802
-     * @throws ReflectionException
1803
-     * @throws RuntimeException
1804
-     * @throws DomainException
1805
-     */
1806
-    protected function _change_reg_status()
1807
-    {
1808
-        $this->_req_data['return'] = 'view_registration';
1809
-        // set notify based on whether the send notifications toggle is set or not
1810
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1811
-        // $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1812
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1813
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1814
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1815
-            case EEM_Registration::status_id_approved:
1816
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
1817
-                $this->approve_registration($notify);
1818
-                break;
1819
-            case EEM_Registration::status_id_pending_payment:
1820
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
1821
-                $this->pending_registration($notify);
1822
-                break;
1823
-            case EEM_Registration::status_id_not_approved:
1824
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
1825
-                $this->not_approve_registration($notify);
1826
-                break;
1827
-            case EEM_Registration::status_id_declined:
1828
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
1829
-                $this->decline_registration($notify);
1830
-                break;
1831
-            case EEM_Registration::status_id_cancelled:
1832
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
1833
-                $this->cancel_registration($notify);
1834
-                break;
1835
-            case EEM_Registration::status_id_wait_list:
1836
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
1837
-                $this->wait_list_registration($notify);
1838
-                break;
1839
-            case EEM_Registration::status_id_incomplete:
1840
-            default:
1841
-                $result['success'] = false;
1842
-                unset($this->_req_data['return']);
1843
-                $this->_reg_status_change_return('', false);
1844
-                break;
1845
-        }
1846
-    }
1847
-
1848
-
1849
-    /**
1850
-     * Callback for bulk action routes.
1851
-     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1852
-     * method was chosen so there is one central place all the registration status bulk actions are going through.
1853
-     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1854
-     * when an action is happening on just a single registration).
1855
-     *
1856
-     * @param      $action
1857
-     * @param bool $notify
1858
-     */
1859
-    protected function bulk_action_on_registrations($action, $notify = false)
1860
-    {
1861
-        do_action(
1862
-            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1863
-            $this,
1864
-            $action,
1865
-            $notify
1866
-        );
1867
-        $method = $action . '_registration';
1868
-        if (method_exists($this, $method)) {
1869
-            $this->$method($notify);
1870
-        }
1871
-    }
1872
-
1873
-
1874
-    /**
1875
-     * approve_registration
1876
-     *
1877
-     * @access protected
1878
-     * @param bool $notify whether or not to notify the registrant about their approval.
1879
-     * @return void
1880
-     * @throws EE_Error
1881
-     * @throws EntityNotFoundException
1882
-     * @throws InvalidArgumentException
1883
-     * @throws InvalidDataTypeException
1884
-     * @throws InvalidInterfaceException
1885
-     * @throws ReflectionException
1886
-     * @throws RuntimeException
1887
-     * @throws DomainException
1888
-     */
1889
-    protected function approve_registration($notify = false)
1890
-    {
1891
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1892
-    }
1893
-
1894
-
1895
-    /**
1896
-     *        decline_registration
1897
-     *
1898
-     * @access protected
1899
-     * @param bool $notify whether or not to notify the registrant about their status change.
1900
-     * @return void
1901
-     * @throws EE_Error
1902
-     * @throws EntityNotFoundException
1903
-     * @throws InvalidArgumentException
1904
-     * @throws InvalidDataTypeException
1905
-     * @throws InvalidInterfaceException
1906
-     * @throws ReflectionException
1907
-     * @throws RuntimeException
1908
-     * @throws DomainException
1909
-     */
1910
-    protected function decline_registration($notify = false)
1911
-    {
1912
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1913
-    }
1914
-
1915
-
1916
-    /**
1917
-     *        cancel_registration
1918
-     *
1919
-     * @access protected
1920
-     * @param bool $notify whether or not to notify the registrant about their status change.
1921
-     * @return void
1922
-     * @throws EE_Error
1923
-     * @throws EntityNotFoundException
1924
-     * @throws InvalidArgumentException
1925
-     * @throws InvalidDataTypeException
1926
-     * @throws InvalidInterfaceException
1927
-     * @throws ReflectionException
1928
-     * @throws RuntimeException
1929
-     * @throws DomainException
1930
-     */
1931
-    protected function cancel_registration($notify = false)
1932
-    {
1933
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1934
-    }
1935
-
1936
-
1937
-    /**
1938
-     *        not_approve_registration
1939
-     *
1940
-     * @access protected
1941
-     * @param bool $notify whether or not to notify the registrant about their status change.
1942
-     * @return void
1943
-     * @throws EE_Error
1944
-     * @throws EntityNotFoundException
1945
-     * @throws InvalidArgumentException
1946
-     * @throws InvalidDataTypeException
1947
-     * @throws InvalidInterfaceException
1948
-     * @throws ReflectionException
1949
-     * @throws RuntimeException
1950
-     * @throws DomainException
1951
-     */
1952
-    protected function not_approve_registration($notify = false)
1953
-    {
1954
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1955
-    }
1956
-
1957
-
1958
-    /**
1959
-     *        decline_registration
1960
-     *
1961
-     * @access protected
1962
-     * @param bool $notify whether or not to notify the registrant about their status change.
1963
-     * @return void
1964
-     * @throws EE_Error
1965
-     * @throws EntityNotFoundException
1966
-     * @throws InvalidArgumentException
1967
-     * @throws InvalidDataTypeException
1968
-     * @throws InvalidInterfaceException
1969
-     * @throws ReflectionException
1970
-     * @throws RuntimeException
1971
-     * @throws DomainException
1972
-     */
1973
-    protected function pending_registration($notify = false)
1974
-    {
1975
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1976
-    }
1977
-
1978
-
1979
-    /**
1980
-     * waitlist_registration
1981
-     *
1982
-     * @access protected
1983
-     * @param bool $notify whether or not to notify the registrant about their status change.
1984
-     * @return void
1985
-     * @throws EE_Error
1986
-     * @throws EntityNotFoundException
1987
-     * @throws InvalidArgumentException
1988
-     * @throws InvalidDataTypeException
1989
-     * @throws InvalidInterfaceException
1990
-     * @throws ReflectionException
1991
-     * @throws RuntimeException
1992
-     * @throws DomainException
1993
-     */
1994
-    protected function wait_list_registration($notify = false)
1995
-    {
1996
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1997
-    }
1998
-
1999
-
2000
-    /**
2001
-     *        generates HTML for the Registration main meta box
2002
-     *
2003
-     * @access public
2004
-     * @return void
2005
-     * @throws DomainException
2006
-     * @throws EE_Error
2007
-     * @throws InvalidArgumentException
2008
-     * @throws InvalidDataTypeException
2009
-     * @throws InvalidInterfaceException
2010
-     * @throws ReflectionException
2011
-     * @throws EntityNotFoundException
2012
-     */
2013
-    public function _reg_details_meta_box()
2014
-    {
2015
-        EEH_Autoloader::register_line_item_display_autoloaders();
2016
-        EEH_Autoloader::register_line_item_filter_autoloaders();
2017
-        EE_Registry::instance()->load_helper('Line_Item');
2018
-        $transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2019
-            : EE_Transaction::new_instance();
2020
-        $this->_session = $transaction->session_data();
2021
-        $filters = new EE_Line_Item_Filter_Collection();
2022
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2023
-        $filters->add(new EE_Non_Zero_Line_Item_Filter());
2024
-        $line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2025
-            $filters,
2026
-            $transaction->total_line_item()
2027
-        );
2028
-        $filtered_line_item_tree = $line_item_filter_processor->process();
2029
-        $line_item_display = new EE_Line_Item_Display(
2030
-            'reg_admin_table',
2031
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2032
-        );
2033
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2034
-            $filtered_line_item_tree,
2035
-            array('EE_Registration' => $this->_registration)
2036
-        );
2037
-        $attendee = $this->_registration->attendee();
2038
-        if (EE_Registry::instance()->CAP->current_user_can(
2039
-            'ee_read_transaction',
2040
-            'espresso_transactions_view_transaction'
2041
-        )) {
2042
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2043
-                EE_Admin_Page::add_query_args_and_nonce(
2044
-                    array(
2045
-                        'action' => 'view_transaction',
2046
-                        'TXN_ID' => $transaction->ID(),
2047
-                    ),
2048
-                    TXN_ADMIN_URL
2049
-                ),
2050
-                esc_html__(' View Transaction', 'event_espresso'),
2051
-                'button secondary-button right',
2052
-                'dashicons dashicons-cart'
2053
-            );
2054
-        } else {
2055
-            $this->_template_args['view_transaction_button'] = '';
2056
-        }
2057
-        if ($attendee instanceof EE_Attendee
2058
-            && EE_Registry::instance()->CAP->current_user_can(
2059
-                'ee_send_message',
2060
-                'espresso_registrations_resend_registration'
2061
-            )
2062
-        ) {
2063
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2064
-                EE_Admin_Page::add_query_args_and_nonce(
2065
-                    array(
2066
-                        'action'      => 'resend_registration',
2067
-                        '_REG_ID'     => $this->_registration->ID(),
2068
-                        'redirect_to' => 'view_registration',
2069
-                    ),
2070
-                    REG_ADMIN_URL
2071
-                ),
2072
-                esc_html__(' Resend Registration', 'event_espresso'),
2073
-                'button secondary-button right',
2074
-                'dashicons dashicons-email-alt'
2075
-            );
2076
-        } else {
2077
-            $this->_template_args['resend_registration_button'] = '';
2078
-        }
2079
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2080
-        $payment = $transaction->get_first_related('Payment');
2081
-        $payment = ! $payment instanceof EE_Payment
2082
-            ? EE_Payment::new_instance()
2083
-            : $payment;
2084
-        $payment_method = $payment->get_first_related('Payment_Method');
2085
-        $payment_method = ! $payment_method instanceof EE_Payment_Method
2086
-            ? EE_Payment_Method::new_instance()
2087
-            : $payment_method;
2088
-        $reg_details = array(
2089
-            'payment_method'       => $payment_method->name(),
2090
-            'response_msg'         => $payment->gateway_response(),
2091
-            'registration_id'      => $this->_registration->get('REG_code'),
2092
-            'registration_session' => $this->_registration->session_ID(),
2093
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2094
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2095
-        );
2096
-        if (isset($reg_details['registration_id'])) {
2097
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2098
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2099
-                'Registration ID',
2100
-                'event_espresso'
2101
-            );
2102
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2103
-        }
2104
-        if (isset($reg_details['payment_method'])) {
2105
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2106
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2107
-                'Most Recent Payment Method',
2108
-                'event_espresso'
2109
-            );
2110
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2111
-            $this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2112
-            $this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2113
-                'Payment method response',
2114
-                'event_espresso'
2115
-            );
2116
-            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2117
-        }
2118
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2119
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2120
-            'Registration Session',
2121
-            'event_espresso'
2122
-        );
2123
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2124
-        $this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2125
-        $this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2126
-            'Registration placed from IP',
2127
-            'event_espresso'
2128
-        );
2129
-        $this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2130
-        $this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2131
-        $this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2132
-            'Registrant User Agent',
2133
-            'event_espresso'
2134
-        );
2135
-        $this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2136
-        $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2137
-            array(
2138
-                'action'   => 'default',
2139
-                'event_id' => $this->_registration->event_ID(),
2140
-            ),
2141
-            REG_ADMIN_URL
2142
-        );
2143
-        $this->_template_args['REG_ID'] = $this->_registration->ID();
2144
-        $this->_template_args['event_id'] = $this->_registration->event_ID();
2145
-        $template_path =
2146
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2147
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148
-    }
2149
-
2150
-
2151
-    /**
2152
-     * generates HTML for the Registration Questions meta box.
2153
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2154
-     * otherwise uses new forms system
2155
-     *
2156
-     * @access public
2157
-     * @return void
2158
-     * @throws DomainException
2159
-     * @throws EE_Error
2160
-     * @throws InvalidArgumentException
2161
-     * @throws InvalidDataTypeException
2162
-     * @throws InvalidInterfaceException
2163
-     * @throws ReflectionException
2164
-     */
2165
-    public function _reg_questions_meta_box()
2166
-    {
2167
-        // allow someone to override this method entirely
2168
-        if (apply_filters(
2169
-            'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2170
-            true,
2171
-            $this,
2172
-            $this->_registration
2173
-        )) {
2174
-            $form = $this->_get_reg_custom_questions_form(
2175
-                $this->_registration->ID()
2176
-            );
2177
-            $this->_template_args['att_questions'] = count($form->subforms()) > 0
2178
-                ? $form->get_html_and_js()
2179
-                : '';
2180
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181
-            $this->_template_args['REG_ID'] = $this->_registration->ID();
2182
-            $template_path =
2183
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2184
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185
-        }
2186
-    }
2187
-
2188
-
2189
-    /**
2190
-     * form_before_question_group
2191
-     *
2192
-     * @deprecated    as of 4.8.32.rc.000
2193
-     * @access        public
2194
-     * @param        string $output
2195
-     * @return        string
2196
-     */
2197
-    public function form_before_question_group($output)
2198
-    {
2199
-        EE_Error::doing_it_wrong(
2200
-            __CLASS__ . '::' . __FUNCTION__,
2201
-            esc_html__(
2202
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2203
-                'event_espresso'
2204
-            ),
2205
-            '4.8.32.rc.000'
2206
-        );
2207
-        return '
21
+	/**
22
+	 * @var EE_Registration
23
+	 */
24
+	private $_registration;
25
+
26
+	/**
27
+	 * @var EE_Event
28
+	 */
29
+	private $_reg_event;
30
+
31
+	/**
32
+	 * @var EE_Session
33
+	 */
34
+	private $_session;
35
+
36
+	private static $_reg_status;
37
+
38
+	/**
39
+	 * Form for displaying the custom questions for this registration.
40
+	 * This gets used a few times throughout the request so its best to cache it
41
+	 *
42
+	 * @var EE_Registration_Custom_Questions_Form
43
+	 */
44
+	protected $_reg_custom_questions_form;
45
+
46
+	/**
47
+	 * @var EEM_Registration $registration_model
48
+	 */
49
+	private $registration_model;
50
+
51
+	/**
52
+	 * @var EEM_Attendee $attendee_model
53
+	 */
54
+	private $attendee_model;
55
+
56
+	/**
57
+	 * @var EEM_Event $event_model
58
+	 */
59
+	private $event_model;
60
+
61
+	/**
62
+	 * @var EEM_Status $status_model
63
+	 */
64
+	private $status_model;
65
+
66
+
67
+	/**
68
+	 * @param bool $routing
69
+	 * @throws EE_Error
70
+	 * @throws InvalidArgumentException
71
+	 * @throws InvalidDataTypeException
72
+	 * @throws InvalidInterfaceException
73
+	 * @throws ReflectionException
74
+	 */
75
+	public function __construct($routing = true)
76
+	{
77
+		parent::__construct($routing);
78
+		add_action('wp_loaded', array($this, 'wp_loaded'));
79
+	}
80
+
81
+	/**
82
+	 * @return EEM_Registration
83
+	 * @throws InvalidArgumentException
84
+	 * @throws InvalidDataTypeException
85
+	 * @throws InvalidInterfaceException
86
+	 * @since $VID:$
87
+	 */
88
+	protected function getRegistrationModel()
89
+	{
90
+		if (! $this->registration_model instanceof EEM_Registration) {
91
+			$this->registration_model = $this->loader->getShared('EEM_Registration');
92
+		}
93
+		return $this->registration_model;
94
+	}
95
+
96
+	/**
97
+	 * @return EEM_Attendee
98
+	 * @throws InvalidArgumentException
99
+	 * @throws InvalidDataTypeException
100
+	 * @throws InvalidInterfaceException
101
+	 * @since $VID:$
102
+	 */
103
+	protected function getAttendeeModel()
104
+	{
105
+		if (! $this->attendee_model instanceof EEM_Attendee) {
106
+			$this->attendee_model = $this->loader->getShared('EEM_Attendee');
107
+		}
108
+		return $this->attendee_model;
109
+	}
110
+
111
+
112
+	/**
113
+	 * @return EEM_Event
114
+	 * @throws InvalidArgumentException
115
+	 * @throws InvalidDataTypeException
116
+	 * @throws InvalidInterfaceException
117
+	 * @since $VID:$
118
+	 */
119
+	protected function getEventModel()
120
+	{
121
+		if (! $this->event_model instanceof EEM_Event) {
122
+			$this->event_model = $this->loader->getShared('EEM_Event');
123
+		}
124
+		return $this->event_model;
125
+	}
126
+
127
+	/**
128
+	 * @return EEM_Status
129
+	 * @throws InvalidArgumentException
130
+	 * @throws InvalidDataTypeException
131
+	 * @throws InvalidInterfaceException
132
+	 * @since $VID:$
133
+	 */
134
+	protected function getStatusModel()
135
+	{
136
+		if (! $this->status_model instanceof EEM_Status) {
137
+			$this->status_model = $this->loader->getShared('EEM_Status');
138
+		}
139
+		return $this->status_model;
140
+	}
141
+
142
+
143
+	public function wp_loaded()
144
+	{
145
+		// when adding a new registration...
146
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147
+			EE_System::do_not_cache();
148
+			if (! isset($this->_req_data['processing_registration'])
149
+				|| absint($this->_req_data['processing_registration']) !== 1
150
+			) {
151
+				// and it's NOT the attendee information reg step
152
+				// force cookie expiration by setting time to last week
153
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
154
+				// and update the global
155
+				$_COOKIE['ee_registration_added'] = 0;
156
+			}
157
+		}
158
+	}
159
+
160
+
161
+	protected function _init_page_props()
162
+	{
163
+		$this->page_slug = REG_PG_SLUG;
164
+		$this->_admin_base_url = REG_ADMIN_URL;
165
+		$this->_admin_base_path = REG_ADMIN;
166
+		$this->page_label = esc_html__('Registrations', 'event_espresso');
167
+		$this->_cpt_routes = array(
168
+			'add_new_attendee' => 'espresso_attendees',
169
+			'edit_attendee'    => 'espresso_attendees',
170
+			'insert_attendee'  => 'espresso_attendees',
171
+			'update_attendee'  => 'espresso_attendees',
172
+		);
173
+		$this->_cpt_model_names = array(
174
+			'add_new_attendee' => 'EEM_Attendee',
175
+			'edit_attendee'    => 'EEM_Attendee',
176
+		);
177
+		$this->_cpt_edit_routes = array(
178
+			'espresso_attendees' => 'edit_attendee',
179
+		);
180
+		$this->_pagenow_map = array(
181
+			'add_new_attendee' => 'post-new.php',
182
+			'edit_attendee'    => 'post.php',
183
+			'trash'            => 'post.php',
184
+		);
185
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
186
+		// add filters so that the comment urls don't take users to a confusing 404 page
187
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
188
+	}
189
+
190
+
191
+	public function clear_comment_link($link, $comment, $args)
192
+	{
193
+		// gotta make sure this only happens on this route
194
+		$post_type = get_post_type($comment->comment_post_ID);
195
+		if ($post_type === 'espresso_attendees') {
196
+			return '#commentsdiv';
197
+		}
198
+		return $link;
199
+	}
200
+
201
+
202
+	protected function _ajax_hooks()
203
+	{
204
+		// todo: all hooks for registrations ajax goes in here
205
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
206
+	}
207
+
208
+
209
+	protected function _define_page_props()
210
+	{
211
+		$this->_admin_page_title = $this->page_label;
212
+		$this->_labels = array(
213
+			'buttons'                      => array(
214
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
215
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
216
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
217
+				'report'              => esc_html__('Event Registrations CSV Report', 'event_espresso'),
218
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
219
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
220
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
221
+				'contact_list_export' => esc_html__('Export Data', 'event_espresso'),
222
+			),
223
+			'publishbox'                   => array(
224
+				'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'),
225
+				'edit_attendee'    => esc_html__('Update Contact Record', 'event_espresso'),
226
+			),
227
+			'hide_add_button_on_cpt_route' => array(
228
+				'edit_attendee' => true,
229
+			),
230
+		);
231
+	}
232
+
233
+
234
+	/**
235
+	 *        grab url requests and route them
236
+	 *
237
+	 * @access private
238
+	 * @return void
239
+	 * @throws EE_Error
240
+	 */
241
+	public function _set_page_routes()
242
+	{
243
+		$this->_get_registration_status_array();
244
+		$reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
245
+			? $this->_req_data['_REG_ID'] : 0;
246
+		$reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
247
+			? $this->_req_data['reg_status_change_form']['REG_ID']
248
+			: $reg_id;
249
+		$att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
250
+			? $this->_req_data['ATT_ID'] : 0;
251
+		$att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
252
+			? $this->_req_data['post']
253
+			: $att_id;
254
+		$this->_page_routes = array(
255
+			'default'                             => array(
256
+				'func'       => '_registrations_overview_list_table',
257
+				'capability' => 'ee_read_registrations',
258
+			),
259
+			'view_registration'                   => array(
260
+				'func'       => '_registration_details',
261
+				'capability' => 'ee_read_registration',
262
+				'obj_id'     => $reg_id,
263
+			),
264
+			'edit_registration'                   => array(
265
+				'func'               => '_update_attendee_registration_form',
266
+				'noheader'           => true,
267
+				'headers_sent_route' => 'view_registration',
268
+				'capability'         => 'ee_edit_registration',
269
+				'obj_id'             => $reg_id,
270
+				'_REG_ID'            => $reg_id,
271
+			),
272
+			'trash_registrations'                 => array(
273
+				'func'       => '_trash_or_restore_registrations',
274
+				'args'       => array('trash' => true),
275
+				'noheader'   => true,
276
+				'capability' => 'ee_delete_registrations',
277
+			),
278
+			'restore_registrations'               => array(
279
+				'func'       => '_trash_or_restore_registrations',
280
+				'args'       => array('trash' => false),
281
+				'noheader'   => true,
282
+				'capability' => 'ee_delete_registrations',
283
+			),
284
+			'delete_registrations'                => array(
285
+				'func'       => '_delete_registrations',
286
+				'noheader'   => true,
287
+				'capability' => 'ee_delete_registrations',
288
+			),
289
+			'new_registration'                    => array(
290
+				'func'       => 'new_registration',
291
+				'capability' => 'ee_edit_registrations',
292
+			),
293
+			'process_reg_step'                    => array(
294
+				'func'       => 'process_reg_step',
295
+				'noheader'   => true,
296
+				'capability' => 'ee_edit_registrations',
297
+			),
298
+			'redirect_to_txn'                     => array(
299
+				'func'       => 'redirect_to_txn',
300
+				'noheader'   => true,
301
+				'capability' => 'ee_edit_registrations',
302
+			),
303
+			'change_reg_status'                   => array(
304
+				'func'       => '_change_reg_status',
305
+				'noheader'   => true,
306
+				'capability' => 'ee_edit_registration',
307
+				'obj_id'     => $reg_id,
308
+			),
309
+			'approve_registration'                => array(
310
+				'func'       => 'approve_registration',
311
+				'noheader'   => true,
312
+				'capability' => 'ee_edit_registration',
313
+				'obj_id'     => $reg_id,
314
+			),
315
+			'approve_and_notify_registration'     => array(
316
+				'func'       => 'approve_registration',
317
+				'noheader'   => true,
318
+				'args'       => array(true),
319
+				'capability' => 'ee_edit_registration',
320
+				'obj_id'     => $reg_id,
321
+			),
322
+			'approve_registrations'               => array(
323
+				'func'       => 'bulk_action_on_registrations',
324
+				'noheader'   => true,
325
+				'capability' => 'ee_edit_registrations',
326
+				'args'       => array('approve'),
327
+			),
328
+			'approve_and_notify_registrations'    => array(
329
+				'func'       => 'bulk_action_on_registrations',
330
+				'noheader'   => true,
331
+				'capability' => 'ee_edit_registrations',
332
+				'args'       => array('approve', true),
333
+			),
334
+			'decline_registration'                => array(
335
+				'func'       => 'decline_registration',
336
+				'noheader'   => true,
337
+				'capability' => 'ee_edit_registration',
338
+				'obj_id'     => $reg_id,
339
+			),
340
+			'decline_and_notify_registration'     => array(
341
+				'func'       => 'decline_registration',
342
+				'noheader'   => true,
343
+				'args'       => array(true),
344
+				'capability' => 'ee_edit_registration',
345
+				'obj_id'     => $reg_id,
346
+			),
347
+			'decline_registrations'               => array(
348
+				'func'       => 'bulk_action_on_registrations',
349
+				'noheader'   => true,
350
+				'capability' => 'ee_edit_registrations',
351
+				'args'       => array('decline'),
352
+			),
353
+			'decline_and_notify_registrations'    => array(
354
+				'func'       => 'bulk_action_on_registrations',
355
+				'noheader'   => true,
356
+				'capability' => 'ee_edit_registrations',
357
+				'args'       => array('decline', true),
358
+			),
359
+			'pending_registration'                => array(
360
+				'func'       => 'pending_registration',
361
+				'noheader'   => true,
362
+				'capability' => 'ee_edit_registration',
363
+				'obj_id'     => $reg_id,
364
+			),
365
+			'pending_and_notify_registration'     => array(
366
+				'func'       => 'pending_registration',
367
+				'noheader'   => true,
368
+				'args'       => array(true),
369
+				'capability' => 'ee_edit_registration',
370
+				'obj_id'     => $reg_id,
371
+			),
372
+			'pending_registrations'               => array(
373
+				'func'       => 'bulk_action_on_registrations',
374
+				'noheader'   => true,
375
+				'capability' => 'ee_edit_registrations',
376
+				'args'       => array('pending'),
377
+			),
378
+			'pending_and_notify_registrations'    => array(
379
+				'func'       => 'bulk_action_on_registrations',
380
+				'noheader'   => true,
381
+				'capability' => 'ee_edit_registrations',
382
+				'args'       => array('pending', true),
383
+			),
384
+			'no_approve_registration'             => array(
385
+				'func'       => 'not_approve_registration',
386
+				'noheader'   => true,
387
+				'capability' => 'ee_edit_registration',
388
+				'obj_id'     => $reg_id,
389
+			),
390
+			'no_approve_and_notify_registration'  => array(
391
+				'func'       => 'not_approve_registration',
392
+				'noheader'   => true,
393
+				'args'       => array(true),
394
+				'capability' => 'ee_edit_registration',
395
+				'obj_id'     => $reg_id,
396
+			),
397
+			'no_approve_registrations'            => array(
398
+				'func'       => 'bulk_action_on_registrations',
399
+				'noheader'   => true,
400
+				'capability' => 'ee_edit_registrations',
401
+				'args'       => array('not_approve'),
402
+			),
403
+			'no_approve_and_notify_registrations' => array(
404
+				'func'       => 'bulk_action_on_registrations',
405
+				'noheader'   => true,
406
+				'capability' => 'ee_edit_registrations',
407
+				'args'       => array('not_approve', true),
408
+			),
409
+			'cancel_registration'                 => array(
410
+				'func'       => 'cancel_registration',
411
+				'noheader'   => true,
412
+				'capability' => 'ee_edit_registration',
413
+				'obj_id'     => $reg_id,
414
+			),
415
+			'cancel_and_notify_registration'      => array(
416
+				'func'       => 'cancel_registration',
417
+				'noheader'   => true,
418
+				'args'       => array(true),
419
+				'capability' => 'ee_edit_registration',
420
+				'obj_id'     => $reg_id,
421
+			),
422
+			'cancel_registrations'                => array(
423
+				'func'       => 'bulk_action_on_registrations',
424
+				'noheader'   => true,
425
+				'capability' => 'ee_edit_registrations',
426
+				'args'       => array('cancel'),
427
+			),
428
+			'cancel_and_notify_registrations'     => array(
429
+				'func'       => 'bulk_action_on_registrations',
430
+				'noheader'   => true,
431
+				'capability' => 'ee_edit_registrations',
432
+				'args'       => array('cancel', true),
433
+			),
434
+			'wait_list_registration'              => array(
435
+				'func'       => 'wait_list_registration',
436
+				'noheader'   => true,
437
+				'capability' => 'ee_edit_registration',
438
+				'obj_id'     => $reg_id,
439
+			),
440
+			'wait_list_and_notify_registration'   => array(
441
+				'func'       => 'wait_list_registration',
442
+				'noheader'   => true,
443
+				'args'       => array(true),
444
+				'capability' => 'ee_edit_registration',
445
+				'obj_id'     => $reg_id,
446
+			),
447
+			'contact_list'                        => array(
448
+				'func'       => '_attendee_contact_list_table',
449
+				'capability' => 'ee_read_contacts',
450
+			),
451
+			'add_new_attendee'                    => array(
452
+				'func' => '_create_new_cpt_item',
453
+				'args' => array(
454
+					'new_attendee' => true,
455
+					'capability'   => 'ee_edit_contacts',
456
+				),
457
+			),
458
+			'edit_attendee'                       => array(
459
+				'func'       => '_edit_cpt_item',
460
+				'capability' => 'ee_edit_contacts',
461
+				'obj_id'     => $att_id,
462
+			),
463
+			'duplicate_attendee'                  => array(
464
+				'func'       => '_duplicate_attendee',
465
+				'noheader'   => true,
466
+				'capability' => 'ee_edit_contacts',
467
+				'obj_id'     => $att_id,
468
+			),
469
+			'insert_attendee'                     => array(
470
+				'func'       => '_insert_or_update_attendee',
471
+				'args'       => array(
472
+					'new_attendee' => true,
473
+				),
474
+				'noheader'   => true,
475
+				'capability' => 'ee_edit_contacts',
476
+			),
477
+			'update_attendee'                     => array(
478
+				'func'       => '_insert_or_update_attendee',
479
+				'args'       => array(
480
+					'new_attendee' => false,
481
+				),
482
+				'noheader'   => true,
483
+				'capability' => 'ee_edit_contacts',
484
+				'obj_id'     => $att_id,
485
+			),
486
+			'trash_attendees'                     => array(
487
+				'func'       => '_trash_or_restore_attendees',
488
+				'args'       => array(
489
+					'trash' => 'true',
490
+				),
491
+				'noheader'   => true,
492
+				'capability' => 'ee_delete_contacts',
493
+			),
494
+			'trash_attendee'                      => array(
495
+				'func'       => '_trash_or_restore_attendees',
496
+				'args'       => array(
497
+					'trash' => true,
498
+				),
499
+				'noheader'   => true,
500
+				'capability' => 'ee_delete_contacts',
501
+				'obj_id'     => $att_id,
502
+			),
503
+			'restore_attendees'                   => array(
504
+				'func'       => '_trash_or_restore_attendees',
505
+				'args'       => array(
506
+					'trash' => false,
507
+				),
508
+				'noheader'   => true,
509
+				'capability' => 'ee_delete_contacts',
510
+				'obj_id'     => $att_id,
511
+			),
512
+			'resend_registration'                 => array(
513
+				'func'       => '_resend_registration',
514
+				'noheader'   => true,
515
+				'capability' => 'ee_send_message',
516
+			),
517
+			'registrations_report'                => array(
518
+				'func'       => '_registrations_report',
519
+				'noheader'   => true,
520
+				'capability' => 'ee_read_registrations',
521
+			),
522
+			'contact_list_export'                 => array(
523
+				'func'       => '_contact_list_export',
524
+				'noheader'   => true,
525
+				'capability' => 'export',
526
+			),
527
+			'contact_list_report'                 => array(
528
+				'func'       => '_contact_list_report',
529
+				'noheader'   => true,
530
+				'capability' => 'ee_read_contacts',
531
+			),
532
+		);
533
+	}
534
+
535
+
536
+	protected function _set_page_config()
537
+	{
538
+		$this->_page_config = array(
539
+			'default'           => array(
540
+				'nav'           => array(
541
+					'label' => esc_html__('Overview', 'event_espresso'),
542
+					'order' => 5,
543
+				),
544
+				'help_tabs'     => array(
545
+					'registrations_overview_help_tab'                       => array(
546
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
547
+						'filename' => 'registrations_overview',
548
+					),
549
+					'registrations_overview_table_column_headings_help_tab' => array(
550
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
551
+						'filename' => 'registrations_overview_table_column_headings',
552
+					),
553
+					'registrations_overview_filters_help_tab'               => array(
554
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
555
+						'filename' => 'registrations_overview_filters',
556
+					),
557
+					'registrations_overview_views_help_tab'                 => array(
558
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
559
+						'filename' => 'registrations_overview_views',
560
+					),
561
+					'registrations_regoverview_other_help_tab'              => array(
562
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
563
+						'filename' => 'registrations_overview_other',
564
+					),
565
+				),
566
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
567
+				'qtips'         => array('Registration_List_Table_Tips'),
568
+				'list_table'    => 'EE_Registrations_List_Table',
569
+				'require_nonce' => false,
570
+			),
571
+			'view_registration' => array(
572
+				'nav'           => array(
573
+					'label'      => esc_html__('REG Details', 'event_espresso'),
574
+					'order'      => 15,
575
+					'url'        => isset($this->_req_data['_REG_ID'])
576
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
577
+						: $this->_admin_base_url,
578
+					'persistent' => false,
579
+				),
580
+				'help_tabs'     => array(
581
+					'registrations_details_help_tab'                    => array(
582
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
583
+						'filename' => 'registrations_details',
584
+					),
585
+					'registrations_details_table_help_tab'              => array(
586
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
587
+						'filename' => 'registrations_details_table',
588
+					),
589
+					'registrations_details_form_answers_help_tab'       => array(
590
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
591
+						'filename' => 'registrations_details_form_answers',
592
+					),
593
+					'registrations_details_registrant_details_help_tab' => array(
594
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
595
+						'filename' => 'registrations_details_registrant_details',
596
+					),
597
+				),
598
+				'help_tour'     => array('Registration_Details_Help_Tour'),
599
+				'metaboxes'     => array_merge(
600
+					$this->_default_espresso_metaboxes,
601
+					array('_registration_details_metaboxes')
602
+				),
603
+				'require_nonce' => false,
604
+			),
605
+			'new_registration'  => array(
606
+				'nav'           => array(
607
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
608
+					'url'        => '#',
609
+					'order'      => 15,
610
+					'persistent' => false,
611
+				),
612
+				'metaboxes'     => $this->_default_espresso_metaboxes,
613
+				'labels'        => array(
614
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
615
+				),
616
+				'require_nonce' => false,
617
+			),
618
+			'add_new_attendee'  => array(
619
+				'nav'           => array(
620
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
621
+					'order'      => 15,
622
+					'persistent' => false,
623
+				),
624
+				'metaboxes'     => array_merge(
625
+					$this->_default_espresso_metaboxes,
626
+					array('_publish_post_box', 'attendee_editor_metaboxes')
627
+				),
628
+				'require_nonce' => false,
629
+			),
630
+			'edit_attendee'     => array(
631
+				'nav'           => array(
632
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
633
+					'order'      => 15,
634
+					'persistent' => false,
635
+					'url'        => isset($this->_req_data['ATT_ID'])
636
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
637
+						: $this->_admin_base_url,
638
+				),
639
+				'metaboxes'     => array('attendee_editor_metaboxes'),
640
+				'require_nonce' => false,
641
+			),
642
+			'contact_list'      => array(
643
+				'nav'           => array(
644
+					'label' => esc_html__('Contact List', 'event_espresso'),
645
+					'order' => 20,
646
+				),
647
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
648
+				'help_tabs'     => array(
649
+					'registrations_contact_list_help_tab'                       => array(
650
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
651
+						'filename' => 'registrations_contact_list',
652
+					),
653
+					'registrations_contact-list_table_column_headings_help_tab' => array(
654
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
655
+						'filename' => 'registrations_contact_list_table_column_headings',
656
+					),
657
+					'registrations_contact_list_views_help_tab'                 => array(
658
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
659
+						'filename' => 'registrations_contact_list_views',
660
+					),
661
+					'registrations_contact_list_other_help_tab'                 => array(
662
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
663
+						'filename' => 'registrations_contact_list_other',
664
+					),
665
+				),
666
+				'help_tour'     => array('Contact_List_Help_Tour'),
667
+				'metaboxes'     => array(),
668
+				'require_nonce' => false,
669
+			),
670
+			// override default cpt routes
671
+			'create_new'        => '',
672
+			'edit'              => '',
673
+		);
674
+	}
675
+
676
+
677
+	/**
678
+	 * The below methods aren't used by this class currently
679
+	 */
680
+	protected function _add_screen_options()
681
+	{
682
+	}
683
+
684
+
685
+	protected function _add_feature_pointers()
686
+	{
687
+	}
688
+
689
+
690
+	public function admin_init()
691
+	{
692
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
693
+			'click "Update Registration Questions" to save your changes',
694
+			'event_espresso'
695
+		);
696
+	}
697
+
698
+
699
+	public function admin_notices()
700
+	{
701
+	}
702
+
703
+
704
+	public function admin_footer_scripts()
705
+	{
706
+	}
707
+
708
+
709
+	/**
710
+	 *        get list of registration statuses
711
+	 *
712
+	 * @access private
713
+	 * @return void
714
+	 * @throws EE_Error
715
+	 */
716
+	private function _get_registration_status_array()
717
+	{
718
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
719
+	}
720
+
721
+
722
+	/**
723
+	 * @throws InvalidArgumentException
724
+	 * @throws InvalidDataTypeException
725
+	 * @throws InvalidInterfaceException
726
+	 * @since $VID:$
727
+	 */
728
+	protected function _add_screen_options_default()
729
+	{
730
+		$this->_per_page_screen_option();
731
+	}
732
+
733
+
734
+	/**
735
+	 * @throws InvalidArgumentException
736
+	 * @throws InvalidDataTypeException
737
+	 * @throws InvalidInterfaceException
738
+	 * @since $VID:$
739
+	 */
740
+	protected function _add_screen_options_contact_list()
741
+	{
742
+		$page_title = $this->_admin_page_title;
743
+		$this->_admin_page_title = esc_html__('Contacts', 'event_espresso');
744
+		$this->_per_page_screen_option();
745
+		$this->_admin_page_title = $page_title;
746
+	}
747
+
748
+
749
+	public function load_scripts_styles()
750
+	{
751
+		// style
752
+		wp_register_style(
753
+			'espresso_reg',
754
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
755
+			array('ee-admin-css'),
756
+			EVENT_ESPRESSO_VERSION
757
+		);
758
+		wp_enqueue_style('espresso_reg');
759
+		// script
760
+		wp_register_script(
761
+			'espresso_reg',
762
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
763
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764
+			EVENT_ESPRESSO_VERSION,
765
+			true
766
+		);
767
+		wp_enqueue_script('espresso_reg');
768
+	}
769
+
770
+
771
+	/**
772
+	 * @throws EE_Error
773
+	 * @throws InvalidArgumentException
774
+	 * @throws InvalidDataTypeException
775
+	 * @throws InvalidInterfaceException
776
+	 * @throws ReflectionException
777
+	 * @since $VID:$
778
+	 */
779
+	public function load_scripts_styles_edit_attendee()
780
+	{
781
+		// stuff to only show up on our attendee edit details page.
782
+		$attendee_details_translations = array(
783
+			'att_publish_text' => sprintf(
784
+				/* translators: The date and time */
785
+				wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
+				'<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
787
+			),
788
+		);
789
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
790
+		wp_enqueue_script('jquery-validate');
791
+	}
792
+
793
+
794
+	/**
795
+	 * @throws EE_Error
796
+	 * @throws InvalidArgumentException
797
+	 * @throws InvalidDataTypeException
798
+	 * @throws InvalidInterfaceException
799
+	 * @throws ReflectionException
800
+	 * @since $VID:$
801
+	 */
802
+	public function load_scripts_styles_view_registration()
803
+	{
804
+		// styles
805
+		wp_enqueue_style('espresso-ui-theme');
806
+		// scripts
807
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
808
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
809
+	}
810
+
811
+
812
+	public function load_scripts_styles_contact_list()
813
+	{
814
+		wp_dequeue_style('espresso_reg');
815
+		wp_register_style(
816
+			'espresso_att',
817
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
818
+			array('ee-admin-css'),
819
+			EVENT_ESPRESSO_VERSION
820
+		);
821
+		wp_enqueue_style('espresso_att');
822
+	}
823
+
824
+
825
+	public function load_scripts_styles_new_registration()
826
+	{
827
+		wp_register_script(
828
+			'ee-spco-for-admin',
829
+			REG_ASSETS_URL . 'spco_for_admin.js',
830
+			array('underscore', 'jquery'),
831
+			EVENT_ESPRESSO_VERSION,
832
+			true
833
+		);
834
+		wp_enqueue_script('ee-spco-for-admin');
835
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
836
+		EE_Form_Section_Proper::wp_enqueue_scripts();
837
+		EED_Ticket_Selector::load_tckt_slctr_assets();
838
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
839
+	}
840
+
841
+
842
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
843
+	{
844
+		add_filter('FHEE_load_EE_messages', '__return_true');
845
+	}
846
+
847
+
848
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
849
+	{
850
+		add_filter('FHEE_load_EE_messages', '__return_true');
851
+	}
852
+
853
+
854
+	/**
855
+	 * @throws EE_Error
856
+	 * @throws InvalidArgumentException
857
+	 * @throws InvalidDataTypeException
858
+	 * @throws InvalidInterfaceException
859
+	 * @throws ReflectionException
860
+	 * @since $VID:$
861
+	 */
862
+	protected function _set_list_table_views_default()
863
+	{
864
+		// for notification related bulk actions we need to make sure only active messengers have an option.
865
+		EED_Messages::set_autoloaders();
866
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
867
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
868
+		$active_mts = $message_resource_manager->list_of_active_message_types();
869
+		// key= bulk_action_slug, value= message type.
870
+		$match_array = array(
871
+			'approve_registrations'    => 'registration',
872
+			'decline_registrations'    => 'declined_registration',
873
+			'pending_registrations'    => 'pending_approval',
874
+			'no_approve_registrations' => 'not_approved_registration',
875
+			'cancel_registrations'     => 'cancelled_registration',
876
+		);
877
+		$can_send = EE_Registry::instance()->CAP->current_user_can(
878
+			'ee_send_message',
879
+			'batch_send_messages'
880
+		);
881
+		/** setup reg status bulk actions **/
882
+		$def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
883
+		if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
884
+			$def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
885
+				'Approve and Notify Registrations',
886
+				'event_espresso'
887
+			);
888
+		}
889
+		$def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
890
+		if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
891
+			$def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
892
+				'Decline and Notify Registrations',
893
+				'event_espresso'
894
+			);
895
+		}
896
+		$def_reg_status_actions['pending_registrations'] = esc_html__(
897
+			'Set Registrations to Pending Payment',
898
+			'event_espresso'
899
+		);
900
+		if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
901
+			$def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
902
+				'Set Registrations to Pending Payment and Notify',
903
+				'event_espresso'
904
+			);
905
+		}
906
+		$def_reg_status_actions['no_approve_registrations'] = esc_html__(
907
+			'Set Registrations to Not Approved',
908
+			'event_espresso'
909
+		);
910
+		if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
911
+			$def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
912
+				'Set Registrations to Not Approved and Notify',
913
+				'event_espresso'
914
+			);
915
+		}
916
+		$def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
917
+		if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
918
+			$def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
919
+				'Cancel Registrations and Notify',
920
+				'event_espresso'
921
+			);
922
+		}
923
+		$def_reg_status_actions = apply_filters(
924
+			'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
925
+			$def_reg_status_actions,
926
+			$active_mts,
927
+			$can_send
928
+		);
929
+
930
+		$this->_views = array(
931
+			'all'   => array(
932
+				'slug'        => 'all',
933
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
934
+				'count'       => 0,
935
+				'bulk_action' => array_merge(
936
+					$def_reg_status_actions,
937
+					array(
938
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
939
+					)
940
+				),
941
+			),
942
+			'month' => array(
943
+				'slug'        => 'month',
944
+				'label'       => esc_html__('This Month', 'event_espresso'),
945
+				'count'       => 0,
946
+				'bulk_action' => array_merge(
947
+					$def_reg_status_actions,
948
+					array(
949
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
950
+					)
951
+				),
952
+			),
953
+			'today' => array(
954
+				'slug'        => 'today',
955
+				'label'       => sprintf(
956
+					esc_html__('Today - %s', 'event_espresso'),
957
+					date('M d, Y', current_time('timestamp'))
958
+				),
959
+				'count'       => 0,
960
+				'bulk_action' => array_merge(
961
+					$def_reg_status_actions,
962
+					array(
963
+						'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
964
+					)
965
+				),
966
+			),
967
+		);
968
+		if (EE_Registry::instance()->CAP->current_user_can(
969
+			'ee_delete_registrations',
970
+			'espresso_registrations_delete_registration'
971
+		)) {
972
+			$this->_views['incomplete'] = array(
973
+				'slug'        => 'incomplete',
974
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
975
+				'count'       => 0,
976
+				'bulk_action' => array(
977
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
978
+				),
979
+			);
980
+			$this->_views['trash'] = array(
981
+				'slug'        => 'trash',
982
+				'label'       => esc_html__('Trash', 'event_espresso'),
983
+				'count'       => 0,
984
+				'bulk_action' => array(
985
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
986
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
987
+				),
988
+			);
989
+		}
990
+	}
991
+
992
+
993
+	protected function _set_list_table_views_contact_list()
994
+	{
995
+		$this->_views = array(
996
+			'in_use' => array(
997
+				'slug'        => 'in_use',
998
+				'label'       => esc_html__('In Use', 'event_espresso'),
999
+				'count'       => 0,
1000
+				'bulk_action' => array(
1001
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
1002
+				),
1003
+			),
1004
+		);
1005
+		if (EE_Registry::instance()->CAP->current_user_can(
1006
+			'ee_delete_contacts',
1007
+			'espresso_registrations_trash_attendees'
1008
+		)
1009
+		) {
1010
+			$this->_views['trash'] = array(
1011
+				'slug'        => 'trash',
1012
+				'label'       => esc_html__('Trash', 'event_espresso'),
1013
+				'count'       => 0,
1014
+				'bulk_action' => array(
1015
+					'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
1016
+				),
1017
+			);
1018
+		}
1019
+	}
1020
+
1021
+
1022
+	protected function _registration_legend_items()
1023
+	{
1024
+		$fc_items = array(
1025
+			'star-icon'        => array(
1026
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
1027
+				'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
1028
+			),
1029
+			'view_details'     => array(
1030
+				'class' => 'dashicons dashicons-clipboard',
1031
+				'desc'  => esc_html__('View Registration Details', 'event_espresso'),
1032
+			),
1033
+			'edit_attendee'    => array(
1034
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
1035
+				'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
1036
+			),
1037
+			'view_transaction' => array(
1038
+				'class' => 'dashicons dashicons-cart',
1039
+				'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
1040
+			),
1041
+			'view_invoice'     => array(
1042
+				'class' => 'dashicons dashicons-media-spreadsheet',
1043
+				'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
1044
+			),
1045
+		);
1046
+		if (EE_Registry::instance()->CAP->current_user_can(
1047
+			'ee_send_message',
1048
+			'espresso_registrations_resend_registration'
1049
+		)) {
1050
+			$fc_items['resend_registration'] = array(
1051
+				'class' => 'dashicons dashicons-email-alt',
1052
+				'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
1053
+			);
1054
+		} else {
1055
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
1056
+		}
1057
+		if (EE_Registry::instance()->CAP->current_user_can(
1058
+			'ee_read_global_messages',
1059
+			'view_filtered_messages'
1060
+		)) {
1061
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
1062
+			if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) {
1063
+				$fc_items['view_related_messages'] = array(
1064
+					'class' => $related_for_icon['css_class'],
1065
+					'desc'  => $related_for_icon['label'],
1066
+				);
1067
+			}
1068
+		}
1069
+		$sc_items = array(
1070
+			'approved_status'   => array(
1071
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1072
+				'desc'  => EEH_Template::pretty_status(
1073
+					EEM_Registration::status_id_approved,
1074
+					false,
1075
+					'sentence'
1076
+				),
1077
+			),
1078
+			'pending_status'    => array(
1079
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1080
+				'desc'  => EEH_Template::pretty_status(
1081
+					EEM_Registration::status_id_pending_payment,
1082
+					false,
1083
+					'sentence'
1084
+				),
1085
+			),
1086
+			'wait_list'         => array(
1087
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1088
+				'desc'  => EEH_Template::pretty_status(
1089
+					EEM_Registration::status_id_wait_list,
1090
+					false,
1091
+					'sentence'
1092
+				),
1093
+			),
1094
+			'incomplete_status' => array(
1095
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1096
+				'desc'  => EEH_Template::pretty_status(
1097
+					EEM_Registration::status_id_incomplete,
1098
+					false,
1099
+					'sentence'
1100
+				),
1101
+			),
1102
+			'not_approved'      => array(
1103
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1104
+				'desc'  => EEH_Template::pretty_status(
1105
+					EEM_Registration::status_id_not_approved,
1106
+					false,
1107
+					'sentence'
1108
+				),
1109
+			),
1110
+			'declined_status'   => array(
1111
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1112
+				'desc'  => EEH_Template::pretty_status(
1113
+					EEM_Registration::status_id_declined,
1114
+					false,
1115
+					'sentence'
1116
+				),
1117
+			),
1118
+			'cancelled_status'  => array(
1119
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1120
+				'desc'  => EEH_Template::pretty_status(
1121
+					EEM_Registration::status_id_cancelled,
1122
+					false,
1123
+					'sentence'
1124
+				),
1125
+			),
1126
+		);
1127
+		return array_merge($fc_items, $sc_items);
1128
+	}
1129
+
1130
+
1131
+
1132
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
1133
+
1134
+
1135
+
1136
+	/**
1137
+	 * @throws DomainException
1138
+	 * @throws EE_Error
1139
+	 * @throws InvalidArgumentException
1140
+	 * @throws InvalidDataTypeException
1141
+	 * @throws InvalidInterfaceException
1142
+	 * @throws ReflectionException
1143
+	 */
1144
+	protected function _registrations_overview_list_table()
1145
+	{
1146
+		$this->appendAddNewRegistrationButtonToPageTitle();
1147
+		$header_text = '';
1148
+		$admin_page_header_decorators = [
1149
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader',
1150
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader',
1151
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader',
1152
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader',
1153
+		];
1154
+		foreach ($admin_page_header_decorators as $admin_page_header_decorator) {
1155
+			$filter_header_decorator = $this->loader->getNew($admin_page_header_decorator);
1156
+			$header_text = $filter_header_decorator->getHeaderText($header_text);
1157
+		}
1158
+		$this->_template_args['admin_page_header'] = $header_text;
1159
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1160
+		$this->display_admin_list_table_page_with_no_sidebar();
1161
+	}
1162
+
1163
+
1164
+	/**
1165
+	 * @throws EE_Error
1166
+	 * @throws InvalidArgumentException
1167
+	 * @throws InvalidDataTypeException
1168
+	 * @throws InvalidInterfaceException
1169
+	 */
1170
+	private function appendAddNewRegistrationButtonToPageTitle()
1171
+	{
1172
+		$EVT_ID = ! empty($this->_req_data['event_id'])
1173
+			? absint($this->_req_data['event_id'])
1174
+			: 0;
1175
+		if ($EVT_ID
1176
+			&& EE_Registry::instance()->CAP->current_user_can(
1177
+				'ee_edit_registrations',
1178
+				'espresso_registrations_new_registration',
1179
+				$EVT_ID
1180
+			)
1181
+		) {
1182
+			$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1183
+				'new_registration',
1184
+				'add-registrant',
1185
+				array('event_id' => $EVT_ID),
1186
+				'add-new-h2'
1187
+			);
1188
+		}
1189
+	}
1190
+
1191
+
1192
+	/**
1193
+	 * This sets the _registration property for the registration details screen
1194
+	 *
1195
+	 * @access private
1196
+	 * @return bool
1197
+	 * @throws EE_Error
1198
+	 * @throws InvalidArgumentException
1199
+	 * @throws InvalidDataTypeException
1200
+	 * @throws InvalidInterfaceException
1201
+	 */
1202
+	private function _set_registration_object()
1203
+	{
1204
+		// get out if we've already set the object
1205
+		if ($this->_registration instanceof EE_Registration) {
1206
+			return true;
1207
+		}
1208
+		$REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209
+		if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210
+			return true;
1211
+		}
1212
+		$error_msg = sprintf(
1213
+			esc_html__(
1214
+				'An error occurred and the details for Registration ID #%s could not be retrieved.',
1215
+				'event_espresso'
1216
+			),
1217
+			$REG_ID
1218
+		);
1219
+		EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1220
+		$this->_registration = null;
1221
+		return false;
1222
+	}
1223
+
1224
+
1225
+	/**
1226
+	 * Used to retrieve registrations for the list table.
1227
+	 *
1228
+	 * @param int  $per_page
1229
+	 * @param bool $count
1230
+	 * @param bool $this_month
1231
+	 * @param bool $today
1232
+	 * @return EE_Registration[]|int
1233
+	 * @throws EE_Error
1234
+	 * @throws InvalidArgumentException
1235
+	 * @throws InvalidDataTypeException
1236
+	 * @throws InvalidInterfaceException
1237
+	 */
1238
+	public function get_registrations(
1239
+		$per_page = 10,
1240
+		$count = false,
1241
+		$this_month = false,
1242
+		$today = false
1243
+	) {
1244
+		if ($this_month) {
1245
+			$this->_req_data['status'] = 'month';
1246
+		}
1247
+		if ($today) {
1248
+			$this->_req_data['status'] = 'today';
1249
+		}
1250
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1251
+		/**
1252
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1253
+		 *
1254
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1255
+		 * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1256
+		 *                             or if you have the development copy of EE you can view this at the path:
1257
+		 *                             /docs/G--Model-System/model-query-params.md
1258
+		 */
1259
+		$query_params['group_by'] = '';
1260
+
1261
+		return $count
1262
+			? $this->getRegistrationModel()->count($query_params)
1263
+			/** @type EE_Registration[] */
1264
+			: $this->getRegistrationModel()->get_all($query_params);
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1270
+	 * Note: this listens to values on the request for some of the query parameters.
1271
+	 *
1272
+	 * @param array $request
1273
+	 * @param int   $per_page
1274
+	 * @param bool  $count
1275
+	 * @return array
1276
+	 * @throws EE_Error
1277
+	 * @throws InvalidArgumentException
1278
+	 * @throws InvalidDataTypeException
1279
+	 * @throws InvalidInterfaceException
1280
+	 */
1281
+	protected function _get_registration_query_parameters(
1282
+		$request = array(),
1283
+		$per_page = 10,
1284
+		$count = false
1285
+	) {
1286
+		/** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287
+		$list_table_query_builder = $this->loader->getNew(
1288
+			'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
+			[ $request ]
1290
+		);
1291
+		return $list_table_query_builder->getQueryParams($per_page, $count);
1292
+	}
1293
+
1294
+
1295
+	public function get_registration_status_array()
1296
+	{
1297
+		return self::$_reg_status;
1298
+	}
1299
+
1300
+
1301
+
1302
+
1303
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1304
+	/**
1305
+	 *        generates HTML for the View Registration Details Admin page
1306
+	 *
1307
+	 * @access protected
1308
+	 * @return void
1309
+	 * @throws DomainException
1310
+	 * @throws EE_Error
1311
+	 * @throws InvalidArgumentException
1312
+	 * @throws InvalidDataTypeException
1313
+	 * @throws InvalidInterfaceException
1314
+	 * @throws EntityNotFoundException
1315
+	 * @throws ReflectionException
1316
+	 */
1317
+	protected function _registration_details()
1318
+	{
1319
+		$this->_template_args = array();
1320
+		$this->_set_registration_object();
1321
+		if (is_object($this->_registration)) {
1322
+			$transaction = $this->_registration->transaction()
1323
+				? $this->_registration->transaction()
1324
+				: EE_Transaction::new_instance();
1325
+			$this->_session = $transaction->session_data();
1326
+			$event_id = $this->_registration->event_ID();
1327
+			$this->_template_args['reg_nmbr']['value'] = $this->_registration->ID();
1328
+			$this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso');
1329
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1330
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1331
+			$this->_template_args['grand_total'] = $transaction->total();
1332
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1333
+			// link back to overview
1334
+			$this->_template_args['reg_overview_url'] = REG_ADMIN_URL;
1335
+			$this->_template_args['registration'] = $this->_registration;
1336
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1337
+				array(
1338
+					'action'   => 'default',
1339
+					'event_id' => $event_id,
1340
+				),
1341
+				REG_ADMIN_URL
1342
+			);
1343
+			$this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1344
+				array(
1345
+					'action' => 'default',
1346
+					'EVT_ID' => $event_id,
1347
+					'page'   => 'espresso_transactions',
1348
+				),
1349
+				admin_url('admin.php')
1350
+			);
1351
+			$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1352
+				array(
1353
+					'page'   => 'espresso_events',
1354
+					'action' => 'edit',
1355
+					'post'   => $event_id,
1356
+				),
1357
+				admin_url('admin.php')
1358
+			);
1359
+			// next and previous links
1360
+			$next_reg = $this->_registration->next(
1361
+				null,
1362
+				array(),
1363
+				'REG_ID'
1364
+			);
1365
+			$this->_template_args['next_registration'] = $next_reg
1366
+				? $this->_next_link(
1367
+					EE_Admin_Page::add_query_args_and_nonce(
1368
+						array(
1369
+							'action'  => 'view_registration',
1370
+							'_REG_ID' => $next_reg['REG_ID'],
1371
+						),
1372
+						REG_ADMIN_URL
1373
+					),
1374
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1375
+				)
1376
+				: '';
1377
+			$previous_reg = $this->_registration->previous(
1378
+				null,
1379
+				array(),
1380
+				'REG_ID'
1381
+			);
1382
+			$this->_template_args['previous_registration'] = $previous_reg
1383
+				? $this->_previous_link(
1384
+					EE_Admin_Page::add_query_args_and_nonce(
1385
+						array(
1386
+							'action'  => 'view_registration',
1387
+							'_REG_ID' => $previous_reg['REG_ID'],
1388
+						),
1389
+						REG_ADMIN_URL
1390
+					),
1391
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1392
+				)
1393
+				: '';
1394
+			// grab header
1395
+			$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1396
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
1397
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398
+				$template_path,
1399
+				$this->_template_args,
1400
+				true
1401
+			);
1402
+		} else {
1403
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1404
+		}
1405
+		// the details template wrapper
1406
+		$this->display_admin_page_with_sidebar();
1407
+	}
1408
+
1409
+
1410
+	/**
1411
+	 * @throws EE_Error
1412
+	 * @throws InvalidArgumentException
1413
+	 * @throws InvalidDataTypeException
1414
+	 * @throws InvalidInterfaceException
1415
+	 * @throws ReflectionException
1416
+	 * @since $VID:$
1417
+	 */
1418
+	protected function _registration_details_metaboxes()
1419
+	{
1420
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1421
+		$this->_set_registration_object();
1422
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1423
+		add_meta_box(
1424
+			'edit-reg-status-mbox',
1425
+			esc_html__('Registration Status', 'event_espresso'),
1426
+			array($this, 'set_reg_status_buttons_metabox'),
1427
+			$this->wp_page_slug,
1428
+			'normal',
1429
+			'high'
1430
+		);
1431
+		add_meta_box(
1432
+			'edit-reg-details-mbox',
1433
+			esc_html__('Registration Details', 'event_espresso'),
1434
+			array($this, '_reg_details_meta_box'),
1435
+			$this->wp_page_slug,
1436
+			'normal',
1437
+			'high'
1438
+		);
1439
+		if ($attendee instanceof EE_Attendee
1440
+			&& EE_Registry::instance()->CAP->current_user_can(
1441
+				'ee_read_registration',
1442
+				'edit-reg-questions-mbox',
1443
+				$this->_registration->ID()
1444
+			)
1445
+		) {
1446
+			add_meta_box(
1447
+				'edit-reg-questions-mbox',
1448
+				esc_html__('Registration Form Answers', 'event_espresso'),
1449
+				array($this, '_reg_questions_meta_box'),
1450
+				$this->wp_page_slug,
1451
+				'normal',
1452
+				'high'
1453
+			);
1454
+		}
1455
+		add_meta_box(
1456
+			'edit-reg-registrant-mbox',
1457
+			esc_html__('Contact Details', 'event_espresso'),
1458
+			array($this, '_reg_registrant_side_meta_box'),
1459
+			$this->wp_page_slug,
1460
+			'side',
1461
+			'high'
1462
+		);
1463
+		if ($this->_registration->group_size() > 1) {
1464
+			add_meta_box(
1465
+				'edit-reg-attendees-mbox',
1466
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1467
+				array($this, '_reg_attendees_meta_box'),
1468
+				$this->wp_page_slug,
1469
+				'normal',
1470
+				'high'
1471
+			);
1472
+		}
1473
+	}
1474
+
1475
+
1476
+	/**
1477
+	 * set_reg_status_buttons_metabox
1478
+	 *
1479
+	 * @access protected
1480
+	 * @return string
1481
+	 * @throws EE_Error
1482
+	 * @throws EntityNotFoundException
1483
+	 * @throws InvalidArgumentException
1484
+	 * @throws InvalidDataTypeException
1485
+	 * @throws InvalidInterfaceException
1486
+	 * @throws ReflectionException
1487
+	 */
1488
+	public function set_reg_status_buttons_metabox()
1489
+	{
1490
+		$this->_set_registration_object();
1491
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1492
+		echo $change_reg_status_form->form_open(
1493
+			self::add_query_args_and_nonce(
1494
+				array(
1495
+					'action' => 'change_reg_status',
1496
+				),
1497
+				REG_ADMIN_URL
1498
+			)
1499
+		);
1500
+		echo $change_reg_status_form->get_html();
1501
+		echo $change_reg_status_form->form_close();
1502
+	}
1503
+
1504
+
1505
+	/**
1506
+	 * @return EE_Form_Section_Proper
1507
+	 * @throws EE_Error
1508
+	 * @throws InvalidArgumentException
1509
+	 * @throws InvalidDataTypeException
1510
+	 * @throws InvalidInterfaceException
1511
+	 * @throws EntityNotFoundException
1512
+	 * @throws ReflectionException
1513
+	 */
1514
+	protected function _generate_reg_status_change_form()
1515
+	{
1516
+		$reg_status_change_form_array = array(
1517
+			'name'            => 'reg_status_change_form',
1518
+			'html_id'         => 'reg-status-change-form',
1519
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1520
+			'subsections'     => array(
1521
+				'return'             => new EE_Hidden_Input(
1522
+					array(
1523
+						'name'    => 'return',
1524
+						'default' => 'view_registration',
1525
+					)
1526
+				),
1527
+				'REG_ID'             => new EE_Hidden_Input(
1528
+					array(
1529
+						'name'    => 'REG_ID',
1530
+						'default' => $this->_registration->ID(),
1531
+					)
1532
+				),
1533
+				'current_status'     => new EE_Form_Section_HTML(
1534
+					EEH_HTML::table(
1535
+						EEH_HTML::tr(
1536
+							EEH_HTML::th(
1537
+								EEH_HTML::label(
1538
+									EEH_HTML::strong(
1539
+										esc_html__('Current Registration Status', 'event_espresso')
1540
+									)
1541
+								)
1542
+							)
1543
+							. EEH_HTML::td(
1544
+								EEH_HTML::strong(
1545
+									$this->_registration->pretty_status(),
1546
+									'',
1547
+									'status-' . $this->_registration->status_ID(),
1548
+									'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549
+								)
1550
+							)
1551
+						)
1552
+					)
1553
+				)
1554
+			)
1555
+		);
1556
+		if (EE_Registry::instance()->CAP->current_user_can(
1557
+			'ee_edit_registration',
1558
+			'toggle_registration_status',
1559
+			$this->_registration->ID()
1560
+		)) {
1561
+			$reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input(
1562
+				$this->_get_reg_statuses(),
1563
+				array(
1564
+					'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1565
+					'default'         => $this->_registration->status_ID(),
1566
+				)
1567
+			);
1568
+			$reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input(
1569
+				array(
1570
+					'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1571
+					'default'         => false,
1572
+					'html_help_text'  => esc_html__(
1573
+						'If set to "Yes", then the related messages will be sent to the registrant.',
1574
+						'event_espresso'
1575
+					)
1576
+				)
1577
+			);
1578
+			$reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input(
1579
+				array(
1580
+					'html_class'      => 'button-primary',
1581
+					'html_label_text' => '&nbsp;',
1582
+					'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1583
+				)
1584
+			);
1585
+		}
1586
+		return new EE_Form_Section_Proper($reg_status_change_form_array);
1587
+	}
1588
+
1589
+
1590
+	/**
1591
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1592
+	 *
1593
+	 * @return array
1594
+	 * @throws EE_Error
1595
+	 * @throws InvalidArgumentException
1596
+	 * @throws InvalidDataTypeException
1597
+	 * @throws InvalidInterfaceException
1598
+	 * @throws EntityNotFoundException
1599
+	 */
1600
+	protected function _get_reg_statuses()
1601
+	{
1602
+		$reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
+		unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1604
+		// get current reg status
1605
+		$current_status = $this->_registration->status_ID();
1606
+		// is registration for free event? This will determine whether to display the pending payment option
1607
+		if ($current_status !== EEM_Registration::status_id_pending_payment
1608
+			&& EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609
+		) {
1610
+			unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1611
+		}
1612
+		return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613
+	}
1614
+
1615
+
1616
+	/**
1617
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1618
+	 *
1619
+	 * @param bool $status REG status given for changing registrations to.
1620
+	 * @param bool $notify Whether to send messages notifications or not.
1621
+	 * @return array (array with reg_id(s) updated and whether update was successful.
1622
+	 * @throws DomainException
1623
+	 * @throws EE_Error
1624
+	 * @throws EntityNotFoundException
1625
+	 * @throws InvalidArgumentException
1626
+	 * @throws InvalidDataTypeException
1627
+	 * @throws InvalidInterfaceException
1628
+	 * @throws ReflectionException
1629
+	 * @throws RuntimeException
1630
+	 */
1631
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1632
+	{
1633
+		if (isset($this->_req_data['reg_status_change_form'])) {
1634
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1635
+				? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1636
+				: array();
1637
+		} else {
1638
+			$REG_IDs = isset($this->_req_data['_REG_ID'])
1639
+				? (array) $this->_req_data['_REG_ID']
1640
+				: array();
1641
+		}
1642
+		// sanitize $REG_IDs
1643
+		$REG_IDs = array_map('absint', $REG_IDs);
1644
+		// and remove empty entries
1645
+		$REG_IDs = array_filter($REG_IDs);
1646
+
1647
+		$result = $this->_set_registration_status($REG_IDs, $status, $notify);
1648
+
1649
+		/**
1650
+		 * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1651
+		 * Currently this value is used downstream by the _process_resend_registration method.
1652
+		 *
1653
+		 * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1654
+		 * @param bool                     $status           The status registrations were changed to.
1655
+		 * @param bool                     $success          If the status was changed successfully for all registrations.
1656
+		 * @param Registrations_Admin_Page $admin_page_object
1657
+		 */
1658
+		$this->_req_data['_REG_ID'] = apply_filters(
1659
+			'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1660
+			$result['REG_ID'],
1661
+			$status,
1662
+			$result['success'],
1663
+			$this
1664
+		);
1665
+
1666
+		// notify?
1667
+		if ($notify
1668
+			&& $result['success']
1669
+			&& ! empty($this->_req_data['_REG_ID'])
1670
+			&& EE_Registry::instance()->CAP->current_user_can(
1671
+				'ee_send_message',
1672
+				'espresso_registrations_resend_registration'
1673
+			)
1674
+		) {
1675
+			$this->_process_resend_registration();
1676
+		}
1677
+		return $result;
1678
+	}
1679
+
1680
+
1681
+	/**
1682
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1683
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1684
+	 *
1685
+	 * @param array  $REG_IDs
1686
+	 * @param string $status
1687
+	 * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1688
+	 *                        slug sent with setting the registration status.
1689
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1690
+	 * @throws EE_Error
1691
+	 * @throws InvalidArgumentException
1692
+	 * @throws InvalidDataTypeException
1693
+	 * @throws InvalidInterfaceException
1694
+	 * @throws ReflectionException
1695
+	 * @throws RuntimeException
1696
+	 * @throws EntityNotFoundException
1697
+	 * @throws DomainException
1698
+	 */
1699
+	protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1700
+	{
1701
+		$success = false;
1702
+		// typecast $REG_IDs
1703
+		$REG_IDs = (array) $REG_IDs;
1704
+		if (! empty($REG_IDs)) {
1705
+			$success = true;
1706
+			// set default status if none is passed
1707
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1708
+			$status_context = $notify
1709
+				? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1710
+				: Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1711
+			// loop through REG_ID's and change status
1712
+			foreach ($REG_IDs as $REG_ID) {
1713
+				$registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
1714
+				if ($registration instanceof EE_Registration) {
1715
+					$registration->set_status(
1716
+						$status,
1717
+						false,
1718
+						new Context(
1719
+							$status_context,
1720
+							esc_html__(
1721
+								'Manually triggered status change on a Registration Admin Page route.',
1722
+								'event_espresso'
1723
+							)
1724
+						)
1725
+					);
1726
+					$result = $registration->save();
1727
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1728
+					$success = $result !== false ? $success : false;
1729
+				}
1730
+			}
1731
+		}
1732
+
1733
+		// return $success and processed registrations
1734
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1735
+	}
1736
+
1737
+
1738
+	/**
1739
+	 * Common logic for setting up success message and redirecting to appropriate route
1740
+	 *
1741
+	 * @param string $STS_ID status id for the registration changed to
1742
+	 * @param bool   $notify indicates whether the _set_registration_status_from_request does notifications or not.
1743
+	 * @return void
1744
+	 * @throws DomainException
1745
+	 * @throws EE_Error
1746
+	 * @throws EntityNotFoundException
1747
+	 * @throws InvalidArgumentException
1748
+	 * @throws InvalidDataTypeException
1749
+	 * @throws InvalidInterfaceException
1750
+	 * @throws ReflectionException
1751
+	 * @throws RuntimeException
1752
+	 */
1753
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1754
+	{
1755
+		$result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1756
+			: array('success' => false);
1757
+		$success = isset($result['success']) && $result['success'];
1758
+		// setup success message
1759
+		if ($success) {
1760
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1761
+				$msg = sprintf(
1762
+					esc_html__('Registration status has been set to %s', 'event_espresso'),
1763
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
1764
+				);
1765
+			} else {
1766
+				$msg = sprintf(
1767
+					esc_html__('Registrations have been set to %s.', 'event_espresso'),
1768
+					EEH_Template::pretty_status($STS_ID, false, 'lower')
1769
+				);
1770
+			}
1771
+			EE_Error::add_success($msg);
1772
+		} else {
1773
+			EE_Error::add_error(
1774
+				esc_html__(
1775
+					'Something went wrong, and the status was not changed',
1776
+					'event_espresso'
1777
+				),
1778
+				__FILE__,
1779
+				__LINE__,
1780
+				__FUNCTION__
1781
+			);
1782
+		}
1783
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') {
1784
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1785
+		} else {
1786
+			$route = array('action' => 'default');
1787
+		}
1788
+		$route = $this->mergeExistingRequestParamsWithRedirectArgs($route);
1789
+		$this->_redirect_after_action($success, '', '', $route, true);
1790
+	}
1791
+
1792
+
1793
+	/**
1794
+	 * incoming reg status change from reg details page.
1795
+	 *
1796
+	 * @return void
1797
+	 * @throws EE_Error
1798
+	 * @throws EntityNotFoundException
1799
+	 * @throws InvalidArgumentException
1800
+	 * @throws InvalidDataTypeException
1801
+	 * @throws InvalidInterfaceException
1802
+	 * @throws ReflectionException
1803
+	 * @throws RuntimeException
1804
+	 * @throws DomainException
1805
+	 */
1806
+	protected function _change_reg_status()
1807
+	{
1808
+		$this->_req_data['return'] = 'view_registration';
1809
+		// set notify based on whether the send notifications toggle is set or not
1810
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1811
+		// $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1812
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1813
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1814
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1815
+			case EEM_Registration::status_id_approved:
1816
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'):
1817
+				$this->approve_registration($notify);
1818
+				break;
1819
+			case EEM_Registration::status_id_pending_payment:
1820
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'):
1821
+				$this->pending_registration($notify);
1822
+				break;
1823
+			case EEM_Registration::status_id_not_approved:
1824
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'):
1825
+				$this->not_approve_registration($notify);
1826
+				break;
1827
+			case EEM_Registration::status_id_declined:
1828
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'):
1829
+				$this->decline_registration($notify);
1830
+				break;
1831
+			case EEM_Registration::status_id_cancelled:
1832
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'):
1833
+				$this->cancel_registration($notify);
1834
+				break;
1835
+			case EEM_Registration::status_id_wait_list:
1836
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'):
1837
+				$this->wait_list_registration($notify);
1838
+				break;
1839
+			case EEM_Registration::status_id_incomplete:
1840
+			default:
1841
+				$result['success'] = false;
1842
+				unset($this->_req_data['return']);
1843
+				$this->_reg_status_change_return('', false);
1844
+				break;
1845
+		}
1846
+	}
1847
+
1848
+
1849
+	/**
1850
+	 * Callback for bulk action routes.
1851
+	 * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1852
+	 * method was chosen so there is one central place all the registration status bulk actions are going through.
1853
+	 * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1854
+	 * when an action is happening on just a single registration).
1855
+	 *
1856
+	 * @param      $action
1857
+	 * @param bool $notify
1858
+	 */
1859
+	protected function bulk_action_on_registrations($action, $notify = false)
1860
+	{
1861
+		do_action(
1862
+			'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1863
+			$this,
1864
+			$action,
1865
+			$notify
1866
+		);
1867
+		$method = $action . '_registration';
1868
+		if (method_exists($this, $method)) {
1869
+			$this->$method($notify);
1870
+		}
1871
+	}
1872
+
1873
+
1874
+	/**
1875
+	 * approve_registration
1876
+	 *
1877
+	 * @access protected
1878
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1879
+	 * @return void
1880
+	 * @throws EE_Error
1881
+	 * @throws EntityNotFoundException
1882
+	 * @throws InvalidArgumentException
1883
+	 * @throws InvalidDataTypeException
1884
+	 * @throws InvalidInterfaceException
1885
+	 * @throws ReflectionException
1886
+	 * @throws RuntimeException
1887
+	 * @throws DomainException
1888
+	 */
1889
+	protected function approve_registration($notify = false)
1890
+	{
1891
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1892
+	}
1893
+
1894
+
1895
+	/**
1896
+	 *        decline_registration
1897
+	 *
1898
+	 * @access protected
1899
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1900
+	 * @return void
1901
+	 * @throws EE_Error
1902
+	 * @throws EntityNotFoundException
1903
+	 * @throws InvalidArgumentException
1904
+	 * @throws InvalidDataTypeException
1905
+	 * @throws InvalidInterfaceException
1906
+	 * @throws ReflectionException
1907
+	 * @throws RuntimeException
1908
+	 * @throws DomainException
1909
+	 */
1910
+	protected function decline_registration($notify = false)
1911
+	{
1912
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1913
+	}
1914
+
1915
+
1916
+	/**
1917
+	 *        cancel_registration
1918
+	 *
1919
+	 * @access protected
1920
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1921
+	 * @return void
1922
+	 * @throws EE_Error
1923
+	 * @throws EntityNotFoundException
1924
+	 * @throws InvalidArgumentException
1925
+	 * @throws InvalidDataTypeException
1926
+	 * @throws InvalidInterfaceException
1927
+	 * @throws ReflectionException
1928
+	 * @throws RuntimeException
1929
+	 * @throws DomainException
1930
+	 */
1931
+	protected function cancel_registration($notify = false)
1932
+	{
1933
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1934
+	}
1935
+
1936
+
1937
+	/**
1938
+	 *        not_approve_registration
1939
+	 *
1940
+	 * @access protected
1941
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1942
+	 * @return void
1943
+	 * @throws EE_Error
1944
+	 * @throws EntityNotFoundException
1945
+	 * @throws InvalidArgumentException
1946
+	 * @throws InvalidDataTypeException
1947
+	 * @throws InvalidInterfaceException
1948
+	 * @throws ReflectionException
1949
+	 * @throws RuntimeException
1950
+	 * @throws DomainException
1951
+	 */
1952
+	protected function not_approve_registration($notify = false)
1953
+	{
1954
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1955
+	}
1956
+
1957
+
1958
+	/**
1959
+	 *        decline_registration
1960
+	 *
1961
+	 * @access protected
1962
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1963
+	 * @return void
1964
+	 * @throws EE_Error
1965
+	 * @throws EntityNotFoundException
1966
+	 * @throws InvalidArgumentException
1967
+	 * @throws InvalidDataTypeException
1968
+	 * @throws InvalidInterfaceException
1969
+	 * @throws ReflectionException
1970
+	 * @throws RuntimeException
1971
+	 * @throws DomainException
1972
+	 */
1973
+	protected function pending_registration($notify = false)
1974
+	{
1975
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1976
+	}
1977
+
1978
+
1979
+	/**
1980
+	 * waitlist_registration
1981
+	 *
1982
+	 * @access protected
1983
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1984
+	 * @return void
1985
+	 * @throws EE_Error
1986
+	 * @throws EntityNotFoundException
1987
+	 * @throws InvalidArgumentException
1988
+	 * @throws InvalidDataTypeException
1989
+	 * @throws InvalidInterfaceException
1990
+	 * @throws ReflectionException
1991
+	 * @throws RuntimeException
1992
+	 * @throws DomainException
1993
+	 */
1994
+	protected function wait_list_registration($notify = false)
1995
+	{
1996
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1997
+	}
1998
+
1999
+
2000
+	/**
2001
+	 *        generates HTML for the Registration main meta box
2002
+	 *
2003
+	 * @access public
2004
+	 * @return void
2005
+	 * @throws DomainException
2006
+	 * @throws EE_Error
2007
+	 * @throws InvalidArgumentException
2008
+	 * @throws InvalidDataTypeException
2009
+	 * @throws InvalidInterfaceException
2010
+	 * @throws ReflectionException
2011
+	 * @throws EntityNotFoundException
2012
+	 */
2013
+	public function _reg_details_meta_box()
2014
+	{
2015
+		EEH_Autoloader::register_line_item_display_autoloaders();
2016
+		EEH_Autoloader::register_line_item_filter_autoloaders();
2017
+		EE_Registry::instance()->load_helper('Line_Item');
2018
+		$transaction = $this->_registration->transaction() ? $this->_registration->transaction()
2019
+			: EE_Transaction::new_instance();
2020
+		$this->_session = $transaction->session_data();
2021
+		$filters = new EE_Line_Item_Filter_Collection();
2022
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2023
+		$filters->add(new EE_Non_Zero_Line_Item_Filter());
2024
+		$line_item_filter_processor = new EE_Line_Item_Filter_Processor(
2025
+			$filters,
2026
+			$transaction->total_line_item()
2027
+		);
2028
+		$filtered_line_item_tree = $line_item_filter_processor->process();
2029
+		$line_item_display = new EE_Line_Item_Display(
2030
+			'reg_admin_table',
2031
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy'
2032
+		);
2033
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2034
+			$filtered_line_item_tree,
2035
+			array('EE_Registration' => $this->_registration)
2036
+		);
2037
+		$attendee = $this->_registration->attendee();
2038
+		if (EE_Registry::instance()->CAP->current_user_can(
2039
+			'ee_read_transaction',
2040
+			'espresso_transactions_view_transaction'
2041
+		)) {
2042
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2043
+				EE_Admin_Page::add_query_args_and_nonce(
2044
+					array(
2045
+						'action' => 'view_transaction',
2046
+						'TXN_ID' => $transaction->ID(),
2047
+					),
2048
+					TXN_ADMIN_URL
2049
+				),
2050
+				esc_html__(' View Transaction', 'event_espresso'),
2051
+				'button secondary-button right',
2052
+				'dashicons dashicons-cart'
2053
+			);
2054
+		} else {
2055
+			$this->_template_args['view_transaction_button'] = '';
2056
+		}
2057
+		if ($attendee instanceof EE_Attendee
2058
+			&& EE_Registry::instance()->CAP->current_user_can(
2059
+				'ee_send_message',
2060
+				'espresso_registrations_resend_registration'
2061
+			)
2062
+		) {
2063
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2064
+				EE_Admin_Page::add_query_args_and_nonce(
2065
+					array(
2066
+						'action'      => 'resend_registration',
2067
+						'_REG_ID'     => $this->_registration->ID(),
2068
+						'redirect_to' => 'view_registration',
2069
+					),
2070
+					REG_ADMIN_URL
2071
+				),
2072
+				esc_html__(' Resend Registration', 'event_espresso'),
2073
+				'button secondary-button right',
2074
+				'dashicons dashicons-email-alt'
2075
+			);
2076
+		} else {
2077
+			$this->_template_args['resend_registration_button'] = '';
2078
+		}
2079
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2080
+		$payment = $transaction->get_first_related('Payment');
2081
+		$payment = ! $payment instanceof EE_Payment
2082
+			? EE_Payment::new_instance()
2083
+			: $payment;
2084
+		$payment_method = $payment->get_first_related('Payment_Method');
2085
+		$payment_method = ! $payment_method instanceof EE_Payment_Method
2086
+			? EE_Payment_Method::new_instance()
2087
+			: $payment_method;
2088
+		$reg_details = array(
2089
+			'payment_method'       => $payment_method->name(),
2090
+			'response_msg'         => $payment->gateway_response(),
2091
+			'registration_id'      => $this->_registration->get('REG_code'),
2092
+			'registration_session' => $this->_registration->session_ID(),
2093
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2094
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2095
+		);
2096
+		if (isset($reg_details['registration_id'])) {
2097
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2098
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2099
+				'Registration ID',
2100
+				'event_espresso'
2101
+			);
2102
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2103
+		}
2104
+		if (isset($reg_details['payment_method'])) {
2105
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2106
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2107
+				'Most Recent Payment Method',
2108
+				'event_espresso'
2109
+			);
2110
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2111
+			$this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg'];
2112
+			$this->_template_args['reg_details']['response_msg']['label'] = esc_html__(
2113
+				'Payment method response',
2114
+				'event_espresso'
2115
+			);
2116
+			$this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2117
+		}
2118
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2119
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2120
+			'Registration Session',
2121
+			'event_espresso'
2122
+		);
2123
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2124
+		$this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address'];
2125
+		$this->_template_args['reg_details']['ip_address']['label'] = esc_html__(
2126
+			'Registration placed from IP',
2127
+			'event_espresso'
2128
+		);
2129
+		$this->_template_args['reg_details']['ip_address']['class'] = 'regular-text';
2130
+		$this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent'];
2131
+		$this->_template_args['reg_details']['user_agent']['label'] = esc_html__(
2132
+			'Registrant User Agent',
2133
+			'event_espresso'
2134
+		);
2135
+		$this->_template_args['reg_details']['user_agent']['class'] = 'large-text';
2136
+		$this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
2137
+			array(
2138
+				'action'   => 'default',
2139
+				'event_id' => $this->_registration->event_ID(),
2140
+			),
2141
+			REG_ADMIN_URL
2142
+		);
2143
+		$this->_template_args['REG_ID'] = $this->_registration->ID();
2144
+		$this->_template_args['event_id'] = $this->_registration->event_ID();
2145
+		$template_path =
2146
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2147
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148
+	}
2149
+
2150
+
2151
+	/**
2152
+	 * generates HTML for the Registration Questions meta box.
2153
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2154
+	 * otherwise uses new forms system
2155
+	 *
2156
+	 * @access public
2157
+	 * @return void
2158
+	 * @throws DomainException
2159
+	 * @throws EE_Error
2160
+	 * @throws InvalidArgumentException
2161
+	 * @throws InvalidDataTypeException
2162
+	 * @throws InvalidInterfaceException
2163
+	 * @throws ReflectionException
2164
+	 */
2165
+	public function _reg_questions_meta_box()
2166
+	{
2167
+		// allow someone to override this method entirely
2168
+		if (apply_filters(
2169
+			'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default',
2170
+			true,
2171
+			$this,
2172
+			$this->_registration
2173
+		)) {
2174
+			$form = $this->_get_reg_custom_questions_form(
2175
+				$this->_registration->ID()
2176
+			);
2177
+			$this->_template_args['att_questions'] = count($form->subforms()) > 0
2178
+				? $form->get_html_and_js()
2179
+				: '';
2180
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181
+			$this->_template_args['REG_ID'] = $this->_registration->ID();
2182
+			$template_path =
2183
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2184
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185
+		}
2186
+	}
2187
+
2188
+
2189
+	/**
2190
+	 * form_before_question_group
2191
+	 *
2192
+	 * @deprecated    as of 4.8.32.rc.000
2193
+	 * @access        public
2194
+	 * @param        string $output
2195
+	 * @return        string
2196
+	 */
2197
+	public function form_before_question_group($output)
2198
+	{
2199
+		EE_Error::doing_it_wrong(
2200
+			__CLASS__ . '::' . __FUNCTION__,
2201
+			esc_html__(
2202
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2203
+				'event_espresso'
2204
+			),
2205
+			'4.8.32.rc.000'
2206
+		);
2207
+		return '
2208 2208
 	<table class="form-table ee-width-100">
2209 2209
 		<tbody>
2210 2210
 			';
2211
-    }
2212
-
2213
-
2214
-    /**
2215
-     * form_after_question_group
2216
-     *
2217
-     * @deprecated    as of 4.8.32.rc.000
2218
-     * @access        public
2219
-     * @param        string $output
2220
-     * @return        string
2221
-     */
2222
-    public function form_after_question_group($output)
2223
-    {
2224
-        EE_Error::doing_it_wrong(
2225
-            __CLASS__ . '::' . __FUNCTION__,
2226
-            esc_html__(
2227
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2228
-                'event_espresso'
2229
-            ),
2230
-            '4.8.32.rc.000'
2231
-        );
2232
-        return '
2211
+	}
2212
+
2213
+
2214
+	/**
2215
+	 * form_after_question_group
2216
+	 *
2217
+	 * @deprecated    as of 4.8.32.rc.000
2218
+	 * @access        public
2219
+	 * @param        string $output
2220
+	 * @return        string
2221
+	 */
2222
+	public function form_after_question_group($output)
2223
+	{
2224
+		EE_Error::doing_it_wrong(
2225
+			__CLASS__ . '::' . __FUNCTION__,
2226
+			esc_html__(
2227
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2228
+				'event_espresso'
2229
+			),
2230
+			'4.8.32.rc.000'
2231
+		);
2232
+		return '
2233 2233
 			<tr class="hide-if-no-js">
2234 2234
 				<th> </th>
2235 2235
 				<td class="reg-admin-edit-attendee-question-td">
2236 2236
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2237
-               . esc_attr__('click to edit question', 'event_espresso')
2238
-               . '">
2237
+			   . esc_attr__('click to edit question', 'event_espresso')
2238
+			   . '">
2239 2239
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2240
-               . esc_html__('edit the above question group', 'event_espresso')
2241
-               . '</span>
2240
+			   . esc_html__('edit the above question group', 'event_espresso')
2241
+			   . '</span>
2242 2242
 						<div class="dashicons dashicons-edit"></div>
2243 2243
 					</a>
2244 2244
 				</td>
@@ -2246,627 +2246,627 @@  discard block
 block discarded – undo
2246 2246
 		</tbody>
2247 2247
 	</table>
2248 2248
 ';
2249
-    }
2250
-
2251
-
2252
-    /**
2253
-     * form_form_field_label_wrap
2254
-     *
2255
-     * @deprecated    as of 4.8.32.rc.000
2256
-     * @access        public
2257
-     * @param        string $label
2258
-     * @return        string
2259
-     */
2260
-    public function form_form_field_label_wrap($label)
2261
-    {
2262
-        EE_Error::doing_it_wrong(
2263
-            __CLASS__ . '::' . __FUNCTION__,
2264
-            esc_html__(
2265
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2266
-                'event_espresso'
2267
-            ),
2268
-            '4.8.32.rc.000'
2269
-        );
2270
-        return '
2249
+	}
2250
+
2251
+
2252
+	/**
2253
+	 * form_form_field_label_wrap
2254
+	 *
2255
+	 * @deprecated    as of 4.8.32.rc.000
2256
+	 * @access        public
2257
+	 * @param        string $label
2258
+	 * @return        string
2259
+	 */
2260
+	public function form_form_field_label_wrap($label)
2261
+	{
2262
+		EE_Error::doing_it_wrong(
2263
+			__CLASS__ . '::' . __FUNCTION__,
2264
+			esc_html__(
2265
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2266
+				'event_espresso'
2267
+			),
2268
+			'4.8.32.rc.000'
2269
+		);
2270
+		return '
2271 2271
 			<tr>
2272 2272
 				<th>
2273 2273
 					' . $label . '
2274 2274
 				</th>';
2275
-    }
2276
-
2277
-
2278
-    /**
2279
-     * form_form_field_input__wrap
2280
-     *
2281
-     * @deprecated    as of 4.8.32.rc.000
2282
-     * @access        public
2283
-     * @param        string $input
2284
-     * @return        string
2285
-     */
2286
-    public function form_form_field_input__wrap($input)
2287
-    {
2288
-        EE_Error::doing_it_wrong(
2289
-            __CLASS__ . '::' . __FUNCTION__,
2290
-            esc_html__(
2291
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2292
-                'event_espresso'
2293
-            ),
2294
-            '4.8.32.rc.000'
2295
-        );
2296
-        return '
2275
+	}
2276
+
2277
+
2278
+	/**
2279
+	 * form_form_field_input__wrap
2280
+	 *
2281
+	 * @deprecated    as of 4.8.32.rc.000
2282
+	 * @access        public
2283
+	 * @param        string $input
2284
+	 * @return        string
2285
+	 */
2286
+	public function form_form_field_input__wrap($input)
2287
+	{
2288
+		EE_Error::doing_it_wrong(
2289
+			__CLASS__ . '::' . __FUNCTION__,
2290
+			esc_html__(
2291
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2292
+				'event_espresso'
2293
+			),
2294
+			'4.8.32.rc.000'
2295
+		);
2296
+		return '
2297 2297
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2298 2298
 					' . $input . '
2299 2299
 				</td>
2300 2300
 			</tr>';
2301
-    }
2302
-
2303
-
2304
-    /**
2305
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2306
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2307
-     * to display the page
2308
-     *
2309
-     * @access protected
2310
-     * @return void
2311
-     * @throws EE_Error
2312
-     * @throws InvalidArgumentException
2313
-     * @throws InvalidDataTypeException
2314
-     * @throws InvalidInterfaceException
2315
-     * @throws ReflectionException
2316
-     */
2317
-    protected function _update_attendee_registration_form()
2318
-    {
2319
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2320
-        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
2321
-            $REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2322
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2323
-            if ($success) {
2324
-                $what = esc_html__('Registration Form', 'event_espresso');
2325
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2326
-                    : array('action' => 'default');
2327
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2328
-            }
2329
-        }
2330
-    }
2331
-
2332
-
2333
-    /**
2334
-     * Gets the form for saving registrations custom questions (if done
2335
-     * previously retrieves the cached form object, which may have validation errors in it)
2336
-     *
2337
-     * @param int $REG_ID
2338
-     * @return EE_Registration_Custom_Questions_Form
2339
-     * @throws EE_Error
2340
-     * @throws InvalidArgumentException
2341
-     * @throws InvalidDataTypeException
2342
-     * @throws InvalidInterfaceException
2343
-     */
2344
-    protected function _get_reg_custom_questions_form($REG_ID)
2345
-    {
2346
-        if (! $this->_reg_custom_questions_form) {
2347
-            require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349
-                $this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350
-            );
2351
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2352
-        }
2353
-        return $this->_reg_custom_questions_form;
2354
-    }
2355
-
2356
-
2357
-    /**
2358
-     * Saves
2359
-     *
2360
-     * @access private
2361
-     * @param bool $REG_ID
2362
-     * @return bool
2363
-     * @throws EE_Error
2364
-     * @throws InvalidArgumentException
2365
-     * @throws InvalidDataTypeException
2366
-     * @throws InvalidInterfaceException
2367
-     * @throws ReflectionException
2368
-     */
2369
-    private function _save_reg_custom_questions_form($REG_ID = false)
2370
-    {
2371
-        if (! $REG_ID) {
2372
-            EE_Error::add_error(
2373
-                esc_html__(
2374
-                    'An error occurred. No registration ID was received.',
2375
-                    'event_espresso'
2376
-                ),
2377
-                __FILE__,
2378
-                __FUNCTION__,
2379
-                __LINE__
2380
-            );
2381
-        }
2382
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2383
-        $form->receive_form_submission($this->_req_data);
2384
-        $success = false;
2385
-        if ($form->is_valid()) {
2386
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2387
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2388
-                    $where_conditions = array(
2389
-                        'QST_ID' => $question_id,
2390
-                        'REG_ID' => $REG_ID,
2391
-                    );
2392
-                    $possibly_new_values = array(
2393
-                        'ANS_value' => $input->normalized_value(),
2394
-                    );
2395
-                    $answer = EEM_Answer::instance()->get_one(array($where_conditions));
2396
-                    if ($answer instanceof EE_Answer) {
2397
-                        $success = $answer->save($possibly_new_values);
2398
-                    } else {
2399
-                        // insert it then
2400
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2401
-                        $answer = EE_Answer::new_instance($cols_n_vals);
2402
-                        $success = $answer->save();
2403
-                    }
2404
-                }
2405
-            }
2406
-        } else {
2407
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2408
-        }
2409
-        return $success;
2410
-    }
2411
-
2412
-
2413
-    /**
2414
-     *        generates HTML for the Registration main meta box
2415
-     *
2416
-     * @access public
2417
-     * @return void
2418
-     * @throws DomainException
2419
-     * @throws EE_Error
2420
-     * @throws InvalidArgumentException
2421
-     * @throws InvalidDataTypeException
2422
-     * @throws InvalidInterfaceException
2423
-     * @throws ReflectionException
2424
-     */
2425
-    public function _reg_attendees_meta_box()
2426
-    {
2427
-        $REG = $this->getRegistrationModel();
2428
-        // get all other registrations on this transaction, and cache
2429
-        // the attendees for them so we don't have to run another query using force_join
2430
-        $registrations = $REG->get_all(
2431
-            array(
2432
-                array(
2433
-                    'TXN_ID' => $this->_registration->transaction_ID(),
2434
-                    'REG_ID' => array('!=', $this->_registration->ID()),
2435
-                ),
2436
-                'force_join' => array('Attendee'),
2437
-                'default_where_conditions' => 'other_models_only',
2438
-            )
2439
-        );
2440
-        $this->_template_args['attendees'] = array();
2441
-        $this->_template_args['attendee_notice'] = '';
2442
-        if (empty($registrations)
2443
-            || (is_array($registrations)
2444
-                && ! EEH_Array::get_one_item_from_array($registrations))
2445
-        ) {
2446
-            EE_Error::add_error(
2447
-                esc_html__(
2448
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2449
-                    'event_espresso'
2450
-                ),
2451
-                __FILE__,
2452
-                __FUNCTION__,
2453
-                __LINE__
2454
-            );
2455
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2456
-        } else {
2457
-            $att_nmbr = 1;
2458
-            foreach ($registrations as $registration) {
2459
-                /* @var $registration EE_Registration */
2460
-                $attendee = $registration->attendee()
2461
-                    ? $registration->attendee()
2462
-                    : $this->getAttendeeModel()->create_default_object();
2463
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2469
-                    ', ',
2470
-                    $attendee->full_address_as_array()
2471
-                );
2472
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2473
-                    array(
2474
-                        'action' => 'edit_attendee',
2475
-                        'post'   => $attendee->ID(),
2476
-                    ),
2477
-                    REG_ADMIN_URL
2478
-                );
2479
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2480
-                    ? $registration->event_obj()->name()
2481
-                    : '';
2482
-                $att_nmbr++;
2483
-            }
2484
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485
-        }
2486
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2487
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488
-    }
2489
-
2490
-
2491
-    /**
2492
-     *        generates HTML for the Edit Registration side meta box
2493
-     *
2494
-     * @access public
2495
-     * @return void
2496
-     * @throws DomainException
2497
-     * @throws EE_Error
2498
-     * @throws InvalidArgumentException
2499
-     * @throws InvalidDataTypeException
2500
-     * @throws InvalidInterfaceException
2501
-     * @throws ReflectionException
2502
-     */
2503
-    public function _reg_registrant_side_meta_box()
2504
-    {
2505
-        /*@var $attendee EE_Attendee */
2506
-        $att_check = $this->_registration->attendee();
2507
-        $attendee = $att_check instanceof EE_Attendee
2508
-            ? $att_check
2509
-            : $this->getAttendeeModel()->create_default_object();
2510
-        // now let's determine if this is not the primary registration.  If it isn't then we set the
2511
-        // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512
-        // primary registration object (that way we know if we need to show create button or not)
2513
-        if (! $this->_registration->is_primary_registrant()) {
2514
-            $primary_registration = $this->_registration->get_primary_registration();
2515
-            $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516
-                : null;
2517
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518
-                // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519
-                // custom attendee object so let's not worry about the primary reg.
2520
-                $primary_registration = null;
2521
-            }
2522
-        } else {
2523
-            $primary_registration = null;
2524
-        }
2525
-        $this->_template_args['ATT_ID'] = $attendee->ID();
2526
-        $this->_template_args['fname'] = $attendee->fname();
2527
-        $this->_template_args['lname'] = $attendee->lname();
2528
-        $this->_template_args['email'] = $attendee->email();
2529
-        $this->_template_args['phone'] = $attendee->phone();
2530
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2531
-        // edit link
2532
-        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2533
-            array(
2534
-                'action' => 'edit_attendee',
2535
-                'post'   => $attendee->ID(),
2536
-            ),
2537
-            REG_ADMIN_URL
2538
-        );
2539
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2540
-        // create link
2541
-        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2542
-            ? EE_Admin_Page::add_query_args_and_nonce(
2543
-                array(
2544
-                    'action'  => 'duplicate_attendee',
2545
-                    '_REG_ID' => $this->_registration->ID(),
2546
-                ),
2547
-                REG_ADMIN_URL
2548
-            ) : '';
2549
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550
-        $this->_template_args['att_check'] = $att_check;
2551
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2552
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553
-    }
2554
-
2555
-
2556
-    /**
2557
-     * trash or restore registrations
2558
-     *
2559
-     * @param  boolean $trash whether to archive or restore
2560
-     * @return void
2561
-     * @throws EE_Error
2562
-     * @throws InvalidArgumentException
2563
-     * @throws InvalidDataTypeException
2564
-     * @throws InvalidInterfaceException
2565
-     * @throws RuntimeException
2566
-     * @access protected
2567
-     */
2568
-    protected function _trash_or_restore_registrations($trash = true)
2569
-    {
2570
-        // if empty _REG_ID then get out because there's nothing to do
2571
-        if (empty($this->_req_data['_REG_ID'])) {
2572
-            EE_Error::add_error(
2573
-                sprintf(
2574
-                    esc_html__(
2575
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2576
-                        'event_espresso'
2577
-                    ),
2578
-                    $trash ? 'trash' : 'restore'
2579
-                ),
2580
-                __FILE__,
2581
-                __LINE__,
2582
-                __FUNCTION__
2583
-            );
2584
-            $this->_redirect_after_action(false, '', '', array(), true);
2585
-        }
2586
-        $success = 0;
2587
-        $overwrite_msgs = false;
2588
-        // Checkboxes
2589
-        if (! is_array($this->_req_data['_REG_ID'])) {
2590
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591
-        }
2592
-        $reg_count = count($this->_req_data['_REG_ID']);
2593
-        // cycle thru checkboxes
2594
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2595
-            /** @var EE_Registration $REG */
2596
-            $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597
-            $payments = $REG->registration_payments();
2598
-            if (! empty($payments)) {
2599
-                $name = $REG->attendee() instanceof EE_Attendee
2600
-                    ? $REG->attendee()->full_name()
2601
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2602
-                $overwrite_msgs = true;
2603
-                EE_Error::add_error(
2604
-                    sprintf(
2605
-                        esc_html__(
2606
-                            'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2607
-                            'event_espresso'
2608
-                        ),
2609
-                        $name
2610
-                    ),
2611
-                    __FILE__,
2612
-                    __FUNCTION__,
2613
-                    __LINE__
2614
-                );
2615
-                // can't trash this registration because it has payments.
2616
-                continue;
2617
-            }
2618
-            $updated = $trash ? $REG->delete() : $REG->restore();
2619
-            if ($updated) {
2620
-                $success++;
2621
-            }
2622
-        }
2623
-        $this->_redirect_after_action(
2624
-            $success === $reg_count, // were ALL registrations affected?
2625
-            $success > 1
2626
-                ? esc_html__('Registrations', 'event_espresso')
2627
-                : esc_html__('Registration', 'event_espresso'),
2628
-            $trash
2629
-                ? esc_html__('moved to the trash', 'event_espresso')
2630
-                : esc_html__('restored', 'event_espresso'),
2631
-            $this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2632
-            $overwrite_msgs
2633
-        );
2634
-    }
2635
-
2636
-
2637
-    /**
2638
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2639
-     * registration but also.
2640
-     * 1. Removing relations to EE_Attendee
2641
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2642
-     * ALSO trashed.
2643
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2644
-     * 4. Removing relationships between all tickets and the related registrations
2645
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2646
-     * 6. Deleting permanently any related Checkins.
2647
-     *
2648
-     * @return void
2649
-     * @throws EE_Error
2650
-     * @throws InvalidArgumentException
2651
-     * @throws InvalidDataTypeException
2652
-     * @throws InvalidInterfaceException
2653
-     * @throws ReflectionException
2654
-     */
2655
-    protected function _delete_registrations()
2656
-    {
2657
-        $REG_MDL = $this->getRegistrationModel();
2658
-        $success = 1;
2659
-        // Checkboxes
2660
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661
-            // if array has more than one element than success message should be plural
2662
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663
-            // cycle thru checkboxes
2664
-            foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
-                if (! $REG instanceof EE_Registration) {
2667
-                    continue;
2668
-                }
2669
-                $deleted = $this->_delete_registration($REG);
2670
-                if (! $deleted) {
2671
-                    $success = 0;
2672
-                }
2673
-            }
2674
-        } else {
2675
-            // grab single id and delete
2676
-            $REG_ID = $this->_req_data['_REG_ID'];
2677
-            /** @var EE_Registration $REG */
2678
-            $REG = $REG_MDL->get_one_by_ID($REG_ID);
2679
-            $deleted = $this->_delete_registration($REG);
2680
-            if (! $deleted) {
2681
-                $success = 0;
2682
-            }
2683
-        }
2684
-        $what = $success > 1
2685
-            ? esc_html__('Registrations', 'event_espresso')
2686
-            : esc_html__('Registration', 'event_espresso');
2687
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2688
-        $this->_redirect_after_action(
2689
-            $success,
2690
-            $what,
2691
-            $action_desc,
2692
-            $this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2693
-            true
2694
-        );
2695
-    }
2696
-
2697
-
2698
-    /**
2699
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2700
-     * models get affected.
2701
-     *
2702
-     * @param EE_Registration $REG registration to be deleted permanently
2703
-     * @return bool true = successful deletion, false = fail.
2704
-     * @throws EE_Error
2705
-     * @throws InvalidArgumentException
2706
-     * @throws InvalidDataTypeException
2707
-     * @throws InvalidInterfaceException
2708
-     * @throws ReflectionException
2709
-     */
2710
-    protected function _delete_registration(EE_Registration $REG)
2711
-    {
2712
-        // first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2713
-        // registrations on the transaction that are NOT trashed.
2714
-        $TXN = $REG->get_first_related('Transaction');
2715
-        $REGS = $TXN->get_many_related('Registration');
2716
-        $all_trashed = true;
2717
-        foreach ($REGS as $registration) {
2718
-            if (! $registration->get('REG_deleted')) {
2719
-                $all_trashed = false;
2720
-            }
2721
-        }
2722
-        if (! $all_trashed) {
2723
-            EE_Error::add_error(
2724
-                esc_html__(
2725
-                    'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2726
-                    'event_espresso'
2727
-                ),
2728
-                __FILE__,
2729
-                __FUNCTION__,
2730
-                __LINE__
2731
-            );
2732
-            return false;
2733
-        }
2734
-        // k made it here so that means we can delete all the related transactions and their answers (but let's do them
2735
-        // separately from THIS one).
2736
-        foreach ($REGS as $registration) {
2737
-            // delete related answers
2738
-            $registration->delete_related_permanently('Answer');
2739
-            // remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2740
-            $attendee = $registration->get_first_related('Attendee');
2741
-            if ($attendee instanceof EE_Attendee) {
2742
-                $registration->_remove_relation_to($attendee, 'Attendee');
2743
-            }
2744
-            // now remove relationships to tickets on this registration.
2745
-            $registration->_remove_relations('Ticket');
2746
-            // now delete permanently the checkins related to this registration.
2747
-            $registration->delete_related_permanently('Checkin');
2748
-            if ($registration->ID() === $REG->ID()) {
2749
-                continue;
2750
-            } //we don't want to delete permanently the existing registration just yet.
2751
-            // remove relation to transaction for these registrations if NOT the existing registrations
2752
-            $registration->_remove_relations('Transaction');
2753
-            // delete permanently any related messages.
2754
-            $registration->delete_related_permanently('Message');
2755
-            // now delete this registration permanently
2756
-            $registration->delete_permanently();
2757
-        }
2758
-        // now all related registrations on the transaction are handled.  So let's just handle this registration itself
2759
-        // (the transaction and line items should be all that's left).
2760
-        // delete the line items related to the transaction for this registration.
2761
-        $TXN->delete_related_permanently('Line_Item');
2762
-        // we need to remove all the relationships on the transaction
2763
-        $TXN->delete_related_permanently('Payment');
2764
-        $TXN->delete_related_permanently('Extra_Meta');
2765
-        $TXN->delete_related_permanently('Message');
2766
-        // now we can delete this REG permanently (and the transaction of course)
2767
-        $REG->delete_related_permanently('Transaction');
2768
-        return $REG->delete_permanently();
2769
-    }
2770
-
2771
-
2772
-    /**
2773
-     *    generates HTML for the Register New Attendee Admin page
2774
-     *
2775
-     * @access private
2776
-     * @throws DomainException
2777
-     * @throws EE_Error
2778
-     * @throws InvalidArgumentException
2779
-     * @throws InvalidDataTypeException
2780
-     * @throws InvalidInterfaceException
2781
-     * @throws ReflectionException
2782
-     */
2783
-    public function new_registration()
2784
-    {
2785
-        if (! $this->_set_reg_event()) {
2786
-            throw new EE_Error(
2787
-                esc_html__(
2788
-                    'Unable to continue with registering because there is no Event ID in the request',
2789
-                    'event_espresso'
2790
-                )
2791
-            );
2792
-        }
2793
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2794
-        // gotta start with a clean slate if we're not coming here via ajax
2795
-        if (! defined('DOING_AJAX')
2796
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797
-        ) {
2798
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799
-        }
2800
-        $this->_template_args['event_name'] = '';
2801
-        // event name
2802
-        if ($this->_reg_event) {
2803
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2804
-            $edit_event_url = self::add_query_args_and_nonce(
2805
-                array(
2806
-                    'action' => 'edit',
2807
-                    'post'   => $this->_reg_event->ID(),
2808
-                ),
2809
-                EVENTS_ADMIN_URL
2810
-            );
2811
-            $edit_event_lnk = '<a href="'
2812
-                              . $edit_event_url
2813
-                              . '" title="'
2814
-                              . esc_attr__('Edit ', 'event_espresso')
2815
-                              . $this->_reg_event->name()
2816
-                              . '">'
2817
-                              . esc_html__('Edit Event', 'event_espresso')
2818
-                              . '</a>';
2819
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2820
-                                                   . $edit_event_lnk
2821
-                                                   . '</span>';
2822
-        }
2823
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2824
-        if (defined('DOING_AJAX')) {
2825
-            $this->_return_json();
2826
-        }
2827
-        // grab header
2828
-        $template_path =
2829
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2830
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831
-            $template_path,
2832
-            $this->_template_args,
2833
-            true
2834
-        );
2835
-        // $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2836
-        // the details template wrapper
2837
-        $this->display_admin_page_with_sidebar();
2838
-    }
2839
-
2840
-
2841
-    /**
2842
-     * This returns the content for a registration step
2843
-     *
2844
-     * @access protected
2845
-     * @return string html
2846
-     * @throws DomainException
2847
-     * @throws EE_Error
2848
-     * @throws InvalidArgumentException
2849
-     * @throws InvalidDataTypeException
2850
-     * @throws InvalidInterfaceException
2851
-     */
2852
-    protected function _get_registration_step_content()
2853
-    {
2854
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2855
-            $warning_msg = sprintf(
2856
-                esc_html__(
2857
-                    '%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2858
-                    'event_espresso'
2859
-                ),
2860
-                '<br />',
2861
-                '<h3 class="important-notice">',
2862
-                '</h3>',
2863
-                '<div class="float-right">',
2864
-                '<span id="redirect_timer" class="important-notice">30</span>',
2865
-                '</div>',
2866
-                '<b>',
2867
-                '</b>'
2868
-            );
2869
-            return '
2301
+	}
2302
+
2303
+
2304
+	/**
2305
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2306
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2307
+	 * to display the page
2308
+	 *
2309
+	 * @access protected
2310
+	 * @return void
2311
+	 * @throws EE_Error
2312
+	 * @throws InvalidArgumentException
2313
+	 * @throws InvalidDataTypeException
2314
+	 * @throws InvalidInterfaceException
2315
+	 * @throws ReflectionException
2316
+	 */
2317
+	protected function _update_attendee_registration_form()
2318
+	{
2319
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2320
+		if ($_SERVER['REQUEST_METHOD'] === 'POST') {
2321
+			$REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2322
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2323
+			if ($success) {
2324
+				$what = esc_html__('Registration Form', 'event_espresso');
2325
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2326
+					: array('action' => 'default');
2327
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2328
+			}
2329
+		}
2330
+	}
2331
+
2332
+
2333
+	/**
2334
+	 * Gets the form for saving registrations custom questions (if done
2335
+	 * previously retrieves the cached form object, which may have validation errors in it)
2336
+	 *
2337
+	 * @param int $REG_ID
2338
+	 * @return EE_Registration_Custom_Questions_Form
2339
+	 * @throws EE_Error
2340
+	 * @throws InvalidArgumentException
2341
+	 * @throws InvalidDataTypeException
2342
+	 * @throws InvalidInterfaceException
2343
+	 */
2344
+	protected function _get_reg_custom_questions_form($REG_ID)
2345
+	{
2346
+		if (! $this->_reg_custom_questions_form) {
2347
+			require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349
+				$this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350
+			);
2351
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2352
+		}
2353
+		return $this->_reg_custom_questions_form;
2354
+	}
2355
+
2356
+
2357
+	/**
2358
+	 * Saves
2359
+	 *
2360
+	 * @access private
2361
+	 * @param bool $REG_ID
2362
+	 * @return bool
2363
+	 * @throws EE_Error
2364
+	 * @throws InvalidArgumentException
2365
+	 * @throws InvalidDataTypeException
2366
+	 * @throws InvalidInterfaceException
2367
+	 * @throws ReflectionException
2368
+	 */
2369
+	private function _save_reg_custom_questions_form($REG_ID = false)
2370
+	{
2371
+		if (! $REG_ID) {
2372
+			EE_Error::add_error(
2373
+				esc_html__(
2374
+					'An error occurred. No registration ID was received.',
2375
+					'event_espresso'
2376
+				),
2377
+				__FILE__,
2378
+				__FUNCTION__,
2379
+				__LINE__
2380
+			);
2381
+		}
2382
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2383
+		$form->receive_form_submission($this->_req_data);
2384
+		$success = false;
2385
+		if ($form->is_valid()) {
2386
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2387
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2388
+					$where_conditions = array(
2389
+						'QST_ID' => $question_id,
2390
+						'REG_ID' => $REG_ID,
2391
+					);
2392
+					$possibly_new_values = array(
2393
+						'ANS_value' => $input->normalized_value(),
2394
+					);
2395
+					$answer = EEM_Answer::instance()->get_one(array($where_conditions));
2396
+					if ($answer instanceof EE_Answer) {
2397
+						$success = $answer->save($possibly_new_values);
2398
+					} else {
2399
+						// insert it then
2400
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2401
+						$answer = EE_Answer::new_instance($cols_n_vals);
2402
+						$success = $answer->save();
2403
+					}
2404
+				}
2405
+			}
2406
+		} else {
2407
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2408
+		}
2409
+		return $success;
2410
+	}
2411
+
2412
+
2413
+	/**
2414
+	 *        generates HTML for the Registration main meta box
2415
+	 *
2416
+	 * @access public
2417
+	 * @return void
2418
+	 * @throws DomainException
2419
+	 * @throws EE_Error
2420
+	 * @throws InvalidArgumentException
2421
+	 * @throws InvalidDataTypeException
2422
+	 * @throws InvalidInterfaceException
2423
+	 * @throws ReflectionException
2424
+	 */
2425
+	public function _reg_attendees_meta_box()
2426
+	{
2427
+		$REG = $this->getRegistrationModel();
2428
+		// get all other registrations on this transaction, and cache
2429
+		// the attendees for them so we don't have to run another query using force_join
2430
+		$registrations = $REG->get_all(
2431
+			array(
2432
+				array(
2433
+					'TXN_ID' => $this->_registration->transaction_ID(),
2434
+					'REG_ID' => array('!=', $this->_registration->ID()),
2435
+				),
2436
+				'force_join' => array('Attendee'),
2437
+				'default_where_conditions' => 'other_models_only',
2438
+			)
2439
+		);
2440
+		$this->_template_args['attendees'] = array();
2441
+		$this->_template_args['attendee_notice'] = '';
2442
+		if (empty($registrations)
2443
+			|| (is_array($registrations)
2444
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2445
+		) {
2446
+			EE_Error::add_error(
2447
+				esc_html__(
2448
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2449
+					'event_espresso'
2450
+				),
2451
+				__FILE__,
2452
+				__FUNCTION__,
2453
+				__LINE__
2454
+			);
2455
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2456
+		} else {
2457
+			$att_nmbr = 1;
2458
+			foreach ($registrations as $registration) {
2459
+				/* @var $registration EE_Registration */
2460
+				$attendee = $registration->attendee()
2461
+					? $registration->attendee()
2462
+					: $this->getAttendeeModel()->create_default_object();
2463
+				$this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
+				$this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
+				$this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
+				$this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
+				$this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
+				$this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2469
+					', ',
2470
+					$attendee->full_address_as_array()
2471
+				);
2472
+				$this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2473
+					array(
2474
+						'action' => 'edit_attendee',
2475
+						'post'   => $attendee->ID(),
2476
+					),
2477
+					REG_ADMIN_URL
2478
+				);
2479
+				$this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2480
+					? $registration->event_obj()->name()
2481
+					: '';
2482
+				$att_nmbr++;
2483
+			}
2484
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485
+		}
2486
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2487
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488
+	}
2489
+
2490
+
2491
+	/**
2492
+	 *        generates HTML for the Edit Registration side meta box
2493
+	 *
2494
+	 * @access public
2495
+	 * @return void
2496
+	 * @throws DomainException
2497
+	 * @throws EE_Error
2498
+	 * @throws InvalidArgumentException
2499
+	 * @throws InvalidDataTypeException
2500
+	 * @throws InvalidInterfaceException
2501
+	 * @throws ReflectionException
2502
+	 */
2503
+	public function _reg_registrant_side_meta_box()
2504
+	{
2505
+		/*@var $attendee EE_Attendee */
2506
+		$att_check = $this->_registration->attendee();
2507
+		$attendee = $att_check instanceof EE_Attendee
2508
+			? $att_check
2509
+			: $this->getAttendeeModel()->create_default_object();
2510
+		// now let's determine if this is not the primary registration.  If it isn't then we set the
2511
+		// primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512
+		// primary registration object (that way we know if we need to show create button or not)
2513
+		if (! $this->_registration->is_primary_registrant()) {
2514
+			$primary_registration = $this->_registration->get_primary_registration();
2515
+			$primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516
+				: null;
2517
+			if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518
+				// in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519
+				// custom attendee object so let's not worry about the primary reg.
2520
+				$primary_registration = null;
2521
+			}
2522
+		} else {
2523
+			$primary_registration = null;
2524
+		}
2525
+		$this->_template_args['ATT_ID'] = $attendee->ID();
2526
+		$this->_template_args['fname'] = $attendee->fname();
2527
+		$this->_template_args['lname'] = $attendee->lname();
2528
+		$this->_template_args['email'] = $attendee->email();
2529
+		$this->_template_args['phone'] = $attendee->phone();
2530
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2531
+		// edit link
2532
+		$this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(
2533
+			array(
2534
+				'action' => 'edit_attendee',
2535
+				'post'   => $attendee->ID(),
2536
+			),
2537
+			REG_ADMIN_URL
2538
+		);
2539
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2540
+		// create link
2541
+		$this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2542
+			? EE_Admin_Page::add_query_args_and_nonce(
2543
+				array(
2544
+					'action'  => 'duplicate_attendee',
2545
+					'_REG_ID' => $this->_registration->ID(),
2546
+				),
2547
+				REG_ADMIN_URL
2548
+			) : '';
2549
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550
+		$this->_template_args['att_check'] = $att_check;
2551
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2552
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553
+	}
2554
+
2555
+
2556
+	/**
2557
+	 * trash or restore registrations
2558
+	 *
2559
+	 * @param  boolean $trash whether to archive or restore
2560
+	 * @return void
2561
+	 * @throws EE_Error
2562
+	 * @throws InvalidArgumentException
2563
+	 * @throws InvalidDataTypeException
2564
+	 * @throws InvalidInterfaceException
2565
+	 * @throws RuntimeException
2566
+	 * @access protected
2567
+	 */
2568
+	protected function _trash_or_restore_registrations($trash = true)
2569
+	{
2570
+		// if empty _REG_ID then get out because there's nothing to do
2571
+		if (empty($this->_req_data['_REG_ID'])) {
2572
+			EE_Error::add_error(
2573
+				sprintf(
2574
+					esc_html__(
2575
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2576
+						'event_espresso'
2577
+					),
2578
+					$trash ? 'trash' : 'restore'
2579
+				),
2580
+				__FILE__,
2581
+				__LINE__,
2582
+				__FUNCTION__
2583
+			);
2584
+			$this->_redirect_after_action(false, '', '', array(), true);
2585
+		}
2586
+		$success = 0;
2587
+		$overwrite_msgs = false;
2588
+		// Checkboxes
2589
+		if (! is_array($this->_req_data['_REG_ID'])) {
2590
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591
+		}
2592
+		$reg_count = count($this->_req_data['_REG_ID']);
2593
+		// cycle thru checkboxes
2594
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2595
+			/** @var EE_Registration $REG */
2596
+			$REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597
+			$payments = $REG->registration_payments();
2598
+			if (! empty($payments)) {
2599
+				$name = $REG->attendee() instanceof EE_Attendee
2600
+					? $REG->attendee()->full_name()
2601
+					: esc_html__('Unknown Attendee', 'event_espresso');
2602
+				$overwrite_msgs = true;
2603
+				EE_Error::add_error(
2604
+					sprintf(
2605
+						esc_html__(
2606
+							'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2607
+							'event_espresso'
2608
+						),
2609
+						$name
2610
+					),
2611
+					__FILE__,
2612
+					__FUNCTION__,
2613
+					__LINE__
2614
+				);
2615
+				// can't trash this registration because it has payments.
2616
+				continue;
2617
+			}
2618
+			$updated = $trash ? $REG->delete() : $REG->restore();
2619
+			if ($updated) {
2620
+				$success++;
2621
+			}
2622
+		}
2623
+		$this->_redirect_after_action(
2624
+			$success === $reg_count, // were ALL registrations affected?
2625
+			$success > 1
2626
+				? esc_html__('Registrations', 'event_espresso')
2627
+				: esc_html__('Registration', 'event_espresso'),
2628
+			$trash
2629
+				? esc_html__('moved to the trash', 'event_espresso')
2630
+				: esc_html__('restored', 'event_espresso'),
2631
+			$this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')),
2632
+			$overwrite_msgs
2633
+		);
2634
+	}
2635
+
2636
+
2637
+	/**
2638
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2639
+	 * registration but also.
2640
+	 * 1. Removing relations to EE_Attendee
2641
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2642
+	 * ALSO trashed.
2643
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2644
+	 * 4. Removing relationships between all tickets and the related registrations
2645
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2646
+	 * 6. Deleting permanently any related Checkins.
2647
+	 *
2648
+	 * @return void
2649
+	 * @throws EE_Error
2650
+	 * @throws InvalidArgumentException
2651
+	 * @throws InvalidDataTypeException
2652
+	 * @throws InvalidInterfaceException
2653
+	 * @throws ReflectionException
2654
+	 */
2655
+	protected function _delete_registrations()
2656
+	{
2657
+		$REG_MDL = $this->getRegistrationModel();
2658
+		$success = 1;
2659
+		// Checkboxes
2660
+		if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661
+			// if array has more than one element than success message should be plural
2662
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663
+			// cycle thru checkboxes
2664
+			foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
+				if (! $REG instanceof EE_Registration) {
2667
+					continue;
2668
+				}
2669
+				$deleted = $this->_delete_registration($REG);
2670
+				if (! $deleted) {
2671
+					$success = 0;
2672
+				}
2673
+			}
2674
+		} else {
2675
+			// grab single id and delete
2676
+			$REG_ID = $this->_req_data['_REG_ID'];
2677
+			/** @var EE_Registration $REG */
2678
+			$REG = $REG_MDL->get_one_by_ID($REG_ID);
2679
+			$deleted = $this->_delete_registration($REG);
2680
+			if (! $deleted) {
2681
+				$success = 0;
2682
+			}
2683
+		}
2684
+		$what = $success > 1
2685
+			? esc_html__('Registrations', 'event_espresso')
2686
+			: esc_html__('Registration', 'event_espresso');
2687
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2688
+		$this->_redirect_after_action(
2689
+			$success,
2690
+			$what,
2691
+			$action_desc,
2692
+			$this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']),
2693
+			true
2694
+		);
2695
+	}
2696
+
2697
+
2698
+	/**
2699
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2700
+	 * models get affected.
2701
+	 *
2702
+	 * @param EE_Registration $REG registration to be deleted permanently
2703
+	 * @return bool true = successful deletion, false = fail.
2704
+	 * @throws EE_Error
2705
+	 * @throws InvalidArgumentException
2706
+	 * @throws InvalidDataTypeException
2707
+	 * @throws InvalidInterfaceException
2708
+	 * @throws ReflectionException
2709
+	 */
2710
+	protected function _delete_registration(EE_Registration $REG)
2711
+	{
2712
+		// first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2713
+		// registrations on the transaction that are NOT trashed.
2714
+		$TXN = $REG->get_first_related('Transaction');
2715
+		$REGS = $TXN->get_many_related('Registration');
2716
+		$all_trashed = true;
2717
+		foreach ($REGS as $registration) {
2718
+			if (! $registration->get('REG_deleted')) {
2719
+				$all_trashed = false;
2720
+			}
2721
+		}
2722
+		if (! $all_trashed) {
2723
+			EE_Error::add_error(
2724
+				esc_html__(
2725
+					'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2726
+					'event_espresso'
2727
+				),
2728
+				__FILE__,
2729
+				__FUNCTION__,
2730
+				__LINE__
2731
+			);
2732
+			return false;
2733
+		}
2734
+		// k made it here so that means we can delete all the related transactions and their answers (but let's do them
2735
+		// separately from THIS one).
2736
+		foreach ($REGS as $registration) {
2737
+			// delete related answers
2738
+			$registration->delete_related_permanently('Answer');
2739
+			// remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2740
+			$attendee = $registration->get_first_related('Attendee');
2741
+			if ($attendee instanceof EE_Attendee) {
2742
+				$registration->_remove_relation_to($attendee, 'Attendee');
2743
+			}
2744
+			// now remove relationships to tickets on this registration.
2745
+			$registration->_remove_relations('Ticket');
2746
+			// now delete permanently the checkins related to this registration.
2747
+			$registration->delete_related_permanently('Checkin');
2748
+			if ($registration->ID() === $REG->ID()) {
2749
+				continue;
2750
+			} //we don't want to delete permanently the existing registration just yet.
2751
+			// remove relation to transaction for these registrations if NOT the existing registrations
2752
+			$registration->_remove_relations('Transaction');
2753
+			// delete permanently any related messages.
2754
+			$registration->delete_related_permanently('Message');
2755
+			// now delete this registration permanently
2756
+			$registration->delete_permanently();
2757
+		}
2758
+		// now all related registrations on the transaction are handled.  So let's just handle this registration itself
2759
+		// (the transaction and line items should be all that's left).
2760
+		// delete the line items related to the transaction for this registration.
2761
+		$TXN->delete_related_permanently('Line_Item');
2762
+		// we need to remove all the relationships on the transaction
2763
+		$TXN->delete_related_permanently('Payment');
2764
+		$TXN->delete_related_permanently('Extra_Meta');
2765
+		$TXN->delete_related_permanently('Message');
2766
+		// now we can delete this REG permanently (and the transaction of course)
2767
+		$REG->delete_related_permanently('Transaction');
2768
+		return $REG->delete_permanently();
2769
+	}
2770
+
2771
+
2772
+	/**
2773
+	 *    generates HTML for the Register New Attendee Admin page
2774
+	 *
2775
+	 * @access private
2776
+	 * @throws DomainException
2777
+	 * @throws EE_Error
2778
+	 * @throws InvalidArgumentException
2779
+	 * @throws InvalidDataTypeException
2780
+	 * @throws InvalidInterfaceException
2781
+	 * @throws ReflectionException
2782
+	 */
2783
+	public function new_registration()
2784
+	{
2785
+		if (! $this->_set_reg_event()) {
2786
+			throw new EE_Error(
2787
+				esc_html__(
2788
+					'Unable to continue with registering because there is no Event ID in the request',
2789
+					'event_espresso'
2790
+				)
2791
+			);
2792
+		}
2793
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2794
+		// gotta start with a clean slate if we're not coming here via ajax
2795
+		if (! defined('DOING_AJAX')
2796
+			&& (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797
+		) {
2798
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799
+		}
2800
+		$this->_template_args['event_name'] = '';
2801
+		// event name
2802
+		if ($this->_reg_event) {
2803
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2804
+			$edit_event_url = self::add_query_args_and_nonce(
2805
+				array(
2806
+					'action' => 'edit',
2807
+					'post'   => $this->_reg_event->ID(),
2808
+				),
2809
+				EVENTS_ADMIN_URL
2810
+			);
2811
+			$edit_event_lnk = '<a href="'
2812
+							  . $edit_event_url
2813
+							  . '" title="'
2814
+							  . esc_attr__('Edit ', 'event_espresso')
2815
+							  . $this->_reg_event->name()
2816
+							  . '">'
2817
+							  . esc_html__('Edit Event', 'event_espresso')
2818
+							  . '</a>';
2819
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2820
+												   . $edit_event_lnk
2821
+												   . '</span>';
2822
+		}
2823
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2824
+		if (defined('DOING_AJAX')) {
2825
+			$this->_return_json();
2826
+		}
2827
+		// grab header
2828
+		$template_path =
2829
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2830
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831
+			$template_path,
2832
+			$this->_template_args,
2833
+			true
2834
+		);
2835
+		// $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2836
+		// the details template wrapper
2837
+		$this->display_admin_page_with_sidebar();
2838
+	}
2839
+
2840
+
2841
+	/**
2842
+	 * This returns the content for a registration step
2843
+	 *
2844
+	 * @access protected
2845
+	 * @return string html
2846
+	 * @throws DomainException
2847
+	 * @throws EE_Error
2848
+	 * @throws InvalidArgumentException
2849
+	 * @throws InvalidDataTypeException
2850
+	 * @throws InvalidInterfaceException
2851
+	 */
2852
+	protected function _get_registration_step_content()
2853
+	{
2854
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2855
+			$warning_msg = sprintf(
2856
+				esc_html__(
2857
+					'%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2858
+					'event_espresso'
2859
+				),
2860
+				'<br />',
2861
+				'<h3 class="important-notice">',
2862
+				'</h3>',
2863
+				'<div class="float-right">',
2864
+				'<span id="redirect_timer" class="important-notice">30</span>',
2865
+				'</div>',
2866
+				'<b>',
2867
+				'</b>'
2868
+			);
2869
+			return '
2870 2870
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2871 2871
 	<script >
2872 2872
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2879,868 +2879,868 @@  discard block
 block discarded – undo
2879 2879
 	        }
2880 2880
 	    }, 800 );
2881 2881
 	</script >';
2882
-        }
2883
-        $template_args = array(
2884
-            'title'                    => '',
2885
-            'content'                  => '',
2886
-            'step_button_text'         => '',
2887
-            'show_notification_toggle' => false,
2888
-        );
2889
-        // to indicate we're processing a new registration
2890
-        $hidden_fields = array(
2891
-            'processing_registration' => array(
2892
-                'type'  => 'hidden',
2893
-                'value' => 0,
2894
-            ),
2895
-            'event_id'                => array(
2896
-                'type'  => 'hidden',
2897
-                'value' => $this->_reg_event->ID(),
2898
-            ),
2899
-        );
2900
-        // if the cart is empty then we know we're at step one so we'll display ticket selector
2901
-        $cart = EE_Registry::instance()->SSN->cart();
2902
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2903
-        switch ($step) {
2904
-            case 'ticket':
2905
-                $hidden_fields['processing_registration']['value'] = 1;
2906
-                $template_args['title'] = esc_html__(
2907
-                    'Step One: Select the Ticket for this registration',
2908
-                    'event_espresso'
2909
-                );
2910
-                $template_args['content'] =
2911
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2912
-                $template_args['content'] .= '</div>';
2913
-                $template_args['step_button_text'] = esc_html__(
2914
-                    'Add Tickets and Continue to Registrant Details',
2915
-                    'event_espresso'
2916
-                );
2917
-                $template_args['show_notification_toggle'] = false;
2918
-                break;
2919
-            case 'questions':
2920
-                $hidden_fields['processing_registration']['value'] = 2;
2921
-                $template_args['title'] = esc_html__(
2922
-                    'Step Two: Add Registrant Details for this Registration',
2923
-                    'event_espresso'
2924
-                );
2925
-                // in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2926
-                // properly by the first process_reg_step run.
2927
-                $template_args['content'] =
2928
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2929
-                $template_args['step_button_text'] = esc_html__(
2930
-                    'Save Registration and Continue to Details',
2931
-                    'event_espresso'
2932
-                );
2933
-                $template_args['show_notification_toggle'] = true;
2934
-                break;
2935
-        }
2936
-        // we come back to the process_registration_step route.
2937
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938
-        return EEH_Template::display_template(
2939
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2940
-            $template_args,
2941
-            true
2942
-        );
2943
-    }
2944
-
2945
-
2946
-    /**
2947
-     *        set_reg_event
2948
-     *
2949
-     * @access private
2950
-     * @return bool
2951
-     * @throws EE_Error
2952
-     * @throws InvalidArgumentException
2953
-     * @throws InvalidDataTypeException
2954
-     * @throws InvalidInterfaceException
2955
-     */
2956
-    private function _set_reg_event()
2957
-    {
2958
-        if (is_object($this->_reg_event)) {
2959
-            return true;
2960
-        }
2961
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
-        if (! $EVT_ID) {
2963
-            return false;
2964
-        }
2965
-        $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
2966
-        return true;
2967
-    }
2968
-
2969
-
2970
-    /**
2971
-     * process_reg_step
2972
-     *
2973
-     * @access        public
2974
-     * @return string
2975
-     * @throws DomainException
2976
-     * @throws EE_Error
2977
-     * @throws InvalidArgumentException
2978
-     * @throws InvalidDataTypeException
2979
-     * @throws InvalidInterfaceException
2980
-     * @throws ReflectionException
2981
-     * @throws RuntimeException
2982
-     */
2983
-    public function process_reg_step()
2984
-    {
2985
-        EE_System::do_not_cache();
2986
-        $this->_set_reg_event();
2987
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2988
-        EE_Registry::instance()->REQ->set('uts', time());
2989
-        // what step are we on?
2990
-        $cart = EE_Registry::instance()->SSN->cart();
2991
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992
-        // if doing ajax then we need to verify the nonce
2993
-        if (defined('DOING_AJAX')) {
2994
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2996
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2997
-        }
2998
-        switch ($step) {
2999
-            case 'ticket':
3000
-                // process ticket selection
3001
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
3002
-                if ($success) {
3003
-                    EE_Error::add_success(
3004
-                        esc_html__(
3005
-                            'Tickets Selected. Now complete the registration.',
3006
-                            'event_espresso'
3007
-                        )
3008
-                    );
3009
-                } else {
3010
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
3011
-                }
3012
-                if (defined('DOING_AJAX')) {
3013
-                    $this->new_registration(); // display next step
3014
-                } else {
3015
-                    $query_args = array(
3016
-                        'action'                  => 'new_registration',
3017
-                        'processing_registration' => 1,
3018
-                        'event_id'                => $this->_reg_event->ID(),
3019
-                        'uts'                     => time(),
3020
-                    );
3021
-                    $this->_redirect_after_action(
3022
-                        false,
3023
-                        '',
3024
-                        '',
3025
-                        $query_args,
3026
-                        true
3027
-                    );
3028
-                }
3029
-                break;
3030
-            case 'questions':
3031
-                if (! isset(
3032
-                    $this->_req_data['txn_reg_status_change'],
3033
-                    $this->_req_data['txn_reg_status_change']['send_notifications']
3034
-                )
3035
-                ) {
3036
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3037
-                }
3038
-                // process registration
3039
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3040
-                if ($cart instanceof EE_Cart) {
3041
-                    $grand_total = $cart->get_cart_grand_total();
3042
-                    if ($grand_total instanceof EE_Line_Item) {
3043
-                        $grand_total->save_this_and_descendants_to_txn();
3044
-                    }
3045
-                }
3046
-                if (! $transaction instanceof EE_Transaction) {
3047
-                    $query_args = array(
3048
-                        'action'                  => 'new_registration',
3049
-                        'processing_registration' => 2,
3050
-                        'event_id'                => $this->_reg_event->ID(),
3051
-                        'uts'                     => time(),
3052
-                    );
3053
-                    if (defined('DOING_AJAX')) {
3054
-                        // display registration form again because there are errors (maybe validation?)
3055
-                        $this->new_registration();
3056
-                        return;
3057
-                    }
3058
-                    $this->_redirect_after_action(
3059
-                        false,
3060
-                        '',
3061
-                        '',
3062
-                        $query_args,
3063
-                        true
3064
-                    );
3065
-                    return;
3066
-                }
3067
-                // maybe update status, and make sure to save transaction if not done already
3068
-                if (! $transaction->update_status_based_on_total_paid()) {
3069
-                    $transaction->save();
3070
-                }
3071
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3072
-                $this->_req_data = array();
3073
-                $query_args = array(
3074
-                    'action'        => 'redirect_to_txn',
3075
-                    'TXN_ID'        => $transaction->ID(),
3076
-                    'EVT_ID'        => $this->_reg_event->ID(),
3077
-                    'event_name'    => urlencode($this->_reg_event->name()),
3078
-                    'redirect_from' => 'new_registration',
3079
-                );
3080
-                $this->_redirect_after_action(false, '', '', $query_args, true);
3081
-                break;
3082
-        }
3083
-        // what are you looking here for?  Should be nothing to do at this point.
3084
-    }
3085
-
3086
-
3087
-    /**
3088
-     * redirect_to_txn
3089
-     *
3090
-     * @access public
3091
-     * @return void
3092
-     * @throws EE_Error
3093
-     * @throws InvalidArgumentException
3094
-     * @throws InvalidDataTypeException
3095
-     * @throws InvalidInterfaceException
3096
-     * @throws ReflectionException
3097
-     */
3098
-    public function redirect_to_txn()
3099
-    {
3100
-        EE_System::do_not_cache();
3101
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3102
-        $query_args = array(
3103
-            'action' => 'view_transaction',
3104
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3105
-            'page'   => 'espresso_transactions',
3106
-        );
3107
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3108
-            $query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3109
-            $query_args['event_name'] = urlencode($this->_req_data['event_name']);
3110
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3111
-        }
3112
-        EE_Error::add_success(
3113
-            esc_html__(
3114
-                'Registration Created.  Please review the transaction and add any payments as necessary',
3115
-                'event_espresso'
3116
-            )
3117
-        );
3118
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3119
-    }
3120
-
3121
-
3122
-    /**
3123
-     *        generates HTML for the Attendee Contact List
3124
-     *
3125
-     * @access protected
3126
-     * @return void
3127
-     * @throws DomainException
3128
-     * @throws EE_Error
3129
-     */
3130
-    protected function _attendee_contact_list_table()
3131
-    {
3132
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3133
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3134
-        $this->display_admin_list_table_page_with_no_sidebar();
3135
-    }
3136
-
3137
-
3138
-    /**
3139
-     *        get_attendees
3140
-     *
3141
-     * @param      $per_page
3142
-     * @param bool $count whether to return count or data.
3143
-     * @param bool $trash
3144
-     * @return array
3145
-     * @throws EE_Error
3146
-     * @throws InvalidArgumentException
3147
-     * @throws InvalidDataTypeException
3148
-     * @throws InvalidInterfaceException
3149
-     * @access public
3150
-     */
3151
-    public function get_attendees($per_page, $count = false, $trash = false)
3152
-    {
3153
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3155
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156
-        switch ($this->_req_data['orderby']) {
3157
-            case 'ATT_ID':
3158
-                $orderby = 'ATT_ID';
3159
-                break;
3160
-            case 'ATT_fname':
3161
-                $orderby = 'ATT_fname';
3162
-                break;
3163
-            case 'ATT_email':
3164
-                $orderby = 'ATT_email';
3165
-                break;
3166
-            case 'ATT_city':
3167
-                $orderby = 'ATT_city';
3168
-                break;
3169
-            case 'STA_ID':
3170
-                $orderby = 'STA_ID';
3171
-                break;
3172
-            case 'CNT_ID':
3173
-                $orderby = 'CNT_ID';
3174
-                break;
3175
-            case 'Registration_Count':
3176
-                $orderby = 'Registration_Count';
3177
-                break;
3178
-            default:
3179
-                $orderby = 'ATT_lname';
3180
-        }
3181
-        $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3182
-            ? $this->_req_data['order']
3183
-            : 'ASC';
3184
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3185
-            ? $this->_req_data['paged']
3186
-            : 1;
3187
-        $per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3188
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3189
-            ? $this->_req_data['perpage']
3190
-            : $per_page;
3191
-        $_where = array();
3192
-        if (! empty($this->_req_data['s'])) {
3193
-            $sstr = '%' . $this->_req_data['s'] . '%';
3194
-            $_where['OR'] = array(
3195
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3197
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3198
-                'ATT_fname'                         => array('LIKE', $sstr),
3199
-                'ATT_lname'                         => array('LIKE', $sstr),
3200
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3201
-                'ATT_email'                         => array('LIKE', $sstr),
3202
-                'ATT_address'                       => array('LIKE', $sstr),
3203
-                'ATT_address2'                      => array('LIKE', $sstr),
3204
-                'ATT_city'                          => array('LIKE', $sstr),
3205
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3206
-                'State.STA_name'                    => array('LIKE', $sstr),
3207
-                'ATT_phone'                         => array('LIKE', $sstr),
3208
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3209
-                'Registration.REG_code'             => array('LIKE', $sstr),
3210
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3211
-            );
3212
-        }
3213
-        $offset = ($current_page - 1) * $per_page;
3214
-        $limit = $count ? null : array($offset, $per_page);
3215
-        $query_args = array(
3216
-            $_where,
3217
-            'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218
-            'limit'         => $limit,
3219
-        );
3220
-        if (! $count) {
3221
-            $query_args['order_by'] = array($orderby => $sort);
3222
-        }
3223
-        if ($trash) {
3224
-            $query_args[0]['status'] = array('!=', 'publish');
3225
-            $all_attendees = $count
3226
-                ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3227
-                : $this->getAttendeeModel()->get_all($query_args);
3228
-        } else {
3229
-            $query_args[0]['status'] = array('IN', array('publish'));
3230
-            $all_attendees = $count
3231
-                ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3232
-                : $this->getAttendeeModel()->get_all($query_args);
3233
-        }
3234
-        return $all_attendees;
3235
-    }
3236
-
3237
-
3238
-    /**
3239
-     * This is just taking care of resending the registration confirmation
3240
-     *
3241
-     * @access protected
3242
-     * @return void
3243
-     * @throws EE_Error
3244
-     * @throws InvalidArgumentException
3245
-     * @throws InvalidDataTypeException
3246
-     * @throws InvalidInterfaceException
3247
-     * @throws ReflectionException
3248
-     */
3249
-    protected function _resend_registration()
3250
-    {
3251
-        $this->_process_resend_registration();
3252
-        $query_args = isset($this->_req_data['redirect_to'])
3253
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3254
-            : array('action' => 'default');
3255
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3256
-    }
3257
-
3258
-    /**
3259
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3260
-     * to use when selecting registrations
3261
-     *
3262
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3263
-     *                                                     the query parameters from the request
3264
-     * @return void ends the request with a redirect or download
3265
-     */
3266
-    public function _registrations_report_base($method_name_for_getting_query_params)
3267
-    {
3268
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269
-            wp_redirect(
3270
-                EE_Admin_Page::add_query_args_and_nonce(
3271
-                    array(
3272
-                        'page'        => 'espresso_batch',
3273
-                        'batch'       => 'file',
3274
-                        'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3275
-                        'filters'     => urlencode(
3276
-                            serialize(
3277
-                                $this->$method_name_for_getting_query_params(
3278
-                                    EEH_Array::is_set(
3279
-                                        $this->_req_data,
3280
-                                        'filters',
3281
-                                        array()
3282
-                                    )
3283
-                                )
3284
-                            )
3285
-                        ),
3286
-                        'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3287
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3288
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3289
-                    )
3290
-                )
3291
-            );
3292
-        } else {
3293
-            $new_request_args = array(
3294
-                'export' => 'report',
3295
-                'action' => 'registrations_report_for_event',
3296
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297
-            );
3298
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3301
-                $EE_Export = EE_Export::instance($this->_req_data);
3302
-                $EE_Export->export();
3303
-            }
3304
-        }
3305
-    }
3306
-
3307
-
3308
-    /**
3309
-     * Creates a registration report using only query parameters in the request
3310
-     *
3311
-     * @return void
3312
-     */
3313
-    public function _registrations_report()
3314
-    {
3315
-        $this->_registrations_report_base('_get_registration_query_parameters');
3316
-    }
3317
-
3318
-
3319
-    public function _contact_list_export()
3320
-    {
3321
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3323
-            $EE_Export = EE_Export::instance($this->_req_data);
3324
-            $EE_Export->export_attendees();
3325
-        }
3326
-    }
3327
-
3328
-
3329
-    public function _contact_list_report()
3330
-    {
3331
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332
-            wp_redirect(
3333
-                EE_Admin_Page::add_query_args_and_nonce(
3334
-                    array(
3335
-                        'page'        => 'espresso_batch',
3336
-                        'batch'       => 'file',
3337
-                        'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3338
-                        'return_url'  => urlencode($this->_req_data['return_url']),
3339
-                    )
3340
-                )
3341
-            );
3342
-        } else {
3343
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3345
-                $EE_Export = EE_Export::instance($this->_req_data);
3346
-                $EE_Export->report_attendees();
3347
-            }
3348
-        }
3349
-    }
3350
-
3351
-
3352
-
3353
-
3354
-
3355
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3356
-    /**
3357
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3358
-     *
3359
-     * @return void
3360
-     * @throws EE_Error
3361
-     * @throws InvalidArgumentException
3362
-     * @throws InvalidDataTypeException
3363
-     * @throws InvalidInterfaceException
3364
-     * @throws ReflectionException
3365
-     */
3366
-    protected function _duplicate_attendee()
3367
-    {
3368
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3369
-        // verify we have necessary info
3370
-        if (empty($this->_req_data['_REG_ID'])) {
3371
-            EE_Error::add_error(
3372
-                esc_html__(
3373
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3374
-                    'event_espresso'
3375
-                ),
3376
-                __FILE__,
3377
-                __LINE__,
3378
-                __FUNCTION__
3379
-            );
3380
-            $query_args = array('action' => $action);
3381
-            $this->_redirect_after_action('', '', '', $query_args, true);
3382
-        }
3383
-        // okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3384
-        $registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']);
3385
-        $attendee = $registration->attendee();
3386
-        // remove relation of existing attendee on registration
3387
-        $registration->_remove_relation_to($attendee, 'Attendee');
3388
-        // new attendee
3389
-        $new_attendee = clone $attendee;
3390
-        $new_attendee->set('ATT_ID', 0);
3391
-        $new_attendee->save();
3392
-        // add new attendee to reg
3393
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3394
-        EE_Error::add_success(
3395
-            esc_html__(
3396
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3397
-                'event_espresso'
3398
-            )
3399
-        );
3400
-        // redirect to edit page for attendee
3401
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3402
-        $this->_redirect_after_action('', '', '', $query_args, true);
3403
-    }
3404
-
3405
-
3406
-    /**
3407
-     * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3408
-     *
3409
-     * @param int     $post_id
3410
-     * @param WP_POST $post
3411
-     * @throws DomainException
3412
-     * @throws EE_Error
3413
-     * @throws InvalidArgumentException
3414
-     * @throws InvalidDataTypeException
3415
-     * @throws InvalidInterfaceException
3416
-     * @throws LogicException
3417
-     * @throws InvalidFormSubmissionException
3418
-     * @throws ReflectionException
3419
-     */
3420
-    protected function _insert_update_cpt_item($post_id, $post)
3421
-    {
3422
-        $success = true;
3423
-        $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3424
-            ? $this->getAttendeeModel()->get_one_by_ID($post_id)
3425
-            : null;
3426
-        // for attendee updates
3427
-        if ($attendee instanceof EE_Attendee) {
3428
-            // note we should only be UPDATING attendees at this point.
3429
-            $updated_fields = array(
3430
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3431
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3433
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3436
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3437
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3438
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3439
-            );
3440
-            foreach ($updated_fields as $field => $value) {
3441
-                $attendee->set($field, $value);
3442
-            }
3443
-
3444
-            // process contact details metabox form handler (which will also save the attendee)
3445
-            $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3446
-            $success = $contact_details_form->process($this->_req_data);
3447
-
3448
-            $attendee_update_callbacks = apply_filters(
3449
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3450
-                array()
3451
-            );
3452
-            foreach ($attendee_update_callbacks as $a_callback) {
3453
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3454
-                    throw new EE_Error(
3455
-                        sprintf(
3456
-                            esc_html__(
3457
-                                'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3458
-                                'event_espresso'
3459
-                            ),
3460
-                            $a_callback
3461
-                        )
3462
-                    );
3463
-                }
3464
-            }
3465
-        }
3466
-
3467
-        if ($success === false) {
3468
-            EE_Error::add_error(
3469
-                esc_html__(
3470
-                    'Something went wrong with updating the meta table data for the registration.',
3471
-                    'event_espresso'
3472
-                ),
3473
-                __FILE__,
3474
-                __FUNCTION__,
3475
-                __LINE__
3476
-            );
3477
-        }
3478
-    }
3479
-
3480
-
3481
-    public function trash_cpt_item($post_id)
3482
-    {
3483
-    }
3484
-
3485
-
3486
-    public function delete_cpt_item($post_id)
3487
-    {
3488
-    }
3489
-
3490
-
3491
-    public function restore_cpt_item($post_id)
3492
-    {
3493
-    }
3494
-
3495
-
3496
-    protected function _restore_cpt_item($post_id, $revision_id)
3497
-    {
3498
-    }
3499
-
3500
-
3501
-    /**
3502
-     * @throws EE_Error
3503
-     * @since $VID:$
3504
-     */
3505
-    public function attendee_editor_metaboxes()
3506
-    {
3507
-        $this->verify_cpt_object();
3508
-        remove_meta_box(
3509
-            'postexcerpt',
3510
-            $this->_cpt_routes[ $this->_req_action ],
3511
-            'normal'
3512
-        );
3513
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3514
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3515
-            add_meta_box(
3516
-                'postexcerpt',
3517
-                esc_html__('Short Biography', 'event_espresso'),
3518
-                'post_excerpt_meta_box',
3519
-                $this->_cpt_routes[ $this->_req_action ],
3520
-                'normal'
3521
-            );
3522
-        }
3523
-        if (post_type_supports('espresso_attendees', 'comments')) {
3524
-            add_meta_box(
3525
-                'commentsdiv',
3526
-                esc_html__('Notes on the Contact', 'event_espresso'),
3527
-                'post_comment_meta_box',
3528
-                $this->_cpt_routes[ $this->_req_action ],
3529
-                'normal',
3530
-                'core'
3531
-            );
3532
-        }
3533
-        add_meta_box(
3534
-            'attendee_contact_info',
3535
-            esc_html__('Contact Info', 'event_espresso'),
3536
-            array($this, 'attendee_contact_info'),
3537
-            $this->_cpt_routes[ $this->_req_action ],
3538
-            'side',
3539
-            'core'
3540
-        );
3541
-        add_meta_box(
3542
-            'attendee_details_address',
3543
-            esc_html__('Address Details', 'event_espresso'),
3544
-            array($this, 'attendee_address_details'),
3545
-            $this->_cpt_routes[ $this->_req_action ],
3546
-            'normal',
3547
-            'core'
3548
-        );
3549
-        add_meta_box(
3550
-            'attendee_registrations',
3551
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3552
-            array($this, 'attendee_registrations_meta_box'),
3553
-            $this->_cpt_routes[ $this->_req_action ],
3554
-            'normal',
3555
-            'high'
3556
-        );
3557
-    }
3558
-
3559
-
3560
-    /**
3561
-     * Metabox for attendee contact info
3562
-     *
3563
-     * @param  WP_Post $post wp post object
3564
-     * @return string attendee contact info ( and form )
3565
-     * @throws EE_Error
3566
-     * @throws InvalidArgumentException
3567
-     * @throws InvalidDataTypeException
3568
-     * @throws InvalidInterfaceException
3569
-     * @throws LogicException
3570
-     * @throws DomainException
3571
-     */
3572
-    public function attendee_contact_info($post)
3573
-    {
3574
-        // get attendee object ( should already have it )
3575
-        $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3576
-        $form->enqueueStylesAndScripts();
3577
-        echo $form->display();
3578
-    }
3579
-
3580
-
3581
-    /**
3582
-     * Return form handler for the contact details metabox
3583
-     *
3584
-     * @param EE_Attendee $attendee
3585
-     * @return AttendeeContactDetailsMetaboxFormHandler
3586
-     * @throws DomainException
3587
-     * @throws InvalidArgumentException
3588
-     * @throws InvalidDataTypeException
3589
-     * @throws InvalidInterfaceException
3590
-     */
3591
-    protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3592
-    {
3593
-        return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3594
-    }
3595
-
3596
-
3597
-    /**
3598
-     * Metabox for attendee details
3599
-     *
3600
-     * @param  WP_Post $post wp post object
3601
-     * @throws DomainException
3602
-     */
3603
-    public function attendee_address_details($post)
3604
-    {
3605
-        // get attendee object (should already have it)
3606
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3607
-        $this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3608
-            new EE_Question_Form_Input(
3609
-                EE_Question::new_instance(
3610
-                    array(
3611
-                        'QST_ID'           => 0,
3612
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3613
-                        'QST_system'       => 'admin-state',
3614
-                    )
3615
-                ),
3616
-                EE_Answer::new_instance(
3617
-                    array(
3618
-                        'ANS_ID'    => 0,
3619
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3620
-                    )
3621
-                ),
3622
-                array(
3623
-                    'input_id'       => 'STA_ID',
3624
-                    'input_name'     => 'STA_ID',
3625
-                    'input_prefix'   => '',
3626
-                    'append_qstn_id' => false,
3627
-                )
3628
-            )
3629
-        );
3630
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3631
-            new EE_Question_Form_Input(
3632
-                EE_Question::new_instance(
3633
-                    array(
3634
-                        'QST_ID'           => 0,
3635
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3636
-                        'QST_system'       => 'admin-country',
3637
-                    )
3638
-                ),
3639
-                EE_Answer::new_instance(
3640
-                    array(
3641
-                        'ANS_ID'    => 0,
3642
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3643
-                    )
3644
-                ),
3645
-                array(
3646
-                    'input_id'       => 'CNT_ISO',
3647
-                    'input_name'     => 'CNT_ISO',
3648
-                    'input_prefix'   => '',
3649
-                    'append_qstn_id' => false,
3650
-                )
3651
-            )
3652
-        );
3653
-        $template =
3654
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3655
-        EEH_Template::display_template($template, $this->_template_args);
3656
-    }
3657
-
3658
-
3659
-    /**
3660
-     *        _attendee_details
3661
-     *
3662
-     * @access protected
3663
-     * @param $post
3664
-     * @return void
3665
-     * @throws DomainException
3666
-     * @throws EE_Error
3667
-     * @throws InvalidArgumentException
3668
-     * @throws InvalidDataTypeException
3669
-     * @throws InvalidInterfaceException
3670
-     * @throws ReflectionException
3671
-     */
3672
-    public function attendee_registrations_meta_box($post)
3673
-    {
3674
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3675
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676
-        $template =
3677
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3678
-        EEH_Template::display_template($template, $this->_template_args);
3679
-    }
3680
-
3681
-
3682
-    /**
3683
-     * add in the form fields for the attendee edit
3684
-     *
3685
-     * @param  WP_Post $post wp post object
3686
-     * @return string html for new form.
3687
-     * @throws DomainException
3688
-     */
3689
-    public function after_title_form_fields($post)
3690
-    {
3691
-        if ($post->post_type === 'espresso_attendees') {
3692
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3693
-            $template_args['attendee'] = $this->_cpt_model_obj;
3694
-            EEH_Template::display_template($template, $template_args);
3695
-        }
3696
-    }
3697
-
3698
-
3699
-    /**
3700
-     *        _trash_or_restore_attendee
3701
-     *
3702
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3703
-     * @return void
3704
-     * @throws EE_Error
3705
-     * @throws InvalidArgumentException
3706
-     * @throws InvalidDataTypeException
3707
-     * @throws InvalidInterfaceException
3708
-     * @throws ReflectionException
3709
-     * @access protected
3710
-     */
3711
-    protected function _trash_or_restore_attendees($trash = true)
3712
-    {
3713
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714
-        $success = 1;
3715
-        // Checkboxes
3716
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717
-            // if array has more than one element than success message should be plural
3718
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719
-            // cycle thru checkboxes
3720
-            foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721
-                $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722
-                    : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
-                if (! $updated) {
3724
-                    $success = 0;
3725
-                }
3726
-            }
3727
-        } else {
3728
-            // grab single id and delete
3729
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3730
-            // get attendee
3731
-            $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733
-            $updated = $att->save() && $updated;
3734
-            if (! $updated) {
3735
-                $success = 0;
3736
-            }
3737
-        }
3738
-        $what = $success > 1
3739
-            ? esc_html__('Contacts', 'event_espresso')
3740
-            : esc_html__('Contact', 'event_espresso');
3741
-        $action_desc = $trash
3742
-            ? esc_html__('moved to the trash', 'event_espresso')
3743
-            : esc_html__('restored', 'event_espresso');
3744
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3745
-    }
2882
+		}
2883
+		$template_args = array(
2884
+			'title'                    => '',
2885
+			'content'                  => '',
2886
+			'step_button_text'         => '',
2887
+			'show_notification_toggle' => false,
2888
+		);
2889
+		// to indicate we're processing a new registration
2890
+		$hidden_fields = array(
2891
+			'processing_registration' => array(
2892
+				'type'  => 'hidden',
2893
+				'value' => 0,
2894
+			),
2895
+			'event_id'                => array(
2896
+				'type'  => 'hidden',
2897
+				'value' => $this->_reg_event->ID(),
2898
+			),
2899
+		);
2900
+		// if the cart is empty then we know we're at step one so we'll display ticket selector
2901
+		$cart = EE_Registry::instance()->SSN->cart();
2902
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2903
+		switch ($step) {
2904
+			case 'ticket':
2905
+				$hidden_fields['processing_registration']['value'] = 1;
2906
+				$template_args['title'] = esc_html__(
2907
+					'Step One: Select the Ticket for this registration',
2908
+					'event_espresso'
2909
+				);
2910
+				$template_args['content'] =
2911
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2912
+				$template_args['content'] .= '</div>';
2913
+				$template_args['step_button_text'] = esc_html__(
2914
+					'Add Tickets and Continue to Registrant Details',
2915
+					'event_espresso'
2916
+				);
2917
+				$template_args['show_notification_toggle'] = false;
2918
+				break;
2919
+			case 'questions':
2920
+				$hidden_fields['processing_registration']['value'] = 2;
2921
+				$template_args['title'] = esc_html__(
2922
+					'Step Two: Add Registrant Details for this Registration',
2923
+					'event_espresso'
2924
+				);
2925
+				// in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2926
+				// properly by the first process_reg_step run.
2927
+				$template_args['content'] =
2928
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
2929
+				$template_args['step_button_text'] = esc_html__(
2930
+					'Save Registration and Continue to Details',
2931
+					'event_espresso'
2932
+				);
2933
+				$template_args['show_notification_toggle'] = true;
2934
+				break;
2935
+		}
2936
+		// we come back to the process_registration_step route.
2937
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938
+		return EEH_Template::display_template(
2939
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2940
+			$template_args,
2941
+			true
2942
+		);
2943
+	}
2944
+
2945
+
2946
+	/**
2947
+	 *        set_reg_event
2948
+	 *
2949
+	 * @access private
2950
+	 * @return bool
2951
+	 * @throws EE_Error
2952
+	 * @throws InvalidArgumentException
2953
+	 * @throws InvalidDataTypeException
2954
+	 * @throws InvalidInterfaceException
2955
+	 */
2956
+	private function _set_reg_event()
2957
+	{
2958
+		if (is_object($this->_reg_event)) {
2959
+			return true;
2960
+		}
2961
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
+		if (! $EVT_ID) {
2963
+			return false;
2964
+		}
2965
+		$this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
2966
+		return true;
2967
+	}
2968
+
2969
+
2970
+	/**
2971
+	 * process_reg_step
2972
+	 *
2973
+	 * @access        public
2974
+	 * @return string
2975
+	 * @throws DomainException
2976
+	 * @throws EE_Error
2977
+	 * @throws InvalidArgumentException
2978
+	 * @throws InvalidDataTypeException
2979
+	 * @throws InvalidInterfaceException
2980
+	 * @throws ReflectionException
2981
+	 * @throws RuntimeException
2982
+	 */
2983
+	public function process_reg_step()
2984
+	{
2985
+		EE_System::do_not_cache();
2986
+		$this->_set_reg_event();
2987
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2988
+		EE_Registry::instance()->REQ->set('uts', time());
2989
+		// what step are we on?
2990
+		$cart = EE_Registry::instance()->SSN->cart();
2991
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992
+		// if doing ajax then we need to verify the nonce
2993
+		if (defined('DOING_AJAX')) {
2994
+			$nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
+				? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2996
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2997
+		}
2998
+		switch ($step) {
2999
+			case 'ticket':
3000
+				// process ticket selection
3001
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
3002
+				if ($success) {
3003
+					EE_Error::add_success(
3004
+						esc_html__(
3005
+							'Tickets Selected. Now complete the registration.',
3006
+							'event_espresso'
3007
+						)
3008
+					);
3009
+				} else {
3010
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
3011
+				}
3012
+				if (defined('DOING_AJAX')) {
3013
+					$this->new_registration(); // display next step
3014
+				} else {
3015
+					$query_args = array(
3016
+						'action'                  => 'new_registration',
3017
+						'processing_registration' => 1,
3018
+						'event_id'                => $this->_reg_event->ID(),
3019
+						'uts'                     => time(),
3020
+					);
3021
+					$this->_redirect_after_action(
3022
+						false,
3023
+						'',
3024
+						'',
3025
+						$query_args,
3026
+						true
3027
+					);
3028
+				}
3029
+				break;
3030
+			case 'questions':
3031
+				if (! isset(
3032
+					$this->_req_data['txn_reg_status_change'],
3033
+					$this->_req_data['txn_reg_status_change']['send_notifications']
3034
+				)
3035
+				) {
3036
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3037
+				}
3038
+				// process registration
3039
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3040
+				if ($cart instanceof EE_Cart) {
3041
+					$grand_total = $cart->get_cart_grand_total();
3042
+					if ($grand_total instanceof EE_Line_Item) {
3043
+						$grand_total->save_this_and_descendants_to_txn();
3044
+					}
3045
+				}
3046
+				if (! $transaction instanceof EE_Transaction) {
3047
+					$query_args = array(
3048
+						'action'                  => 'new_registration',
3049
+						'processing_registration' => 2,
3050
+						'event_id'                => $this->_reg_event->ID(),
3051
+						'uts'                     => time(),
3052
+					);
3053
+					if (defined('DOING_AJAX')) {
3054
+						// display registration form again because there are errors (maybe validation?)
3055
+						$this->new_registration();
3056
+						return;
3057
+					}
3058
+					$this->_redirect_after_action(
3059
+						false,
3060
+						'',
3061
+						'',
3062
+						$query_args,
3063
+						true
3064
+					);
3065
+					return;
3066
+				}
3067
+				// maybe update status, and make sure to save transaction if not done already
3068
+				if (! $transaction->update_status_based_on_total_paid()) {
3069
+					$transaction->save();
3070
+				}
3071
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3072
+				$this->_req_data = array();
3073
+				$query_args = array(
3074
+					'action'        => 'redirect_to_txn',
3075
+					'TXN_ID'        => $transaction->ID(),
3076
+					'EVT_ID'        => $this->_reg_event->ID(),
3077
+					'event_name'    => urlencode($this->_reg_event->name()),
3078
+					'redirect_from' => 'new_registration',
3079
+				);
3080
+				$this->_redirect_after_action(false, '', '', $query_args, true);
3081
+				break;
3082
+		}
3083
+		// what are you looking here for?  Should be nothing to do at this point.
3084
+	}
3085
+
3086
+
3087
+	/**
3088
+	 * redirect_to_txn
3089
+	 *
3090
+	 * @access public
3091
+	 * @return void
3092
+	 * @throws EE_Error
3093
+	 * @throws InvalidArgumentException
3094
+	 * @throws InvalidDataTypeException
3095
+	 * @throws InvalidInterfaceException
3096
+	 * @throws ReflectionException
3097
+	 */
3098
+	public function redirect_to_txn()
3099
+	{
3100
+		EE_System::do_not_cache();
3101
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3102
+		$query_args = array(
3103
+			'action' => 'view_transaction',
3104
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3105
+			'page'   => 'espresso_transactions',
3106
+		);
3107
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3108
+			$query_args['EVT_ID'] = $this->_req_data['EVT_ID'];
3109
+			$query_args['event_name'] = urlencode($this->_req_data['event_name']);
3110
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
3111
+		}
3112
+		EE_Error::add_success(
3113
+			esc_html__(
3114
+				'Registration Created.  Please review the transaction and add any payments as necessary',
3115
+				'event_espresso'
3116
+			)
3117
+		);
3118
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3119
+	}
3120
+
3121
+
3122
+	/**
3123
+	 *        generates HTML for the Attendee Contact List
3124
+	 *
3125
+	 * @access protected
3126
+	 * @return void
3127
+	 * @throws DomainException
3128
+	 * @throws EE_Error
3129
+	 */
3130
+	protected function _attendee_contact_list_table()
3131
+	{
3132
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3133
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3134
+		$this->display_admin_list_table_page_with_no_sidebar();
3135
+	}
3136
+
3137
+
3138
+	/**
3139
+	 *        get_attendees
3140
+	 *
3141
+	 * @param      $per_page
3142
+	 * @param bool $count whether to return count or data.
3143
+	 * @param bool $trash
3144
+	 * @return array
3145
+	 * @throws EE_Error
3146
+	 * @throws InvalidArgumentException
3147
+	 * @throws InvalidDataTypeException
3148
+	 * @throws InvalidInterfaceException
3149
+	 * @access public
3150
+	 */
3151
+	public function get_attendees($per_page, $count = false, $trash = false)
3152
+	{
3153
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3155
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156
+		switch ($this->_req_data['orderby']) {
3157
+			case 'ATT_ID':
3158
+				$orderby = 'ATT_ID';
3159
+				break;
3160
+			case 'ATT_fname':
3161
+				$orderby = 'ATT_fname';
3162
+				break;
3163
+			case 'ATT_email':
3164
+				$orderby = 'ATT_email';
3165
+				break;
3166
+			case 'ATT_city':
3167
+				$orderby = 'ATT_city';
3168
+				break;
3169
+			case 'STA_ID':
3170
+				$orderby = 'STA_ID';
3171
+				break;
3172
+			case 'CNT_ID':
3173
+				$orderby = 'CNT_ID';
3174
+				break;
3175
+			case 'Registration_Count':
3176
+				$orderby = 'Registration_Count';
3177
+				break;
3178
+			default:
3179
+				$orderby = 'ATT_lname';
3180
+		}
3181
+		$sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3182
+			? $this->_req_data['order']
3183
+			: 'ASC';
3184
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3185
+			? $this->_req_data['paged']
3186
+			: 1;
3187
+		$per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3188
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3189
+			? $this->_req_data['perpage']
3190
+			: $per_page;
3191
+		$_where = array();
3192
+		if (! empty($this->_req_data['s'])) {
3193
+			$sstr = '%' . $this->_req_data['s'] . '%';
3194
+			$_where['OR'] = array(
3195
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3197
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3198
+				'ATT_fname'                         => array('LIKE', $sstr),
3199
+				'ATT_lname'                         => array('LIKE', $sstr),
3200
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3201
+				'ATT_email'                         => array('LIKE', $sstr),
3202
+				'ATT_address'                       => array('LIKE', $sstr),
3203
+				'ATT_address2'                      => array('LIKE', $sstr),
3204
+				'ATT_city'                          => array('LIKE', $sstr),
3205
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3206
+				'State.STA_name'                    => array('LIKE', $sstr),
3207
+				'ATT_phone'                         => array('LIKE', $sstr),
3208
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3209
+				'Registration.REG_code'             => array('LIKE', $sstr),
3210
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3211
+			);
3212
+		}
3213
+		$offset = ($current_page - 1) * $per_page;
3214
+		$limit = $count ? null : array($offset, $per_page);
3215
+		$query_args = array(
3216
+			$_where,
3217
+			'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218
+			'limit'         => $limit,
3219
+		);
3220
+		if (! $count) {
3221
+			$query_args['order_by'] = array($orderby => $sort);
3222
+		}
3223
+		if ($trash) {
3224
+			$query_args[0]['status'] = array('!=', 'publish');
3225
+			$all_attendees = $count
3226
+				? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3227
+				: $this->getAttendeeModel()->get_all($query_args);
3228
+		} else {
3229
+			$query_args[0]['status'] = array('IN', array('publish'));
3230
+			$all_attendees = $count
3231
+				? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true)
3232
+				: $this->getAttendeeModel()->get_all($query_args);
3233
+		}
3234
+		return $all_attendees;
3235
+	}
3236
+
3237
+
3238
+	/**
3239
+	 * This is just taking care of resending the registration confirmation
3240
+	 *
3241
+	 * @access protected
3242
+	 * @return void
3243
+	 * @throws EE_Error
3244
+	 * @throws InvalidArgumentException
3245
+	 * @throws InvalidDataTypeException
3246
+	 * @throws InvalidInterfaceException
3247
+	 * @throws ReflectionException
3248
+	 */
3249
+	protected function _resend_registration()
3250
+	{
3251
+		$this->_process_resend_registration();
3252
+		$query_args = isset($this->_req_data['redirect_to'])
3253
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3254
+			: array('action' => 'default');
3255
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3256
+	}
3257
+
3258
+	/**
3259
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3260
+	 * to use when selecting registrations
3261
+	 *
3262
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3263
+	 *                                                     the query parameters from the request
3264
+	 * @return void ends the request with a redirect or download
3265
+	 */
3266
+	public function _registrations_report_base($method_name_for_getting_query_params)
3267
+	{
3268
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269
+			wp_redirect(
3270
+				EE_Admin_Page::add_query_args_and_nonce(
3271
+					array(
3272
+						'page'        => 'espresso_batch',
3273
+						'batch'       => 'file',
3274
+						'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3275
+						'filters'     => urlencode(
3276
+							serialize(
3277
+								$this->$method_name_for_getting_query_params(
3278
+									EEH_Array::is_set(
3279
+										$this->_req_data,
3280
+										'filters',
3281
+										array()
3282
+									)
3283
+								)
3284
+							)
3285
+						),
3286
+						'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3287
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3288
+						'return_url'  => urlencode($this->_req_data['return_url']),
3289
+					)
3290
+				)
3291
+			);
3292
+		} else {
3293
+			$new_request_args = array(
3294
+				'export' => 'report',
3295
+				'action' => 'registrations_report_for_event',
3296
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297
+			);
3298
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3301
+				$EE_Export = EE_Export::instance($this->_req_data);
3302
+				$EE_Export->export();
3303
+			}
3304
+		}
3305
+	}
3306
+
3307
+
3308
+	/**
3309
+	 * Creates a registration report using only query parameters in the request
3310
+	 *
3311
+	 * @return void
3312
+	 */
3313
+	public function _registrations_report()
3314
+	{
3315
+		$this->_registrations_report_base('_get_registration_query_parameters');
3316
+	}
3317
+
3318
+
3319
+	public function _contact_list_export()
3320
+	{
3321
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3323
+			$EE_Export = EE_Export::instance($this->_req_data);
3324
+			$EE_Export->export_attendees();
3325
+		}
3326
+	}
3327
+
3328
+
3329
+	public function _contact_list_report()
3330
+	{
3331
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332
+			wp_redirect(
3333
+				EE_Admin_Page::add_query_args_and_nonce(
3334
+					array(
3335
+						'page'        => 'espresso_batch',
3336
+						'batch'       => 'file',
3337
+						'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3338
+						'return_url'  => urlencode($this->_req_data['return_url']),
3339
+					)
3340
+				)
3341
+			);
3342
+		} else {
3343
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3345
+				$EE_Export = EE_Export::instance($this->_req_data);
3346
+				$EE_Export->report_attendees();
3347
+			}
3348
+		}
3349
+	}
3350
+
3351
+
3352
+
3353
+
3354
+
3355
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3356
+	/**
3357
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3358
+	 *
3359
+	 * @return void
3360
+	 * @throws EE_Error
3361
+	 * @throws InvalidArgumentException
3362
+	 * @throws InvalidDataTypeException
3363
+	 * @throws InvalidInterfaceException
3364
+	 * @throws ReflectionException
3365
+	 */
3366
+	protected function _duplicate_attendee()
3367
+	{
3368
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3369
+		// verify we have necessary info
3370
+		if (empty($this->_req_data['_REG_ID'])) {
3371
+			EE_Error::add_error(
3372
+				esc_html__(
3373
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3374
+					'event_espresso'
3375
+				),
3376
+				__FILE__,
3377
+				__LINE__,
3378
+				__FUNCTION__
3379
+			);
3380
+			$query_args = array('action' => $action);
3381
+			$this->_redirect_after_action('', '', '', $query_args, true);
3382
+		}
3383
+		// okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3384
+		$registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']);
3385
+		$attendee = $registration->attendee();
3386
+		// remove relation of existing attendee on registration
3387
+		$registration->_remove_relation_to($attendee, 'Attendee');
3388
+		// new attendee
3389
+		$new_attendee = clone $attendee;
3390
+		$new_attendee->set('ATT_ID', 0);
3391
+		$new_attendee->save();
3392
+		// add new attendee to reg
3393
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3394
+		EE_Error::add_success(
3395
+			esc_html__(
3396
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3397
+				'event_espresso'
3398
+			)
3399
+		);
3400
+		// redirect to edit page for attendee
3401
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3402
+		$this->_redirect_after_action('', '', '', $query_args, true);
3403
+	}
3404
+
3405
+
3406
+	/**
3407
+	 * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3408
+	 *
3409
+	 * @param int     $post_id
3410
+	 * @param WP_POST $post
3411
+	 * @throws DomainException
3412
+	 * @throws EE_Error
3413
+	 * @throws InvalidArgumentException
3414
+	 * @throws InvalidDataTypeException
3415
+	 * @throws InvalidInterfaceException
3416
+	 * @throws LogicException
3417
+	 * @throws InvalidFormSubmissionException
3418
+	 * @throws ReflectionException
3419
+	 */
3420
+	protected function _insert_update_cpt_item($post_id, $post)
3421
+	{
3422
+		$success = true;
3423
+		$attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3424
+			? $this->getAttendeeModel()->get_one_by_ID($post_id)
3425
+			: null;
3426
+		// for attendee updates
3427
+		if ($attendee instanceof EE_Attendee) {
3428
+			// note we should only be UPDATING attendees at this point.
3429
+			$updated_fields = array(
3430
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3431
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3433
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3436
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3437
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3438
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3439
+			);
3440
+			foreach ($updated_fields as $field => $value) {
3441
+				$attendee->set($field, $value);
3442
+			}
3443
+
3444
+			// process contact details metabox form handler (which will also save the attendee)
3445
+			$contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3446
+			$success = $contact_details_form->process($this->_req_data);
3447
+
3448
+			$attendee_update_callbacks = apply_filters(
3449
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3450
+				array()
3451
+			);
3452
+			foreach ($attendee_update_callbacks as $a_callback) {
3453
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3454
+					throw new EE_Error(
3455
+						sprintf(
3456
+							esc_html__(
3457
+								'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3458
+								'event_espresso'
3459
+							),
3460
+							$a_callback
3461
+						)
3462
+					);
3463
+				}
3464
+			}
3465
+		}
3466
+
3467
+		if ($success === false) {
3468
+			EE_Error::add_error(
3469
+				esc_html__(
3470
+					'Something went wrong with updating the meta table data for the registration.',
3471
+					'event_espresso'
3472
+				),
3473
+				__FILE__,
3474
+				__FUNCTION__,
3475
+				__LINE__
3476
+			);
3477
+		}
3478
+	}
3479
+
3480
+
3481
+	public function trash_cpt_item($post_id)
3482
+	{
3483
+	}
3484
+
3485
+
3486
+	public function delete_cpt_item($post_id)
3487
+	{
3488
+	}
3489
+
3490
+
3491
+	public function restore_cpt_item($post_id)
3492
+	{
3493
+	}
3494
+
3495
+
3496
+	protected function _restore_cpt_item($post_id, $revision_id)
3497
+	{
3498
+	}
3499
+
3500
+
3501
+	/**
3502
+	 * @throws EE_Error
3503
+	 * @since $VID:$
3504
+	 */
3505
+	public function attendee_editor_metaboxes()
3506
+	{
3507
+		$this->verify_cpt_object();
3508
+		remove_meta_box(
3509
+			'postexcerpt',
3510
+			$this->_cpt_routes[ $this->_req_action ],
3511
+			'normal'
3512
+		);
3513
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3514
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3515
+			add_meta_box(
3516
+				'postexcerpt',
3517
+				esc_html__('Short Biography', 'event_espresso'),
3518
+				'post_excerpt_meta_box',
3519
+				$this->_cpt_routes[ $this->_req_action ],
3520
+				'normal'
3521
+			);
3522
+		}
3523
+		if (post_type_supports('espresso_attendees', 'comments')) {
3524
+			add_meta_box(
3525
+				'commentsdiv',
3526
+				esc_html__('Notes on the Contact', 'event_espresso'),
3527
+				'post_comment_meta_box',
3528
+				$this->_cpt_routes[ $this->_req_action ],
3529
+				'normal',
3530
+				'core'
3531
+			);
3532
+		}
3533
+		add_meta_box(
3534
+			'attendee_contact_info',
3535
+			esc_html__('Contact Info', 'event_espresso'),
3536
+			array($this, 'attendee_contact_info'),
3537
+			$this->_cpt_routes[ $this->_req_action ],
3538
+			'side',
3539
+			'core'
3540
+		);
3541
+		add_meta_box(
3542
+			'attendee_details_address',
3543
+			esc_html__('Address Details', 'event_espresso'),
3544
+			array($this, 'attendee_address_details'),
3545
+			$this->_cpt_routes[ $this->_req_action ],
3546
+			'normal',
3547
+			'core'
3548
+		);
3549
+		add_meta_box(
3550
+			'attendee_registrations',
3551
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3552
+			array($this, 'attendee_registrations_meta_box'),
3553
+			$this->_cpt_routes[ $this->_req_action ],
3554
+			'normal',
3555
+			'high'
3556
+		);
3557
+	}
3558
+
3559
+
3560
+	/**
3561
+	 * Metabox for attendee contact info
3562
+	 *
3563
+	 * @param  WP_Post $post wp post object
3564
+	 * @return string attendee contact info ( and form )
3565
+	 * @throws EE_Error
3566
+	 * @throws InvalidArgumentException
3567
+	 * @throws InvalidDataTypeException
3568
+	 * @throws InvalidInterfaceException
3569
+	 * @throws LogicException
3570
+	 * @throws DomainException
3571
+	 */
3572
+	public function attendee_contact_info($post)
3573
+	{
3574
+		// get attendee object ( should already have it )
3575
+		$form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3576
+		$form->enqueueStylesAndScripts();
3577
+		echo $form->display();
3578
+	}
3579
+
3580
+
3581
+	/**
3582
+	 * Return form handler for the contact details metabox
3583
+	 *
3584
+	 * @param EE_Attendee $attendee
3585
+	 * @return AttendeeContactDetailsMetaboxFormHandler
3586
+	 * @throws DomainException
3587
+	 * @throws InvalidArgumentException
3588
+	 * @throws InvalidDataTypeException
3589
+	 * @throws InvalidInterfaceException
3590
+	 */
3591
+	protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3592
+	{
3593
+		return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3594
+	}
3595
+
3596
+
3597
+	/**
3598
+	 * Metabox for attendee details
3599
+	 *
3600
+	 * @param  WP_Post $post wp post object
3601
+	 * @throws DomainException
3602
+	 */
3603
+	public function attendee_address_details($post)
3604
+	{
3605
+		// get attendee object (should already have it)
3606
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3607
+		$this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input(
3608
+			new EE_Question_Form_Input(
3609
+				EE_Question::new_instance(
3610
+					array(
3611
+						'QST_ID'           => 0,
3612
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3613
+						'QST_system'       => 'admin-state',
3614
+					)
3615
+				),
3616
+				EE_Answer::new_instance(
3617
+					array(
3618
+						'ANS_ID'    => 0,
3619
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3620
+					)
3621
+				),
3622
+				array(
3623
+					'input_id'       => 'STA_ID',
3624
+					'input_name'     => 'STA_ID',
3625
+					'input_prefix'   => '',
3626
+					'append_qstn_id' => false,
3627
+				)
3628
+			)
3629
+		);
3630
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3631
+			new EE_Question_Form_Input(
3632
+				EE_Question::new_instance(
3633
+					array(
3634
+						'QST_ID'           => 0,
3635
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3636
+						'QST_system'       => 'admin-country',
3637
+					)
3638
+				),
3639
+				EE_Answer::new_instance(
3640
+					array(
3641
+						'ANS_ID'    => 0,
3642
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3643
+					)
3644
+				),
3645
+				array(
3646
+					'input_id'       => 'CNT_ISO',
3647
+					'input_name'     => 'CNT_ISO',
3648
+					'input_prefix'   => '',
3649
+					'append_qstn_id' => false,
3650
+				)
3651
+			)
3652
+		);
3653
+		$template =
3654
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3655
+		EEH_Template::display_template($template, $this->_template_args);
3656
+	}
3657
+
3658
+
3659
+	/**
3660
+	 *        _attendee_details
3661
+	 *
3662
+	 * @access protected
3663
+	 * @param $post
3664
+	 * @return void
3665
+	 * @throws DomainException
3666
+	 * @throws EE_Error
3667
+	 * @throws InvalidArgumentException
3668
+	 * @throws InvalidDataTypeException
3669
+	 * @throws InvalidInterfaceException
3670
+	 * @throws ReflectionException
3671
+	 */
3672
+	public function attendee_registrations_meta_box($post)
3673
+	{
3674
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3675
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676
+		$template =
3677
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3678
+		EEH_Template::display_template($template, $this->_template_args);
3679
+	}
3680
+
3681
+
3682
+	/**
3683
+	 * add in the form fields for the attendee edit
3684
+	 *
3685
+	 * @param  WP_Post $post wp post object
3686
+	 * @return string html for new form.
3687
+	 * @throws DomainException
3688
+	 */
3689
+	public function after_title_form_fields($post)
3690
+	{
3691
+		if ($post->post_type === 'espresso_attendees') {
3692
+			$template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3693
+			$template_args['attendee'] = $this->_cpt_model_obj;
3694
+			EEH_Template::display_template($template, $template_args);
3695
+		}
3696
+	}
3697
+
3698
+
3699
+	/**
3700
+	 *        _trash_or_restore_attendee
3701
+	 *
3702
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3703
+	 * @return void
3704
+	 * @throws EE_Error
3705
+	 * @throws InvalidArgumentException
3706
+	 * @throws InvalidDataTypeException
3707
+	 * @throws InvalidInterfaceException
3708
+	 * @throws ReflectionException
3709
+	 * @access protected
3710
+	 */
3711
+	protected function _trash_or_restore_attendees($trash = true)
3712
+	{
3713
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714
+		$success = 1;
3715
+		// Checkboxes
3716
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717
+			// if array has more than one element than success message should be plural
3718
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719
+			// cycle thru checkboxes
3720
+			foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721
+				$updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722
+					: $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
+				if (! $updated) {
3724
+					$success = 0;
3725
+				}
3726
+			}
3727
+		} else {
3728
+			// grab single id and delete
3729
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3730
+			// get attendee
3731
+			$att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733
+			$updated = $att->save() && $updated;
3734
+			if (! $updated) {
3735
+				$success = 0;
3736
+			}
3737
+		}
3738
+		$what = $success > 1
3739
+			? esc_html__('Contacts', 'event_espresso')
3740
+			: esc_html__('Contact', 'event_espresso');
3741
+		$action_desc = $trash
3742
+			? esc_html__('moved to the trash', 'event_espresso')
3743
+			: esc_html__('restored', 'event_espresso');
3744
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3745
+	}
3746 3746
 }
Please login to merge, or discard this patch.
Spacing   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
      */
88 88
     protected function getRegistrationModel()
89 89
     {
90
-        if (! $this->registration_model instanceof EEM_Registration) {
90
+        if ( ! $this->registration_model instanceof EEM_Registration) {
91 91
             $this->registration_model = $this->loader->getShared('EEM_Registration');
92 92
         }
93 93
         return $this->registration_model;
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
      */
103 103
     protected function getAttendeeModel()
104 104
     {
105
-        if (! $this->attendee_model instanceof EEM_Attendee) {
105
+        if ( ! $this->attendee_model instanceof EEM_Attendee) {
106 106
             $this->attendee_model = $this->loader->getShared('EEM_Attendee');
107 107
         }
108 108
         return $this->attendee_model;
@@ -118,7 +118,7 @@  discard block
 block discarded – undo
118 118
      */
119 119
     protected function getEventModel()
120 120
     {
121
-        if (! $this->event_model instanceof EEM_Event) {
121
+        if ( ! $this->event_model instanceof EEM_Event) {
122 122
             $this->event_model = $this->loader->getShared('EEM_Event');
123 123
         }
124 124
         return $this->event_model;
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
      */
134 134
     protected function getStatusModel()
135 135
     {
136
-        if (! $this->status_model instanceof EEM_Status) {
136
+        if ( ! $this->status_model instanceof EEM_Status) {
137 137
             $this->status_model = $this->loader->getShared('EEM_Status');
138 138
         }
139 139
         return $this->status_model;
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
         // when adding a new registration...
146 146
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
147 147
             EE_System::do_not_cache();
148
-            if (! isset($this->_req_data['processing_registration'])
148
+            if ( ! isset($this->_req_data['processing_registration'])
149 149
                 || absint($this->_req_data['processing_registration']) !== 1
150 150
             ) {
151 151
                 // and it's NOT the attendee information reg step
@@ -751,7 +751,7 @@  discard block
 block discarded – undo
751 751
         // style
752 752
         wp_register_style(
753 753
             'espresso_reg',
754
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
754
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
755 755
             array('ee-admin-css'),
756 756
             EVENT_ESPRESSO_VERSION
757 757
         );
@@ -759,7 +759,7 @@  discard block
 block discarded – undo
759 759
         // script
760 760
         wp_register_script(
761 761
             'espresso_reg',
762
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
762
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
763 763
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
764 764
             EVENT_ESPRESSO_VERSION,
765 765
             true
@@ -783,7 +783,7 @@  discard block
 block discarded – undo
783 783
             'att_publish_text' => sprintf(
784 784
                 /* translators: The date and time */
785 785
                 wp_strip_all_tags(__('Created on: %s', 'event_espresso')),
786
-                '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>'
786
+                '<b>'.$this->_cpt_model_obj->get_datetime('ATT_created').'</b>'
787 787
             ),
788 788
         );
789 789
         wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
@@ -814,7 +814,7 @@  discard block
 block discarded – undo
814 814
         wp_dequeue_style('espresso_reg');
815 815
         wp_register_style(
816 816
             'espresso_att',
817
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
817
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
818 818
             array('ee-admin-css'),
819 819
             EVENT_ESPRESSO_VERSION
820 820
         );
@@ -826,7 +826,7 @@  discard block
 block discarded – undo
826 826
     {
827 827
         wp_register_script(
828 828
             'ee-spco-for-admin',
829
-            REG_ASSETS_URL . 'spco_for_admin.js',
829
+            REG_ASSETS_URL.'spco_for_admin.js',
830 830
             array('underscore', 'jquery'),
831 831
             EVENT_ESPRESSO_VERSION,
832 832
             true
@@ -1068,7 +1068,7 @@  discard block
 block discarded – undo
1068 1068
         }
1069 1069
         $sc_items = array(
1070 1070
             'approved_status'   => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
1071
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
1072 1072
                 'desc'  => EEH_Template::pretty_status(
1073 1073
                     EEM_Registration::status_id_approved,
1074 1074
                     false,
@@ -1076,7 +1076,7 @@  discard block
 block discarded – undo
1076 1076
                 ),
1077 1077
             ),
1078 1078
             'pending_status'    => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
1079
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
1080 1080
                 'desc'  => EEH_Template::pretty_status(
1081 1081
                     EEM_Registration::status_id_pending_payment,
1082 1082
                     false,
@@ -1084,7 +1084,7 @@  discard block
 block discarded – undo
1084 1084
                 ),
1085 1085
             ),
1086 1086
             'wait_list'         => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
1087
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
1088 1088
                 'desc'  => EEH_Template::pretty_status(
1089 1089
                     EEM_Registration::status_id_wait_list,
1090 1090
                     false,
@@ -1092,7 +1092,7 @@  discard block
 block discarded – undo
1092 1092
                 ),
1093 1093
             ),
1094 1094
             'incomplete_status' => array(
1095
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
1095
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
1096 1096
                 'desc'  => EEH_Template::pretty_status(
1097 1097
                     EEM_Registration::status_id_incomplete,
1098 1098
                     false,
@@ -1100,7 +1100,7 @@  discard block
 block discarded – undo
1100 1100
                 ),
1101 1101
             ),
1102 1102
             'not_approved'      => array(
1103
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
1103
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
1104 1104
                 'desc'  => EEH_Template::pretty_status(
1105 1105
                     EEM_Registration::status_id_not_approved,
1106 1106
                     false,
@@ -1108,7 +1108,7 @@  discard block
 block discarded – undo
1108 1108
                 ),
1109 1109
             ),
1110 1110
             'declined_status'   => array(
1111
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
1111
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
1112 1112
                 'desc'  => EEH_Template::pretty_status(
1113 1113
                     EEM_Registration::status_id_declined,
1114 1114
                     false,
@@ -1116,7 +1116,7 @@  discard block
 block discarded – undo
1116 1116
                 ),
1117 1117
             ),
1118 1118
             'cancelled_status'  => array(
1119
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1119
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1120 1120
                 'desc'  => EEH_Template::pretty_status(
1121 1121
                     EEM_Registration::status_id_cancelled,
1122 1122
                     false,
@@ -1179,7 +1179,7 @@  discard block
 block discarded – undo
1179 1179
                 $EVT_ID
1180 1180
             )
1181 1181
         ) {
1182
-            $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1182
+            $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
1183 1183
                 'new_registration',
1184 1184
                 'add-registrant',
1185 1185
                 array('event_id' => $EVT_ID),
@@ -1205,7 +1205,7 @@  discard block
 block discarded – undo
1205 1205
         if ($this->_registration instanceof EE_Registration) {
1206 1206
             return true;
1207 1207
         }
1208
-        $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1208
+        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1209 1209
         if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) {
1210 1210
             return true;
1211 1211
         }
@@ -1286,7 +1286,7 @@  discard block
 block discarded – undo
1286 1286
         /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */
1287 1287
         $list_table_query_builder = $this->loader->getNew(
1288 1288
             'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder',
1289
-            [ $request ]
1289
+            [$request]
1290 1290
         );
1291 1291
         return $list_table_query_builder->getQueryParams($per_page, $count);
1292 1292
     }
@@ -1392,7 +1392,7 @@  discard block
 block discarded – undo
1392 1392
                 )
1393 1393
                 : '';
1394 1394
             // grab header
1395
-            $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1395
+            $template_path = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1396 1396
             $this->_template_args['REG_ID'] = $this->_registration->ID();
1397 1397
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1398 1398
                 $template_path,
@@ -1544,7 +1544,7 @@  discard block
 block discarded – undo
1544 1544
                                 EEH_HTML::strong(
1545 1545
                                     $this->_registration->pretty_status(),
1546 1546
                                     '',
1547
-                                    'status-' . $this->_registration->status_ID(),
1547
+                                    'status-'.$this->_registration->status_ID(),
1548 1548
                                     'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1549 1549
                                 )
1550 1550
                             )
@@ -1600,14 +1600,14 @@  discard block
 block discarded – undo
1600 1600
     protected function _get_reg_statuses()
1601 1601
     {
1602 1602
         $reg_status_array = $this->getRegistrationModel()->reg_status_array();
1603
-        unset($reg_status_array[ EEM_Registration::status_id_incomplete ]);
1603
+        unset($reg_status_array[EEM_Registration::status_id_incomplete]);
1604 1604
         // get current reg status
1605 1605
         $current_status = $this->_registration->status_ID();
1606 1606
         // is registration for free event? This will determine whether to display the pending payment option
1607 1607
         if ($current_status !== EEM_Registration::status_id_pending_payment
1608 1608
             && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1609 1609
         ) {
1610
-            unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]);
1610
+            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1611 1611
         }
1612 1612
         return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence');
1613 1613
     }
@@ -1701,7 +1701,7 @@  discard block
 block discarded – undo
1701 1701
         $success = false;
1702 1702
         // typecast $REG_IDs
1703 1703
         $REG_IDs = (array) $REG_IDs;
1704
-        if (! empty($REG_IDs)) {
1704
+        if ( ! empty($REG_IDs)) {
1705 1705
             $success = true;
1706 1706
             // set default status if none is passed
1707 1707
             $status = $status ? $status : EEM_Registration::status_id_pending_payment;
@@ -1864,7 +1864,7 @@  discard block
 block discarded – undo
1864 1864
             $action,
1865 1865
             $notify
1866 1866
         );
1867
-        $method = $action . '_registration';
1867
+        $method = $action.'_registration';
1868 1868
         if (method_exists($this, $method)) {
1869 1869
             $this->$method($notify);
1870 1870
         }
@@ -2143,7 +2143,7 @@  discard block
 block discarded – undo
2143 2143
         $this->_template_args['REG_ID'] = $this->_registration->ID();
2144 2144
         $this->_template_args['event_id'] = $this->_registration->event_ID();
2145 2145
         $template_path =
2146
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2146
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2147 2147
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2148 2148
     }
2149 2149
 
@@ -2180,7 +2180,7 @@  discard block
 block discarded – undo
2180 2180
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2181 2181
             $this->_template_args['REG_ID'] = $this->_registration->ID();
2182 2182
             $template_path =
2183
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2183
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2184 2184
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2185 2185
         }
2186 2186
     }
@@ -2197,7 +2197,7 @@  discard block
 block discarded – undo
2197 2197
     public function form_before_question_group($output)
2198 2198
     {
2199 2199
         EE_Error::doing_it_wrong(
2200
-            __CLASS__ . '::' . __FUNCTION__,
2200
+            __CLASS__.'::'.__FUNCTION__,
2201 2201
             esc_html__(
2202 2202
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2203 2203
                 'event_espresso'
@@ -2222,7 +2222,7 @@  discard block
 block discarded – undo
2222 2222
     public function form_after_question_group($output)
2223 2223
     {
2224 2224
         EE_Error::doing_it_wrong(
2225
-            __CLASS__ . '::' . __FUNCTION__,
2225
+            __CLASS__.'::'.__FUNCTION__,
2226 2226
             esc_html__(
2227 2227
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2228 2228
                 'event_espresso'
@@ -2260,7 +2260,7 @@  discard block
 block discarded – undo
2260 2260
     public function form_form_field_label_wrap($label)
2261 2261
     {
2262 2262
         EE_Error::doing_it_wrong(
2263
-            __CLASS__ . '::' . __FUNCTION__,
2263
+            __CLASS__.'::'.__FUNCTION__,
2264 2264
             esc_html__(
2265 2265
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2266 2266
                 'event_espresso'
@@ -2270,7 +2270,7 @@  discard block
 block discarded – undo
2270 2270
         return '
2271 2271
 			<tr>
2272 2272
 				<th>
2273
-					' . $label . '
2273
+					' . $label.'
2274 2274
 				</th>';
2275 2275
     }
2276 2276
 
@@ -2286,7 +2286,7 @@  discard block
 block discarded – undo
2286 2286
     public function form_form_field_input__wrap($input)
2287 2287
     {
2288 2288
         EE_Error::doing_it_wrong(
2289
-            __CLASS__ . '::' . __FUNCTION__,
2289
+            __CLASS__.'::'.__FUNCTION__,
2290 2290
             esc_html__(
2291 2291
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2292 2292
                 'event_espresso'
@@ -2295,7 +2295,7 @@  discard block
 block discarded – undo
2295 2295
         );
2296 2296
         return '
2297 2297
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2298
-					' . $input . '
2298
+					' . $input.'
2299 2299
 				</td>
2300 2300
 			</tr>';
2301 2301
     }
@@ -2343,8 +2343,8 @@  discard block
 block discarded – undo
2343 2343
      */
2344 2344
     protected function _get_reg_custom_questions_form($REG_ID)
2345 2345
     {
2346
-        if (! $this->_reg_custom_questions_form) {
2347
-            require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2346
+        if ( ! $this->_reg_custom_questions_form) {
2347
+            require_once(REG_ADMIN.'form_sections/EE_Registration_Custom_Questions_Form.form.php');
2348 2348
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2349 2349
                 $this->getRegistrationModel()->get_one_by_ID($REG_ID)
2350 2350
             );
@@ -2368,7 +2368,7 @@  discard block
 block discarded – undo
2368 2368
      */
2369 2369
     private function _save_reg_custom_questions_form($REG_ID = false)
2370 2370
     {
2371
-        if (! $REG_ID) {
2371
+        if ( ! $REG_ID) {
2372 2372
             EE_Error::add_error(
2373 2373
                 esc_html__(
2374 2374
                     'An error occurred. No registration ID was received.',
@@ -2460,30 +2460,30 @@  discard block
 block discarded – undo
2460 2460
                 $attendee = $registration->attendee()
2461 2461
                     ? $registration->attendee()
2462 2462
                     : $this->getAttendeeModel()->create_default_object();
2463
-                $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID();
2464
-                $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname();
2465
-                $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname();
2466
-                $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email();
2467
-                $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price();
2468
-                $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode(
2463
+                $this->_template_args['attendees'][$att_nmbr]['STS_ID'] = $registration->status_ID();
2464
+                $this->_template_args['attendees'][$att_nmbr]['fname'] = $attendee->fname();
2465
+                $this->_template_args['attendees'][$att_nmbr]['lname'] = $attendee->lname();
2466
+                $this->_template_args['attendees'][$att_nmbr]['email'] = $attendee->email();
2467
+                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2468
+                $this->_template_args['attendees'][$att_nmbr]['address'] = implode(
2469 2469
                     ', ',
2470 2470
                     $attendee->full_address_as_array()
2471 2471
                 );
2472
-                $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce(
2472
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2473 2473
                     array(
2474 2474
                         'action' => 'edit_attendee',
2475 2475
                         'post'   => $attendee->ID(),
2476 2476
                     ),
2477 2477
                     REG_ADMIN_URL
2478 2478
                 );
2479
-                $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event
2479
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj() instanceof EE_Event
2480 2480
                     ? $registration->event_obj()->name()
2481 2481
                     : '';
2482 2482
                 $att_nmbr++;
2483 2483
             }
2484 2484
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2485 2485
         }
2486
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2486
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2487 2487
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2488 2488
     }
2489 2489
 
@@ -2510,11 +2510,11 @@  discard block
 block discarded – undo
2510 2510
         // now let's determine if this is not the primary registration.  If it isn't then we set the
2511 2511
         // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2512 2512
         // primary registration object (that way we know if we need to show create button or not)
2513
-        if (! $this->_registration->is_primary_registrant()) {
2513
+        if ( ! $this->_registration->is_primary_registrant()) {
2514 2514
             $primary_registration = $this->_registration->get_primary_registration();
2515 2515
             $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2516 2516
                 : null;
2517
-            if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2517
+            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2518 2518
                 // in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2519 2519
                 // custom attendee object so let's not worry about the primary reg.
2520 2520
                 $primary_registration = null;
@@ -2548,7 +2548,7 @@  discard block
 block discarded – undo
2548 2548
             ) : '';
2549 2549
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2550 2550
         $this->_template_args['att_check'] = $att_check;
2551
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2551
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2552 2552
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2553 2553
     }
2554 2554
 
@@ -2586,7 +2586,7 @@  discard block
 block discarded – undo
2586 2586
         $success = 0;
2587 2587
         $overwrite_msgs = false;
2588 2588
         // Checkboxes
2589
-        if (! is_array($this->_req_data['_REG_ID'])) {
2589
+        if ( ! is_array($this->_req_data['_REG_ID'])) {
2590 2590
             $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2591 2591
         }
2592 2592
         $reg_count = count($this->_req_data['_REG_ID']);
@@ -2595,7 +2595,7 @@  discard block
 block discarded – undo
2595 2595
             /** @var EE_Registration $REG */
2596 2596
             $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID);
2597 2597
             $payments = $REG->registration_payments();
2598
-            if (! empty($payments)) {
2598
+            if ( ! empty($payments)) {
2599 2599
                 $name = $REG->attendee() instanceof EE_Attendee
2600 2600
                     ? $REG->attendee()->full_name()
2601 2601
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2657,17 +2657,17 @@  discard block
 block discarded – undo
2657 2657
         $REG_MDL = $this->getRegistrationModel();
2658 2658
         $success = 1;
2659 2659
         // Checkboxes
2660
-        if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2660
+        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2661 2661
             // if array has more than one element than success message should be plural
2662 2662
             $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2663 2663
             // cycle thru checkboxes
2664 2664
             foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2665 2665
                 $REG = $REG_MDL->get_one_by_ID($REG_ID);
2666
-                if (! $REG instanceof EE_Registration) {
2666
+                if ( ! $REG instanceof EE_Registration) {
2667 2667
                     continue;
2668 2668
                 }
2669 2669
                 $deleted = $this->_delete_registration($REG);
2670
-                if (! $deleted) {
2670
+                if ( ! $deleted) {
2671 2671
                     $success = 0;
2672 2672
                 }
2673 2673
             }
@@ -2677,7 +2677,7 @@  discard block
 block discarded – undo
2677 2677
             /** @var EE_Registration $REG */
2678 2678
             $REG = $REG_MDL->get_one_by_ID($REG_ID);
2679 2679
             $deleted = $this->_delete_registration($REG);
2680
-            if (! $deleted) {
2680
+            if ( ! $deleted) {
2681 2681
                 $success = 0;
2682 2682
             }
2683 2683
         }
@@ -2715,11 +2715,11 @@  discard block
 block discarded – undo
2715 2715
         $REGS = $TXN->get_many_related('Registration');
2716 2716
         $all_trashed = true;
2717 2717
         foreach ($REGS as $registration) {
2718
-            if (! $registration->get('REG_deleted')) {
2718
+            if ( ! $registration->get('REG_deleted')) {
2719 2719
                 $all_trashed = false;
2720 2720
             }
2721 2721
         }
2722
-        if (! $all_trashed) {
2722
+        if ( ! $all_trashed) {
2723 2723
             EE_Error::add_error(
2724 2724
                 esc_html__(
2725 2725
                     'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
@@ -2782,7 +2782,7 @@  discard block
 block discarded – undo
2782 2782
      */
2783 2783
     public function new_registration()
2784 2784
     {
2785
-        if (! $this->_set_reg_event()) {
2785
+        if ( ! $this->_set_reg_event()) {
2786 2786
             throw new EE_Error(
2787 2787
                 esc_html__(
2788 2788
                     'Unable to continue with registering because there is no Event ID in the request',
@@ -2792,8 +2792,8 @@  discard block
 block discarded – undo
2792 2792
         }
2793 2793
         EE_Registry::instance()->REQ->set_espresso_page(true);
2794 2794
         // gotta start with a clean slate if we're not coming here via ajax
2795
-        if (! defined('DOING_AJAX')
2796
-            && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2795
+        if ( ! defined('DOING_AJAX')
2796
+            && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2797 2797
         ) {
2798 2798
             EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2799 2799
         }
@@ -2826,7 +2826,7 @@  discard block
 block discarded – undo
2826 2826
         }
2827 2827
         // grab header
2828 2828
         $template_path =
2829
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2829
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2830 2830
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2831 2831
             $template_path,
2832 2832
             $this->_template_args,
@@ -2867,7 +2867,7 @@  discard block
 block discarded – undo
2867 2867
                 '</b>'
2868 2868
             );
2869 2869
             return '
2870
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2870
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2871 2871
 	<script >
2872 2872
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2873 2873
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2936,7 +2936,7 @@  discard block
 block discarded – undo
2936 2936
         // we come back to the process_registration_step route.
2937 2937
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2938 2938
         return EEH_Template::display_template(
2939
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2939
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2940 2940
             $template_args,
2941 2941
             true
2942 2942
         );
@@ -2958,8 +2958,8 @@  discard block
 block discarded – undo
2958 2958
         if (is_object($this->_reg_event)) {
2959 2959
             return true;
2960 2960
         }
2961
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
-        if (! $EVT_ID) {
2961
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2962
+        if ( ! $EVT_ID) {
2963 2963
             return false;
2964 2964
         }
2965 2965
         $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID);
@@ -2991,8 +2991,8 @@  discard block
 block discarded – undo
2991 2991
         $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2992 2992
         // if doing ajax then we need to verify the nonce
2993 2993
         if (defined('DOING_AJAX')) {
2994
-            $nonce = isset($this->_req_data[ $this->_req_nonce ])
2995
-                ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : '';
2994
+            $nonce = isset($this->_req_data[$this->_req_nonce])
2995
+                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2996 2996
             $this->_verify_nonce($nonce, $this->_req_nonce);
2997 2997
         }
2998 2998
         switch ($step) {
@@ -3028,7 +3028,7 @@  discard block
 block discarded – undo
3028 3028
                 }
3029 3029
                 break;
3030 3030
             case 'questions':
3031
-                if (! isset(
3031
+                if ( ! isset(
3032 3032
                     $this->_req_data['txn_reg_status_change'],
3033 3033
                     $this->_req_data['txn_reg_status_change']['send_notifications']
3034 3034
                 )
@@ -3043,7 +3043,7 @@  discard block
 block discarded – undo
3043 3043
                         $grand_total->save_this_and_descendants_to_txn();
3044 3044
                     }
3045 3045
                 }
3046
-                if (! $transaction instanceof EE_Transaction) {
3046
+                if ( ! $transaction instanceof EE_Transaction) {
3047 3047
                     $query_args = array(
3048 3048
                         'action'                  => 'new_registration',
3049 3049
                         'processing_registration' => 2,
@@ -3065,7 +3065,7 @@  discard block
 block discarded – undo
3065 3065
                     return;
3066 3066
                 }
3067 3067
                 // maybe update status, and make sure to save transaction if not done already
3068
-                if (! $transaction->update_status_based_on_total_paid()) {
3068
+                if ( ! $transaction->update_status_based_on_total_paid()) {
3069 3069
                     $transaction->save();
3070 3070
                 }
3071 3071
                 EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
@@ -3151,7 +3151,7 @@  discard block
 block discarded – undo
3151 3151
     public function get_attendees($per_page, $count = false, $trash = false)
3152 3152
     {
3153 3153
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3154
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3154
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
3155 3155
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3156 3156
         switch ($this->_req_data['orderby']) {
3157 3157
             case 'ATT_ID':
@@ -3189,8 +3189,8 @@  discard block
 block discarded – undo
3189 3189
             ? $this->_req_data['perpage']
3190 3190
             : $per_page;
3191 3191
         $_where = array();
3192
-        if (! empty($this->_req_data['s'])) {
3193
-            $sstr = '%' . $this->_req_data['s'] . '%';
3192
+        if ( ! empty($this->_req_data['s'])) {
3193
+            $sstr = '%'.$this->_req_data['s'].'%';
3194 3194
             $_where['OR'] = array(
3195 3195
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3196 3196
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3217,7 +3217,7 @@  discard block
 block discarded – undo
3217 3217
             'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')),
3218 3218
             'limit'         => $limit,
3219 3219
         );
3220
-        if (! $count) {
3220
+        if ( ! $count) {
3221 3221
             $query_args['order_by'] = array($orderby => $sort);
3222 3222
         }
3223 3223
         if ($trash) {
@@ -3265,7 +3265,7 @@  discard block
 block discarded – undo
3265 3265
      */
3266 3266
     public function _registrations_report_base($method_name_for_getting_query_params)
3267 3267
     {
3268
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3268
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3269 3269
             wp_redirect(
3270 3270
                 EE_Admin_Page::add_query_args_and_nonce(
3271 3271
                     array(
@@ -3296,8 +3296,8 @@  discard block
 block discarded – undo
3296 3296
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3297 3297
             );
3298 3298
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3299
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3300
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3299
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3300
+                require_once(EE_CLASSES.'EE_Export.class.php');
3301 3301
                 $EE_Export = EE_Export::instance($this->_req_data);
3302 3302
                 $EE_Export->export();
3303 3303
             }
@@ -3318,8 +3318,8 @@  discard block
 block discarded – undo
3318 3318
 
3319 3319
     public function _contact_list_export()
3320 3320
     {
3321
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3322
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3321
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3322
+            require_once(EE_CLASSES.'EE_Export.class.php');
3323 3323
             $EE_Export = EE_Export::instance($this->_req_data);
3324 3324
             $EE_Export->export_attendees();
3325 3325
         }
@@ -3328,7 +3328,7 @@  discard block
 block discarded – undo
3328 3328
 
3329 3329
     public function _contact_list_report()
3330 3330
     {
3331
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3331
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3332 3332
             wp_redirect(
3333 3333
                 EE_Admin_Page::add_query_args_and_nonce(
3334 3334
                     array(
@@ -3340,8 +3340,8 @@  discard block
 block discarded – undo
3340 3340
                 )
3341 3341
             );
3342 3342
         } else {
3343
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3344
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3343
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3344
+                require_once(EE_CLASSES.'EE_Export.class.php');
3345 3345
                 $EE_Export = EE_Export::instance($this->_req_data);
3346 3346
                 $EE_Export->report_attendees();
3347 3347
             }
@@ -3429,7 +3429,7 @@  discard block
 block discarded – undo
3429 3429
             $updated_fields = array(
3430 3430
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3431 3431
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3432
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3432
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3433 3433
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3434 3434
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3435 3435
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3507,16 +3507,16 @@  discard block
 block discarded – undo
3507 3507
         $this->verify_cpt_object();
3508 3508
         remove_meta_box(
3509 3509
             'postexcerpt',
3510
-            $this->_cpt_routes[ $this->_req_action ],
3510
+            $this->_cpt_routes[$this->_req_action],
3511 3511
             'normal'
3512 3512
         );
3513
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core');
3513
+        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3514 3514
         if (post_type_supports('espresso_attendees', 'excerpt')) {
3515 3515
             add_meta_box(
3516 3516
                 'postexcerpt',
3517 3517
                 esc_html__('Short Biography', 'event_espresso'),
3518 3518
                 'post_excerpt_meta_box',
3519
-                $this->_cpt_routes[ $this->_req_action ],
3519
+                $this->_cpt_routes[$this->_req_action],
3520 3520
                 'normal'
3521 3521
             );
3522 3522
         }
@@ -3525,7 +3525,7 @@  discard block
 block discarded – undo
3525 3525
                 'commentsdiv',
3526 3526
                 esc_html__('Notes on the Contact', 'event_espresso'),
3527 3527
                 'post_comment_meta_box',
3528
-                $this->_cpt_routes[ $this->_req_action ],
3528
+                $this->_cpt_routes[$this->_req_action],
3529 3529
                 'normal',
3530 3530
                 'core'
3531 3531
             );
@@ -3534,7 +3534,7 @@  discard block
 block discarded – undo
3534 3534
             'attendee_contact_info',
3535 3535
             esc_html__('Contact Info', 'event_espresso'),
3536 3536
             array($this, 'attendee_contact_info'),
3537
-            $this->_cpt_routes[ $this->_req_action ],
3537
+            $this->_cpt_routes[$this->_req_action],
3538 3538
             'side',
3539 3539
             'core'
3540 3540
         );
@@ -3542,7 +3542,7 @@  discard block
 block discarded – undo
3542 3542
             'attendee_details_address',
3543 3543
             esc_html__('Address Details', 'event_espresso'),
3544 3544
             array($this, 'attendee_address_details'),
3545
-            $this->_cpt_routes[ $this->_req_action ],
3545
+            $this->_cpt_routes[$this->_req_action],
3546 3546
             'normal',
3547 3547
             'core'
3548 3548
         );
@@ -3550,7 +3550,7 @@  discard block
 block discarded – undo
3550 3550
             'attendee_registrations',
3551 3551
             esc_html__('Registrations for this Contact', 'event_espresso'),
3552 3552
             array($this, 'attendee_registrations_meta_box'),
3553
-            $this->_cpt_routes[ $this->_req_action ],
3553
+            $this->_cpt_routes[$this->_req_action],
3554 3554
             'normal',
3555 3555
             'high'
3556 3556
         );
@@ -3651,7 +3651,7 @@  discard block
 block discarded – undo
3651 3651
             )
3652 3652
         );
3653 3653
         $template =
3654
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3654
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3655 3655
         EEH_Template::display_template($template, $this->_template_args);
3656 3656
     }
3657 3657
 
@@ -3674,7 +3674,7 @@  discard block
 block discarded – undo
3674 3674
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3675 3675
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3676 3676
         $template =
3677
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3677
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3678 3678
         EEH_Template::display_template($template, $this->_template_args);
3679 3679
     }
3680 3680
 
@@ -3689,7 +3689,7 @@  discard block
 block discarded – undo
3689 3689
     public function after_title_form_fields($post)
3690 3690
     {
3691 3691
         if ($post->post_type === 'espresso_attendees') {
3692
-            $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3692
+            $template = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3693 3693
             $template_args['attendee'] = $this->_cpt_model_obj;
3694 3694
             EEH_Template::display_template($template, $template_args);
3695 3695
         }
@@ -3713,14 +3713,14 @@  discard block
 block discarded – undo
3713 3713
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3714 3714
         $success = 1;
3715 3715
         // Checkboxes
3716
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3716
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3717 3717
             // if array has more than one element than success message should be plural
3718 3718
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3719 3719
             // cycle thru checkboxes
3720 3720
             foreach ($this->_req_data['checkbox'] as $ATT_ID) {
3721 3721
                 $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID)
3722 3722
                     : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID);
3723
-                if (! $updated) {
3723
+                if ( ! $updated) {
3724 3724
                     $success = 0;
3725 3725
                 }
3726 3726
             }
@@ -3731,7 +3731,7 @@  discard block
 block discarded – undo
3731 3731
             $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID);
3732 3732
             $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3733 3733
             $updated = $att->save() && $updated;
3734
-            if (! $updated) {
3734
+            if ( ! $updated) {
3735 3735
                 $success = 0;
3736 3736
             }
3737 3737
         }
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/model/Read.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -730,7 +730,7 @@  discard block
 block discarded – undo
730 730
      *
731 731
      * @param $model
732 732
      * @param $results_so_far
733
-     * @param $protected
733
+     * @param boolean $protected
734 734
      * @return array results
735 735
      * @throws EE_Error
736 736
      * @since 4.9.74.p
@@ -1563,7 +1563,7 @@  discard block
 block discarded – undo
1563 1563
      *
1564 1564
      * @param EEM_Base        $model
1565 1565
      * @param WP_REST_Request $request
1566
-     * @param null            $context
1566
+     * @param string            $context
1567 1567
      * @return array
1568 1568
      * @throws EE_Error
1569 1569
      * @throws InvalidArgumentException
Please login to merge, or discard this patch.
Indentation   +1623 added lines, -1623 removed lines patch added patch discarded remove patch
@@ -52,1627 +52,1627 @@
 block discarded – undo
52 52
 {
53 53
 
54 54
 
55
-    /**
56
-     * @var CalculatedModelFields
57
-     */
58
-    protected $fields_calculator;
59
-
60
-
61
-    /**
62
-     * Read constructor.
63
-     * @param CalculatedModelFields $fields_calculator
64
-     */
65
-    public function __construct(CalculatedModelFields $fields_calculator)
66
-    {
67
-        parent::__construct();
68
-        $this->fields_calculator = $fields_calculator;
69
-    }
70
-
71
-
72
-    /**
73
-     * Handles requests to get all (or a filtered subset) of entities for a particular model
74
-     *
75
-     * @param WP_REST_Request $request
76
-     * @param string $version
77
-     * @param string $model_name
78
-     * @return WP_REST_Response|WP_Error
79
-     * @throws InvalidArgumentException
80
-     * @throws InvalidDataTypeException
81
-     * @throws InvalidInterfaceException
82
-     */
83
-    public static function handleRequestGetAll(WP_REST_Request $request, $version, $model_name)
84
-    {
85
-        $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
86
-        try {
87
-            $controller->setRequestedVersion($version);
88
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
89
-                return $controller->sendResponse(
90
-                    new WP_Error(
91
-                        'endpoint_parsing_error',
92
-                        sprintf(
93
-                            __(
94
-                                'There is no model for endpoint %s. Please contact event espresso support',
95
-                                'event_espresso'
96
-                            ),
97
-                            $model_name
98
-                        )
99
-                    )
100
-                );
101
-            }
102
-            return $controller->sendResponse(
103
-                $controller->getEntitiesFromModel(
104
-                    $controller->getModelVersionInfo()->loadModel($model_name),
105
-                    $request
106
-                )
107
-            );
108
-        } catch (Exception $e) {
109
-            return $controller->sendResponse($e);
110
-        }
111
-    }
112
-
113
-
114
-    /**
115
-     * Prepares and returns schema for any OPTIONS request.
116
-     *
117
-     * @param string $version The API endpoint version being used.
118
-     * @param string $model_name Something like `Event` or `Registration`
119
-     * @return array
120
-     * @throws InvalidArgumentException
121
-     * @throws InvalidDataTypeException
122
-     * @throws InvalidInterfaceException
123
-     */
124
-    public static function handleSchemaRequest($version, $model_name)
125
-    {
126
-        $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
127
-        try {
128
-            $controller->setRequestedVersion($version);
129
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
130
-                return array();
131
-            }
132
-            // get the model for this version
133
-            $model = $controller->getModelVersionInfo()->loadModel($model_name);
134
-            $model_schema = new JsonModelSchema($model, LoaderFactory::getLoader()->getShared('EventEspresso\core\libraries\rest_api\CalculatedModelFields'));
135
-            return $model_schema->getModelSchemaForRelations(
136
-                $controller->getModelVersionInfo()->relationSettings($model),
137
-                $controller->customizeSchemaForRestResponse(
138
-                    $model,
139
-                    $model_schema->getModelSchemaForFields(
140
-                        $controller->getModelVersionInfo()->fieldsOnModelInThisVersion($model),
141
-                        $model_schema->getInitialSchemaStructure()
142
-                    )
143
-                )
144
-            );
145
-        } catch (Exception $e) {
146
-            return array();
147
-        }
148
-    }
149
-
150
-
151
-    /**
152
-     * This loops through each field in the given schema for the model and does the following:
153
-     * - add any extra fields that are REST API specific and related to existing fields.
154
-     * - transform default values into the correct format for a REST API response.
155
-     *
156
-     * @param EEM_Base $model
157
-     * @param array    $schema
158
-     * @return array  The final schema.
159
-     * @throws EE_Error
160
-     */
161
-    public function customizeSchemaForRestResponse(EEM_Base $model, array $schema)
162
-    {
163
-        foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field) {
164
-            $schema = $this->translateDefaultsForRestResponse(
165
-                $field_name,
166
-                $field,
167
-                $this->maybeAddExtraFieldsToSchema($field_name, $field, $schema)
168
-            );
169
-        }
170
-        return $schema;
171
-    }
172
-
173
-
174
-    /**
175
-     * This is used to ensure that the 'default' value set in the schema response is formatted correctly for the REST
176
-     * response.
177
-     *
178
-     * @param                      $field_name
179
-     * @param EE_Model_Field_Base  $field
180
-     * @param array                $schema
181
-     * @return array
182
-     * @throws RestException if a default value has a PHP object, which should never do (and if we
183
-     * @throws EE_Error
184
-     * did, let's know about it ASAP, so let the exception bubble up)
185
-     */
186
-    protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema)
187
-    {
188
-        if (isset($schema['properties'][ $field_name ]['default'])) {
189
-            if (is_array($schema['properties'][ $field_name ]['default'])) {
190
-                foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) {
191
-                    if ($default_key === 'raw') {
192
-                        $schema['properties'][ $field_name ]['default'][ $default_key ] =
193
-                            ModelDataTranslator::prepareFieldValueForJson(
194
-                                $field,
195
-                                $default_value,
196
-                                $this->getModelVersionInfo()->requestedVersion()
197
-                            );
198
-                    }
199
-                }
200
-            } else {
201
-                $schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson(
202
-                    $field,
203
-                    $schema['properties'][ $field_name ]['default'],
204
-                    $this->getModelVersionInfo()->requestedVersion()
205
-                );
206
-            }
207
-        }
208
-        return $schema;
209
-    }
210
-
211
-
212
-    /**
213
-     * Adds additional fields to the schema
214
-     * The REST API returns a GMT value field for each datetime field in the resource.  Thus the description about this
215
-     * needs to be added to the schema.
216
-     *
217
-     * @param                      $field_name
218
-     * @param EE_Model_Field_Base  $field
219
-     * @param array                $schema
220
-     * @return array
221
-     */
222
-    protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema)
223
-    {
224
-        if ($field instanceof EE_Datetime_Field) {
225
-            $schema['properties'][ $field_name . '_gmt' ] = $field->getSchema();
226
-            // modify the description
227
-            $schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf(
228
-                esc_html__('%s - the value for this field is in GMT.', 'event_espresso'),
229
-                wp_specialchars_decode($field->get_nicename(), ENT_QUOTES)
230
-            );
231
-        }
232
-        return $schema;
233
-    }
234
-
235
-
236
-    /**
237
-     * Used to figure out the route from the request when a `WP_REST_Request` object is not available
238
-     *
239
-     * @return string
240
-     */
241
-    protected function getRouteFromRequest()
242
-    {
243
-        if (isset($GLOBALS['wp'])
244
-            && $GLOBALS['wp'] instanceof WP
245
-            && isset($GLOBALS['wp']->query_vars['rest_route'])
246
-        ) {
247
-            return $GLOBALS['wp']->query_vars['rest_route'];
248
-        }
249
-        return isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
250
-    }
251
-
252
-
253
-    /**
254
-     * Gets a single entity related to the model indicated in the path and its id
255
-     *
256
-     * @param WP_REST_Request $request
257
-     * @param string $version
258
-     * @param string $model_name
259
-     * @return WP_REST_Response|WP_Error
260
-     * @throws InvalidDataTypeException
261
-     * @throws InvalidInterfaceException
262
-     * @throws InvalidArgumentException
263
-     */
264
-    public static function handleRequestGetOne(WP_REST_Request $request, $version, $model_name)
265
-    {
266
-        $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
267
-        try {
268
-            $controller->setRequestedVersion($version);
269
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
270
-                return $controller->sendResponse(
271
-                    new WP_Error(
272
-                        'endpoint_parsing_error',
273
-                        sprintf(
274
-                            __(
275
-                                'There is no model for endpoint %s. Please contact event espresso support',
276
-                                'event_espresso'
277
-                            ),
278
-                            $model_name
279
-                        )
280
-                    )
281
-                );
282
-            }
283
-            return $controller->sendResponse(
284
-                $controller->getEntityFromModel(
285
-                    $controller->getModelVersionInfo()->loadModel($model_name),
286
-                    $request
287
-                )
288
-            );
289
-        } catch (Exception $e) {
290
-            return $controller->sendResponse($e);
291
-        }
292
-    }
293
-
294
-
295
-    /**
296
-     * Gets all the related entities (or if its a belongs-to relation just the one)
297
-     * to the item with the given id
298
-     *
299
-     * @param WP_REST_Request $request
300
-     * @param string $version
301
-     * @param string $model_name
302
-     * @param string $related_model_name
303
-     * @return WP_REST_Response|WP_Error
304
-     * @throws InvalidDataTypeException
305
-     * @throws InvalidInterfaceException
306
-     * @throws InvalidArgumentException
307
-     */
308
-    public static function handleRequestGetRelated(
309
-        WP_REST_Request $request,
310
-        $version,
311
-        $model_name,
312
-        $related_model_name
313
-    ) {
314
-        $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
315
-        try {
316
-            $controller->setRequestedVersion($version);
317
-            $main_model = $controller->validateModel($model_name);
318
-            $controller->validateModel($related_model_name);
319
-            return $controller->sendResponse(
320
-                $controller->getEntitiesFromRelation(
321
-                    $request->get_param('id'),
322
-                    $main_model->related_settings_for($related_model_name),
323
-                    $request
324
-                )
325
-            );
326
-        } catch (Exception $e) {
327
-            return $controller->sendResponse($e);
328
-        }
329
-    }
330
-
331
-
332
-    /**
333
-     * Gets a collection for the given model and filters
334
-     *
335
-     * @param EEM_Base        $model
336
-     * @param WP_REST_Request $request
337
-     * @return array
338
-     * @throws DomainException
339
-     * @throws EE_Error
340
-     * @throws InvalidArgumentException
341
-     * @throws InvalidDataTypeException
342
-     * @throws InvalidInterfaceException
343
-     * @throws ModelConfigurationException
344
-     * @throws ReflectionException
345
-     * @throws RestException
346
-     * @throws RestPasswordIncorrectException
347
-     * @throws RestPasswordRequiredException
348
-     * @throws UnexpectedEntityException
349
-     */
350
-    public function getEntitiesFromModel($model, $request)
351
-    {
352
-        $query_params = $this->createModelQueryParams($model, $request->get_params());
353
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) {
354
-            $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
355
-            throw new RestException(
356
-                sprintf('rest_%s_cannot_list', $model_name_plural),
357
-                sprintf(
358
-                    __('Sorry, you are not allowed to list %1$s. Missing permissions: %2$s', 'event_espresso'),
359
-                    $model_name_plural,
360
-                    Capabilities::getMissingPermissionsString($model, $query_params['caps'])
361
-                ),
362
-                array('status' => 403)
363
-            );
364
-        }
365
-        if (! $request->get_header('no_rest_headers')) {
366
-            $this->setHeadersFromQueryParams($model, $query_params);
367
-        }
368
-        /** @type array $results */
369
-        $results = $model->get_all_wpdb_results($query_params);
370
-        $nice_results = array();
371
-        foreach ($results as $result) {
372
-            $nice_results[] =  $this->createEntityFromWpdbResult(
373
-                $model,
374
-                $result,
375
-                $request
376
-            );
377
-        }
378
-        return $nice_results;
379
-    }
380
-
381
-
382
-    /**
383
-     * Gets the collection for given relation object
384
-     * The same as Read::get_entities_from_model(), except if the relation
385
-     * is a HABTM relation, in which case it merges any non-foreign-key fields from
386
-     * the join-model-object into the results
387
-     *
388
-     * @param array                  $primary_model_query_params  query params for finding the item from which
389
-     *                                                            relations will be based
390
-     * @param EE_Model_Relation_Base $relation
391
-     * @param WP_REST_Request        $request
392
-     * @return array
393
-     * @throws DomainException
394
-     * @throws EE_Error
395
-     * @throws InvalidArgumentException
396
-     * @throws InvalidDataTypeException
397
-     * @throws InvalidInterfaceException
398
-     * @throws ModelConfigurationException
399
-     * @throws ReflectionException
400
-     * @throws RestException
401
-     * @throws RestPasswordIncorrectException
402
-     * @throws RestPasswordRequiredException
403
-     * @throws UnexpectedEntityException
404
-     */
405
-    protected function getEntitiesFromRelationUsingModelQueryParams($primary_model_query_params, $relation, $request)
406
-    {
407
-        $context = $this->validateContext($request->get_param('caps'));
408
-        $model = $relation->get_this_model();
409
-        $related_model = $relation->get_other_model();
410
-        if (! isset($primary_model_query_params[0])) {
411
-            $primary_model_query_params[0] = array();
412
-        }
413
-        // check if they can access the 1st model object
414
-        $primary_model_query_params = array(
415
-            0       => $primary_model_query_params[0],
416
-            'limit' => 1,
417
-        );
418
-        if ($model instanceof EEM_Soft_Delete_Base) {
419
-            $primary_model_query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included(
420
-                $primary_model_query_params
421
-            );
422
-        }
423
-        $restricted_query_params = $primary_model_query_params;
424
-        $restricted_query_params['caps'] = $context;
425
-        $restricted_query_params['limit'] = 1;
426
-        $this->setDebugInfo('main model query params', $restricted_query_params);
427
-        $this->setDebugInfo('missing caps', Capabilities::getMissingPermissionsString($related_model, $context));
428
-        $primary_model_rows = $model->get_all_wpdb_results($restricted_query_params);
429
-        $primary_model_row = null;
430
-        if (is_array($primary_model_rows)) {
431
-            $primary_model_row = reset($primary_model_rows);
432
-        }
433
-        if (! (
434
-            $primary_model_row
435
-            && Capabilities::currentUserHasPartialAccessTo($related_model, $context)
436
-        )
437
-        ) {
438
-            if ($relation instanceof EE_Belongs_To_Relation) {
439
-                $related_model_name_maybe_plural = strtolower($related_model->get_this_model_name());
440
-            } else {
441
-                $related_model_name_maybe_plural = EEH_Inflector::pluralize_and_lower(
442
-                    $related_model->get_this_model_name()
443
-                );
444
-            }
445
-            throw new RestException(
446
-                sprintf('rest_%s_cannot_list', $related_model_name_maybe_plural),
447
-                sprintf(
448
-                    __(
449
-                        'Sorry, you are not allowed to list %1$s related to %2$s. Missing permissions: %3$s',
450
-                        'event_espresso'
451
-                    ),
452
-                    $related_model_name_maybe_plural,
453
-                    $relation->get_this_model()->get_this_model_name(),
454
-                    implode(
455
-                        ',',
456
-                        array_keys(
457
-                            Capabilities::getMissingPermissions($related_model, $context)
458
-                        )
459
-                    )
460
-                ),
461
-                array('status' => 403)
462
-            );
463
-        }
464
-
465
-        $this->checkPassword(
466
-            $model,
467
-            $primary_model_row,
468
-            $restricted_query_params,
469
-            $request
470
-        );
471
-        $query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params());
472
-        foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) {
473
-            $query_params[0][ $relation->get_this_model()->get_this_model_name()
474
-                              . '.'
475
-                              . $where_condition_key ] = $where_condition_value;
476
-        }
477
-        $query_params['default_where_conditions'] = 'none';
478
-        $query_params['caps'] = $context;
479
-        if (! $request->get_header('no_rest_headers')) {
480
-            $this->setHeadersFromQueryParams($relation->get_other_model(), $query_params);
481
-        }
482
-        /** @type array $results */
483
-        $results = $relation->get_other_model()->get_all_wpdb_results($query_params);
484
-        $nice_results = array();
485
-        foreach ($results as $result) {
486
-            $nice_result = $this->createEntityFromWpdbResult(
487
-                $relation->get_other_model(),
488
-                $result,
489
-                $request
490
-            );
491
-            if ($relation instanceof EE_HABTM_Relation) {
492
-                // put the unusual stuff (properties from the HABTM relation) first, and make sure
493
-                // if there are conflicts we prefer the properties from the main model
494
-                $join_model_result = $this->createEntityFromWpdbResult(
495
-                    $relation->get_join_model(),
496
-                    $result,
497
-                    $request
498
-                );
499
-                $joined_result = array_merge($join_model_result, $nice_result);
500
-                // but keep the meta stuff from the main model
501
-                if (isset($nice_result['meta'])) {
502
-                    $joined_result['meta'] = $nice_result['meta'];
503
-                }
504
-                $nice_result = $joined_result;
505
-            }
506
-            $nice_results[] = $nice_result;
507
-        }
508
-        if ($relation instanceof EE_Belongs_To_Relation) {
509
-            return array_shift($nice_results);
510
-        } else {
511
-            return $nice_results;
512
-        }
513
-    }
514
-
515
-
516
-    /**
517
-     * Gets the collection for given relation object
518
-     * The same as Read::get_entities_from_model(), except if the relation
519
-     * is a HABTM relation, in which case it merges any non-foreign-key fields from
520
-     * the join-model-object into the results
521
-     *
522
-     * @param string                 $id the ID of the thing we are fetching related stuff from
523
-     * @param EE_Model_Relation_Base $relation
524
-     * @param WP_REST_Request        $request
525
-     * @return array
526
-     * @throws DomainException
527
-     * @throws EE_Error
528
-     * @throws InvalidArgumentException
529
-     * @throws InvalidDataTypeException
530
-     * @throws InvalidInterfaceException
531
-     * @throws ModelConfigurationException
532
-     * @throws ReflectionException
533
-     * @throws RestException
534
-     * @throws RestPasswordIncorrectException
535
-     * @throws RestPasswordRequiredException
536
-     * @throws UnexpectedEntityException
537
-     */
538
-    public function getEntitiesFromRelation($id, $relation, $request)
539
-    {
540
-        if (! $relation->get_this_model()->has_primary_key_field()) {
541
-            throw new EE_Error(
542
-                sprintf(
543
-                    __(
544
-                    // @codingStandardsIgnoreStart
545
-                        'Read::get_entities_from_relation should only be called from a model with a primary key, it was called from %1$s',
546
-                        // @codingStandardsIgnoreEnd
547
-                        'event_espresso'
548
-                    ),
549
-                    $relation->get_this_model()->get_this_model_name()
550
-                )
551
-            );
552
-        }
553
-        // can we edit that main item?
554
-        // if not, show nothing but an error
555
-        // otherwise, please proceed
556
-        return $this->getEntitiesFromRelationUsingModelQueryParams(
557
-            array(
558
-                array(
559
-                    $relation->get_this_model()->primary_key_name() => $id,
560
-                ),
561
-            ),
562
-            $relation,
563
-            $request
564
-        );
565
-    }
566
-
567
-
568
-    /**
569
-     * Sets the headers that are based on the model and query params,
570
-     * like the total records. This should only be called on the original request
571
-     * from the client, not on subsequent internal
572
-     *
573
-     * @param EEM_Base $model
574
-     * @param array    $query_params
575
-     * @return void
576
-     * @throws EE_Error
577
-     */
578
-    protected function setHeadersFromQueryParams($model, $query_params)
579
-    {
580
-        $this->setDebugInfo('model query params', $query_params);
581
-        $this->setDebugInfo(
582
-            'missing caps',
583
-            Capabilities::getMissingPermissionsString($model, $query_params['caps'])
584
-        );
585
-        // normally the limit to a 2-part array, where the 2nd item is the limit
586
-        if (! isset($query_params['limit'])) {
587
-            $query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit();
588
-        }
589
-        if (is_array($query_params['limit'])) {
590
-            $limit_parts = $query_params['limit'];
591
-        } else {
592
-            $limit_parts = explode(',', $query_params['limit']);
593
-            if (count($limit_parts) === 1) {
594
-                $limit_parts = array(0, $limit_parts[0]);
595
-            }
596
-        }
597
-        // remove the group by and having parts of the query, as those will
598
-        // make the sql query return an array of values, instead of just a single value
599
-        unset($query_params['group_by'], $query_params['having'], $query_params['limit']);
600
-        $count = $model->count($query_params, null, true);
601
-        $pages = $count / $limit_parts[1];
602
-        $this->setResponseHeader('Total', $count, false);
603
-        $this->setResponseHeader('PageSize', $limit_parts[1], false);
604
-        $this->setResponseHeader('TotalPages', ceil($pages), false);
605
-    }
606
-
607
-
608
-    /**
609
-     * Changes database results into REST API entities
610
-     *
611
-     * @param EEM_Base        $model
612
-     * @param array           $db_row     like results from $wpdb->get_results()
613
-     * @param WP_REST_Request $rest_request
614
-     * @param string          $deprecated no longer used
615
-     * @return array ready for being converted into json for sending to client
616
-     * @throws EE_Error
617
-     * @throws InvalidArgumentException
618
-     * @throws InvalidDataTypeException
619
-     * @throws InvalidInterfaceException
620
-     * @throws ReflectionException
621
-     * @throws RestException
622
-     * @throws RestPasswordIncorrectException
623
-     * @throws RestPasswordRequiredException
624
-     * @throws ModelConfigurationException
625
-     * @throws UnexpectedEntityException
626
-     * @throws DomainException
627
-     */
628
-    public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null)
629
-    {
630
-        if (! $rest_request instanceof WP_REST_Request) {
631
-            // ok so this was called in the old style, where the 3rd arg was
632
-            // $include, and the 4th arg was $context
633
-            // now setup the request just to avoid fatal errors, although we won't be able
634
-            // to truly make use of it because it's kinda devoid of info
635
-            $rest_request = new WP_REST_Request();
636
-            $rest_request->set_param('include', $rest_request);
637
-            $rest_request->set_param('caps', $deprecated);
638
-        }
639
-        if ($rest_request->get_param('caps') === null) {
640
-            $rest_request->set_param('caps', EEM_Base::caps_read);
641
-        }
642
-        $current_user_full_access_to_entity = $model->currentUserCan(
643
-            EEM_Base::caps_read_admin,
644
-            $model->deduce_fields_n_values_from_cols_n_values($db_row)
645
-        );
646
-        $entity_array = $this->createBareEntityFromWpdbResults($model, $db_row);
647
-        $entity_array = $this->addExtraFields($model, $db_row, $entity_array);
648
-        $entity_array['_links'] = $this->getEntityLinks($model, $db_row, $entity_array);
649
-        // when it's a regular read request for a model with a password and the password wasn't provided
650
-        // remove the password protected fields
651
-        $has_protected_fields = false;
652
-        try {
653
-            $this->checkPassword(
654
-                $model,
655
-                $db_row,
656
-                $model->alter_query_params_to_restrict_by_ID(
657
-                    $model->get_index_primary_key_string(
658
-                        $model->deduce_fields_n_values_from_cols_n_values($db_row)
659
-                    )
660
-                ),
661
-                $rest_request
662
-            );
663
-        } catch (RestPasswordRequiredException $e) {
664
-            if ($model->hasPassword()) {
665
-                // just remove protected fields
666
-                $has_protected_fields = true;
667
-                $entity_array = Capabilities::filterOutPasswordProtectedFields(
668
-                    $entity_array,
669
-                    $model,
670
-                    $this->getModelVersionInfo()
671
-                );
672
-            } else {
673
-                // that's a problem. None of this should be accessible if no password was provided
674
-                throw $e;
675
-            }
676
-        }
677
-
678
-        $entity_array['_calculated_fields'] = $this->getEntityCalculations($model, $db_row, $rest_request, $has_protected_fields);
679
-        $entity_array = apply_filters(
680
-            'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models',
681
-            $entity_array,
682
-            $model,
683
-            $rest_request->get_param('caps'),
684
-            $rest_request,
685
-            $this
686
-        );
687
-        // add an empty protected property for now. If it's still around after we remove everything the request didn't
688
-        // want, we'll populate it then. k?
689
-        $entity_array['_protected'] = array();
690
-        // remove any properties the request didn't want. This way _protected won't bother mentioning them
691
-        $entity_array = $this->includeOnlyRequestedProperties($model, $rest_request, $entity_array);
692
-        $entity_array = $this->includeRequestedModels($model, $rest_request, $entity_array, $db_row, $has_protected_fields);
693
-        // if they still wanted the _protected property, add it.
694
-        if (isset($entity_array['_protected'])) {
695
-            $entity_array = $this->addProtectedProperty($model, $entity_array, $has_protected_fields);
696
-        }
697
-        $entity_array = apply_filters(
698
-            'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal',
699
-            $entity_array,
700
-            $model,
701
-            $rest_request->get_param('caps'),
702
-            $rest_request,
703
-            $this
704
-        );
705
-        if (! $current_user_full_access_to_entity) {
706
-            $result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields(
707
-                $entity_array,
708
-                $model,
709
-                $rest_request->get_param('caps'),
710
-                $this->getModelVersionInfo()
711
-            );
712
-        } else {
713
-            $result_without_inaccessible_fields = $entity_array;
714
-        }
715
-        $this->setDebugInfo(
716
-            'inaccessible fields',
717
-            array_keys(array_diff_key((array) $entity_array, (array) $result_without_inaccessible_fields))
718
-        );
719
-        return apply_filters(
720
-            'FHEE__Read__create_entity_from_wpdb_results__entity_return',
721
-            $result_without_inaccessible_fields,
722
-            $model,
723
-            $rest_request->get_param('caps')
724
-        );
725
-    }
726
-
727
-
728
-    /**
729
-     * Returns an array describing which fields can be protected, and which actually were removed this request
730
-     *
731
-     * @param $model
732
-     * @param $results_so_far
733
-     * @param $protected
734
-     * @return array results
735
-     * @throws EE_Error
736
-     * @since 4.9.74.p
737
-     */
738
-    protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected)
739
-    {
740
-        if (! $protected || ! $model->hasPassword()) {
741
-            return $results_so_far;
742
-        }
743
-        $password_field = $model->getPasswordField();
744
-        $all_protected = array_merge(
745
-            array($password_field->get_name()),
746
-            $password_field->protectedFields()
747
-        );
748
-        $fields_included = array_keys($results_so_far);
749
-        $fields_included = array_intersect(
750
-            $all_protected,
751
-            $fields_included
752
-        );
753
-        foreach ($fields_included as $field_name) {
754
-            $results_so_far['_protected'][] = $field_name ;
755
-        }
756
-        return $results_so_far;
757
-    }
758
-
759
-
760
-    /**
761
-     * Creates a REST entity array (JSON object we're going to return in the response, but
762
-     * for now still a PHP array, but soon enough we'll call json_encode on it, don't worry),
763
-     * from $wpdb->get_row( $sql, ARRAY_A)
764
-     *
765
-     * @param EEM_Base $model
766
-     * @param array    $db_row
767
-     * @return array entity mostly ready for converting to JSON and sending in the response
768
-     * @throws EE_Error
769
-     * @throws InvalidArgumentException
770
-     * @throws InvalidDataTypeException
771
-     * @throws InvalidInterfaceException
772
-     * @throws ReflectionException
773
-     * @throws RestException
774
-     */
775
-    protected function createBareEntityFromWpdbResults(EEM_Base $model, $db_row)
776
-    {
777
-        $result = $model->deduce_fields_n_values_from_cols_n_values($db_row);
778
-        $result = array_intersect_key(
779
-            $result,
780
-            $this->getModelVersionInfo()->fieldsOnModelInThisVersion($model)
781
-        );
782
-        // if this is a CPT, we need to set the global $post to it,
783
-        // otherwise shortcodes etc won't work properly while rendering it
784
-        if ($model instanceof \EEM_CPT_Base) {
785
-            $do_chevy_shuffle = true;
786
-        } else {
787
-            $do_chevy_shuffle = false;
788
-        }
789
-        if ($do_chevy_shuffle) {
790
-            global $post;
791
-            $old_post = $post;
792
-            $post = get_post($result[ $model->primary_key_name() ]);
793
-            if (! $post instanceof WP_Post) {
794
-                // well that's weird, because $result is what we JUST fetched from the database
795
-                throw new RestException(
796
-                    'error_fetching_post_from_database_results',
797
-                    esc_html__(
798
-                        'An item was retrieved from the database but it\'s not a WP_Post like it should be.',
799
-                        'event_espresso'
800
-                    )
801
-                );
802
-            }
803
-            $model_object_classname = 'EE_' . $model->get_this_model_name();
804
-            $post->{$model_object_classname} = \EE_Registry::instance()->load_class(
805
-                $model_object_classname,
806
-                $result,
807
-                false,
808
-                false
809
-            );
810
-        }
811
-        foreach ($result as $field_name => $field_value) {
812
-            $field_obj = $model->field_settings_for($field_name);
813
-            if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) {
814
-                unset($result[ $field_name ]);
815
-            } elseif ($this->isSubclassOfOne(
816
-                $field_obj,
817
-                $this->getModelVersionInfo()->fieldsThatHaveRenderedFormat()
818
-            )
819
-            ) {
820
-                $result[ $field_name ] = array(
821
-                    'raw'      => $this->prepareFieldObjValueForJson($field_obj, $field_value),
822
-                    'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
823
-                );
824
-            } elseif ($this->isSubclassOfOne(
825
-                $field_obj,
826
-                $this->getModelVersionInfo()->fieldsThatHavePrettyFormat()
827
-            )
828
-            ) {
829
-                $result[ $field_name ] = array(
830
-                    'raw'    => $this->prepareFieldObjValueForJson($field_obj, $field_value),
831
-                    'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
832
-                );
833
-            } elseif ($field_obj instanceof \EE_Datetime_Field) {
834
-                $field_value = $field_obj->prepare_for_set_from_db($field_value);
835
-                // if the value is null, but we're not supposed to permit null, then set to the field's default
836
-                if (is_null($field_value)) {
837
-                    $field_value = $field_obj->getDefaultDateTimeObj();
838
-                }
839
-                if (is_null($field_value)) {
840
-                    $gmt_date = $local_date = ModelDataTranslator::prepareFieldValuesForJson(
841
-                        $field_obj,
842
-                        $field_value,
843
-                        $this->getModelVersionInfo()->requestedVersion()
844
-                    );
845
-                } else {
846
-                    $timezone = $field_value->getTimezone();
847
-                    EEH_DTT_Helper::setTimezone($field_value, new DateTimeZone('UTC'));
848
-                    $gmt_date = ModelDataTranslator::prepareFieldValuesForJson(
849
-                        $field_obj,
850
-                        $field_value,
851
-                        $this->getModelVersionInfo()->requestedVersion()
852
-                    );
853
-                    EEH_DTT_Helper::setTimezone($field_value, $timezone);
854
-                    $local_date = ModelDataTranslator::prepareFieldValuesForJson(
855
-                        $field_obj,
856
-                        $field_value,
857
-                        $this->getModelVersionInfo()->requestedVersion()
858
-                    );
859
-                }
860
-                $result[ $field_name . '_gmt' ] = $gmt_date;
861
-                $result[ $field_name ] = $local_date;
862
-            } else {
863
-                $result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value);
864
-            }
865
-        }
866
-        if ($do_chevy_shuffle) {
867
-            $post = $old_post;
868
-        }
869
-        return $result;
870
-    }
871
-
872
-
873
-    /**
874
-     * Takes a value all the way from the DB representation, to the model object's representation, to the
875
-     * user-facing PHP representation, to the REST API representation. (Assumes you've already taken from the DB
876
-     * representation using $field_obj->prepare_for_set_from_db())
877
-     *
878
-     * @param EE_Model_Field_Base $field_obj
879
-     * @param mixed               $value  as it's stored on a model object
880
-     * @param string              $format valid values are 'normal' (default), 'pretty', 'datetime_obj'
881
-     * @return mixed
882
-     * @throws RestException if $value contains a PHP object
883
-     * @throws EE_Error
884
-     */
885
-    protected function prepareFieldObjValueForJson(EE_Model_Field_Base $field_obj, $value, $format = 'normal')
886
-    {
887
-        $value = $field_obj->prepare_for_set_from_db($value);
888
-        switch ($format) {
889
-            case 'pretty':
890
-                $value = $field_obj->prepare_for_pretty_echoing($value);
891
-                break;
892
-            case 'normal':
893
-            default:
894
-                $value = $field_obj->prepare_for_get($value);
895
-                break;
896
-        }
897
-        return ModelDataTranslator::prepareFieldValuesForJson(
898
-            $field_obj,
899
-            $value,
900
-            $this->getModelVersionInfo()->requestedVersion()
901
-        );
902
-    }
903
-
904
-
905
-    /**
906
-     * Adds a few extra fields to the entity response
907
-     *
908
-     * @param EEM_Base $model
909
-     * @param array    $db_row
910
-     * @param array    $entity_array
911
-     * @return array modified entity
912
-     * @throws EE_Error
913
-     */
914
-    protected function addExtraFields(EEM_Base $model, $db_row, $entity_array)
915
-    {
916
-        if ($model instanceof EEM_CPT_Base) {
917
-            $entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]);
918
-        }
919
-        return $entity_array;
920
-    }
921
-
922
-
923
-    /**
924
-     * Gets links we want to add to the response
925
-     *
926
-     * @param EEM_Base         $model
927
-     * @param array            $db_row
928
-     * @param array            $entity_array
929
-     * @return array the _links item in the entity
930
-     * @throws EE_Error
931
-     * @global WP_REST_Server $wp_rest_server
932
-     */
933
-    protected function getEntityLinks($model, $db_row, $entity_array)
934
-    {
935
-        // add basic links
936
-        $links = array();
937
-        if ($model->has_primary_key_field()) {
938
-            $links['self'] = array(
939
-                array(
940
-                    'href' => $this->getVersionedLinkTo(
941
-                        EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
942
-                        . '/'
943
-                        . $entity_array[ $model->primary_key_name() ]
944
-                    ),
945
-                ),
946
-            );
947
-        }
948
-        $links['collection'] = array(
949
-            array(
950
-                'href' => $this->getVersionedLinkTo(
951
-                    EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
952
-                ),
953
-            ),
954
-        );
955
-        // add links to related models
956
-        if ($model->has_primary_key_field()) {
957
-            foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) {
958
-                $related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj);
959
-                $links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array(
960
-                    array(
961
-                        'href'   => $this->getVersionedLinkTo(
962
-                            EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
963
-                            . '/'
964
-                            . $entity_array[ $model->primary_key_name() ]
965
-                            . '/'
966
-                            . $related_model_part
967
-                        ),
968
-                        'single' => $relation_obj instanceof EE_Belongs_To_Relation,
969
-                    ),
970
-                );
971
-            }
972
-        }
973
-        return $links;
974
-    }
975
-
976
-
977
-    /**
978
-     * Adds the included models indicated in the request to the entity provided
979
-     *
980
-     * @param EEM_Base        $model
981
-     * @param WP_REST_Request $rest_request
982
-     * @param array           $entity_array
983
-     * @param array           $db_row
984
-     * @param boolean         $included_items_protected if the original item is password protected, don't include any related models.
985
-     * @return array the modified entity
986
-     * @throws DomainException
987
-     * @throws EE_Error
988
-     * @throws InvalidArgumentException
989
-     * @throws InvalidDataTypeException
990
-     * @throws InvalidInterfaceException
991
-     * @throws ModelConfigurationException
992
-     * @throws ReflectionException
993
-     * @throws UnexpectedEntityException
994
-     */
995
-    protected function includeRequestedModels(
996
-        EEM_Base $model,
997
-        WP_REST_Request $rest_request,
998
-        $entity_array,
999
-        $db_row = array(),
1000
-        $included_items_protected = false
1001
-    ) {
1002
-        // if $db_row not included, hope the entity array has what we need
1003
-        if (! $db_row) {
1004
-            $db_row = $entity_array;
1005
-        }
1006
-        $relation_settings = $this->getModelVersionInfo()->relationSettings($model);
1007
-        foreach ($relation_settings as $relation_name => $relation_obj) {
1008
-            $related_fields_to_include = $this->explodeAndGetItemsPrefixedWith(
1009
-                $rest_request->get_param('include'),
1010
-                $relation_name
1011
-            );
1012
-            $related_fields_to_calculate = $this->explodeAndGetItemsPrefixedWith(
1013
-                $rest_request->get_param('calculate'),
1014
-                $relation_name
1015
-            );
1016
-            // did they specify they wanted to include a related model, or
1017
-            // specific fields from a related model?
1018
-            // or did they specify to calculate a field from a related model?
1019
-            if ($related_fields_to_include || $related_fields_to_calculate) {
1020
-                // if so, we should include at least some part of the related model
1021
-                $pretend_related_request = new WP_REST_Request();
1022
-                $pretend_related_request->set_query_params(
1023
-                    array(
1024
-                        'caps'      => $rest_request->get_param('caps'),
1025
-                        'include'   => $related_fields_to_include,
1026
-                        'calculate' => $related_fields_to_calculate,
1027
-                        'password' => $rest_request->get_param('password')
1028
-                    )
1029
-                );
1030
-                $pretend_related_request->add_header('no_rest_headers', true);
1031
-                $primary_model_query_params = $model->alter_query_params_to_restrict_by_ID(
1032
-                    $model->get_index_primary_key_string(
1033
-                        $model->deduce_fields_n_values_from_cols_n_values($db_row)
1034
-                    )
1035
-                );
1036
-                if (! $included_items_protected) {
1037
-                    try {
1038
-                        $related_results = $this->getEntitiesFromRelationUsingModelQueryParams(
1039
-                            $primary_model_query_params,
1040
-                            $relation_obj,
1041
-                            $pretend_related_request
1042
-                        );
1043
-                    } catch (RestException $e) {
1044
-                        $related_results = null;
1045
-                    }
1046
-                } else {
1047
-                    // they're protected, hide them.
1048
-                    $related_results = null;
1049
-                    $entity_array['_protected'][] = Read::getRelatedEntityName($relation_name, $relation_obj);
1050
-                }
1051
-                if ($related_results instanceof WP_Error || $related_results === null) {
1052
-                    $related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array();
1053
-                }
1054
-                $entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results;
1055
-            }
1056
-        }
1057
-        return $entity_array;
1058
-    }
1059
-
1060
-    /**
1061
-     * If the user has requested only specific properties (including meta properties like _links or _protected)
1062
-     * remove everything else.
1063
-     * @since 4.9.74.p
1064
-     * @param EEM_Base $model
1065
-     * @param WP_REST_Request $rest_request
1066
-     * @param $entity_array
1067
-     * @return array
1068
-     * @throws EE_Error
1069
-     */
1070
-    protected function includeOnlyRequestedProperties(
1071
-        EEM_Base $model,
1072
-        WP_REST_Request $rest_request,
1073
-        $entity_array
1074
-    ) {
1075
-
1076
-        $includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), '');
1077
-        $includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model);
1078
-        // if they passed in * or didn't specify any includes, return everything
1079
-        if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) {
1080
-            if ($model->has_primary_key_field()) {
1081
-                // always include the primary key. ya just gotta know that at least
1082
-                $includes_for_this_model[] = $model->primary_key_name();
1083
-            }
1084
-            if ($this->explodeAndGetItemsPrefixedWith($rest_request->get_param('calculate'), '')) {
1085
-                $includes_for_this_model[] = '_calculated_fields';
1086
-            }
1087
-            $entity_array = array_intersect_key($entity_array, array_flip($includes_for_this_model));
1088
-        }
1089
-        return $entity_array;
1090
-    }
1091
-
1092
-
1093
-    /**
1094
-     * Returns a new array with all the names of models removed. Eg
1095
-     * array( 'Event', 'Datetime.*', 'foobar' ) would become array( 'Datetime.*', 'foobar' )
1096
-     *
1097
-     * @param array $arr
1098
-     * @return array
1099
-     */
1100
-    private function removeModelNamesFromArray($arr)
1101
-    {
1102
-        return array_diff($arr, array_keys(EE_Registry::instance()->non_abstract_db_models));
1103
-    }
1104
-
1105
-
1106
-    /**
1107
-     * Gets the calculated fields for the response
1108
-     *
1109
-     * @param EEM_Base        $model
1110
-     * @param array           $wpdb_row
1111
-     * @param WP_REST_Request $rest_request
1112
-     * @param boolean         $row_is_protected whether this row is password protected or not
1113
-     * @return stdClass the _calculations item in the entity
1114
-     * @throws EE_Error
1115
-     * @throws RestException if a default value has a PHP object, which should never do (and if we
1116
-     *                                          did, let's know about it ASAP, so let the exception bubble up)
1117
-     * @throws UnexpectedEntityException
1118
-     */
1119
-    protected function getEntityCalculations($model, $wpdb_row, $rest_request, $row_is_protected = false)
1120
-    {
1121
-        $calculated_fields = $this->explodeAndGetItemsPrefixedWith(
1122
-            $rest_request->get_param('calculate'),
1123
-            ''
1124
-        );
1125
-        // note: setting calculate=* doesn't do anything
1126
-        $calculated_fields_to_return = new stdClass();
1127
-        $protected_fields = array();
1128
-        foreach ($calculated_fields as $field_to_calculate) {
1129
-            try {
1130
-                // it's password protected, so they shouldn't be able to read this. Remove the value
1131
-                $schema = $this->fields_calculator->getJsonSchemaForModel($model);
1132
-                if ($row_is_protected
1133
-                    && isset($schema['properties'][ $field_to_calculate ]['protected'])
1134
-                    && $schema['properties'][ $field_to_calculate ]['protected']) {
1135
-                    $calculated_value = null;
1136
-                    $protected_fields[] = $field_to_calculate;
1137
-                    if ($schema['properties'][ $field_to_calculate ]['type']) {
1138
-                        switch ($schema['properties'][ $field_to_calculate ]['type']) {
1139
-                            case 'boolean':
1140
-                                $calculated_value = false;
1141
-                                break;
1142
-                            case 'integer':
1143
-                                $calculated_value = 0;
1144
-                                break;
1145
-                            case 'string':
1146
-                                $calculated_value = '';
1147
-                                break;
1148
-                            case 'array':
1149
-                                $calculated_value = array();
1150
-                                break;
1151
-                            case 'object':
1152
-                                $calculated_value = new stdClass();
1153
-                                break;
1154
-                        }
1155
-                    }
1156
-                } else {
1157
-                    $calculated_value = ModelDataTranslator::prepareFieldValueForJson(
1158
-                        null,
1159
-                        $this->fields_calculator->retrieveCalculatedFieldValue(
1160
-                            $model,
1161
-                            $field_to_calculate,
1162
-                            $wpdb_row,
1163
-                            $rest_request,
1164
-                            $this
1165
-                        ),
1166
-                        $this->getModelVersionInfo()->requestedVersion()
1167
-                    );
1168
-                }
1169
-                $calculated_fields_to_return->{$field_to_calculate} = $calculated_value;
1170
-            } catch (RestException $e) {
1171
-                // if we don't have permission to read it, just leave it out. but let devs know about the problem
1172
-                $this->setResponseHeader(
1173
-                    'Notices-Field-Calculation-Errors['
1174
-                    . $e->getStringCode()
1175
-                    . ']['
1176
-                    . $model->get_this_model_name()
1177
-                    . ']['
1178
-                    . $field_to_calculate
1179
-                    . ']',
1180
-                    $e->getMessage()
1181
-                );
1182
-            }
1183
-        }
1184
-        $calculated_fields_to_return->_protected = $protected_fields;
1185
-        return $calculated_fields_to_return;
1186
-    }
1187
-
1188
-
1189
-    /**
1190
-     * Gets the full URL to the resource, taking the requested version into account
1191
-     *
1192
-     * @param string $link_part_after_version_and_slash eg "events/10/datetimes"
1193
-     * @return string url eg "http://mysite.com/wp-json/ee/v4.6/events/10/datetimes"
1194
-     * @throws EE_Error
1195
-     */
1196
-    public function getVersionedLinkTo($link_part_after_version_and_slash)
1197
-    {
1198
-        return rest_url(
1199
-            EED_Core_Rest_Api::get_versioned_route_to(
1200
-                $link_part_after_version_and_slash,
1201
-                $this->getModelVersionInfo()->requestedVersion()
1202
-            )
1203
-        );
1204
-    }
1205
-
1206
-
1207
-    /**
1208
-     * Gets the correct lowercase name for the relation in the API according
1209
-     * to the relation's type
1210
-     *
1211
-     * @param string                  $relation_name
1212
-     * @param EE_Model_Relation_Base $relation_obj
1213
-     * @return string
1214
-     */
1215
-    public static function getRelatedEntityName($relation_name, $relation_obj)
1216
-    {
1217
-        if ($relation_obj instanceof EE_Belongs_To_Relation) {
1218
-            return strtolower($relation_name);
1219
-        }
1220
-        return EEH_Inflector::pluralize_and_lower($relation_name);
1221
-    }
1222
-
1223
-
1224
-    /**
1225
-     * Gets the one model object with the specified id for the specified model
1226
-     *
1227
-     * @param EEM_Base        $model
1228
-     * @param WP_REST_Request $request
1229
-     * @return array
1230
-     * @throws EE_Error
1231
-     * @throws InvalidArgumentException
1232
-     * @throws InvalidDataTypeException
1233
-     * @throws InvalidInterfaceException
1234
-     * @throws ModelConfigurationException
1235
-     * @throws ReflectionException
1236
-     * @throws RestException
1237
-     * @throws RestPasswordIncorrectException
1238
-     * @throws RestPasswordRequiredException
1239
-     * @throws UnexpectedEntityException
1240
-     * @throws DomainException
1241
-     */
1242
-    public function getEntityFromModel($model, $request)
1243
-    {
1244
-        $context = $this->validateContext($request->get_param('caps'));
1245
-        return $this->getOneOrReportPermissionError($model, $request, $context);
1246
-    }
1247
-
1248
-
1249
-    /**
1250
-     * If a context is provided which isn't valid, maybe it was added in a future
1251
-     * version so just treat it as a default read
1252
-     *
1253
-     * @param string $context
1254
-     * @return string array key of EEM_Base::cap_contexts_to_cap_action_map()
1255
-     */
1256
-    public function validateContext($context)
1257
-    {
1258
-        if (! $context) {
1259
-            $context = EEM_Base::caps_read;
1260
-        }
1261
-        $valid_contexts = EEM_Base::valid_cap_contexts();
1262
-        if (in_array($context, $valid_contexts, true)) {
1263
-            return $context;
1264
-        }
1265
-        return EEM_Base::caps_read;
1266
-    }
1267
-
1268
-
1269
-    /**
1270
-     * Verifies the passed in value is an allowable default where conditions value.
1271
-     *
1272
-     * @param $default_query_params
1273
-     * @return string
1274
-     */
1275
-    public function validateDefaultQueryParams($default_query_params)
1276
-    {
1277
-        $valid_default_where_conditions_for_api_calls = array(
1278
-            EEM_Base::default_where_conditions_all,
1279
-            EEM_Base::default_where_conditions_minimum_all,
1280
-            EEM_Base::default_where_conditions_minimum_others,
1281
-        );
1282
-        if (! $default_query_params) {
1283
-            $default_query_params = EEM_Base::default_where_conditions_all;
1284
-        }
1285
-        if (in_array(
1286
-            $default_query_params,
1287
-            $valid_default_where_conditions_for_api_calls,
1288
-            true
1289
-        )) {
1290
-            return $default_query_params;
1291
-        } else {
1292
-            return EEM_Base::default_where_conditions_all;
1293
-        }
1294
-    }
1295
-
1296
-
1297
-    /**
1298
-     * Translates API filter get parameter into model query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions.
1299
-     * Note: right now the query parameter keys for fields (and related fields)
1300
-     * can be left as-is, but it's quite possible this will change someday.
1301
-     * Also, this method's contents might be candidate for moving to Model_Data_Translator
1302
-     *
1303
-     * @param EEM_Base $model
1304
-     * @param          $query_params
1305
-     * @return array model query params (@see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions)
1306
-     *                                    or FALSE to indicate that absolutely no results should be returned
1307
-     * @throws EE_Error
1308
-     * @throws InvalidArgumentException
1309
-     * @throws InvalidDataTypeException
1310
-     * @throws InvalidInterfaceException
1311
-     * @throws RestException
1312
-     * @throws DomainException
1313
-     */
1314
-    public function createModelQueryParams($model, $query_params)
1315
-    {
1316
-        $model_query_params = array();
1317
-        if (isset($query_params['where'])) {
1318
-            $model_query_params[0] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
1319
-                $query_params['where'],
1320
-                $model,
1321
-                $this->getModelVersionInfo()->requestedVersion()
1322
-            );
1323
-        }
1324
-        if (isset($query_params['order_by'])) {
1325
-            $order_by = $query_params['order_by'];
1326
-        } elseif (isset($query_params['orderby'])) {
1327
-            $order_by = $query_params['orderby'];
1328
-        } else {
1329
-            $order_by = null;
1330
-        }
1331
-        if ($order_by !== null) {
1332
-            if (is_array($order_by)) {
1333
-                $order_by = ModelDataTranslator::prepareFieldNamesInArrayKeysFromJson($order_by);
1334
-            } else {
1335
-                // it's a single item
1336
-                $order_by = ModelDataTranslator::prepareFieldNameFromJson($order_by);
1337
-            }
1338
-            $model_query_params['order_by'] = $order_by;
1339
-        }
1340
-        if (isset($query_params['group_by'])) {
1341
-            $group_by = $query_params['group_by'];
1342
-        } elseif (isset($query_params['groupby'])) {
1343
-            $group_by = $query_params['groupby'];
1344
-        } else {
1345
-            $group_by = array_keys($model->get_combined_primary_key_fields());
1346
-        }
1347
-        // make sure they're all real names
1348
-        if (is_array($group_by)) {
1349
-            $group_by = ModelDataTranslator::prepareFieldNamesFromJson($group_by);
1350
-        }
1351
-        if ($group_by !== null) {
1352
-            $model_query_params['group_by'] = $group_by;
1353
-        }
1354
-        if (isset($query_params['having'])) {
1355
-            $model_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
1356
-                $query_params['having'],
1357
-                $model,
1358
-                $this->getModelVersionInfo()->requestedVersion()
1359
-            );
1360
-        }
1361
-        if (isset($query_params['order'])) {
1362
-            $model_query_params['order'] = $query_params['order'];
1363
-        }
1364
-        if (isset($query_params['mine'])) {
1365
-            $model_query_params = $model->alter_query_params_to_only_include_mine($model_query_params);
1366
-        }
1367
-        if (isset($query_params['limit'])) {
1368
-            // limit should be either a string like '23' or '23,43', or an array with two items in it
1369
-            if (! is_array($query_params['limit'])) {
1370
-                $limit_array = explode(',', (string) $query_params['limit']);
1371
-            } else {
1372
-                $limit_array = $query_params['limit'];
1373
-            }
1374
-            $sanitized_limit = array();
1375
-            foreach ($limit_array as $key => $limit_part) {
1376
-                if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) {
1377
-                    throw new EE_Error(
1378
-                        sprintf(
1379
-                            __(
1380
-                            // @codingStandardsIgnoreStart
1381
-                                'An invalid limit filter was provided. It was: %s. If the EE4 JSON REST API weren\'t in debug mode, this message would not appear.',
1382
-                                // @codingStandardsIgnoreEnd
1383
-                                'event_espresso'
1384
-                            ),
1385
-                            wp_json_encode($query_params['limit'])
1386
-                        )
1387
-                    );
1388
-                }
1389
-                $sanitized_limit[] = (int) $limit_part;
1390
-            }
1391
-            $model_query_params['limit'] = implode(',', $sanitized_limit);
1392
-        } else {
1393
-            $model_query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit();
1394
-        }
1395
-        if (isset($query_params['caps'])) {
1396
-            $model_query_params['caps'] = $this->validateContext($query_params['caps']);
1397
-        } else {
1398
-            $model_query_params['caps'] = EEM_Base::caps_read;
1399
-        }
1400
-        if (isset($query_params['default_where_conditions'])) {
1401
-            $model_query_params['default_where_conditions'] = $this->validateDefaultQueryParams(
1402
-                $query_params['default_where_conditions']
1403
-            );
1404
-        }
1405
-        // if this is a model protected by a password on another model, exclude the password protected
1406
-        // entities by default. But if they passed in a password, try to show them all. If the password is wrong,
1407
-        // though, they'll get an error (see Read::createEntityFromWpdbResult() which calls Read::checkPassword)
1408
-        if ($model_query_params['caps'] === EEM_Base::caps_read
1409
-            && empty($query_params['password'])
1410
-            && ! $model->hasPassword()
1411
-            && $model->restrictedByRelatedModelPassword()
1412
-        ) {
1413
-            $model_query_params['exclude_protected'] = true;
1414
-        }
1415
-
1416
-        return apply_filters('FHEE__Read__create_model_query_params', $model_query_params, $query_params, $model);
1417
-    }
1418
-
1419
-
1420
-    /**
1421
-     * Changes the REST-style query params for use in the models
1422
-     *
1423
-     * @deprecated
1424
-     * @param EEM_Base $model
1425
-     * @param array    $query_params sub-array from @see EEM_Base::get_all()
1426
-     * @return array
1427
-     */
1428
-    public function prepareRestQueryParamsKeyForModels($model, $query_params)
1429
-    {
1430
-        $model_ready_query_params = array();
1431
-        foreach ($query_params as $key => $value) {
1432
-            if (is_array($value)) {
1433
-                $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value);
1434
-            } else {
1435
-                $model_ready_query_params[ $key ] = $value;
1436
-            }
1437
-        }
1438
-        return $model_ready_query_params;
1439
-    }
1440
-
1441
-
1442
-    /**
1443
-     * @deprecated instead use ModelDataTranslator::prepareFieldValuesFromJson()
1444
-     * @param $model
1445
-     * @param $query_params
1446
-     * @return array
1447
-     */
1448
-    public function prepareRestQueryParamsValuesForModels($model, $query_params)
1449
-    {
1450
-        $model_ready_query_params = array();
1451
-        foreach ($query_params as $key => $value) {
1452
-            if (is_array($value)) {
1453
-                $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value);
1454
-            } else {
1455
-                $model_ready_query_params[ $key ] = $value;
1456
-            }
1457
-        }
1458
-        return $model_ready_query_params;
1459
-    }
1460
-
1461
-
1462
-    /**
1463
-     * Explodes the string on commas, and only returns items with $prefix followed by a period.
1464
-     * If no prefix is specified, returns items with no period.
1465
-     *
1466
-     * @param string|array $string_to_explode eg "jibba,jabba, blah, blah, blah" or array('jibba', 'jabba' )
1467
-     * @param string       $prefix            "Event" or "foobar"
1468
-     * @return array $string_to_exploded exploded on COMMAS, and if a prefix was specified
1469
-     *                                        we only return strings starting with that and a period; if no prefix was
1470
-     *                                        specified we return all items containing NO periods
1471
-     */
1472
-    public function explodeAndGetItemsPrefixedWith($string_to_explode, $prefix)
1473
-    {
1474
-        if (is_string($string_to_explode)) {
1475
-            $exploded_contents = explode(',', $string_to_explode);
1476
-        } elseif (is_array($string_to_explode)) {
1477
-            $exploded_contents = $string_to_explode;
1478
-        } else {
1479
-            $exploded_contents = array();
1480
-        }
1481
-        // if the string was empty, we want an empty array
1482
-        $exploded_contents = array_filter($exploded_contents);
1483
-        $contents_with_prefix = array();
1484
-        foreach ($exploded_contents as $item) {
1485
-            $item = trim($item);
1486
-            // if no prefix was provided, so we look for items with no "." in them
1487
-            if (! $prefix) {
1488
-                // does this item have a period?
1489
-                if (strpos($item, '.') === false) {
1490
-                    // if not, then its what we're looking for
1491
-                    $contents_with_prefix[] = $item;
1492
-                }
1493
-            } elseif (strpos($item, $prefix . '.') === 0) {
1494
-                // this item has the prefix and a period, grab it
1495
-                $contents_with_prefix[] = substr(
1496
-                    $item,
1497
-                    strpos($item, $prefix . '.') + strlen($prefix . '.')
1498
-                );
1499
-            } elseif ($item === $prefix) {
1500
-                // this item is JUST the prefix
1501
-                // so let's grab everything after, which is a blank string
1502
-                $contents_with_prefix[] = '';
1503
-            }
1504
-        }
1505
-        return $contents_with_prefix;
1506
-    }
1507
-
1508
-
1509
-    /**
1510
-     * @param string $include_string @see Read:handle_request_get_all
1511
-     * @param string $model_name
1512
-     * @return array of fields for this model. If $model_name is provided, then
1513
-     *                               the fields for that model, with the model's name removed from each.
1514
-     *                               If $include_string was blank or '*' returns an empty array
1515
-     * @throws EE_Error
1516
-     * @deprecated since 4.8.36.rc.001 You should instead use Read::explode_and_get_items_prefixed_with.
1517
-     *             Deprecated because its return values were really quite confusing- sometimes it returned
1518
-     *             an empty array (when the include string was blank or '*') or sometimes it returned
1519
-     *             array('*') (when you provided a model and a model of that kind was found).
1520
-     *             Parses the $include_string so we fetch all the field names relating to THIS model
1521
-     *             (ie have NO period in them), or for the provided model (ie start with the model
1522
-     *             name and then a period).
1523
-     */
1524
-    public function extractIncludesForThisModel($include_string, $model_name = null)
1525
-    {
1526
-        if (is_array($include_string)) {
1527
-            $include_string = implode(',', $include_string);
1528
-        }
1529
-        if ($include_string === '*' || $include_string === '') {
1530
-            return array();
1531
-        }
1532
-        $includes = explode(',', $include_string);
1533
-        $extracted_fields_to_include = array();
1534
-        if ($model_name) {
1535
-            foreach ($includes as $field_to_include) {
1536
-                $field_to_include = trim($field_to_include);
1537
-                if (strpos($field_to_include, $model_name . '.') === 0) {
1538
-                    // found the model name at the exact start
1539
-                    $field_sans_model_name = str_replace($model_name . '.', '', $field_to_include);
1540
-                    $extracted_fields_to_include[] = $field_sans_model_name;
1541
-                } elseif ($field_to_include === $model_name) {
1542
-                    $extracted_fields_to_include[] = '*';
1543
-                }
1544
-            }
1545
-        } else {
1546
-            // look for ones with no period
1547
-            foreach ($includes as $field_to_include) {
1548
-                $field_to_include = trim($field_to_include);
1549
-                if (strpos($field_to_include, '.') === false
1550
-                    && ! $this->getModelVersionInfo()->isModelNameInThisVersion($field_to_include)
1551
-                ) {
1552
-                    $extracted_fields_to_include[] = $field_to_include;
1553
-                }
1554
-            }
1555
-        }
1556
-        return $extracted_fields_to_include;
1557
-    }
1558
-
1559
-
1560
-    /**
1561
-     * Gets the single item using the model according to the request in the context given, otherwise
1562
-     * returns that it's inaccessible to the current user
1563
-     *
1564
-     * @param EEM_Base        $model
1565
-     * @param WP_REST_Request $request
1566
-     * @param null            $context
1567
-     * @return array
1568
-     * @throws EE_Error
1569
-     * @throws InvalidArgumentException
1570
-     * @throws InvalidDataTypeException
1571
-     * @throws InvalidInterfaceException
1572
-     * @throws ModelConfigurationException
1573
-     * @throws ReflectionException
1574
-     * @throws RestException
1575
-     * @throws RestPasswordIncorrectException
1576
-     * @throws RestPasswordRequiredException
1577
-     * @throws UnexpectedEntityException
1578
-     * @throws DomainException
1579
-     */
1580
-    public function getOneOrReportPermissionError(EEM_Base $model, WP_REST_Request $request, $context = null)
1581
-    {
1582
-        $query_params = array(array($model->primary_key_name() => $request->get_param('id')), 'limit' => 1);
1583
-        if ($model instanceof EEM_Soft_Delete_Base) {
1584
-            $query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included($query_params);
1585
-        }
1586
-        $restricted_query_params = $query_params;
1587
-        $restricted_query_params['caps'] = $context;
1588
-        $this->setDebugInfo('model query params', $restricted_query_params);
1589
-        $model_rows = $model->get_all_wpdb_results($restricted_query_params);
1590
-        if (! empty($model_rows)) {
1591
-            return $this->createEntityFromWpdbResult(
1592
-                $model,
1593
-                reset($model_rows),
1594
-                $request
1595
-            );
1596
-        }
1597
-        // ok let's test to see if we WOULD have found it, had we not had restrictions from missing capabilities
1598
-        $lowercase_model_name = strtolower($model->get_this_model_name());
1599
-        if ($model->exists($query_params)) {
1600
-            // you got shafted- it existed but we didn't want to tell you!
1601
-            throw new RestException(
1602
-                'rest_user_cannot_' . $context,
1603
-                sprintf(
1604
-                    __('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'),
1605
-                    $context,
1606
-                    $lowercase_model_name,
1607
-                    Capabilities::getMissingPermissionsString(
1608
-                        $model,
1609
-                        $context
1610
-                    )
1611
-                ),
1612
-                array('status' => 403)
1613
-            );
1614
-        }
1615
-        // it's not you. It just doesn't exist
1616
-        throw new RestException(
1617
-            sprintf('rest_%s_invalid_id', $lowercase_model_name),
1618
-            sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
1619
-            array('status' => 404)
1620
-        );
1621
-    }
1622
-
1623
-    /**
1624
-     * Checks that if this content requires a password to be read, that it's been provided and is correct.
1625
-     * @since 4.9.74.p
1626
-     * @param EEM_Base $model
1627
-     * @param $model_row
1628
-     * @param array $query_params Adds 'default_where_conditions' => 'minimum' to ensure we don't confuse trashed with
1629
-     *                      password protected.
1630
-     * @param WP_REST_Request $request
1631
-     * @throws EE_Error
1632
-     * @throws InvalidArgumentException
1633
-     * @throws InvalidDataTypeException
1634
-     * @throws InvalidInterfaceException
1635
-     * @throws RestPasswordRequiredException
1636
-     * @throws RestPasswordIncorrectException
1637
-     * @throws ModelConfigurationException
1638
-     * @throws ReflectionException
1639
-     */
1640
-    protected function checkPassword(EEM_Base $model, $model_row, $query_params, WP_REST_Request $request)
1641
-    {
1642
-        $query_params['default_where_conditions'] = 'minimum';
1643
-        // stuff is only "protected" for front-end requests. Elsewhere, you either get full permission to access the object
1644
-        // or you don't.
1645
-        $request_caps = $request->get_param('caps');
1646
-        if (isset($request_caps) && $request_caps !== EEM_Base::caps_read) {
1647
-            return;
1648
-        }
1649
-        // if this entity requires a password, they better give it and it better be right!
1650
-        if ($model->hasPassword()
1651
-            && $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') {
1652
-            if (empty($request['password'])) {
1653
-                throw new RestPasswordRequiredException();
1654
-            }
1655
-            if (!hash_equals(
1656
-                $model_row[ $model->getPasswordField()->get_qualified_column() ],
1657
-                $request['password']
1658
-            )) {
1659
-                throw new RestPasswordIncorrectException();
1660
-            }
1661
-        } // wait! maybe this content is password protected
1662
-        elseif ($model->restrictedByRelatedModelPassword()
1663
-            && $request->get_param('caps') === EEM_Base::caps_read) {
1664
-            $password_supplied = $request->get_param('password');
1665
-            if (empty($password_supplied)) {
1666
-                $query_params['exclude_protected'] = true;
1667
-                if (!$model->exists($query_params)) {
1668
-                    throw new RestPasswordRequiredException();
1669
-                }
1670
-            } else {
1671
-                $query_params[0][ $model->modelChainAndPassword() ] = $password_supplied;
1672
-                if (!$model->exists($query_params)) {
1673
-                    throw new RestPasswordIncorrectException();
1674
-                }
1675
-            }
1676
-        }
1677
-    }
55
+	/**
56
+	 * @var CalculatedModelFields
57
+	 */
58
+	protected $fields_calculator;
59
+
60
+
61
+	/**
62
+	 * Read constructor.
63
+	 * @param CalculatedModelFields $fields_calculator
64
+	 */
65
+	public function __construct(CalculatedModelFields $fields_calculator)
66
+	{
67
+		parent::__construct();
68
+		$this->fields_calculator = $fields_calculator;
69
+	}
70
+
71
+
72
+	/**
73
+	 * Handles requests to get all (or a filtered subset) of entities for a particular model
74
+	 *
75
+	 * @param WP_REST_Request $request
76
+	 * @param string $version
77
+	 * @param string $model_name
78
+	 * @return WP_REST_Response|WP_Error
79
+	 * @throws InvalidArgumentException
80
+	 * @throws InvalidDataTypeException
81
+	 * @throws InvalidInterfaceException
82
+	 */
83
+	public static function handleRequestGetAll(WP_REST_Request $request, $version, $model_name)
84
+	{
85
+		$controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
86
+		try {
87
+			$controller->setRequestedVersion($version);
88
+			if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
89
+				return $controller->sendResponse(
90
+					new WP_Error(
91
+						'endpoint_parsing_error',
92
+						sprintf(
93
+							__(
94
+								'There is no model for endpoint %s. Please contact event espresso support',
95
+								'event_espresso'
96
+							),
97
+							$model_name
98
+						)
99
+					)
100
+				);
101
+			}
102
+			return $controller->sendResponse(
103
+				$controller->getEntitiesFromModel(
104
+					$controller->getModelVersionInfo()->loadModel($model_name),
105
+					$request
106
+				)
107
+			);
108
+		} catch (Exception $e) {
109
+			return $controller->sendResponse($e);
110
+		}
111
+	}
112
+
113
+
114
+	/**
115
+	 * Prepares and returns schema for any OPTIONS request.
116
+	 *
117
+	 * @param string $version The API endpoint version being used.
118
+	 * @param string $model_name Something like `Event` or `Registration`
119
+	 * @return array
120
+	 * @throws InvalidArgumentException
121
+	 * @throws InvalidDataTypeException
122
+	 * @throws InvalidInterfaceException
123
+	 */
124
+	public static function handleSchemaRequest($version, $model_name)
125
+	{
126
+		$controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
127
+		try {
128
+			$controller->setRequestedVersion($version);
129
+			if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
130
+				return array();
131
+			}
132
+			// get the model for this version
133
+			$model = $controller->getModelVersionInfo()->loadModel($model_name);
134
+			$model_schema = new JsonModelSchema($model, LoaderFactory::getLoader()->getShared('EventEspresso\core\libraries\rest_api\CalculatedModelFields'));
135
+			return $model_schema->getModelSchemaForRelations(
136
+				$controller->getModelVersionInfo()->relationSettings($model),
137
+				$controller->customizeSchemaForRestResponse(
138
+					$model,
139
+					$model_schema->getModelSchemaForFields(
140
+						$controller->getModelVersionInfo()->fieldsOnModelInThisVersion($model),
141
+						$model_schema->getInitialSchemaStructure()
142
+					)
143
+				)
144
+			);
145
+		} catch (Exception $e) {
146
+			return array();
147
+		}
148
+	}
149
+
150
+
151
+	/**
152
+	 * This loops through each field in the given schema for the model and does the following:
153
+	 * - add any extra fields that are REST API specific and related to existing fields.
154
+	 * - transform default values into the correct format for a REST API response.
155
+	 *
156
+	 * @param EEM_Base $model
157
+	 * @param array    $schema
158
+	 * @return array  The final schema.
159
+	 * @throws EE_Error
160
+	 */
161
+	public function customizeSchemaForRestResponse(EEM_Base $model, array $schema)
162
+	{
163
+		foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field) {
164
+			$schema = $this->translateDefaultsForRestResponse(
165
+				$field_name,
166
+				$field,
167
+				$this->maybeAddExtraFieldsToSchema($field_name, $field, $schema)
168
+			);
169
+		}
170
+		return $schema;
171
+	}
172
+
173
+
174
+	/**
175
+	 * This is used to ensure that the 'default' value set in the schema response is formatted correctly for the REST
176
+	 * response.
177
+	 *
178
+	 * @param                      $field_name
179
+	 * @param EE_Model_Field_Base  $field
180
+	 * @param array                $schema
181
+	 * @return array
182
+	 * @throws RestException if a default value has a PHP object, which should never do (and if we
183
+	 * @throws EE_Error
184
+	 * did, let's know about it ASAP, so let the exception bubble up)
185
+	 */
186
+	protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema)
187
+	{
188
+		if (isset($schema['properties'][ $field_name ]['default'])) {
189
+			if (is_array($schema['properties'][ $field_name ]['default'])) {
190
+				foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) {
191
+					if ($default_key === 'raw') {
192
+						$schema['properties'][ $field_name ]['default'][ $default_key ] =
193
+							ModelDataTranslator::prepareFieldValueForJson(
194
+								$field,
195
+								$default_value,
196
+								$this->getModelVersionInfo()->requestedVersion()
197
+							);
198
+					}
199
+				}
200
+			} else {
201
+				$schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson(
202
+					$field,
203
+					$schema['properties'][ $field_name ]['default'],
204
+					$this->getModelVersionInfo()->requestedVersion()
205
+				);
206
+			}
207
+		}
208
+		return $schema;
209
+	}
210
+
211
+
212
+	/**
213
+	 * Adds additional fields to the schema
214
+	 * The REST API returns a GMT value field for each datetime field in the resource.  Thus the description about this
215
+	 * needs to be added to the schema.
216
+	 *
217
+	 * @param                      $field_name
218
+	 * @param EE_Model_Field_Base  $field
219
+	 * @param array                $schema
220
+	 * @return array
221
+	 */
222
+	protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema)
223
+	{
224
+		if ($field instanceof EE_Datetime_Field) {
225
+			$schema['properties'][ $field_name . '_gmt' ] = $field->getSchema();
226
+			// modify the description
227
+			$schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf(
228
+				esc_html__('%s - the value for this field is in GMT.', 'event_espresso'),
229
+				wp_specialchars_decode($field->get_nicename(), ENT_QUOTES)
230
+			);
231
+		}
232
+		return $schema;
233
+	}
234
+
235
+
236
+	/**
237
+	 * Used to figure out the route from the request when a `WP_REST_Request` object is not available
238
+	 *
239
+	 * @return string
240
+	 */
241
+	protected function getRouteFromRequest()
242
+	{
243
+		if (isset($GLOBALS['wp'])
244
+			&& $GLOBALS['wp'] instanceof WP
245
+			&& isset($GLOBALS['wp']->query_vars['rest_route'])
246
+		) {
247
+			return $GLOBALS['wp']->query_vars['rest_route'];
248
+		}
249
+		return isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
250
+	}
251
+
252
+
253
+	/**
254
+	 * Gets a single entity related to the model indicated in the path and its id
255
+	 *
256
+	 * @param WP_REST_Request $request
257
+	 * @param string $version
258
+	 * @param string $model_name
259
+	 * @return WP_REST_Response|WP_Error
260
+	 * @throws InvalidDataTypeException
261
+	 * @throws InvalidInterfaceException
262
+	 * @throws InvalidArgumentException
263
+	 */
264
+	public static function handleRequestGetOne(WP_REST_Request $request, $version, $model_name)
265
+	{
266
+		$controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
267
+		try {
268
+			$controller->setRequestedVersion($version);
269
+			if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
270
+				return $controller->sendResponse(
271
+					new WP_Error(
272
+						'endpoint_parsing_error',
273
+						sprintf(
274
+							__(
275
+								'There is no model for endpoint %s. Please contact event espresso support',
276
+								'event_espresso'
277
+							),
278
+							$model_name
279
+						)
280
+					)
281
+				);
282
+			}
283
+			return $controller->sendResponse(
284
+				$controller->getEntityFromModel(
285
+					$controller->getModelVersionInfo()->loadModel($model_name),
286
+					$request
287
+				)
288
+			);
289
+		} catch (Exception $e) {
290
+			return $controller->sendResponse($e);
291
+		}
292
+	}
293
+
294
+
295
+	/**
296
+	 * Gets all the related entities (or if its a belongs-to relation just the one)
297
+	 * to the item with the given id
298
+	 *
299
+	 * @param WP_REST_Request $request
300
+	 * @param string $version
301
+	 * @param string $model_name
302
+	 * @param string $related_model_name
303
+	 * @return WP_REST_Response|WP_Error
304
+	 * @throws InvalidDataTypeException
305
+	 * @throws InvalidInterfaceException
306
+	 * @throws InvalidArgumentException
307
+	 */
308
+	public static function handleRequestGetRelated(
309
+		WP_REST_Request $request,
310
+		$version,
311
+		$model_name,
312
+		$related_model_name
313
+	) {
314
+		$controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
315
+		try {
316
+			$controller->setRequestedVersion($version);
317
+			$main_model = $controller->validateModel($model_name);
318
+			$controller->validateModel($related_model_name);
319
+			return $controller->sendResponse(
320
+				$controller->getEntitiesFromRelation(
321
+					$request->get_param('id'),
322
+					$main_model->related_settings_for($related_model_name),
323
+					$request
324
+				)
325
+			);
326
+		} catch (Exception $e) {
327
+			return $controller->sendResponse($e);
328
+		}
329
+	}
330
+
331
+
332
+	/**
333
+	 * Gets a collection for the given model and filters
334
+	 *
335
+	 * @param EEM_Base        $model
336
+	 * @param WP_REST_Request $request
337
+	 * @return array
338
+	 * @throws DomainException
339
+	 * @throws EE_Error
340
+	 * @throws InvalidArgumentException
341
+	 * @throws InvalidDataTypeException
342
+	 * @throws InvalidInterfaceException
343
+	 * @throws ModelConfigurationException
344
+	 * @throws ReflectionException
345
+	 * @throws RestException
346
+	 * @throws RestPasswordIncorrectException
347
+	 * @throws RestPasswordRequiredException
348
+	 * @throws UnexpectedEntityException
349
+	 */
350
+	public function getEntitiesFromModel($model, $request)
351
+	{
352
+		$query_params = $this->createModelQueryParams($model, $request->get_params());
353
+		if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) {
354
+			$model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
355
+			throw new RestException(
356
+				sprintf('rest_%s_cannot_list', $model_name_plural),
357
+				sprintf(
358
+					__('Sorry, you are not allowed to list %1$s. Missing permissions: %2$s', 'event_espresso'),
359
+					$model_name_plural,
360
+					Capabilities::getMissingPermissionsString($model, $query_params['caps'])
361
+				),
362
+				array('status' => 403)
363
+			);
364
+		}
365
+		if (! $request->get_header('no_rest_headers')) {
366
+			$this->setHeadersFromQueryParams($model, $query_params);
367
+		}
368
+		/** @type array $results */
369
+		$results = $model->get_all_wpdb_results($query_params);
370
+		$nice_results = array();
371
+		foreach ($results as $result) {
372
+			$nice_results[] =  $this->createEntityFromWpdbResult(
373
+				$model,
374
+				$result,
375
+				$request
376
+			);
377
+		}
378
+		return $nice_results;
379
+	}
380
+
381
+
382
+	/**
383
+	 * Gets the collection for given relation object
384
+	 * The same as Read::get_entities_from_model(), except if the relation
385
+	 * is a HABTM relation, in which case it merges any non-foreign-key fields from
386
+	 * the join-model-object into the results
387
+	 *
388
+	 * @param array                  $primary_model_query_params  query params for finding the item from which
389
+	 *                                                            relations will be based
390
+	 * @param EE_Model_Relation_Base $relation
391
+	 * @param WP_REST_Request        $request
392
+	 * @return array
393
+	 * @throws DomainException
394
+	 * @throws EE_Error
395
+	 * @throws InvalidArgumentException
396
+	 * @throws InvalidDataTypeException
397
+	 * @throws InvalidInterfaceException
398
+	 * @throws ModelConfigurationException
399
+	 * @throws ReflectionException
400
+	 * @throws RestException
401
+	 * @throws RestPasswordIncorrectException
402
+	 * @throws RestPasswordRequiredException
403
+	 * @throws UnexpectedEntityException
404
+	 */
405
+	protected function getEntitiesFromRelationUsingModelQueryParams($primary_model_query_params, $relation, $request)
406
+	{
407
+		$context = $this->validateContext($request->get_param('caps'));
408
+		$model = $relation->get_this_model();
409
+		$related_model = $relation->get_other_model();
410
+		if (! isset($primary_model_query_params[0])) {
411
+			$primary_model_query_params[0] = array();
412
+		}
413
+		// check if they can access the 1st model object
414
+		$primary_model_query_params = array(
415
+			0       => $primary_model_query_params[0],
416
+			'limit' => 1,
417
+		);
418
+		if ($model instanceof EEM_Soft_Delete_Base) {
419
+			$primary_model_query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included(
420
+				$primary_model_query_params
421
+			);
422
+		}
423
+		$restricted_query_params = $primary_model_query_params;
424
+		$restricted_query_params['caps'] = $context;
425
+		$restricted_query_params['limit'] = 1;
426
+		$this->setDebugInfo('main model query params', $restricted_query_params);
427
+		$this->setDebugInfo('missing caps', Capabilities::getMissingPermissionsString($related_model, $context));
428
+		$primary_model_rows = $model->get_all_wpdb_results($restricted_query_params);
429
+		$primary_model_row = null;
430
+		if (is_array($primary_model_rows)) {
431
+			$primary_model_row = reset($primary_model_rows);
432
+		}
433
+		if (! (
434
+			$primary_model_row
435
+			&& Capabilities::currentUserHasPartialAccessTo($related_model, $context)
436
+		)
437
+		) {
438
+			if ($relation instanceof EE_Belongs_To_Relation) {
439
+				$related_model_name_maybe_plural = strtolower($related_model->get_this_model_name());
440
+			} else {
441
+				$related_model_name_maybe_plural = EEH_Inflector::pluralize_and_lower(
442
+					$related_model->get_this_model_name()
443
+				);
444
+			}
445
+			throw new RestException(
446
+				sprintf('rest_%s_cannot_list', $related_model_name_maybe_plural),
447
+				sprintf(
448
+					__(
449
+						'Sorry, you are not allowed to list %1$s related to %2$s. Missing permissions: %3$s',
450
+						'event_espresso'
451
+					),
452
+					$related_model_name_maybe_plural,
453
+					$relation->get_this_model()->get_this_model_name(),
454
+					implode(
455
+						',',
456
+						array_keys(
457
+							Capabilities::getMissingPermissions($related_model, $context)
458
+						)
459
+					)
460
+				),
461
+				array('status' => 403)
462
+			);
463
+		}
464
+
465
+		$this->checkPassword(
466
+			$model,
467
+			$primary_model_row,
468
+			$restricted_query_params,
469
+			$request
470
+		);
471
+		$query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params());
472
+		foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) {
473
+			$query_params[0][ $relation->get_this_model()->get_this_model_name()
474
+							  . '.'
475
+							  . $where_condition_key ] = $where_condition_value;
476
+		}
477
+		$query_params['default_where_conditions'] = 'none';
478
+		$query_params['caps'] = $context;
479
+		if (! $request->get_header('no_rest_headers')) {
480
+			$this->setHeadersFromQueryParams($relation->get_other_model(), $query_params);
481
+		}
482
+		/** @type array $results */
483
+		$results = $relation->get_other_model()->get_all_wpdb_results($query_params);
484
+		$nice_results = array();
485
+		foreach ($results as $result) {
486
+			$nice_result = $this->createEntityFromWpdbResult(
487
+				$relation->get_other_model(),
488
+				$result,
489
+				$request
490
+			);
491
+			if ($relation instanceof EE_HABTM_Relation) {
492
+				// put the unusual stuff (properties from the HABTM relation) first, and make sure
493
+				// if there are conflicts we prefer the properties from the main model
494
+				$join_model_result = $this->createEntityFromWpdbResult(
495
+					$relation->get_join_model(),
496
+					$result,
497
+					$request
498
+				);
499
+				$joined_result = array_merge($join_model_result, $nice_result);
500
+				// but keep the meta stuff from the main model
501
+				if (isset($nice_result['meta'])) {
502
+					$joined_result['meta'] = $nice_result['meta'];
503
+				}
504
+				$nice_result = $joined_result;
505
+			}
506
+			$nice_results[] = $nice_result;
507
+		}
508
+		if ($relation instanceof EE_Belongs_To_Relation) {
509
+			return array_shift($nice_results);
510
+		} else {
511
+			return $nice_results;
512
+		}
513
+	}
514
+
515
+
516
+	/**
517
+	 * Gets the collection for given relation object
518
+	 * The same as Read::get_entities_from_model(), except if the relation
519
+	 * is a HABTM relation, in which case it merges any non-foreign-key fields from
520
+	 * the join-model-object into the results
521
+	 *
522
+	 * @param string                 $id the ID of the thing we are fetching related stuff from
523
+	 * @param EE_Model_Relation_Base $relation
524
+	 * @param WP_REST_Request        $request
525
+	 * @return array
526
+	 * @throws DomainException
527
+	 * @throws EE_Error
528
+	 * @throws InvalidArgumentException
529
+	 * @throws InvalidDataTypeException
530
+	 * @throws InvalidInterfaceException
531
+	 * @throws ModelConfigurationException
532
+	 * @throws ReflectionException
533
+	 * @throws RestException
534
+	 * @throws RestPasswordIncorrectException
535
+	 * @throws RestPasswordRequiredException
536
+	 * @throws UnexpectedEntityException
537
+	 */
538
+	public function getEntitiesFromRelation($id, $relation, $request)
539
+	{
540
+		if (! $relation->get_this_model()->has_primary_key_field()) {
541
+			throw new EE_Error(
542
+				sprintf(
543
+					__(
544
+					// @codingStandardsIgnoreStart
545
+						'Read::get_entities_from_relation should only be called from a model with a primary key, it was called from %1$s',
546
+						// @codingStandardsIgnoreEnd
547
+						'event_espresso'
548
+					),
549
+					$relation->get_this_model()->get_this_model_name()
550
+				)
551
+			);
552
+		}
553
+		// can we edit that main item?
554
+		// if not, show nothing but an error
555
+		// otherwise, please proceed
556
+		return $this->getEntitiesFromRelationUsingModelQueryParams(
557
+			array(
558
+				array(
559
+					$relation->get_this_model()->primary_key_name() => $id,
560
+				),
561
+			),
562
+			$relation,
563
+			$request
564
+		);
565
+	}
566
+
567
+
568
+	/**
569
+	 * Sets the headers that are based on the model and query params,
570
+	 * like the total records. This should only be called on the original request
571
+	 * from the client, not on subsequent internal
572
+	 *
573
+	 * @param EEM_Base $model
574
+	 * @param array    $query_params
575
+	 * @return void
576
+	 * @throws EE_Error
577
+	 */
578
+	protected function setHeadersFromQueryParams($model, $query_params)
579
+	{
580
+		$this->setDebugInfo('model query params', $query_params);
581
+		$this->setDebugInfo(
582
+			'missing caps',
583
+			Capabilities::getMissingPermissionsString($model, $query_params['caps'])
584
+		);
585
+		// normally the limit to a 2-part array, where the 2nd item is the limit
586
+		if (! isset($query_params['limit'])) {
587
+			$query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit();
588
+		}
589
+		if (is_array($query_params['limit'])) {
590
+			$limit_parts = $query_params['limit'];
591
+		} else {
592
+			$limit_parts = explode(',', $query_params['limit']);
593
+			if (count($limit_parts) === 1) {
594
+				$limit_parts = array(0, $limit_parts[0]);
595
+			}
596
+		}
597
+		// remove the group by and having parts of the query, as those will
598
+		// make the sql query return an array of values, instead of just a single value
599
+		unset($query_params['group_by'], $query_params['having'], $query_params['limit']);
600
+		$count = $model->count($query_params, null, true);
601
+		$pages = $count / $limit_parts[1];
602
+		$this->setResponseHeader('Total', $count, false);
603
+		$this->setResponseHeader('PageSize', $limit_parts[1], false);
604
+		$this->setResponseHeader('TotalPages', ceil($pages), false);
605
+	}
606
+
607
+
608
+	/**
609
+	 * Changes database results into REST API entities
610
+	 *
611
+	 * @param EEM_Base        $model
612
+	 * @param array           $db_row     like results from $wpdb->get_results()
613
+	 * @param WP_REST_Request $rest_request
614
+	 * @param string          $deprecated no longer used
615
+	 * @return array ready for being converted into json for sending to client
616
+	 * @throws EE_Error
617
+	 * @throws InvalidArgumentException
618
+	 * @throws InvalidDataTypeException
619
+	 * @throws InvalidInterfaceException
620
+	 * @throws ReflectionException
621
+	 * @throws RestException
622
+	 * @throws RestPasswordIncorrectException
623
+	 * @throws RestPasswordRequiredException
624
+	 * @throws ModelConfigurationException
625
+	 * @throws UnexpectedEntityException
626
+	 * @throws DomainException
627
+	 */
628
+	public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null)
629
+	{
630
+		if (! $rest_request instanceof WP_REST_Request) {
631
+			// ok so this was called in the old style, where the 3rd arg was
632
+			// $include, and the 4th arg was $context
633
+			// now setup the request just to avoid fatal errors, although we won't be able
634
+			// to truly make use of it because it's kinda devoid of info
635
+			$rest_request = new WP_REST_Request();
636
+			$rest_request->set_param('include', $rest_request);
637
+			$rest_request->set_param('caps', $deprecated);
638
+		}
639
+		if ($rest_request->get_param('caps') === null) {
640
+			$rest_request->set_param('caps', EEM_Base::caps_read);
641
+		}
642
+		$current_user_full_access_to_entity = $model->currentUserCan(
643
+			EEM_Base::caps_read_admin,
644
+			$model->deduce_fields_n_values_from_cols_n_values($db_row)
645
+		);
646
+		$entity_array = $this->createBareEntityFromWpdbResults($model, $db_row);
647
+		$entity_array = $this->addExtraFields($model, $db_row, $entity_array);
648
+		$entity_array['_links'] = $this->getEntityLinks($model, $db_row, $entity_array);
649
+		// when it's a regular read request for a model with a password and the password wasn't provided
650
+		// remove the password protected fields
651
+		$has_protected_fields = false;
652
+		try {
653
+			$this->checkPassword(
654
+				$model,
655
+				$db_row,
656
+				$model->alter_query_params_to_restrict_by_ID(
657
+					$model->get_index_primary_key_string(
658
+						$model->deduce_fields_n_values_from_cols_n_values($db_row)
659
+					)
660
+				),
661
+				$rest_request
662
+			);
663
+		} catch (RestPasswordRequiredException $e) {
664
+			if ($model->hasPassword()) {
665
+				// just remove protected fields
666
+				$has_protected_fields = true;
667
+				$entity_array = Capabilities::filterOutPasswordProtectedFields(
668
+					$entity_array,
669
+					$model,
670
+					$this->getModelVersionInfo()
671
+				);
672
+			} else {
673
+				// that's a problem. None of this should be accessible if no password was provided
674
+				throw $e;
675
+			}
676
+		}
677
+
678
+		$entity_array['_calculated_fields'] = $this->getEntityCalculations($model, $db_row, $rest_request, $has_protected_fields);
679
+		$entity_array = apply_filters(
680
+			'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models',
681
+			$entity_array,
682
+			$model,
683
+			$rest_request->get_param('caps'),
684
+			$rest_request,
685
+			$this
686
+		);
687
+		// add an empty protected property for now. If it's still around after we remove everything the request didn't
688
+		// want, we'll populate it then. k?
689
+		$entity_array['_protected'] = array();
690
+		// remove any properties the request didn't want. This way _protected won't bother mentioning them
691
+		$entity_array = $this->includeOnlyRequestedProperties($model, $rest_request, $entity_array);
692
+		$entity_array = $this->includeRequestedModels($model, $rest_request, $entity_array, $db_row, $has_protected_fields);
693
+		// if they still wanted the _protected property, add it.
694
+		if (isset($entity_array['_protected'])) {
695
+			$entity_array = $this->addProtectedProperty($model, $entity_array, $has_protected_fields);
696
+		}
697
+		$entity_array = apply_filters(
698
+			'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal',
699
+			$entity_array,
700
+			$model,
701
+			$rest_request->get_param('caps'),
702
+			$rest_request,
703
+			$this
704
+		);
705
+		if (! $current_user_full_access_to_entity) {
706
+			$result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields(
707
+				$entity_array,
708
+				$model,
709
+				$rest_request->get_param('caps'),
710
+				$this->getModelVersionInfo()
711
+			);
712
+		} else {
713
+			$result_without_inaccessible_fields = $entity_array;
714
+		}
715
+		$this->setDebugInfo(
716
+			'inaccessible fields',
717
+			array_keys(array_diff_key((array) $entity_array, (array) $result_without_inaccessible_fields))
718
+		);
719
+		return apply_filters(
720
+			'FHEE__Read__create_entity_from_wpdb_results__entity_return',
721
+			$result_without_inaccessible_fields,
722
+			$model,
723
+			$rest_request->get_param('caps')
724
+		);
725
+	}
726
+
727
+
728
+	/**
729
+	 * Returns an array describing which fields can be protected, and which actually were removed this request
730
+	 *
731
+	 * @param $model
732
+	 * @param $results_so_far
733
+	 * @param $protected
734
+	 * @return array results
735
+	 * @throws EE_Error
736
+	 * @since 4.9.74.p
737
+	 */
738
+	protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected)
739
+	{
740
+		if (! $protected || ! $model->hasPassword()) {
741
+			return $results_so_far;
742
+		}
743
+		$password_field = $model->getPasswordField();
744
+		$all_protected = array_merge(
745
+			array($password_field->get_name()),
746
+			$password_field->protectedFields()
747
+		);
748
+		$fields_included = array_keys($results_so_far);
749
+		$fields_included = array_intersect(
750
+			$all_protected,
751
+			$fields_included
752
+		);
753
+		foreach ($fields_included as $field_name) {
754
+			$results_so_far['_protected'][] = $field_name ;
755
+		}
756
+		return $results_so_far;
757
+	}
758
+
759
+
760
+	/**
761
+	 * Creates a REST entity array (JSON object we're going to return in the response, but
762
+	 * for now still a PHP array, but soon enough we'll call json_encode on it, don't worry),
763
+	 * from $wpdb->get_row( $sql, ARRAY_A)
764
+	 *
765
+	 * @param EEM_Base $model
766
+	 * @param array    $db_row
767
+	 * @return array entity mostly ready for converting to JSON and sending in the response
768
+	 * @throws EE_Error
769
+	 * @throws InvalidArgumentException
770
+	 * @throws InvalidDataTypeException
771
+	 * @throws InvalidInterfaceException
772
+	 * @throws ReflectionException
773
+	 * @throws RestException
774
+	 */
775
+	protected function createBareEntityFromWpdbResults(EEM_Base $model, $db_row)
776
+	{
777
+		$result = $model->deduce_fields_n_values_from_cols_n_values($db_row);
778
+		$result = array_intersect_key(
779
+			$result,
780
+			$this->getModelVersionInfo()->fieldsOnModelInThisVersion($model)
781
+		);
782
+		// if this is a CPT, we need to set the global $post to it,
783
+		// otherwise shortcodes etc won't work properly while rendering it
784
+		if ($model instanceof \EEM_CPT_Base) {
785
+			$do_chevy_shuffle = true;
786
+		} else {
787
+			$do_chevy_shuffle = false;
788
+		}
789
+		if ($do_chevy_shuffle) {
790
+			global $post;
791
+			$old_post = $post;
792
+			$post = get_post($result[ $model->primary_key_name() ]);
793
+			if (! $post instanceof WP_Post) {
794
+				// well that's weird, because $result is what we JUST fetched from the database
795
+				throw new RestException(
796
+					'error_fetching_post_from_database_results',
797
+					esc_html__(
798
+						'An item was retrieved from the database but it\'s not a WP_Post like it should be.',
799
+						'event_espresso'
800
+					)
801
+				);
802
+			}
803
+			$model_object_classname = 'EE_' . $model->get_this_model_name();
804
+			$post->{$model_object_classname} = \EE_Registry::instance()->load_class(
805
+				$model_object_classname,
806
+				$result,
807
+				false,
808
+				false
809
+			);
810
+		}
811
+		foreach ($result as $field_name => $field_value) {
812
+			$field_obj = $model->field_settings_for($field_name);
813
+			if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) {
814
+				unset($result[ $field_name ]);
815
+			} elseif ($this->isSubclassOfOne(
816
+				$field_obj,
817
+				$this->getModelVersionInfo()->fieldsThatHaveRenderedFormat()
818
+			)
819
+			) {
820
+				$result[ $field_name ] = array(
821
+					'raw'      => $this->prepareFieldObjValueForJson($field_obj, $field_value),
822
+					'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
823
+				);
824
+			} elseif ($this->isSubclassOfOne(
825
+				$field_obj,
826
+				$this->getModelVersionInfo()->fieldsThatHavePrettyFormat()
827
+			)
828
+			) {
829
+				$result[ $field_name ] = array(
830
+					'raw'    => $this->prepareFieldObjValueForJson($field_obj, $field_value),
831
+					'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
832
+				);
833
+			} elseif ($field_obj instanceof \EE_Datetime_Field) {
834
+				$field_value = $field_obj->prepare_for_set_from_db($field_value);
835
+				// if the value is null, but we're not supposed to permit null, then set to the field's default
836
+				if (is_null($field_value)) {
837
+					$field_value = $field_obj->getDefaultDateTimeObj();
838
+				}
839
+				if (is_null($field_value)) {
840
+					$gmt_date = $local_date = ModelDataTranslator::prepareFieldValuesForJson(
841
+						$field_obj,
842
+						$field_value,
843
+						$this->getModelVersionInfo()->requestedVersion()
844
+					);
845
+				} else {
846
+					$timezone = $field_value->getTimezone();
847
+					EEH_DTT_Helper::setTimezone($field_value, new DateTimeZone('UTC'));
848
+					$gmt_date = ModelDataTranslator::prepareFieldValuesForJson(
849
+						$field_obj,
850
+						$field_value,
851
+						$this->getModelVersionInfo()->requestedVersion()
852
+					);
853
+					EEH_DTT_Helper::setTimezone($field_value, $timezone);
854
+					$local_date = ModelDataTranslator::prepareFieldValuesForJson(
855
+						$field_obj,
856
+						$field_value,
857
+						$this->getModelVersionInfo()->requestedVersion()
858
+					);
859
+				}
860
+				$result[ $field_name . '_gmt' ] = $gmt_date;
861
+				$result[ $field_name ] = $local_date;
862
+			} else {
863
+				$result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value);
864
+			}
865
+		}
866
+		if ($do_chevy_shuffle) {
867
+			$post = $old_post;
868
+		}
869
+		return $result;
870
+	}
871
+
872
+
873
+	/**
874
+	 * Takes a value all the way from the DB representation, to the model object's representation, to the
875
+	 * user-facing PHP representation, to the REST API representation. (Assumes you've already taken from the DB
876
+	 * representation using $field_obj->prepare_for_set_from_db())
877
+	 *
878
+	 * @param EE_Model_Field_Base $field_obj
879
+	 * @param mixed               $value  as it's stored on a model object
880
+	 * @param string              $format valid values are 'normal' (default), 'pretty', 'datetime_obj'
881
+	 * @return mixed
882
+	 * @throws RestException if $value contains a PHP object
883
+	 * @throws EE_Error
884
+	 */
885
+	protected function prepareFieldObjValueForJson(EE_Model_Field_Base $field_obj, $value, $format = 'normal')
886
+	{
887
+		$value = $field_obj->prepare_for_set_from_db($value);
888
+		switch ($format) {
889
+			case 'pretty':
890
+				$value = $field_obj->prepare_for_pretty_echoing($value);
891
+				break;
892
+			case 'normal':
893
+			default:
894
+				$value = $field_obj->prepare_for_get($value);
895
+				break;
896
+		}
897
+		return ModelDataTranslator::prepareFieldValuesForJson(
898
+			$field_obj,
899
+			$value,
900
+			$this->getModelVersionInfo()->requestedVersion()
901
+		);
902
+	}
903
+
904
+
905
+	/**
906
+	 * Adds a few extra fields to the entity response
907
+	 *
908
+	 * @param EEM_Base $model
909
+	 * @param array    $db_row
910
+	 * @param array    $entity_array
911
+	 * @return array modified entity
912
+	 * @throws EE_Error
913
+	 */
914
+	protected function addExtraFields(EEM_Base $model, $db_row, $entity_array)
915
+	{
916
+		if ($model instanceof EEM_CPT_Base) {
917
+			$entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]);
918
+		}
919
+		return $entity_array;
920
+	}
921
+
922
+
923
+	/**
924
+	 * Gets links we want to add to the response
925
+	 *
926
+	 * @param EEM_Base         $model
927
+	 * @param array            $db_row
928
+	 * @param array            $entity_array
929
+	 * @return array the _links item in the entity
930
+	 * @throws EE_Error
931
+	 * @global WP_REST_Server $wp_rest_server
932
+	 */
933
+	protected function getEntityLinks($model, $db_row, $entity_array)
934
+	{
935
+		// add basic links
936
+		$links = array();
937
+		if ($model->has_primary_key_field()) {
938
+			$links['self'] = array(
939
+				array(
940
+					'href' => $this->getVersionedLinkTo(
941
+						EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
942
+						. '/'
943
+						. $entity_array[ $model->primary_key_name() ]
944
+					),
945
+				),
946
+			);
947
+		}
948
+		$links['collection'] = array(
949
+			array(
950
+				'href' => $this->getVersionedLinkTo(
951
+					EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
952
+				),
953
+			),
954
+		);
955
+		// add links to related models
956
+		if ($model->has_primary_key_field()) {
957
+			foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) {
958
+				$related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj);
959
+				$links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array(
960
+					array(
961
+						'href'   => $this->getVersionedLinkTo(
962
+							EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
963
+							. '/'
964
+							. $entity_array[ $model->primary_key_name() ]
965
+							. '/'
966
+							. $related_model_part
967
+						),
968
+						'single' => $relation_obj instanceof EE_Belongs_To_Relation,
969
+					),
970
+				);
971
+			}
972
+		}
973
+		return $links;
974
+	}
975
+
976
+
977
+	/**
978
+	 * Adds the included models indicated in the request to the entity provided
979
+	 *
980
+	 * @param EEM_Base        $model
981
+	 * @param WP_REST_Request $rest_request
982
+	 * @param array           $entity_array
983
+	 * @param array           $db_row
984
+	 * @param boolean         $included_items_protected if the original item is password protected, don't include any related models.
985
+	 * @return array the modified entity
986
+	 * @throws DomainException
987
+	 * @throws EE_Error
988
+	 * @throws InvalidArgumentException
989
+	 * @throws InvalidDataTypeException
990
+	 * @throws InvalidInterfaceException
991
+	 * @throws ModelConfigurationException
992
+	 * @throws ReflectionException
993
+	 * @throws UnexpectedEntityException
994
+	 */
995
+	protected function includeRequestedModels(
996
+		EEM_Base $model,
997
+		WP_REST_Request $rest_request,
998
+		$entity_array,
999
+		$db_row = array(),
1000
+		$included_items_protected = false
1001
+	) {
1002
+		// if $db_row not included, hope the entity array has what we need
1003
+		if (! $db_row) {
1004
+			$db_row = $entity_array;
1005
+		}
1006
+		$relation_settings = $this->getModelVersionInfo()->relationSettings($model);
1007
+		foreach ($relation_settings as $relation_name => $relation_obj) {
1008
+			$related_fields_to_include = $this->explodeAndGetItemsPrefixedWith(
1009
+				$rest_request->get_param('include'),
1010
+				$relation_name
1011
+			);
1012
+			$related_fields_to_calculate = $this->explodeAndGetItemsPrefixedWith(
1013
+				$rest_request->get_param('calculate'),
1014
+				$relation_name
1015
+			);
1016
+			// did they specify they wanted to include a related model, or
1017
+			// specific fields from a related model?
1018
+			// or did they specify to calculate a field from a related model?
1019
+			if ($related_fields_to_include || $related_fields_to_calculate) {
1020
+				// if so, we should include at least some part of the related model
1021
+				$pretend_related_request = new WP_REST_Request();
1022
+				$pretend_related_request->set_query_params(
1023
+					array(
1024
+						'caps'      => $rest_request->get_param('caps'),
1025
+						'include'   => $related_fields_to_include,
1026
+						'calculate' => $related_fields_to_calculate,
1027
+						'password' => $rest_request->get_param('password')
1028
+					)
1029
+				);
1030
+				$pretend_related_request->add_header('no_rest_headers', true);
1031
+				$primary_model_query_params = $model->alter_query_params_to_restrict_by_ID(
1032
+					$model->get_index_primary_key_string(
1033
+						$model->deduce_fields_n_values_from_cols_n_values($db_row)
1034
+					)
1035
+				);
1036
+				if (! $included_items_protected) {
1037
+					try {
1038
+						$related_results = $this->getEntitiesFromRelationUsingModelQueryParams(
1039
+							$primary_model_query_params,
1040
+							$relation_obj,
1041
+							$pretend_related_request
1042
+						);
1043
+					} catch (RestException $e) {
1044
+						$related_results = null;
1045
+					}
1046
+				} else {
1047
+					// they're protected, hide them.
1048
+					$related_results = null;
1049
+					$entity_array['_protected'][] = Read::getRelatedEntityName($relation_name, $relation_obj);
1050
+				}
1051
+				if ($related_results instanceof WP_Error || $related_results === null) {
1052
+					$related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array();
1053
+				}
1054
+				$entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results;
1055
+			}
1056
+		}
1057
+		return $entity_array;
1058
+	}
1059
+
1060
+	/**
1061
+	 * If the user has requested only specific properties (including meta properties like _links or _protected)
1062
+	 * remove everything else.
1063
+	 * @since 4.9.74.p
1064
+	 * @param EEM_Base $model
1065
+	 * @param WP_REST_Request $rest_request
1066
+	 * @param $entity_array
1067
+	 * @return array
1068
+	 * @throws EE_Error
1069
+	 */
1070
+	protected function includeOnlyRequestedProperties(
1071
+		EEM_Base $model,
1072
+		WP_REST_Request $rest_request,
1073
+		$entity_array
1074
+	) {
1075
+
1076
+		$includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), '');
1077
+		$includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model);
1078
+		// if they passed in * or didn't specify any includes, return everything
1079
+		if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) {
1080
+			if ($model->has_primary_key_field()) {
1081
+				// always include the primary key. ya just gotta know that at least
1082
+				$includes_for_this_model[] = $model->primary_key_name();
1083
+			}
1084
+			if ($this->explodeAndGetItemsPrefixedWith($rest_request->get_param('calculate'), '')) {
1085
+				$includes_for_this_model[] = '_calculated_fields';
1086
+			}
1087
+			$entity_array = array_intersect_key($entity_array, array_flip($includes_for_this_model));
1088
+		}
1089
+		return $entity_array;
1090
+	}
1091
+
1092
+
1093
+	/**
1094
+	 * Returns a new array with all the names of models removed. Eg
1095
+	 * array( 'Event', 'Datetime.*', 'foobar' ) would become array( 'Datetime.*', 'foobar' )
1096
+	 *
1097
+	 * @param array $arr
1098
+	 * @return array
1099
+	 */
1100
+	private function removeModelNamesFromArray($arr)
1101
+	{
1102
+		return array_diff($arr, array_keys(EE_Registry::instance()->non_abstract_db_models));
1103
+	}
1104
+
1105
+
1106
+	/**
1107
+	 * Gets the calculated fields for the response
1108
+	 *
1109
+	 * @param EEM_Base        $model
1110
+	 * @param array           $wpdb_row
1111
+	 * @param WP_REST_Request $rest_request
1112
+	 * @param boolean         $row_is_protected whether this row is password protected or not
1113
+	 * @return stdClass the _calculations item in the entity
1114
+	 * @throws EE_Error
1115
+	 * @throws RestException if a default value has a PHP object, which should never do (and if we
1116
+	 *                                          did, let's know about it ASAP, so let the exception bubble up)
1117
+	 * @throws UnexpectedEntityException
1118
+	 */
1119
+	protected function getEntityCalculations($model, $wpdb_row, $rest_request, $row_is_protected = false)
1120
+	{
1121
+		$calculated_fields = $this->explodeAndGetItemsPrefixedWith(
1122
+			$rest_request->get_param('calculate'),
1123
+			''
1124
+		);
1125
+		// note: setting calculate=* doesn't do anything
1126
+		$calculated_fields_to_return = new stdClass();
1127
+		$protected_fields = array();
1128
+		foreach ($calculated_fields as $field_to_calculate) {
1129
+			try {
1130
+				// it's password protected, so they shouldn't be able to read this. Remove the value
1131
+				$schema = $this->fields_calculator->getJsonSchemaForModel($model);
1132
+				if ($row_is_protected
1133
+					&& isset($schema['properties'][ $field_to_calculate ]['protected'])
1134
+					&& $schema['properties'][ $field_to_calculate ]['protected']) {
1135
+					$calculated_value = null;
1136
+					$protected_fields[] = $field_to_calculate;
1137
+					if ($schema['properties'][ $field_to_calculate ]['type']) {
1138
+						switch ($schema['properties'][ $field_to_calculate ]['type']) {
1139
+							case 'boolean':
1140
+								$calculated_value = false;
1141
+								break;
1142
+							case 'integer':
1143
+								$calculated_value = 0;
1144
+								break;
1145
+							case 'string':
1146
+								$calculated_value = '';
1147
+								break;
1148
+							case 'array':
1149
+								$calculated_value = array();
1150
+								break;
1151
+							case 'object':
1152
+								$calculated_value = new stdClass();
1153
+								break;
1154
+						}
1155
+					}
1156
+				} else {
1157
+					$calculated_value = ModelDataTranslator::prepareFieldValueForJson(
1158
+						null,
1159
+						$this->fields_calculator->retrieveCalculatedFieldValue(
1160
+							$model,
1161
+							$field_to_calculate,
1162
+							$wpdb_row,
1163
+							$rest_request,
1164
+							$this
1165
+						),
1166
+						$this->getModelVersionInfo()->requestedVersion()
1167
+					);
1168
+				}
1169
+				$calculated_fields_to_return->{$field_to_calculate} = $calculated_value;
1170
+			} catch (RestException $e) {
1171
+				// if we don't have permission to read it, just leave it out. but let devs know about the problem
1172
+				$this->setResponseHeader(
1173
+					'Notices-Field-Calculation-Errors['
1174
+					. $e->getStringCode()
1175
+					. ']['
1176
+					. $model->get_this_model_name()
1177
+					. ']['
1178
+					. $field_to_calculate
1179
+					. ']',
1180
+					$e->getMessage()
1181
+				);
1182
+			}
1183
+		}
1184
+		$calculated_fields_to_return->_protected = $protected_fields;
1185
+		return $calculated_fields_to_return;
1186
+	}
1187
+
1188
+
1189
+	/**
1190
+	 * Gets the full URL to the resource, taking the requested version into account
1191
+	 *
1192
+	 * @param string $link_part_after_version_and_slash eg "events/10/datetimes"
1193
+	 * @return string url eg "http://mysite.com/wp-json/ee/v4.6/events/10/datetimes"
1194
+	 * @throws EE_Error
1195
+	 */
1196
+	public function getVersionedLinkTo($link_part_after_version_and_slash)
1197
+	{
1198
+		return rest_url(
1199
+			EED_Core_Rest_Api::get_versioned_route_to(
1200
+				$link_part_after_version_and_slash,
1201
+				$this->getModelVersionInfo()->requestedVersion()
1202
+			)
1203
+		);
1204
+	}
1205
+
1206
+
1207
+	/**
1208
+	 * Gets the correct lowercase name for the relation in the API according
1209
+	 * to the relation's type
1210
+	 *
1211
+	 * @param string                  $relation_name
1212
+	 * @param EE_Model_Relation_Base $relation_obj
1213
+	 * @return string
1214
+	 */
1215
+	public static function getRelatedEntityName($relation_name, $relation_obj)
1216
+	{
1217
+		if ($relation_obj instanceof EE_Belongs_To_Relation) {
1218
+			return strtolower($relation_name);
1219
+		}
1220
+		return EEH_Inflector::pluralize_and_lower($relation_name);
1221
+	}
1222
+
1223
+
1224
+	/**
1225
+	 * Gets the one model object with the specified id for the specified model
1226
+	 *
1227
+	 * @param EEM_Base        $model
1228
+	 * @param WP_REST_Request $request
1229
+	 * @return array
1230
+	 * @throws EE_Error
1231
+	 * @throws InvalidArgumentException
1232
+	 * @throws InvalidDataTypeException
1233
+	 * @throws InvalidInterfaceException
1234
+	 * @throws ModelConfigurationException
1235
+	 * @throws ReflectionException
1236
+	 * @throws RestException
1237
+	 * @throws RestPasswordIncorrectException
1238
+	 * @throws RestPasswordRequiredException
1239
+	 * @throws UnexpectedEntityException
1240
+	 * @throws DomainException
1241
+	 */
1242
+	public function getEntityFromModel($model, $request)
1243
+	{
1244
+		$context = $this->validateContext($request->get_param('caps'));
1245
+		return $this->getOneOrReportPermissionError($model, $request, $context);
1246
+	}
1247
+
1248
+
1249
+	/**
1250
+	 * If a context is provided which isn't valid, maybe it was added in a future
1251
+	 * version so just treat it as a default read
1252
+	 *
1253
+	 * @param string $context
1254
+	 * @return string array key of EEM_Base::cap_contexts_to_cap_action_map()
1255
+	 */
1256
+	public function validateContext($context)
1257
+	{
1258
+		if (! $context) {
1259
+			$context = EEM_Base::caps_read;
1260
+		}
1261
+		$valid_contexts = EEM_Base::valid_cap_contexts();
1262
+		if (in_array($context, $valid_contexts, true)) {
1263
+			return $context;
1264
+		}
1265
+		return EEM_Base::caps_read;
1266
+	}
1267
+
1268
+
1269
+	/**
1270
+	 * Verifies the passed in value is an allowable default where conditions value.
1271
+	 *
1272
+	 * @param $default_query_params
1273
+	 * @return string
1274
+	 */
1275
+	public function validateDefaultQueryParams($default_query_params)
1276
+	{
1277
+		$valid_default_where_conditions_for_api_calls = array(
1278
+			EEM_Base::default_where_conditions_all,
1279
+			EEM_Base::default_where_conditions_minimum_all,
1280
+			EEM_Base::default_where_conditions_minimum_others,
1281
+		);
1282
+		if (! $default_query_params) {
1283
+			$default_query_params = EEM_Base::default_where_conditions_all;
1284
+		}
1285
+		if (in_array(
1286
+			$default_query_params,
1287
+			$valid_default_where_conditions_for_api_calls,
1288
+			true
1289
+		)) {
1290
+			return $default_query_params;
1291
+		} else {
1292
+			return EEM_Base::default_where_conditions_all;
1293
+		}
1294
+	}
1295
+
1296
+
1297
+	/**
1298
+	 * Translates API filter get parameter into model query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions.
1299
+	 * Note: right now the query parameter keys for fields (and related fields)
1300
+	 * can be left as-is, but it's quite possible this will change someday.
1301
+	 * Also, this method's contents might be candidate for moving to Model_Data_Translator
1302
+	 *
1303
+	 * @param EEM_Base $model
1304
+	 * @param          $query_params
1305
+	 * @return array model query params (@see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions)
1306
+	 *                                    or FALSE to indicate that absolutely no results should be returned
1307
+	 * @throws EE_Error
1308
+	 * @throws InvalidArgumentException
1309
+	 * @throws InvalidDataTypeException
1310
+	 * @throws InvalidInterfaceException
1311
+	 * @throws RestException
1312
+	 * @throws DomainException
1313
+	 */
1314
+	public function createModelQueryParams($model, $query_params)
1315
+	{
1316
+		$model_query_params = array();
1317
+		if (isset($query_params['where'])) {
1318
+			$model_query_params[0] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
1319
+				$query_params['where'],
1320
+				$model,
1321
+				$this->getModelVersionInfo()->requestedVersion()
1322
+			);
1323
+		}
1324
+		if (isset($query_params['order_by'])) {
1325
+			$order_by = $query_params['order_by'];
1326
+		} elseif (isset($query_params['orderby'])) {
1327
+			$order_by = $query_params['orderby'];
1328
+		} else {
1329
+			$order_by = null;
1330
+		}
1331
+		if ($order_by !== null) {
1332
+			if (is_array($order_by)) {
1333
+				$order_by = ModelDataTranslator::prepareFieldNamesInArrayKeysFromJson($order_by);
1334
+			} else {
1335
+				// it's a single item
1336
+				$order_by = ModelDataTranslator::prepareFieldNameFromJson($order_by);
1337
+			}
1338
+			$model_query_params['order_by'] = $order_by;
1339
+		}
1340
+		if (isset($query_params['group_by'])) {
1341
+			$group_by = $query_params['group_by'];
1342
+		} elseif (isset($query_params['groupby'])) {
1343
+			$group_by = $query_params['groupby'];
1344
+		} else {
1345
+			$group_by = array_keys($model->get_combined_primary_key_fields());
1346
+		}
1347
+		// make sure they're all real names
1348
+		if (is_array($group_by)) {
1349
+			$group_by = ModelDataTranslator::prepareFieldNamesFromJson($group_by);
1350
+		}
1351
+		if ($group_by !== null) {
1352
+			$model_query_params['group_by'] = $group_by;
1353
+		}
1354
+		if (isset($query_params['having'])) {
1355
+			$model_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
1356
+				$query_params['having'],
1357
+				$model,
1358
+				$this->getModelVersionInfo()->requestedVersion()
1359
+			);
1360
+		}
1361
+		if (isset($query_params['order'])) {
1362
+			$model_query_params['order'] = $query_params['order'];
1363
+		}
1364
+		if (isset($query_params['mine'])) {
1365
+			$model_query_params = $model->alter_query_params_to_only_include_mine($model_query_params);
1366
+		}
1367
+		if (isset($query_params['limit'])) {
1368
+			// limit should be either a string like '23' or '23,43', or an array with two items in it
1369
+			if (! is_array($query_params['limit'])) {
1370
+				$limit_array = explode(',', (string) $query_params['limit']);
1371
+			} else {
1372
+				$limit_array = $query_params['limit'];
1373
+			}
1374
+			$sanitized_limit = array();
1375
+			foreach ($limit_array as $key => $limit_part) {
1376
+				if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) {
1377
+					throw new EE_Error(
1378
+						sprintf(
1379
+							__(
1380
+							// @codingStandardsIgnoreStart
1381
+								'An invalid limit filter was provided. It was: %s. If the EE4 JSON REST API weren\'t in debug mode, this message would not appear.',
1382
+								// @codingStandardsIgnoreEnd
1383
+								'event_espresso'
1384
+							),
1385
+							wp_json_encode($query_params['limit'])
1386
+						)
1387
+					);
1388
+				}
1389
+				$sanitized_limit[] = (int) $limit_part;
1390
+			}
1391
+			$model_query_params['limit'] = implode(',', $sanitized_limit);
1392
+		} else {
1393
+			$model_query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit();
1394
+		}
1395
+		if (isset($query_params['caps'])) {
1396
+			$model_query_params['caps'] = $this->validateContext($query_params['caps']);
1397
+		} else {
1398
+			$model_query_params['caps'] = EEM_Base::caps_read;
1399
+		}
1400
+		if (isset($query_params['default_where_conditions'])) {
1401
+			$model_query_params['default_where_conditions'] = $this->validateDefaultQueryParams(
1402
+				$query_params['default_where_conditions']
1403
+			);
1404
+		}
1405
+		// if this is a model protected by a password on another model, exclude the password protected
1406
+		// entities by default. But if they passed in a password, try to show them all. If the password is wrong,
1407
+		// though, they'll get an error (see Read::createEntityFromWpdbResult() which calls Read::checkPassword)
1408
+		if ($model_query_params['caps'] === EEM_Base::caps_read
1409
+			&& empty($query_params['password'])
1410
+			&& ! $model->hasPassword()
1411
+			&& $model->restrictedByRelatedModelPassword()
1412
+		) {
1413
+			$model_query_params['exclude_protected'] = true;
1414
+		}
1415
+
1416
+		return apply_filters('FHEE__Read__create_model_query_params', $model_query_params, $query_params, $model);
1417
+	}
1418
+
1419
+
1420
+	/**
1421
+	 * Changes the REST-style query params for use in the models
1422
+	 *
1423
+	 * @deprecated
1424
+	 * @param EEM_Base $model
1425
+	 * @param array    $query_params sub-array from @see EEM_Base::get_all()
1426
+	 * @return array
1427
+	 */
1428
+	public function prepareRestQueryParamsKeyForModels($model, $query_params)
1429
+	{
1430
+		$model_ready_query_params = array();
1431
+		foreach ($query_params as $key => $value) {
1432
+			if (is_array($value)) {
1433
+				$model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value);
1434
+			} else {
1435
+				$model_ready_query_params[ $key ] = $value;
1436
+			}
1437
+		}
1438
+		return $model_ready_query_params;
1439
+	}
1440
+
1441
+
1442
+	/**
1443
+	 * @deprecated instead use ModelDataTranslator::prepareFieldValuesFromJson()
1444
+	 * @param $model
1445
+	 * @param $query_params
1446
+	 * @return array
1447
+	 */
1448
+	public function prepareRestQueryParamsValuesForModels($model, $query_params)
1449
+	{
1450
+		$model_ready_query_params = array();
1451
+		foreach ($query_params as $key => $value) {
1452
+			if (is_array($value)) {
1453
+				$model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value);
1454
+			} else {
1455
+				$model_ready_query_params[ $key ] = $value;
1456
+			}
1457
+		}
1458
+		return $model_ready_query_params;
1459
+	}
1460
+
1461
+
1462
+	/**
1463
+	 * Explodes the string on commas, and only returns items with $prefix followed by a period.
1464
+	 * If no prefix is specified, returns items with no period.
1465
+	 *
1466
+	 * @param string|array $string_to_explode eg "jibba,jabba, blah, blah, blah" or array('jibba', 'jabba' )
1467
+	 * @param string       $prefix            "Event" or "foobar"
1468
+	 * @return array $string_to_exploded exploded on COMMAS, and if a prefix was specified
1469
+	 *                                        we only return strings starting with that and a period; if no prefix was
1470
+	 *                                        specified we return all items containing NO periods
1471
+	 */
1472
+	public function explodeAndGetItemsPrefixedWith($string_to_explode, $prefix)
1473
+	{
1474
+		if (is_string($string_to_explode)) {
1475
+			$exploded_contents = explode(',', $string_to_explode);
1476
+		} elseif (is_array($string_to_explode)) {
1477
+			$exploded_contents = $string_to_explode;
1478
+		} else {
1479
+			$exploded_contents = array();
1480
+		}
1481
+		// if the string was empty, we want an empty array
1482
+		$exploded_contents = array_filter($exploded_contents);
1483
+		$contents_with_prefix = array();
1484
+		foreach ($exploded_contents as $item) {
1485
+			$item = trim($item);
1486
+			// if no prefix was provided, so we look for items with no "." in them
1487
+			if (! $prefix) {
1488
+				// does this item have a period?
1489
+				if (strpos($item, '.') === false) {
1490
+					// if not, then its what we're looking for
1491
+					$contents_with_prefix[] = $item;
1492
+				}
1493
+			} elseif (strpos($item, $prefix . '.') === 0) {
1494
+				// this item has the prefix and a period, grab it
1495
+				$contents_with_prefix[] = substr(
1496
+					$item,
1497
+					strpos($item, $prefix . '.') + strlen($prefix . '.')
1498
+				);
1499
+			} elseif ($item === $prefix) {
1500
+				// this item is JUST the prefix
1501
+				// so let's grab everything after, which is a blank string
1502
+				$contents_with_prefix[] = '';
1503
+			}
1504
+		}
1505
+		return $contents_with_prefix;
1506
+	}
1507
+
1508
+
1509
+	/**
1510
+	 * @param string $include_string @see Read:handle_request_get_all
1511
+	 * @param string $model_name
1512
+	 * @return array of fields for this model. If $model_name is provided, then
1513
+	 *                               the fields for that model, with the model's name removed from each.
1514
+	 *                               If $include_string was blank or '*' returns an empty array
1515
+	 * @throws EE_Error
1516
+	 * @deprecated since 4.8.36.rc.001 You should instead use Read::explode_and_get_items_prefixed_with.
1517
+	 *             Deprecated because its return values were really quite confusing- sometimes it returned
1518
+	 *             an empty array (when the include string was blank or '*') or sometimes it returned
1519
+	 *             array('*') (when you provided a model and a model of that kind was found).
1520
+	 *             Parses the $include_string so we fetch all the field names relating to THIS model
1521
+	 *             (ie have NO period in them), or for the provided model (ie start with the model
1522
+	 *             name and then a period).
1523
+	 */
1524
+	public function extractIncludesForThisModel($include_string, $model_name = null)
1525
+	{
1526
+		if (is_array($include_string)) {
1527
+			$include_string = implode(',', $include_string);
1528
+		}
1529
+		if ($include_string === '*' || $include_string === '') {
1530
+			return array();
1531
+		}
1532
+		$includes = explode(',', $include_string);
1533
+		$extracted_fields_to_include = array();
1534
+		if ($model_name) {
1535
+			foreach ($includes as $field_to_include) {
1536
+				$field_to_include = trim($field_to_include);
1537
+				if (strpos($field_to_include, $model_name . '.') === 0) {
1538
+					// found the model name at the exact start
1539
+					$field_sans_model_name = str_replace($model_name . '.', '', $field_to_include);
1540
+					$extracted_fields_to_include[] = $field_sans_model_name;
1541
+				} elseif ($field_to_include === $model_name) {
1542
+					$extracted_fields_to_include[] = '*';
1543
+				}
1544
+			}
1545
+		} else {
1546
+			// look for ones with no period
1547
+			foreach ($includes as $field_to_include) {
1548
+				$field_to_include = trim($field_to_include);
1549
+				if (strpos($field_to_include, '.') === false
1550
+					&& ! $this->getModelVersionInfo()->isModelNameInThisVersion($field_to_include)
1551
+				) {
1552
+					$extracted_fields_to_include[] = $field_to_include;
1553
+				}
1554
+			}
1555
+		}
1556
+		return $extracted_fields_to_include;
1557
+	}
1558
+
1559
+
1560
+	/**
1561
+	 * Gets the single item using the model according to the request in the context given, otherwise
1562
+	 * returns that it's inaccessible to the current user
1563
+	 *
1564
+	 * @param EEM_Base        $model
1565
+	 * @param WP_REST_Request $request
1566
+	 * @param null            $context
1567
+	 * @return array
1568
+	 * @throws EE_Error
1569
+	 * @throws InvalidArgumentException
1570
+	 * @throws InvalidDataTypeException
1571
+	 * @throws InvalidInterfaceException
1572
+	 * @throws ModelConfigurationException
1573
+	 * @throws ReflectionException
1574
+	 * @throws RestException
1575
+	 * @throws RestPasswordIncorrectException
1576
+	 * @throws RestPasswordRequiredException
1577
+	 * @throws UnexpectedEntityException
1578
+	 * @throws DomainException
1579
+	 */
1580
+	public function getOneOrReportPermissionError(EEM_Base $model, WP_REST_Request $request, $context = null)
1581
+	{
1582
+		$query_params = array(array($model->primary_key_name() => $request->get_param('id')), 'limit' => 1);
1583
+		if ($model instanceof EEM_Soft_Delete_Base) {
1584
+			$query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included($query_params);
1585
+		}
1586
+		$restricted_query_params = $query_params;
1587
+		$restricted_query_params['caps'] = $context;
1588
+		$this->setDebugInfo('model query params', $restricted_query_params);
1589
+		$model_rows = $model->get_all_wpdb_results($restricted_query_params);
1590
+		if (! empty($model_rows)) {
1591
+			return $this->createEntityFromWpdbResult(
1592
+				$model,
1593
+				reset($model_rows),
1594
+				$request
1595
+			);
1596
+		}
1597
+		// ok let's test to see if we WOULD have found it, had we not had restrictions from missing capabilities
1598
+		$lowercase_model_name = strtolower($model->get_this_model_name());
1599
+		if ($model->exists($query_params)) {
1600
+			// you got shafted- it existed but we didn't want to tell you!
1601
+			throw new RestException(
1602
+				'rest_user_cannot_' . $context,
1603
+				sprintf(
1604
+					__('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'),
1605
+					$context,
1606
+					$lowercase_model_name,
1607
+					Capabilities::getMissingPermissionsString(
1608
+						$model,
1609
+						$context
1610
+					)
1611
+				),
1612
+				array('status' => 403)
1613
+			);
1614
+		}
1615
+		// it's not you. It just doesn't exist
1616
+		throw new RestException(
1617
+			sprintf('rest_%s_invalid_id', $lowercase_model_name),
1618
+			sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
1619
+			array('status' => 404)
1620
+		);
1621
+	}
1622
+
1623
+	/**
1624
+	 * Checks that if this content requires a password to be read, that it's been provided and is correct.
1625
+	 * @since 4.9.74.p
1626
+	 * @param EEM_Base $model
1627
+	 * @param $model_row
1628
+	 * @param array $query_params Adds 'default_where_conditions' => 'minimum' to ensure we don't confuse trashed with
1629
+	 *                      password protected.
1630
+	 * @param WP_REST_Request $request
1631
+	 * @throws EE_Error
1632
+	 * @throws InvalidArgumentException
1633
+	 * @throws InvalidDataTypeException
1634
+	 * @throws InvalidInterfaceException
1635
+	 * @throws RestPasswordRequiredException
1636
+	 * @throws RestPasswordIncorrectException
1637
+	 * @throws ModelConfigurationException
1638
+	 * @throws ReflectionException
1639
+	 */
1640
+	protected function checkPassword(EEM_Base $model, $model_row, $query_params, WP_REST_Request $request)
1641
+	{
1642
+		$query_params['default_where_conditions'] = 'minimum';
1643
+		// stuff is only "protected" for front-end requests. Elsewhere, you either get full permission to access the object
1644
+		// or you don't.
1645
+		$request_caps = $request->get_param('caps');
1646
+		if (isset($request_caps) && $request_caps !== EEM_Base::caps_read) {
1647
+			return;
1648
+		}
1649
+		// if this entity requires a password, they better give it and it better be right!
1650
+		if ($model->hasPassword()
1651
+			&& $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') {
1652
+			if (empty($request['password'])) {
1653
+				throw new RestPasswordRequiredException();
1654
+			}
1655
+			if (!hash_equals(
1656
+				$model_row[ $model->getPasswordField()->get_qualified_column() ],
1657
+				$request['password']
1658
+			)) {
1659
+				throw new RestPasswordIncorrectException();
1660
+			}
1661
+		} // wait! maybe this content is password protected
1662
+		elseif ($model->restrictedByRelatedModelPassword()
1663
+			&& $request->get_param('caps') === EEM_Base::caps_read) {
1664
+			$password_supplied = $request->get_param('password');
1665
+			if (empty($password_supplied)) {
1666
+				$query_params['exclude_protected'] = true;
1667
+				if (!$model->exists($query_params)) {
1668
+					throw new RestPasswordRequiredException();
1669
+				}
1670
+			} else {
1671
+				$query_params[0][ $model->modelChainAndPassword() ] = $password_supplied;
1672
+				if (!$model->exists($query_params)) {
1673
+					throw new RestPasswordIncorrectException();
1674
+				}
1675
+			}
1676
+		}
1677
+	}
1678 1678
 }
Please login to merge, or discard this patch.
Spacing   +67 added lines, -67 removed lines patch added patch discarded remove patch
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
         $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
86 86
         try {
87 87
             $controller->setRequestedVersion($version);
88
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
88
+            if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
89 89
                 return $controller->sendResponse(
90 90
                     new WP_Error(
91 91
                         'endpoint_parsing_error',
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
         $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
127 127
         try {
128 128
             $controller->setRequestedVersion($version);
129
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
129
+            if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
130 130
                 return array();
131 131
             }
132 132
             // get the model for this version
@@ -185,11 +185,11 @@  discard block
 block discarded – undo
185 185
      */
186 186
     protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema)
187 187
     {
188
-        if (isset($schema['properties'][ $field_name ]['default'])) {
189
-            if (is_array($schema['properties'][ $field_name ]['default'])) {
190
-                foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) {
188
+        if (isset($schema['properties'][$field_name]['default'])) {
189
+            if (is_array($schema['properties'][$field_name]['default'])) {
190
+                foreach ($schema['properties'][$field_name]['default'] as $default_key => $default_value) {
191 191
                     if ($default_key === 'raw') {
192
-                        $schema['properties'][ $field_name ]['default'][ $default_key ] =
192
+                        $schema['properties'][$field_name]['default'][$default_key] =
193 193
                             ModelDataTranslator::prepareFieldValueForJson(
194 194
                                 $field,
195 195
                                 $default_value,
@@ -198,9 +198,9 @@  discard block
 block discarded – undo
198 198
                     }
199 199
                 }
200 200
             } else {
201
-                $schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson(
201
+                $schema['properties'][$field_name]['default'] = ModelDataTranslator::prepareFieldValueForJson(
202 202
                     $field,
203
-                    $schema['properties'][ $field_name ]['default'],
203
+                    $schema['properties'][$field_name]['default'],
204 204
                     $this->getModelVersionInfo()->requestedVersion()
205 205
                 );
206 206
             }
@@ -222,9 +222,9 @@  discard block
 block discarded – undo
222 222
     protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema)
223 223
     {
224 224
         if ($field instanceof EE_Datetime_Field) {
225
-            $schema['properties'][ $field_name . '_gmt' ] = $field->getSchema();
225
+            $schema['properties'][$field_name.'_gmt'] = $field->getSchema();
226 226
             // modify the description
227
-            $schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf(
227
+            $schema['properties'][$field_name.'_gmt']['description'] = sprintf(
228 228
                 esc_html__('%s - the value for this field is in GMT.', 'event_espresso'),
229 229
                 wp_specialchars_decode($field->get_nicename(), ENT_QUOTES)
230 230
             );
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
         $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read');
267 267
         try {
268 268
             $controller->setRequestedVersion($version);
269
-            if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
269
+            if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
270 270
                 return $controller->sendResponse(
271 271
                     new WP_Error(
272 272
                         'endpoint_parsing_error',
@@ -350,7 +350,7 @@  discard block
 block discarded – undo
350 350
     public function getEntitiesFromModel($model, $request)
351 351
     {
352 352
         $query_params = $this->createModelQueryParams($model, $request->get_params());
353
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) {
353
+        if ( ! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) {
354 354
             $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
355 355
             throw new RestException(
356 356
                 sprintf('rest_%s_cannot_list', $model_name_plural),
@@ -362,14 +362,14 @@  discard block
 block discarded – undo
362 362
                 array('status' => 403)
363 363
             );
364 364
         }
365
-        if (! $request->get_header('no_rest_headers')) {
365
+        if ( ! $request->get_header('no_rest_headers')) {
366 366
             $this->setHeadersFromQueryParams($model, $query_params);
367 367
         }
368 368
         /** @type array $results */
369 369
         $results = $model->get_all_wpdb_results($query_params);
370 370
         $nice_results = array();
371 371
         foreach ($results as $result) {
372
-            $nice_results[] =  $this->createEntityFromWpdbResult(
372
+            $nice_results[] = $this->createEntityFromWpdbResult(
373 373
                 $model,
374 374
                 $result,
375 375
                 $request
@@ -407,7 +407,7 @@  discard block
 block discarded – undo
407 407
         $context = $this->validateContext($request->get_param('caps'));
408 408
         $model = $relation->get_this_model();
409 409
         $related_model = $relation->get_other_model();
410
-        if (! isset($primary_model_query_params[0])) {
410
+        if ( ! isset($primary_model_query_params[0])) {
411 411
             $primary_model_query_params[0] = array();
412 412
         }
413 413
         // check if they can access the 1st model object
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
         if (is_array($primary_model_rows)) {
431 431
             $primary_model_row = reset($primary_model_rows);
432 432
         }
433
-        if (! (
433
+        if ( ! (
434 434
             $primary_model_row
435 435
             && Capabilities::currentUserHasPartialAccessTo($related_model, $context)
436 436
         )
@@ -470,13 +470,13 @@  discard block
 block discarded – undo
470 470
         );
471 471
         $query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params());
472 472
         foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) {
473
-            $query_params[0][ $relation->get_this_model()->get_this_model_name()
473
+            $query_params[0][$relation->get_this_model()->get_this_model_name()
474 474
                               . '.'
475
-                              . $where_condition_key ] = $where_condition_value;
475
+                              . $where_condition_key] = $where_condition_value;
476 476
         }
477 477
         $query_params['default_where_conditions'] = 'none';
478 478
         $query_params['caps'] = $context;
479
-        if (! $request->get_header('no_rest_headers')) {
479
+        if ( ! $request->get_header('no_rest_headers')) {
480 480
             $this->setHeadersFromQueryParams($relation->get_other_model(), $query_params);
481 481
         }
482 482
         /** @type array $results */
@@ -537,7 +537,7 @@  discard block
 block discarded – undo
537 537
      */
538 538
     public function getEntitiesFromRelation($id, $relation, $request)
539 539
     {
540
-        if (! $relation->get_this_model()->has_primary_key_field()) {
540
+        if ( ! $relation->get_this_model()->has_primary_key_field()) {
541 541
             throw new EE_Error(
542 542
                 sprintf(
543 543
                     __(
@@ -583,7 +583,7 @@  discard block
 block discarded – undo
583 583
             Capabilities::getMissingPermissionsString($model, $query_params['caps'])
584 584
         );
585 585
         // normally the limit to a 2-part array, where the 2nd item is the limit
586
-        if (! isset($query_params['limit'])) {
586
+        if ( ! isset($query_params['limit'])) {
587 587
             $query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit();
588 588
         }
589 589
         if (is_array($query_params['limit'])) {
@@ -627,7 +627,7 @@  discard block
 block discarded – undo
627 627
      */
628 628
     public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null)
629 629
     {
630
-        if (! $rest_request instanceof WP_REST_Request) {
630
+        if ( ! $rest_request instanceof WP_REST_Request) {
631 631
             // ok so this was called in the old style, where the 3rd arg was
632 632
             // $include, and the 4th arg was $context
633 633
             // now setup the request just to avoid fatal errors, although we won't be able
@@ -702,7 +702,7 @@  discard block
 block discarded – undo
702 702
             $rest_request,
703 703
             $this
704 704
         );
705
-        if (! $current_user_full_access_to_entity) {
705
+        if ( ! $current_user_full_access_to_entity) {
706 706
             $result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields(
707 707
                 $entity_array,
708 708
                 $model,
@@ -737,7 +737,7 @@  discard block
 block discarded – undo
737 737
      */
738 738
     protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected)
739 739
     {
740
-        if (! $protected || ! $model->hasPassword()) {
740
+        if ( ! $protected || ! $model->hasPassword()) {
741 741
             return $results_so_far;
742 742
         }
743 743
         $password_field = $model->getPasswordField();
@@ -751,7 +751,7 @@  discard block
 block discarded – undo
751 751
             $fields_included
752 752
         );
753 753
         foreach ($fields_included as $field_name) {
754
-            $results_so_far['_protected'][] = $field_name ;
754
+            $results_so_far['_protected'][] = $field_name;
755 755
         }
756 756
         return $results_so_far;
757 757
     }
@@ -789,8 +789,8 @@  discard block
 block discarded – undo
789 789
         if ($do_chevy_shuffle) {
790 790
             global $post;
791 791
             $old_post = $post;
792
-            $post = get_post($result[ $model->primary_key_name() ]);
793
-            if (! $post instanceof WP_Post) {
792
+            $post = get_post($result[$model->primary_key_name()]);
793
+            if ( ! $post instanceof WP_Post) {
794 794
                 // well that's weird, because $result is what we JUST fetched from the database
795 795
                 throw new RestException(
796 796
                     'error_fetching_post_from_database_results',
@@ -800,7 +800,7 @@  discard block
 block discarded – undo
800 800
                     )
801 801
                 );
802 802
             }
803
-            $model_object_classname = 'EE_' . $model->get_this_model_name();
803
+            $model_object_classname = 'EE_'.$model->get_this_model_name();
804 804
             $post->{$model_object_classname} = \EE_Registry::instance()->load_class(
805 805
                 $model_object_classname,
806 806
                 $result,
@@ -811,13 +811,13 @@  discard block
 block discarded – undo
811 811
         foreach ($result as $field_name => $field_value) {
812 812
             $field_obj = $model->field_settings_for($field_name);
813 813
             if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) {
814
-                unset($result[ $field_name ]);
814
+                unset($result[$field_name]);
815 815
             } elseif ($this->isSubclassOfOne(
816 816
                 $field_obj,
817 817
                 $this->getModelVersionInfo()->fieldsThatHaveRenderedFormat()
818 818
             )
819 819
             ) {
820
-                $result[ $field_name ] = array(
820
+                $result[$field_name] = array(
821 821
                     'raw'      => $this->prepareFieldObjValueForJson($field_obj, $field_value),
822 822
                     'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
823 823
                 );
@@ -826,7 +826,7 @@  discard block
 block discarded – undo
826 826
                 $this->getModelVersionInfo()->fieldsThatHavePrettyFormat()
827 827
             )
828 828
             ) {
829
-                $result[ $field_name ] = array(
829
+                $result[$field_name] = array(
830 830
                     'raw'    => $this->prepareFieldObjValueForJson($field_obj, $field_value),
831 831
                     'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'),
832 832
                 );
@@ -857,10 +857,10 @@  discard block
 block discarded – undo
857 857
                         $this->getModelVersionInfo()->requestedVersion()
858 858
                     );
859 859
                 }
860
-                $result[ $field_name . '_gmt' ] = $gmt_date;
861
-                $result[ $field_name ] = $local_date;
860
+                $result[$field_name.'_gmt'] = $gmt_date;
861
+                $result[$field_name] = $local_date;
862 862
             } else {
863
-                $result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value);
863
+                $result[$field_name] = $this->prepareFieldObjValueForJson($field_obj, $field_value);
864 864
             }
865 865
         }
866 866
         if ($do_chevy_shuffle) {
@@ -914,7 +914,7 @@  discard block
 block discarded – undo
914 914
     protected function addExtraFields(EEM_Base $model, $db_row, $entity_array)
915 915
     {
916 916
         if ($model instanceof EEM_CPT_Base) {
917
-            $entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]);
917
+            $entity_array['link'] = get_permalink($db_row[$model->get_primary_key_field()->get_qualified_column()]);
918 918
         }
919 919
         return $entity_array;
920 920
     }
@@ -940,7 +940,7 @@  discard block
 block discarded – undo
940 940
                     'href' => $this->getVersionedLinkTo(
941 941
                         EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
942 942
                         . '/'
943
-                        . $entity_array[ $model->primary_key_name() ]
943
+                        . $entity_array[$model->primary_key_name()]
944 944
                     ),
945 945
                 ),
946 946
             );
@@ -956,12 +956,12 @@  discard block
 block discarded – undo
956 956
         if ($model->has_primary_key_field()) {
957 957
             foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) {
958 958
                 $related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj);
959
-                $links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array(
959
+                $links[EED_Core_Rest_Api::ee_api_link_namespace.$related_model_part] = array(
960 960
                     array(
961 961
                         'href'   => $this->getVersionedLinkTo(
962 962
                             EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
963 963
                             . '/'
964
-                            . $entity_array[ $model->primary_key_name() ]
964
+                            . $entity_array[$model->primary_key_name()]
965 965
                             . '/'
966 966
                             . $related_model_part
967 967
                         ),
@@ -1000,7 +1000,7 @@  discard block
 block discarded – undo
1000 1000
         $included_items_protected = false
1001 1001
     ) {
1002 1002
         // if $db_row not included, hope the entity array has what we need
1003
-        if (! $db_row) {
1003
+        if ( ! $db_row) {
1004 1004
             $db_row = $entity_array;
1005 1005
         }
1006 1006
         $relation_settings = $this->getModelVersionInfo()->relationSettings($model);
@@ -1033,7 +1033,7 @@  discard block
 block discarded – undo
1033 1033
                         $model->deduce_fields_n_values_from_cols_n_values($db_row)
1034 1034
                     )
1035 1035
                 );
1036
-                if (! $included_items_protected) {
1036
+                if ( ! $included_items_protected) {
1037 1037
                     try {
1038 1038
                         $related_results = $this->getEntitiesFromRelationUsingModelQueryParams(
1039 1039
                             $primary_model_query_params,
@@ -1051,7 +1051,7 @@  discard block
 block discarded – undo
1051 1051
                 if ($related_results instanceof WP_Error || $related_results === null) {
1052 1052
                     $related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array();
1053 1053
                 }
1054
-                $entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results;
1054
+                $entity_array[Read::getRelatedEntityName($relation_name, $relation_obj)] = $related_results;
1055 1055
             }
1056 1056
         }
1057 1057
         return $entity_array;
@@ -1076,7 +1076,7 @@  discard block
 block discarded – undo
1076 1076
         $includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), '');
1077 1077
         $includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model);
1078 1078
         // if they passed in * or didn't specify any includes, return everything
1079
-        if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) {
1079
+        if ( ! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) {
1080 1080
             if ($model->has_primary_key_field()) {
1081 1081
                 // always include the primary key. ya just gotta know that at least
1082 1082
                 $includes_for_this_model[] = $model->primary_key_name();
@@ -1130,12 +1130,12 @@  discard block
 block discarded – undo
1130 1130
                 // it's password protected, so they shouldn't be able to read this. Remove the value
1131 1131
                 $schema = $this->fields_calculator->getJsonSchemaForModel($model);
1132 1132
                 if ($row_is_protected
1133
-                    && isset($schema['properties'][ $field_to_calculate ]['protected'])
1134
-                    && $schema['properties'][ $field_to_calculate ]['protected']) {
1133
+                    && isset($schema['properties'][$field_to_calculate]['protected'])
1134
+                    && $schema['properties'][$field_to_calculate]['protected']) {
1135 1135
                     $calculated_value = null;
1136 1136
                     $protected_fields[] = $field_to_calculate;
1137
-                    if ($schema['properties'][ $field_to_calculate ]['type']) {
1138
-                        switch ($schema['properties'][ $field_to_calculate ]['type']) {
1137
+                    if ($schema['properties'][$field_to_calculate]['type']) {
1138
+                        switch ($schema['properties'][$field_to_calculate]['type']) {
1139 1139
                             case 'boolean':
1140 1140
                                 $calculated_value = false;
1141 1141
                                 break;
@@ -1255,7 +1255,7 @@  discard block
 block discarded – undo
1255 1255
      */
1256 1256
     public function validateContext($context)
1257 1257
     {
1258
-        if (! $context) {
1258
+        if ( ! $context) {
1259 1259
             $context = EEM_Base::caps_read;
1260 1260
         }
1261 1261
         $valid_contexts = EEM_Base::valid_cap_contexts();
@@ -1279,7 +1279,7 @@  discard block
 block discarded – undo
1279 1279
             EEM_Base::default_where_conditions_minimum_all,
1280 1280
             EEM_Base::default_where_conditions_minimum_others,
1281 1281
         );
1282
-        if (! $default_query_params) {
1282
+        if ( ! $default_query_params) {
1283 1283
             $default_query_params = EEM_Base::default_where_conditions_all;
1284 1284
         }
1285 1285
         if (in_array(
@@ -1366,14 +1366,14 @@  discard block
 block discarded – undo
1366 1366
         }
1367 1367
         if (isset($query_params['limit'])) {
1368 1368
             // limit should be either a string like '23' or '23,43', or an array with two items in it
1369
-            if (! is_array($query_params['limit'])) {
1369
+            if ( ! is_array($query_params['limit'])) {
1370 1370
                 $limit_array = explode(',', (string) $query_params['limit']);
1371 1371
             } else {
1372 1372
                 $limit_array = $query_params['limit'];
1373 1373
             }
1374 1374
             $sanitized_limit = array();
1375 1375
             foreach ($limit_array as $key => $limit_part) {
1376
-                if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) {
1376
+                if ($this->debug_mode && ( ! is_numeric($limit_part) || count($sanitized_limit) > 2)) {
1377 1377
                     throw new EE_Error(
1378 1378
                         sprintf(
1379 1379
                             __(
@@ -1430,9 +1430,9 @@  discard block
 block discarded – undo
1430 1430
         $model_ready_query_params = array();
1431 1431
         foreach ($query_params as $key => $value) {
1432 1432
             if (is_array($value)) {
1433
-                $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value);
1433
+                $model_ready_query_params[$key] = $this->prepareRestQueryParamsKeyForModels($model, $value);
1434 1434
             } else {
1435
-                $model_ready_query_params[ $key ] = $value;
1435
+                $model_ready_query_params[$key] = $value;
1436 1436
             }
1437 1437
         }
1438 1438
         return $model_ready_query_params;
@@ -1450,9 +1450,9 @@  discard block
 block discarded – undo
1450 1450
         $model_ready_query_params = array();
1451 1451
         foreach ($query_params as $key => $value) {
1452 1452
             if (is_array($value)) {
1453
-                $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value);
1453
+                $model_ready_query_params[$key] = $this->prepareRestQueryParamsValuesForModels($model, $value);
1454 1454
             } else {
1455
-                $model_ready_query_params[ $key ] = $value;
1455
+                $model_ready_query_params[$key] = $value;
1456 1456
             }
1457 1457
         }
1458 1458
         return $model_ready_query_params;
@@ -1484,17 +1484,17 @@  discard block
 block discarded – undo
1484 1484
         foreach ($exploded_contents as $item) {
1485 1485
             $item = trim($item);
1486 1486
             // if no prefix was provided, so we look for items with no "." in them
1487
-            if (! $prefix) {
1487
+            if ( ! $prefix) {
1488 1488
                 // does this item have a period?
1489 1489
                 if (strpos($item, '.') === false) {
1490 1490
                     // if not, then its what we're looking for
1491 1491
                     $contents_with_prefix[] = $item;
1492 1492
                 }
1493
-            } elseif (strpos($item, $prefix . '.') === 0) {
1493
+            } elseif (strpos($item, $prefix.'.') === 0) {
1494 1494
                 // this item has the prefix and a period, grab it
1495 1495
                 $contents_with_prefix[] = substr(
1496 1496
                     $item,
1497
-                    strpos($item, $prefix . '.') + strlen($prefix . '.')
1497
+                    strpos($item, $prefix.'.') + strlen($prefix.'.')
1498 1498
                 );
1499 1499
             } elseif ($item === $prefix) {
1500 1500
                 // this item is JUST the prefix
@@ -1534,9 +1534,9 @@  discard block
 block discarded – undo
1534 1534
         if ($model_name) {
1535 1535
             foreach ($includes as $field_to_include) {
1536 1536
                 $field_to_include = trim($field_to_include);
1537
-                if (strpos($field_to_include, $model_name . '.') === 0) {
1537
+                if (strpos($field_to_include, $model_name.'.') === 0) {
1538 1538
                     // found the model name at the exact start
1539
-                    $field_sans_model_name = str_replace($model_name . '.', '', $field_to_include);
1539
+                    $field_sans_model_name = str_replace($model_name.'.', '', $field_to_include);
1540 1540
                     $extracted_fields_to_include[] = $field_sans_model_name;
1541 1541
                 } elseif ($field_to_include === $model_name) {
1542 1542
                     $extracted_fields_to_include[] = '*';
@@ -1587,7 +1587,7 @@  discard block
 block discarded – undo
1587 1587
         $restricted_query_params['caps'] = $context;
1588 1588
         $this->setDebugInfo('model query params', $restricted_query_params);
1589 1589
         $model_rows = $model->get_all_wpdb_results($restricted_query_params);
1590
-        if (! empty($model_rows)) {
1590
+        if ( ! empty($model_rows)) {
1591 1591
             return $this->createEntityFromWpdbResult(
1592 1592
                 $model,
1593 1593
                 reset($model_rows),
@@ -1599,7 +1599,7 @@  discard block
 block discarded – undo
1599 1599
         if ($model->exists($query_params)) {
1600 1600
             // you got shafted- it existed but we didn't want to tell you!
1601 1601
             throw new RestException(
1602
-                'rest_user_cannot_' . $context,
1602
+                'rest_user_cannot_'.$context,
1603 1603
                 sprintf(
1604 1604
                     __('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'),
1605 1605
                     $context,
@@ -1648,12 +1648,12 @@  discard block
 block discarded – undo
1648 1648
         }
1649 1649
         // if this entity requires a password, they better give it and it better be right!
1650 1650
         if ($model->hasPassword()
1651
-            && $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') {
1651
+            && $model_row[$model->getPasswordField()->get_qualified_column()] !== '') {
1652 1652
             if (empty($request['password'])) {
1653 1653
                 throw new RestPasswordRequiredException();
1654 1654
             }
1655
-            if (!hash_equals(
1656
-                $model_row[ $model->getPasswordField()->get_qualified_column() ],
1655
+            if ( ! hash_equals(
1656
+                $model_row[$model->getPasswordField()->get_qualified_column()],
1657 1657
                 $request['password']
1658 1658
             )) {
1659 1659
                 throw new RestPasswordIncorrectException();
@@ -1664,12 +1664,12 @@  discard block
 block discarded – undo
1664 1664
             $password_supplied = $request->get_param('password');
1665 1665
             if (empty($password_supplied)) {
1666 1666
                 $query_params['exclude_protected'] = true;
1667
-                if (!$model->exists($query_params)) {
1667
+                if ( ! $model->exists($query_params)) {
1668 1668
                     throw new RestPasswordRequiredException();
1669 1669
                 }
1670 1670
             } else {
1671
-                $query_params[0][ $model->modelChainAndPassword() ] = $password_supplied;
1672
-                if (!$model->exists($query_params)) {
1671
+                $query_params[0][$model->modelChainAndPassword()] = $password_supplied;
1672
+                if ( ! $model->exists($query_params)) {
1673 1673
                     throw new RestPasswordIncorrectException();
1674 1674
                 }
1675 1675
             }
Please login to merge, or discard this patch.
core/domain/services/assets/EspressoEditorAssetManager.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -19,51 +19,51 @@
 block discarded – undo
19 19
  */
20 20
 class EspressoEditorAssetManager extends AssetManager
21 21
 {
22
-    const JS_HANDLE_EDITOR = 'eventespresso-editor';
23
-    const CSS_HANDLE_EDITOR = 'eventespresso-editor';
24
-    const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
25
-    const CSS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
22
+	const JS_HANDLE_EDITOR = 'eventespresso-editor';
23
+	const CSS_HANDLE_EDITOR = 'eventespresso-editor';
24
+	const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
25
+	const CSS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs';
26 26
 
27 27
 
28
-    /**
29
-     * @throws InvalidDataTypeException
30
-     * @throws InvalidEntityException
31
-     * @throws DuplicateCollectionIdentifierException
32
-     * @throws DomainException
33
-     */
34
-    public function addAssets()
35
-    {
36
-        $this->registerJavascript();
37
-        $this->registerStyleSheets();
38
-    }
28
+	/**
29
+	 * @throws InvalidDataTypeException
30
+	 * @throws InvalidEntityException
31
+	 * @throws DuplicateCollectionIdentifierException
32
+	 * @throws DomainException
33
+	 */
34
+	public function addAssets()
35
+	{
36
+		$this->registerJavascript();
37
+		$this->registerStyleSheets();
38
+	}
39 39
 
40 40
 
41
-    /**
42
-     * Register javascript assets
43
-     *
44
-     * @throws InvalidDataTypeException
45
-     * @throws InvalidEntityException
46
-     * @throws DuplicateCollectionIdentifierException
47
-     * @throws DomainException
48
-     */
49
-    private function registerJavascript()
50
-    {
51
-        $this->addJs(self::JS_HANDLE_EDITOR)->setRequiresTranslation();
52
-        $this->addJs(self::JS_HANDLE_EDITOR_HOCS)->setRequiresTranslation();
53
-    }
41
+	/**
42
+	 * Register javascript assets
43
+	 *
44
+	 * @throws InvalidDataTypeException
45
+	 * @throws InvalidEntityException
46
+	 * @throws DuplicateCollectionIdentifierException
47
+	 * @throws DomainException
48
+	 */
49
+	private function registerJavascript()
50
+	{
51
+		$this->addJs(self::JS_HANDLE_EDITOR)->setRequiresTranslation();
52
+		$this->addJs(self::JS_HANDLE_EDITOR_HOCS)->setRequiresTranslation();
53
+	}
54 54
 
55 55
 
56
-    /**
57
-     * Register CSS assets.
58
-     *
59
-     * @throws DuplicateCollectionIdentifierException
60
-     * @throws InvalidDataTypeException
61
-     * @throws InvalidEntityException
62
-     * @throws DomainException
63
-     */
64
-    private function registerStyleSheets()
65
-    {
66
-        $this->addCss(self::CSS_HANDLE_EDITOR);
67
-        $this->addCss(self::CSS_HANDLE_EDITOR_HOCS);
68
-    }
56
+	/**
57
+	 * Register CSS assets.
58
+	 *
59
+	 * @throws DuplicateCollectionIdentifierException
60
+	 * @throws InvalidDataTypeException
61
+	 * @throws InvalidEntityException
62
+	 * @throws DomainException
63
+	 */
64
+	private function registerStyleSheets()
65
+	{
66
+		$this->addCss(self::CSS_HANDLE_EDITOR);
67
+		$this->addCss(self::CSS_HANDLE_EDITOR_HOCS);
68
+	}
69 69
 }
Please login to merge, or discard this patch.
core/domain/services/assets/CoreAssetManager.php 1 patch
Indentation   +442 added lines, -442 removed lines patch added patch discarded remove patch
@@ -32,469 +32,469 @@
 block discarded – undo
32 32
 class CoreAssetManager extends AssetManager
33 33
 {
34 34
 
35
-    // WordPress core / Third party JS asset handles
36
-    const JS_HANDLE_JQUERY = 'jquery';
35
+	// WordPress core / Third party JS asset handles
36
+	const JS_HANDLE_JQUERY = 'jquery';
37 37
 
38
-    const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
38
+	const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
39 39
 
40
-    const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
40
+	const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
41 41
 
42
-    const JS_HANDLE_UNDERSCORE = 'underscore';
42
+	const JS_HANDLE_UNDERSCORE = 'underscore';
43 43
 
44
-    const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
44
+	const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
45 45
 
46
-    /**
47
-     * @since 4.9.71.p
48
-     */
49
-    const JS_HANDLE_REACT = 'react';
46
+	/**
47
+	 * @since 4.9.71.p
48
+	 */
49
+	const JS_HANDLE_REACT = 'react';
50 50
 
51
-    /**
52
-     * @since 4.9.71.p
53
-     */
54
-    const JS_HANDLE_REACT_DOM = 'react-dom';
51
+	/**
52
+	 * @since 4.9.71.p
53
+	 */
54
+	const JS_HANDLE_REACT_DOM = 'react-dom';
55 55
 
56
-    /**
57
-     * @since 4.9.71.p
58
-     */
59
-    const JS_HANDLE_LODASH = 'lodash';
56
+	/**
57
+	 * @since 4.9.71.p
58
+	 */
59
+	const JS_HANDLE_LODASH = 'lodash';
60 60
 
61
-    const JS_HANDLE_JS_CORE = 'eejs-core';
61
+	const JS_HANDLE_JS_CORE = 'eejs-core';
62 62
 
63
-    const JS_HANDLE_VENDOR = 'eventespresso-vendor';
63
+	const JS_HANDLE_VENDOR = 'eventespresso-vendor';
64 64
 
65
-    const JS_HANDLE_UTILS = 'eventespresso-utils';
65
+	const JS_HANDLE_UTILS = 'eventespresso-utils';
66 66
 
67
-    const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores';
67
+	const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores';
68 68
 
69
-    const JS_HANDLE_HELPERS = 'eventespresso-helpers';
69
+	const JS_HANDLE_HELPERS = 'eventespresso-helpers';
70 70
 
71
-    const JS_HANDLE_MODEL = 'eventespresso-model';
72
-    const JS_HANDLE_MODEL_SCHEMA = 'eventespresso-model-schema';
71
+	const JS_HANDLE_MODEL = 'eventespresso-model';
72
+	const JS_HANDLE_MODEL_SCHEMA = 'eventespresso-model-schema';
73 73
 
74
-    const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects';
74
+	const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects';
75 75
 
76
-    const JS_HANDLE_HOCS = 'eventespresso-hocs';
76
+	const JS_HANDLE_HOCS = 'eventespresso-hocs';
77 77
 
78
-    const JS_HANDLE_COMPONENTS = 'eventespresso-components';
78
+	const JS_HANDLE_COMPONENTS = 'eventespresso-components';
79 79
 
80
-    const JS_HANDLE_HOOKS = 'eventespresso-hooks';
80
+	const JS_HANDLE_HOOKS = 'eventespresso-hooks';
81 81
 
82
-    const JS_HANDLE_VALIDATORS = 'eventespresso-validators';
82
+	const JS_HANDLE_VALIDATORS = 'eventespresso-validators';
83 83
 
84
-    const JS_HANDLE_CORE = 'espresso_core';
84
+	const JS_HANDLE_CORE = 'espresso_core';
85 85
 
86
-    const JS_HANDLE_I18N = 'eei18n';
86
+	const JS_HANDLE_I18N = 'eei18n';
87 87
 
88
-    const JS_HANDLE_ACCOUNTING = 'ee-accounting';
88
+	const JS_HANDLE_ACCOUNTING = 'ee-accounting';
89 89
 
90
-    const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
90
+	const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
91 91
 
92
-    // EE CSS assets handles
93
-    const CSS_HANDLE_DEFAULT = 'espresso_default';
94
-
95
-    const CSS_HANDLE_CUSTOM = 'espresso_custom_css';
96
-
97
-    const CSS_HANDLE_COMPONENTS = 'eventespresso-components';
98
-
99
-    const CSS_HANDLE_HOCS = 'eventespresso-hocs';
100
-
101
-    const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default';
102
-
103
-    /**
104
-     * @var EE_Currency_Config $currency_config
105
-     */
106
-    protected $currency_config;
107
-
108
-    /**
109
-     * @var EE_Template_Config $template_config
110
-     */
111
-    protected $template_config;
112
-
113
-
114
-    /**
115
-     * CoreAssetRegister constructor.
116
-     *
117
-     * @param AssetCollection    $assets
118
-     * @param EE_Currency_Config $currency_config
119
-     * @param EE_Template_Config $template_config
120
-     * @param DomainInterface    $domain
121
-     * @param Registry           $registry
122
-     */
123
-    public function __construct(
124
-        AssetCollection $assets,
125
-        EE_Currency_Config $currency_config,
126
-        EE_Template_Config $template_config,
127
-        DomainInterface $domain,
128
-        Registry $registry
129
-    ) {
130
-        $this->currency_config = $currency_config;
131
-        $this->template_config = $template_config;
132
-        parent::__construct($domain, $assets, $registry);
133
-    }
134
-
135
-
136
-    /**
137
-     * @since 4.9.62.p
138
-     * @throws DomainException
139
-     * @throws DuplicateCollectionIdentifierException
140
-     * @throws InvalidArgumentException
141
-     * @throws InvalidDataTypeException
142
-     * @throws InvalidEntityException
143
-     * @throws InvalidInterfaceException
144
-     */
145
-    public function addAssets()
146
-    {
147
-        $this->addJavascriptFiles();
148
-        $this->addStylesheetFiles();
149
-    }
150
-
151
-
152
-    /**
153
-     * @since 4.9.62.p
154
-     * @throws DomainException
155
-     * @throws DuplicateCollectionIdentifierException
156
-     * @throws InvalidArgumentException
157
-     * @throws InvalidDataTypeException
158
-     * @throws InvalidEntityException
159
-     * @throws InvalidInterfaceException
160
-     */
161
-    public function addJavascriptFiles()
162
-    {
163
-        $this->loadCoreJs();
164
-        $this->loadJqueryValidate();
165
-        $this->loadAccountingJs();
166
-        add_action(
167
-            'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
168
-            array($this, 'loadQtipJs')
169
-        );
170
-        $this->registerAdminAssets();
171
-    }
172
-
173
-
174
-    /**
175
-     * @throws DuplicateCollectionIdentifierException
176
-     * @throws InvalidDataTypeException
177
-     * @throws InvalidEntityException
178
-     * @throws DomainException
179
-     * @since 4.9.62.p
180
-     */
181
-    public function addStylesheetFiles()
182
-    {
183
-        $this->loadCoreCss();
184
-    }
185
-
186
-
187
-    /**
188
-     * core default javascript
189
-     *
190
-     * @since 4.9.62.p
191
-     * @throws DomainException
192
-     * @throws DuplicateCollectionIdentifierException
193
-     * @throws InvalidArgumentException
194
-     * @throws InvalidDataTypeException
195
-     * @throws InvalidEntityException
196
-     * @throws InvalidInterfaceException
197
-     */
198
-    private function loadCoreJs()
199
-    {
200
-        // conditionally load third-party libraries that WP core MIGHT have.
201
-        $this->registerWpAssets();
202
-
203
-        $this->addJs(self::JS_HANDLE_JS_CORE)->setHasInlineData();
204
-        $this->addJs(self::JS_HANDLE_VENDOR);
205
-        $this->addJs(self::JS_HANDLE_UTILS)->setRequiresTranslation();
206
-        $this->addJs(self::JS_HANDLE_VALIDATORS)->setRequiresTranslation();
207
-        $this->addJs(self::JS_HANDLE_HELPERS)->setRequiresTranslation();
208
-        $this->addJs(self::JS_HANDLE_MODEL)->setRequiresTranslation();
209
-        $this->addJs(self::JS_HANDLE_MODEL_SCHEMA)->setRequiresTranslation();
210
-        $this->addJs(self::JS_HANDLE_HOOKS);
211
-        $this->addJs(self::JS_HANDLE_VALUE_OBJECTS)->setRequiresTranslation();
212
-        $this->addJs(self::JS_HANDLE_DATA_STORES)->setRequiresTranslation()->setInlineDataCallback(
213
-            static function () {
214
-                wp_add_inline_script(
215
-                    CoreAssetManager::JS_HANDLE_DATA_STORES,
216
-                    is_admin()
217
-                        ? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )'
218
-                        : 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )'
219
-                );
220
-            }
221
-        );
222
-        $this->addJs(self::JS_HANDLE_HOCS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation();
223
-        $this->addJs(self::JS_HANDLE_COMPONENTS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation();
224
-
225
-        $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
226
-        $this->registry->addData(
227
-            'paths',
228
-            array(
229
-                'base_rest_route' => rest_url(),
230
-                'rest_route' => rest_url('ee/v4.8.36/'),
231
-                'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
232
-                'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
233
-                'site_url' => site_url('/'),
234
-                'admin_url' => admin_url('/'),
235
-            )
236
-        );
237
-        // Event Espresso brand name
238
-        $this->registry->addData('brandName', Domain::brandName());
239
-        /** site formatting values **/
240
-        $this->registry->addData(
241
-            'site_formats',
242
-            array(
243
-                'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
244
-            )
245
-        );
246
-        /** currency data **/
247
-        $this->registry->addData(
248
-            'currency_config',
249
-            $this->getCurrencySettings()
250
-        );
251
-        /** site timezone */
252
-        $this->registry->addData(
253
-            'default_timezone',
254
-            array(
255
-                'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
256
-                'string' => get_option('timezone_string'),
257
-                'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
258
-            )
259
-        );
260
-        /** site locale (user locale if user logged in) */
261
-        $this->registry->addData(
262
-            'locale',
263
-            array(
264
-                'user' => get_user_locale(),
265
-                'site' => get_locale()
266
-            )
267
-        );
268
-
269
-        $this->addJavascript(
270
-            CoreAssetManager::JS_HANDLE_CORE,
271
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
272
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
273
-        )
274
-        ->setInlineDataCallback(
275
-            static function () {
276
-                wp_localize_script(
277
-                    CoreAssetManager::JS_HANDLE_CORE,
278
-                    CoreAssetManager::JS_HANDLE_I18N,
279
-                    EE_Registry::$i18n_js_strings
280
-                );
281
-            }
282
-        );
283
-    }
284
-
285
-
286
-    /**
287
-     * Registers vendor files that are bundled with a later version WP but might not be for the current version of
288
-     * WordPress in the running environment.
289
-     *
290
-     * @throws DuplicateCollectionIdentifierException
291
-     * @throws InvalidDataTypeException
292
-     * @throws InvalidEntityException
293
-     * @throws DomainException
294
-     * @since 4.9.71.p
295
-     */
296
-    private function registerWpAssets()
297
-    {
298
-        global $wp_version;
299
-        if (version_compare($wp_version, '5.0.beta', '>=')) {
300
-            return;
301
-        }
302
-        $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT, [], true, '16.6.0');
303
-        $this->addVendorJavascript(
304
-            CoreAssetManager::JS_HANDLE_REACT_DOM,
305
-            array(CoreAssetManager::JS_HANDLE_REACT),
306
-            true,
307
-            '16.6.0'
308
-        );
309
-        $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH, [], true, '4.17.11')
310
-            ->setInlineDataCallback(
311
-                static function() {
312
-                    wp_add_inline_script(
313
-                        CoreAssetManager::JS_HANDLE_LODASH,
314
-                        'window.lodash = _.noConflict();'
315
-                    );
316
-                }
317
-            );
318
-    }
319
-
320
-
321
-    /**
322
-     * Returns configuration data for the accounting-js library.
323
-     * @since 4.9.71.p
324
-     * @return array
325
-     */
326
-    private function getAccountingSettings() {
327
-        return array(
328
-            'currency' => array(
329
-                'symbol'    => $this->currency_config->sign,
330
-                'format'    => array(
331
-                    'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
332
-                    'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
333
-                    'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
334
-                ),
335
-                'decimal'   => $this->currency_config->dec_mrk,
336
-                'thousand'  => $this->currency_config->thsnds,
337
-                'precision' => $this->currency_config->dec_plc,
338
-            ),
339
-            'number'   => array(
340
-                'precision' => $this->currency_config->dec_plc,
341
-                'thousand'  => $this->currency_config->thsnds,
342
-                'decimal'   => $this->currency_config->dec_mrk,
343
-            ),
344
-        );
345
-    }
346
-
347
-
348
-    /**
349
-     * Returns configuration data for the js Currency VO.
350
-     * @since 4.9.71.p
351
-     * @return array
352
-     */
353
-    private function getCurrencySettings()
354
-    {
355
-        return array(
356
-            'code' => $this->currency_config->code,
357
-            'singularLabel' => $this->currency_config->name,
358
-            'pluralLabel' => $this->currency_config->plural,
359
-            'sign' => $this->currency_config->sign,
360
-            'signB4' => $this->currency_config->sign_b4,
361
-            'decimalPlaces' => $this->currency_config->dec_plc,
362
-            'decimalMark' => $this->currency_config->dec_mrk,
363
-            'thousandsSeparator' => $this->currency_config->thsnds,
364
-        );
365
-    }
366
-
367
-
368
-    /**
369
-     * @throws DuplicateCollectionIdentifierException
370
-     * @throws InvalidDataTypeException
371
-     * @throws InvalidEntityException
372
-     * @throws DomainException
373
-     * @since 4.9.62.p
374
-     */
375
-    private function loadCoreCss()
376
-    {
377
-        if ($this->template_config->enable_default_style && ! is_admin()) {
378
-            $this->addStylesheet(
379
-                CoreAssetManager::CSS_HANDLE_DEFAULT,
380
-                is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
381
-                    ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
382
-                    : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
383
-                array('dashicons')
384
-            );
385
-            //Load custom style sheet if available
386
-            if ($this->template_config->custom_style_sheet !== null) {
387
-                $this->addStylesheet(
388
-                    CoreAssetManager::CSS_HANDLE_CUSTOM,
389
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
390
-                    array(CoreAssetManager::CSS_HANDLE_DEFAULT)
391
-                );
392
-            }
393
-        }
394
-        $this->addCss(self::CSS_HANDLE_CORE_CSS_DEFAULT, ['dashicons']);
395
-        $this->addCss(self::CSS_HANDLE_COMPONENTS, [self::CSS_HANDLE_CORE_CSS_DEFAULT]);
396
-        $this->addCss(self::CSS_HANDLE_HOCS);
397
-    }
398
-
399
-
400
-    /**
401
-     * jQuery Validate for form validation
402
-     *
403
-     * @since 4.9.62.p
404
-     * @throws DomainException
405
-     * @throws DuplicateCollectionIdentifierException
406
-     * @throws InvalidDataTypeException
407
-     * @throws InvalidEntityException
408
-     */
409
-    private function loadJqueryValidate()
410
-    {
411
-        $this->addJavascript(
412
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
413
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
414
-            array(CoreAssetManager::JS_HANDLE_JQUERY),
415
-            true,
416
-            '1.15.0'
417
-        );
418
-
419
-        $this->addJavascript(
420
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
421
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
422
-            array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE),
423
-            true,
424
-            '1.15.0'
425
-        );
426
-    }
427
-
428
-
429
-    /**
430
-     * accounting.js for performing client-side calculations
431
-     *
432
-     * @since 4.9.62.p
433
-     * @throws DomainException
434
-     * @throws DuplicateCollectionIdentifierException
435
-     * @throws InvalidDataTypeException
436
-     * @throws InvalidEntityException
437
-     */
438
-    private function loadAccountingJs()
439
-    {
440
-        //accounting.js library
441
-        // @link http://josscrowcroft.github.io/accounting.js/
442
-        $this->addJavascript(
443
-            CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
444
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
445
-            array(CoreAssetManager::JS_HANDLE_UNDERSCORE),
446
-            true,
447
-            '0.3.2'
448
-        );
449
-
450
-        $this->addJavascript(
451
-            CoreAssetManager::JS_HANDLE_ACCOUNTING,
452
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
453
-            array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
454
-        )
455
-        ->setInlineDataCallback(
456
-            function () {
457
-                 wp_localize_script(
458
-                     CoreAssetManager::JS_HANDLE_ACCOUNTING,
459
-                     'EE_ACCOUNTING_CFG',
460
-                     $this->getAccountingSettings()
461
-                 );
462
-            }
463
-        );
464
-    }
465
-
466
-
467
-    /**
468
-     * registers assets for cleaning your ears
469
-     *
470
-     * @param JavascriptAsset $script
471
-     */
472
-    public function loadQtipJs(JavascriptAsset $script)
473
-    {
474
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
475
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
476
-        if (
477
-            $script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE
478
-            && apply_filters('FHEE_load_qtip', false)
479
-        ) {
480
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
481
-        }
482
-    }
483
-
484
-
485
-    /**
486
-     * assets that are used in the WordPress admin
487
-     *
488
-     * @throws DuplicateCollectionIdentifierException
489
-     * @throws InvalidDataTypeException
490
-     * @throws InvalidEntityException
491
-     * @throws DomainException
492
-     * @since 4.9.62.p
493
-     */
494
-    private function registerAdminAssets()
495
-    {
496
-        $this->addJs(self::JS_HANDLE_WP_PLUGINS_PAGE)->setRequiresTranslation();
497
-        // note usage of the "JS_HANDLE.." constant is intentional here because css uses the same handle.
498
-        $this->addCss(self::JS_HANDLE_WP_PLUGINS_PAGE);
499
-    }
92
+	// EE CSS assets handles
93
+	const CSS_HANDLE_DEFAULT = 'espresso_default';
94
+
95
+	const CSS_HANDLE_CUSTOM = 'espresso_custom_css';
96
+
97
+	const CSS_HANDLE_COMPONENTS = 'eventespresso-components';
98
+
99
+	const CSS_HANDLE_HOCS = 'eventespresso-hocs';
100
+
101
+	const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default';
102
+
103
+	/**
104
+	 * @var EE_Currency_Config $currency_config
105
+	 */
106
+	protected $currency_config;
107
+
108
+	/**
109
+	 * @var EE_Template_Config $template_config
110
+	 */
111
+	protected $template_config;
112
+
113
+
114
+	/**
115
+	 * CoreAssetRegister constructor.
116
+	 *
117
+	 * @param AssetCollection    $assets
118
+	 * @param EE_Currency_Config $currency_config
119
+	 * @param EE_Template_Config $template_config
120
+	 * @param DomainInterface    $domain
121
+	 * @param Registry           $registry
122
+	 */
123
+	public function __construct(
124
+		AssetCollection $assets,
125
+		EE_Currency_Config $currency_config,
126
+		EE_Template_Config $template_config,
127
+		DomainInterface $domain,
128
+		Registry $registry
129
+	) {
130
+		$this->currency_config = $currency_config;
131
+		$this->template_config = $template_config;
132
+		parent::__construct($domain, $assets, $registry);
133
+	}
134
+
135
+
136
+	/**
137
+	 * @since 4.9.62.p
138
+	 * @throws DomainException
139
+	 * @throws DuplicateCollectionIdentifierException
140
+	 * @throws InvalidArgumentException
141
+	 * @throws InvalidDataTypeException
142
+	 * @throws InvalidEntityException
143
+	 * @throws InvalidInterfaceException
144
+	 */
145
+	public function addAssets()
146
+	{
147
+		$this->addJavascriptFiles();
148
+		$this->addStylesheetFiles();
149
+	}
150
+
151
+
152
+	/**
153
+	 * @since 4.9.62.p
154
+	 * @throws DomainException
155
+	 * @throws DuplicateCollectionIdentifierException
156
+	 * @throws InvalidArgumentException
157
+	 * @throws InvalidDataTypeException
158
+	 * @throws InvalidEntityException
159
+	 * @throws InvalidInterfaceException
160
+	 */
161
+	public function addJavascriptFiles()
162
+	{
163
+		$this->loadCoreJs();
164
+		$this->loadJqueryValidate();
165
+		$this->loadAccountingJs();
166
+		add_action(
167
+			'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
168
+			array($this, 'loadQtipJs')
169
+		);
170
+		$this->registerAdminAssets();
171
+	}
172
+
173
+
174
+	/**
175
+	 * @throws DuplicateCollectionIdentifierException
176
+	 * @throws InvalidDataTypeException
177
+	 * @throws InvalidEntityException
178
+	 * @throws DomainException
179
+	 * @since 4.9.62.p
180
+	 */
181
+	public function addStylesheetFiles()
182
+	{
183
+		$this->loadCoreCss();
184
+	}
185
+
186
+
187
+	/**
188
+	 * core default javascript
189
+	 *
190
+	 * @since 4.9.62.p
191
+	 * @throws DomainException
192
+	 * @throws DuplicateCollectionIdentifierException
193
+	 * @throws InvalidArgumentException
194
+	 * @throws InvalidDataTypeException
195
+	 * @throws InvalidEntityException
196
+	 * @throws InvalidInterfaceException
197
+	 */
198
+	private function loadCoreJs()
199
+	{
200
+		// conditionally load third-party libraries that WP core MIGHT have.
201
+		$this->registerWpAssets();
202
+
203
+		$this->addJs(self::JS_HANDLE_JS_CORE)->setHasInlineData();
204
+		$this->addJs(self::JS_HANDLE_VENDOR);
205
+		$this->addJs(self::JS_HANDLE_UTILS)->setRequiresTranslation();
206
+		$this->addJs(self::JS_HANDLE_VALIDATORS)->setRequiresTranslation();
207
+		$this->addJs(self::JS_HANDLE_HELPERS)->setRequiresTranslation();
208
+		$this->addJs(self::JS_HANDLE_MODEL)->setRequiresTranslation();
209
+		$this->addJs(self::JS_HANDLE_MODEL_SCHEMA)->setRequiresTranslation();
210
+		$this->addJs(self::JS_HANDLE_HOOKS);
211
+		$this->addJs(self::JS_HANDLE_VALUE_OBJECTS)->setRequiresTranslation();
212
+		$this->addJs(self::JS_HANDLE_DATA_STORES)->setRequiresTranslation()->setInlineDataCallback(
213
+			static function () {
214
+				wp_add_inline_script(
215
+					CoreAssetManager::JS_HANDLE_DATA_STORES,
216
+					is_admin()
217
+						? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )'
218
+						: 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )'
219
+				);
220
+			}
221
+		);
222
+		$this->addJs(self::JS_HANDLE_HOCS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation();
223
+		$this->addJs(self::JS_HANDLE_COMPONENTS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation();
224
+
225
+		$this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
226
+		$this->registry->addData(
227
+			'paths',
228
+			array(
229
+				'base_rest_route' => rest_url(),
230
+				'rest_route' => rest_url('ee/v4.8.36/'),
231
+				'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
232
+				'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
233
+				'site_url' => site_url('/'),
234
+				'admin_url' => admin_url('/'),
235
+			)
236
+		);
237
+		// Event Espresso brand name
238
+		$this->registry->addData('brandName', Domain::brandName());
239
+		/** site formatting values **/
240
+		$this->registry->addData(
241
+			'site_formats',
242
+			array(
243
+				'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
244
+			)
245
+		);
246
+		/** currency data **/
247
+		$this->registry->addData(
248
+			'currency_config',
249
+			$this->getCurrencySettings()
250
+		);
251
+		/** site timezone */
252
+		$this->registry->addData(
253
+			'default_timezone',
254
+			array(
255
+				'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
256
+				'string' => get_option('timezone_string'),
257
+				'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
258
+			)
259
+		);
260
+		/** site locale (user locale if user logged in) */
261
+		$this->registry->addData(
262
+			'locale',
263
+			array(
264
+				'user' => get_user_locale(),
265
+				'site' => get_locale()
266
+			)
267
+		);
268
+
269
+		$this->addJavascript(
270
+			CoreAssetManager::JS_HANDLE_CORE,
271
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
272
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
273
+		)
274
+		->setInlineDataCallback(
275
+			static function () {
276
+				wp_localize_script(
277
+					CoreAssetManager::JS_HANDLE_CORE,
278
+					CoreAssetManager::JS_HANDLE_I18N,
279
+					EE_Registry::$i18n_js_strings
280
+				);
281
+			}
282
+		);
283
+	}
284
+
285
+
286
+	/**
287
+	 * Registers vendor files that are bundled with a later version WP but might not be for the current version of
288
+	 * WordPress in the running environment.
289
+	 *
290
+	 * @throws DuplicateCollectionIdentifierException
291
+	 * @throws InvalidDataTypeException
292
+	 * @throws InvalidEntityException
293
+	 * @throws DomainException
294
+	 * @since 4.9.71.p
295
+	 */
296
+	private function registerWpAssets()
297
+	{
298
+		global $wp_version;
299
+		if (version_compare($wp_version, '5.0.beta', '>=')) {
300
+			return;
301
+		}
302
+		$this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT, [], true, '16.6.0');
303
+		$this->addVendorJavascript(
304
+			CoreAssetManager::JS_HANDLE_REACT_DOM,
305
+			array(CoreAssetManager::JS_HANDLE_REACT),
306
+			true,
307
+			'16.6.0'
308
+		);
309
+		$this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH, [], true, '4.17.11')
310
+			->setInlineDataCallback(
311
+				static function() {
312
+					wp_add_inline_script(
313
+						CoreAssetManager::JS_HANDLE_LODASH,
314
+						'window.lodash = _.noConflict();'
315
+					);
316
+				}
317
+			);
318
+	}
319
+
320
+
321
+	/**
322
+	 * Returns configuration data for the accounting-js library.
323
+	 * @since 4.9.71.p
324
+	 * @return array
325
+	 */
326
+	private function getAccountingSettings() {
327
+		return array(
328
+			'currency' => array(
329
+				'symbol'    => $this->currency_config->sign,
330
+				'format'    => array(
331
+					'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
332
+					'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
333
+					'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
334
+				),
335
+				'decimal'   => $this->currency_config->dec_mrk,
336
+				'thousand'  => $this->currency_config->thsnds,
337
+				'precision' => $this->currency_config->dec_plc,
338
+			),
339
+			'number'   => array(
340
+				'precision' => $this->currency_config->dec_plc,
341
+				'thousand'  => $this->currency_config->thsnds,
342
+				'decimal'   => $this->currency_config->dec_mrk,
343
+			),
344
+		);
345
+	}
346
+
347
+
348
+	/**
349
+	 * Returns configuration data for the js Currency VO.
350
+	 * @since 4.9.71.p
351
+	 * @return array
352
+	 */
353
+	private function getCurrencySettings()
354
+	{
355
+		return array(
356
+			'code' => $this->currency_config->code,
357
+			'singularLabel' => $this->currency_config->name,
358
+			'pluralLabel' => $this->currency_config->plural,
359
+			'sign' => $this->currency_config->sign,
360
+			'signB4' => $this->currency_config->sign_b4,
361
+			'decimalPlaces' => $this->currency_config->dec_plc,
362
+			'decimalMark' => $this->currency_config->dec_mrk,
363
+			'thousandsSeparator' => $this->currency_config->thsnds,
364
+		);
365
+	}
366
+
367
+
368
+	/**
369
+	 * @throws DuplicateCollectionIdentifierException
370
+	 * @throws InvalidDataTypeException
371
+	 * @throws InvalidEntityException
372
+	 * @throws DomainException
373
+	 * @since 4.9.62.p
374
+	 */
375
+	private function loadCoreCss()
376
+	{
377
+		if ($this->template_config->enable_default_style && ! is_admin()) {
378
+			$this->addStylesheet(
379
+				CoreAssetManager::CSS_HANDLE_DEFAULT,
380
+				is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
381
+					? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
382
+					: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
383
+				array('dashicons')
384
+			);
385
+			//Load custom style sheet if available
386
+			if ($this->template_config->custom_style_sheet !== null) {
387
+				$this->addStylesheet(
388
+					CoreAssetManager::CSS_HANDLE_CUSTOM,
389
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
390
+					array(CoreAssetManager::CSS_HANDLE_DEFAULT)
391
+				);
392
+			}
393
+		}
394
+		$this->addCss(self::CSS_HANDLE_CORE_CSS_DEFAULT, ['dashicons']);
395
+		$this->addCss(self::CSS_HANDLE_COMPONENTS, [self::CSS_HANDLE_CORE_CSS_DEFAULT]);
396
+		$this->addCss(self::CSS_HANDLE_HOCS);
397
+	}
398
+
399
+
400
+	/**
401
+	 * jQuery Validate for form validation
402
+	 *
403
+	 * @since 4.9.62.p
404
+	 * @throws DomainException
405
+	 * @throws DuplicateCollectionIdentifierException
406
+	 * @throws InvalidDataTypeException
407
+	 * @throws InvalidEntityException
408
+	 */
409
+	private function loadJqueryValidate()
410
+	{
411
+		$this->addJavascript(
412
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
413
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
414
+			array(CoreAssetManager::JS_HANDLE_JQUERY),
415
+			true,
416
+			'1.15.0'
417
+		);
418
+
419
+		$this->addJavascript(
420
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
421
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
422
+			array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE),
423
+			true,
424
+			'1.15.0'
425
+		);
426
+	}
427
+
428
+
429
+	/**
430
+	 * accounting.js for performing client-side calculations
431
+	 *
432
+	 * @since 4.9.62.p
433
+	 * @throws DomainException
434
+	 * @throws DuplicateCollectionIdentifierException
435
+	 * @throws InvalidDataTypeException
436
+	 * @throws InvalidEntityException
437
+	 */
438
+	private function loadAccountingJs()
439
+	{
440
+		//accounting.js library
441
+		// @link http://josscrowcroft.github.io/accounting.js/
442
+		$this->addJavascript(
443
+			CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
444
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
445
+			array(CoreAssetManager::JS_HANDLE_UNDERSCORE),
446
+			true,
447
+			'0.3.2'
448
+		);
449
+
450
+		$this->addJavascript(
451
+			CoreAssetManager::JS_HANDLE_ACCOUNTING,
452
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
453
+			array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
454
+		)
455
+		->setInlineDataCallback(
456
+			function () {
457
+				 wp_localize_script(
458
+					 CoreAssetManager::JS_HANDLE_ACCOUNTING,
459
+					 'EE_ACCOUNTING_CFG',
460
+					 $this->getAccountingSettings()
461
+				 );
462
+			}
463
+		);
464
+	}
465
+
466
+
467
+	/**
468
+	 * registers assets for cleaning your ears
469
+	 *
470
+	 * @param JavascriptAsset $script
471
+	 */
472
+	public function loadQtipJs(JavascriptAsset $script)
473
+	{
474
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
475
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
476
+		if (
477
+			$script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE
478
+			&& apply_filters('FHEE_load_qtip', false)
479
+		) {
480
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
481
+		}
482
+	}
483
+
484
+
485
+	/**
486
+	 * assets that are used in the WordPress admin
487
+	 *
488
+	 * @throws DuplicateCollectionIdentifierException
489
+	 * @throws InvalidDataTypeException
490
+	 * @throws InvalidEntityException
491
+	 * @throws DomainException
492
+	 * @since 4.9.62.p
493
+	 */
494
+	private function registerAdminAssets()
495
+	{
496
+		$this->addJs(self::JS_HANDLE_WP_PLUGINS_PAGE)->setRequiresTranslation();
497
+		// note usage of the "JS_HANDLE.." constant is intentional here because css uses the same handle.
498
+		$this->addCss(self::JS_HANDLE_WP_PLUGINS_PAGE);
499
+	}
500 500
 }
Please login to merge, or discard this patch.
core/domain/services/admin/events/editor/AdvancedEditorEntityData.php 2 patches
Indentation   +223 added lines, -223 removed lines patch added patch discarded remove patch
@@ -35,243 +35,243 @@
 block discarded – undo
35 35
 class AdvancedEditorEntityData
36 36
 {
37 37
 
38
-    /**
39
-     * @var RestApiSpoofer
40
-     */
41
-    protected $spoofer;
38
+	/**
39
+	 * @var RestApiSpoofer
40
+	 */
41
+	protected $spoofer;
42 42
 
43
-    /**
44
-     * @var EE_Admin_Config
45
-     */
46
-    protected $admin_config;
43
+	/**
44
+	 * @var EE_Admin_Config
45
+	 */
46
+	protected $admin_config;
47 47
 
48
-    /**
49
-     * @var EEM_Datetime $datetime_model
50
-     */
51
-    protected $datetime_model;
48
+	/**
49
+	 * @var EEM_Datetime $datetime_model
50
+	 */
51
+	protected $datetime_model;
52 52
 
53
-    /**
54
-     * @var EEM_Event $event_model
55
-     */
56
-    protected $event_model;
53
+	/**
54
+	 * @var EEM_Event $event_model
55
+	 */
56
+	protected $event_model;
57 57
 
58
-    /**
59
-     * @var EEM_Price $price_model
60
-     */
61
-    protected $price_model;
58
+	/**
59
+	 * @var EEM_Price $price_model
60
+	 */
61
+	protected $price_model;
62 62
 
63
-    /**
64
-     * @var EEM_Price_Type $price_type_model
65
-     */
66
-    protected $price_type_model;
63
+	/**
64
+	 * @var EEM_Price_Type $price_type_model
65
+	 */
66
+	protected $price_type_model;
67 67
 
68
-    /**
69
-     * @var EEM_Ticket $ticket_model
70
-     */
71
-    protected $ticket_model;
72
-    /**
73
-     * @var EEM_Venue $venue_model
74
-     */
75
-    protected $venue_model;
68
+	/**
69
+	 * @var EEM_Ticket $ticket_model
70
+	 */
71
+	protected $ticket_model;
72
+	/**
73
+	 * @var EEM_Venue $venue_model
74
+	 */
75
+	protected $venue_model;
76 76
 
77 77
 
78
-    /**
79
-     * AdvancedEditorAdminForm constructor.
80
-     *
81
-     * @param RestApiSpoofer $spoofer
82
-     * @param EE_Admin_Config $admin_config
83
-     * @param EEM_Datetime $datetime_model
84
-     * @param EEM_Event $event_model
85
-     * @param EEM_Price $price_model
86
-     * @param EEM_Price_Type $price_type_model
87
-     * @param EEM_Ticket $ticket_model
88
-     * @param EEM_Venue $venue_model
89
-     */
90
-    public function __construct(
91
-        RestApiSpoofer $spoofer,
92
-        EE_Admin_Config $admin_config,
93
-        EEM_Datetime $datetime_model,
94
-        EEM_Event $event_model,
95
-        EEM_Price $price_model,
96
-        EEM_Price_Type $price_type_model,
97
-        EEM_Ticket $ticket_model,
98
-        EEM_Venue $venue_model
99
-    ) {
100
-        $this->admin_config = $admin_config;
101
-        $this->spoofer = $spoofer;
102
-        $this->datetime_model = $datetime_model;
103
-        $this->event_model = $event_model;
104
-        $this->price_model = $price_model;
105
-        $this->price_type_model = $price_type_model;
106
-        $this->ticket_model = $ticket_model;
107
-        $this->venue_model = $venue_model;
108
-        add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']);
109
-    }
78
+	/**
79
+	 * AdvancedEditorAdminForm constructor.
80
+	 *
81
+	 * @param RestApiSpoofer $spoofer
82
+	 * @param EE_Admin_Config $admin_config
83
+	 * @param EEM_Datetime $datetime_model
84
+	 * @param EEM_Event $event_model
85
+	 * @param EEM_Price $price_model
86
+	 * @param EEM_Price_Type $price_type_model
87
+	 * @param EEM_Ticket $ticket_model
88
+	 * @param EEM_Venue $venue_model
89
+	 */
90
+	public function __construct(
91
+		RestApiSpoofer $spoofer,
92
+		EE_Admin_Config $admin_config,
93
+		EEM_Datetime $datetime_model,
94
+		EEM_Event $event_model,
95
+		EEM_Price $price_model,
96
+		EEM_Price_Type $price_type_model,
97
+		EEM_Ticket $ticket_model,
98
+		EEM_Venue $venue_model
99
+	) {
100
+		$this->admin_config = $admin_config;
101
+		$this->spoofer = $spoofer;
102
+		$this->datetime_model = $datetime_model;
103
+		$this->event_model = $event_model;
104
+		$this->price_model = $price_model;
105
+		$this->price_type_model = $price_type_model;
106
+		$this->ticket_model = $ticket_model;
107
+		$this->venue_model = $venue_model;
108
+		add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']);
109
+	}
110 110
 
111 111
 
112
-    /**
113
-     * @throws EE_Error
114
-     * @throws InvalidArgumentException
115
-     * @throws InvalidDataTypeException
116
-     * @throws InvalidInterfaceException
117
-     * @throws ModelConfigurationException
118
-     * @throws ReflectionException
119
-     * @throws RestException
120
-     * @throws RestPasswordIncorrectException
121
-     * @throws RestPasswordRequiredException
122
-     * @throws UnexpectedEntityException
123
-     * @throws DomainException
124
-     * @since $VID:$
125
-     */
126
-    public function loadScriptsStyles()
127
-    {
128
-        if ($this->admin_config->useAdvancedEditor()) {
129
-            global $post;
130
-            $eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0;
131
-            $eventId = $eventId === 0 && $post instanceof WP_Post ? $post->ID : $eventId;
132
-            if ($eventId) {
133
-                $data = $this->getAllEventData($eventId);
134
-                $data = wp_json_encode($data);
135
-                add_action(
136
-                    'admin_footer',
137
-                    static function () use ($data) {
138
-                        wp_add_inline_script(
139
-                            EspressoEditorAssetManager::JS_HANDLE_EDITOR,
140
-                            "var eeEditorEventData={$data};",
141
-                            'before'
142
-                        );
143
-                    }
144
-                );
145
-            }
146
-        }
147
-    }
112
+	/**
113
+	 * @throws EE_Error
114
+	 * @throws InvalidArgumentException
115
+	 * @throws InvalidDataTypeException
116
+	 * @throws InvalidInterfaceException
117
+	 * @throws ModelConfigurationException
118
+	 * @throws ReflectionException
119
+	 * @throws RestException
120
+	 * @throws RestPasswordIncorrectException
121
+	 * @throws RestPasswordRequiredException
122
+	 * @throws UnexpectedEntityException
123
+	 * @throws DomainException
124
+	 * @since $VID:$
125
+	 */
126
+	public function loadScriptsStyles()
127
+	{
128
+		if ($this->admin_config->useAdvancedEditor()) {
129
+			global $post;
130
+			$eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0;
131
+			$eventId = $eventId === 0 && $post instanceof WP_Post ? $post->ID : $eventId;
132
+			if ($eventId) {
133
+				$data = $this->getAllEventData($eventId);
134
+				$data = wp_json_encode($data);
135
+				add_action(
136
+					'admin_footer',
137
+					static function () use ($data) {
138
+						wp_add_inline_script(
139
+							EspressoEditorAssetManager::JS_HANDLE_EDITOR,
140
+							"var eeEditorEventData={$data};",
141
+							'before'
142
+						);
143
+					}
144
+				);
145
+			}
146
+		}
147
+	}
148 148
 
149 149
 
150
-    /**
151
-     * @param int $eventId
152
-     * @return array
153
-     * @throws EE_Error
154
-     * @throws InvalidDataTypeException
155
-     * @throws InvalidInterfaceException
156
-     * @throws ModelConfigurationException
157
-     * @throws RestPasswordIncorrectException
158
-     * @throws RestPasswordRequiredException
159
-     * @throws UnexpectedEntityException
160
-     * @throws RestException
161
-     * @throws InvalidArgumentException
162
-     * @throws ReflectionException
163
-     * @throws DomainException
164
-     * @since $VID:$
165
-     */
166
-    protected function getAllEventData($eventId)
167
-    {
168
-        // these should ultimately be extracted out into their own classes (one per model)
169
-        $event = $this->spoofer->getOneApiResult(
170
-            $this->event_model,
171
-            [['EVT_ID' => $eventId]]
172
-        );
173
-        if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
174
-            return [];
175
-        }
176
-        $event = [$eventId => $event];
177
-        $relations = [
178
-            'event' => [ $eventId => [] ],
179
-            'datetime' => [],
180
-            'ticket' => [],
181
-            'price' => [],
182
-        ];
183
-        $eventDates = $this->spoofer->getApiResults(
184
-            $this->datetime_model,
185
-            [[
186
-                'EVT_ID' => $eventId,
187
-                'DTT_deleted' => ['IN', [true, false]]
188
-            ]]
189
-        );
190
-        $relations['event'][ $eventId ]['datetime'] = [];
150
+	/**
151
+	 * @param int $eventId
152
+	 * @return array
153
+	 * @throws EE_Error
154
+	 * @throws InvalidDataTypeException
155
+	 * @throws InvalidInterfaceException
156
+	 * @throws ModelConfigurationException
157
+	 * @throws RestPasswordIncorrectException
158
+	 * @throws RestPasswordRequiredException
159
+	 * @throws UnexpectedEntityException
160
+	 * @throws RestException
161
+	 * @throws InvalidArgumentException
162
+	 * @throws ReflectionException
163
+	 * @throws DomainException
164
+	 * @since $VID:$
165
+	 */
166
+	protected function getAllEventData($eventId)
167
+	{
168
+		// these should ultimately be extracted out into their own classes (one per model)
169
+		$event = $this->spoofer->getOneApiResult(
170
+			$this->event_model,
171
+			[['EVT_ID' => $eventId]]
172
+		);
173
+		if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
174
+			return [];
175
+		}
176
+		$event = [$eventId => $event];
177
+		$relations = [
178
+			'event' => [ $eventId => [] ],
179
+			'datetime' => [],
180
+			'ticket' => [],
181
+			'price' => [],
182
+		];
183
+		$eventDates = $this->spoofer->getApiResults(
184
+			$this->datetime_model,
185
+			[[
186
+				'EVT_ID' => $eventId,
187
+				'DTT_deleted' => ['IN', [true, false]]
188
+			]]
189
+		);
190
+		$relations['event'][ $eventId ]['datetime'] = [];
191 191
 
192
-        $datetimes = [];
193
-        $eventDateTickets = [];
194
-        if (is_array($eventDates)){
195
-            foreach ($eventDates as $eventDate) {
196
-                if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
197
-                    $DTT_ID = $eventDate['DTT_ID'];
198
-                    $datetimes[ $DTT_ID ] = $eventDate;
199
-                    $relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
200
-                    $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
201
-                        $this->ticket_model,
202
-                        [[
203
-                            'Datetime.DTT_ID' => $DTT_ID,
204
-                            'TKT_deleted' => ['IN', [true, false]]
205
-                        ]]
206
-                    );
207
-                }
208
-            }
209
-        }
192
+		$datetimes = [];
193
+		$eventDateTickets = [];
194
+		if (is_array($eventDates)){
195
+			foreach ($eventDates as $eventDate) {
196
+				if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
197
+					$DTT_ID = $eventDate['DTT_ID'];
198
+					$datetimes[ $DTT_ID ] = $eventDate;
199
+					$relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
200
+					$eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
201
+						$this->ticket_model,
202
+						[[
203
+							'Datetime.DTT_ID' => $DTT_ID,
204
+							'TKT_deleted' => ['IN', [true, false]]
205
+						]]
206
+					);
207
+				}
208
+			}
209
+		}
210 210
 
211
-        $prices = [];
212
-        $tickets = [];
213
-        if (is_array($eventDateTickets)) {
214
-            foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
215
-                if (is_array($dateTickets)) {
216
-                    $relations['datetime'][ $DTT_ID ]['ticket'] = [];
217
-                    foreach ($dateTickets as $ticket) {
218
-                        if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
219
-                            $TKT_ID = $ticket['TKT_ID'];
220
-                            $tickets[ $TKT_ID ] = $ticket;
221
-                            $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
222
-                            $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
223
-                                $this->price_model,
224
-                                [['Ticket.TKT_ID' => $TKT_ID]]
225
-                            );
226
-                            if (is_array($ticketPrices[ $TKT_ID ])) {
227
-                                $relations['ticket'][ $TKT_ID ]['price'] = [];
228
-                                foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
229
-                                    $PRC_ID = $ticketPrice['PRC_ID'];
230
-                                    $prices[ $PRC_ID ] = $ticketPrice;
231
-                                    $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
232
-                                }
233
-                            }
234
-                        }
235
-                    }
236
-                }
237
-            }
238
-        }
239
-        $price_type_results = $this->spoofer->getApiResults(
240
-            $this->price_type_model,
241
-            [['PRT_deleted' => false]]
242
-        );
243
-        $price_types = [];
244
-        foreach ($price_type_results as $price_type) {
245
-            $price_types[ $price_type['PRT_ID'] ] = $price_type;
246
-        }
247
-        $venue = $this->spoofer->getOneApiResult(
248
-            $this->venue_model,
249
-            [['Event.EVT_ID' => $eventId]]
250
-        );
251
-        if (is_array($venue) && isset($venue['VNU_ID'])) {
252
-            $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
253
-            $venue = [$venue['VNU_ID'] => $venue];
254
-        }
211
+		$prices = [];
212
+		$tickets = [];
213
+		if (is_array($eventDateTickets)) {
214
+			foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
215
+				if (is_array($dateTickets)) {
216
+					$relations['datetime'][ $DTT_ID ]['ticket'] = [];
217
+					foreach ($dateTickets as $ticket) {
218
+						if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
219
+							$TKT_ID = $ticket['TKT_ID'];
220
+							$tickets[ $TKT_ID ] = $ticket;
221
+							$relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
222
+							$ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
223
+								$this->price_model,
224
+								[['Ticket.TKT_ID' => $TKT_ID]]
225
+							);
226
+							if (is_array($ticketPrices[ $TKT_ID ])) {
227
+								$relations['ticket'][ $TKT_ID ]['price'] = [];
228
+								foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
229
+									$PRC_ID = $ticketPrice['PRC_ID'];
230
+									$prices[ $PRC_ID ] = $ticketPrice;
231
+									$relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
232
+								}
233
+							}
234
+						}
235
+					}
236
+				}
237
+			}
238
+		}
239
+		$price_type_results = $this->spoofer->getApiResults(
240
+			$this->price_type_model,
241
+			[['PRT_deleted' => false]]
242
+		);
243
+		$price_types = [];
244
+		foreach ($price_type_results as $price_type) {
245
+			$price_types[ $price_type['PRT_ID'] ] = $price_type;
246
+		}
247
+		$venue = $this->spoofer->getOneApiResult(
248
+			$this->venue_model,
249
+			[['Event.EVT_ID' => $eventId]]
250
+		);
251
+		if (is_array($venue) && isset($venue['VNU_ID'])) {
252
+			$relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
253
+			$venue = [$venue['VNU_ID'] => $venue];
254
+		}
255 255
 
256
-        $schemas = [
257
-            'event'      => $this->spoofer->getModelSchema('events'),
258
-            'datetime'   => $this->spoofer->getModelSchema('datetimes'),
259
-            'ticket'     => $this->spoofer->getModelSchema('tickets'),
260
-            'price'      => $this->spoofer->getModelSchema('prices'),
261
-            'price_type' => $this->spoofer->getModelSchema('price_types'),
262
-            'venue'      => $this->spoofer->getModelSchema('venues'),
263
-        ];
256
+		$schemas = [
257
+			'event'      => $this->spoofer->getModelSchema('events'),
258
+			'datetime'   => $this->spoofer->getModelSchema('datetimes'),
259
+			'ticket'     => $this->spoofer->getModelSchema('tickets'),
260
+			'price'      => $this->spoofer->getModelSchema('prices'),
261
+			'price_type' => $this->spoofer->getModelSchema('price_types'),
262
+			'venue'      => $this->spoofer->getModelSchema('venues'),
263
+		];
264 264
 
265
-        return [
266
-            'eventId'    => $eventId,
267
-            'event'      => $event,
268
-            'datetime'   => $datetimes,
269
-            'ticket'     => $tickets,
270
-            'price'      => $prices,
271
-            'price_type' => $price_types,
272
-            'venue'      => $venue,
273
-            'schemas'    => $schemas,
274
-            'relations'  => $relations,
275
-        ];
276
-    }
265
+		return [
266
+			'eventId'    => $eventId,
267
+			'event'      => $event,
268
+			'datetime'   => $datetimes,
269
+			'ticket'     => $tickets,
270
+			'price'      => $prices,
271
+			'price_type' => $price_types,
272
+			'venue'      => $venue,
273
+			'schemas'    => $schemas,
274
+			'relations'  => $relations,
275
+		];
276
+	}
277 277
 }
Please login to merge, or discard this patch.
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
                 $data = wp_json_encode($data);
135 135
                 add_action(
136 136
                     'admin_footer',
137
-                    static function () use ($data) {
137
+                    static function() use ($data) {
138 138
                         wp_add_inline_script(
139 139
                             EspressoEditorAssetManager::JS_HANDLE_EDITOR,
140 140
                             "var eeEditorEventData={$data};",
@@ -170,12 +170,12 @@  discard block
 block discarded – undo
170 170
             $this->event_model,
171 171
             [['EVT_ID' => $eventId]]
172 172
         );
173
-        if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
173
+        if ( ! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
174 174
             return [];
175 175
         }
176 176
         $event = [$eventId => $event];
177 177
         $relations = [
178
-            'event' => [ $eventId => [] ],
178
+            'event' => [$eventId => []],
179 179
             'datetime' => [],
180 180
             'ticket' => [],
181 181
             'price' => [],
@@ -187,17 +187,17 @@  discard block
 block discarded – undo
187 187
                 'DTT_deleted' => ['IN', [true, false]]
188 188
             ]]
189 189
         );
190
-        $relations['event'][ $eventId ]['datetime'] = [];
190
+        $relations['event'][$eventId]['datetime'] = [];
191 191
 
192 192
         $datetimes = [];
193 193
         $eventDateTickets = [];
194
-        if (is_array($eventDates)){
194
+        if (is_array($eventDates)) {
195 195
             foreach ($eventDates as $eventDate) {
196 196
                 if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
197 197
                     $DTT_ID = $eventDate['DTT_ID'];
198
-                    $datetimes[ $DTT_ID ] = $eventDate;
199
-                    $relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
200
-                    $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
198
+                    $datetimes[$DTT_ID] = $eventDate;
199
+                    $relations['event'][$eventId]['datetime'][] = $DTT_ID;
200
+                    $eventDateTickets[$DTT_ID] = $this->spoofer->getApiResults(
201 201
                         $this->ticket_model,
202 202
                         [[
203 203
                             'Datetime.DTT_ID' => $DTT_ID,
@@ -213,22 +213,22 @@  discard block
 block discarded – undo
213 213
         if (is_array($eventDateTickets)) {
214 214
             foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
215 215
                 if (is_array($dateTickets)) {
216
-                    $relations['datetime'][ $DTT_ID ]['ticket'] = [];
216
+                    $relations['datetime'][$DTT_ID]['ticket'] = [];
217 217
                     foreach ($dateTickets as $ticket) {
218 218
                         if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
219 219
                             $TKT_ID = $ticket['TKT_ID'];
220
-                            $tickets[ $TKT_ID ] = $ticket;
221
-                            $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
222
-                            $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
220
+                            $tickets[$TKT_ID] = $ticket;
221
+                            $relations['datetime'][$DTT_ID]['ticket'][] = $TKT_ID;
222
+                            $ticketPrices[$TKT_ID] = $this->spoofer->getApiResults(
223 223
                                 $this->price_model,
224 224
                                 [['Ticket.TKT_ID' => $TKT_ID]]
225 225
                             );
226
-                            if (is_array($ticketPrices[ $TKT_ID ])) {
227
-                                $relations['ticket'][ $TKT_ID ]['price'] = [];
228
-                                foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
226
+                            if (is_array($ticketPrices[$TKT_ID])) {
227
+                                $relations['ticket'][$TKT_ID]['price'] = [];
228
+                                foreach ($ticketPrices[$TKT_ID] as $ticketPrice) {
229 229
                                     $PRC_ID = $ticketPrice['PRC_ID'];
230
-                                    $prices[ $PRC_ID ] = $ticketPrice;
231
-                                    $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
230
+                                    $prices[$PRC_ID] = $ticketPrice;
231
+                                    $relations['ticket'][$TKT_ID]['price'][] = $PRC_ID;
232 232
                                 }
233 233
                             }
234 234
                         }
@@ -242,14 +242,14 @@  discard block
 block discarded – undo
242 242
         );
243 243
         $price_types = [];
244 244
         foreach ($price_type_results as $price_type) {
245
-            $price_types[ $price_type['PRT_ID'] ] = $price_type;
245
+            $price_types[$price_type['PRT_ID']] = $price_type;
246 246
         }
247 247
         $venue = $this->spoofer->getOneApiResult(
248 248
             $this->venue_model,
249 249
             [['Event.EVT_ID' => $eventId]]
250 250
         );
251 251
         if (is_array($venue) && isset($venue['VNU_ID'])) {
252
-            $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
252
+            $relations['event'][$eventId]['venue'] = [$venue['VNU_ID']];
253 253
             $venue = [$venue['VNU_ID'] => $venue];
254 254
         }
255 255
 
Please login to merge, or discard this patch.
core/domain/services/converters/RestApiSpoofer.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -143,7 +143,7 @@
 block discarded – undo
143 143
      */
144 144
     public function getApiResults(EEM_Base $model, array $query_params, $include = '')
145 145
     {
146
-        if (! array_key_exists('caps', $query_params)) {
146
+        if ( ! array_key_exists('caps', $query_params)) {
147 147
             $query_params['caps'] = EEM_Base::caps_read_admin;
148 148
         }
149 149
         /** @type array $results */
Please login to merge, or discard this patch.
Indentation   +120 added lines, -120 removed lines patch added patch discarded remove patch
@@ -49,134 +49,134 @@
 block discarded – undo
49 49
 class RestApiSpoofer
50 50
 {
51 51
 
52
-    /**
53
-     * @var WP_REST_Server $wp_rest_server
54
-     */
55
-    protected $wp_rest_server;
52
+	/**
53
+	 * @var WP_REST_Server $wp_rest_server
54
+	 */
55
+	protected $wp_rest_server;
56 56
 
57
-    /**
58
-     * @var Read
59
-     */
60
-    protected $rest_controller;
57
+	/**
58
+	 * @var Read
59
+	 */
60
+	protected $rest_controller;
61 61
 
62
-    /**
63
-     * @var EED_Core_Rest_Api $rest_module
64
-     */
65
-    protected $rest_module;
62
+	/**
63
+	 * @var EED_Core_Rest_Api $rest_module
64
+	 */
65
+	protected $rest_module;
66 66
 
67 67
 
68
-    /**
69
-     * RestApiSpoofer constructor.
70
-     *
71
-     * @param WP_REST_Server        $wp_rest_server
72
-     * @param EED_Core_Rest_Api $rest_module
73
-     * @param Read                  $rest_api
74
-     * @param string                $api_version
75
-     */
76
-    public function __construct(
77
-        WP_REST_Server $wp_rest_server,
78
-        EED_Core_Rest_Api $rest_module,
79
-        Read $rest_api,
80
-        $api_version = '4.8.36'
81
-    ) {
82
-        $this->wp_rest_server = $wp_rest_server;
83
-        $this->rest_module = $rest_module;
84
-        $this->rest_controller = $rest_api;
85
-        $this->rest_controller->setRequestedVersion($api_version);
86
-        $this->setUpRestServer();
87
-    }
68
+	/**
69
+	 * RestApiSpoofer constructor.
70
+	 *
71
+	 * @param WP_REST_Server        $wp_rest_server
72
+	 * @param EED_Core_Rest_Api $rest_module
73
+	 * @param Read                  $rest_api
74
+	 * @param string                $api_version
75
+	 */
76
+	public function __construct(
77
+		WP_REST_Server $wp_rest_server,
78
+		EED_Core_Rest_Api $rest_module,
79
+		Read $rest_api,
80
+		$api_version = '4.8.36'
81
+	) {
82
+		$this->wp_rest_server = $wp_rest_server;
83
+		$this->rest_module = $rest_module;
84
+		$this->rest_controller = $rest_api;
85
+		$this->rest_controller->setRequestedVersion($api_version);
86
+		$this->setUpRestServer();
87
+	}
88 88
 
89 89
 
90
-    private function setUpRestServer()
91
-    {
92
-        /* @var WP_REST_Server $wp_rest_server */
93
-        global $wp_rest_server;
94
-        $wp_rest_server = $this->wp_rest_server;
95
-        EED_Core_Rest_Api::set_hooks_both();
96
-        do_action('rest_api_init', $this->wp_rest_server);
97
-    }
90
+	private function setUpRestServer()
91
+	{
92
+		/* @var WP_REST_Server $wp_rest_server */
93
+		global $wp_rest_server;
94
+		$wp_rest_server = $this->wp_rest_server;
95
+		EED_Core_Rest_Api::set_hooks_both();
96
+		do_action('rest_api_init', $this->wp_rest_server);
97
+	}
98 98
 
99
-    /**
100
-     * @param EEM_Base $model
101
-     * @param array    $query_params
102
-     * @param string   $include
103
-     * @return array
104
-     * @throws EE_Error
105
-     * @throws InvalidArgumentException
106
-     * @throws InvalidDataTypeException
107
-     * @throws InvalidInterfaceException
108
-     * @throws ModelConfigurationException
109
-     * @throws ReflectionException
110
-     * @throws RestException
111
-     * @throws RestPasswordIncorrectException
112
-     * @throws RestPasswordRequiredException
113
-     * @throws UnexpectedEntityException
114
-     * @throws DomainException
115
-     * @since $VID:$
116
-     */
117
-    public function getOneApiResult(EEM_Base $model, array $query_params, $include = '')
118
-    {
119
-        if ( ! array_key_exists('limit', $query_params)) {
120
-            $query_params['limit'] = 1;
121
-        }
122
-        $result = $this->getApiResults($model, $query_params, $include);
123
-        return is_array($result) && isset($result[0]) ? $result[0] : [];
124
-    }
99
+	/**
100
+	 * @param EEM_Base $model
101
+	 * @param array    $query_params
102
+	 * @param string   $include
103
+	 * @return array
104
+	 * @throws EE_Error
105
+	 * @throws InvalidArgumentException
106
+	 * @throws InvalidDataTypeException
107
+	 * @throws InvalidInterfaceException
108
+	 * @throws ModelConfigurationException
109
+	 * @throws ReflectionException
110
+	 * @throws RestException
111
+	 * @throws RestPasswordIncorrectException
112
+	 * @throws RestPasswordRequiredException
113
+	 * @throws UnexpectedEntityException
114
+	 * @throws DomainException
115
+	 * @since $VID:$
116
+	 */
117
+	public function getOneApiResult(EEM_Base $model, array $query_params, $include = '')
118
+	{
119
+		if ( ! array_key_exists('limit', $query_params)) {
120
+			$query_params['limit'] = 1;
121
+		}
122
+		$result = $this->getApiResults($model, $query_params, $include);
123
+		return is_array($result) && isset($result[0]) ? $result[0] : [];
124
+	}
125 125
 
126
-    /**
127
-     * @param EEM_Base $model
128
-     * @param array    $query_params
129
-     * @param string   $include
130
-     * @return array
131
-     * @throws EE_Error
132
-     * @throws InvalidArgumentException
133
-     * @throws InvalidDataTypeException
134
-     * @throws InvalidInterfaceException
135
-     * @throws ModelConfigurationException
136
-     * @throws ReflectionException
137
-     * @throws RestException
138
-     * @throws RestPasswordIncorrectException
139
-     * @throws RestPasswordRequiredException
140
-     * @throws UnexpectedEntityException
141
-     * @throws DomainException
142
-     * @since $VID:$
143
-     */
144
-    public function getApiResults(EEM_Base $model, array $query_params, $include = '')
145
-    {
146
-        if (! array_key_exists('caps', $query_params)) {
147
-            $query_params['caps'] = EEM_Base::caps_read_admin;
148
-        }
149
-        /** @type array $results */
150
-        $results = $model->get_all_wpdb_results($query_params);
151
-        $rest_request = new WP_REST_Request();
152
-        $rest_request->set_param('include', $include);
153
-        $rest_request->set_param('caps', 'edit');
154
-        $nice_results = array();
155
-        foreach ($results as $result) {
156
-            $nice_results[] = $this->rest_controller->createEntityFromWpdbResult(
157
-                $model,
158
-                $result,
159
-                $rest_request
160
-            );
161
-        }
162
-        return $nice_results;
163
-    }
126
+	/**
127
+	 * @param EEM_Base $model
128
+	 * @param array    $query_params
129
+	 * @param string   $include
130
+	 * @return array
131
+	 * @throws EE_Error
132
+	 * @throws InvalidArgumentException
133
+	 * @throws InvalidDataTypeException
134
+	 * @throws InvalidInterfaceException
135
+	 * @throws ModelConfigurationException
136
+	 * @throws ReflectionException
137
+	 * @throws RestException
138
+	 * @throws RestPasswordIncorrectException
139
+	 * @throws RestPasswordRequiredException
140
+	 * @throws UnexpectedEntityException
141
+	 * @throws DomainException
142
+	 * @since $VID:$
143
+	 */
144
+	public function getApiResults(EEM_Base $model, array $query_params, $include = '')
145
+	{
146
+		if (! array_key_exists('caps', $query_params)) {
147
+			$query_params['caps'] = EEM_Base::caps_read_admin;
148
+		}
149
+		/** @type array $results */
150
+		$results = $model->get_all_wpdb_results($query_params);
151
+		$rest_request = new WP_REST_Request();
152
+		$rest_request->set_param('include', $include);
153
+		$rest_request->set_param('caps', 'edit');
154
+		$nice_results = array();
155
+		foreach ($results as $result) {
156
+			$nice_results[] = $this->rest_controller->createEntityFromWpdbResult(
157
+				$model,
158
+				$result,
159
+				$rest_request
160
+			);
161
+		}
162
+		return $nice_results;
163
+	}
164 164
 
165 165
 
166
-    /**
167
-     * @param string $endpoint
168
-     * @return array
169
-     * @throws EE_Error
170
-     * @since $VID:$
171
-     */
172
-    public function getModelSchema($endpoint)
173
-    {
174
-        $response = $this->wp_rest_server->dispatch(
175
-            new WP_REST_Request(
176
-                'OPTIONS',
177
-                "/ee/v4.8.36/{$endpoint}"
178
-            )
179
-        );
180
-        return $response->get_data();
181
-    }
166
+	/**
167
+	 * @param string $endpoint
168
+	 * @return array
169
+	 * @throws EE_Error
170
+	 * @since $VID:$
171
+	 */
172
+	public function getModelSchema($endpoint)
173
+	{
174
+		$response = $this->wp_rest_server->dispatch(
175
+			new WP_REST_Request(
176
+				'OPTIONS',
177
+				"/ee/v4.8.36/{$endpoint}"
178
+			)
179
+		);
180
+		return $response->get_data();
181
+	}
182 182
 }
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/model/Base.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -18,95 +18,95 @@
 block discarded – undo
18 18
 class Base extends Controller_Base
19 19
 {
20 20
 
21
-    /**
22
-     * Holds reference to the model version info, which knows the requested version
23
-     *
24
-     * @var ModelVersionInfo
25
-     */
26
-    protected $model_version_info;
21
+	/**
22
+	 * Holds reference to the model version info, which knows the requested version
23
+	 *
24
+	 * @var ModelVersionInfo
25
+	 */
26
+	protected $model_version_info;
27 27
 
28 28
 
29 29
 
30
-    /**
31
-     * Sets the version the user requested
32
-     *
33
-     * @param string $version eg '4.8'
34
-     */
35
-    public function setRequestedVersion($version)
36
-    {
37
-        parent::setRequestedVersion($version);
38
-        $this->model_version_info = new ModelVersionInfo($version);
39
-    }
30
+	/**
31
+	 * Sets the version the user requested
32
+	 *
33
+	 * @param string $version eg '4.8'
34
+	 */
35
+	public function setRequestedVersion($version)
36
+	{
37
+		parent::setRequestedVersion($version);
38
+		$this->model_version_info = new ModelVersionInfo($version);
39
+	}
40 40
 
41 41
 
42 42
 
43
-    /**
44
-     * Gets the object that should be used for getting any info from the models,
45
-     * because it's takes the requested and current core version into account
46
-     *
47
-     * @return ModelVersionInfo
48
-     * @throws EE_Error
49
-     */
50
-    public function getModelVersionInfo()
51
-    {
52
-        if (! $this->model_version_info) {
53
-            throw new EE_Error(
54
-                sprintf(
55
-                    __(
56
-                        'Cannot use model version info before setting the requested version in the controller',
57
-                        'event_espresso'
58
-                    )
59
-                )
60
-            );
61
-        }
62
-        return $this->model_version_info;
63
-    }
43
+	/**
44
+	 * Gets the object that should be used for getting any info from the models,
45
+	 * because it's takes the requested and current core version into account
46
+	 *
47
+	 * @return ModelVersionInfo
48
+	 * @throws EE_Error
49
+	 */
50
+	public function getModelVersionInfo()
51
+	{
52
+		if (! $this->model_version_info) {
53
+			throw new EE_Error(
54
+				sprintf(
55
+					__(
56
+						'Cannot use model version info before setting the requested version in the controller',
57
+						'event_espresso'
58
+					)
59
+				)
60
+			);
61
+		}
62
+		return $this->model_version_info;
63
+	}
64 64
 
65 65
 
66 66
 
67
-    /**
68
-     * Determines if $object is of one of the classes of $classes. Similar to
69
-     * in_array(), except this checks if $object is a subclass of the classnames provided
70
-     * in $classnames
71
-     *
72
-     * @param object $object
73
-     * @param array  $classnames
74
-     * @return boolean
75
-     */
76
-    public function isSubclassOfOne($object, $classnames)
77
-    {
78
-        foreach ($classnames as $classname) {
79
-            if (is_a($object, $classname)) {
80
-                return true;
81
-            }
82
-        }
83
-        return false;
84
-    }
67
+	/**
68
+	 * Determines if $object is of one of the classes of $classes. Similar to
69
+	 * in_array(), except this checks if $object is a subclass of the classnames provided
70
+	 * in $classnames
71
+	 *
72
+	 * @param object $object
73
+	 * @param array  $classnames
74
+	 * @return boolean
75
+	 */
76
+	public function isSubclassOfOne($object, $classnames)
77
+	{
78
+		foreach ($classnames as $classname) {
79
+			if (is_a($object, $classname)) {
80
+				return true;
81
+			}
82
+		}
83
+		return false;
84
+	}
85 85
 
86
-    /**
87
-     * Verifies the model name provided was valid. If so, returns the model (as an object). Otherwise, throws an
88
-     * exception. Must be called after `setRequestedVersion()`.
89
-     * @since 4.9.76.p
90
-     * @param $model_name
91
-     * @return EEM_Base
92
-     * @throws EE_Error
93
-     * @throws RestException
94
-     */
95
-    protected function validateModel($model_name)
96
-    {
97
-        if (! $this->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
98
-            throw new RestException(
99
-                'endpoint_parsing_error',
100
-                sprintf(
101
-                    __(
102
-                        'There is no model for endpoint %s. Please contact event espresso support',
103
-                        'event_espresso'
104
-                    ),
105
-                    $model_name
106
-                )
107
-            );
108
-        }
109
-        return $this->getModelVersionInfo()->loadModel($model_name);
110
-    }
86
+	/**
87
+	 * Verifies the model name provided was valid. If so, returns the model (as an object). Otherwise, throws an
88
+	 * exception. Must be called after `setRequestedVersion()`.
89
+	 * @since 4.9.76.p
90
+	 * @param $model_name
91
+	 * @return EEM_Base
92
+	 * @throws EE_Error
93
+	 * @throws RestException
94
+	 */
95
+	protected function validateModel($model_name)
96
+	{
97
+		if (! $this->getModelVersionInfo()->isModelNameInThisVersion($model_name)) {
98
+			throw new RestException(
99
+				'endpoint_parsing_error',
100
+				sprintf(
101
+					__(
102
+						'There is no model for endpoint %s. Please contact event espresso support',
103
+						'event_espresso'
104
+					),
105
+					$model_name
106
+				)
107
+			);
108
+		}
109
+		return $this->getModelVersionInfo()->loadModel($model_name);
110
+	}
111 111
 }
112 112
 // End of file Base.php
Please login to merge, or discard this patch.
core/entities/models/JsonModelSchema.php 1 patch
Indentation   +234 added lines, -234 removed lines patch added patch discarded remove patch
@@ -25,255 +25,255 @@
 block discarded – undo
25 25
 class JsonModelSchema
26 26
 {
27 27
 
28
-    /**
29
-     * @var EEM_Base
30
-     */
31
-    protected $model;
28
+	/**
29
+	 * @var EEM_Base
30
+	 */
31
+	protected $model;
32 32
 
33
-    /**
34
-     * @var CalculatedModelFields
35
-     */
36
-    protected $fields_calculator;
33
+	/**
34
+	 * @var CalculatedModelFields
35
+	 */
36
+	protected $fields_calculator;
37 37
 
38 38
 
39
-    /**
40
-     * JsonModelSchema constructor.
41
-     *
42
-     * @param EEM_Base              $model
43
-     * @param CalculatedModelFields $fields_calculator
44
-     */
45
-    public function __construct(EEM_Base $model, CalculatedModelFields $fields_calculator)
46
-    {
47
-        $this->model = $model;
48
-        $this->fields_calculator = $fields_calculator;
49
-    }
39
+	/**
40
+	 * JsonModelSchema constructor.
41
+	 *
42
+	 * @param EEM_Base              $model
43
+	 * @param CalculatedModelFields $fields_calculator
44
+	 */
45
+	public function __construct(EEM_Base $model, CalculatedModelFields $fields_calculator)
46
+	{
47
+		$this->model = $model;
48
+		$this->fields_calculator = $fields_calculator;
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * Return the schema for a given model from a given model.
54
-     *
55
-     * @return array
56
-     */
57
-    public function getModelSchema()
58
-    {
59
-        return $this->getModelSchemaForRelations(
60
-            $this->model->relation_settings(),
61
-            $this->getModelSchemaForFields(
62
-                $this->model->field_settings(),
63
-                $this->getInitialSchemaStructure()
64
-            )
65
-        );
66
-    }
52
+	/**
53
+	 * Return the schema for a given model from a given model.
54
+	 *
55
+	 * @return array
56
+	 */
57
+	public function getModelSchema()
58
+	{
59
+		return $this->getModelSchemaForRelations(
60
+			$this->model->relation_settings(),
61
+			$this->getModelSchemaForFields(
62
+				$this->model->field_settings(),
63
+				$this->getInitialSchemaStructure()
64
+			)
65
+		);
66
+	}
67 67
 
68 68
 
69
-    /**
70
-     * Get the schema for a given set of model fields.
71
-     *
72
-     * @param EE_Model_Field_Base[] $model_fields
73
-     * @param array                  $schema
74
-     * @return array
75
-     */
76
-    public function getModelSchemaForFields(array $model_fields, array $schema)
77
-    {
78
-        foreach ($model_fields as $field => $model_field) {
79
-            if (! $model_field instanceof EE_Model_Field_Base) {
80
-                continue;
81
-            }
82
-            $schema['properties'][ $field ] = $model_field->getSchema();
69
+	/**
70
+	 * Get the schema for a given set of model fields.
71
+	 *
72
+	 * @param EE_Model_Field_Base[] $model_fields
73
+	 * @param array                  $schema
74
+	 * @return array
75
+	 */
76
+	public function getModelSchemaForFields(array $model_fields, array $schema)
77
+	{
78
+		foreach ($model_fields as $field => $model_field) {
79
+			if (! $model_field instanceof EE_Model_Field_Base) {
80
+				continue;
81
+			}
82
+			$schema['properties'][ $field ] = $model_field->getSchema();
83 83
 
84
-            // if this is a primary key field add the primary key item
85
-            if ($model_field instanceof EE_Primary_Key_Field_Base) {
86
-                $schema['properties'][ $field ]['primary_key'] = true;
87
-                if ($model_field instanceof EE_Primary_Key_Int_Field) {
88
-                    $schema['properties'][ $field ]['readonly'] = true;
89
-                }
90
-            }
84
+			// if this is a primary key field add the primary key item
85
+			if ($model_field instanceof EE_Primary_Key_Field_Base) {
86
+				$schema['properties'][ $field ]['primary_key'] = true;
87
+				if ($model_field instanceof EE_Primary_Key_Int_Field) {
88
+					$schema['properties'][ $field ]['readonly'] = true;
89
+				}
90
+			}
91 91
 
92
-            // if this is a foreign key field add the foreign key item
93
-            if ($model_field instanceof EE_Foreign_Key_Field_Base) {
94
-                $schema['properties'][ $field ]['foreign_key'] = array(
95
-                    'description' => esc_html__(
96
-                        'This is a foreign key the points to the given models.',
97
-                        'event_espresso'
98
-                    ),
99
-                    'type'        => 'array',
100
-                    'enum'        => $model_field->get_model_class_names_pointed_to(),
101
-                );
102
-            }
103
-        }
104
-        return $schema;
105
-    }
92
+			// if this is a foreign key field add the foreign key item
93
+			if ($model_field instanceof EE_Foreign_Key_Field_Base) {
94
+				$schema['properties'][ $field ]['foreign_key'] = array(
95
+					'description' => esc_html__(
96
+						'This is a foreign key the points to the given models.',
97
+						'event_espresso'
98
+					),
99
+					'type'        => 'array',
100
+					'enum'        => $model_field->get_model_class_names_pointed_to(),
101
+				);
102
+			}
103
+		}
104
+		return $schema;
105
+	}
106 106
 
107 107
 
108
-    /**
109
-     * Get the schema for a given set of model relations
110
-     *
111
-     * @param EE_Model_Relation_Base[] $relations_on_model
112
-     * @param array                    $schema
113
-     * @return array
114
-     */
115
-    public function getModelSchemaForRelations(array $relations_on_model, array $schema)
116
-    {
117
-        foreach ($relations_on_model as $model_name => $relation) {
118
-            if (! $relation instanceof EE_Model_Relation_Base) {
119
-                continue;
120
-            }
121
-            $model_name_for_schema = $relation instanceof EE_Belongs_To_Relation
122
-                ? strtolower($model_name)
123
-                : EEH_Inflector::pluralize_and_lower($model_name);
124
-            $schema['properties'][ $model_name_for_schema ] = $relation->getSchema();
125
-            $schema['properties'][ $model_name_for_schema ]['relation_model'] = $model_name;
108
+	/**
109
+	 * Get the schema for a given set of model relations
110
+	 *
111
+	 * @param EE_Model_Relation_Base[] $relations_on_model
112
+	 * @param array                    $schema
113
+	 * @return array
114
+	 */
115
+	public function getModelSchemaForRelations(array $relations_on_model, array $schema)
116
+	{
117
+		foreach ($relations_on_model as $model_name => $relation) {
118
+			if (! $relation instanceof EE_Model_Relation_Base) {
119
+				continue;
120
+			}
121
+			$model_name_for_schema = $relation instanceof EE_Belongs_To_Relation
122
+				? strtolower($model_name)
123
+				: EEH_Inflector::pluralize_and_lower($model_name);
124
+			$schema['properties'][ $model_name_for_schema ] = $relation->getSchema();
125
+			$schema['properties'][ $model_name_for_schema ]['relation_model'] = $model_name;
126 126
 
127
-            // links schema
128
-            $links_key = 'https://api.eventespresso.com/' . strtolower($model_name);
129
-            $schema['properties']['_links']['properties'][ $links_key ] = array(
130
-                'description' => esc_html__(
131
-                    'Array of objects describing the link(s) for this relation resource.',
132
-                    'event_espresso'
133
-                ),
134
-                'type' => 'array',
135
-                'readonly' => true,
136
-                'items' => array(
137
-                    'type' => 'object',
138
-                    'properties' => array(
139
-                        'href' => array(
140
-                            'type' => 'string',
141
-                            'description' => sprintf(
142
-                                // translators: placeholder is the model name for the relation.
143
-                                esc_html__(
144
-                                    'The link to the resource for the %s relation(s) to this entity',
145
-                                    'event_espresso'
146
-                                ),
147
-                                $model_name
148
-                            ),
149
-                        ),
150
-                        'single' => array(
151
-                            'type' => 'boolean',
152
-                            'description' => sprintf(
153
-                                // translators: placeholder is the model name for the relation.
154
-                                esc_html__(
155
-                                    'Whether or not there is only a single %s relation to this entity',
156
-                                    'event_espresso'
157
-                                ),
158
-                                $model_name
159
-                            ),
160
-                        ),
161
-                    ),
162
-                    'additionalProperties' => false
163
-                ),
164
-            );
165
-        }
166
-        return $schema;
167
-    }
127
+			// links schema
128
+			$links_key = 'https://api.eventespresso.com/' . strtolower($model_name);
129
+			$schema['properties']['_links']['properties'][ $links_key ] = array(
130
+				'description' => esc_html__(
131
+					'Array of objects describing the link(s) for this relation resource.',
132
+					'event_espresso'
133
+				),
134
+				'type' => 'array',
135
+				'readonly' => true,
136
+				'items' => array(
137
+					'type' => 'object',
138
+					'properties' => array(
139
+						'href' => array(
140
+							'type' => 'string',
141
+							'description' => sprintf(
142
+								// translators: placeholder is the model name for the relation.
143
+								esc_html__(
144
+									'The link to the resource for the %s relation(s) to this entity',
145
+									'event_espresso'
146
+								),
147
+								$model_name
148
+							),
149
+						),
150
+						'single' => array(
151
+							'type' => 'boolean',
152
+							'description' => sprintf(
153
+								// translators: placeholder is the model name for the relation.
154
+								esc_html__(
155
+									'Whether or not there is only a single %s relation to this entity',
156
+									'event_espresso'
157
+								),
158
+								$model_name
159
+							),
160
+						),
161
+					),
162
+					'additionalProperties' => false
163
+				),
164
+			);
165
+		}
166
+		return $schema;
167
+	}
168 168
 
169 169
 
170
-    /**
171
-     * Outputs the schema header for a model.
172
-     *
173
-     * @return array
174
-     */
175
-    public function getInitialSchemaStructure()
176
-    {
177
-        return array(
178
-            '$schema'    => 'http://json-schema.org/draft-04/schema#',
179
-            'title'      => $this->model->get_this_model_name(),
180
-            'type'       => 'object',
181
-            'properties' => array(
182
-                'link' => array(
183
-                    'description' => esc_html__(
184
-                        'Link to event on WordPress site hosting events.',
185
-                        'event_espresso'
186
-                    ),
187
-                    'type' => 'string',
188
-                    'readonly' => true,
189
-                ),
190
-                '_links' => array(
191
-                    'description' => esc_html__(
192
-                        'Various links for resources related to the entity.',
193
-                        'event_espresso'
194
-                    ),
195
-                    'type' => 'object',
196
-                    'readonly' => true,
197
-                    'properties' => array(
198
-                        'self' => array(
199
-                            'description' => esc_html__(
200
-                                'Link to this entities resource.',
201
-                                'event_espresso'
202
-                            ),
203
-                            'type' => 'array',
204
-                            'items' => array(
205
-                                'type' => 'object',
206
-                                'properties' => array(
207
-                                    'href' => array(
208
-                                        'type' => 'string',
209
-                                    ),
210
-                                ),
211
-                                'additionalProperties' => false
212
-                            ),
213
-                            'readonly' => true
214
-                        ),
215
-                        'collection' => array(
216
-                            'description' => esc_html__(
217
-                                'Link to this entities collection resource.',
218
-                                'event_espresso'
219
-                            ),
220
-                            'type' => 'array',
221
-                            'items' => array(
222
-                                'type' => 'object',
223
-                                'properties' => array(
224
-                                    'href' => array(
225
-                                        'type' => 'string'
226
-                                    ),
227
-                                ),
228
-                                'additionalProperties' => false
229
-                            ),
230
-                            'readonly' => true
231
-                        ),
232
-                    ),
233
-                    'additionalProperties' => false,
234
-                ),
235
-                '_calculated_fields' => array_merge(
236
-                    $this->fields_calculator->getJsonSchemaForModel($this->model),
237
-                    array(
238
-                        '_protected' => $this->getProtectedFieldsSchema()
239
-                    )
240
-                ),
241
-                '_protected' => $this->getProtectedFieldsSchema()
242
-            ),
243
-            'additionalProperties' => false,
244
-        );
245
-    }
170
+	/**
171
+	 * Outputs the schema header for a model.
172
+	 *
173
+	 * @return array
174
+	 */
175
+	public function getInitialSchemaStructure()
176
+	{
177
+		return array(
178
+			'$schema'    => 'http://json-schema.org/draft-04/schema#',
179
+			'title'      => $this->model->get_this_model_name(),
180
+			'type'       => 'object',
181
+			'properties' => array(
182
+				'link' => array(
183
+					'description' => esc_html__(
184
+						'Link to event on WordPress site hosting events.',
185
+						'event_espresso'
186
+					),
187
+					'type' => 'string',
188
+					'readonly' => true,
189
+				),
190
+				'_links' => array(
191
+					'description' => esc_html__(
192
+						'Various links for resources related to the entity.',
193
+						'event_espresso'
194
+					),
195
+					'type' => 'object',
196
+					'readonly' => true,
197
+					'properties' => array(
198
+						'self' => array(
199
+							'description' => esc_html__(
200
+								'Link to this entities resource.',
201
+								'event_espresso'
202
+							),
203
+							'type' => 'array',
204
+							'items' => array(
205
+								'type' => 'object',
206
+								'properties' => array(
207
+									'href' => array(
208
+										'type' => 'string',
209
+									),
210
+								),
211
+								'additionalProperties' => false
212
+							),
213
+							'readonly' => true
214
+						),
215
+						'collection' => array(
216
+							'description' => esc_html__(
217
+								'Link to this entities collection resource.',
218
+								'event_espresso'
219
+							),
220
+							'type' => 'array',
221
+							'items' => array(
222
+								'type' => 'object',
223
+								'properties' => array(
224
+									'href' => array(
225
+										'type' => 'string'
226
+									),
227
+								),
228
+								'additionalProperties' => false
229
+							),
230
+							'readonly' => true
231
+						),
232
+					),
233
+					'additionalProperties' => false,
234
+				),
235
+				'_calculated_fields' => array_merge(
236
+					$this->fields_calculator->getJsonSchemaForModel($this->model),
237
+					array(
238
+						'_protected' => $this->getProtectedFieldsSchema()
239
+					)
240
+				),
241
+				'_protected' => $this->getProtectedFieldsSchema()
242
+			),
243
+			'additionalProperties' => false,
244
+		);
245
+	}
246 246
 
247
-    /**
248
-     * Returns an array of JSON schema to describe the _protected property on responses
249
-     * @since 4.9.74.p
250
-     * @return array
251
-     */
252
-    protected function getProtectedFieldsSchema()
253
-    {
254
-        return array(
255
-            'description' => esc_html__('Array of property names whose values were replaced with their default (because they are related to a password-protected entity.)', 'event_espresso'),
256
-            'type' => 'array',
257
-            'items' => array(
258
-                'description' => esc_html__('Each name corresponds to a property that is protected by password for this entity and has its default value returned in the response.', 'event_espresso'),
259
-                'type' => 'string',
260
-                'readonly' => true,
261
-            ),
262
-            'readonly' => true
263
-        );
264
-    }
247
+	/**
248
+	 * Returns an array of JSON schema to describe the _protected property on responses
249
+	 * @since 4.9.74.p
250
+	 * @return array
251
+	 */
252
+	protected function getProtectedFieldsSchema()
253
+	{
254
+		return array(
255
+			'description' => esc_html__('Array of property names whose values were replaced with their default (because they are related to a password-protected entity.)', 'event_espresso'),
256
+			'type' => 'array',
257
+			'items' => array(
258
+				'description' => esc_html__('Each name corresponds to a property that is protected by password for this entity and has its default value returned in the response.', 'event_espresso'),
259
+				'type' => 'string',
260
+				'readonly' => true,
261
+			),
262
+			'readonly' => true
263
+		);
264
+	}
265 265
 
266 266
 
267
-    /**
268
-     * Allows one to just use the object as a string to get the json.
269
-     * eg.
270
-     * $json_schema = new JsonModelSchema(EEM_Event::instance(), new CalculatedModelFields);
271
-     * echo $json_schema; //outputs the schema as a json formatted string.
272
-     *
273
-     * @return string
274
-     */
275
-    public function __toString()
276
-    {   $schema = wp_json_encode($this->getModelSchema());
277
-        return is_string($schema) ? $schema : '';
278
-    }
267
+	/**
268
+	 * Allows one to just use the object as a string to get the json.
269
+	 * eg.
270
+	 * $json_schema = new JsonModelSchema(EEM_Event::instance(), new CalculatedModelFields);
271
+	 * echo $json_schema; //outputs the schema as a json formatted string.
272
+	 *
273
+	 * @return string
274
+	 */
275
+	public function __toString()
276
+	{   $schema = wp_json_encode($this->getModelSchema());
277
+		return is_string($schema) ? $schema : '';
278
+	}
279 279
 }
Please login to merge, or discard this patch.
core/EE_Dependency_Map.core.php 2 patches
Indentation   +1146 added lines, -1146 removed lines patch added patch discarded remove patch
@@ -20,1150 +20,1150 @@
 block discarded – undo
20 20
 class EE_Dependency_Map
21 21
 {
22 22
 
23
-    /**
24
-     * This means that the requested class dependency is not present in the dependency map
25
-     */
26
-    const not_registered = 0;
27
-
28
-    /**
29
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
-     */
31
-    const load_new_object = 1;
32
-
33
-    /**
34
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
-     */
37
-    const load_from_cache = 2;
38
-
39
-    /**
40
-     * When registering a dependency,
41
-     * this indicates to keep any existing dependencies that already exist,
42
-     * and simply discard any new dependencies declared in the incoming data
43
-     */
44
-    const KEEP_EXISTING_DEPENDENCIES = 0;
45
-
46
-    /**
47
-     * When registering a dependency,
48
-     * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
-     */
50
-    const OVERWRITE_DEPENDENCIES = 1;
51
-
52
-
53
-    /**
54
-     * @type EE_Dependency_Map $_instance
55
-     */
56
-    protected static $_instance;
57
-
58
-    /**
59
-     * @var ClassInterfaceCache $class_cache
60
-     */
61
-    private $class_cache;
62
-
63
-    /**
64
-     * @type RequestInterface $request
65
-     */
66
-    protected $request;
67
-
68
-    /**
69
-     * @type LegacyRequestInterface $legacy_request
70
-     */
71
-    protected $legacy_request;
72
-
73
-    /**
74
-     * @type ResponseInterface $response
75
-     */
76
-    protected $response;
77
-
78
-    /**
79
-     * @type LoaderInterface $loader
80
-     */
81
-    protected $loader;
82
-
83
-    /**
84
-     * @type array $_dependency_map
85
-     */
86
-    protected $_dependency_map = array();
87
-
88
-    /**
89
-     * @type array $_class_loaders
90
-     */
91
-    protected $_class_loaders = array();
92
-
93
-
94
-    /**
95
-     * EE_Dependency_Map constructor.
96
-     *
97
-     * @param ClassInterfaceCache $class_cache
98
-     */
99
-    protected function __construct(ClassInterfaceCache $class_cache)
100
-    {
101
-        $this->class_cache = $class_cache;
102
-        do_action('EE_Dependency_Map____construct', $this);
103
-    }
104
-
105
-
106
-    /**
107
-     * @return void
108
-     */
109
-    public function initialize()
110
-    {
111
-        $this->_register_core_dependencies();
112
-        $this->_register_core_class_loaders();
113
-        $this->_register_core_aliases();
114
-    }
115
-
116
-
117
-    /**
118
-     * @singleton method used to instantiate class object
119
-     * @param ClassInterfaceCache|null $class_cache
120
-     * @return EE_Dependency_Map
121
-     */
122
-    public static function instance(ClassInterfaceCache $class_cache = null)
123
-    {
124
-        // check if class object is instantiated, and instantiated properly
125
-        if (! self::$_instance instanceof EE_Dependency_Map
126
-            && $class_cache instanceof ClassInterfaceCache
127
-        ) {
128
-            self::$_instance = new EE_Dependency_Map($class_cache);
129
-        }
130
-        return self::$_instance;
131
-    }
132
-
133
-
134
-    /**
135
-     * @param RequestInterface $request
136
-     */
137
-    public function setRequest(RequestInterface $request)
138
-    {
139
-        $this->request = $request;
140
-    }
141
-
142
-
143
-    /**
144
-     * @param LegacyRequestInterface $legacy_request
145
-     */
146
-    public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
-    {
148
-        $this->legacy_request = $legacy_request;
149
-    }
150
-
151
-
152
-    /**
153
-     * @param ResponseInterface $response
154
-     */
155
-    public function setResponse(ResponseInterface $response)
156
-    {
157
-        $this->response = $response;
158
-    }
159
-
160
-
161
-    /**
162
-     * @param LoaderInterface $loader
163
-     */
164
-    public function setLoader(LoaderInterface $loader)
165
-    {
166
-        $this->loader = $loader;
167
-    }
168
-
169
-
170
-    /**
171
-     * @param string $class
172
-     * @param array  $dependencies
173
-     * @param int    $overwrite
174
-     * @return bool
175
-     */
176
-    public static function register_dependencies(
177
-        $class,
178
-        array $dependencies,
179
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
-    ) {
181
-        return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
-    }
183
-
184
-
185
-    /**
186
-     * Assigns an array of class names and corresponding load sources (new or cached)
187
-     * to the class specified by the first parameter.
188
-     * IMPORTANT !!!
189
-     * The order of elements in the incoming $dependencies array MUST match
190
-     * the order of the constructor parameters for the class in question.
191
-     * This is especially important when overriding any existing dependencies that are registered.
192
-     * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
-     *
194
-     * @param string $class
195
-     * @param array  $dependencies
196
-     * @param int    $overwrite
197
-     * @return bool
198
-     */
199
-    public function registerDependencies(
200
-        $class,
201
-        array $dependencies,
202
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
-    ) {
204
-        $class = trim($class, '\\');
205
-        $registered = false;
206
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
207
-            self::$_instance->_dependency_map[ $class ] = array();
208
-        }
209
-        // we need to make sure that any aliases used when registering a dependency
210
-        // get resolved to the correct class name
211
-        foreach ($dependencies as $dependency => $load_source) {
212
-            $alias = self::$_instance->getFqnForAlias($dependency);
213
-            if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
-            ) {
216
-                unset($dependencies[ $dependency ]);
217
-                $dependencies[ $alias ] = $load_source;
218
-                $registered = true;
219
-            }
220
-        }
221
-        // now add our two lists of dependencies together.
222
-        // using Union (+=) favours the arrays in precedence from left to right,
223
-        // so $dependencies is NOT overwritten because it is listed first
224
-        // ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
-        // Union is way faster than array_merge() but should be used with caution...
226
-        // especially with numerically indexed arrays
227
-        $dependencies += self::$_instance->_dependency_map[ $class ];
228
-        // now we need to ensure that the resulting dependencies
229
-        // array only has the entries that are required for the class
230
-        // so first count how many dependencies were originally registered for the class
231
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
-        // if that count is non-zero (meaning dependencies were already registered)
233
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
234
-            // then truncate the  final array to match that count
235
-            ? array_slice($dependencies, 0, $dependency_count)
236
-            // otherwise just take the incoming array because nothing previously existed
237
-            : $dependencies;
238
-        return $registered;
239
-    }
240
-
241
-
242
-    /**
243
-     * @param string $class_name
244
-     * @param string $loader
245
-     * @return bool
246
-     * @throws DomainException
247
-     */
248
-    public static function register_class_loader($class_name, $loader = 'load_core')
249
-    {
250
-        if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
-            throw new DomainException(
252
-                esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
-            );
254
-        }
255
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
256
-        if (! is_callable($loader)
257
-            && (
258
-                strpos($loader, 'load_') !== 0
259
-                || ! method_exists('EE_Registry', $loader)
260
-            )
261
-        ) {
262
-            throw new DomainException(
263
-                sprintf(
264
-                    esc_html__(
265
-                        '"%1$s" is not a valid loader method on EE_Registry.',
266
-                        'event_espresso'
267
-                    ),
268
-                    $loader
269
-                )
270
-            );
271
-        }
272
-        $class_name = self::$_instance->getFqnForAlias($class_name);
273
-        if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
-            self::$_instance->_class_loaders[ $class_name ] = $loader;
275
-            return true;
276
-        }
277
-        return false;
278
-    }
279
-
280
-
281
-    /**
282
-     * @return array
283
-     */
284
-    public function dependency_map()
285
-    {
286
-        return $this->_dependency_map;
287
-    }
288
-
289
-
290
-    /**
291
-     * returns TRUE if dependency map contains a listing for the provided class name
292
-     *
293
-     * @param string $class_name
294
-     * @return boolean
295
-     */
296
-    public function has($class_name = '')
297
-    {
298
-        // all legacy models have the same dependencies
299
-        if (strpos($class_name, 'EEM_') === 0) {
300
-            $class_name = 'LEGACY_MODELS';
301
-        }
302
-        return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
-    }
304
-
305
-
306
-    /**
307
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
-     *
309
-     * @param string $class_name
310
-     * @param string $dependency
311
-     * @return bool
312
-     */
313
-    public function has_dependency_for_class($class_name = '', $dependency = '')
314
-    {
315
-        // all legacy models have the same dependencies
316
-        if (strpos($class_name, 'EEM_') === 0) {
317
-            $class_name = 'LEGACY_MODELS';
318
-        }
319
-        $dependency = $this->getFqnForAlias($dependency, $class_name);
320
-        return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
-            ? true
322
-            : false;
323
-    }
324
-
325
-
326
-    /**
327
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
-     *
329
-     * @param string $class_name
330
-     * @param string $dependency
331
-     * @return int
332
-     */
333
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
-    {
335
-        // all legacy models have the same dependencies
336
-        if (strpos($class_name, 'EEM_') === 0) {
337
-            $class_name = 'LEGACY_MODELS';
338
-        }
339
-        $dependency = $this->getFqnForAlias($dependency);
340
-        return $this->has_dependency_for_class($class_name, $dependency)
341
-            ? $this->_dependency_map[ $class_name ][ $dependency ]
342
-            : EE_Dependency_Map::not_registered;
343
-    }
344
-
345
-
346
-    /**
347
-     * @param string $class_name
348
-     * @return string | Closure
349
-     */
350
-    public function class_loader($class_name)
351
-    {
352
-        // all legacy models use load_model()
353
-        if (strpos($class_name, 'EEM_') === 0) {
354
-            return 'load_model';
355
-        }
356
-        // EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc
357
-        // perform strpos() first to avoid loading regex every time we load a class
358
-        if (strpos($class_name, 'EE_CPT_') === 0
359
-            && preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name)
360
-        ) {
361
-            return 'load_core';
362
-        }
363
-        $class_name = $this->getFqnForAlias($class_name);
364
-        return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
365
-    }
366
-
367
-
368
-    /**
369
-     * @return array
370
-     */
371
-    public function class_loaders()
372
-    {
373
-        return $this->_class_loaders;
374
-    }
375
-
376
-
377
-    /**
378
-     * adds an alias for a classname
379
-     *
380
-     * @param string $fqcn      the class name that should be used (concrete class to replace interface)
381
-     * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
382
-     * @param string $for_class the class that has the dependency (is type hinting for the interface)
383
-     */
384
-    public function add_alias($fqcn, $alias, $for_class = '')
385
-    {
386
-        $this->class_cache->addAlias($fqcn, $alias, $for_class);
387
-    }
388
-
389
-
390
-    /**
391
-     * Returns TRUE if the provided fully qualified name IS an alias
392
-     * WHY?
393
-     * Because if a class is type hinting for a concretion,
394
-     * then why would we need to find another class to supply it?
395
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
396
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
397
-     * Don't go looking for some substitute.
398
-     * Whereas if a class is type hinting for an interface...
399
-     * then we need to find an actual class to use.
400
-     * So the interface IS the alias for some other FQN,
401
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
402
-     * represents some other class.
403
-     *
404
-     * @param string $fqn
405
-     * @param string $for_class
406
-     * @return bool
407
-     */
408
-    public function isAlias($fqn = '', $for_class = '')
409
-    {
410
-        return $this->class_cache->isAlias($fqn, $for_class);
411
-    }
412
-
413
-
414
-    /**
415
-     * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
416
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
417
-     *  for example:
418
-     *      if the following two entries were added to the _aliases array:
419
-     *          array(
420
-     *              'interface_alias'           => 'some\namespace\interface'
421
-     *              'some\namespace\interface'  => 'some\namespace\classname'
422
-     *          )
423
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
424
-     *      to load an instance of 'some\namespace\classname'
425
-     *
426
-     * @param string $alias
427
-     * @param string $for_class
428
-     * @return string
429
-     */
430
-    public function getFqnForAlias($alias = '', $for_class = '')
431
-    {
432
-        return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
433
-    }
434
-
435
-
436
-    /**
437
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
438
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
439
-     * This is done by using the following class constants:
440
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
441
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
442
-     */
443
-    protected function _register_core_dependencies()
444
-    {
445
-        $this->_dependency_map = array(
446
-            'EE_Request_Handler'                                                                                          => array(
447
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
448
-            ),
449
-            'EE_System'                                                                                                   => array(
450
-                'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
451
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
452
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
453
-                'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
454
-            ),
455
-            'EE_Session'                                                                                                  => array(
456
-                'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
457
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
458
-                'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
459
-                'EventEspresso\core\services\session\SessionStartHandler'  => EE_Dependency_Map::load_from_cache,
460
-                'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
461
-            ),
462
-            'EE_Cart'                                                                                                     => array(
463
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
464
-            ),
465
-            'EE_Front_Controller'                                                                                         => array(
466
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
467
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
468
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
469
-            ),
470
-            'EE_Messenger_Collection_Loader'                                                                              => array(
471
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
472
-            ),
473
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
474
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
475
-            ),
476
-            'EE_Message_Resource_Manager'                                                                                 => array(
477
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
478
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
479
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
480
-            ),
481
-            'EE_Message_Factory'                                                                                          => array(
482
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
483
-            ),
484
-            'EE_messages'                                                                                                 => array(
485
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
486
-            ),
487
-            'EE_Messages_Generator'                                                                                       => array(
488
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
489
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
490
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
491
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
492
-            ),
493
-            'EE_Messages_Processor'                                                                                       => array(
494
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
495
-            ),
496
-            'EE_Messages_Queue'                                                                                           => array(
497
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
498
-            ),
499
-            'EE_Messages_Template_Defaults'                                                                               => array(
500
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
501
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
502
-            ),
503
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
504
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
505
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
506
-            ),
507
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
508
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
509
-            ),
510
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
511
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
512
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
513
-            ),
514
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
515
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
516
-            ),
517
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
518
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
519
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
520
-            ),
521
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
522
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
523
-            ),
524
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
525
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
526
-            ),
527
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
528
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
529
-            ),
530
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
531
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
532
-            ),
533
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
534
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
535
-            ),
536
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
537
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
538
-            ),
539
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
540
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
541
-            ),
542
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
543
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
544
-            ),
545
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
546
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
547
-            ),
548
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
549
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
550
-            ),
551
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
552
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
553
-            ),
554
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
555
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
556
-            ),
557
-            'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
558
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
559
-            ),
560
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
561
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
562
-            ),
563
-            'EE_Data_Migration_Class_Base'                                                                                => array(
564
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
-            ),
567
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
568
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
-            ),
571
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
572
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
-            ),
575
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
576
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
-            ),
579
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
580
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
-            ),
583
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
584
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
-            ),
587
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
588
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
-            ),
591
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
592
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
-            ),
595
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
596
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
597
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
598
-            ),
599
-            'EE_DMS_Core_4_9_0' => array(
600
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
601
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
602
-            ),
603
-            'EE_DMS_Core_4_10_0' => array(
604
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
605
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
606
-                'EE_DMS_Core_4_9_0'                                  => EE_Dependency_Map::load_from_cache,
607
-            ),
608
-            'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
609
-                array(),
610
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
611
-            ),
612
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
613
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
614
-                'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
615
-            ),
616
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
617
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
618
-            ),
619
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
620
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
621
-            ),
622
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
623
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
624
-            ),
625
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
626
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
627
-            ),
628
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
629
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
630
-            ),
631
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
632
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
633
-            ),
634
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
635
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
636
-            ),
637
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
638
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
639
-            ),
640
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
641
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
642
-            ),
643
-            'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
644
-                'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
645
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
646
-            ),
647
-            'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
648
-                null,
649
-                'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
650
-            ),
651
-            'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
652
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
653
-            ),
654
-            'LEGACY_MODELS'                                                                                               => array(
655
-                null,
656
-                'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
657
-            ),
658
-            'EE_Module_Request_Router'                                                                                    => array(
659
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
660
-            ),
661
-            'EE_Registration_Processor'                                                                                   => array(
662
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
663
-            ),
664
-            'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
665
-                null,
666
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
667
-                'EventEspresso\core\services\request\Request'                         => EE_Dependency_Map::load_from_cache,
668
-            ),
669
-            'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
670
-                'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
671
-                'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
672
-            ),
673
-            'EE_Admin_Transactions_List_Table'                                                                            => array(
674
-                null,
675
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
676
-            ),
677
-            'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
678
-                'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
679
-                'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
680
-                'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
681
-            ),
682
-            'EventEspresso\core\domain\services\pue\Config'                                                               => array(
683
-                'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
684
-                'EE_Config'         => EE_Dependency_Map::load_from_cache,
685
-            ),
686
-            'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
687
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
688
-                'EEM_Event'          => EE_Dependency_Map::load_from_cache,
689
-                'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
690
-                'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
691
-                'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
692
-                'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
693
-                'EE_Config'          => EE_Dependency_Map::load_from_cache,
694
-            ),
695
-            'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
696
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
697
-            ),
698
-            'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
699
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
700
-            ),
701
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
702
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
703
-                'EE_Session'             => EE_Dependency_Map::load_from_cache,
704
-            ),
705
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
706
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
707
-            ),
708
-            'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
709
-                'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
710
-                'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
711
-                'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
712
-                'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
713
-                'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
714
-            ),
715
-            'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
716
-                'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
717
-            ),
718
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
719
-                'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
720
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
721
-            ),
722
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
723
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
724
-            ),
725
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
726
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
727
-            ),
728
-            'EE_CPT_Strategy'                                                                                             => array(
729
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
730
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
731
-            ),
732
-            'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
733
-                'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
734
-            ),
735
-            'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
736
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
737
-                'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
738
-                'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
739
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
740
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
741
-            ),
742
-            'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
743
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
744
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
745
-            ),
746
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array(
747
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
748
-            ),
749
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array(
750
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
751
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache
752
-            ),
753
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array(
754
-                'EEM_Checkin' => EE_Dependency_Map::load_from_cache,
755
-            ),
756
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array(
757
-                'EEM_Registration' => EE_Dependency_Map::load_from_cache,
758
-            ),
759
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array(
760
-                'EEM_Transaction' => EE_Dependency_Map::load_from_cache,
761
-            ),
762
-            'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array(
763
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
764
-            ),
765
-            'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array(
766
-                'EEM_Answer' => EE_Dependency_Map::load_from_cache,
767
-                'EEM_Question' => EE_Dependency_Map::load_from_cache,
768
-            ),
769
-            'EventEspresso\core\CPTs\CptQueryModifier' => array(
770
-                null,
771
-                null,
772
-                null,
773
-                'EE_Request_Handler'                          => EE_Dependency_Map::load_from_cache,
774
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
775
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
776
-            ),
777
-            'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array(
778
-                'EE_Registry' => EE_Dependency_Map::load_from_cache,
779
-                'EE_Config' => EE_Dependency_Map::load_from_cache
780
-            ),
781
-            'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
782
-                'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
783
-                'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
784
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => EE_Dependency_Map::load_from_cache,
785
-                'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
786
-            ),
787
-            'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => array(
788
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
789
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
790
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
791
-            ),
792
-            'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => array(
793
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
794
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
795
-            ),
796
-            'EventEspresso\core\domain\entities\editor\blocks\EventAttendees' => array(
797
-                'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => self::load_from_cache,
798
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
799
-                'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => self::load_from_cache,
800
-            ),
801
-            'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => array(
802
-                'EventEspresso\core\services\container\Mirror' => EE_Dependency_Map::load_from_cache,
803
-                'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
804
-                'EE_Dependency_Map' => EE_Dependency_Map::load_from_cache,
805
-            ),
806
-            'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => array(
807
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => EE_Dependency_Map::load_from_cache,
808
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
809
-            ),
810
-            'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => array(
811
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationCollection' => EE_Dependency_Map::load_from_cache,
812
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => EE_Dependency_Map::load_from_cache,
813
-            ),
814
-            'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => array(
815
-                'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => EE_Dependency_Map::load_from_cache
816
-            ),
817
-            'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => array(
818
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
819
-            ),
820
-            'EventEspresso\core\libraries\rest_api\controllers\model\Read' => array(
821
-                'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => EE_Dependency_Map::load_from_cache
822
-            ),
823
-            'EventEspresso\core\libraries\rest_api\calculations\Datetime' => array(
824
-                'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
825
-                'EEM_Registration' => EE_Dependency_Map::load_from_cache
826
-            ),
827
-            'EventEspresso\core\libraries\rest_api\calculations\Event' => array(
828
-                'EEM_Event' => EE_Dependency_Map::load_from_cache,
829
-                'EEM_Registration' => EE_Dependency_Map::load_from_cache
830
-            ),
831
-            'EventEspresso\core\libraries\rest_api\calculations\Registration' => array(
832
-                'EEM_Registration' => EE_Dependency_Map::load_from_cache
833
-            ),
834
-            'EventEspresso\core\services\session\SessionStartHandler' => array(
835
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
836
-            ),
837
-            'EE_URL_Validation_Strategy' => array(
838
-                null,
839
-                null,
840
-                'EventEspresso\core\services\validators\URLValidator' => EE_Dependency_Map::load_from_cache
841
-            ),
842
-            'EventEspresso\admin_pages\general_settings\OrganizationSettings' => array(
843
-                'EE_Registry'                                             => EE_Dependency_Map::load_from_cache,
844
-                'EE_Organization_Config'                                  => EE_Dependency_Map::load_from_cache,
845
-                'EE_Core_Config'                                          => EE_Dependency_Map::load_from_cache,
846
-                'EE_Network_Core_Config'                                  => EE_Dependency_Map::load_from_cache,
847
-                'EventEspresso\core\services\address\CountrySubRegionDao' => EE_Dependency_Map::load_from_cache,
848
-            ),
849
-            'EventEspresso\core\services\address\CountrySubRegionDao' => array(
850
-                'EEM_State'                                            => EE_Dependency_Map::load_from_cache,
851
-                'EventEspresso\core\services\validators\JsonValidator' => EE_Dependency_Map::load_from_cache
852
-            ),
853
-            'EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat' => array(
854
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
855
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
856
-            ),
857
-            'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' => array(
858
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
859
-                'EE_Environment_Config'            => EE_Dependency_Map::load_from_cache,
860
-            ),
861
-            'EventEspresso\core\services\request\files\FilesDataHandler' => array(
862
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
863
-            ),
864
-            'EventEspressoBatchRequest\BatchRequestProcessor' => [
865
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
866
-            ],
867
-            'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder' => [
868
-                null,
869
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
870
-                'EEM_Registration'  => EE_Dependency_Map::load_from_cache,
871
-            ],
872
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader' => [
873
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
874
-                'EEM_Attendee'  => EE_Dependency_Map::load_from_cache,
875
-            ],
876
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader' => [
877
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
878
-                'EEM_Datetime'  => EE_Dependency_Map::load_from_cache,
879
-            ],
880
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader' => [
881
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
882
-                'EEM_Event'  => EE_Dependency_Map::load_from_cache,
883
-            ],
884
-            'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader' => [
885
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
886
-                'EEM_Ticket'  => EE_Dependency_Map::load_from_cache,
887
-            ],
888
-            'EventEspresso\core\domain\services\converters\RestApiSpoofer' => [
889
-                'WP_REST_Server' => EE_Dependency_Map::load_from_cache,
890
-                'EED_Core_Rest_Api' => EE_Dependency_Map::load_from_cache,
891
-                'EventEspresso\core\libraries\rest_api\controllers\model\Read' => EE_Dependency_Map::load_from_cache,
892
-                null
893
-            ],
894
-            'EventEspresso\core\domain\services\admin\events\default_settings\AdvancedEditorAdminFormSection'  => [
895
-                'EE_Admin_Config' => EE_Dependency_Map::load_from_cache
896
-            ],
897
-            'EventEspresso\core\domain\services\admin\events\editor\AdvancedEditorEntityData'  => [
898
-                'EventEspresso\core\domain\services\converters\RestApiSpoofer' => EE_Dependency_Map::load_from_cache,
899
-                'EE_Admin_Config' => EE_Dependency_Map::load_from_cache,
900
-                'EEM_Datetime'    => EE_Dependency_Map::load_from_cache,
901
-                'EEM_Event'       => EE_Dependency_Map::load_from_cache,
902
-                'EEM_Price'       => EE_Dependency_Map::load_from_cache,
903
-                'EEM_Price_Type'  => EE_Dependency_Map::load_from_cache,
904
-                'EEM_Ticket'      => EE_Dependency_Map::load_from_cache,
905
-                'EEM_Venue'       => EE_Dependency_Map::load_from_cache,
906
-            ],
907
-        );
908
-    }
909
-
910
-
911
-    /**
912
-     * Registers how core classes are loaded.
913
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
914
-     *        'EE_Request_Handler' => 'load_core'
915
-     *        'EE_Messages_Queue'  => 'load_lib'
916
-     *        'EEH_Debug_Tools'    => 'load_helper'
917
-     * or, if greater control is required, by providing a custom closure. For example:
918
-     *        'Some_Class' => function () {
919
-     *            return new Some_Class();
920
-     *        },
921
-     * This is required for instantiating dependencies
922
-     * where an interface has been type hinted in a class constructor. For example:
923
-     *        'Required_Interface' => function () {
924
-     *            return new A_Class_That_Implements_Required_Interface();
925
-     *        },
926
-     */
927
-    protected function _register_core_class_loaders()
928
-    {
929
-        $this->_class_loaders = array(
930
-            // load_core
931
-            'EE_Dependency_Map'                            => function () {
932
-                return $this;
933
-            },
934
-            'EE_Capabilities'                              => 'load_core',
935
-            'EE_Encryption'                                => 'load_core',
936
-            'EE_Front_Controller'                          => 'load_core',
937
-            'EE_Module_Request_Router'                     => 'load_core',
938
-            'EE_Registry'                                  => 'load_core',
939
-            'EE_Request'                                   => function () {
940
-                return $this->legacy_request;
941
-            },
942
-            'EventEspresso\core\services\request\Request'  => function () {
943
-                return $this->request;
944
-            },
945
-            'EventEspresso\core\services\request\Response' => function () {
946
-                return $this->response;
947
-            },
948
-            'EE_Base'                                      => 'load_core',
949
-            'EE_Request_Handler'                           => 'load_core',
950
-            'EE_Session'                                   => 'load_core',
951
-            'EE_Cron_Tasks'                                => 'load_core',
952
-            'EE_System'                                    => 'load_core',
953
-            'EE_Maintenance_Mode'                          => 'load_core',
954
-            'EE_Register_CPTs'                             => 'load_core',
955
-            'EE_Admin'                                     => 'load_core',
956
-            'EE_CPT_Strategy'                              => 'load_core',
957
-            // load_class
958
-            'EE_Registration_Processor'                    => 'load_class',
959
-            // load_lib
960
-            'EE_Message_Resource_Manager'                  => 'load_lib',
961
-            'EE_Message_Type_Collection'                   => 'load_lib',
962
-            'EE_Message_Type_Collection_Loader'            => 'load_lib',
963
-            'EE_Messenger_Collection'                      => 'load_lib',
964
-            'EE_Messenger_Collection_Loader'               => 'load_lib',
965
-            'EE_Messages_Processor'                        => 'load_lib',
966
-            'EE_Message_Repository'                        => 'load_lib',
967
-            'EE_Messages_Queue'                            => 'load_lib',
968
-            'EE_Messages_Data_Handler_Collection'          => 'load_lib',
969
-            'EE_Message_Template_Group_Collection'         => 'load_lib',
970
-            'EE_Payment_Method_Manager'                    => 'load_lib',
971
-            'EE_DMS_Core_4_1_0'                            => 'load_dms',
972
-            'EE_DMS_Core_4_2_0'                            => 'load_dms',
973
-            'EE_DMS_Core_4_3_0'                            => 'load_dms',
974
-            'EE_DMS_Core_4_5_0'                            => 'load_dms',
975
-            'EE_DMS_Core_4_6_0'                            => 'load_dms',
976
-            'EE_DMS_Core_4_7_0'                            => 'load_dms',
977
-            'EE_DMS_Core_4_8_0'                            => 'load_dms',
978
-            'EE_DMS_Core_4_9_0'                            => 'load_dms',
979
-            'EE_DMS_Core_4_10_0'                            => 'load_dms',
980
-            'EE_Messages_Generator'                        => function () {
981
-                return EE_Registry::instance()->load_lib(
982
-                    'Messages_Generator',
983
-                    array(),
984
-                    false,
985
-                    false
986
-                );
987
-            },
988
-            'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
989
-                return EE_Registry::instance()->load_lib(
990
-                    'Messages_Template_Defaults',
991
-                    $arguments,
992
-                    false,
993
-                    false
994
-                );
995
-            },
996
-            // load_helper
997
-            'EEH_Parse_Shortcodes'                         => function () {
998
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
999
-                    return new EEH_Parse_Shortcodes();
1000
-                }
1001
-                return null;
1002
-            },
1003
-            'EE_Template_Config'                           => function () {
1004
-                return EE_Config::instance()->template_settings;
1005
-            },
1006
-            'EE_Currency_Config'                           => function () {
1007
-                return EE_Config::instance()->currency;
1008
-            },
1009
-            'EE_Registration_Config'                       => function () {
1010
-                return EE_Config::instance()->registration;
1011
-            },
1012
-            'EE_Core_Config'                               => function () {
1013
-                return EE_Config::instance()->core;
1014
-            },
1015
-            'EventEspresso\core\services\loaders\Loader'   => function () {
1016
-                return LoaderFactory::getLoader();
1017
-            },
1018
-            'EE_Network_Config'                            => function () {
1019
-                return EE_Network_Config::instance();
1020
-            },
1021
-            'EE_Config'                                    => function () {
1022
-                return EE_Config::instance();
1023
-            },
1024
-            'EventEspresso\core\domain\Domain'             => function () {
1025
-                return DomainFactory::getEventEspressoCoreDomain();
1026
-            },
1027
-            'EE_Admin_Config'                              => function () {
1028
-                return EE_Config::instance()->admin;
1029
-            },
1030
-            'EE_Organization_Config'                       => function () {
1031
-                return EE_Config::instance()->organization;
1032
-            },
1033
-            'EE_Network_Core_Config'                       => function () {
1034
-                return EE_Network_Config::instance()->core;
1035
-            },
1036
-            'EE_Environment_Config'                        => function () {
1037
-                return EE_Config::instance()->environment;
1038
-            },
1039
-            'EED_Core_Rest_Api'                            => static function () {
1040
-                return EED_Core_Rest_Api::instance();
1041
-            },
1042
-        );
1043
-    }
1044
-
1045
-
1046
-    /**
1047
-     * can be used for supplying alternate names for classes,
1048
-     * or for connecting interface names to instantiable classes
1049
-     */
1050
-    protected function _register_core_aliases()
1051
-    {
1052
-        $aliases = array(
1053
-            'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
1054
-            'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
1055
-            'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
1056
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
1057
-            'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
1058
-            'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
1059
-            'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
1060
-            'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
1061
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
1062
-            'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
1063
-            'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1064
-            'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
1065
-            'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
1066
-            'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
1067
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
1068
-            'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
1069
-            'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
1070
-            'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
1071
-            'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
1072
-            'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
1073
-            'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
1074
-            'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
1075
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
1076
-            'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
1077
-            'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
1078
-            'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
1079
-            'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
1080
-            'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
1081
-            'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
1082
-            'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
1083
-            'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
1084
-            'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
1085
-            'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
1086
-            'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
1087
-            'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
1088
-            'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
1089
-            'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
1090
-            'Registration_Processor'                                                       => 'EE_Registration_Processor',
1091
-        );
1092
-        foreach ($aliases as $alias => $fqn) {
1093
-            if (is_array($fqn)) {
1094
-                foreach ($fqn as $class => $for_class) {
1095
-                    $this->class_cache->addAlias($class, $alias, $for_class);
1096
-                }
1097
-                continue;
1098
-            }
1099
-            $this->class_cache->addAlias($fqn, $alias);
1100
-        }
1101
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
1102
-            $this->class_cache->addAlias(
1103
-                'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
1104
-                'EventEspresso\core\services\notices\NoticeConverterInterface'
1105
-            );
1106
-        }
1107
-    }
1108
-
1109
-
1110
-    /**
1111
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
1112
-     * request Primarily used by unit tests.
1113
-     */
1114
-    public function reset()
1115
-    {
1116
-        $this->_register_core_class_loaders();
1117
-        $this->_register_core_dependencies();
1118
-    }
1119
-
1120
-
1121
-    /**
1122
-     * PLZ NOTE: a better name for this method would be is_alias()
1123
-     * because it returns TRUE if the provided fully qualified name IS an alias
1124
-     * WHY?
1125
-     * Because if a class is type hinting for a concretion,
1126
-     * then why would we need to find another class to supply it?
1127
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
1128
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
1129
-     * Don't go looking for some substitute.
1130
-     * Whereas if a class is type hinting for an interface...
1131
-     * then we need to find an actual class to use.
1132
-     * So the interface IS the alias for some other FQN,
1133
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
1134
-     * represents some other class.
1135
-     *
1136
-     * @deprecated 4.9.62.p
1137
-     * @param string $fqn
1138
-     * @param string $for_class
1139
-     * @return bool
1140
-     */
1141
-    public function has_alias($fqn = '', $for_class = '')
1142
-    {
1143
-        return $this->isAlias($fqn, $for_class);
1144
-    }
1145
-
1146
-
1147
-    /**
1148
-     * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
1149
-     * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
1150
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
1151
-     *  for example:
1152
-     *      if the following two entries were added to the _aliases array:
1153
-     *          array(
1154
-     *              'interface_alias'           => 'some\namespace\interface'
1155
-     *              'some\namespace\interface'  => 'some\namespace\classname'
1156
-     *          )
1157
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
1158
-     *      to load an instance of 'some\namespace\classname'
1159
-     *
1160
-     * @deprecated 4.9.62.p
1161
-     * @param string $alias
1162
-     * @param string $for_class
1163
-     * @return string
1164
-     */
1165
-    public function get_alias($alias = '', $for_class = '')
1166
-    {
1167
-        return $this->getFqnForAlias($alias, $for_class);
1168
-    }
23
+	/**
24
+	 * This means that the requested class dependency is not present in the dependency map
25
+	 */
26
+	const not_registered = 0;
27
+
28
+	/**
29
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
+	 */
31
+	const load_new_object = 1;
32
+
33
+	/**
34
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
+	 */
37
+	const load_from_cache = 2;
38
+
39
+	/**
40
+	 * When registering a dependency,
41
+	 * this indicates to keep any existing dependencies that already exist,
42
+	 * and simply discard any new dependencies declared in the incoming data
43
+	 */
44
+	const KEEP_EXISTING_DEPENDENCIES = 0;
45
+
46
+	/**
47
+	 * When registering a dependency,
48
+	 * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
+	 */
50
+	const OVERWRITE_DEPENDENCIES = 1;
51
+
52
+
53
+	/**
54
+	 * @type EE_Dependency_Map $_instance
55
+	 */
56
+	protected static $_instance;
57
+
58
+	/**
59
+	 * @var ClassInterfaceCache $class_cache
60
+	 */
61
+	private $class_cache;
62
+
63
+	/**
64
+	 * @type RequestInterface $request
65
+	 */
66
+	protected $request;
67
+
68
+	/**
69
+	 * @type LegacyRequestInterface $legacy_request
70
+	 */
71
+	protected $legacy_request;
72
+
73
+	/**
74
+	 * @type ResponseInterface $response
75
+	 */
76
+	protected $response;
77
+
78
+	/**
79
+	 * @type LoaderInterface $loader
80
+	 */
81
+	protected $loader;
82
+
83
+	/**
84
+	 * @type array $_dependency_map
85
+	 */
86
+	protected $_dependency_map = array();
87
+
88
+	/**
89
+	 * @type array $_class_loaders
90
+	 */
91
+	protected $_class_loaders = array();
92
+
93
+
94
+	/**
95
+	 * EE_Dependency_Map constructor.
96
+	 *
97
+	 * @param ClassInterfaceCache $class_cache
98
+	 */
99
+	protected function __construct(ClassInterfaceCache $class_cache)
100
+	{
101
+		$this->class_cache = $class_cache;
102
+		do_action('EE_Dependency_Map____construct', $this);
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return void
108
+	 */
109
+	public function initialize()
110
+	{
111
+		$this->_register_core_dependencies();
112
+		$this->_register_core_class_loaders();
113
+		$this->_register_core_aliases();
114
+	}
115
+
116
+
117
+	/**
118
+	 * @singleton method used to instantiate class object
119
+	 * @param ClassInterfaceCache|null $class_cache
120
+	 * @return EE_Dependency_Map
121
+	 */
122
+	public static function instance(ClassInterfaceCache $class_cache = null)
123
+	{
124
+		// check if class object is instantiated, and instantiated properly
125
+		if (! self::$_instance instanceof EE_Dependency_Map
126
+			&& $class_cache instanceof ClassInterfaceCache
127
+		) {
128
+			self::$_instance = new EE_Dependency_Map($class_cache);
129
+		}
130
+		return self::$_instance;
131
+	}
132
+
133
+
134
+	/**
135
+	 * @param RequestInterface $request
136
+	 */
137
+	public function setRequest(RequestInterface $request)
138
+	{
139
+		$this->request = $request;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @param LegacyRequestInterface $legacy_request
145
+	 */
146
+	public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
+	{
148
+		$this->legacy_request = $legacy_request;
149
+	}
150
+
151
+
152
+	/**
153
+	 * @param ResponseInterface $response
154
+	 */
155
+	public function setResponse(ResponseInterface $response)
156
+	{
157
+		$this->response = $response;
158
+	}
159
+
160
+
161
+	/**
162
+	 * @param LoaderInterface $loader
163
+	 */
164
+	public function setLoader(LoaderInterface $loader)
165
+	{
166
+		$this->loader = $loader;
167
+	}
168
+
169
+
170
+	/**
171
+	 * @param string $class
172
+	 * @param array  $dependencies
173
+	 * @param int    $overwrite
174
+	 * @return bool
175
+	 */
176
+	public static function register_dependencies(
177
+		$class,
178
+		array $dependencies,
179
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
+	) {
181
+		return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
+	}
183
+
184
+
185
+	/**
186
+	 * Assigns an array of class names and corresponding load sources (new or cached)
187
+	 * to the class specified by the first parameter.
188
+	 * IMPORTANT !!!
189
+	 * The order of elements in the incoming $dependencies array MUST match
190
+	 * the order of the constructor parameters for the class in question.
191
+	 * This is especially important when overriding any existing dependencies that are registered.
192
+	 * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
+	 *
194
+	 * @param string $class
195
+	 * @param array  $dependencies
196
+	 * @param int    $overwrite
197
+	 * @return bool
198
+	 */
199
+	public function registerDependencies(
200
+		$class,
201
+		array $dependencies,
202
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
+	) {
204
+		$class = trim($class, '\\');
205
+		$registered = false;
206
+		if (empty(self::$_instance->_dependency_map[ $class ])) {
207
+			self::$_instance->_dependency_map[ $class ] = array();
208
+		}
209
+		// we need to make sure that any aliases used when registering a dependency
210
+		// get resolved to the correct class name
211
+		foreach ($dependencies as $dependency => $load_source) {
212
+			$alias = self::$_instance->getFqnForAlias($dependency);
213
+			if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
+				|| ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
+			) {
216
+				unset($dependencies[ $dependency ]);
217
+				$dependencies[ $alias ] = $load_source;
218
+				$registered = true;
219
+			}
220
+		}
221
+		// now add our two lists of dependencies together.
222
+		// using Union (+=) favours the arrays in precedence from left to right,
223
+		// so $dependencies is NOT overwritten because it is listed first
224
+		// ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
+		// Union is way faster than array_merge() but should be used with caution...
226
+		// especially with numerically indexed arrays
227
+		$dependencies += self::$_instance->_dependency_map[ $class ];
228
+		// now we need to ensure that the resulting dependencies
229
+		// array only has the entries that are required for the class
230
+		// so first count how many dependencies were originally registered for the class
231
+		$dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
+		// if that count is non-zero (meaning dependencies were already registered)
233
+		self::$_instance->_dependency_map[ $class ] = $dependency_count
234
+			// then truncate the  final array to match that count
235
+			? array_slice($dependencies, 0, $dependency_count)
236
+			// otherwise just take the incoming array because nothing previously existed
237
+			: $dependencies;
238
+		return $registered;
239
+	}
240
+
241
+
242
+	/**
243
+	 * @param string $class_name
244
+	 * @param string $loader
245
+	 * @return bool
246
+	 * @throws DomainException
247
+	 */
248
+	public static function register_class_loader($class_name, $loader = 'load_core')
249
+	{
250
+		if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
+			throw new DomainException(
252
+				esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
+			);
254
+		}
255
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
256
+		if (! is_callable($loader)
257
+			&& (
258
+				strpos($loader, 'load_') !== 0
259
+				|| ! method_exists('EE_Registry', $loader)
260
+			)
261
+		) {
262
+			throw new DomainException(
263
+				sprintf(
264
+					esc_html__(
265
+						'"%1$s" is not a valid loader method on EE_Registry.',
266
+						'event_espresso'
267
+					),
268
+					$loader
269
+				)
270
+			);
271
+		}
272
+		$class_name = self::$_instance->getFqnForAlias($class_name);
273
+		if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
+			self::$_instance->_class_loaders[ $class_name ] = $loader;
275
+			return true;
276
+		}
277
+		return false;
278
+	}
279
+
280
+
281
+	/**
282
+	 * @return array
283
+	 */
284
+	public function dependency_map()
285
+	{
286
+		return $this->_dependency_map;
287
+	}
288
+
289
+
290
+	/**
291
+	 * returns TRUE if dependency map contains a listing for the provided class name
292
+	 *
293
+	 * @param string $class_name
294
+	 * @return boolean
295
+	 */
296
+	public function has($class_name = '')
297
+	{
298
+		// all legacy models have the same dependencies
299
+		if (strpos($class_name, 'EEM_') === 0) {
300
+			$class_name = 'LEGACY_MODELS';
301
+		}
302
+		return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
+	}
304
+
305
+
306
+	/**
307
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
+	 *
309
+	 * @param string $class_name
310
+	 * @param string $dependency
311
+	 * @return bool
312
+	 */
313
+	public function has_dependency_for_class($class_name = '', $dependency = '')
314
+	{
315
+		// all legacy models have the same dependencies
316
+		if (strpos($class_name, 'EEM_') === 0) {
317
+			$class_name = 'LEGACY_MODELS';
318
+		}
319
+		$dependency = $this->getFqnForAlias($dependency, $class_name);
320
+		return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
+			? true
322
+			: false;
323
+	}
324
+
325
+
326
+	/**
327
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
+	 *
329
+	 * @param string $class_name
330
+	 * @param string $dependency
331
+	 * @return int
332
+	 */
333
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
+	{
335
+		// all legacy models have the same dependencies
336
+		if (strpos($class_name, 'EEM_') === 0) {
337
+			$class_name = 'LEGACY_MODELS';
338
+		}
339
+		$dependency = $this->getFqnForAlias($dependency);
340
+		return $this->has_dependency_for_class($class_name, $dependency)
341
+			? $this->_dependency_map[ $class_name ][ $dependency ]
342
+			: EE_Dependency_Map::not_registered;
343
+	}
344
+
345
+
346
+	/**
347
+	 * @param string $class_name
348
+	 * @return string | Closure
349
+	 */
350
+	public function class_loader($class_name)
351
+	{
352
+		// all legacy models use load_model()
353
+		if (strpos($class_name, 'EEM_') === 0) {
354
+			return 'load_model';
355
+		}
356
+		// EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc
357
+		// perform strpos() first to avoid loading regex every time we load a class
358
+		if (strpos($class_name, 'EE_CPT_') === 0
359
+			&& preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name)
360
+		) {
361
+			return 'load_core';
362
+		}
363
+		$class_name = $this->getFqnForAlias($class_name);
364
+		return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
365
+	}
366
+
367
+
368
+	/**
369
+	 * @return array
370
+	 */
371
+	public function class_loaders()
372
+	{
373
+		return $this->_class_loaders;
374
+	}
375
+
376
+
377
+	/**
378
+	 * adds an alias for a classname
379
+	 *
380
+	 * @param string $fqcn      the class name that should be used (concrete class to replace interface)
381
+	 * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
382
+	 * @param string $for_class the class that has the dependency (is type hinting for the interface)
383
+	 */
384
+	public function add_alias($fqcn, $alias, $for_class = '')
385
+	{
386
+		$this->class_cache->addAlias($fqcn, $alias, $for_class);
387
+	}
388
+
389
+
390
+	/**
391
+	 * Returns TRUE if the provided fully qualified name IS an alias
392
+	 * WHY?
393
+	 * Because if a class is type hinting for a concretion,
394
+	 * then why would we need to find another class to supply it?
395
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
396
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
397
+	 * Don't go looking for some substitute.
398
+	 * Whereas if a class is type hinting for an interface...
399
+	 * then we need to find an actual class to use.
400
+	 * So the interface IS the alias for some other FQN,
401
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
402
+	 * represents some other class.
403
+	 *
404
+	 * @param string $fqn
405
+	 * @param string $for_class
406
+	 * @return bool
407
+	 */
408
+	public function isAlias($fqn = '', $for_class = '')
409
+	{
410
+		return $this->class_cache->isAlias($fqn, $for_class);
411
+	}
412
+
413
+
414
+	/**
415
+	 * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
416
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
417
+	 *  for example:
418
+	 *      if the following two entries were added to the _aliases array:
419
+	 *          array(
420
+	 *              'interface_alias'           => 'some\namespace\interface'
421
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
422
+	 *          )
423
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
424
+	 *      to load an instance of 'some\namespace\classname'
425
+	 *
426
+	 * @param string $alias
427
+	 * @param string $for_class
428
+	 * @return string
429
+	 */
430
+	public function getFqnForAlias($alias = '', $for_class = '')
431
+	{
432
+		return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
433
+	}
434
+
435
+
436
+	/**
437
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
438
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
439
+	 * This is done by using the following class constants:
440
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
441
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
442
+	 */
443
+	protected function _register_core_dependencies()
444
+	{
445
+		$this->_dependency_map = array(
446
+			'EE_Request_Handler'                                                                                          => array(
447
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
448
+			),
449
+			'EE_System'                                                                                                   => array(
450
+				'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
451
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
452
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
453
+				'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
454
+			),
455
+			'EE_Session'                                                                                                  => array(
456
+				'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
457
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
458
+				'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
459
+				'EventEspresso\core\services\session\SessionStartHandler'  => EE_Dependency_Map::load_from_cache,
460
+				'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
461
+			),
462
+			'EE_Cart'                                                                                                     => array(
463
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
464
+			),
465
+			'EE_Front_Controller'                                                                                         => array(
466
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
467
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
468
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
469
+			),
470
+			'EE_Messenger_Collection_Loader'                                                                              => array(
471
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
472
+			),
473
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
474
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
475
+			),
476
+			'EE_Message_Resource_Manager'                                                                                 => array(
477
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
478
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
479
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
480
+			),
481
+			'EE_Message_Factory'                                                                                          => array(
482
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
483
+			),
484
+			'EE_messages'                                                                                                 => array(
485
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
486
+			),
487
+			'EE_Messages_Generator'                                                                                       => array(
488
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
489
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
490
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
491
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
492
+			),
493
+			'EE_Messages_Processor'                                                                                       => array(
494
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
495
+			),
496
+			'EE_Messages_Queue'                                                                                           => array(
497
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
498
+			),
499
+			'EE_Messages_Template_Defaults'                                                                               => array(
500
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
501
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
502
+			),
503
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
504
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
505
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
506
+			),
507
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
508
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
509
+			),
510
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
511
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
512
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
513
+			),
514
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
515
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
516
+			),
517
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
518
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
519
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
520
+			),
521
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
522
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
523
+			),
524
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
525
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
526
+			),
527
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
528
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
529
+			),
530
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
531
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
532
+			),
533
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
534
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
535
+			),
536
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
537
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
538
+			),
539
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
540
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
541
+			),
542
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
543
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
544
+			),
545
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
546
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
547
+			),
548
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
549
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
550
+			),
551
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
552
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
553
+			),
554
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
555
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
556
+			),
557
+			'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
558
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
559
+			),
560
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
561
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
562
+			),
563
+			'EE_Data_Migration_Class_Base'                                                                                => array(
564
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
565
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
566
+			),
567
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
568
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
569
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
570
+			),
571
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
572
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
573
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
574
+			),
575
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
576
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
577
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
578
+			),
579
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
580
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
581
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
582
+			),
583
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
584
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
585
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
586
+			),
587
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
588
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
589
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
590
+			),
591
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
592
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
593
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
594
+			),
595
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
596
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
597
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
598
+			),
599
+			'EE_DMS_Core_4_9_0' => array(
600
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
601
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
602
+			),
603
+			'EE_DMS_Core_4_10_0' => array(
604
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
605
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
606
+				'EE_DMS_Core_4_9_0'                                  => EE_Dependency_Map::load_from_cache,
607
+			),
608
+			'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
609
+				array(),
610
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
611
+			),
612
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
613
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
614
+				'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
615
+			),
616
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
617
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
618
+			),
619
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
620
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
621
+			),
622
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
623
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
624
+			),
625
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
626
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
627
+			),
628
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
629
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
630
+			),
631
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
632
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
633
+			),
634
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
635
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
636
+			),
637
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
638
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
639
+			),
640
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
641
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
642
+			),
643
+			'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
644
+				'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
645
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
646
+			),
647
+			'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
648
+				null,
649
+				'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
650
+			),
651
+			'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
652
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
653
+			),
654
+			'LEGACY_MODELS'                                                                                               => array(
655
+				null,
656
+				'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
657
+			),
658
+			'EE_Module_Request_Router'                                                                                    => array(
659
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
660
+			),
661
+			'EE_Registration_Processor'                                                                                   => array(
662
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
663
+			),
664
+			'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
665
+				null,
666
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
667
+				'EventEspresso\core\services\request\Request'                         => EE_Dependency_Map::load_from_cache,
668
+			),
669
+			'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
670
+				'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
671
+				'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
672
+			),
673
+			'EE_Admin_Transactions_List_Table'                                                                            => array(
674
+				null,
675
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
676
+			),
677
+			'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
678
+				'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
679
+				'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
680
+				'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
681
+			),
682
+			'EventEspresso\core\domain\services\pue\Config'                                                               => array(
683
+				'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
684
+				'EE_Config'         => EE_Dependency_Map::load_from_cache,
685
+			),
686
+			'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
687
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
688
+				'EEM_Event'          => EE_Dependency_Map::load_from_cache,
689
+				'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
690
+				'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
691
+				'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
692
+				'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
693
+				'EE_Config'          => EE_Dependency_Map::load_from_cache,
694
+			),
695
+			'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
696
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
697
+			),
698
+			'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
699
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
700
+			),
701
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
702
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
703
+				'EE_Session'             => EE_Dependency_Map::load_from_cache,
704
+			),
705
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
706
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
707
+			),
708
+			'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
709
+				'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
710
+				'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
711
+				'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
712
+				'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
713
+				'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
714
+			),
715
+			'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
716
+				'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
717
+			),
718
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
719
+				'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
720
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
721
+			),
722
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
723
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
724
+			),
725
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
726
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
727
+			),
728
+			'EE_CPT_Strategy'                                                                                             => array(
729
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
730
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
731
+			),
732
+			'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
733
+				'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
734
+			),
735
+			'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
736
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
737
+				'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
738
+				'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
739
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
740
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
741
+			),
742
+			'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
743
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
744
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
745
+			),
746
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array(
747
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
748
+			),
749
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array(
750
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
751
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache
752
+			),
753
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array(
754
+				'EEM_Checkin' => EE_Dependency_Map::load_from_cache,
755
+			),
756
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array(
757
+				'EEM_Registration' => EE_Dependency_Map::load_from_cache,
758
+			),
759
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array(
760
+				'EEM_Transaction' => EE_Dependency_Map::load_from_cache,
761
+			),
762
+			'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array(
763
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
764
+			),
765
+			'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array(
766
+				'EEM_Answer' => EE_Dependency_Map::load_from_cache,
767
+				'EEM_Question' => EE_Dependency_Map::load_from_cache,
768
+			),
769
+			'EventEspresso\core\CPTs\CptQueryModifier' => array(
770
+				null,
771
+				null,
772
+				null,
773
+				'EE_Request_Handler'                          => EE_Dependency_Map::load_from_cache,
774
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
775
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
776
+			),
777
+			'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array(
778
+				'EE_Registry' => EE_Dependency_Map::load_from_cache,
779
+				'EE_Config' => EE_Dependency_Map::load_from_cache
780
+			),
781
+			'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
782
+				'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
783
+				'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
784
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => EE_Dependency_Map::load_from_cache,
785
+				'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
786
+			),
787
+			'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => array(
788
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
789
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
790
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
791
+			),
792
+			'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => array(
793
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
794
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
795
+			),
796
+			'EventEspresso\core\domain\entities\editor\blocks\EventAttendees' => array(
797
+				'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => self::load_from_cache,
798
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
799
+				'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => self::load_from_cache,
800
+			),
801
+			'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => array(
802
+				'EventEspresso\core\services\container\Mirror' => EE_Dependency_Map::load_from_cache,
803
+				'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
804
+				'EE_Dependency_Map' => EE_Dependency_Map::load_from_cache,
805
+			),
806
+			'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => array(
807
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => EE_Dependency_Map::load_from_cache,
808
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
809
+			),
810
+			'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => array(
811
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationCollection' => EE_Dependency_Map::load_from_cache,
812
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => EE_Dependency_Map::load_from_cache,
813
+			),
814
+			'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => array(
815
+				'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => EE_Dependency_Map::load_from_cache
816
+			),
817
+			'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => array(
818
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
819
+			),
820
+			'EventEspresso\core\libraries\rest_api\controllers\model\Read' => array(
821
+				'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => EE_Dependency_Map::load_from_cache
822
+			),
823
+			'EventEspresso\core\libraries\rest_api\calculations\Datetime' => array(
824
+				'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
825
+				'EEM_Registration' => EE_Dependency_Map::load_from_cache
826
+			),
827
+			'EventEspresso\core\libraries\rest_api\calculations\Event' => array(
828
+				'EEM_Event' => EE_Dependency_Map::load_from_cache,
829
+				'EEM_Registration' => EE_Dependency_Map::load_from_cache
830
+			),
831
+			'EventEspresso\core\libraries\rest_api\calculations\Registration' => array(
832
+				'EEM_Registration' => EE_Dependency_Map::load_from_cache
833
+			),
834
+			'EventEspresso\core\services\session\SessionStartHandler' => array(
835
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
836
+			),
837
+			'EE_URL_Validation_Strategy' => array(
838
+				null,
839
+				null,
840
+				'EventEspresso\core\services\validators\URLValidator' => EE_Dependency_Map::load_from_cache
841
+			),
842
+			'EventEspresso\admin_pages\general_settings\OrganizationSettings' => array(
843
+				'EE_Registry'                                             => EE_Dependency_Map::load_from_cache,
844
+				'EE_Organization_Config'                                  => EE_Dependency_Map::load_from_cache,
845
+				'EE_Core_Config'                                          => EE_Dependency_Map::load_from_cache,
846
+				'EE_Network_Core_Config'                                  => EE_Dependency_Map::load_from_cache,
847
+				'EventEspresso\core\services\address\CountrySubRegionDao' => EE_Dependency_Map::load_from_cache,
848
+			),
849
+			'EventEspresso\core\services\address\CountrySubRegionDao' => array(
850
+				'EEM_State'                                            => EE_Dependency_Map::load_from_cache,
851
+				'EventEspresso\core\services\validators\JsonValidator' => EE_Dependency_Map::load_from_cache
852
+			),
853
+			'EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat' => array(
854
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
855
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
856
+			),
857
+			'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' => array(
858
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
859
+				'EE_Environment_Config'            => EE_Dependency_Map::load_from_cache,
860
+			),
861
+			'EventEspresso\core\services\request\files\FilesDataHandler' => array(
862
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
863
+			),
864
+			'EventEspressoBatchRequest\BatchRequestProcessor' => [
865
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
866
+			],
867
+			'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder' => [
868
+				null,
869
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
870
+				'EEM_Registration'  => EE_Dependency_Map::load_from_cache,
871
+			],
872
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader' => [
873
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
874
+				'EEM_Attendee'  => EE_Dependency_Map::load_from_cache,
875
+			],
876
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader' => [
877
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
878
+				'EEM_Datetime'  => EE_Dependency_Map::load_from_cache,
879
+			],
880
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader' => [
881
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
882
+				'EEM_Event'  => EE_Dependency_Map::load_from_cache,
883
+			],
884
+			'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader' => [
885
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
886
+				'EEM_Ticket'  => EE_Dependency_Map::load_from_cache,
887
+			],
888
+			'EventEspresso\core\domain\services\converters\RestApiSpoofer' => [
889
+				'WP_REST_Server' => EE_Dependency_Map::load_from_cache,
890
+				'EED_Core_Rest_Api' => EE_Dependency_Map::load_from_cache,
891
+				'EventEspresso\core\libraries\rest_api\controllers\model\Read' => EE_Dependency_Map::load_from_cache,
892
+				null
893
+			],
894
+			'EventEspresso\core\domain\services\admin\events\default_settings\AdvancedEditorAdminFormSection'  => [
895
+				'EE_Admin_Config' => EE_Dependency_Map::load_from_cache
896
+			],
897
+			'EventEspresso\core\domain\services\admin\events\editor\AdvancedEditorEntityData'  => [
898
+				'EventEspresso\core\domain\services\converters\RestApiSpoofer' => EE_Dependency_Map::load_from_cache,
899
+				'EE_Admin_Config' => EE_Dependency_Map::load_from_cache,
900
+				'EEM_Datetime'    => EE_Dependency_Map::load_from_cache,
901
+				'EEM_Event'       => EE_Dependency_Map::load_from_cache,
902
+				'EEM_Price'       => EE_Dependency_Map::load_from_cache,
903
+				'EEM_Price_Type'  => EE_Dependency_Map::load_from_cache,
904
+				'EEM_Ticket'      => EE_Dependency_Map::load_from_cache,
905
+				'EEM_Venue'       => EE_Dependency_Map::load_from_cache,
906
+			],
907
+		);
908
+	}
909
+
910
+
911
+	/**
912
+	 * Registers how core classes are loaded.
913
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
914
+	 *        'EE_Request_Handler' => 'load_core'
915
+	 *        'EE_Messages_Queue'  => 'load_lib'
916
+	 *        'EEH_Debug_Tools'    => 'load_helper'
917
+	 * or, if greater control is required, by providing a custom closure. For example:
918
+	 *        'Some_Class' => function () {
919
+	 *            return new Some_Class();
920
+	 *        },
921
+	 * This is required for instantiating dependencies
922
+	 * where an interface has been type hinted in a class constructor. For example:
923
+	 *        'Required_Interface' => function () {
924
+	 *            return new A_Class_That_Implements_Required_Interface();
925
+	 *        },
926
+	 */
927
+	protected function _register_core_class_loaders()
928
+	{
929
+		$this->_class_loaders = array(
930
+			// load_core
931
+			'EE_Dependency_Map'                            => function () {
932
+				return $this;
933
+			},
934
+			'EE_Capabilities'                              => 'load_core',
935
+			'EE_Encryption'                                => 'load_core',
936
+			'EE_Front_Controller'                          => 'load_core',
937
+			'EE_Module_Request_Router'                     => 'load_core',
938
+			'EE_Registry'                                  => 'load_core',
939
+			'EE_Request'                                   => function () {
940
+				return $this->legacy_request;
941
+			},
942
+			'EventEspresso\core\services\request\Request'  => function () {
943
+				return $this->request;
944
+			},
945
+			'EventEspresso\core\services\request\Response' => function () {
946
+				return $this->response;
947
+			},
948
+			'EE_Base'                                      => 'load_core',
949
+			'EE_Request_Handler'                           => 'load_core',
950
+			'EE_Session'                                   => 'load_core',
951
+			'EE_Cron_Tasks'                                => 'load_core',
952
+			'EE_System'                                    => 'load_core',
953
+			'EE_Maintenance_Mode'                          => 'load_core',
954
+			'EE_Register_CPTs'                             => 'load_core',
955
+			'EE_Admin'                                     => 'load_core',
956
+			'EE_CPT_Strategy'                              => 'load_core',
957
+			// load_class
958
+			'EE_Registration_Processor'                    => 'load_class',
959
+			// load_lib
960
+			'EE_Message_Resource_Manager'                  => 'load_lib',
961
+			'EE_Message_Type_Collection'                   => 'load_lib',
962
+			'EE_Message_Type_Collection_Loader'            => 'load_lib',
963
+			'EE_Messenger_Collection'                      => 'load_lib',
964
+			'EE_Messenger_Collection_Loader'               => 'load_lib',
965
+			'EE_Messages_Processor'                        => 'load_lib',
966
+			'EE_Message_Repository'                        => 'load_lib',
967
+			'EE_Messages_Queue'                            => 'load_lib',
968
+			'EE_Messages_Data_Handler_Collection'          => 'load_lib',
969
+			'EE_Message_Template_Group_Collection'         => 'load_lib',
970
+			'EE_Payment_Method_Manager'                    => 'load_lib',
971
+			'EE_DMS_Core_4_1_0'                            => 'load_dms',
972
+			'EE_DMS_Core_4_2_0'                            => 'load_dms',
973
+			'EE_DMS_Core_4_3_0'                            => 'load_dms',
974
+			'EE_DMS_Core_4_5_0'                            => 'load_dms',
975
+			'EE_DMS_Core_4_6_0'                            => 'load_dms',
976
+			'EE_DMS_Core_4_7_0'                            => 'load_dms',
977
+			'EE_DMS_Core_4_8_0'                            => 'load_dms',
978
+			'EE_DMS_Core_4_9_0'                            => 'load_dms',
979
+			'EE_DMS_Core_4_10_0'                            => 'load_dms',
980
+			'EE_Messages_Generator'                        => function () {
981
+				return EE_Registry::instance()->load_lib(
982
+					'Messages_Generator',
983
+					array(),
984
+					false,
985
+					false
986
+				);
987
+			},
988
+			'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
989
+				return EE_Registry::instance()->load_lib(
990
+					'Messages_Template_Defaults',
991
+					$arguments,
992
+					false,
993
+					false
994
+				);
995
+			},
996
+			// load_helper
997
+			'EEH_Parse_Shortcodes'                         => function () {
998
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
999
+					return new EEH_Parse_Shortcodes();
1000
+				}
1001
+				return null;
1002
+			},
1003
+			'EE_Template_Config'                           => function () {
1004
+				return EE_Config::instance()->template_settings;
1005
+			},
1006
+			'EE_Currency_Config'                           => function () {
1007
+				return EE_Config::instance()->currency;
1008
+			},
1009
+			'EE_Registration_Config'                       => function () {
1010
+				return EE_Config::instance()->registration;
1011
+			},
1012
+			'EE_Core_Config'                               => function () {
1013
+				return EE_Config::instance()->core;
1014
+			},
1015
+			'EventEspresso\core\services\loaders\Loader'   => function () {
1016
+				return LoaderFactory::getLoader();
1017
+			},
1018
+			'EE_Network_Config'                            => function () {
1019
+				return EE_Network_Config::instance();
1020
+			},
1021
+			'EE_Config'                                    => function () {
1022
+				return EE_Config::instance();
1023
+			},
1024
+			'EventEspresso\core\domain\Domain'             => function () {
1025
+				return DomainFactory::getEventEspressoCoreDomain();
1026
+			},
1027
+			'EE_Admin_Config'                              => function () {
1028
+				return EE_Config::instance()->admin;
1029
+			},
1030
+			'EE_Organization_Config'                       => function () {
1031
+				return EE_Config::instance()->organization;
1032
+			},
1033
+			'EE_Network_Core_Config'                       => function () {
1034
+				return EE_Network_Config::instance()->core;
1035
+			},
1036
+			'EE_Environment_Config'                        => function () {
1037
+				return EE_Config::instance()->environment;
1038
+			},
1039
+			'EED_Core_Rest_Api'                            => static function () {
1040
+				return EED_Core_Rest_Api::instance();
1041
+			},
1042
+		);
1043
+	}
1044
+
1045
+
1046
+	/**
1047
+	 * can be used for supplying alternate names for classes,
1048
+	 * or for connecting interface names to instantiable classes
1049
+	 */
1050
+	protected function _register_core_aliases()
1051
+	{
1052
+		$aliases = array(
1053
+			'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
1054
+			'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
1055
+			'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
1056
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
1057
+			'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
1058
+			'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
1059
+			'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
1060
+			'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
1061
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
1062
+			'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
1063
+			'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1064
+			'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
1065
+			'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
1066
+			'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
1067
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
1068
+			'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
1069
+			'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
1070
+			'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
1071
+			'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
1072
+			'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
1073
+			'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
1074
+			'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
1075
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
1076
+			'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
1077
+			'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
1078
+			'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
1079
+			'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
1080
+			'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
1081
+			'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
1082
+			'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
1083
+			'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
1084
+			'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
1085
+			'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
1086
+			'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
1087
+			'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
1088
+			'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
1089
+			'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
1090
+			'Registration_Processor'                                                       => 'EE_Registration_Processor',
1091
+		);
1092
+		foreach ($aliases as $alias => $fqn) {
1093
+			if (is_array($fqn)) {
1094
+				foreach ($fqn as $class => $for_class) {
1095
+					$this->class_cache->addAlias($class, $alias, $for_class);
1096
+				}
1097
+				continue;
1098
+			}
1099
+			$this->class_cache->addAlias($fqn, $alias);
1100
+		}
1101
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
1102
+			$this->class_cache->addAlias(
1103
+				'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
1104
+				'EventEspresso\core\services\notices\NoticeConverterInterface'
1105
+			);
1106
+		}
1107
+	}
1108
+
1109
+
1110
+	/**
1111
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
1112
+	 * request Primarily used by unit tests.
1113
+	 */
1114
+	public function reset()
1115
+	{
1116
+		$this->_register_core_class_loaders();
1117
+		$this->_register_core_dependencies();
1118
+	}
1119
+
1120
+
1121
+	/**
1122
+	 * PLZ NOTE: a better name for this method would be is_alias()
1123
+	 * because it returns TRUE if the provided fully qualified name IS an alias
1124
+	 * WHY?
1125
+	 * Because if a class is type hinting for a concretion,
1126
+	 * then why would we need to find another class to supply it?
1127
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
1128
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
1129
+	 * Don't go looking for some substitute.
1130
+	 * Whereas if a class is type hinting for an interface...
1131
+	 * then we need to find an actual class to use.
1132
+	 * So the interface IS the alias for some other FQN,
1133
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
1134
+	 * represents some other class.
1135
+	 *
1136
+	 * @deprecated 4.9.62.p
1137
+	 * @param string $fqn
1138
+	 * @param string $for_class
1139
+	 * @return bool
1140
+	 */
1141
+	public function has_alias($fqn = '', $for_class = '')
1142
+	{
1143
+		return $this->isAlias($fqn, $for_class);
1144
+	}
1145
+
1146
+
1147
+	/**
1148
+	 * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
1149
+	 * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
1150
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
1151
+	 *  for example:
1152
+	 *      if the following two entries were added to the _aliases array:
1153
+	 *          array(
1154
+	 *              'interface_alias'           => 'some\namespace\interface'
1155
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
1156
+	 *          )
1157
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
1158
+	 *      to load an instance of 'some\namespace\classname'
1159
+	 *
1160
+	 * @deprecated 4.9.62.p
1161
+	 * @param string $alias
1162
+	 * @param string $for_class
1163
+	 * @return string
1164
+	 */
1165
+	public function get_alias($alias = '', $for_class = '')
1166
+	{
1167
+		return $this->getFqnForAlias($alias, $for_class);
1168
+	}
1169 1169
 }
Please login to merge, or discard this patch.
Spacing   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
     public static function instance(ClassInterfaceCache $class_cache = null)
123 123
     {
124 124
         // check if class object is instantiated, and instantiated properly
125
-        if (! self::$_instance instanceof EE_Dependency_Map
125
+        if ( ! self::$_instance instanceof EE_Dependency_Map
126 126
             && $class_cache instanceof ClassInterfaceCache
127 127
         ) {
128 128
             self::$_instance = new EE_Dependency_Map($class_cache);
@@ -203,18 +203,18 @@  discard block
 block discarded – undo
203 203
     ) {
204 204
         $class = trim($class, '\\');
205 205
         $registered = false;
206
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
207
-            self::$_instance->_dependency_map[ $class ] = array();
206
+        if (empty(self::$_instance->_dependency_map[$class])) {
207
+            self::$_instance->_dependency_map[$class] = array();
208 208
         }
209 209
         // we need to make sure that any aliases used when registering a dependency
210 210
         // get resolved to the correct class name
211 211
         foreach ($dependencies as $dependency => $load_source) {
212 212
             $alias = self::$_instance->getFqnForAlias($dependency);
213 213
             if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
214
+                || ! isset(self::$_instance->_dependency_map[$class][$alias])
215 215
             ) {
216
-                unset($dependencies[ $dependency ]);
217
-                $dependencies[ $alias ] = $load_source;
216
+                unset($dependencies[$dependency]);
217
+                $dependencies[$alias] = $load_source;
218 218
                 $registered = true;
219 219
             }
220 220
         }
@@ -224,13 +224,13 @@  discard block
 block discarded – undo
224 224
         // ie: with A = B + C, entries in B take precedence over duplicate entries in C
225 225
         // Union is way faster than array_merge() but should be used with caution...
226 226
         // especially with numerically indexed arrays
227
-        $dependencies += self::$_instance->_dependency_map[ $class ];
227
+        $dependencies += self::$_instance->_dependency_map[$class];
228 228
         // now we need to ensure that the resulting dependencies
229 229
         // array only has the entries that are required for the class
230 230
         // so first count how many dependencies were originally registered for the class
231
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
231
+        $dependency_count = count(self::$_instance->_dependency_map[$class]);
232 232
         // if that count is non-zero (meaning dependencies were already registered)
233
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
233
+        self::$_instance->_dependency_map[$class] = $dependency_count
234 234
             // then truncate the  final array to match that count
235 235
             ? array_slice($dependencies, 0, $dependency_count)
236 236
             // otherwise just take the incoming array because nothing previously existed
@@ -247,13 +247,13 @@  discard block
 block discarded – undo
247 247
      */
248 248
     public static function register_class_loader($class_name, $loader = 'load_core')
249 249
     {
250
-        if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
250
+        if ( ! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251 251
             throw new DomainException(
252 252
                 esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253 253
             );
254 254
         }
255 255
         // check that loader is callable or method starts with "load_" and exists in EE_Registry
256
-        if (! is_callable($loader)
256
+        if ( ! is_callable($loader)
257 257
             && (
258 258
                 strpos($loader, 'load_') !== 0
259 259
                 || ! method_exists('EE_Registry', $loader)
@@ -270,8 +270,8 @@  discard block
 block discarded – undo
270 270
             );
271 271
         }
272 272
         $class_name = self::$_instance->getFqnForAlias($class_name);
273
-        if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
-            self::$_instance->_class_loaders[ $class_name ] = $loader;
273
+        if ( ! isset(self::$_instance->_class_loaders[$class_name])) {
274
+            self::$_instance->_class_loaders[$class_name] = $loader;
275 275
             return true;
276 276
         }
277 277
         return false;
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
         if (strpos($class_name, 'EEM_') === 0) {
300 300
             $class_name = 'LEGACY_MODELS';
301 301
         }
302
-        return isset($this->_dependency_map[ $class_name ]) ? true : false;
302
+        return isset($this->_dependency_map[$class_name]) ? true : false;
303 303
     }
304 304
 
305 305
 
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
             $class_name = 'LEGACY_MODELS';
318 318
         }
319 319
         $dependency = $this->getFqnForAlias($dependency, $class_name);
320
-        return isset($this->_dependency_map[ $class_name ][ $dependency ])
320
+        return isset($this->_dependency_map[$class_name][$dependency])
321 321
             ? true
322 322
             : false;
323 323
     }
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
         }
339 339
         $dependency = $this->getFqnForAlias($dependency);
340 340
         return $this->has_dependency_for_class($class_name, $dependency)
341
-            ? $this->_dependency_map[ $class_name ][ $dependency ]
341
+            ? $this->_dependency_map[$class_name][$dependency]
342 342
             : EE_Dependency_Map::not_registered;
343 343
     }
344 344
 
@@ -361,7 +361,7 @@  discard block
 block discarded – undo
361 361
             return 'load_core';
362 362
         }
363 363
         $class_name = $this->getFqnForAlias($class_name);
364
-        return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
364
+        return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : '';
365 365
     }
366 366
 
367 367
 
@@ -928,7 +928,7 @@  discard block
 block discarded – undo
928 928
     {
929 929
         $this->_class_loaders = array(
930 930
             // load_core
931
-            'EE_Dependency_Map'                            => function () {
931
+            'EE_Dependency_Map'                            => function() {
932 932
                 return $this;
933 933
             },
934 934
             'EE_Capabilities'                              => 'load_core',
@@ -936,13 +936,13 @@  discard block
 block discarded – undo
936 936
             'EE_Front_Controller'                          => 'load_core',
937 937
             'EE_Module_Request_Router'                     => 'load_core',
938 938
             'EE_Registry'                                  => 'load_core',
939
-            'EE_Request'                                   => function () {
939
+            'EE_Request'                                   => function() {
940 940
                 return $this->legacy_request;
941 941
             },
942
-            'EventEspresso\core\services\request\Request'  => function () {
942
+            'EventEspresso\core\services\request\Request'  => function() {
943 943
                 return $this->request;
944 944
             },
945
-            'EventEspresso\core\services\request\Response' => function () {
945
+            'EventEspresso\core\services\request\Response' => function() {
946 946
                 return $this->response;
947 947
             },
948 948
             'EE_Base'                                      => 'load_core',
@@ -977,7 +977,7 @@  discard block
 block discarded – undo
977 977
             'EE_DMS_Core_4_8_0'                            => 'load_dms',
978 978
             'EE_DMS_Core_4_9_0'                            => 'load_dms',
979 979
             'EE_DMS_Core_4_10_0'                            => 'load_dms',
980
-            'EE_Messages_Generator'                        => function () {
980
+            'EE_Messages_Generator'                        => function() {
981 981
                 return EE_Registry::instance()->load_lib(
982 982
                     'Messages_Generator',
983 983
                     array(),
@@ -985,7 +985,7 @@  discard block
 block discarded – undo
985 985
                     false
986 986
                 );
987 987
             },
988
-            'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
988
+            'EE_Messages_Template_Defaults'                => function($arguments = array()) {
989 989
                 return EE_Registry::instance()->load_lib(
990 990
                     'Messages_Template_Defaults',
991 991
                     $arguments,
@@ -994,49 +994,49 @@  discard block
 block discarded – undo
994 994
                 );
995 995
             },
996 996
             // load_helper
997
-            'EEH_Parse_Shortcodes'                         => function () {
997
+            'EEH_Parse_Shortcodes'                         => function() {
998 998
                 if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
999 999
                     return new EEH_Parse_Shortcodes();
1000 1000
                 }
1001 1001
                 return null;
1002 1002
             },
1003
-            'EE_Template_Config'                           => function () {
1003
+            'EE_Template_Config'                           => function() {
1004 1004
                 return EE_Config::instance()->template_settings;
1005 1005
             },
1006
-            'EE_Currency_Config'                           => function () {
1006
+            'EE_Currency_Config'                           => function() {
1007 1007
                 return EE_Config::instance()->currency;
1008 1008
             },
1009
-            'EE_Registration_Config'                       => function () {
1009
+            'EE_Registration_Config'                       => function() {
1010 1010
                 return EE_Config::instance()->registration;
1011 1011
             },
1012
-            'EE_Core_Config'                               => function () {
1012
+            'EE_Core_Config'                               => function() {
1013 1013
                 return EE_Config::instance()->core;
1014 1014
             },
1015
-            'EventEspresso\core\services\loaders\Loader'   => function () {
1015
+            'EventEspresso\core\services\loaders\Loader'   => function() {
1016 1016
                 return LoaderFactory::getLoader();
1017 1017
             },
1018
-            'EE_Network_Config'                            => function () {
1018
+            'EE_Network_Config'                            => function() {
1019 1019
                 return EE_Network_Config::instance();
1020 1020
             },
1021
-            'EE_Config'                                    => function () {
1021
+            'EE_Config'                                    => function() {
1022 1022
                 return EE_Config::instance();
1023 1023
             },
1024
-            'EventEspresso\core\domain\Domain'             => function () {
1024
+            'EventEspresso\core\domain\Domain'             => function() {
1025 1025
                 return DomainFactory::getEventEspressoCoreDomain();
1026 1026
             },
1027
-            'EE_Admin_Config'                              => function () {
1027
+            'EE_Admin_Config'                              => function() {
1028 1028
                 return EE_Config::instance()->admin;
1029 1029
             },
1030
-            'EE_Organization_Config'                       => function () {
1030
+            'EE_Organization_Config'                       => function() {
1031 1031
                 return EE_Config::instance()->organization;
1032 1032
             },
1033
-            'EE_Network_Core_Config'                       => function () {
1033
+            'EE_Network_Core_Config'                       => function() {
1034 1034
                 return EE_Network_Config::instance()->core;
1035 1035
             },
1036
-            'EE_Environment_Config'                        => function () {
1036
+            'EE_Environment_Config'                        => function() {
1037 1037
                 return EE_Config::instance()->environment;
1038 1038
             },
1039
-            'EED_Core_Rest_Api'                            => static function () {
1039
+            'EED_Core_Rest_Api'                            => static function() {
1040 1040
                 return EED_Core_Rest_Api::instance();
1041 1041
             },
1042 1042
         );
@@ -1098,7 +1098,7 @@  discard block
 block discarded – undo
1098 1098
             }
1099 1099
             $this->class_cache->addAlias($fqn, $alias);
1100 1100
         }
1101
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
1101
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
1102 1102
             $this->class_cache->addAlias(
1103 1103
                 'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
1104 1104
                 'EventEspresso\core\services\notices\NoticeConverterInterface'
Please login to merge, or discard this patch.