Completed
Branch FET-Wait-List (2b1ad0)
by
unknown
128:56 queued 117:50
created

getAttendeeContactDetailsMetaboxFormHandler()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
use EventEspresso\core\domain\Domain;
4
use EventEspresso\core\domain\entities\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
defined('EVENT_ESPRESSO_VERSION') || exit('No direct script access allowed');
11
12
13
/**
14
 * Event Espresso
15
 * Event Registration and Management Plugin for WordPress
16
 * @ package            Event Espresso
17
 * @ author                Seth Shoultes
18
 * @ copyright        (c) 2008-2011 Event Espresso  All Rights Reserved.
19
 * @ license            {@link http://eventespresso.com/support/terms-conditions/}   * see Plugin Licensing *
20
 * @ link                    {@link http://www.eventespresso.com}
21
 * @ since                4.0
22
 * ------------------------------------------------------------------------
23
 * Registrations_Admin_Page class
24
 *
25
 * @package               Event Espresso
26
 * @subpackage            includes/core/admin/transactions/Registrations_Admin_Page.core.php
27
 * @author                Brent Christensen
28
 *                        ------------------------------------------------------------------------
29
 */
30
class Registrations_Admin_Page extends EE_Admin_Page_CPT
31
{
32
33
    /**
34
     * @var EE_Registration
35
     */
36
    private $_registration;
37
38
    /**
39
     * @var EE_Event
40
     */
41
    private $_reg_event;
42
43
    /**
44
     * @var EE_Session
45
     */
46
    private $_session;
47
48
    private static $_reg_status;
49
50
    /**
51
     * Form for displaying the custom questions for this registration.
52
     * This gets used a few times throughout the request so its best to cache it
53
     *
54
     * @var EE_Registration_Custom_Questions_Form
55
     */
56
    protected $_reg_custom_questions_form = null;
57
58
59
    /**
60
     *        constructor
61
     *
62
     * @Constructor
63
     * @access public
64
     * @param bool $routing
65
     * @return Registrations_Admin_Page
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
66
     */
67
    public function __construct($routing = true)
68
    {
69
        parent::__construct($routing);
70
        add_action('wp_loaded', array($this, 'wp_loaded'));
71
    }
72
73
74
    public function wp_loaded()
75
    {
76
        // when adding a new registration...
77
        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
78
            EE_System::do_not_cache();
79
            if (! isset($this->_req_data['processing_registration'])
80
                 || absint($this->_req_data['processing_registration']) !== 1
81
            ) {
82
                // and it's NOT the attendee information reg step
83
                // force cookie expiration by setting time to last week
84
                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
85
                // and update the global
86
                $_COOKIE['ee_registration_added'] = 0;
87
            }
88
        }
89
    }
90
91
92
    protected function _init_page_props()
93
    {
94
        $this->page_slug        = REG_PG_SLUG;
95
        $this->_admin_base_url  = REG_ADMIN_URL;
96
        $this->_admin_base_path = REG_ADMIN;
97
        $this->page_label       = esc_html__('Registrations', 'event_espresso');
98
        $this->_cpt_routes      = array(
99
            'add_new_attendee' => 'espresso_attendees',
100
            'edit_attendee'    => 'espresso_attendees',
101
            'insert_attendee'  => 'espresso_attendees',
102
            'update_attendee'  => 'espresso_attendees',
103
        );
104
        $this->_cpt_model_names = array(
105
            'add_new_attendee' => 'EEM_Attendee',
106
            'edit_attendee'    => 'EEM_Attendee',
107
        );
108
        $this->_cpt_edit_routes = array(
109
            'espresso_attendees' => 'edit_attendee',
110
        );
111
        $this->_pagenow_map     = array(
112
            'add_new_attendee' => 'post-new.php',
113
            'edit_attendee'    => 'post.php',
114
            'trash'            => 'post.php',
115
        );
116
        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
117
        //add filters so that the comment urls don't take users to a confusing 404 page
118
        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
119
    }
120
121
122
    public function clear_comment_link($link, $comment, $args)
123
    {
124
        //gotta make sure this only happens on this route
125
        $post_type = get_post_type($comment->comment_post_ID);
126
        if ($post_type === 'espresso_attendees') {
127
            return '#commentsdiv';
128
        }
129
        return $link;
130
    }
131
132
133
    protected function _ajax_hooks()
134
    {
135
        //todo: all hooks for registrations ajax goes in here
136
        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
137
    }
138
139
140
    protected function _define_page_props()
141
    {
142
        $this->_admin_page_title = $this->page_label;
143
        $this->_labels           = array(
144
            'buttons'                      => array(
145
                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
146
                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
147
                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
148
                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
149
                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
150
                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
151
                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
152
                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
153
            ),
154
            'publishbox'                   => array(
155
                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
156
                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
157
            ),
158
            'hide_add_button_on_cpt_route' => array(
159
                'edit_attendee' => true,
160
            ),
161
        );
162
    }
163
164
165
    /**
166
     *        grab url requests and route them
167
     *
168
     * @access private
169
     * @return void
170
     */
171
    public function _set_page_routes()
172
    {
173
        $this->_get_registration_status_array();
174
        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
175
            ? $this->_req_data['_REG_ID'] : 0;
176
        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
177
            ? $this->_req_data['reg_status_change_form']['REG_ID']
178
            : $reg_id;
179
        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
180
            ? $this->_req_data['ATT_ID'] : 0;
181
        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
182
            ? $this->_req_data['post']
183
            : $att_id;
184
        $this->_page_routes = array(
185
            'default'                            => array(
186
                'func'       => '_registrations_overview_list_table',
187
                'capability' => 'ee_read_registrations',
188
            ),
189
            'view_registration'                  => array(
190
                'func'       => '_registration_details',
191
                'capability' => 'ee_read_registration',
192
                'obj_id'     => $reg_id,
193
            ),
194
            'edit_registration'                  => array(
195
                'func'               => '_update_attendee_registration_form',
196
                'noheader'           => true,
197
                'headers_sent_route' => 'view_registration',
198
                'capability'         => 'ee_edit_registration',
199
                'obj_id'             => $reg_id,
200
                '_REG_ID'            => $reg_id,
201
            ),
202
            'trash_registrations'                => array(
203
                'func'       => '_trash_or_restore_registrations',
204
                'args'       => array('trash' => true),
205
                'noheader'   => true,
206
                'capability' => 'ee_delete_registrations',
207
            ),
208
            'restore_registrations'              => array(
209
                'func'       => '_trash_or_restore_registrations',
210
                'args'       => array('trash' => false),
211
                'noheader'   => true,
212
                'capability' => 'ee_delete_registrations',
213
            ),
214
            'delete_registrations'               => array(
215
                'func'       => '_delete_registrations',
216
                'noheader'   => true,
217
                'capability' => 'ee_delete_registrations',
218
            ),
219
            'new_registration'                   => array(
220
                'func'       => 'new_registration',
221
                'capability' => 'ee_edit_registrations',
222
            ),
223
            'process_reg_step'                   => array(
224
                'func'       => 'process_reg_step',
225
                'noheader'   => true,
226
                'capability' => 'ee_edit_registrations',
227
            ),
228
            'redirect_to_txn'                    => array(
229
                'func'       => 'redirect_to_txn',
230
                'noheader'   => true,
231
                'capability' => 'ee_edit_registrations',
232
            ),
233
            'change_reg_status'                  => array(
234
                'func'       => '_change_reg_status',
235
                'noheader'   => true,
236
                'capability' => 'ee_edit_registration',
237
                'obj_id'     => $reg_id,
238
            ),
239
            'approve_registration'               => array(
240
                'func'       => 'approve_registration',
241
                'noheader'   => true,
242
                'capability' => 'ee_edit_registration',
243
                'obj_id'     => $reg_id,
244
            ),
245
            'approve_and_notify_registration'    => array(
246
                'func'       => 'approve_registration',
247
                'noheader'   => true,
248
                'args'       => array(true),
249
                'capability' => 'ee_edit_registration',
250
                'obj_id'     => $reg_id,
251
            ),
252
            'approve_registrations'               => array(
253
                'func'       => 'bulk_action_on_registrations',
254
                'noheader'   => true,
255
                'capability' => 'ee_edit_registrations',
256
                'args' => array('approve')
257
            ),
258
            'approve_and_notify_registrations'               => array(
259
                'func'       => 'bulk_action_on_registrations',
260
                'noheader'   => true,
261
                'capability' => 'ee_edit_registrations',
262
                'args' => array('approve', true)
263
            ),
264
            'decline_registration'               => array(
265
                'func'       => 'decline_registration',
266
                'noheader'   => true,
267
                'capability' => 'ee_edit_registration',
268
                'obj_id'     => $reg_id,
269
            ),
270
            'decline_and_notify_registration'    => array(
271
                'func'       => 'decline_registration',
272
                'noheader'   => true,
273
                'args'       => array(true),
274
                'capability' => 'ee_edit_registration',
275
                'obj_id'     => $reg_id,
276
            ),
277
            'decline_registrations'               => array(
278
                'func'       => 'bulk_action_on_registrations',
279
                'noheader'   => true,
280
                'capability' => 'ee_edit_registrations',
281
                'args' => array('decline')
282
            ),
283
            'decline_and_notify_registrations'    => array(
284
                'func'       => 'bulk_action_on_registrations',
285
                'noheader'   => true,
286
                'capability' => 'ee_edit_registrations',
287
                'args' => array('decline', true)
288
            ),
289
            'pending_registration'               => array(
290
                'func'       => 'pending_registration',
291
                'noheader'   => true,
292
                'capability' => 'ee_edit_registration',
293
                'obj_id'     => $reg_id,
294
            ),
295
            'pending_and_notify_registration'    => array(
296
                'func'       => 'pending_registration',
297
                'noheader'   => true,
298
                'args'       => array(true),
299
                'capability' => 'ee_edit_registration',
300
                'obj_id'     => $reg_id,
301
            ),
302
            'pending_registrations'               => array(
303
                'func'       => 'bulk_action_on_registrations',
304
                'noheader'   => true,
305
                'capability' => 'ee_edit_registrations',
306
                'args' => array('pending')
307
            ),
308
            'pending_and_notify_registrations'    => array(
309
                'func'       => 'bulk_action_on_registrations',
310
                'noheader'   => true,
311
                'capability' => 'ee_edit_registrations',
312
                'args' => array('pending', true)
313
            ),
314
            'no_approve_registration'            => array(
315
                'func'       => 'not_approve_registration',
316
                'noheader'   => true,
317
                'capability' => 'ee_edit_registration',
318
                'obj_id'     => $reg_id,
319
            ),
320
            'no_approve_and_notify_registration' => array(
321
                'func'       => 'not_approve_registration',
322
                'noheader'   => true,
323
                'args'       => array(true),
324
                'capability' => 'ee_edit_registration',
325
                'obj_id'     => $reg_id,
326
            ),
327
            'no_approve_registrations'            => array(
328
                'func'       => 'bulk_action_on_registrations',
329
                'noheader'   => true,
330
                'capability' => 'ee_edit_registrations',
331
                'args' => array('not_approve')
332
            ),
333
            'no_approve_and_notify_registrations' => array(
334
                'func'       => 'bulk_action_on_registrations',
335
                'noheader'   => true,
336
                'capability' => 'ee_edit_registrations',
337
                'args' => array('not_approve', true)
338
            ),
339
            'cancel_registration'                => array(
340
                'func'       => 'cancel_registration',
341
                'noheader'   => true,
342
                'capability' => 'ee_edit_registration',
343
                'obj_id'     => $reg_id,
344
            ),
345
            'cancel_and_notify_registration'     => array(
346
                'func'       => 'cancel_registration',
347
                'noheader'   => true,
348
                'args'       => array(true),
349
                'capability' => 'ee_edit_registration',
350
                'obj_id'     => $reg_id,
351
            ),
352
            'cancel_registrations'                => array(
353
                'func'       => 'bulk_action_on_registrations',
354
                'noheader'   => true,
355
                'capability' => 'ee_edit_registrations',
356
                'args' => array('cancel')
357
            ),
358
            'cancel_and_notify_registrations'     => array(
359
                'func'       => 'bulk_action_on_registrations',
360
                'noheader'   => true,
361
                'capability' => 'ee_edit_registrations',
362
                'args' => array('cancel', true)
363
            ),
364
            'wait_list_registration' => array(
365
                'func'       => 'wait_list_registration',
366
                'noheader'   => true,
367
                'capability' => 'ee_edit_registration',
368
                'obj_id'     => $reg_id,
369
            ),
370
            'wait_list_and_notify_registration' => array(
371
                'func'       => 'wait_list_registration',
372
                'noheader'   => true,
373
                'args'       => array(true),
374
                'capability' => 'ee_edit_registration',
375
                'obj_id'     => $reg_id,
376
            ),
377
            'contact_list'                       => array(
378
                'func'       => '_attendee_contact_list_table',
379
                'capability' => 'ee_read_contacts',
380
            ),
381
            'add_new_attendee'                   => array(
382
                'func' => '_create_new_cpt_item',
383
                'args' => array(
384
                    'new_attendee' => true,
385
                    'capability'   => 'ee_edit_contacts',
386
                ),
387
            ),
388
            'edit_attendee'                      => array(
389
                'func'       => '_edit_cpt_item',
390
                'capability' => 'ee_edit_contacts',
391
                'obj_id'     => $att_id,
392
            ),
393
            'duplicate_attendee'                 => array(
394
                'func'       => '_duplicate_attendee',
395
                'noheader'   => true,
396
                'capability' => 'ee_edit_contacts',
397
                'obj_id'     => $att_id,
398
            ),
399
            'insert_attendee'                    => array(
400
                'func'       => '_insert_or_update_attendee',
401
                'args'       => array(
402
                    'new_attendee' => true,
403
                ),
404
                'noheader'   => true,
405
                'capability' => 'ee_edit_contacts',
406
            ),
407
            'update_attendee'                    => array(
408
                'func'       => '_insert_or_update_attendee',
409
                'args'       => array(
410
                    'new_attendee' => false,
411
                ),
412
                'noheader'   => true,
413
                'capability' => 'ee_edit_contacts',
414
                'obj_id'     => $att_id,
415
            ),
416
            'trash_attendees' => array(
417
                'func' => '_trash_or_restore_attendees',
418
                'args' => array(
419
                    'trash' => 'true'
420
                ),
421
                'noheader' => true,
422
                'capability' => 'ee_delete_contacts'
423
            ),
424
            'trash_attendee'                    => array(
425
                'func'       => '_trash_or_restore_attendees',
426
                'args'       => array(
427
                    'trash' => true,
428
                ),
429
                'noheader'   => true,
430
                'capability' => 'ee_delete_contacts',
431
                'obj_id'     => $att_id,
432
            ),
433
            'restore_attendees'                  => array(
434
                'func'       => '_trash_or_restore_attendees',
435
                'args'       => array(
436
                    'trash' => false,
437
                ),
438
                'noheader'   => true,
439
                'capability' => 'ee_delete_contacts',
440
                'obj_id'     => $att_id,
441
            ),
442
            'resend_registration'                => array(
443
                'func'       => '_resend_registration',
444
                'noheader'   => true,
445
                'capability' => 'ee_send_message',
446
            ),
447
            'registrations_report'               => array(
448
                'func'       => '_registrations_report',
449
                'noheader'   => true,
450
                'capability' => 'ee_read_registrations',
451
            ),
452
            'contact_list_export'                => array(
453
                'func'       => '_contact_list_export',
454
                'noheader'   => true,
455
                'capability' => 'export',
456
            ),
457
            'contact_list_report'                => array(
458
                'func'       => '_contact_list_report',
459
                'noheader'   => true,
460
                'capability' => 'ee_read_contacts',
461
            ),
462
        );
463
    }
