Completed
Branch EDTR/refactor-master (6f4a48)
by
unknown
19:30 queued 10:54
created

Registrations_Admin_Page::getStatusModel()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
3
use EventEspresso\core\domain\Domain;
4
use EventEspresso\core\domain\entities\contexts\Context;
5
use EventEspresso\core\exceptions\EntityNotFoundException;
6
use EventEspresso\core\exceptions\InvalidDataTypeException;
7
use EventEspresso\core\exceptions\InvalidFormSubmissionException;
8
use EventEspresso\core\exceptions\InvalidInterfaceException;
9
use EventEspresso\core\domain\services\attendee\forms\AttendeeContactDetailsMetaboxFormHandler;
10
11
/**
12
 * Registrations_Admin_Page class
13
 *
14
 * @package               Event Espresso
15
 * @subpackage            includes/core/admin/transactions/Registrations_Admin_Page.core.php
16
 * @author                Brent Christensen
17
 */
18
class Registrations_Admin_Page extends EE_Admin_Page_CPT
19
{
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 = null;
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->getLoader()->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->getLoader()->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->getLoader()->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->getLoader()->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 View Code Duplication
    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 View Code Duplication
    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');
0 ignored issues
show
Coding Style Comprehensibility introduced by
$def_reg_status_actions was never initialized. Although not strictly required by PHP, it is generally a good practice to add $def_reg_status_actions = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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 View Code Duplication
        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 View Code Duplication
        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->getLoader()->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->getLoader()->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,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
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,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
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,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
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,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
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,
0 ignored issues
show
Bug introduced by
The property wp_page_slug does not seem to exist. Did you mean page_slug?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
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;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$result was never initialized. Although not strictly required by PHP, it is generally a good practice to add $result = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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 View Code Duplication
        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
	<table class="form-table ee-width-100">
2209
		<tbody>
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 '
2233
			<tr class="hide-if-no-js">
2234
				<th> </th>
2235
				<td class="reg-admin-edit-attendee-question-td">
2236
					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2237
               . esc_attr__('click to edit question', 'event_espresso')
2238
               . '">
2239
						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2240
               . esc_html__('edit the above question group', 'event_espresso')
2241
               . '</span>
2242
						<div class="dashicons dashicons-edit"></div>
2243
					</a>
2244
				</td>
2245
			</tr>
2246
		</tbody>
2247
	</table>
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 View Code Duplication
    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
			<tr>
2272
				<th>
2273
					' . $label . '
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 View Code Duplication
    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
				<td class="reg-admin-attendee-questions-input-td disabled-input">
2298
					' . $input . '
2299
				</td>
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 View Code Duplication
        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
	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2871
	<script >
2872
		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2873
		// after just adding a new registration... we gotta try to put a stop to that !!!
2874
		var timer = 30;
2875
		setInterval( function () {
2876
			jQuery("#redirect_timer").html( parseInt( timer ) );
2877
	        if ( --timer < 0 ) {
2878
	            window.history.forward()
2879
	        }
2880
	    }, 800 );
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 View Code Duplication
        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;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$query_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $query_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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 View Code Duplication
        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 View Code Duplication
        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;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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
}
3747