464
465
466
    protected function _set_page_config()
467
    {
468
        $this->_page_config = array(
469
            'default'           => array(
470
                'nav'           => array(
471
                    'label' => esc_html__('Overview', 'event_espresso'),
472
                    'order' => 5,
473
                ),
474
                'help_tabs'     => array(
475
                    'registrations_overview_help_tab'                       => array(
476
                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
477
                        'filename' => 'registrations_overview',
478
                    ),
479
                    'registrations_overview_table_column_headings_help_tab' => array(
480
                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
481
                        'filename' => 'registrations_overview_table_column_headings',
482
                    ),
483
                    'registrations_overview_filters_help_tab'               => array(
484
                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
485
                        'filename' => 'registrations_overview_filters',
486
                    ),
487
                    'registrations_overview_views_help_tab'                 => array(
488
                        'title'    => esc_html__('Registration Views', 'event_espresso'),
489
                        'filename' => 'registrations_overview_views',
490
                    ),
491
                    'registrations_regoverview_other_help_tab'              => array(
492
                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
493
                        'filename' => 'registrations_overview_other',
494
                    ),
495
                ),
496
                'help_tour'     => array('Registration_Overview_Help_Tour'),
497
                'qtips'         => array('Registration_List_Table_Tips'),
498
                'list_table'    => 'EE_Registrations_List_Table',
499
                'require_nonce' => false,
500
            ),
501
            'view_registration' => array(
502
                'nav'           => array(
503
                    'label'      => esc_html__('REG Details', 'event_espresso'),
504
                    'order'      => 15,
505
                    'url'        => isset($this->_req_data['_REG_ID'])
506
                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
507
                        : $this->_admin_base_url,
508
                    'persistent' => false,
509
                ),
510
                'help_tabs'     => array(
511
                    'registrations_details_help_tab'                    => array(
512
                        'title'    => esc_html__('Registration Details', 'event_espresso'),
513
                        'filename' => 'registrations_details',
514
                    ),
515
                    'registrations_details_table_help_tab'              => array(
516
                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
517
                        'filename' => 'registrations_details_table',
518
                    ),
519
                    'registrations_details_form_answers_help_tab'       => array(
520
                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
521
                        'filename' => 'registrations_details_form_answers',
522
                    ),
523
                    'registrations_details_registrant_details_help_tab' => array(
524
                        'title'    => esc_html__('Contact Details', 'event_espresso'),
525
                        'filename' => 'registrations_details_registrant_details',
526
                    ),
527
                ),
528
                'help_tour'     => array('Registration_Details_Help_Tour'),
529
                'metaboxes'     => array_merge(
530
                    $this->_default_espresso_metaboxes,
531
                    array('_registration_details_metaboxes')
532
                ),
533
                'require_nonce' => false,
534
            ),
535
            'new_registration'  => array(
536
                'nav'           => array(
537
                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
538
                    'url'        => '#',
539
                    'order'      => 15,
540
                    'persistent' => false,
541
                ),
542
                'metaboxes'     => $this->_default_espresso_metaboxes,
543
                'labels'        => array(
544
                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
545
                ),
546
                'require_nonce' => false,
547
            ),
548
            'add_new_attendee'  => array(
549
                'nav'           => array(
550
                    'label'      => esc_html__('Add Contact', 'event_espresso'),
551
                    'order'      => 15,
552
                    'persistent' => false,
553
                ),
554
                'metaboxes'     => array_merge(
555
                    $this->_default_espresso_metaboxes,
556
                    array('_publish_post_box', 'attendee_editor_metaboxes')
557
                ),
558
                'require_nonce' => false,
559
            ),
560
            'edit_attendee'     => array(
561
                'nav'           => array(
562
                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
563
                    'order'      => 15,
564
                    'persistent' => false,
565
                    'url'        => isset($this->_req_data['ATT_ID'])
566
                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
567
                        : $this->_admin_base_url,
568
                ),
569
                'metaboxes'     => array('attendee_editor_metaboxes'),
570
                'require_nonce' => false,
571
            ),
572
            'contact_list'      => array(
573
                'nav'           => array(
574
                    'label' => esc_html__('Contact List', 'event_espresso'),
575
                    'order' => 20,
576
                ),
577
                'list_table'    => 'EE_Attendee_Contact_List_Table',
578
                'help_tabs'     => array(
579
                    'registrations_contact_list_help_tab'                       => array(
580
                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
581
                        'filename' => 'registrations_contact_list',
582
                    ),
583
                    'registrations_contact-list_table_column_headings_help_tab' => array(
584
                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
585
                        'filename' => 'registrations_contact_list_table_column_headings',
586
                    ),
587
                    'registrations_contact_list_views_help_tab'                 => array(
588
                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
589
                        'filename' => 'registrations_contact_list_views',
590
                    ),
591
                    'registrations_contact_list_other_help_tab'                 => array(
592
                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
593
                        'filename' => 'registrations_contact_list_other',
594
                    ),
595
                ),
596
                'help_tour'     => array('Contact_List_Help_Tour'),
597
                'metaboxes'     => array(),
598
                'require_nonce' => false,
599
            ),
600
            //override default cpt routes
601
            'create_new'        => '',
602
            'edit'              => '',
603
        );
604
    }
605
606
607
    /**
608
     * The below methods aren't used by this class currently
609
     */
610
    protected function _add_screen_options()
611
    {
612
    }
613
614
615
    protected function _add_feature_pointers()
616
    {
617
    }
618
619
620
    public function admin_init()
621
    {
622
        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
623
            'click "Update Registration Questions" to save your changes',
624
            'event_espresso'
625
        );
626
    }
627
628
629
    public function admin_notices()
630
    {
631
    }
632
633
634
    public function admin_footer_scripts()
635
    {
636
    }
637
638
639
    /**
640
     *        get list of registration statuses
641
     *
642
     * @access private
643
     * @return void
644
     * @throws EE_Error
645
     */
646
    private function _get_registration_status_array()
647
    {
648
        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
649
    }
650
651
652
    protected function _add_screen_options_default()
653
    {
654
        $this->_per_page_screen_option();
655
    }
656
657
658
    protected function _add_screen_options_contact_list()
659
    {
660
        $page_title              = $this->_admin_page_title;
661
        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
662
        $this->_per_page_screen_option();
663
        $this->_admin_page_title = $page_title;
664
    }
665
666
667 View Code Duplication
    public function load_scripts_styles()
668
    {
669
        //style
670
        wp_register_style(
671
            'espresso_reg',
672
            REG_ASSETS_URL . 'espresso_registrations_admin.css',
673
            array('ee-admin-css'),
674
            EVENT_ESPRESSO_VERSION
675
        );
676
        wp_enqueue_style('espresso_reg');
677
        //script
678
        wp_register_script(
679
            'espresso_reg',
680
            REG_ASSETS_URL . 'espresso_registrations_admin.js',
681
            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
682
            EVENT_ESPRESSO_VERSION,
683
            true
684
        );
685
        wp_enqueue_script('espresso_reg');
686
    }
687
688
689
    public function load_scripts_styles_edit_attendee()
690
    {
691
        //stuff to only show up on our attendee edit details page.
692
        $attendee_details_translations = array(
693
            'att_publish_text' => sprintf(
694
                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
695
                $this->_cpt_model_obj->get_datetime('ATT_created')
696
            ),
697
        );
698
        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
699
        wp_enqueue_script('jquery-validate');
700
    }
701
702
703
    public function load_scripts_styles_view_registration()
704
    {
705
        //styles
706
        wp_enqueue_style('espresso-ui-theme');
707
        //scripts
708
        $this->_get_reg_custom_questions_form($this->_registration->ID());
709
        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
710
    }
711
712
713
    public function load_scripts_styles_contact_list()
714
    {
715
        wp_deregister_style('espresso_reg');
716
        wp_register_style(
717
            'espresso_att',
718
            REG_ASSETS_URL . 'espresso_attendees_admin.css',
719
            array('ee-admin-css'),
720
            EVENT_ESPRESSO_VERSION
721
        );
722
        wp_enqueue_style('espresso_att');
723
    }
724
725
726
    public function load_scripts_styles_new_registration()
727
    {
728
        wp_register_script(
729
            'ee-spco-for-admin',
730
            REG_ASSETS_URL . 'spco_for_admin.js',
731
            array('underscore', 'jquery'),
732
            EVENT_ESPRESSO_VERSION,
733
            true
734
        );
735
        wp_enqueue_script('ee-spco-for-admin');
736
        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
737
        EE_Form_Section_Proper::wp_enqueue_scripts();
738
        EED_Ticket_Selector::load_tckt_slctr_assets();
739
        EE_Datepicker_Input::enqueue_styles_and_scripts();
740
    }
741
742
743
    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
744
    {
745
        add_filter('FHEE_load_EE_messages', '__return_true');
746
    }
747
748
749
    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
750
    {
751
        add_filter('FHEE_load_EE_messages', '__return_true');
752
    }
753
754
755
    protected function _set_list_table_views_default()
756
    {
757
        //for notification related bulk actions we need to make sure only active messengers have an option.
758
        EED_Messages::set_autoloaders();
759
        /** @type EE_Message_Resource_Manager $message_resource_manager */
760
        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
761
        $active_mts               = $message_resource_manager->list_of_active_message_types();
762
        //key= bulk_action_slug, value= message type.
763
        $match_array = array(
764
            'approve_registrations'    => 'registration',
765
            'decline_registrations'    => 'declined_registration',
766
            'pending_registrations'    => 'pending_approval',
767
            'no_approve_registrations' => 'not_approved_registration',
768
            'cancel_registrations'     => 'cancelled_registration',
769
        );
770
        $can_send = EE_Registry::instance()->CAP->current_user_can(
771
            'ee_send_message',
772
            'batch_send_messages'
773
        );
774
        /** setup reg status bulk actions **/
775
        $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...
776
        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
777
                $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
778
                    'Approve and Notify Registrations',
779
                    'event_espresso'
780
                );
781
        }
782
        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
783
        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
784
                $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
785
                    'Decline and Notify Registrations',
786
                    'event_espresso'
787
                );
788
        }
789
        $def_reg_status_actions['pending_registrations'] = esc_html__(
790
            'Set Registrations to Pending Payment',
791
            'event_espresso'
792
        );
793
        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
794
                $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
795
                    'Set Registrations to Pending Payment and Notify',
796
                    'event_espresso'
797
                );
798
        }
799
        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
800
            'Set Registrations to Not Approved',
801
            'event_espresso'
802
        );
803
        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
804
                $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
805
                    'Set Registrations to Not Approved and Notify',
806
                    'event_espresso'
807
                );
808
        }
809
        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
810
        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
811
                $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
812
                    'Cancel Registrations and Notify',
813
                    'event_espresso'
814
                );
815
        }
816
        $def_reg_status_actions = apply_filters(
817
            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
818
            $def_reg_status_actions,
819
            $active_mts,
820
            $can_send
821
        );
822
823
        $this->_views = array(
824
            'all'   => array(
825
                'slug'        => 'all',
826
                'label'       => esc_html__('View All Registrations', 'event_espresso'),
827
                'count'       => 0,
828
                'bulk_action' => array_merge($def_reg_status_actions, array(
829
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
830
                )),
831
            ),
832
            'month' => array(
833
                'slug'        => 'month',
834
                'label'       => esc_html__('This Month', 'event_espresso'),
835
                'count'       => 0,
836
                'bulk_action' => array_merge($def_reg_status_actions, array(
837
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
838
                )),
839
            ),
840
            'today' => array(
841
                'slug'        => 'today',
842
                'label'       => sprintf(
843
                    esc_html__('Today - %s', 'event_espresso'),
844
                    date('M d, Y', current_time('timestamp'))
845
                ),
846
                'count'       => 0,
847
                'bulk_action' => array_merge($def_reg_status_actions, array(
848
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
849
                )),
850
            ),
851
        );
852
        if (EE_Registry::instance()->CAP->current_user_can(
853
            'ee_delete_registrations',
854
            'espresso_registrations_delete_registration'
855
        )) {
856
            $this->_views['incomplete'] = array(
857
                'slug'        => 'incomplete',
858
                'label'       => esc_html__('Incomplete', 'event_espresso'),
859
                'count'       => 0,
860
                'bulk_action' => array(
861
                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
862
                ),
863
            );
864
            $this->_views['trash']      = array(
865
                'slug'        => 'trash',
866
                'label'       => esc_html__('Trash', 'event_espresso'),
867
                'count'       => 0,
868
                'bulk_action' => array(
869
                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
870
                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
871
                ),
872
            );
873
        }
874
    }
875
876
877
    protected function _set_list_table_views_contact_list()
878
    {
879
        $this->_views = array(
880
            'in_use' => array(
881
                'slug'        => 'in_use',
882
                'label'       => esc_html__('In Use', 'event_espresso'),
883
                'count'       => 0,
884
                'bulk_action' => array(
885
                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
886
                ),
887
            ),
888
        );
889
        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
890
            'espresso_registrations_trash_attendees')
891
        ) {
892
            $this->_views['trash'] = array(
893
                'slug'        => 'trash',
894
                'label'       => esc_html__('Trash', 'event_espresso'),
895
                'count'       => 0,
896
                'bulk_action' => array(
897
                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
898
                ),
899
            );
900
        }
901
    }
902
903
904
    protected function _registration_legend_items()
905
    {
906
        $fc_items = array(
907
            'star-icon'        => array(
908
                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
909
                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
910
            ),
911
            'view_details'     => array(
912
                'class' => 'dashicons dashicons-clipboard',
913
                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
914
            ),
915
            'edit_attendee'    => array(
916
                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
917
                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
918
            ),
919
            'view_transaction' => array(
920
                'class' => 'dashicons dashicons-cart',
921
                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
922
            ),
923
            'view_invoice'     => array(
924
                'class' => 'dashicons dashicons-media-spreadsheet',
925
                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
926
            ),
927
        );
928
        if (EE_Registry::instance()->CAP->current_user_can(
929
            'ee_send_message',
930
            'espresso_registrations_resend_registration'
931
        )) {
932
            $fc_items['resend_registration'] = array(
933
                'class' => 'dashicons dashicons-email-alt',
934
                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
935
            );
936
        } else {
937
            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
938
        }
939 View Code Duplication
        if (EE_Registry::instance()->CAP->current_user_can(
940
            'ee_read_global_messages',
941
            'view_filtered_messages'
942
        )) {
943
            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
944
            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
945
                $fc_items['view_related_messages'] = array(
946
                    'class' => $related_for_icon['css_class'],
947
                    'desc'  => $related_for_icon['label'],
948
                );
949
            }
950
        }
951
        $sc_items = array(
952
            'approved_status'   => array(
953
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
954
                'desc'  => EEH_Template::pretty_status(
955
                    EEM_Registration::status_id_approved,
956
                    false,
957
                    'sentence'
958
                ),
959
            ),
960
            'pending_status'    => array(
961
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
962
                'desc'  => EEH_Template::pretty_status(
963
                    EEM_Registration::status_id_pending_payment,
964
                    false,
965
                    'sentence'
966
                ),
967
            ),
968
            'wait_list'         => array(
969
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
970
                'desc'  => EEH_Template::pretty_status(
971
                    EEM_Registration::status_id_wait_list,
972
                    false,
973
                    'sentence'
974
                ),
975
            ),
976
            'incomplete_status' => array(
977
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
978
                'desc'  => EEH_Template::pretty_status(
979
                    EEM_Registration::status_id_incomplete,
980
                    false,
981
                    'sentence'
982
                ),
983
            ),
984
            'not_approved'      => array(
985
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
986
                'desc'  => EEH_Template::pretty_status(
987
                    EEM_Registration::status_id_not_approved,
988
                    false,
989
                    'sentence'
990
                ),
991
            ),
992
            'declined_status'   => array(
993
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
994
                'desc'  => EEH_Template::pretty_status(
995
                    EEM_Registration::status_id_declined,
996
                    false,
997
                    'sentence'
998
                ),
999
            ),
1000
            'cancelled_status'  => array(
1001
                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1002
                'desc'  => EEH_Template::pretty_status(
1003
                    EEM_Registration::status_id_cancelled,
1004
                    false,
1005
                    'sentence'
1006
                ),
1007
            ),
1008
        );
1009
        return array_merge($fc_items, $sc_items);
1010
    }
1011
1012
1013
1014
    /***************************************        REGISTRATION OVERVIEW        **************************************/
1015
    /**
1016
     * @throws \EE_Error
1017
     */
1018
    protected function _registrations_overview_list_table()
1019
    {
1020
        $this->_template_args['admin_page_header'] = '';
1021
        $EVT_ID                                    = ! empty($this->_req_data['event_id'])
1022
            ? absint($this->_req_data['event_id'])
1023
            : 0;
1024
        if ($EVT_ID) {
1025
            if (EE_Registry::instance()->CAP->current_user_can(
1026
                'ee_edit_registrations',
1027
                'espresso_registrations_new_registration',
1028
                $EVT_ID
1029
            )) {
1030
                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1031
                    'new_registration',
1032
                    'add-registrant',
1033
                    array('event_id' => $EVT_ID),
1034
                    'add-new-h2'
1035
                );
1036
            }
1037
            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
1038
            if ($event instanceof EE_Event) {
1039
                $this->_template_args['admin_page_header'] = sprintf(
1040
                    esc_html__(
1041
                        '%s Viewing registrations for the event: %s%s',
1042
                        'event_espresso'
1043
                    ),
1044
                    '<h3 style="line-height:1.5em;">',
1045
                    '<br /><a href="'
1046
                        . EE_Admin_Page::add_query_args_and_nonce(
1047
                            array(
1048
                                'action' => 'edit',
1049
                                'post'   => $event->ID(),
1050
                            ),
1051
                            EVENTS_ADMIN_URL
1052
                        )
1053
                        . '">&nbsp;'
1054
                        . $event->get('EVT_name')
1055
                        . '&nbsp;</a>&nbsp;',
1056
                    '</h3>'
1057
                );
1058
            }
1059
            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
1060
            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1061 View Code Duplication
            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
1062
                $this->_template_args['admin_page_header'] = substr(
1063
                    $this->_template_args['admin_page_header'],
1064
                    0,
1065
                    -5
1066
                );
1067
                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1068
                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1069
                $this->_template_args['admin_page_header'] .= $datetime->name();
1070
                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1071
                $this->_template_args['admin_page_header'] .= '</span></h3>';
1072
            }
1073
        }
1074
        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1075
        $this->display_admin_list_table_page_with_no_sidebar();
1076
    }
1077
1078
1079
    /**
1080
     * This sets the _registration property for the registration details screen
1081
     *
1082
     * @access private
1083
     * @return bool
1084
     * @throws EE_Error
1085
     * @throws InvalidArgumentException
1086
     * @throws InvalidDataTypeException
1087
     * @throws InvalidInterfaceException
1088
     */
1089
    private function _set_registration_object()
1090
    {
1091
        //get out if we've already set the object
1092
        if ($this->_registration instanceof EE_Registration) {
1093
            return true;
1094
        }
1095
        $REG    = EEM_Registration::instance();
1096
        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1097
        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1098
            return true;
1099
        } else {
1100
            $error_msg = sprintf(
1101
                esc_html__(
1102
                    'An error occurred and the details for Registration ID #%s could not be retrieved.',
1103
                    'event_espresso'
1104
                ),
1105
                $REG_ID
1106
            );
1107
            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1108
            $this->_registration = null;
1109
            return false;
1110
        }
1111
    }
1112
1113
1114
    /**
1115
     * Used to retrieve registrations for the list table.
1116
     *
1117
     * @param int  $per_page
1118
     * @param bool $count
1119
     * @param bool $this_month
1120
     * @param bool $today
1121
     * @return EE_Registration[]|int
1122
     * @throws EE_Error
1123
     * @throws InvalidArgumentException
1124
     * @throws InvalidDataTypeException
1125
     * @throws InvalidInterfaceException
1126
     */
1127
    public function get_registrations(
1128
        $per_page = 10,
1129
        $count = false,
1130
        $this_month = false,
1131
        $today = false
1132
    ) {
1133
        if ($this_month) {
1134
            $this->_req_data['status'] = 'month';
1135
        }
1136
        if ($today) {
1137
            $this->_req_data['status'] = 'today';
1138
        }
1139
        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1140
        /**
1141
         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1142
         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1143
         * @see EEM_Base::get_all()
1144
         */
1145
        $query_params['group_by'] = '';
1146
1147
        return $count
1148
            ? EEM_Registration::instance()->count($query_params)
1149
            /** @type EE_Registration[] */
1150
            : EEM_Registration::instance()->get_all($query_params);
1151
    }
1152
1153
1154
    /**
1155
     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1156
     * Note: this listens to values on the request for some of the query parameters.
1157
     *
1158
     * @param array $request
1159
     * @param int   $per_page
1160
     * @param bool  $count
1161
     * @return array
1162
     * @throws EE_Error
1163
     */
1164
    protected function _get_registration_query_parameters(
1165
        $request = array(),
1166
        $per_page = 10,
1167
        $count = false
1168
    ) {
1169
1170
        $query_params = array(
1171
            0                          => $this->_get_where_conditions_for_registrations_query(
1172
                $request
1173
            ),
1174
            'caps'                     => EEM_Registration::caps_read_admin,
1175
            'default_where_conditions' => 'this_model_only',
1176
        );
1177
        if (! $count) {
1178
            $query_params = array_merge(
1179
                $query_params,
1180
                $this->_get_orderby_for_registrations_query(),
1181
                $this->_get_limit($per_page)
1182
            );
1183
        }
1184
1185
        return $query_params;
1186
    }
1187
1188
1189
    /**
1190
     * This will add EVT_ID to the provided $where array for EE model query parameters.
1191
     *
1192
     * @param array $request usually the same as $this->_req_data but not necessarily
1193
     * @return array
1194
     */
1195
    protected function _add_event_id_to_where_conditions(array $request)
1196
    {
1197
        $where = array();
1198
        if (! empty($request['event_id'])) {
1199
            $where['EVT_ID'] = absint($request['event_id']);
1200
        }
1201
        return $where;
1202
    }
1203
1204
1205
    /**
1206
     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1207
     *
1208
     * @param array $request usually the same as $this->_req_data but not necessarily
1209
     * @return array
1210
     */
1211
    protected function _add_category_id_to_where_conditions(array $request)
1212
    {
1213
        $where = array();
1214
        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1215
            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1216
        }
1217
        return $where;
1218
    }
1219
1220
1221
    /**
1222
     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1223
     *
1224
     * @param array $request usually the same as $this->_req_data but not necessarily
1225
     * @return array
1226
     */
1227
    protected function _add_datetime_id_to_where_conditions(array $request)
1228
    {
1229
        $where = array();
1230
        if (! empty($request['datetime_id'])) {
1231
            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1232
        }
1233
        if (! empty($request['DTT_ID'])) {
1234
            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1235
        }
1236
        return $where;
1237
    }
1238
1239
1240
    /**
1241
     * Adds the correct registration status to the where conditions for the registrations query.
1242
     *
1243
     * @param array $request usually the same as $this->_req_data but not necessarily
1244
     * @return array
1245
     */
1246
    protected function _add_registration_status_to_where_conditions(array $request)
1247
    {
1248
        $where = array();
1249
        $view = EEH_Array::is_set($request, 'status', '');
1250
        $registration_status = ! empty($request['_reg_status'])
1251
            ? sanitize_text_field($request['_reg_status'])
1252
            : '';
1253
1254
        /*
1255
         * If filtering by registration status, then we show registrations matching that status.
1256
         * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1257
         * UNLESS viewing trashed registrations.
1258
         */
1259
        if (! empty($registration_status)) {
1260
            $where['STS_ID'] = $registration_status;
1261
        } else {
1262
            //make sure we exclude incomplete registrations, but only if not trashed.
1263
            if ($view === 'trash') {
1264
                $where['REG_deleted'] = true;
1265
            } elseif ($view === 'incomplete') {
1266
                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1267
            } else {
1268
                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1269
            }
1270
        }
1271
        return $where;
1272
    }
1273
1274
1275
    /**
1276
     * Adds any provided date restraints to the where conditions for the registrations query.
1277
     *
1278
     * @param array $request usually the same as $this->_req_data but not necessarily
1279
     * @return array
1280
     * @throws EE_Error
1281
     * @throws InvalidArgumentException
1282
     * @throws InvalidDataTypeException
1283
     * @throws InvalidInterfaceException
1284
     */
1285
    protected function _add_date_to_where_conditions(array $request)
1286
    {
1287
        $where = array();
1288
        $view = EEH_Array::is_set($request, 'status', '');
1289
        $month_range             = ! empty($request['month_range'])
1290
            ? sanitize_text_field($request['month_range'])
1291
            : '';
1292
        $retrieve_for_today      = $view === 'today';
1293
        $retrieve_for_this_month = $view === 'month';
1294
1295
        if ($retrieve_for_today) {
1296
            $now               = date('Y-m-d', current_time('timestamp'));
1297
            $where['REG_date'] = array(
1298
                'BETWEEN',
1299
                array(
1300
                    EEM_Registration::instance()->convert_datetime_for_query(
1301
                        'REG_date',
1302
                        $now . ' 00:00:00',
1303
                        'Y-m-d H:i:s'
1304
                    ),
1305
                    EEM_Registration::instance()->convert_datetime_for_query(
1306
                        'REG_date',
1307
                        $now . ' 23:59:59',
1308
                        'Y-m-d H:i:s'
1309
                    ),
1310
                ),
1311
            );
1312
        } elseif ($retrieve_for_this_month) {
1313
            $current_year_and_month = date('Y-m', current_time('timestamp'));
1314
            $days_this_month        = date('t', current_time('timestamp'));
1315
            $where['REG_date']      = array(
1316
                'BETWEEN',
1317
                array(
1318
                    EEM_Registration::instance()->convert_datetime_for_query(
1319
                        'REG_date',
1320
                        $current_year_and_month . '-01 00:00:00',
1321
                        'Y-m-d H:i:s'
1322
                    ),
1323
                    EEM_Registration::instance()->convert_datetime_for_query(
1324
                        'REG_date',
1325
                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1326
                        'Y-m-d H:i:s'
1327
                    ),
1328
                ),
1329
            );
1330
        } elseif ($month_range) {
1331
            $pieces          = explode(' ', $month_range, 3);
1332
            $month_requested = ! empty($pieces[0])
1333
                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1334
                : '';
1335
            $year_requested  = ! empty($pieces[1])
1336
                ? $pieces[1]
1337
                : '';
1338
            //if there is not a month or year then we can't go further
1339
            if ($month_requested && $year_requested) {
1340
                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1341
                $where['REG_date'] = array(
1342
                    'BETWEEN',
1343
                    array(
1344
                        EEM_Registration::instance()->convert_datetime_for_query(
1345
                            'REG_date',
1346
                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1347
                            'Y-m-d H:i:s'
1348
                        ),
1349
                        EEM_Registration::instance()->convert_datetime_for_query(
1350
                            'REG_date',
1351
                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1352
                            'Y-m-d H:i:s'
1353
                        ),
1354
                    ),
1355
                );
1356
            }
1357
        }
1358
        return $where;
1359
    }
1360
1361
1362
    /**
1363
     * Adds any provided search restraints to the where conditions for the registrations query
1364
     *
1365
     * @param array $request usually the same as $this->_req_data but not necessarily
1366
     * @return array
1367
     */
1368
    protected function _add_search_to_where_conditions(array $request)
1369
    {
1370
        $where = array();
1371
        if (! empty($request['s'])) {
1372
            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1373
            $where['OR*search_conditions'] = array(
1374
                'Event.EVT_name'                          => array('LIKE', $search_string),
1375
                'Event.EVT_desc'                          => array('LIKE', $search_string),
1376
                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1377
                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1378
                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1379
                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1380
                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1381
                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1382
                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1383
                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1384
                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1385
                'REG_final_price'                         => array('LIKE', $search_string),
1386
                'REG_code'                                => array('LIKE', $search_string),
1387
                'REG_count'                               => array('LIKE', $search_string),
1388
                'REG_group_size'                          => array('LIKE', $search_string),
1389
                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1390
                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1391
                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1392
            );
1393
        }
1394
        return $where;
1395
    }
1396
1397
1398
    /**
1399
     * Sets up the where conditions for the registrations query.
1400
     *
1401
     * @param array $request
1402
     * @return array
1403
     * @throws EE_Error
1404
     */
1405
    protected function _get_where_conditions_for_registrations_query($request)
1406
    {
1407
        return apply_filters(
1408
            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1409
            array_merge(
1410
                $this->_add_event_id_to_where_conditions($request),
1411
                $this->_add_category_id_to_where_conditions($request),
1412
                $this->_add_datetime_id_to_where_conditions($request),
1413
                $this->_add_registration_status_to_where_conditions($request),
1414
                $this->_add_date_to_where_conditions($request),
1415
                $this->_add_search_to_where_conditions($request)
1416
            ),
1417
            $request
1418
        );
1419
    }
1420
1421
1422
    /**
1423
     * Sets up the orderby for the registrations query.
1424
     *
1425
     * @return array
1426
     */
1427
    protected function _get_orderby_for_registrations_query()
1428
    {
1429
        $orderby_field = ! empty($this->_req_data['orderby'])
1430
            ? sanitize_text_field($this->_req_data['orderby'])
1431
            : '';
1432
        switch ($orderby_field) {
1433
            case '_REG_ID':
1434
                $orderby_field = 'REG_ID';
1435
                break;
1436
            case '_Reg_status':
1437
                $orderby_field = 'STS_ID';
1438
                break;
1439
            case 'ATT_fname':
1440
                $orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1441
                break;
1442
            case 'ATT_lname':
1443
                $orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1444
                break;
1445
            case 'event_name':
1446
                $orderby_field = 'Event.EVT_name';
1447
                break;
1448
            case 'DTT_EVT_start':
1449
                $orderby_field = 'Event.Datetime.DTT_EVT_start';
1450
                break;
1451
            default: //'REG_date'
1452
                $orderby_field = 'REG_date';
1453
        }
1454
1455
        //order
1456
        $order = ! empty($this->_req_data['order'])
1457
            ? sanitize_text_field($this->_req_data['order'])
1458
            : 'DESC';
1459
1460
        //mutate orderby_field
1461
        $orderby_field = array_combine(
1462
            (array) $orderby_field,
1463
            array_fill(0, count($orderby_field), $order)
1464
        );
1465
        //because there are many registrations with the same date, define
1466
        //a secondary way to order them, otherwise MySQL seems to be a bit random
1467
        if (empty($order['REG_ID'])) {
1468
            $orderby_field['REG_ID'] = $order;
1469
        }
1470
        return array('order_by' => $orderby_field);
1471
    }
1472
1473
1474
    /**
1475
     * Sets up the limit for the registrations query.
1476
     *
1477
     * @param $per_page
1478
     * @return array
1479
     */
1480
    protected function _get_limit($per_page)
1481
    {
1482
        $current_page = ! empty($this->_req_data['paged'])
1483
            ? absint($this->_req_data['paged'])
1484
            : 1;
1485
        $per_page     = ! empty($this->_req_data['perpage'])
1486
            ? $this->_req_data['perpage']
1487
            : $per_page;
1488
1489
        //-1 means return all results so get out if that's set.
1490
        if ((int)$per_page === -1) {
1491
            return array();
1492
        }
1493
        $per_page = absint($per_page);
1494
        $offset   = ($current_page - 1) * $per_page;
1495
        return array('limit' => array($offset, $per_page));
1496
    }
1497
1498
1499
    public function get_registration_status_array()
1500
    {
1501
        return self::$_reg_status;
1502
    }
1503
1504
1505
1506
1507
    /***************************************        REGISTRATION DETAILS        ***************************************/
1508
    /**
1509
     *        generates HTML for the View Registration Details Admin page
1510
     *
1511
     * @access protected
1512
     * @return void
1513
     * @throws DomainException
1514
     * @throws EE_Error
1515
     * @throws InvalidArgumentException
1516
     * @throws InvalidDataTypeException
1517
     * @throws InvalidInterfaceException
1518
     * @throws EntityNotFoundException
1519
     */
1520
    protected function _registration_details()
1521
    {
1522
        $this->_template_args = array();
1523
        $this->_set_registration_object();
1524
        if (is_object($this->_registration)) {
1525
            $transaction                                   = $this->_registration->transaction()
1526
                ? $this->_registration->transaction()
1527
                : EE_Transaction::new_instance();
1528
            $this->_session                                = $transaction->session_data();
1529
            $event_id                                      = $this->_registration->event_ID();
1530
            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1531
            $this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1532
            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1533
            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1534
            $this->_template_args['grand_total']           = $transaction->total();
1535
            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1536
            // link back to overview
1537
            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1538
            $this->_template_args['registration']                = $this->_registration;
1539
            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1540
                array(
1541
                    'action'   => 'default',
1542
                    'event_id' => $event_id,
1543
                ),
1544
                REG_ADMIN_URL
1545
            );
1546
            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1547
                array(
1548
                    'action' => 'default',
1549
                    'EVT_ID' => $event_id,
1550
                    'page'   => 'espresso_transactions',
1551
                ),
1552
                admin_url('admin.php')
1553
            );
1554
            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1555
                array(
1556
                    'page'   => 'espresso_events',
1557
                    'action' => 'edit',
1558
                    'post'   => $event_id,
1559
                ),
1560
                admin_url('admin.php')
1561
            );
1562
            //next and previous links
1563
            $next_reg                                      = $this->_registration->next(
1564
                null,
1565
                array(),
1566
                'REG_ID'
1567
            );
1568
            $this->_template_args['next_registration']     = $next_reg
1569
                ? $this->_next_link(
1570
                    EE_Admin_Page::add_query_args_and_nonce(
1571
                        array(
1572
                            'action'  => 'view_registration',
1573
                            '_REG_ID' => $next_reg['REG_ID'],
1574
                        ),
1575
                        REG_ADMIN_URL
1576
                    ),
1577
                    'dashicons dashicons-arrow-right ee-icon-size-22'
1578
                )
1579
                : '';
1580
            $previous_reg                                  = $this->_registration->previous(
1581
                null,
1582
                array(),
1583
                'REG_ID'
1584
            );
1585
            $this->_template_args['previous_registration'] = $previous_reg
1586
                ? $this->_previous_link(
1587
                    EE_Admin_Page::add_query_args_and_nonce(
1588
                        array(
1589
                            'action'  => 'view_registration',
1590
                            '_REG_ID' => $previous_reg['REG_ID'],
1591
                        ),
1592
                        REG_ADMIN_URL
1593
                    ),
1594
                    'dashicons dashicons-arrow-left ee-icon-size-22'
1595
                )
1596
                : '';
1597
            // grab header
1598
            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1599
            $this->_template_args['REG_ID']            = $this->_registration->ID();
1600
            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1601
                $template_path,
1602
                $this->_template_args,
1603
                true
1604
            );
1605
        } else {
1606
            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1607
        }
1608
        // the details template wrapper
1609
        $this->display_admin_page_with_sidebar();
1610
    }
1611
1612
1613
    protected function _registration_details_metaboxes()
1614
    {
1615
        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1616
        $this->_set_registration_object();
1617
        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1618
        add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1619
            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
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...
1620
        add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1621
            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
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...
1622
        if ($attendee instanceof EE_Attendee
1623
            && EE_Registry::instance()->CAP->current_user_can(
1624
                'ee_edit_registration',
1625
                'edit-reg-questions-mbox',
1626
                $this->_registration->ID()
1627
            )
1628
        ) {
1629
            add_meta_box(
1630
                'edit-reg-questions-mbox',
1631
                esc_html__('Registration Form Answers', 'event_espresso'),
1632
                array($this, '_reg_questions_meta_box'),
1633
                $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...
1634
                'normal',
1635
                'high'
1636
            );
1637
        }
1638
        add_meta_box(
1639
            'edit-reg-registrant-mbox',
1640
            esc_html__('Contact Details', 'event_espresso'),
1641
            array($this, '_reg_registrant_side_meta_box'),
1642
            $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...
1643
            'side',
1644
            'high'
1645
        );
1646
        if ($this->_registration->group_size() > 1) {
1647
            add_meta_box(
1648
                'edit-reg-attendees-mbox',
1649
                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1650
                array($this, '_reg_attendees_meta_box'),
1651
                $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...
1652
                'normal',
1653
                'high'
1654
            );
1655
        }
1656
    }
1657
1658
1659
    /**
1660
     * set_reg_status_buttons_metabox
1661
     *
1662
     * @access protected
1663
     * @return string
1664
     * @throws \EE_Error
1665
     */
1666
    public function set_reg_status_buttons_metabox()
1667
    {
1668
        $this->_set_registration_object();
1669
        $change_reg_status_form = $this->_generate_reg_status_change_form();
1670
        echo $change_reg_status_form->form_open(
1671
            self::add_query_args_and_nonce(
1672
                array(
1673
                    'action' => 'change_reg_status',
1674
                ),
1675
                REG_ADMIN_URL
1676
            )
1677
        );
1678
        echo $change_reg_status_form->get_html();
1679
        echo $change_reg_status_form->form_close();
1680
    }
1681
1682
1683
    /**
1684
     * @return EE_Form_Section_Proper
1685
     * @throws EE_Error
1686
     * @throws InvalidArgumentException
1687
     * @throws InvalidDataTypeException
1688
     * @throws InvalidInterfaceException
1689
     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1690
     */
1691
    protected function _generate_reg_status_change_form()
1692
    {
1693
        return new EE_Form_Section_Proper(array(
1694
            'name'            => 'reg_status_change_form',
1695
            'html_id'         => 'reg-status-change-form',
1696
            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1697
            'subsections'     => array(
1698
                'return'             => new EE_Hidden_Input(array(
1699
                    'name'    => 'return',
1700
                    'default' => 'view_registration',
1701
                )),
1702
                'REG_ID'             => new EE_Hidden_Input(array(
1703
                    'name'    => 'REG_ID',
1704
                    'default' => $this->_registration->ID(),
1705
                )),
1706
                'current_status'     => new EE_Form_Section_HTML(
1707
                    EEH_HTML::tr(
1708
                        EEH_HTML::th(
1709
                            EEH_HTML::label(
1710
                                EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1711
                                )
1712
                            )
1713
                        )
1714
                        . EEH_HTML::td(
1715
                            EEH_HTML::strong(
1716
                                $this->_registration->pretty_status(),
1717
                                '',
1718
                                'status-' . $this->_registration->status_ID(),
1719
                                'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1720
                            )
1721
                        )
1722
                    )
1723
                ),
1724
                'reg_status'         => new EE_Select_Input(
1725
                    $this->_get_reg_statuses(),
1726
                    array(
1727
                        'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1728
                        'default'         => $this->_registration->status_ID(),
1729
                    )
1730
                ),
1731
                'send_notifications' => new EE_Yes_No_Input(
1732
                    array(
1733
                        'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1734
                        'default'         => false,
1735
                        'html_help_text'  => esc_html__(
1736
                            'If set to "Yes", then the related messages will be sent to the registrant.',
1737
                            'event_espresso'
1738
                        ),
1739
                    )
1740
                ),
1741
                'submit'             => new EE_Submit_Input(
1742
                    array(
1743
                        'html_class'      => 'button-primary',
1744
                        'html_label_text' => '&nbsp;',
1745
                        'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1746
                    )
1747
                ),
1748
            ),
1749
        ));
1750
    }
1751
1752
1753
    /**
1754
     * Returns an array of all the buttons for the various statuses and switch status actions
1755
     *
1756
     * @return array
1757
     * @throws EE_Error
1758
     * @throws InvalidArgumentException
1759
     * @throws InvalidDataTypeException
1760
     * @throws InvalidInterfaceException
1761
     * @throws EntityNotFoundException
1762
     */
1763
    protected function _get_reg_statuses()
1764
    {
1765
        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1766
        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1767
        // get current reg status
1768
        $current_status = $this->_registration->status_ID();
1769
        // is registration for free event? This will determine whether to display the pending payment option
1770
        if (
1771
            $current_status !== EEM_Registration::status_id_pending_payment
1772
            && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00)
1773
        ) {
1774
            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1775
        }
1776
        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1777
    }
1778
1779
1780
    /**
1781
     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1782
     *
1783
     * @param bool $status REG status given for changing registrations to.
1784
     * @param bool $notify Whether to send messages notifications or not.
1785
     * @return array (array with reg_id(s) updated and whether update was successful.
1786
     * @throws EE_Error
1787
     * @throws InvalidArgumentException
1788
     * @throws InvalidDataTypeException
1789
     * @throws InvalidInterfaceException
1790
     * @throws ReflectionException
1791
     * @throws RuntimeException
1792
     * @throws EntityNotFoundException
1793
     */
1794
    protected function _set_registration_status_from_request($status = false, $notify = false)
1795
    {
1796
        if (isset($this->_req_data['reg_status_change_form'])) {
1797
            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1798
                ? (array)$this->_req_data['reg_status_change_form']['REG_ID']
1799
                : array();
1800
        } else {
1801
            $REG_IDs = isset($this->_req_data['_REG_ID'])
1802
                ? (array)$this->_req_data['_REG_ID']
1803
                : array();
1804
        }
1805
        // sanitize $REG_IDs
1806
        $REG_IDs = array_map('absint', $REG_IDs);
1807
        // and remove empty entries
1808
        $REG_IDs = array_filter($REG_IDs);
1809
1810
        $result = $this->_set_registration_status($REG_IDs, $status, $notify);
1811
1812
        /**
1813
         * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications.
1814
         * Currently this value is used downstream by the _process_resend_registration method.
1815
         *
1816
         * @param int|array                $registration_ids The registration ids that have had their status changed successfully.
1817
         * @param bool                     $status           The status registrations were changed to.
1818
         * @param bool                     $success          If the status was changed successfully for all registrations.
1819
         * @param Registrations_Admin_Page $admin_page_object
1820
         */
1821
        $this->_req_data['_REG_ID'] = apply_filters(
1822
            'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs',
1823
            $result['REG_ID'],
1824
            $status,
1825
            $result['success'],
1826
            $this
1827
        );
1828
1829
        //notify?
1830
        if ($notify
1831
            && $result['success']
1832
            && ! empty($this->_req_data['_REG_ID'])
1833
            && EE_Registry::instance()->CAP->current_user_can(
1834
                'ee_send_message',
1835
                'espresso_registrations_resend_registration'
1836
            )
1837
        ) {
1838
            $this->_process_resend_registration();
1839
        }
1840
        return $result;
1841
    }
1842
1843
1844
    /**
1845
     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1846
     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1847
     *
1848
     * @param array  $REG_IDs
1849
     * @param string $status
1850
     * @param bool   $notify  Used to indicate whether notification was requested or not.  This determines the context
1851
     *                        slug sent with setting the registration status.
1852
     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1853
     * @throws EE_Error
1854
     * @throws InvalidArgumentException
1855
     * @throws InvalidDataTypeException
1856
     * @throws InvalidInterfaceException
1857
     * @throws ReflectionException
1858
     * @throws RuntimeException
1859
     * @throws EntityNotFoundException
1860
     */
1861
    protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false)
1862
    {
1863
        $success = false;
1864
        // typecast $REG_IDs
1865
        $REG_IDs = (array)$REG_IDs;
1866
        if ( ! empty($REG_IDs)) {
1867
            $success = true;
1868
            // set default status if none is passed
1869
            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1870
            $status_context = $notify
1871
                ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
1872
                : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN;
1873
            //loop through REG_ID's and change status
1874
            foreach ($REG_IDs as $REG_ID) {
1875
                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1876
                if ($registration instanceof EE_Registration) {
1877
                    $registration->set_status(
1878
                        $status,
1879
                        false,
1880
                        new Context(
1881
                            $status_context,
1882
                            esc_html__(
1883
                                'Manually triggered status change on a Registration Admin Page route.',
1884
                                'event_espresso'
1885
                            )
1886
                        )
1887
                    );
1888
                    $result = $registration->save();
1889
                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1890
                    $success = $result !== false ? $success : false;
1891
                }
1892
            }
1893
        }
1894
1895
        //return $success and processed registrations
1896
        return array('REG_ID' => $REG_IDs, 'success' => $success);
1897
    }
1898
1899
1900
    /**
1901
     * Common logic for setting up success message and redirecting to appropriate route
1902
     *
1903
     * @param  string $STS_ID status id for the registration changed to
1904
     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1905
     * @return void
1906
     * @throws EE_Error
1907
     */
1908
    protected function _reg_status_change_return($STS_ID, $notify = false)
1909
    {
1910
        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1911
            : array('success' => false);
1912
        $success = isset($result['success']) && $result['success'];
1913
        //setup success message
1914
        if ($success) {
1915
            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1916
                $msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1917
                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1918
            } else {
1919
                $msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1920
                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1921
            }
1922
            EE_Error::add_success($msg);
1923
        } else {
1924
            EE_Error::add_error(
1925
                esc_html__(
1926
                    'Something went wrong, and the status was not changed',
1927
                    'event_espresso'
1928
                ), __FILE__, __LINE__, __FUNCTION__
1929
            );
1930
        }
1931
        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1932
            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1933
        } else {
1934
            $route = array('action' => 'default');
1935
        }
1936
        //unset nonces
1937
        foreach ($this->_req_data as $ref => $value) {
1938
            if (strpos($ref, 'nonce') !== false) {
1939
                unset($this->_req_data[$ref]);
1940
                continue;
1941
            }
1942
            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1943
            $this->_req_data[$ref] = $value;
1944
        }
1945
        //merge request vars so that the reloaded list table contains any existing filter query params
1946
        $route = array_merge($this->_req_data, $route);
1947
        $this->_redirect_after_action($success, '', '', $route, true);
1948
    }
1949
1950
1951
    /**
1952
     * incoming reg status change from reg details page.
1953
     *
1954
     * @return void
1955
     */
1956
    protected function _change_reg_status()
1957
    {
1958
        $this->_req_data['return'] = 'view_registration';
1959
        //set notify based on whether the send notifications toggle is set or not
1960
        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1961
        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1962
        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1963
            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1964
        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1965
            case EEM_Registration::status_id_approved :
1966
            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1967
                $this->approve_registration($notify);
1968
                break;
1969
            case EEM_Registration::status_id_pending_payment :
1970
            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1971
                $this->pending_registration($notify);
1972
                break;
1973
            case EEM_Registration::status_id_not_approved :
1974
            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1975
                $this->not_approve_registration($notify);
1976
                break;
1977
            case EEM_Registration::status_id_declined :
1978
            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1979
                $this->decline_registration($notify);
1980
                break;
1981
            case EEM_Registration::status_id_cancelled :
1982
            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1983
                $this->cancel_registration($notify);
1984
                break;
1985
            case EEM_Registration::status_id_wait_list :
1986
            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1987
                $this->wait_list_registration($notify);
1988
                break;
1989
            case EEM_Registration::status_id_incomplete :
1990
            default :
1991
                $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...
1992
                unset($this->_req_data['return']);
1993
                $this->_reg_status_change_return('', false);
1994
                break;
1995
        }
1996
    }
1997
1998
1999
    /**
2000
     * Callback for bulk action routes.
2001
     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
2002
     * method was chosen so there is one central place all the registration status bulk actions are going through.
2003
     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
2004
     * when an action is happening on just a single registration).
2005
     * @param      $action
2006
     * @param bool $notify
2007
     */
2008
    protected function bulk_action_on_registrations($action, $notify = false) {
2009
        do_action(
2010
            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
2011
            $this,
2012
            $action,
2013
            $notify
2014
        );
2015
        $method = $action . '_registration';
2016
        if (method_exists($this, $method)) {
2017
            $this->$method($notify);
2018
        }
2019
    }
2020
2021
2022
    /**
2023
     * approve_registration
2024
     *
2025
     * @access protected
2026
     * @param bool $notify whether or not to notify the registrant about their approval.
2027
     * @return void
2028
     */
2029
    protected function approve_registration($notify = false)
2030
    {
2031
        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
2032
    }
2033
2034
2035
    /**
2036
     *        decline_registration
2037
     *
2038
     * @access protected
2039
     * @param bool $notify whether or not to notify the registrant about their status change.
2040
     * @return void
2041
     */
2042
    protected function decline_registration($notify = false)
2043
    {
2044
        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
2045
    }
2046
2047
2048
    /**
2049
     *        cancel_registration
2050
     *
2051
     * @access protected
2052
     * @param bool $notify whether or not to notify the registrant about their status change.
2053
     * @return void
2054
     */
2055
    protected function cancel_registration($notify = false)
2056
    {
2057
        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
2058
    }
2059
2060
2061
    /**
2062
     *        not_approve_registration
2063
     *
2064
     * @access protected
2065
     * @param bool $notify whether or not to notify the registrant about their status change.
2066
     * @return void
2067
     */
2068
    protected function not_approve_registration($notify = false)
2069
    {
2070
        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
2071
    }
2072
2073
2074
    /**
2075
     *        decline_registration
2076
     *
2077
     * @access protected
2078
     * @param bool $notify whether or not to notify the registrant about their status change.
2079
     * @return void
2080
     */
2081
    protected function pending_registration($notify = false)
2082
    {
2083
        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
2084
    }
2085
2086
2087
    /**
2088
     * waitlist_registration
2089
     *
2090
     * @access protected
2091
     * @param bool $notify whether or not to notify the registrant about their status change.
2092
     * @return void
2093
     */
2094
    protected function wait_list_registration($notify = false)
2095
    {
2096
        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2097
    }
2098
2099
2100
    /**
2101
     *        generates HTML for the Registration main meta box
2102
     *
2103
     * @access public
2104
     * @return void
2105
     * @throws DomainException
2106
     * @throws EE_Error
2107
     * @throws InvalidArgumentException
2108
     * @throws InvalidDataTypeException
2109
     * @throws InvalidInterfaceException
2110
     * @throws ReflectionException
2111
     * @throws EntityNotFoundException
2112
     */
2113
    public function _reg_details_meta_box()
2114
    {
2115
        EEH_Autoloader::register_line_item_display_autoloaders();
2116
        EEH_Autoloader::register_line_item_filter_autoloaders();
2117
        EE_Registry::instance()->load_helper('Line_Item');
2118
        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
2119
            : EE_Transaction::new_instance();
2120
        $this->_session = $transaction->session_data();
2121
        $filters        = new EE_Line_Item_Filter_Collection();
2122
        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
2123
        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2124
        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
2125
            $transaction->total_line_item());
2126
        $filtered_line_item_tree                 = $line_item_filter_processor->process();
2127
        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
2128
            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
2129
        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2130
            $filtered_line_item_tree,
2131
            array('EE_Registration' => $this->_registration)
2132
        );
2133
        $attendee                                = $this->_registration->attendee();
2134
        if (EE_Registry::instance()->CAP->current_user_can(
2135
            'ee_read_transaction',
2136
            'espresso_transactions_view_transaction'
2137
        )) {
2138
            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2139
                EE_Admin_Page::add_query_args_and_nonce(
2140
                    array(
2141
                        'action' => 'view_transaction',
2142
                        'TXN_ID' => $transaction->ID(),
2143
                    ),
2144
                    TXN_ADMIN_URL
2145
                ),
2146
                esc_html__(' View Transaction', 'event_espresso'),
2147
                'button secondary-button right',
2148
                'dashicons dashicons-cart'
2149
            );
2150
        } else {
2151
            $this->_template_args['view_transaction_button'] = '';
2152
        }
2153
        if ($attendee instanceof EE_Attendee
2154
            && EE_Registry::instance()->CAP->current_user_can(
2155
                'ee_send_message',
2156
                'espresso_registrations_resend_registration'
2157
            )
2158
        ) {
2159
            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2160
                EE_Admin_Page::add_query_args_and_nonce(
2161
                    array(
2162
                        'action'      => 'resend_registration',
2163
                        '_REG_ID'     => $this->_registration->ID(),
2164
                        'redirect_to' => 'view_registration',
2165
                    ),
2166
                    REG_ADMIN_URL
2167
                ),
2168
                esc_html__(' Resend Registration', 'event_espresso'),
2169
                'button secondary-button right',
2170
                'dashicons dashicons-email-alt'
2171
            );
2172
        } else {
2173
            $this->_template_args['resend_registration_button'] = '';
2174
        }
2175
        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2176
        $payment                               = $transaction->get_first_related('Payment');
2177
        $payment                               = ! $payment instanceof EE_Payment
2178
            ? EE_Payment::new_instance()
2179
            : $payment;
2180
        $payment_method                        = $payment->get_first_related('Payment_Method');
2181
        $payment_method                        = ! $payment_method instanceof EE_Payment_Method
2182
            ? EE_Payment_Method::new_instance()
2183
            : $payment_method;
2184
        $reg_details                           = array(
2185
            'payment_method'       => $payment_method->name(),
2186
            'response_msg'         => $payment->gateway_response(),
2187
            'registration_id'      => $this->_registration->get('REG_code'),
2188
            'registration_session' => $this->_registration->session_ID(),
2189
            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2190
            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2191
        );
2192
        if (isset($reg_details['registration_id'])) {
2193
            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2194
            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2195
                'Registration ID',
2196
                'event_espresso'
2197
            );
2198
            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2199
        }
2200
        if (isset($reg_details['payment_method'])) {
2201
            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2202
            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2203
                'Most Recent Payment Method',
2204
                'event_espresso'
2205
            );
2206
            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2207
            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2208
            $this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2209
                'Payment method response',
2210
                'event_espresso'
2211
            );
2212
            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2213
        }
2214
        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2215
        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2216
            'Registration Session',
2217
            'event_espresso'
2218
        );
2219
        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2220
        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2221
        $this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2222
            'Registration placed from IP',
2223
            'event_espresso'
2224
        );
2225
        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2226
        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2227
        $this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2228
            'event_espresso');
2229
        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2230
        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2231
            array(
2232
                'action'   => 'default',
2233
                'event_id' => $this->_registration->event_ID(),
2234
            ),
2235
            REG_ADMIN_URL
2236
        );
2237
        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2238
        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2239
        $template_path                                                        =
2240
            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2241
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2242
    }
2243
2244
2245
    /**
2246
     * generates HTML for the Registration Questions meta box.
2247
     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2248
     * otherwise uses new forms system
2249
     *
2250
     * @access public
2251
     * @return void
2252
     * @throws DomainException
2253
     * @throws EE_Error
2254
     */
2255
    public function _reg_questions_meta_box()
2256
    {
2257
        //allow someone to override this method entirely
2258
        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2259
            $this->_registration)) {
2260
            $form                                              = $this->_get_reg_custom_questions_form(
2261
                $this->_registration->ID()
2262
            );
2263
            $this->_template_args['att_questions']             = count($form->subforms()) > 0
2264
                ? $form->get_html_and_js()
2265
                : '';
2266
            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2267
            $this->_template_args['REG_ID']                    = $this->_registration->ID();
2268
            $template_path                                     =
2269
                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2270
            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2271
        }
2272
    }
2273
2274
2275
    /**
2276
     * form_before_question_group
2277
     *
2278
     * @deprecated    as of 4.8.32.rc.000
2279
     * @access        public
2280
     * @param        string $output
2281
     * @return        string
2282
     */
2283
    public function form_before_question_group($output)
2284
    {
2285
        EE_Error::doing_it_wrong(
2286
            __CLASS__ . '::' . __FUNCTION__,
2287
            esc_html__(
2288
                '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.',
2289
                'event_espresso'
2290
            ),
2291
            '4.8.32.rc.000'
2292
        );
2293
        return '
2294
	<table class="form-table ee-width-100">
2295
		<tbody>
2296
			';
2297
    }
2298
2299
2300
    /**
2301
     * form_after_question_group
2302
     *
2303
     * @deprecated    as of 4.8.32.rc.000
2304
     * @access        public
2305
     * @param        string $output
2306
     * @return        string
2307
     */
2308
    public function form_after_question_group($output)
2309
    {
2310
        EE_Error::doing_it_wrong(
2311
            __CLASS__ . '::' . __FUNCTION__,
2312
            esc_html__(
2313
                '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.',
2314
                'event_espresso'
2315
            ),
2316
            '4.8.32.rc.000'
2317
        );
2318
        return '
2319
			<tr class="hide-if-no-js">
2320
				<th> </th>
2321
				<td class="reg-admin-edit-attendee-question-td">
2322
					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2323
               . esc_attr__('click to edit question', 'event_espresso')
2324
               . '">
2325
						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2326
               . esc_html__('edit the above question group', 'event_espresso')
2327
               . '</span>
2328
						<div class="dashicons dashicons-edit"></div>
2329
					</a>
2330
				</td>
2331
			</tr>
2332
		</tbody>
2333
	</table>
2334
';
2335
    }
2336
2337
2338
    /**
2339
     * form_form_field_label_wrap
2340
     *
2341
     * @deprecated    as of 4.8.32.rc.000
2342
     * @access        public
2343
     * @param        string $label
2344
     * @return        string
2345
     */
2346 View Code Duplication
    public function form_form_field_label_wrap($label)
2347
    {
2348
        EE_Error::doing_it_wrong(
2349
            __CLASS__ . '::' . __FUNCTION__,
2350
            esc_html__(
2351
                '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.',
2352
                'event_espresso'
2353
            ),
2354
            '4.8.32.rc.000'
2355
        );
2356
        return '
2357
			<tr>
2358
				<th>
2359
					' . $label . '
2360
				</th>';
2361
    }
2362
2363
2364
    /**
2365
     * form_form_field_input__wrap
2366
     *
2367
     * @deprecated    as of 4.8.32.rc.000
2368
     * @access        public
2369
     * @param        string $input
2370
     * @return        string
2371
     */
2372 View Code Duplication
    public function form_form_field_input__wrap($input)
2373
    {
2374
        EE_Error::doing_it_wrong(
2375
            __CLASS__ . '::' . __FUNCTION__,
2376
            esc_html__(
2377
                '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.',
2378
                'event_espresso'
2379
            ),
2380
            '4.8.32.rc.000'
2381
        );
2382
        return '
2383
				<td class="reg-admin-attendee-questions-input-td disabled-input">
2384
					' . $input . '
2385
				</td>
2386
			</tr>';
2387
    }
2388
2389
2390
    /**
2391
     * Updates the registration's custom questions according to the form info, if the form is submitted.
2392
     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2393
     * to display the page
2394
     *
2395
     * @access protected
2396
     * @return void
2397
     * @throws EE_Error
2398
     */
2399
    protected function _update_attendee_registration_form()
2400
    {
2401
        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2402
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2403
            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2404
            $success = $this->_save_reg_custom_questions_form($REG_ID);
2405
            if ($success) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $success of type integer|false is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
2406
                $what  = esc_html__('Registration Form', 'event_espresso');
2407
                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2408
                    : array('action' => 'default');
2409
                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2410
            }
2411
        }
2412
    }
2413
2414
2415
    /**
2416
     * Gets the form for saving registrations custom questions (if done
2417
     * previously retrieves the cached form object, which may have validation errors in it)
2418
     *
2419
     * @param int $REG_ID
2420
     * @return EE_Registration_Custom_Questions_Form
2421
     * @throws EE_Error
2422
     * @throws InvalidArgumentException
2423
     * @throws InvalidDataTypeException
2424
     * @throws InvalidInterfaceException
2425
     */
2426
    protected function _get_reg_custom_questions_form($REG_ID)
2427
    {
2428
        if ( ! $this->_reg_custom_questions_form) {
2429
            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2430
            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2431
                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2432
            );
2433
            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2434
        }
2435
        return $this->_reg_custom_questions_form;
2436
    }
2437
2438
2439
    /**
2440
     * Saves
2441
     *
2442
     * @access private
2443
     * @param bool $REG_ID
2444
     * @return bool
2445
     * @throws EE_Error
2446
     * @throws InvalidArgumentException
2447
     * @throws InvalidDataTypeException
2448
     * @throws InvalidInterfaceException
2449
     */
2450
    private function _save_reg_custom_questions_form($REG_ID = false)
2451
    {
2452
        if ( ! $REG_ID) {
2453
            EE_Error::add_error(
2454
                esc_html__(
2455
                    'An error occurred. No registration ID was received.', 'event_espresso'),
2456
                __FILE__, __FUNCTION__, __LINE__
2457
            );
2458
        }
2459
        $form = $this->_get_reg_custom_questions_form($REG_ID);
2460
        $form->receive_form_submission($this->_req_data);
2461
        $success = false;
2462
        if ($form->is_valid()) {
2463
            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2464
                foreach ($question_group_form->inputs() as $question_id => $input) {
2465
                    $where_conditions    = array(
2466
                        'QST_ID' => $question_id,
2467
                        'REG_ID' => $REG_ID,
2468
                    );
2469
                    $possibly_new_values = array(
2470
                        'ANS_value' => $input->normalized_value(),
2471
                    );
2472
                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2473
                    if ($answer instanceof EE_Answer) {
2474
                        $success = $answer->save($possibly_new_values);
2475
                    } else {
2476
                        //insert it then
2477
                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2478
                        $answer      = EE_Answer::new_instance($cols_n_vals);
2479
                        $success     = $answer->save();
2480
                    }
2481
                }
2482
            }
2483
        } else {
2484
            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2485
        }
2486
        return $success;
2487
    }
2488
2489
2490
    /**
2491
     *        generates HTML for the Registration main meta box
2492
     *
2493
     * @access public
2494
     * @return void
2495
     * @throws DomainException
2496
     * @throws EE_Error
2497
     * @throws InvalidArgumentException
2498
     * @throws InvalidDataTypeException
2499
     * @throws InvalidInterfaceException
2500
     */
2501
    public function _reg_attendees_meta_box()
2502
    {
2503
        $REG = EEM_Registration::instance();
2504
        //get all other registrations on this transaction, and cache
2505
        //the attendees for them so we don't have to run another query using force_join
2506
        $registrations                           = $REG->get_all(array(
2507
            array(
2508
                'TXN_ID' => $this->_registration->transaction_ID(),
2509
                'REG_ID' => array('!=', $this->_registration->ID()),
2510
            ),
2511
            'force_join' => array('Attendee'),
2512
        ));
2513
        $this->_template_args['attendees']       = array();
2514
        $this->_template_args['attendee_notice'] = '';
2515
        if (empty($registrations)
2516
            || (is_array($registrations)
2517
                && ! EEH_Array::get_one_item_from_array($registrations))
2518
        ) {
2519
            EE_Error::add_error(
2520
                esc_html__(
2521
                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2522
                    'event_espresso'
2523
                ), __FILE__, __FUNCTION__, __LINE__
2524
            );
2525
            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2526
        } else {
2527
            $att_nmbr = 1;
2528
            foreach ($registrations as $registration) {
2529
                /* @var $registration EE_Registration */
2530
                $attendee                                                    = $registration->attendee()
2531
                    ? $registration->attendee()
2532
                    : EEM_Attendee::instance()
2533
                                  ->create_default_object();
2534
                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2535
                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2536
                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2537
                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2538
                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2539
                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2540
                    ', ',
2541
                    $attendee->full_address_as_array()
2542
                );
2543
                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2544
                    array(
2545
                        'action' => 'edit_attendee',
2546
                        'post'   => $attendee->ID(),
2547
                    ),
2548
                    REG_ADMIN_URL
2549
                );
2550
                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2551
                $att_nmbr++;
2552
            }
2553
            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2554
        }
2555
        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2556
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2557
    }
2558
2559
2560
    /**
2561
     *        generates HTML for the Edit Registration side meta box
2562
     *
2563
     * @access public
2564
     * @return void
2565
     * @throws DomainException
2566
     * @throws EE_Error
2567
     * @throws InvalidArgumentException
2568
     * @throws InvalidDataTypeException
2569
     * @throws InvalidInterfaceException
2570
     */
2571
    public function _reg_registrant_side_meta_box()
2572
    {
2573
        /*@var $attendee EE_Attendee */
2574
        $att_check = $this->_registration->attendee();
2575
        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2576
        //now let's determine if this is not the primary registration.  If it isn't then we set the
2577
        //primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2578
        //primary registration object (that way we know if we need to show create button or not)
2579
        if ( ! $this->_registration->is_primary_registrant()) {
2580
            $primary_registration = $this->_registration->get_primary_registration();
2581
            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2582
                : null;
2583
            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2584
                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2585
                //custom attendee object so let's not worry about the primary reg.
2586
                $primary_registration = null;
2587
            }
2588
        } else {
2589
            $primary_registration = null;
2590
        }
2591
        $this->_template_args['ATT_ID']            = $attendee->ID();
2592
        $this->_template_args['fname']             = $attendee->fname();
2593
        $this->_template_args['lname']             = $attendee->lname();
2594
        $this->_template_args['email']             = $attendee->email();
2595
        $this->_template_args['phone']             = $attendee->phone();
2596
        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2597
        //edit link
2598
        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2599
            'action' => 'edit_attendee',
2600
            'post'   => $attendee->ID(),
2601
        ), REG_ADMIN_URL);
2602
        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2603
        //create link
2604
        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2605
            ? EE_Admin_Page::add_query_args_and_nonce(array(
2606
                'action'  => 'duplicate_attendee',
2607
                '_REG_ID' => $this->_registration->ID(),
2608
            ), REG_ADMIN_URL) : '';
2609
        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2610
        $this->_template_args['att_check']    = $att_check;
2611
        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2612
        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2613
    }
2614
2615
2616
    /**
2617
     * trash or restore registrations
2618
     *
2619
     * @param  boolean $trash whether to archive or restore
2620
     * @return void
2621
     * @throws EE_Error
2622
     * @throws InvalidArgumentException
2623
     * @throws InvalidDataTypeException
2624
     * @throws InvalidInterfaceException
2625
     * @throws RuntimeException
2626
     * @access protected
2627
     */
2628
    protected function _trash_or_restore_registrations($trash = true)
2629
    {
2630
        //if empty _REG_ID then get out because there's nothing to do
2631 View Code Duplication
        if (empty($this->_req_data['_REG_ID'])) {
2632
            EE_Error::add_error(
2633
                sprintf(
2634
                    esc_html__(
2635
                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2636
                        'event_espresso'
2637
                    ),
2638
                    $trash ? 'trash' : 'restore'
2639
                ),
2640
                __FILE__, __LINE__, __FUNCTION__
2641
            );
2642
            $this->_redirect_after_action(false, '', '', array(), true);
2643
        }
2644
        $success = 0;
2645
        $overwrite_msgs = false;
2646
        //Checkboxes
2647
        if ( ! is_array($this->_req_data['_REG_ID'])) {
2648
            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2649
        }
2650
        $reg_count = count($this->_req_data['_REG_ID']);
2651
        // cycle thru checkboxes
2652
        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2653
            /** @var EE_Registration $REG */
2654
            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2655
            $payments = $REG->registration_payments();
2656
            if (! empty($payments)) {
2657
                $name = $REG->attendee() instanceof EE_Attendee
2658
                    ? $REG->attendee()->full_name()
2659
                    : esc_html__('Unknown Attendee', 'event_espresso');
2660
                $overwrite_msgs = true;
2661
                EE_Error::add_error(
2662
                    sprintf(
2663
                        esc_html__(
2664
                            '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.',
2665
                            'event_espresso'
2666
                        ),
2667
                        $name
2668
                    ),
2669
                    __FILE__, __FUNCTION__, __LINE__
2670
                );
2671
                //can't trash this registration because it has payments.
2672
                continue;
2673
            }
2674
            $updated = $trash ? $REG->delete() : $REG->restore();
2675
            if ($updated) {
2676
                $success++;
2677
            }
2678
        }
2679
        $this->_redirect_after_action(
2680
            $success === $reg_count, // were ALL registrations affected?
2681
            $success > 1
2682
                ? esc_html__('Registrations', 'event_espresso')
2683
                : esc_html__('Registration', 'event_espresso'),
2684
            $trash
2685
                ? esc_html__('moved to the trash', 'event_espresso')
2686
                : esc_html__('restored', 'event_espresso'),
2687
            array('action' => 'default'),
2688
            $overwrite_msgs
2689
        );
2690
    }
2691
2692
2693
    /**
2694
     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2695
     * registration but also.
2696
     * 1. Removing relations to EE_Attendee
2697
     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2698
     * ALSO trashed.
2699
     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2700
     * 4. Removing relationships between all tickets and the related registrations
2701
     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2702
     * 6. Deleting permanently any related Checkins.
2703
     *
2704
     * @return void
2705
     * @throws EE_Error
2706
     * @throws InvalidArgumentException
2707
     * @throws InvalidDataTypeException
2708
     * @throws InvalidInterfaceException
2709
     */
2710
    protected function _delete_registrations()
2711
    {
2712
        $REG_MDL = EEM_Registration::instance();
2713
        $success = 1;
2714
        //Checkboxes
2715
        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2716
            // if array has more than one element than success message should be plural
2717
            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2718
            // cycle thru checkboxes
2719
            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $ind is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
2720
                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2721
                if ( ! $REG instanceof EE_Registration) {
2722
                    continue;
2723
                }
2724
                $deleted = $this->_delete_registration($REG);
2725
                if ( ! $deleted) {
2726
                    $success = 0;
2727
                }
2728
            }
2729
        } else {
2730
            // grab single id and delete
2731
            $REG_ID  = $this->_req_data['_REG_ID'];
2732
            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2733
            $deleted = $this->_delete_registration($REG);
2734
            if ( ! $deleted) {
2735
                $success = 0;
2736
            }
2737
        }
2738
        $what        = $success > 1
2739
            ? esc_html__('Registrations', 'event_espresso')
2740
            : esc_html__('Registration', 'event_espresso');
2741
        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2742
        $this->_redirect_after_action(
2743
            $success,
2744
            $what,
2745
            $action_desc,
2746
            array('action' => 'default'),
2747
            true
2748
        );
2749
    }
2750
2751
2752
    /**
2753
     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2754
     * models get affected.
2755
     *
2756
     * @param  EE_Registration $REG registration to be deleted permenantly
2757
     * @return bool true = successful deletion, false = fail.
2758
     * @throws EE_Error
2759
     */
2760
    protected function _delete_registration(EE_Registration $REG)
2761
    {
2762
        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2763
        //registrations on the transaction that are NOT trashed.
2764
        $TXN         = $REG->get_first_related('Transaction');
2765
        $REGS        = $TXN->get_many_related('Registration');
2766
        $all_trashed = true;
2767
        foreach ($REGS as $registration) {
2768
            if ( ! $registration->get('REG_deleted')) {
2769
                $all_trashed = false;
2770
            }
2771
        }
2772
        if ( ! $all_trashed) {
2773
            EE_Error::add_error(
2774
                esc_html__(
2775
                    '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.',
2776
                    'event_espresso'
2777
                ),
2778
                __FILE__, __FUNCTION__, __LINE__
2779
            );
2780
            return false;
2781
        }
2782
        //k made it here so that means we can delete all the related transactions and their answers (but let's do them
2783
        //separately from THIS one).
2784
        foreach ($REGS as $registration) {
2785
            //delete related answers
2786
            $registration->delete_related_permanently('Answer');
2787
            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2788
            $attendee = $registration->get_first_related('Attendee');
2789
            if ($attendee instanceof EE_Attendee) {
2790
                $registration->_remove_relation_to($attendee, 'Attendee');
2791
            }
2792
            //now remove relationships to tickets on this registration.
2793
            $registration->_remove_relations('Ticket');
2794
            //now delete permanently the checkins related to this registration.
2795
            $registration->delete_related_permanently('Checkin');
2796
            if ($registration->ID() === $REG->ID()) {
2797
                continue;
2798
            } //we don't want to delete permanently the existing registration just yet.
2799
            //remove relation to transaction for these registrations if NOT the existing registrations
2800
            $registration->_remove_relations('Transaction');
2801
            //delete permanently any related messages.
2802
            $registration->delete_related_permanently('Message');
2803
            //now delete this registration permanently
2804
            $registration->delete_permanently();
2805
        }
2806
        //now all related registrations on the transaction are handled.  So let's just handle this registration itself
2807
        // (the transaction and line items should be all that's left).
2808
        // delete the line items related to the transaction for this registration.
2809
        $TXN->delete_related_permanently('Line_Item');
2810
        //we need to remove all the relationships on the transaction
2811
        $TXN->delete_related_permanently('Payment');
2812
        $TXN->delete_related_permanently('Extra_Meta');
2813
        $TXN->delete_related_permanently('Message');
2814
        //now we can delete this REG permanently (and the transaction of course)
2815
        $REG->delete_related_permanently('Transaction');
2816
        return $REG->delete_permanently();
2817
    }
2818
2819
2820
    /**
2821
     *    generates HTML for the Register New Attendee Admin page
2822
     *
2823
     * @access private
2824
     * @throws DomainException
2825
     * @throws EE_Error
2826
     */
2827
    public function new_registration()
2828
    {
2829
        if ( ! $this->_set_reg_event()) {
2830
            throw new EE_Error(
2831
                esc_html__(
2832
                    'Unable to continue with registering because there is no Event ID in the request',
2833
                    'event_espresso'
2834
                )
2835
            );
2836
        }
2837
        EE_Registry::instance()->REQ->set_espresso_page(true);
2838
        // gotta start with a clean slate if we're not coming here via ajax
2839
        if ( ! defined('DOING_AJAX')
2840
             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2841
        ) {
2842
            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2843
        }
2844
        $this->_template_args['event_name'] = '';
2845
        // event name
2846
        if ($this->_reg_event) {
2847
            $this->_template_args['event_name'] = $this->_reg_event->name();
2848
            $edit_event_url                     = self::add_query_args_and_nonce(array(
2849
                'action' => 'edit',
2850
                'post'   => $this->_reg_event->ID(),
2851
            ), EVENTS_ADMIN_URL);
2852
            $edit_event_lnk                     = '<a href="'
2853
                                                  . $edit_event_url
2854
                                                  . '" title="'
2855
                                                  . esc_attr__('Edit ', 'event_espresso')
2856
                                                  . $this->_reg_event->name()
2857
                                                  . '">'
2858
                                                  . esc_html__('Edit Event', 'event_espresso')
2859
                                                  . '</a>';
2860
            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2861
                                                   . $edit_event_lnk
2862
                                                   . '</span>';
2863
        }
2864
        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2865
        if (defined('DOING_AJAX')) {
2866
            $this->_return_json();
2867
        }
2868
        // grab header
2869
        $template_path                              =
2870
            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2871
        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2872
            $this->_template_args, true);
2873
        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2874
        // the details template wrapper
2875
        $this->display_admin_page_with_sidebar();
2876
    }
2877
2878
2879
    /**
2880
     * This returns the content for a registration step
2881
     *
2882
     * @access protected
2883
     * @return string html
2884
     * @throws DomainException
2885
     * @throws EE_Error
2886
     * @throws InvalidArgumentException
2887
     * @throws InvalidDataTypeException
2888
     * @throws InvalidInterfaceException
2889
     */
2890
    protected function _get_registration_step_content()
2891
    {
2892
        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2893
            $warning_msg = sprintf(
2894
                esc_html__(
2895
                    '%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',
2896
                    'event_espresso'
2897
                ),
2898
                '<br />',
2899
                '<h3 class="important-notice">',
2900
                '</h3>',
2901
                '<div class="float-right">',
2902
                '<span id="redirect_timer" class="important-notice">30</span>',
2903
                '</div>',
2904
                '<b>',
2905
                '</b>'
2906
            );
2907
            return '
2908
	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2909
	<script >
2910
		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2911
		// after just adding a new registration... we gotta try to put a stop to that !!!
2912
		var timer = 30;
2913
		setInterval( function () {
2914
			jQuery("#redirect_timer").html( parseInt( timer ) );
2915
	        if ( --timer < 0 ) {
2916
	            window.history.forward()
2917
	        }
2918
	    }, 800 );
2919
	</script >';
2920
        }
2921
        $template_args = array(
2922
            'title'                    => '',
2923
            'content'                  => '',
2924
            'step_button_text'         => '',
2925
            'show_notification_toggle' => false,
2926
        );
2927
        //to indicate we're processing a new registration
2928
        $hidden_fields = array(
2929
            'processing_registration' => array(
2930
                'type'  => 'hidden',
2931
                'value' => 0,
2932
            ),
2933
            'event_id'                => array(
2934
                'type'  => 'hidden',
2935
                'value' => $this->_reg_event->ID(),
2936
            ),
2937
        );
2938
        //if the cart is empty then we know we're at step one so we'll display ticket selector
2939
        $cart = EE_Registry::instance()->SSN->cart();
2940
        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2941
        switch ($step) {
2942
            case 'ticket' :
2943
                $hidden_fields['processing_registration']['value'] = 1;
2944
                $template_args['title']                            = esc_html__(
2945
                    'Step One: Select the Ticket for this registration',
2946
                    'event_espresso'
2947
                );
2948
                $template_args['content']                          =
2949
                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2950
                $template_args['step_button_text']                 = esc_html__(
2951
                    'Add Tickets and Continue to Registrant Details',
2952
                    'event_espresso'
2953
                );
2954
                $template_args['show_notification_toggle']         = false;
2955
                break;
2956
            case 'questions' :
2957
                $hidden_fields['processing_registration']['value'] = 2;
2958
                $template_args['title']                            = esc_html__(
2959
                    'Step Two: Add Registrant Details for this Registration',
2960
                    'event_espresso'
2961
                );
2962
                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2963
                // properly by the first process_reg_step run.
2964
                $template_args['content']                  =
2965
                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2966
                $template_args['step_button_text']         = esc_html__(
2967
                    'Save Registration and Continue to Details',
2968
                    'event_espresso'
2969
                );
2970
                $template_args['show_notification_toggle'] = true;
2971
                break;
2972
        }
2973
        //we come back to the process_registration_step route.
2974
        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2975
        return EEH_Template::display_template(
2976
            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2977
            $template_args,
2978
            true
2979
        );
2980
    }
2981
2982
2983
    /**
2984
     *        set_reg_event
2985
     *
2986
     * @access private
2987
     * @return bool
2988
     * @throws EE_Error
2989
     * @throws InvalidArgumentException
2990
     * @throws InvalidDataTypeException
2991
     * @throws InvalidInterfaceException
2992
     */
2993
    private function _set_reg_event()
2994
    {
2995
        if (is_object($this->_reg_event)) {
2996
            return true;
2997
        }
2998
        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2999
        if ( ! $EVT_ID) {
3000
            return false;
3001
        }
3002
        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
3003
        return true;
3004
    }
3005
3006
3007
    /**
3008
     * process_reg_step
3009
     *
3010
     * @access        public
3011
     * @return string
3012
     * @throws DomainException
3013
     * @throws EE_Error
3014
     * @throws InvalidArgumentException
3015
     * @throws InvalidDataTypeException
3016
     * @throws InvalidInterfaceException
3017
     * @throws ReflectionException
3018
     * @throws RuntimeException
3019
     */
3020
    public function process_reg_step()
3021
    {
3022
        EE_System::do_not_cache();
3023
        $this->_set_reg_event();
3024
        EE_Registry::instance()->REQ->set_espresso_page(true);
3025
        EE_Registry::instance()->REQ->set('uts', time());
3026
        //what step are we on?
3027
        $cart = EE_Registry::instance()->SSN->cart();
3028
        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
3029
        //if doing ajax then we need to verify the nonce
3030 View Code Duplication
        if (defined('DOING_AJAX')) {
3031
            $nonce = isset($this->_req_data[$this->_req_nonce])
3032
                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
3033
            $this->_verify_nonce($nonce, $this->_req_nonce);
3034
        }
3035
        switch ($step) {
3036
            case 'ticket' :
3037
                //process ticket selection
3038
                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
3039
                if ($success) {
3040
                    EE_Error::add_success(
3041
                        esc_html__(
3042
                            'Tickets Selected. Now complete the registration.',
3043
                            'event_espresso'
3044
                        )
3045
                    );
3046
                } else {
3047
                    $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...
3048
                }
3049 View Code Duplication
                if (defined('DOING_AJAX')) {
3050
                    $this->new_registration(); //display next step
3051
                } else {
3052
                    $query_args = array(
3053
                        'action'                  => 'new_registration',
3054
                        'processing_registration' => 1,
3055
                        'event_id'                => $this->_reg_event->ID(),
3056
                        'uts'                     => time(),
3057
                    );
3058
                    $this->_redirect_after_action(
3059
                        false,
3060
                        '',
3061
                        '',
3062
                        $query_args,
3063
                        true
3064
                    );
3065
                }
3066
                break;
3067
            case 'questions' :
3068
                if (! isset(
3069
                    $this->_req_data['txn_reg_status_change'],
3070
                    $this->_req_data['txn_reg_status_change']['send_notifications'])
3071
                ) {
3072
                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
3073
                }
3074
                //process registration
3075
                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
3076
                if ($cart instanceof EE_Cart) {
3077
                    $grand_total = $cart->get_cart_grand_total();
3078
                    if ($grand_total instanceof EE_Line_Item) {
3079
                        $grand_total->save_this_and_descendants_to_txn();
3080
                    }
3081
                }
3082 View Code Duplication
                if ( ! $transaction instanceof EE_Transaction) {
3083
                    $query_args = array(
3084
                        'action'                  => 'new_registration',
3085
                        'processing_registration' => 2,
3086
                        'event_id'                => $this->_reg_event->ID(),
3087
                        'uts'                     => time(),
3088
                    );
3089
                    if (defined('DOING_AJAX')) {
3090
                        //display registration form again because there are errors (maybe validation?)
3091
                        $this->new_registration();
3092
                        return;
3093
                    } else {
3094
                        $this->_redirect_after_action(
3095
                            false,
3096
                            '',
3097
                            '',
3098
                            $query_args,
3099
                            true
3100
                        );
3101
                        return;
3102
                    }
3103
                }
3104
                // maybe update status, and make sure to save transaction if not done already
3105
                if ( ! $transaction->update_status_based_on_total_paid()) {
3106
                    $transaction->save();
3107
                }
3108
                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3109
                $this->_req_data = array();
3110
                $query_args      = array(
3111
                    'action'        => 'redirect_to_txn',
3112
                    'TXN_ID'        => $transaction->ID(),
3113
                    'EVT_ID'        => $this->_reg_event->ID(),
3114
                    'event_name'    => urlencode($this->_reg_event->name()),
3115
                    'redirect_from' => 'new_registration',
3116
                );
3117
                $this->_redirect_after_action(false, '', '', $query_args, true);
3118
                break;
3119
        }
3120
        //what are you looking here for?  Should be nothing to do at this point.
3121
    }
3122
3123
3124
    /**
3125
     * redirect_to_txn
3126
     *
3127
     * @access public
3128
     * @return void
3129
     * @throws EE_Error
3130
     * @throws InvalidArgumentException
3131
     * @throws InvalidDataTypeException
3132
     * @throws InvalidInterfaceException
3133
     */
3134
    public function redirect_to_txn()
3135
    {
3136
        EE_System::do_not_cache();
3137
        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3138
        $query_args = array(
3139
            'action' => 'view_transaction',
3140
            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3141
            'page'   => 'espresso_transactions',
3142
        );
3143
        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3144
            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
3145
            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
3146
            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3147
        }
3148
        EE_Error::add_success(
3149
            esc_html__(
3150
                'Registration Created.  Please review the transaction and add any payments as necessary',
3151
                'event_espresso'
3152
            )
3153
        );
3154
        $this->_redirect_after_action(false, '', '', $query_args, true);
3155
    }
3156
3157
3158
    /**
3159
     *        generates HTML for the Attendee Contact List
3160
     *
3161
     * @access protected
3162
     * @return void
3163
     */
3164
    protected function _attendee_contact_list_table()
3165
    {
3166
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3167
        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3168
        $this->display_admin_list_table_page_with_no_sidebar();
3169
    }
3170
3171
3172
    /**
3173
     *        get_attendees
3174
     *
3175
     * @param      $per_page
3176
     * @param bool $count whether to return count or data.
3177
     * @param bool $trash
3178
     * @return array
3179
     * @throws EE_Error
3180
     * @throws InvalidArgumentException
3181
     * @throws InvalidDataTypeException
3182
     * @throws InvalidInterfaceException
3183
     * @access public
3184
     */
3185
    public function get_attendees($per_page, $count = false, $trash = false)
3186
    {
3187
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3188
        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3189
        $ATT_MDL                    = EEM_Attendee::instance();
3190
        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3191
        switch ($this->_req_data['orderby']) {
3192
            case 'ATT_ID':
3193
                $orderby = 'ATT_ID';
3194
                break;
3195
            case 'ATT_fname':
3196
                $orderby = 'ATT_fname';
3197
                break;
3198
            case 'ATT_email':
3199
                $orderby = 'ATT_email';
3200
                break;
3201
            case 'ATT_city':
3202
                $orderby = 'ATT_city';
3203
                break;
3204
            case 'STA_ID':
3205
                $orderby = 'STA_ID';
3206
                break;
3207
            case 'CNT_ID':
3208
                $orderby = 'CNT_ID';
3209
                break;
3210
            default:
3211
                $orderby = 'ATT_lname';
3212
        }
3213
        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3214
            ? $this->_req_data['order']
3215
            : 'ASC';
3216
        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3217
            ? $this->_req_data['paged']
3218
            : 1;
3219
        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3220
        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3221
            ? $this->_req_data['perpage']
3222
            : $per_page;
3223
        $_where       = array();
3224
        if ( ! empty($this->_req_data['s'])) {
3225
            $sstr         = '%' . $this->_req_data['s'] . '%';
3226
            $_where['OR'] = array(
3227
                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3228
                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3229
                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3230
                'ATT_fname'                         => array('LIKE', $sstr),
3231
                'ATT_lname'                         => array('LIKE', $sstr),
3232
                'ATT_short_bio'                     => array('LIKE', $sstr),
3233
                'ATT_email'                         => array('LIKE', $sstr),
3234
                'ATT_address'                       => array('LIKE', $sstr),
3235
                'ATT_address2'                      => array('LIKE', $sstr),
3236
                'ATT_city'                          => array('LIKE', $sstr),
3237
                'Country.CNT_name'                  => array('LIKE', $sstr),
3238
                'State.STA_name'                    => array('LIKE', $sstr),
3239
                'ATT_phone'                         => array('LIKE', $sstr),
3240
                'Registration.REG_final_price'      => array('LIKE', $sstr),
3241
                'Registration.REG_code'             => array('LIKE', $sstr),
3242
                'Registration.REG_count'            => array('LIKE', $sstr),
3243
                'Registration.REG_group_size'       => array('LIKE', $sstr),
3244
            );
3245
        }
3246
        $offset = ($current_page - 1) * $per_page;
3247
        $limit  = $count ? null : array($offset, $per_page);
3248
        if ($trash) {
3249
            $_where['status'] = array('!=', 'publish');
3250
            $all_attendees    = $count
3251
                ? $ATT_MDL->count(array(
3252
                    $_where,
3253
                    'order_by' => array($orderby => $sort),
3254
                    'limit'    => $limit,
3255
                ), 'ATT_ID', true)
3256
                : $ATT_MDL->get_all(array(
3257
                    $_where,
3258
                    'order_by' => array($orderby => $sort),
3259
                    'limit'    => $limit,
3260
                ));
3261
        } else {
3262
            $_where['status'] = array('IN', array('publish'));
3263
            $all_attendees    = $count
3264
                ? $ATT_MDL->count(array(
3265
                    $_where,
3266
                    'order_by' => array($orderby => $sort),
3267
                    'limit'    => $limit,
3268
                ), 'ATT_ID', true)
3269
                : $ATT_MDL->get_all(array(
3270
                    $_where,
3271
                    'order_by' => array($orderby => $sort),
3272
                    'limit'    => $limit,
3273
                ));
3274
        }
3275
        return $all_attendees;
3276
    }
3277
3278
3279
    /**
3280
     * This is just taking care of resending the registration confirmation
3281
     *
3282
     * @access protected
3283
     * @return void
3284
     */
3285
    protected function _resend_registration()
3286
    {
3287
        $this->_process_resend_registration();
3288
        $query_args = isset($this->_req_data['redirect_to'])
3289
            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3290
            : array('action' => 'default');
3291
        $this->_redirect_after_action(false, '', '', $query_args, true);
3292
    }
3293
3294
    /**
3295
     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3296
     * to use when selecting registrations
3297
     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3298
     *                                                     the query parameters from the request
3299
     * @return void ends the request with a redirect or download
3300
     */
3301
    public function _registrations_report_base( $method_name_for_getting_query_params )
3302
    {
3303
        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3304
            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3305
                array(
3306
                    'page'        => 'espresso_batch',
3307
                    'batch'       => 'file',
3308
                    'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3309
                    'filters'     => urlencode(
3310
                        serialize(
3311
                            call_user_func(
3312
                                array( $this, $method_name_for_getting_query_params ),
3313
                                EEH_Array::is_set(
3314
                                    $this->_req_data,
3315
                                    'filters',
3316
                                    array()
3317
                                )
3318
                            )
3319
                        )
3320
                ),
3321
                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3322
                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3323
                'return_url'  => urlencode($this->_req_data['return_url']),
3324
            )));
3325
        } else {
3326
            $new_request_args = array(
3327
                'export' => 'report',
3328
                'action' => 'registrations_report_for_event',
3329
                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3330
            );
3331
            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3332
            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3333
                require_once(EE_CLASSES . 'EE_Export.class.php');
3334
                $EE_Export = EE_Export::instance($this->_req_data);
3335
                $EE_Export->export();
3336
            }
3337
        }
3338
    }
3339
3340
3341
3342
    /**
3343
     * Creates a registration report using only query parameters in the request
3344
     * @return void
3345
     */
3346
    public function _registrations_report()
3347
    {
3348
        $this->_registrations_report_base('_get_registration_query_parameters');
3349
    }
3350
3351
3352
    public function _contact_list_export()
3353
    {
3354
        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3355
            require_once(EE_CLASSES . 'EE_Export.class.php');
3356
            $EE_Export = EE_Export::instance($this->_req_data);
3357
            $EE_Export->export_attendees();
3358
        }
3359
    }
3360
3361
3362
    public function _contact_list_report()
3363
    {
3364
        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3365
            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3366
                'page'        => 'espresso_batch',
3367
                'batch'       => 'file',
3368
                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3369
                'return_url'  => urlencode($this->_req_data['return_url']),
3370
            )));
3371
        } else {
3372
            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3373
                require_once(EE_CLASSES . 'EE_Export.class.php');
3374
                $EE_Export = EE_Export::instance($this->_req_data);
3375
                $EE_Export->report_attendees();
3376
            }
3377
        }
3378
    }
3379
3380
3381
3382
3383
3384
    /***************************************        ATTENDEE DETAILS        ***************************************/
3385
    /**
3386
     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3387
     *
3388
     * @return void
3389
     * @throws EE_Error
3390
     * @throws InvalidArgumentException
3391
     * @throws InvalidDataTypeException
3392
     * @throws InvalidInterfaceException
3393
     */
3394
    protected function _duplicate_attendee()
3395
    {
3396
        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3397
        //verify we have necessary info
3398
        if (empty($this->_req_data['_REG_ID'])) {
3399
            EE_Error::add_error(
3400
                esc_html__(
3401
                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3402
                    'event_espresso'
3403
                ), __FILE__, __LINE__, __FUNCTION__
3404
            );
3405
            $query_args = array('action' => $action);
3406
            $this->_redirect_after_action('', '', '', $query_args, true);
3407
        }
3408
        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3409
        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3410
        $attendee     = $registration->attendee();
3411
        //remove relation of existing attendee on registration
3412
        $registration->_remove_relation_to($attendee, 'Attendee');
3413
        //new attendee
3414
        $new_attendee = clone $attendee;
3415
        $new_attendee->set('ATT_ID', 0);
3416
        $new_attendee->save();
3417
        //add new attendee to reg
3418
        $registration->_add_relation_to($new_attendee, 'Attendee');
3419
        EE_Error::add_success(
3420
            esc_html__(
3421
                'New Contact record created.  Now make any edits you wish to make for this contact.',
3422
                'event_espresso'
3423
            )
3424
        );
3425
        //redirect to edit page for attendee
3426
        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3427
        $this->_redirect_after_action('', '', '', $query_args, true);
3428
    }
3429
3430
3431
    /**
3432
     * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook.
3433
     * @param int      $post_id
3434
     * @param WP_POST $post
3435
     * @throws DomainException
3436
     * @throws EE_Error
3437
     * @throws InvalidArgumentException
3438
     * @throws InvalidDataTypeException
3439
     * @throws InvalidInterfaceException
3440
     * @throws LogicException
3441
     * @throws InvalidFormSubmissionException
3442
     */
3443
    protected function _insert_update_cpt_item($post_id, $post)
3444
    {
3445
        $success  = true;
3446
        $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees'
3447
            ? EEM_Attendee::instance()->get_one_by_ID($post_id)
3448
            : null;
3449
        //for attendee updates
3450
        if ($attendee instanceof EE_Attendee) {
3451
            //note we should only be UPDATING attendees at this point.
3452
            $updated_fields = array(
3453
                'ATT_fname'     => $this->_req_data['ATT_fname'],
3454
                'ATT_lname'     => $this->_req_data['ATT_lname'],
3455
                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3456
                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3457
                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3458
                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3459
                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3460
                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3461
                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3462
            );
3463
            foreach ($updated_fields as $field => $value) {
3464
                $attendee->set($field, $value);
3465
            }
3466
3467
            //process contact details metabox form handler (which will also save the attendee)
3468
            $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee);
3469
            $success = $contact_details_form->process($this->_req_data);
3470
3471
            $attendee_update_callbacks = apply_filters(
3472
                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3473
                array()
3474
            );
3475
            foreach ($attendee_update_callbacks as $a_callback) {
3476
                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3477
                    throw new EE_Error(
3478
                        sprintf(
3479
                            esc_html__(
3480
                                '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.',
3481
                                'event_espresso'
3482
                            ),
3483
                            $a_callback
3484
                        )
3485
                    );
3486
                }
3487
            }
3488
        }
3489
3490
        if ($success === false) {
3491
            EE_Error::add_error(
3492
                esc_html__(
3493
                    'Something went wrong with updating the meta table data for the registration.',
3494
                    'event_espresso'
3495
                ),
3496
                __FILE__, __FUNCTION__, __LINE__
3497
            );
3498
        }
3499
    }
3500
3501
3502
    public function trash_cpt_item($post_id)
3503
    {
3504
    }
3505
3506
3507
    public function delete_cpt_item($post_id)
3508
    {
3509
    }
3510
3511
3512
    public function restore_cpt_item($post_id)
3513
    {
3514
    }
3515
3516
3517
    protected function _restore_cpt_item($post_id, $revision_id)
3518
    {
3519
    }
3520
3521
3522
    public function attendee_editor_metaboxes()
3523
    {
3524
        $this->verify_cpt_object();
3525
        remove_meta_box(
3526
            'postexcerpt',
3527
            esc_html__('Excerpt', 'event_espresso'),
3528
            'post_excerpt_meta_box',
3529
            $this->_cpt_routes[$this->_req_action],
3530
            'normal',
3531
            'core'
3532
        );
3533
        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3534 View Code Duplication
        if (post_type_supports('espresso_attendees', 'excerpt')) {
3535
            add_meta_box(
3536
                'postexcerpt',
3537
                esc_html__('Short Biography', 'event_espresso'),
3538
                'post_excerpt_meta_box',
3539
                $this->_cpt_routes[$this->_req_action],
3540
                'normal'
3541
            );
3542
        }
3543 View Code Duplication
        if (post_type_supports('espresso_attendees', 'comments')) {
3544
            add_meta_box(
3545
                'commentsdiv',
3546
                esc_html__('Notes on the Contact', 'event_espresso'),
3547
                'post_comment_meta_box',
3548
                $this->_cpt_routes[$this->_req_action],
3549
                'normal',
3550
                'core'
3551
            );
3552
        }
3553
        add_meta_box(
3554
            'attendee_contact_info',
3555
            esc_html__('Contact Info', 'event_espresso'),
3556
            array($this, 'attendee_contact_info'),
3557
            $this->_cpt_routes[$this->_req_action],
3558
            'side',
3559
            'core'
3560
        );
3561
        add_meta_box(
3562
            'attendee_details_address',
3563
            esc_html__('Address Details', 'event_espresso'),
3564
            array($this, 'attendee_address_details'),
3565
            $this->_cpt_routes[$this->_req_action],
3566
            'normal',
3567
            'core'
3568
        );
3569
        add_meta_box(
3570
            'attendee_registrations',
3571
            esc_html__('Registrations for this Contact', 'event_espresso'),
3572
            array($this, 'attendee_registrations_meta_box'),
3573
            $this->_cpt_routes[$this->_req_action],
3574
            'normal',
3575
            'high'
3576
        );
3577
    }
3578
3579
3580
    /**
3581
     * Metabox for attendee contact info
3582
     *
3583
     * @param  WP_Post $post wp post object
3584
     * @return string attendee contact info ( and form )
3585
     * @throws EE_Error
3586
     * @throws InvalidArgumentException
3587
     * @throws InvalidDataTypeException
3588
     * @throws InvalidInterfaceException
3589
     * @throws LogicException
3590
     * @throws DomainException
3591
     */
3592
    public function attendee_contact_info($post)
3593
    {
3594
        //get attendee object ( should already have it )
3595
        $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj);
3596
        $form->enqueueStylesAndScripts();
3597
        echo $form->display();
3598
    }
3599
3600
3601
    /**
3602
     * Return form handler for the contact details metabox
3603
     *
3604
     * @param EE_Attendee $attendee
3605
     * @return AttendeeContactDetailsMetaboxFormHandler
3606
     * @throws DomainException
3607
     * @throws InvalidArgumentException
3608
     * @throws InvalidDataTypeException
3609
     * @throws InvalidInterfaceException
3610
     */
3611
    protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee)
3612
    {
3613
        return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance());
3614
    }
3615
3616
3617
    /**
3618
     * Metabox for attendee details
3619
     *
3620
     * @param  WP_Post $post wp post object
3621
     * @throws DomainException
3622
     */
3623
    public function attendee_address_details($post)
3624
    {
3625
        //get attendee object (should already have it)
3626
        $this->_template_args['attendee']     = $this->_cpt_model_obj;
3627
        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3628
            new EE_Question_Form_Input(
3629
                EE_Question::new_instance(
3630
                    array(
3631
                        'QST_ID'           => 0,
3632
                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3633
                        'QST_system'       => 'admin-state',
3634
                    )
3635
                ),
3636
                EE_Answer::new_instance(
3637
                    array(
3638
                        'ANS_ID'    => 0,
3639
                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3640
                    )
3641
                ),
3642
                array(
3643
                    'input_id'       => 'STA_ID',
3644
                    'input_name'     => 'STA_ID',
3645
                    'input_prefix'   => '',
3646
                    'append_qstn_id' => false,
3647
                )
3648
            )
3649
        );
3650
        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3651
            new EE_Question_Form_Input(
3652
                EE_Question::new_instance(
3653
                    array(
3654
                        'QST_ID'           => 0,
3655
                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3656
                        'QST_system'       => 'admin-country',
3657
                    )
3658
                ),
3659
                EE_Answer::new_instance(
3660
                    array(
3661
                        'ANS_ID'    => 0,
3662
                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3663
                    )
3664
                ),
3665
                array(
3666
                    'input_id'       => 'CNT_ISO',
3667
                    'input_name'     => 'CNT_ISO',
3668
                    'input_prefix'   => '',
3669
                    'append_qstn_id' => false,
3670
                )
3671
            )
3672
        );
3673
        $template                             =
3674
            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3675
        EEH_Template::display_template($template, $this->_template_args);
3676
    }
3677
3678
3679
    /**
3680
     *        _attendee_details
3681
     *
3682
     * @access protected
3683
     * @param $post
3684
     * @return void
3685
     * @throws DomainException
3686
     * @throws EE_Error
3687
     */
3688
    public function attendee_registrations_meta_box($post)
3689
    {
3690
        $this->_template_args['attendee']      = $this->_cpt_model_obj;
3691
        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3692
        $template                              =
3693
            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3694
        EEH_Template::display_template($template, $this->_template_args);
3695
    }
3696
3697
3698
    /**
3699
     * add in the form fields for the attendee edit
3700
     *
3701
     * @param  WP_Post $post wp post object
3702
     * @return string html for new form.
3703
     * @throws DomainException
3704
     */
3705
    public function after_title_form_fields($post)
3706
    {
3707
        if ($post->post_type == 'espresso_attendees') {
3708
            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3709
            $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...
3710
            EEH_Template::display_template($template, $template_args);
3711
        }
3712
    }
3713
3714
3715
    /**
3716
     *        _trash_or_restore_attendee
3717
     *
3718
     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3719
     * @return void
3720
     * @throws EE_Error
3721
     * @throws InvalidArgumentException
3722
     * @throws InvalidDataTypeException
3723
     * @throws InvalidInterfaceException
3724
     * @access protected
3725
     */
3726
    protected function _trash_or_restore_attendees($trash = true)
3727
    {
3728
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3729
        $ATT_MDL = EEM_Attendee::instance();
3730
        $success = 1;
3731
        //Checkboxes
3732
        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3733
            // if array has more than one element than success message should be plural
3734
            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3735
            // cycle thru checkboxes
3736
            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $value is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
3737
                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3738
                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3739
                if ( ! $updated) {
3740
                    $success = 0;
3741
                }
3742
            }
3743
        } else {
3744
            // grab single id and delete
3745
            $ATT_ID = absint($this->_req_data['ATT_ID']);
3746
            //get attendee
3747
            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3748
            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
0 ignored issues
show
Unused Code introduced by
$updated is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
3749
            $updated = $att->save();
3750
            if ( ! $updated) {
3751
                $success = 0;
3752
            }
3753
        }
3754
        $what        = $success > 1
3755
            ? esc_html__('Contacts', 'event_espresso')
3756
            : esc_html__('Contact', 'event_espresso');
3757
        $action_desc = $trash
3758
            ? esc_html__('moved to the trash', 'event_espresso')
3759
            : esc_html__('restored', 'event_espresso');
3760
        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3761
    }
3762
3763
}
3764