Completed
Branch BUG/11214/move-command-handler... (de017e)
by
unknown
27:35 queued 19:13
created
admin_pages/registrations/Registrations_Admin_Page.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1247,7 +1247,7 @@
 block discarded – undo
1247 1247
     /**
1248 1248
      * Sets up the limit for the registrations query.
1249 1249
      *
1250
-     * @param $per_page
1250
+     * @param integer $per_page
1251 1251
      * @return array
1252 1252
      */
1253 1253
     protected function _get_limit($per_page)
Please login to merge, or discard this patch.
Indentation   +3690 added lines, -3690 removed lines patch added patch discarded remove patch
@@ -30,2301 +30,2301 @@  discard block
 block discarded – undo
30 30
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
31 31
 {
32 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
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
-    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');
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
-        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
-            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
-        /*
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
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
+	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');
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
+		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
+			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 1255
          * If filtering by registration status, then we show registrations matching that status.
1256 1256
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1257 1257
          * UNLESS viewing trashed registrations.
1258 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');
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');
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,
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,
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,
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;
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 '
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');
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');
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,
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,
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,
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;
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 2294
 	<table class="form-table ee-width-100">
2295 2295
 		<tbody>
2296 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 '
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 2319
 			<tr class="hide-if-no-js">
2320 2320
 				<th> </th>
2321 2321
 				<td class="reg-admin-edit-attendee-question-td">
2322 2322
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2323
-               . esc_attr__('click to edit question', 'event_espresso')
2324
-               . '">
2323
+			   . esc_attr__('click to edit question', 'event_espresso')
2324
+			   . '">
2325 2325
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2326
-               . esc_html__('edit the above question group', 'event_espresso')
2327
-               . '</span>
2326
+			   . esc_html__('edit the above question group', 'event_espresso')
2327
+			   . '</span>
2328 2328
 						<div class="dashicons dashicons-edit"></div>
2329 2329
 					</a>
2330 2330
 				</td>
@@ -2332,579 +2332,579 @@  discard block
 block discarded – undo
2332 2332
 		</tbody>
2333 2333
 	</table>
2334 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
-    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 '
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
+	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 2357
 			<tr>
2358 2358
 				<th>
2359 2359
 					' . $label . '
2360 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
-    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 '
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
+	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 2383
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2384 2384
 					' . $input . '
2385 2385
 				</td>
2386 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) {
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
-        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'])) {
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 '
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) {
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
+		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'])) {
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 2908
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2909 2909
 	<script >
2910 2910
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2917,847 +2917,847 @@  discard block
 block discarded – undo
2917 2917
 	        }
2918 2918
 	    }, 800 );
2919 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
-        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;
3048
-                }
3049
-                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
-                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
-        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
-        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;
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'])) {
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');
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
-    }
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
+		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;
3048
+				}
3049
+				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
+				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
+		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
+		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;
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'])) {
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');
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 3762
 
3763 3763
 }
Please login to merge, or discard this patch.
Spacing   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
         // when adding a new registration...
77 77
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
78 78
             EE_System::do_not_cache();
79
-            if (! isset($this->_req_data['processing_registration'])
79
+            if ( ! isset($this->_req_data['processing_registration'])
80 80
                  || absint($this->_req_data['processing_registration']) !== 1
81 81
             ) {
82 82
                 // and it's NOT the attendee information reg step
@@ -171,7 +171,7 @@  discard block
 block discarded – undo
171 171
     public function _set_page_routes()
172 172
     {
173 173
         $this->_get_registration_status_array();
174
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
174
+        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
175 175
             ? $this->_req_data['_REG_ID'] : 0;
176 176
         $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
177 177
             ? $this->_req_data['reg_status_change_form']['REG_ID']
@@ -669,7 +669,7 @@  discard block
 block discarded – undo
669 669
         //style
670 670
         wp_register_style(
671 671
             'espresso_reg',
672
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
672
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
673 673
             array('ee-admin-css'),
674 674
             EVENT_ESPRESSO_VERSION
675 675
         );
@@ -677,7 +677,7 @@  discard block
 block discarded – undo
677 677
         //script
678 678
         wp_register_script(
679 679
             'espresso_reg',
680
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
680
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
681 681
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
682 682
             EVENT_ESPRESSO_VERSION,
683 683
             true
@@ -715,7 +715,7 @@  discard block
 block discarded – undo
715 715
         wp_deregister_style('espresso_reg');
716 716
         wp_register_style(
717 717
             'espresso_att',
718
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
718
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
719 719
             array('ee-admin-css'),
720 720
             EVENT_ESPRESSO_VERSION
721 721
         );
@@ -727,7 +727,7 @@  discard block
 block discarded – undo
727 727
     {
728 728
         wp_register_script(
729 729
             'ee-spco-for-admin',
730
-            REG_ASSETS_URL . 'spco_for_admin.js',
730
+            REG_ASSETS_URL.'spco_for_admin.js',
731 731
             array('underscore', 'jquery'),
732 732
             EVENT_ESPRESSO_VERSION,
733 733
             true
@@ -861,7 +861,7 @@  discard block
 block discarded – undo
861 861
                     'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
862 862
                 ),
863 863
             );
864
-            $this->_views['trash']      = array(
864
+            $this->_views['trash'] = array(
865 865
                 'slug'        => 'trash',
866 866
                 'label'       => esc_html__('Trash', 'event_espresso'),
867 867
                 'count'       => 0,
@@ -950,7 +950,7 @@  discard block
 block discarded – undo
950 950
         }
951 951
         $sc_items = array(
952 952
             'approved_status'   => array(
953
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
953
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
954 954
                 'desc'  => EEH_Template::pretty_status(
955 955
                     EEM_Registration::status_id_approved,
956 956
                     false,
@@ -958,7 +958,7 @@  discard block
 block discarded – undo
958 958
                 ),
959 959
             ),
960 960
             'pending_status'    => array(
961
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
961
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
962 962
                 'desc'  => EEH_Template::pretty_status(
963 963
                     EEM_Registration::status_id_pending_payment,
964 964
                     false,
@@ -966,7 +966,7 @@  discard block
 block discarded – undo
966 966
                 ),
967 967
             ),
968 968
             'wait_list'         => array(
969
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
969
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
970 970
                 'desc'  => EEH_Template::pretty_status(
971 971
                     EEM_Registration::status_id_wait_list,
972 972
                     false,
@@ -974,7 +974,7 @@  discard block
 block discarded – undo
974 974
                 ),
975 975
             ),
976 976
             'incomplete_status' => array(
977
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
977
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
978 978
                 'desc'  => EEH_Template::pretty_status(
979 979
                     EEM_Registration::status_id_incomplete,
980 980
                     false,
@@ -982,7 +982,7 @@  discard block
 block discarded – undo
982 982
                 ),
983 983
             ),
984 984
             'not_approved'      => array(
985
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
985
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
986 986
                 'desc'  => EEH_Template::pretty_status(
987 987
                     EEM_Registration::status_id_not_approved,
988 988
                     false,
@@ -990,7 +990,7 @@  discard block
 block discarded – undo
990 990
                 ),
991 991
             ),
992 992
             'declined_status'   => array(
993
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
993
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
994 994
                 'desc'  => EEH_Template::pretty_status(
995 995
                     EEM_Registration::status_id_declined,
996 996
                     false,
@@ -998,7 +998,7 @@  discard block
 block discarded – undo
998 998
                 ),
999 999
             ),
1000 1000
             'cancelled_status'  => array(
1001
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
1001
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
1002 1002
                 'desc'  => EEH_Template::pretty_status(
1003 1003
                     EEM_Registration::status_id_cancelled,
1004 1004
                     false,
@@ -1027,7 +1027,7 @@  discard block
 block discarded – undo
1027 1027
                 'espresso_registrations_new_registration',
1028 1028
                 $EVT_ID
1029 1029
             )) {
1030
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1030
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
1031 1031
                     'new_registration',
1032 1032
                     'add-registrant',
1033 1033
                     array('event_id' => $EVT_ID),
@@ -1067,7 +1067,7 @@  discard block
 block discarded – undo
1067 1067
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1068 1068
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1069 1069
                 $this->_template_args['admin_page_header'] .= $datetime->name();
1070
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1070
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
1071 1071
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
1072 1072
             }
1073 1073
         }
@@ -1174,7 +1174,7 @@  discard block
 block discarded – undo
1174 1174
             'caps'                     => EEM_Registration::caps_read_admin,
1175 1175
             'default_where_conditions' => 'this_model_only',
1176 1176
         );
1177
-        if (! $count) {
1177
+        if ( ! $count) {
1178 1178
             $query_params = array_merge(
1179 1179
                 $query_params,
1180 1180
                 $this->_get_orderby_for_registrations_query(),
@@ -1195,7 +1195,7 @@  discard block
 block discarded – undo
1195 1195
     protected function _add_event_id_to_where_conditions(array $request)
1196 1196
     {
1197 1197
         $where = array();
1198
-        if (! empty($request['event_id'])) {
1198
+        if ( ! empty($request['event_id'])) {
1199 1199
             $where['EVT_ID'] = absint($request['event_id']);
1200 1200
         }
1201 1201
         return $where;
@@ -1211,7 +1211,7 @@  discard block
 block discarded – undo
1211 1211
     protected function _add_category_id_to_where_conditions(array $request)
1212 1212
     {
1213 1213
         $where = array();
1214
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1214
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1215 1215
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1216 1216
         }
1217 1217
         return $where;
@@ -1227,10 +1227,10 @@  discard block
 block discarded – undo
1227 1227
     protected function _add_datetime_id_to_where_conditions(array $request)
1228 1228
     {
1229 1229
         $where = array();
1230
-        if (! empty($request['datetime_id'])) {
1230
+        if ( ! empty($request['datetime_id'])) {
1231 1231
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1232 1232
         }
1233
-        if (! empty($request['DTT_ID'])) {
1233
+        if ( ! empty($request['DTT_ID'])) {
1234 1234
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1235 1235
         }
1236 1236
         return $where;
@@ -1256,7 +1256,7 @@  discard block
 block discarded – undo
1256 1256
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1257 1257
          * UNLESS viewing trashed registrations.
1258 1258
          */
1259
-        if (! empty($registration_status)) {
1259
+        if ( ! empty($registration_status)) {
1260 1260
             $where['STS_ID'] = $registration_status;
1261 1261
         } else {
1262 1262
             //make sure we exclude incomplete registrations, but only if not trashed.
@@ -1299,12 +1299,12 @@  discard block
 block discarded – undo
1299 1299
                 array(
1300 1300
                     EEM_Registration::instance()->convert_datetime_for_query(
1301 1301
                         'REG_date',
1302
-                        $now . ' 00:00:00',
1302
+                        $now.' 00:00:00',
1303 1303
                         'Y-m-d H:i:s'
1304 1304
                     ),
1305 1305
                     EEM_Registration::instance()->convert_datetime_for_query(
1306 1306
                         'REG_date',
1307
-                        $now . ' 23:59:59',
1307
+                        $now.' 23:59:59',
1308 1308
                         'Y-m-d H:i:s'
1309 1309
                     ),
1310 1310
                 ),
@@ -1317,12 +1317,12 @@  discard block
 block discarded – undo
1317 1317
                 array(
1318 1318
                     EEM_Registration::instance()->convert_datetime_for_query(
1319 1319
                         'REG_date',
1320
-                        $current_year_and_month . '-01 00:00:00',
1320
+                        $current_year_and_month.'-01 00:00:00',
1321 1321
                         'Y-m-d H:i:s'
1322 1322
                     ),
1323 1323
                     EEM_Registration::instance()->convert_datetime_for_query(
1324 1324
                         'REG_date',
1325
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1325
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1326 1326
                         'Y-m-d H:i:s'
1327 1327
                     ),
1328 1328
                 ),
@@ -1337,18 +1337,18 @@  discard block
 block discarded – undo
1337 1337
                 : '';
1338 1338
             //if there is not a month or year then we can't go further
1339 1339
             if ($month_requested && $year_requested) {
1340
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1340
+                $days_in_month     = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1341 1341
                 $where['REG_date'] = array(
1342 1342
                     'BETWEEN',
1343 1343
                     array(
1344 1344
                         EEM_Registration::instance()->convert_datetime_for_query(
1345 1345
                             'REG_date',
1346
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1346
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1347 1347
                             'Y-m-d H:i:s'
1348 1348
                         ),
1349 1349
                         EEM_Registration::instance()->convert_datetime_for_query(
1350 1350
                             'REG_date',
1351
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1351
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1352 1352
                             'Y-m-d H:i:s'
1353 1353
                         ),
1354 1354
                     ),
@@ -1368,8 +1368,8 @@  discard block
 block discarded – undo
1368 1368
     protected function _add_search_to_where_conditions(array $request)
1369 1369
     {
1370 1370
         $where = array();
1371
-        if (! empty($request['s'])) {
1372
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1371
+        if ( ! empty($request['s'])) {
1372
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1373 1373
             $where['OR*search_conditions'] = array(
1374 1374
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1375 1375
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1487,7 +1487,7 @@  discard block
 block discarded – undo
1487 1487
             : $per_page;
1488 1488
 
1489 1489
         //-1 means return all results so get out if that's set.
1490
-        if ((int)$per_page === -1) {
1490
+        if ((int) $per_page === -1) {
1491 1491
             return array();
1492 1492
         }
1493 1493
         $per_page = absint($per_page);
@@ -1543,7 +1543,7 @@  discard block
 block discarded – undo
1543 1543
                 ),
1544 1544
                 REG_ADMIN_URL
1545 1545
             );
1546
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1546
+            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1547 1547
                 array(
1548 1548
                     'action' => 'default',
1549 1549
                     'EVT_ID' => $event_id,
@@ -1551,7 +1551,7 @@  discard block
 block discarded – undo
1551 1551
                 ),
1552 1552
                 admin_url('admin.php')
1553 1553
             );
1554
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1554
+            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1555 1555
                 array(
1556 1556
                     'page'   => 'espresso_events',
1557 1557
                     'action' => 'edit',
@@ -1560,12 +1560,12 @@  discard block
 block discarded – undo
1560 1560
                 admin_url('admin.php')
1561 1561
             );
1562 1562
             //next and previous links
1563
-            $next_reg                                      = $this->_registration->next(
1563
+            $next_reg = $this->_registration->next(
1564 1564
                 null,
1565 1565
                 array(),
1566 1566
                 'REG_ID'
1567 1567
             );
1568
-            $this->_template_args['next_registration']     = $next_reg
1568
+            $this->_template_args['next_registration'] = $next_reg
1569 1569
                 ? $this->_next_link(
1570 1570
                     EE_Admin_Page::add_query_args_and_nonce(
1571 1571
                         array(
@@ -1577,7 +1577,7 @@  discard block
 block discarded – undo
1577 1577
                     'dashicons dashicons-arrow-right ee-icon-size-22'
1578 1578
                 )
1579 1579
                 : '';
1580
-            $previous_reg                                  = $this->_registration->previous(
1580
+            $previous_reg = $this->_registration->previous(
1581 1581
                 null,
1582 1582
                 array(),
1583 1583
                 'REG_ID'
@@ -1595,7 +1595,7 @@  discard block
 block discarded – undo
1595 1595
                 )
1596 1596
                 : '';
1597 1597
             // grab header
1598
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1598
+            $template_path                             = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1599 1599
             $this->_template_args['REG_ID']            = $this->_registration->ID();
1600 1600
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1601 1601
                 $template_path,
@@ -1715,7 +1715,7 @@  discard block
 block discarded – undo
1715 1715
                             EEH_HTML::strong(
1716 1716
                                 $this->_registration->pretty_status(),
1717 1717
                                 '',
1718
-                                'status-' . $this->_registration->status_ID(),
1718
+                                'status-'.$this->_registration->status_ID(),
1719 1719
                                 'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1720 1720
                             )
1721 1721
                         )
@@ -1795,11 +1795,11 @@  discard block
 block discarded – undo
1795 1795
     {
1796 1796
         if (isset($this->_req_data['reg_status_change_form'])) {
1797 1797
             $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1798
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID']
1798
+                ? (array) $this->_req_data['reg_status_change_form']['REG_ID']
1799 1799
                 : array();
1800 1800
         } else {
1801 1801
             $REG_IDs = isset($this->_req_data['_REG_ID'])
1802
-                ? (array)$this->_req_data['_REG_ID']
1802
+                ? (array) $this->_req_data['_REG_ID']
1803 1803
                 : array();
1804 1804
         }
1805 1805
         // sanitize $REG_IDs
@@ -1862,7 +1862,7 @@  discard block
 block discarded – undo
1862 1862
     {
1863 1863
         $success = false;
1864 1864
         // typecast $REG_IDs
1865
-        $REG_IDs = (array)$REG_IDs;
1865
+        $REG_IDs = (array) $REG_IDs;
1866 1866
         if ( ! empty($REG_IDs)) {
1867 1867
             $success = true;
1868 1868
             // set default status if none is passed
@@ -2012,7 +2012,7 @@  discard block
 block discarded – undo
2012 2012
             $action,
2013 2013
             $notify
2014 2014
         );
2015
-        $method = $action . '_registration';
2015
+        $method = $action.'_registration';
2016 2016
         if (method_exists($this, $method)) {
2017 2017
             $this->$method($notify);
2018 2018
         }
@@ -2130,7 +2130,7 @@  discard block
 block discarded – undo
2130 2130
             $filtered_line_item_tree,
2131 2131
             array('EE_Registration' => $this->_registration)
2132 2132
         );
2133
-        $attendee                                = $this->_registration->attendee();
2133
+        $attendee = $this->_registration->attendee();
2134 2134
         if (EE_Registry::instance()->CAP->current_user_can(
2135 2135
             'ee_read_transaction',
2136 2136
             'espresso_transactions_view_transaction'
@@ -2209,7 +2209,7 @@  discard block
 block discarded – undo
2209 2209
                 'Payment method response',
2210 2210
                 'event_espresso'
2211 2211
             );
2212
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2212
+            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2213 2213
         }
2214 2214
         $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2215 2215
         $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
@@ -2237,7 +2237,7 @@  discard block
 block discarded – undo
2237 2237
         $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2238 2238
         $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2239 2239
         $template_path                                                        =
2240
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2240
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2241 2241
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2242 2242
     }
2243 2243
 
@@ -2266,7 +2266,7 @@  discard block
 block discarded – undo
2266 2266
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2267 2267
             $this->_template_args['REG_ID']                    = $this->_registration->ID();
2268 2268
             $template_path                                     =
2269
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2269
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2270 2270
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2271 2271
         }
2272 2272
     }
@@ -2283,7 +2283,7 @@  discard block
 block discarded – undo
2283 2283
     public function form_before_question_group($output)
2284 2284
     {
2285 2285
         EE_Error::doing_it_wrong(
2286
-            __CLASS__ . '::' . __FUNCTION__,
2286
+            __CLASS__.'::'.__FUNCTION__,
2287 2287
             esc_html__(
2288 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 2289
                 'event_espresso'
@@ -2308,7 +2308,7 @@  discard block
 block discarded – undo
2308 2308
     public function form_after_question_group($output)
2309 2309
     {
2310 2310
         EE_Error::doing_it_wrong(
2311
-            __CLASS__ . '::' . __FUNCTION__,
2311
+            __CLASS__.'::'.__FUNCTION__,
2312 2312
             esc_html__(
2313 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 2314
                 'event_espresso'
@@ -2346,7 +2346,7 @@  discard block
 block discarded – undo
2346 2346
     public function form_form_field_label_wrap($label)
2347 2347
     {
2348 2348
         EE_Error::doing_it_wrong(
2349
-            __CLASS__ . '::' . __FUNCTION__,
2349
+            __CLASS__.'::'.__FUNCTION__,
2350 2350
             esc_html__(
2351 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 2352
                 'event_espresso'
@@ -2356,7 +2356,7 @@  discard block
 block discarded – undo
2356 2356
         return '
2357 2357
 			<tr>
2358 2358
 				<th>
2359
-					' . $label . '
2359
+					' . $label.'
2360 2360
 				</th>';
2361 2361
     }
2362 2362
 
@@ -2372,7 +2372,7 @@  discard block
 block discarded – undo
2372 2372
     public function form_form_field_input__wrap($input)
2373 2373
     {
2374 2374
         EE_Error::doing_it_wrong(
2375
-            __CLASS__ . '::' . __FUNCTION__,
2375
+            __CLASS__.'::'.__FUNCTION__,
2376 2376
             esc_html__(
2377 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 2378
                 'event_espresso'
@@ -2381,7 +2381,7 @@  discard block
 block discarded – undo
2381 2381
         );
2382 2382
         return '
2383 2383
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2384
-					' . $input . '
2384
+					' . $input.'
2385 2385
 				</td>
2386 2386
 			</tr>';
2387 2387
     }
@@ -2426,7 +2426,7 @@  discard block
 block discarded – undo
2426 2426
     protected function _get_reg_custom_questions_form($REG_ID)
2427 2427
     {
2428 2428
         if ( ! $this->_reg_custom_questions_form) {
2429
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2429
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
2430 2430
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2431 2431
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
2432 2432
             );
@@ -2462,7 +2462,7 @@  discard block
 block discarded – undo
2462 2462
         if ($form->is_valid()) {
2463 2463
             foreach ($form->subforms() as $question_group_id => $question_group_form) {
2464 2464
                 foreach ($question_group_form->inputs() as $question_id => $input) {
2465
-                    $where_conditions    = array(
2465
+                    $where_conditions = array(
2466 2466
                         'QST_ID' => $question_id,
2467 2467
                         'REG_ID' => $REG_ID,
2468 2468
                     );
@@ -2503,7 +2503,7 @@  discard block
 block discarded – undo
2503 2503
         $REG = EEM_Registration::instance();
2504 2504
         //get all other registrations on this transaction, and cache
2505 2505
         //the attendees for them so we don't have to run another query using force_join
2506
-        $registrations                           = $REG->get_all(array(
2506
+        $registrations = $REG->get_all(array(
2507 2507
             array(
2508 2508
                 'TXN_ID' => $this->_registration->transaction_ID(),
2509 2509
                 'REG_ID' => array('!=', $this->_registration->ID()),
@@ -2527,7 +2527,7 @@  discard block
 block discarded – undo
2527 2527
             $att_nmbr = 1;
2528 2528
             foreach ($registrations as $registration) {
2529 2529
                 /* @var $registration EE_Registration */
2530
-                $attendee                                                    = $registration->attendee()
2530
+                $attendee = $registration->attendee()
2531 2531
                     ? $registration->attendee()
2532 2532
                     : EEM_Attendee::instance()
2533 2533
                                   ->create_default_object();
@@ -2540,19 +2540,19 @@  discard block
 block discarded – undo
2540 2540
                     ', ',
2541 2541
                     $attendee->full_address_as_array()
2542 2542
                 );
2543
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2543
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2544 2544
                     array(
2545 2545
                         'action' => 'edit_attendee',
2546 2546
                         'post'   => $attendee->ID(),
2547 2547
                     ),
2548 2548
                     REG_ADMIN_URL
2549 2549
                 );
2550
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2550
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj()->name();
2551 2551
                 $att_nmbr++;
2552 2552
             }
2553 2553
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2554 2554
         }
2555
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2555
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2556 2556
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2557 2557
     }
2558 2558
 
@@ -2595,20 +2595,20 @@  discard block
 block discarded – undo
2595 2595
         $this->_template_args['phone']             = $attendee->phone();
2596 2596
         $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2597 2597
         //edit link
2598
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2598
+        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
2599 2599
             'action' => 'edit_attendee',
2600 2600
             'post'   => $attendee->ID(),
2601 2601
         ), REG_ADMIN_URL);
2602 2602
         $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2603 2603
         //create link
2604
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2604
+        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2605 2605
             ? EE_Admin_Page::add_query_args_and_nonce(array(
2606 2606
                 'action'  => 'duplicate_attendee',
2607 2607
                 '_REG_ID' => $this->_registration->ID(),
2608 2608
             ), REG_ADMIN_URL) : '';
2609 2609
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2610 2610
         $this->_template_args['att_check']    = $att_check;
2611
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2611
+        $template_path                        = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2612 2612
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2613 2613
     }
2614 2614
 
@@ -2653,7 +2653,7 @@  discard block
 block discarded – undo
2653 2653
             /** @var EE_Registration $REG */
2654 2654
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2655 2655
             $payments = $REG->registration_payments();
2656
-            if (! empty($payments)) {
2656
+            if ( ! empty($payments)) {
2657 2657
                 $name = $REG->attendee() instanceof EE_Attendee
2658 2658
                     ? $REG->attendee()->full_name()
2659 2659
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2849,7 +2849,7 @@  discard block
 block discarded – undo
2849 2849
                 'action' => 'edit',
2850 2850
                 'post'   => $this->_reg_event->ID(),
2851 2851
             ), EVENTS_ADMIN_URL);
2852
-            $edit_event_lnk                     = '<a href="'
2852
+            $edit_event_lnk = '<a href="'
2853 2853
                                                   . $edit_event_url
2854 2854
                                                   . '" title="'
2855 2855
                                                   . esc_attr__('Edit ', 'event_espresso')
@@ -2867,7 +2867,7 @@  discard block
 block discarded – undo
2867 2867
         }
2868 2868
         // grab header
2869 2869
         $template_path                              =
2870
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2870
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2871 2871
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2872 2872
             $this->_template_args, true);
2873 2873
         //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
@@ -2905,7 +2905,7 @@  discard block
 block discarded – undo
2905 2905
                 '</b>'
2906 2906
             );
2907 2907
             return '
2908
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2908
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2909 2909
 	<script >
2910 2910
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2911 2911
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2973,7 +2973,7 @@  discard block
 block discarded – undo
2973 2973
         //we come back to the process_registration_step route.
2974 2974
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2975 2975
         return EEH_Template::display_template(
2976
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2976
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2977 2977
             $template_args,
2978 2978
             true
2979 2979
         );
@@ -2995,7 +2995,7 @@  discard block
 block discarded – undo
2995 2995
         if (is_object($this->_reg_event)) {
2996 2996
             return true;
2997 2997
         }
2998
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2998
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2999 2999
         if ( ! $EVT_ID) {
3000 3000
             return false;
3001 3001
         }
@@ -3065,7 +3065,7 @@  discard block
 block discarded – undo
3065 3065
                 }
3066 3066
                 break;
3067 3067
             case 'questions' :
3068
-                if (! isset(
3068
+                if ( ! isset(
3069 3069
                     $this->_req_data['txn_reg_status_change'],
3070 3070
                     $this->_req_data['txn_reg_status_change']['send_notifications'])
3071 3071
                 ) {
@@ -3185,7 +3185,7 @@  discard block
 block discarded – undo
3185 3185
     public function get_attendees($per_page, $count = false, $trash = false)
3186 3186
     {
3187 3187
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3188
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3188
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
3189 3189
         $ATT_MDL                    = EEM_Attendee::instance();
3190 3190
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3191 3191
         switch ($this->_req_data['orderby']) {
@@ -3222,7 +3222,7 @@  discard block
 block discarded – undo
3222 3222
             : $per_page;
3223 3223
         $_where       = array();
3224 3224
         if ( ! empty($this->_req_data['s'])) {
3225
-            $sstr         = '%' . $this->_req_data['s'] . '%';
3225
+            $sstr         = '%'.$this->_req_data['s'].'%';
3226 3226
             $_where['OR'] = array(
3227 3227
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3228 3228
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3298,9 +3298,9 @@  discard block
 block discarded – undo
3298 3298
      *                                                     the query parameters from the request
3299 3299
      * @return void ends the request with a redirect or download
3300 3300
      */
3301
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3301
+    public function _registrations_report_base($method_name_for_getting_query_params)
3302 3302
     {
3303
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3303
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3304 3304
             wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3305 3305
                 array(
3306 3306
                     'page'        => 'espresso_batch',
@@ -3309,7 +3309,7 @@  discard block
 block discarded – undo
3309 3309
                     'filters'     => urlencode(
3310 3310
                         serialize(
3311 3311
                             call_user_func(
3312
-                                array( $this, $method_name_for_getting_query_params ),
3312
+                                array($this, $method_name_for_getting_query_params),
3313 3313
                                 EEH_Array::is_set(
3314 3314
                                     $this->_req_data,
3315 3315
                                     'filters',
@@ -3329,8 +3329,8 @@  discard block
 block discarded – undo
3329 3329
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3330 3330
             );
3331 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');
3332
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3333
+                require_once(EE_CLASSES.'EE_Export.class.php');
3334 3334
                 $EE_Export = EE_Export::instance($this->_req_data);
3335 3335
                 $EE_Export->export();
3336 3336
             }
@@ -3351,8 +3351,8 @@  discard block
 block discarded – undo
3351 3351
 
3352 3352
     public function _contact_list_export()
3353 3353
     {
3354
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3355
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3354
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3355
+            require_once(EE_CLASSES.'EE_Export.class.php');
3356 3356
             $EE_Export = EE_Export::instance($this->_req_data);
3357 3357
             $EE_Export->export_attendees();
3358 3358
         }
@@ -3369,8 +3369,8 @@  discard block
 block discarded – undo
3369 3369
                 'return_url'  => urlencode($this->_req_data['return_url']),
3370 3370
             )));
3371 3371
         } else {
3372
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3373
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3372
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3373
+                require_once(EE_CLASSES.'EE_Export.class.php');
3374 3374
                 $EE_Export = EE_Export::instance($this->_req_data);
3375 3375
                 $EE_Export->report_attendees();
3376 3376
             }
@@ -3452,7 +3452,7 @@  discard block
 block discarded – undo
3452 3452
             $updated_fields = array(
3453 3453
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3454 3454
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3455
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3455
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3456 3456
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3457 3457
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3458 3458
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3670,8 +3670,8 @@  discard block
 block discarded – undo
3670 3670
                 )
3671 3671
             )
3672 3672
         );
3673
-        $template                             =
3674
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3673
+        $template =
3674
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3675 3675
         EEH_Template::display_template($template, $this->_template_args);
3676 3676
     }
3677 3677
 
@@ -3690,7 +3690,7 @@  discard block
 block discarded – undo
3690 3690
         $this->_template_args['attendee']      = $this->_cpt_model_obj;
3691 3691
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3692 3692
         $template                              =
3693
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3693
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3694 3694
         EEH_Template::display_template($template, $this->_template_args);
3695 3695
     }
3696 3696
 
@@ -3705,7 +3705,7 @@  discard block
 block discarded – undo
3705 3705
     public function after_title_form_fields($post)
3706 3706
     {
3707 3707
         if ($post->post_type == 'espresso_attendees') {
3708
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3708
+            $template                  = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3709 3709
             $template_args['attendee'] = $this->_cpt_model_obj;
3710 3710
             EEH_Template::display_template($template, $template_args);
3711 3711
         }
Please login to merge, or discard this patch.
core/db_models/EEM_CPT_Base.model.php 2 patches
Indentation   +514 added lines, -514 removed lines patch added patch discarded remove patch
@@ -18,519 +18,519 @@
 block discarded – undo
18 18
 abstract class EEM_CPT_Base extends EEM_Soft_Delete_Base
19 19
 {
20 20
 
21
-    /**
22
-     * @var string post_status_publish - the wp post status for published cpts
23
-     */
24
-    const post_status_publish = 'publish';
25
-
26
-    /**
27
-     * @var string post_status_future - the wp post status for scheduled cpts
28
-     */
29
-    const post_status_future = 'future';
30
-
31
-    /**
32
-     * @var string post_status_draft - the wp post status for draft cpts
33
-     */
34
-    const post_status_draft = 'draft';
35
-
36
-    /**
37
-     * @var string post_status_pending - the wp post status for pending cpts
38
-     */
39
-    const post_status_pending = 'pending';
40
-
41
-    /**
42
-     * @var string post_status_private - the wp post status for private cpts
43
-     */
44
-    const post_status_private = 'private';
45
-
46
-    /**
47
-     * @var string post_status_trashed - the wp post status for trashed cpts
48
-     */
49
-    const post_status_trashed = 'trash';
50
-
51
-    /**
52
-     * This is an array of custom statuses for the given CPT model (modified by children)
53
-     * format:
54
-     * array(
55
-     *        'status_name' => array(
56
-     *            'label' => __('Status Name', 'event_espresso'),
57
-     *            'public' => TRUE //whether a public status or not.
58
-     *        )
59
-     * )
60
-     *
61
-     * @var array
62
-     */
63
-    protected $_custom_stati = array();
64
-
65
-
66
-
67
-    /**
68
-     * Adds a relationship to Term_Taxonomy for each CPT_Base
69
-     *
70
-     * @param string $timezone
71
-     * @throws \EE_Error
72
-     */
73
-    protected function __construct($timezone = null)
74
-    {
75
-        //adds a relationship to Term_Taxonomy for all these models. For this to work
76
-        //Term_Relationship must have a relation to each model subclassing EE_CPT_Base explicitly
77
-        //eg, in EEM_Term_Relationship, inside the _model_relations array, there must be an entry
78
-        //with key equalling the subclassing model's model name (eg 'Event' or 'Venue'), and the value
79
-        //must also be new EE_HABTM_Relation('Term_Relationship');
80
-        $this->_model_relations['Term_Taxonomy'] = new EE_HABTM_Relation('Term_Relationship');
81
-        $primary_table_name = null;
82
-        //add  the common _status field to all CPT primary tables.
83
-        foreach ($this->_tables as $alias => $table_obj) {
84
-            if ($table_obj instanceof EE_Primary_Table) {
85
-                $primary_table_name = $alias;
86
-            }
87
-        }
88
-        //set default wp post statuses if child has not already set.
89
-        if ( ! isset($this->_fields[$primary_table_name]['status'])) {
90
-            $this->_fields[$primary_table_name]['status'] = new EE_WP_Post_Status_Field('post_status',
91
-                __("Event Status", "event_espresso"), false, 'draft');
92
-        }
93
-        if ( ! isset($this->_fields[$primary_table_name]['to_ping'])) {
94
-            $this->_fields[$primary_table_name]['to_ping'] = new EE_DB_Only_Text_Field('to_ping',
95
-                __('To Ping', 'event_espresso'), false, '');
96
-        }
97
-        if ( ! isset($this->_fields[$primary_table_name]['pinged'])) {
98
-            $this->_fields[$primary_table_name]['pinged'] = new EE_DB_Only_Text_Field('pinged',
99
-                __('Pinged', 'event_espresso'), false, '');
100
-        }
101
-        if ( ! isset($this->_fields[$primary_table_name]['comment_status'])) {
102
-            $this->_fields[$primary_table_name]['comment_status'] = new EE_Plain_Text_Field('comment_status',
103
-                __('Comment Status', 'event_espresso'), false, 'open');
104
-        }
105
-        if ( ! isset($this->_fields[$primary_table_name]['ping_status'])) {
106
-            $this->_fields[$primary_table_name]['ping_status'] = new EE_Plain_Text_Field('ping_status',
107
-                __('Ping Status', 'event_espresso'), false, 'open');
108
-        }
109
-        if ( ! isset($this->_fields[$primary_table_name]['post_content_filtered'])) {
110
-            $this->_fields[$primary_table_name]['post_content_filtered'] = new EE_DB_Only_Text_Field('post_content_filtered',
111
-                __('Post Content Filtered', 'event_espresso'), false, '');
112
-        }
113
-        if ( ! isset($this->_model_relations['Post_Meta'])) {
114
-            //don't block deletes though because we want to maintain the current behaviour
115
-            $this->_model_relations['Post_Meta'] = new EE_Has_Many_Relation(false);
116
-        }
117
-        if ( ! $this->_minimum_where_conditions_strategy instanceof EE_Default_Where_Conditions) {
118
-            //nothing was set during child constructor, so set default
119
-            $this->_minimum_where_conditions_strategy = new EE_CPT_Minimum_Where_Conditions($this->post_type());
120
-        }
121
-        if ( ! $this->_default_where_conditions_strategy instanceof EE_Default_Where_Conditions) {
122
-            //nothing was set during child constructor, so set default
123
-            //it's ok for child classes to specify this, but generally this is more DRY
124
-            $this->_default_where_conditions_strategy = new EE_CPT_Where_Conditions($this->post_type());
125
-        }
126
-        parent::__construct($timezone);
127
-    }
128
-
129
-
130
-
131
-    /**
132
-     * @return array
133
-     */
134
-    public function public_event_stati()
135
-    {
136
-        // @see wp-includes/post.php
137
-        return get_post_stati(array('public' => true));
138
-    }
139
-
140
-
141
-
142
-    /**
143
-     * Searches for field on this model of type 'deleted_flag'. if it is found,
144
-     * returns it's name. BUT That doesn't apply to CPTs. We should instead use post_status_field_name
145
-     *
146
-     * @return string
147
-     * @throws EE_Error
148
-     */
149
-    public function deleted_field_name()
150
-    {
151
-        throw new EE_Error(sprintf(__("EEM_CPT_Base should nto call deleted_field_name! It should instead use post_status_field_name",
152
-            "event_espresso")));
153
-    }
154
-
155
-
156
-
157
-    /**
158
-     * Gets the field's name that sets the post status
159
-     *
160
-     * @return string
161
-     * @throws EE_Error
162
-     */
163
-    public function post_status_field_name()
164
-    {
165
-        $field = $this->get_a_field_of_type('EE_WP_Post_Status_Field');
166
-        if ($field) {
167
-            return $field->get_name();
168
-        } else {
169
-            throw new EE_Error(sprintf(__('We are trying to find the post status flag field on %s, but none was found. Are you sure there is a field of type EE_Trashed_Flag_Field in %s constructor?',
170
-                'event_espresso'), get_class($this), get_class($this)));
171
-        }
172
-    }
173
-
174
-
175
-
176
-    /**
177
-     * Alters the query params so that only trashed/soft-deleted items are considered
178
-     *
179
-     * @param array $query_params like EEM_Base::get_all's $query_params
180
-     * @return array like EEM_Base::get_all's $query_params
181
-     */
182
-    protected function _alter_query_params_so_only_trashed_items_included($query_params)
183
-    {
184
-        $post_status_field_name = $this->post_status_field_name();
185
-        $query_params[0][$post_status_field_name] = self::post_status_trashed;
186
-        return $query_params;
187
-    }
188
-
189
-
190
-
191
-    /**
192
-     * Alters the query params so each item's deleted status is ignored.
193
-     *
194
-     * @param array $query_params
195
-     * @return array
196
-     */
197
-    protected function _alter_query_params_so_deleted_and_undeleted_items_included($query_params)
198
-    {
199
-        $query_params['default_where_conditions'] = 'minimum';
200
-        return $query_params;
201
-    }
202
-
203
-
204
-
205
-    /**
206
-     * Performs deletes or restores on items. Both soft-deleted and non-soft-deleted items considered.
207
-     *
208
-     * @param boolean $delete       true to indicate deletion, false to indicate restoration
209
-     * @param array   $query_params like EEM_Base::get_all
210
-     * @return boolean success
211
-     */
212
-    function delete_or_restore($delete = true, $query_params = array())
213
-    {
214
-        $post_status_field_name = $this->post_status_field_name();
215
-        $query_params = $this->_alter_query_params_so_deleted_and_undeleted_items_included($query_params);
216
-        $new_status = $delete ? self::post_status_trashed : 'draft';
217
-        if ($this->update(array($post_status_field_name => $new_status), $query_params)) {
218
-            return true;
219
-        } else {
220
-            return false;
221
-        }
222
-    }
223
-
224
-
225
-
226
-    /**
227
-     * meta_table
228
-     * returns first EE_Secondary_Table table name
229
-     *
230
-     * @access public
231
-     * @return string
232
-     */
233
-    public function meta_table()
234
-    {
235
-        $meta_table = $this->_get_other_tables();
236
-        $meta_table = reset($meta_table);
237
-        return $meta_table instanceof EE_Secondary_Table ? $meta_table->get_table_name() : null;
238
-    }
239
-
240
-
241
-
242
-    /**
243
-     * This simply returns an array of the meta table fields (useful for when we just need to update those fields)
244
-     *
245
-     * @param  bool $all triggers whether we include DB_Only fields or JUST non DB_Only fields.  Defaults to false (no
246
-     *                   db only fields)
247
-     * @return array
248
-     */
249
-    public function get_meta_table_fields($all = false)
250
-    {
251
-        $all_fields = $fields_to_return = array();
252
-        foreach ($this->_tables as $alias => $table_obj) {
253
-            if ($table_obj instanceof EE_Secondary_Table) {
254
-                $all_fields = array_merge($this->_get_fields_for_table($alias), $all_fields);
255
-            }
256
-        }
257
-        if ( ! $all) {
258
-            foreach ($all_fields as $name => $obj) {
259
-                if ($obj instanceof EE_DB_Only_Field_Base) {
260
-                    continue;
261
-                }
262
-                $fields_to_return[] = $name;
263
-            }
264
-        } else {
265
-            $fields_to_return = array_keys($all_fields);
266
-        }
267
-        return $fields_to_return;
268
-    }
269
-
270
-
271
-
272
-    /**
273
-     * Adds an event category with the specified name and description to the specified
274
-     * $cpt_model_object. Intelligently adds a term if necessary, and adds a term_taxonomy if necessary,
275
-     * and adds an entry in the term_relationship if necessary.
276
-     *
277
-     * @param EE_CPT_Base $cpt_model_object
278
-     * @param string      $category_name (used to derive the term slug too)
279
-     * @param string      $category_description
280
-     * @param int         $parent_term_taxonomy_id
281
-     * @return EE_Term_Taxonomy
282
-     */
283
-    function add_event_category(
284
-        EE_CPT_Base $cpt_model_object,
285
-        $category_name,
286
-        $category_description = '',
287
-        $parent_term_taxonomy_id = null
288
-    ) {
289
-        //create term
290
-        require_once(EE_MODELS . 'EEM_Term.model.php');
291
-        //first, check for a term by the same name or slug
292
-        $category_slug = sanitize_title($category_name);
293
-        $term = EEM_Term::instance()->get_one(array(
294
-            array(
295
-                'OR' => array(
296
-                    'name' => $category_name,
297
-                    'slug' => $category_slug,
298
-                ),
299
-            ),
300
-        ));
301
-        if ( ! $term) {
302
-            $term = EE_Term::new_instance(array(
303
-                'name' => $category_name,
304
-                'slug' => $category_slug,
305
-            ));
306
-            $term->save();
307
-        }
308
-        //make sure there's a term-taxonomy entry too
309
-        require_once(EE_MODELS . 'EEM_Term_Taxonomy.model.php');
310
-        $term_taxonomy = EEM_Term_Taxonomy::instance()->get_one(array(
311
-            array(
312
-                'term_id'  => $term->ID(),
313
-                'taxonomy' => EE_Event_Category_Taxonomy,
314
-            ),
315
-        ));
316
-        /** @var $term_taxonomy EE_Term_Taxonomy */
317
-        if ( ! $term_taxonomy) {
318
-            $term_taxonomy = EE_Term_Taxonomy::new_instance(array(
319
-                'term_id'     => $term->ID(),
320
-                'taxonomy'    => EE_Event_Category_Taxonomy,
321
-                'description' => $category_description,
322
-                'count'       => 1,
323
-                'parent'      => $parent_term_taxonomy_id,
324
-            ));
325
-            $term_taxonomy->save();
326
-        } else {
327
-            $term_taxonomy->set_count($term_taxonomy->count() + 1);
328
-            $term_taxonomy->save();
329
-        }
330
-        return $this->add_relationship_to($cpt_model_object, $term_taxonomy, 'Term_Taxonomy');
331
-    }
332
-
333
-
334
-
335
-    /**
336
-     * Removed the category specified by name as having a relation to this event.
337
-     * Does not remove the term or term_taxonomy.
338
-     *
339
-     * @param EE_CPT_Base $cpt_model_object_event
340
-     * @param string      $category_name name of the event category (term)
341
-     * @return bool
342
-     */
343
-    function remove_event_category(EE_CPT_Base $cpt_model_object_event, $category_name)
344
-    {
345
-        //find the term_taxonomy by that name
346
-        $term_taxonomy = $this->get_first_related($cpt_model_object_event, 'Term_Taxonomy',
347
-            array(array('Term.name' => $category_name, 'taxonomy' => EE_Event_Category_Taxonomy)));
348
-        /** @var $term_taxonomy EE_Term_Taxonomy */
349
-        if ($term_taxonomy) {
350
-            $term_taxonomy->set_count($term_taxonomy->count() - 1);
351
-            $term_taxonomy->save();
352
-        }
353
-        return $this->remove_relationship_to($cpt_model_object_event, $term_taxonomy, 'Term_Taxonomy');
354
-    }
355
-
356
-
357
-
358
-    /**
359
-     * This is a wrapper for the WordPress get_the_post_thumbnail() function that returns the feature image for the
360
-     * given CPT ID.  It accepts the same params as what get_the_post_thumbnail() accepts.
361
-     *
362
-     * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
363
-     * @access public
364
-     * @param int          $id   the ID for the cpt we want the feature image for
365
-     * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
366
-     *                           representing width and height in pixels (i.e. array(32,32) ).
367
-     * @param string|array $attr Optional. Query string or array of attributes.
368
-     * @return string HTML image element
369
-     */
370
-    public function get_feature_image($id, $size = 'thumbnail', $attr = '')
371
-    {
372
-        return get_the_post_thumbnail($id, $size, $attr);
373
-    }
374
-
375
-
376
-
377
-    /**
378
-     * Just a handy way to get the list of post statuses currently registered with WP.
379
-     *
380
-     * @global array $wp_post_statuses set in wp core for storing all the post stati
381
-     * @return array
382
-     */
383
-    public function get_post_statuses()
384
-    {
385
-        global $wp_post_statuses;
386
-        $statuses = array();
387
-        foreach ($wp_post_statuses as $post_status => $args_object) {
388
-            $statuses[$post_status] = $args_object->label;
389
-        }
390
-        return $statuses;
391
-    }
392
-
393
-
394
-
395
-    /**
396
-     * public method that can be used to retrieve the protected status array on the instantiated cpt model
397
-     *
398
-     * @return array array of statuses.
399
-     */
400
-    public function get_status_array()
401
-    {
402
-        $statuses = $this->get_post_statuses();
403
-        //first the global filter
404
-        $statuses = apply_filters('FHEE_EEM_CPT_Base__get_status_array', $statuses);
405
-        //now the class specific filter
406
-        $statuses = apply_filters('FHEE_EEM_' . get_class($this) . '__get_status_array', $statuses);
407
-        return $statuses;
408
-    }
409
-
410
-
411
-
412
-    /**
413
-     * this returns the post statuses that are NOT the default wordpress status
414
-     *
415
-     * @return array
416
-     */
417
-    public function get_custom_post_statuses()
418
-    {
419
-        $new_stati = array();
420
-        foreach ($this->_custom_stati as $status => $props) {
421
-            $new_stati[$status] = $props['label'];
422
-        }
423
-        return $new_stati;
424
-    }
425
-
426
-
427
-
428
-    /**
429
-     * Creates a child of EE_CPT_Base given a WP_Post or array of wpdb results which
430
-     * are a row from the posts table. If we're missing any fields required for the model,
431
-     * we just fetch the entire entry from the DB (ie, if you want to use this to save DB queries,
432
-     * make sure you are attaching all the model's fields onto the post)
433
-     *
434
-     * @param WP_Post|array $post
435
-     * @return EE_Base_Class|EE_Soft_Delete_Base_Class
436
-     */
437
-    public function instantiate_class_from_post_object_orig($post)
438
-    {
439
-        $post = (array)$post;
440
-        $has_all_necessary_fields_for_table = true;
441
-        //check if the post has fields on the meta table already
442
-        foreach ($this->_get_other_tables() as $table_obj) {
443
-            $fields_for_that_table = $this->_get_fields_for_table($table_obj->get_table_alias());
444
-            foreach ($fields_for_that_table as $field_obj) {
445
-                if ( ! isset($post[$field_obj->get_table_column()])
446
-                     && ! isset($post[$field_obj->get_qualified_column()])
447
-                ) {
448
-                    $has_all_necessary_fields_for_table = false;
449
-                }
450
-            }
451
-        }
452
-        //if we don't have all the fields we need, then just fetch the proper model from the DB
453
-        if ( ! $has_all_necessary_fields_for_table) {
454
-            return $this->get_one_by_ID($post['ID']);
455
-        } else {
456
-            return $this->instantiate_class_from_array_or_object($post);
457
-        }
458
-    }
459
-
460
-
461
-
462
-    /**
463
-     * @param null $post
464
-     * @return EE_Base_Class|EE_Soft_Delete_Base_Class
465
-     */
466
-    public function instantiate_class_from_post_object($post = null)
467
-    {
468
-        if (empty($post)) {
469
-            global $post;
470
-        }
471
-        $post = (array)$post;
472
-        $tables_needing_to_be_queried = array();
473
-        //check if the post has fields on the meta table already
474
-        foreach ($this->get_tables() as $table_obj) {
475
-            $fields_for_that_table = $this->_get_fields_for_table($table_obj->get_table_alias());
476
-            foreach ($fields_for_that_table as $field_obj) {
477
-                if ( ! isset($post[$field_obj->get_table_column()])
478
-                     && ! isset($post[$field_obj->get_qualified_column()])
479
-                ) {
480
-                    $tables_needing_to_be_queried[$table_obj->get_table_alias()] = $table_obj;
481
-                }
482
-            }
483
-        }
484
-        //if we don't have all the fields we need, then just fetch the proper model from the DB
485
-        if ($tables_needing_to_be_queried) {
486
-            if (count($tables_needing_to_be_queried) == 1
487
-                && reset($tables_needing_to_be_queried)
488
-                   instanceof
489
-                   EE_Secondary_Table
490
-            ) {
491
-                //so we're only missing data from a secondary table. Well that's not too hard to query for
492
-                $table_to_query = reset($tables_needing_to_be_queried);
493
-                $missing_data = $this->_do_wpdb_query('get_row', array(
494
-                    'SELECT * FROM '
495
-                    . $table_to_query->get_table_name()
496
-                    . ' WHERE '
497
-                    . $table_to_query->get_fk_on_table()
498
-                    . ' = '
499
-                    . $post['ID'],
500
-                    ARRAY_A,
501
-                ));
502
-                if ( ! empty($missing_data)) {
503
-                    $post = array_merge($post, $missing_data);
504
-                }
505
-            } else {
506
-                return $this->get_one_by_ID($post['ID']);
507
-            }
508
-        }
509
-        return $this->instantiate_class_from_array_or_object($post);
510
-    }
511
-
512
-
513
-
514
-    /**
515
-     * Gets the post type associated with this
516
-     *
517
-     * @throws EE_Error
518
-     * @return string
519
-     */
520
-    public function post_type()
521
-    {
522
-        $post_type_field = null;
523
-        foreach ($this->field_settings(true) as $field_obj) {
524
-            if ($field_obj instanceof EE_WP_Post_Type_Field) {
525
-                $post_type_field = $field_obj;
526
-                break;
527
-            }
528
-        }
529
-        if ($post_type_field == null) {
530
-            throw new EE_Error(sprintf(__("CPT Model %s should have a field of type EE_WP_Post_Type, but doesnt",
531
-                "event_espresso"), get_class($this)));
532
-        }
533
-        return $post_type_field->get_default_value();
534
-    }
21
+	/**
22
+	 * @var string post_status_publish - the wp post status for published cpts
23
+	 */
24
+	const post_status_publish = 'publish';
25
+
26
+	/**
27
+	 * @var string post_status_future - the wp post status for scheduled cpts
28
+	 */
29
+	const post_status_future = 'future';
30
+
31
+	/**
32
+	 * @var string post_status_draft - the wp post status for draft cpts
33
+	 */
34
+	const post_status_draft = 'draft';
35
+
36
+	/**
37
+	 * @var string post_status_pending - the wp post status for pending cpts
38
+	 */
39
+	const post_status_pending = 'pending';
40
+
41
+	/**
42
+	 * @var string post_status_private - the wp post status for private cpts
43
+	 */
44
+	const post_status_private = 'private';
45
+
46
+	/**
47
+	 * @var string post_status_trashed - the wp post status for trashed cpts
48
+	 */
49
+	const post_status_trashed = 'trash';
50
+
51
+	/**
52
+	 * This is an array of custom statuses for the given CPT model (modified by children)
53
+	 * format:
54
+	 * array(
55
+	 *        'status_name' => array(
56
+	 *            'label' => __('Status Name', 'event_espresso'),
57
+	 *            'public' => TRUE //whether a public status or not.
58
+	 *        )
59
+	 * )
60
+	 *
61
+	 * @var array
62
+	 */
63
+	protected $_custom_stati = array();
64
+
65
+
66
+
67
+	/**
68
+	 * Adds a relationship to Term_Taxonomy for each CPT_Base
69
+	 *
70
+	 * @param string $timezone
71
+	 * @throws \EE_Error
72
+	 */
73
+	protected function __construct($timezone = null)
74
+	{
75
+		//adds a relationship to Term_Taxonomy for all these models. For this to work
76
+		//Term_Relationship must have a relation to each model subclassing EE_CPT_Base explicitly
77
+		//eg, in EEM_Term_Relationship, inside the _model_relations array, there must be an entry
78
+		//with key equalling the subclassing model's model name (eg 'Event' or 'Venue'), and the value
79
+		//must also be new EE_HABTM_Relation('Term_Relationship');
80
+		$this->_model_relations['Term_Taxonomy'] = new EE_HABTM_Relation('Term_Relationship');
81
+		$primary_table_name = null;
82
+		//add  the common _status field to all CPT primary tables.
83
+		foreach ($this->_tables as $alias => $table_obj) {
84
+			if ($table_obj instanceof EE_Primary_Table) {
85
+				$primary_table_name = $alias;
86
+			}
87
+		}
88
+		//set default wp post statuses if child has not already set.
89
+		if ( ! isset($this->_fields[$primary_table_name]['status'])) {
90
+			$this->_fields[$primary_table_name]['status'] = new EE_WP_Post_Status_Field('post_status',
91
+				__("Event Status", "event_espresso"), false, 'draft');
92
+		}
93
+		if ( ! isset($this->_fields[$primary_table_name]['to_ping'])) {
94
+			$this->_fields[$primary_table_name]['to_ping'] = new EE_DB_Only_Text_Field('to_ping',
95
+				__('To Ping', 'event_espresso'), false, '');
96
+		}
97
+		if ( ! isset($this->_fields[$primary_table_name]['pinged'])) {
98
+			$this->_fields[$primary_table_name]['pinged'] = new EE_DB_Only_Text_Field('pinged',
99
+				__('Pinged', 'event_espresso'), false, '');
100
+		}
101
+		if ( ! isset($this->_fields[$primary_table_name]['comment_status'])) {
102
+			$this->_fields[$primary_table_name]['comment_status'] = new EE_Plain_Text_Field('comment_status',
103
+				__('Comment Status', 'event_espresso'), false, 'open');
104
+		}
105
+		if ( ! isset($this->_fields[$primary_table_name]['ping_status'])) {
106
+			$this->_fields[$primary_table_name]['ping_status'] = new EE_Plain_Text_Field('ping_status',
107
+				__('Ping Status', 'event_espresso'), false, 'open');
108
+		}
109
+		if ( ! isset($this->_fields[$primary_table_name]['post_content_filtered'])) {
110
+			$this->_fields[$primary_table_name]['post_content_filtered'] = new EE_DB_Only_Text_Field('post_content_filtered',
111
+				__('Post Content Filtered', 'event_espresso'), false, '');
112
+		}
113
+		if ( ! isset($this->_model_relations['Post_Meta'])) {
114
+			//don't block deletes though because we want to maintain the current behaviour
115
+			$this->_model_relations['Post_Meta'] = new EE_Has_Many_Relation(false);
116
+		}
117
+		if ( ! $this->_minimum_where_conditions_strategy instanceof EE_Default_Where_Conditions) {
118
+			//nothing was set during child constructor, so set default
119
+			$this->_minimum_where_conditions_strategy = new EE_CPT_Minimum_Where_Conditions($this->post_type());
120
+		}
121
+		if ( ! $this->_default_where_conditions_strategy instanceof EE_Default_Where_Conditions) {
122
+			//nothing was set during child constructor, so set default
123
+			//it's ok for child classes to specify this, but generally this is more DRY
124
+			$this->_default_where_conditions_strategy = new EE_CPT_Where_Conditions($this->post_type());
125
+		}
126
+		parent::__construct($timezone);
127
+	}
128
+
129
+
130
+
131
+	/**
132
+	 * @return array
133
+	 */
134
+	public function public_event_stati()
135
+	{
136
+		// @see wp-includes/post.php
137
+		return get_post_stati(array('public' => true));
138
+	}
139
+
140
+
141
+
142
+	/**
143
+	 * Searches for field on this model of type 'deleted_flag'. if it is found,
144
+	 * returns it's name. BUT That doesn't apply to CPTs. We should instead use post_status_field_name
145
+	 *
146
+	 * @return string
147
+	 * @throws EE_Error
148
+	 */
149
+	public function deleted_field_name()
150
+	{
151
+		throw new EE_Error(sprintf(__("EEM_CPT_Base should nto call deleted_field_name! It should instead use post_status_field_name",
152
+			"event_espresso")));
153
+	}
154
+
155
+
156
+
157
+	/**
158
+	 * Gets the field's name that sets the post status
159
+	 *
160
+	 * @return string
161
+	 * @throws EE_Error
162
+	 */
163
+	public function post_status_field_name()
164
+	{
165
+		$field = $this->get_a_field_of_type('EE_WP_Post_Status_Field');
166
+		if ($field) {
167
+			return $field->get_name();
168
+		} else {
169
+			throw new EE_Error(sprintf(__('We are trying to find the post status flag field on %s, but none was found. Are you sure there is a field of type EE_Trashed_Flag_Field in %s constructor?',
170
+				'event_espresso'), get_class($this), get_class($this)));
171
+		}
172
+	}
173
+
174
+
175
+
176
+	/**
177
+	 * Alters the query params so that only trashed/soft-deleted items are considered
178
+	 *
179
+	 * @param array $query_params like EEM_Base::get_all's $query_params
180
+	 * @return array like EEM_Base::get_all's $query_params
181
+	 */
182
+	protected function _alter_query_params_so_only_trashed_items_included($query_params)
183
+	{
184
+		$post_status_field_name = $this->post_status_field_name();
185
+		$query_params[0][$post_status_field_name] = self::post_status_trashed;
186
+		return $query_params;
187
+	}
188
+
189
+
190
+
191
+	/**
192
+	 * Alters the query params so each item's deleted status is ignored.
193
+	 *
194
+	 * @param array $query_params
195
+	 * @return array
196
+	 */
197
+	protected function _alter_query_params_so_deleted_and_undeleted_items_included($query_params)
198
+	{
199
+		$query_params['default_where_conditions'] = 'minimum';
200
+		return $query_params;
201
+	}
202
+
203
+
204
+
205
+	/**
206
+	 * Performs deletes or restores on items. Both soft-deleted and non-soft-deleted items considered.
207
+	 *
208
+	 * @param boolean $delete       true to indicate deletion, false to indicate restoration
209
+	 * @param array   $query_params like EEM_Base::get_all
210
+	 * @return boolean success
211
+	 */
212
+	function delete_or_restore($delete = true, $query_params = array())
213
+	{
214
+		$post_status_field_name = $this->post_status_field_name();
215
+		$query_params = $this->_alter_query_params_so_deleted_and_undeleted_items_included($query_params);
216
+		$new_status = $delete ? self::post_status_trashed : 'draft';
217
+		if ($this->update(array($post_status_field_name => $new_status), $query_params)) {
218
+			return true;
219
+		} else {
220
+			return false;
221
+		}
222
+	}
223
+
224
+
225
+
226
+	/**
227
+	 * meta_table
228
+	 * returns first EE_Secondary_Table table name
229
+	 *
230
+	 * @access public
231
+	 * @return string
232
+	 */
233
+	public function meta_table()
234
+	{
235
+		$meta_table = $this->_get_other_tables();
236
+		$meta_table = reset($meta_table);
237
+		return $meta_table instanceof EE_Secondary_Table ? $meta_table->get_table_name() : null;
238
+	}
239
+
240
+
241
+
242
+	/**
243
+	 * This simply returns an array of the meta table fields (useful for when we just need to update those fields)
244
+	 *
245
+	 * @param  bool $all triggers whether we include DB_Only fields or JUST non DB_Only fields.  Defaults to false (no
246
+	 *                   db only fields)
247
+	 * @return array
248
+	 */
249
+	public function get_meta_table_fields($all = false)
250
+	{
251
+		$all_fields = $fields_to_return = array();
252
+		foreach ($this->_tables as $alias => $table_obj) {
253
+			if ($table_obj instanceof EE_Secondary_Table) {
254
+				$all_fields = array_merge($this->_get_fields_for_table($alias), $all_fields);
255
+			}
256
+		}
257
+		if ( ! $all) {
258
+			foreach ($all_fields as $name => $obj) {
259
+				if ($obj instanceof EE_DB_Only_Field_Base) {
260
+					continue;
261
+				}
262
+				$fields_to_return[] = $name;
263
+			}
264
+		} else {
265
+			$fields_to_return = array_keys($all_fields);
266
+		}
267
+		return $fields_to_return;
268
+	}
269
+
270
+
271
+
272
+	/**
273
+	 * Adds an event category with the specified name and description to the specified
274
+	 * $cpt_model_object. Intelligently adds a term if necessary, and adds a term_taxonomy if necessary,
275
+	 * and adds an entry in the term_relationship if necessary.
276
+	 *
277
+	 * @param EE_CPT_Base $cpt_model_object
278
+	 * @param string      $category_name (used to derive the term slug too)
279
+	 * @param string      $category_description
280
+	 * @param int         $parent_term_taxonomy_id
281
+	 * @return EE_Term_Taxonomy
282
+	 */
283
+	function add_event_category(
284
+		EE_CPT_Base $cpt_model_object,
285
+		$category_name,
286
+		$category_description = '',
287
+		$parent_term_taxonomy_id = null
288
+	) {
289
+		//create term
290
+		require_once(EE_MODELS . 'EEM_Term.model.php');
291
+		//first, check for a term by the same name or slug
292
+		$category_slug = sanitize_title($category_name);
293
+		$term = EEM_Term::instance()->get_one(array(
294
+			array(
295
+				'OR' => array(
296
+					'name' => $category_name,
297
+					'slug' => $category_slug,
298
+				),
299
+			),
300
+		));
301
+		if ( ! $term) {
302
+			$term = EE_Term::new_instance(array(
303
+				'name' => $category_name,
304
+				'slug' => $category_slug,
305
+			));
306
+			$term->save();
307
+		}
308
+		//make sure there's a term-taxonomy entry too
309
+		require_once(EE_MODELS . 'EEM_Term_Taxonomy.model.php');
310
+		$term_taxonomy = EEM_Term_Taxonomy::instance()->get_one(array(
311
+			array(
312
+				'term_id'  => $term->ID(),
313
+				'taxonomy' => EE_Event_Category_Taxonomy,
314
+			),
315
+		));
316
+		/** @var $term_taxonomy EE_Term_Taxonomy */
317
+		if ( ! $term_taxonomy) {
318
+			$term_taxonomy = EE_Term_Taxonomy::new_instance(array(
319
+				'term_id'     => $term->ID(),
320
+				'taxonomy'    => EE_Event_Category_Taxonomy,
321
+				'description' => $category_description,
322
+				'count'       => 1,
323
+				'parent'      => $parent_term_taxonomy_id,
324
+			));
325
+			$term_taxonomy->save();
326
+		} else {
327
+			$term_taxonomy->set_count($term_taxonomy->count() + 1);
328
+			$term_taxonomy->save();
329
+		}
330
+		return $this->add_relationship_to($cpt_model_object, $term_taxonomy, 'Term_Taxonomy');
331
+	}
332
+
333
+
334
+
335
+	/**
336
+	 * Removed the category specified by name as having a relation to this event.
337
+	 * Does not remove the term or term_taxonomy.
338
+	 *
339
+	 * @param EE_CPT_Base $cpt_model_object_event
340
+	 * @param string      $category_name name of the event category (term)
341
+	 * @return bool
342
+	 */
343
+	function remove_event_category(EE_CPT_Base $cpt_model_object_event, $category_name)
344
+	{
345
+		//find the term_taxonomy by that name
346
+		$term_taxonomy = $this->get_first_related($cpt_model_object_event, 'Term_Taxonomy',
347
+			array(array('Term.name' => $category_name, 'taxonomy' => EE_Event_Category_Taxonomy)));
348
+		/** @var $term_taxonomy EE_Term_Taxonomy */
349
+		if ($term_taxonomy) {
350
+			$term_taxonomy->set_count($term_taxonomy->count() - 1);
351
+			$term_taxonomy->save();
352
+		}
353
+		return $this->remove_relationship_to($cpt_model_object_event, $term_taxonomy, 'Term_Taxonomy');
354
+	}
355
+
356
+
357
+
358
+	/**
359
+	 * This is a wrapper for the WordPress get_the_post_thumbnail() function that returns the feature image for the
360
+	 * given CPT ID.  It accepts the same params as what get_the_post_thumbnail() accepts.
361
+	 *
362
+	 * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
363
+	 * @access public
364
+	 * @param int          $id   the ID for the cpt we want the feature image for
365
+	 * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
366
+	 *                           representing width and height in pixels (i.e. array(32,32) ).
367
+	 * @param string|array $attr Optional. Query string or array of attributes.
368
+	 * @return string HTML image element
369
+	 */
370
+	public function get_feature_image($id, $size = 'thumbnail', $attr = '')
371
+	{
372
+		return get_the_post_thumbnail($id, $size, $attr);
373
+	}
374
+
375
+
376
+
377
+	/**
378
+	 * Just a handy way to get the list of post statuses currently registered with WP.
379
+	 *
380
+	 * @global array $wp_post_statuses set in wp core for storing all the post stati
381
+	 * @return array
382
+	 */
383
+	public function get_post_statuses()
384
+	{
385
+		global $wp_post_statuses;
386
+		$statuses = array();
387
+		foreach ($wp_post_statuses as $post_status => $args_object) {
388
+			$statuses[$post_status] = $args_object->label;
389
+		}
390
+		return $statuses;
391
+	}
392
+
393
+
394
+
395
+	/**
396
+	 * public method that can be used to retrieve the protected status array on the instantiated cpt model
397
+	 *
398
+	 * @return array array of statuses.
399
+	 */
400
+	public function get_status_array()
401
+	{
402
+		$statuses = $this->get_post_statuses();
403
+		//first the global filter
404
+		$statuses = apply_filters('FHEE_EEM_CPT_Base__get_status_array', $statuses);
405
+		//now the class specific filter
406
+		$statuses = apply_filters('FHEE_EEM_' . get_class($this) . '__get_status_array', $statuses);
407
+		return $statuses;
408
+	}
409
+
410
+
411
+
412
+	/**
413
+	 * this returns the post statuses that are NOT the default wordpress status
414
+	 *
415
+	 * @return array
416
+	 */
417
+	public function get_custom_post_statuses()
418
+	{
419
+		$new_stati = array();
420
+		foreach ($this->_custom_stati as $status => $props) {
421
+			$new_stati[$status] = $props['label'];
422
+		}
423
+		return $new_stati;
424
+	}
425
+
426
+
427
+
428
+	/**
429
+	 * Creates a child of EE_CPT_Base given a WP_Post or array of wpdb results which
430
+	 * are a row from the posts table. If we're missing any fields required for the model,
431
+	 * we just fetch the entire entry from the DB (ie, if you want to use this to save DB queries,
432
+	 * make sure you are attaching all the model's fields onto the post)
433
+	 *
434
+	 * @param WP_Post|array $post
435
+	 * @return EE_Base_Class|EE_Soft_Delete_Base_Class
436
+	 */
437
+	public function instantiate_class_from_post_object_orig($post)
438
+	{
439
+		$post = (array)$post;
440
+		$has_all_necessary_fields_for_table = true;
441
+		//check if the post has fields on the meta table already
442
+		foreach ($this->_get_other_tables() as $table_obj) {
443
+			$fields_for_that_table = $this->_get_fields_for_table($table_obj->get_table_alias());
444
+			foreach ($fields_for_that_table as $field_obj) {
445
+				if ( ! isset($post[$field_obj->get_table_column()])
446
+					 && ! isset($post[$field_obj->get_qualified_column()])
447
+				) {
448
+					$has_all_necessary_fields_for_table = false;
449
+				}
450
+			}
451
+		}
452
+		//if we don't have all the fields we need, then just fetch the proper model from the DB
453
+		if ( ! $has_all_necessary_fields_for_table) {
454
+			return $this->get_one_by_ID($post['ID']);
455
+		} else {
456
+			return $this->instantiate_class_from_array_or_object($post);
457
+		}
458
+	}
459
+
460
+
461
+
462
+	/**
463
+	 * @param null $post
464
+	 * @return EE_Base_Class|EE_Soft_Delete_Base_Class
465
+	 */
466
+	public function instantiate_class_from_post_object($post = null)
467
+	{
468
+		if (empty($post)) {
469
+			global $post;
470
+		}
471
+		$post = (array)$post;
472
+		$tables_needing_to_be_queried = array();
473
+		//check if the post has fields on the meta table already
474
+		foreach ($this->get_tables() as $table_obj) {
475
+			$fields_for_that_table = $this->_get_fields_for_table($table_obj->get_table_alias());
476
+			foreach ($fields_for_that_table as $field_obj) {
477
+				if ( ! isset($post[$field_obj->get_table_column()])
478
+					 && ! isset($post[$field_obj->get_qualified_column()])
479
+				) {
480
+					$tables_needing_to_be_queried[$table_obj->get_table_alias()] = $table_obj;
481
+				}
482
+			}
483
+		}
484
+		//if we don't have all the fields we need, then just fetch the proper model from the DB
485
+		if ($tables_needing_to_be_queried) {
486
+			if (count($tables_needing_to_be_queried) == 1
487
+				&& reset($tables_needing_to_be_queried)
488
+				   instanceof
489
+				   EE_Secondary_Table
490
+			) {
491
+				//so we're only missing data from a secondary table. Well that's not too hard to query for
492
+				$table_to_query = reset($tables_needing_to_be_queried);
493
+				$missing_data = $this->_do_wpdb_query('get_row', array(
494
+					'SELECT * FROM '
495
+					. $table_to_query->get_table_name()
496
+					. ' WHERE '
497
+					. $table_to_query->get_fk_on_table()
498
+					. ' = '
499
+					. $post['ID'],
500
+					ARRAY_A,
501
+				));
502
+				if ( ! empty($missing_data)) {
503
+					$post = array_merge($post, $missing_data);
504
+				}
505
+			} else {
506
+				return $this->get_one_by_ID($post['ID']);
507
+			}
508
+		}
509
+		return $this->instantiate_class_from_array_or_object($post);
510
+	}
511
+
512
+
513
+
514
+	/**
515
+	 * Gets the post type associated with this
516
+	 *
517
+	 * @throws EE_Error
518
+	 * @return string
519
+	 */
520
+	public function post_type()
521
+	{
522
+		$post_type_field = null;
523
+		foreach ($this->field_settings(true) as $field_obj) {
524
+			if ($field_obj instanceof EE_WP_Post_Type_Field) {
525
+				$post_type_field = $field_obj;
526
+				break;
527
+			}
528
+		}
529
+		if ($post_type_field == null) {
530
+			throw new EE_Error(sprintf(__("CPT Model %s should have a field of type EE_WP_Post_Type, but doesnt",
531
+				"event_espresso"), get_class($this)));
532
+		}
533
+		return $post_type_field->get_default_value();
534
+	}
535 535
 
536 536
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -287,7 +287,7 @@  discard block
 block discarded – undo
287 287
         $parent_term_taxonomy_id = null
288 288
     ) {
289 289
         //create term
290
-        require_once(EE_MODELS . 'EEM_Term.model.php');
290
+        require_once(EE_MODELS.'EEM_Term.model.php');
291 291
         //first, check for a term by the same name or slug
292 292
         $category_slug = sanitize_title($category_name);
293 293
         $term = EEM_Term::instance()->get_one(array(
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
             $term->save();
307 307
         }
308 308
         //make sure there's a term-taxonomy entry too
309
-        require_once(EE_MODELS . 'EEM_Term_Taxonomy.model.php');
309
+        require_once(EE_MODELS.'EEM_Term_Taxonomy.model.php');
310 310
         $term_taxonomy = EEM_Term_Taxonomy::instance()->get_one(array(
311 311
             array(
312 312
                 'term_id'  => $term->ID(),
@@ -403,7 +403,7 @@  discard block
 block discarded – undo
403 403
         //first the global filter
404 404
         $statuses = apply_filters('FHEE_EEM_CPT_Base__get_status_array', $statuses);
405 405
         //now the class specific filter
406
-        $statuses = apply_filters('FHEE_EEM_' . get_class($this) . '__get_status_array', $statuses);
406
+        $statuses = apply_filters('FHEE_EEM_'.get_class($this).'__get_status_array', $statuses);
407 407
         return $statuses;
408 408
     }
409 409
 
@@ -436,7 +436,7 @@  discard block
 block discarded – undo
436 436
      */
437 437
     public function instantiate_class_from_post_object_orig($post)
438 438
     {
439
-        $post = (array)$post;
439
+        $post = (array) $post;
440 440
         $has_all_necessary_fields_for_table = true;
441 441
         //check if the post has fields on the meta table already
442 442
         foreach ($this->_get_other_tables() as $table_obj) {
@@ -468,7 +468,7 @@  discard block
 block discarded – undo
468 468
         if (empty($post)) {
469 469
             global $post;
470 470
         }
471
-        $post = (array)$post;
471
+        $post = (array) $post;
472 472
         $tables_needing_to_be_queried = array();
473 473
         //check if the post has fields on the meta table already
474 474
         foreach ($this->get_tables() as $table_obj) {
Please login to merge, or discard this patch.
core/db_models/EEM_Venue.model.php 2 patches
Indentation   +79 added lines, -79 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /**
5 5
  * Event Espresso
@@ -25,87 +25,87 @@  discard block
 block discarded – undo
25 25
 class EEM_Venue extends EEM_CPT_Base
26 26
 {
27 27
 
28
-    // private instance of the Attendee object
29
-    protected static $_instance = null;
28
+	// private instance of the Attendee object
29
+	protected static $_instance = null;
30 30
 
31 31
 
32 32
 
33
-    protected function __construct($timezone = null)
34
-    {
35
-        $this->singular_item = __('Venue', 'event_espresso');
36
-        $this->plural_item = __('Venues', 'event_espresso');
37
-        $this->_tables = array(
38
-            'Venue_CPT'  => new EE_Primary_Table('posts', 'ID'),
39
-            'Venue_Meta' => new EE_Secondary_Table('esp_venue_meta', 'VNUM_ID', 'VNU_ID'),
40
-        );
41
-        $this->_fields = array(
42
-            'Venue_CPT'  => array(
43
-                'VNU_ID'         => new EE_Primary_Key_Int_Field('ID', __("Venue ID", "event_espresso")),
44
-                'VNU_name'       => new EE_Plain_Text_Field('post_title', __("Venue Name", "event_espresso"), false,
45
-                    ''),
46
-                'VNU_desc'       => new EE_Post_Content_Field('post_content', __("Venue Description", "event_espresso"),
47
-                    false, ''),
48
-                'VNU_identifier' => new EE_Slug_Field('post_name', __("Venue Identifier", "event_espresso"), false, ''),
49
-                'VNU_created'    => new EE_Datetime_Field('post_date', __("Date Venue Created", "event_espresso"),
50
-                    false, EE_Datetime_Field::now),
51
-                'VNU_short_desc' => new EE_Plain_Text_Field('post_excerpt',
52
-                    __("Short Description of Venue", "event_espresso"), true, ''),
53
-                'VNU_modified'   => new EE_Datetime_Field('post_modified', __("Venue Modified Date", "event_espresso"),
54
-                    false, EE_Datetime_Field::now),
55
-                'VNU_wp_user'    => new EE_WP_User_Field('post_author', __("Venue Creator ID", "event_espresso"),
56
-                    false),
57
-                'parent'         => new EE_Integer_Field('post_parent', __("Venue Parent ID", "event_espresso"), false,
58
-                    0),
59
-                'VNU_order'      => new EE_Integer_Field('menu_order', __("Venue order", "event_espresso"), false, 1),
60
-                'post_type'      => new EE_WP_Post_Type_Field('espresso_venues'),
61
-                // EE_Plain_Text_Field('post_type', __("Venue post type", "event_espresso"), false, 'espresso_venues'),
62
-            ),
63
-            'Venue_Meta' => array(
64
-                'VNUM_ID'             => new EE_DB_Only_Int_Field('VNUM_ID',
65
-                    __("ID of Venue Meta Row", "event_espresso"), false),
66
-                'VNU_ID_fk'           => new EE_DB_Only_Int_Field('VNU_ID',
67
-                    __("Foreign Key to Venue Post ", "event_espresso"), false),
68
-                'VNU_address'         => new EE_Plain_Text_Field('VNU_address',
69
-                    __("Venue Address line 1", "event_espresso"), true, ''),
70
-                'VNU_address2'        => new EE_Plain_Text_Field('VNU_address2',
71
-                    __("Venue Address line 2", "event_espresso"), true, ''),
72
-                'VNU_city'            => new EE_Plain_Text_Field('VNU_city', __("Venue City", "event_espresso"), true,
73
-                    ''),
74
-                'STA_ID'              => new EE_Foreign_Key_Int_Field('STA_ID', __("State ID", "event_espresso"), true,
75
-                    null, 'State'),
76
-                'CNT_ISO'             => new EE_Foreign_Key_String_Field('CNT_ISO',
77
-                    __("Country Code", "event_espresso"), true, null, 'Country'),
78
-                'VNU_zip'             => new EE_Plain_Text_Field('VNU_zip',
79
-                    __("Venue Zip/Postal Code", "event_espresso"), true),
80
-                'VNU_phone'           => new EE_Plain_Text_Field('VNU_phone', __("Venue Phone", "event_espresso"),
81
-                    true),
82
-                'VNU_capacity'        => new EE_Infinite_Integer_Field('VNU_capacity',
83
-                    __("Venue Capacity", "event_espresso"), true, EE_INF),
84
-                'VNU_url'             => new EE_Plain_Text_Field('VNU_url', __('Venue Website', 'event_espresso'),
85
-                    true),
86
-                'VNU_virtual_phone'   => new EE_Plain_Text_Field('VNU_virtual_phone',
87
-                    __('Call in Number', 'event_espresso'), true),
88
-                'VNU_virtual_url'     => new EE_Plain_Text_Field('VNU_virtual_url', __('Virtual URL', 'event_espresso'),
89
-                    true),
90
-                'VNU_google_map_link' => new EE_Plain_Text_Field('VNU_google_map_link',
91
-                    __('Google Map Link', 'event_espresso'), true),
92
-                'VNU_enable_for_gmap' => new EE_Boolean_Field('VNU_enable_for_gmap',
93
-                    __('Show Google Map?', 'event_espresso'), false, false),
94
-            ),
95
-        );
96
-        $this->_model_relations = array(
97
-            'Event'             => new EE_HABTM_Relation('Event_Venue'),
98
-            'State'             => new EE_Belongs_To_Relation(),
99
-            'Country'           => new EE_Belongs_To_Relation(),
100
-            'Event_Venue'       => new EE_Has_Many_Relation(),
101
-            'WP_User'           => new EE_Belongs_To_Relation(),
102
-            'Term_Relationship' => new EE_Has_Many_Relation(),
103
-            'Term_Taxonomy'     => new EE_HABTM_Relation('Term_Relationship'),
104
-        );
105
-        //this model is generally available for reading
106
-        $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
107
-        parent::__construct($timezone);
108
-    }
33
+	protected function __construct($timezone = null)
34
+	{
35
+		$this->singular_item = __('Venue', 'event_espresso');
36
+		$this->plural_item = __('Venues', 'event_espresso');
37
+		$this->_tables = array(
38
+			'Venue_CPT'  => new EE_Primary_Table('posts', 'ID'),
39
+			'Venue_Meta' => new EE_Secondary_Table('esp_venue_meta', 'VNUM_ID', 'VNU_ID'),
40
+		);
41
+		$this->_fields = array(
42
+			'Venue_CPT'  => array(
43
+				'VNU_ID'         => new EE_Primary_Key_Int_Field('ID', __("Venue ID", "event_espresso")),
44
+				'VNU_name'       => new EE_Plain_Text_Field('post_title', __("Venue Name", "event_espresso"), false,
45
+					''),
46
+				'VNU_desc'       => new EE_Post_Content_Field('post_content', __("Venue Description", "event_espresso"),
47
+					false, ''),
48
+				'VNU_identifier' => new EE_Slug_Field('post_name', __("Venue Identifier", "event_espresso"), false, ''),
49
+				'VNU_created'    => new EE_Datetime_Field('post_date', __("Date Venue Created", "event_espresso"),
50
+					false, EE_Datetime_Field::now),
51
+				'VNU_short_desc' => new EE_Plain_Text_Field('post_excerpt',
52
+					__("Short Description of Venue", "event_espresso"), true, ''),
53
+				'VNU_modified'   => new EE_Datetime_Field('post_modified', __("Venue Modified Date", "event_espresso"),
54
+					false, EE_Datetime_Field::now),
55
+				'VNU_wp_user'    => new EE_WP_User_Field('post_author', __("Venue Creator ID", "event_espresso"),
56
+					false),
57
+				'parent'         => new EE_Integer_Field('post_parent', __("Venue Parent ID", "event_espresso"), false,
58
+					0),
59
+				'VNU_order'      => new EE_Integer_Field('menu_order', __("Venue order", "event_espresso"), false, 1),
60
+				'post_type'      => new EE_WP_Post_Type_Field('espresso_venues'),
61
+				// EE_Plain_Text_Field('post_type', __("Venue post type", "event_espresso"), false, 'espresso_venues'),
62
+			),
63
+			'Venue_Meta' => array(
64
+				'VNUM_ID'             => new EE_DB_Only_Int_Field('VNUM_ID',
65
+					__("ID of Venue Meta Row", "event_espresso"), false),
66
+				'VNU_ID_fk'           => new EE_DB_Only_Int_Field('VNU_ID',
67
+					__("Foreign Key to Venue Post ", "event_espresso"), false),
68
+				'VNU_address'         => new EE_Plain_Text_Field('VNU_address',
69
+					__("Venue Address line 1", "event_espresso"), true, ''),
70
+				'VNU_address2'        => new EE_Plain_Text_Field('VNU_address2',
71
+					__("Venue Address line 2", "event_espresso"), true, ''),
72
+				'VNU_city'            => new EE_Plain_Text_Field('VNU_city', __("Venue City", "event_espresso"), true,
73
+					''),
74
+				'STA_ID'              => new EE_Foreign_Key_Int_Field('STA_ID', __("State ID", "event_espresso"), true,
75
+					null, 'State'),
76
+				'CNT_ISO'             => new EE_Foreign_Key_String_Field('CNT_ISO',
77
+					__("Country Code", "event_espresso"), true, null, 'Country'),
78
+				'VNU_zip'             => new EE_Plain_Text_Field('VNU_zip',
79
+					__("Venue Zip/Postal Code", "event_espresso"), true),
80
+				'VNU_phone'           => new EE_Plain_Text_Field('VNU_phone', __("Venue Phone", "event_espresso"),
81
+					true),
82
+				'VNU_capacity'        => new EE_Infinite_Integer_Field('VNU_capacity',
83
+					__("Venue Capacity", "event_espresso"), true, EE_INF),
84
+				'VNU_url'             => new EE_Plain_Text_Field('VNU_url', __('Venue Website', 'event_espresso'),
85
+					true),
86
+				'VNU_virtual_phone'   => new EE_Plain_Text_Field('VNU_virtual_phone',
87
+					__('Call in Number', 'event_espresso'), true),
88
+				'VNU_virtual_url'     => new EE_Plain_Text_Field('VNU_virtual_url', __('Virtual URL', 'event_espresso'),
89
+					true),
90
+				'VNU_google_map_link' => new EE_Plain_Text_Field('VNU_google_map_link',
91
+					__('Google Map Link', 'event_espresso'), true),
92
+				'VNU_enable_for_gmap' => new EE_Boolean_Field('VNU_enable_for_gmap',
93
+					__('Show Google Map?', 'event_espresso'), false, false),
94
+			),
95
+		);
96
+		$this->_model_relations = array(
97
+			'Event'             => new EE_HABTM_Relation('Event_Venue'),
98
+			'State'             => new EE_Belongs_To_Relation(),
99
+			'Country'           => new EE_Belongs_To_Relation(),
100
+			'Event_Venue'       => new EE_Has_Many_Relation(),
101
+			'WP_User'           => new EE_Belongs_To_Relation(),
102
+			'Term_Relationship' => new EE_Has_Many_Relation(),
103
+			'Term_Taxonomy'     => new EE_HABTM_Relation('Term_Relationship'),
104
+		);
105
+		//this model is generally available for reading
106
+		$this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
107
+		parent::__construct($timezone);
108
+	}
109 109
 
110 110
 }
111 111
 // End of file EEM_Venue.model.php
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@
 block discarded – undo
18 18
  * @author                Michael Nelson
19 19
  *                        ------------------------------------------------------------------------
20 20
  */
21
-require_once(EE_MODELS . 'EEM_Base.model.php');
21
+require_once(EE_MODELS.'EEM_Base.model.php');
22 22
 
23 23
 
24 24
 
Please login to merge, or discard this patch.
core/libraries/batch/Helpers/JobParameters.php 1 patch
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -96,12 +96,12 @@  discard block
 block discarded – undo
96 96
 	 * @param array $request_data
97 97
 	 * @param array $extra_data
98 98
 	 */
99
-	function __construct( $job_id, $classname, $request_data, $extra_data = array() ) {
100
-		$this->set_job_id( $job_id );
101
-		$this->set_classname( $classname );
102
-		$this->set_request_data( $request_data );
103
-		$this->set_extra_data( $extra_data );
104
-		$this->set_status( JobParameters::status_continue );
99
+	function __construct($job_id, $classname, $request_data, $extra_data = array()) {
100
+		$this->set_job_id($job_id);
101
+		$this->set_classname($classname);
102
+		$this->set_request_data($request_data);
103
+		$this->set_extra_data($extra_data);
104
+		$this->set_status(JobParameters::status_continue);
105 105
 	}
106 106
 
107 107
 
@@ -126,12 +126,12 @@  discard block
 block discarded – undo
126 126
 	 * @param boolean $first
127 127
 	 * @return boolean success
128 128
 	 */
129
-	function save( $first = false ) {
130
-		$object_vars = get_object_vars( $this );
131
-		if( $first ) {
132
-			return add_option( $this->option_name(), $object_vars, null, 'no' );
133
-		} else{
134
-			return update_option( $this->option_name(), $object_vars );
129
+	function save($first = false) {
130
+		$object_vars = get_object_vars($this);
131
+		if ($first) {
132
+			return add_option($this->option_name(), $object_vars, null, 'no');
133
+		} else {
134
+			return update_option($this->option_name(), $object_vars);
135 135
 		}
136 136
 	}
137 137
 
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
 	 * @return boolean
144 144
 	 */
145 145
 	function delete() {
146
-		return delete_option( $this->option_name() );
146
+		return delete_option($this->option_name());
147 147
 	}
148 148
 
149 149
 
@@ -154,26 +154,26 @@  discard block
 block discarded – undo
154 154
 	 * @return JobParameters
155 155
 	 * @throws BatchRequestException
156 156
 	 */
157
-	static function load( $job_id ) {
158
-		$job_parameter_vars = get_option( JobParameters::wp_option_prefix . $job_id );
159
-		if(
160
-			! is_array( $job_parameter_vars ) ||
161
-			! isset( $job_parameter_vars[ '_classname' ] ) ||
162
-			! isset( $job_parameter_vars[ '_request_data' ] )
157
+	static function load($job_id) {
158
+		$job_parameter_vars = get_option(JobParameters::wp_option_prefix.$job_id);
159
+		if (
160
+			! is_array($job_parameter_vars) ||
161
+			! isset($job_parameter_vars['_classname']) ||
162
+			! isset($job_parameter_vars['_request_data'])
163 163
 		) {
164 164
 			throw new BatchRequestException(
165 165
 				sprintf(
166 166
 					__('Could not retrieve job %1$s from the Wordpress options table, and so the job could not continue. The wordpress option was %2$s', 'event_espresso'),
167 167
 					$job_id,
168
-					get_option( JobParameters::wp_option_prefix . $job_id )
168
+					get_option(JobParameters::wp_option_prefix.$job_id)
169 169
 				)
170 170
 			);
171 171
 		}
172 172
 		$job_parameters = new JobParameters(
173 173
 				$job_id,
174
-				$job_parameter_vars[ '_classname' ],
175
-				$job_parameter_vars[ '_request_data'] );
176
-		foreach( $job_parameter_vars as $key => $value ) {
174
+				$job_parameter_vars['_classname'],
175
+				$job_parameter_vars['_request_data'] );
176
+		foreach ($job_parameter_vars as $key => $value) {
177 177
 			$job_parameters->{$key} = $value;
178 178
 		}
179 179
 		return $job_parameters;
@@ -217,9 +217,9 @@  discard block
 block discarded – undo
217 217
 	 * @param string|array $default
218 218
 	 * @return string|array
219 219
 	 */
220
-	function request_datum( $key, $default = '' ) {
221
-		if( isset( $this->_request_data[ $key ] ) ) {
222
-			return $this->_request_data[ $key ];
220
+	function request_datum($key, $default = '') {
221
+		if (isset($this->_request_data[$key])) {
222
+			return $this->_request_data[$key];
223 223
 		} else {
224 224
 			return $default;
225 225
 		}
@@ -233,9 +233,9 @@  discard block
 block discarded – undo
233 233
 	 * @param string|array $default
234 234
 	 * @return string|array
235 235
 	 */
236
-	function extra_datum( $key, $default = '' ) {
237
-		if( isset( $this->_extra_data[ $key ] ) ) {
238
-			return $this->_extra_data[ $key ];
236
+	function extra_datum($key, $default = '') {
237
+		if (isset($this->_extra_data[$key])) {
238
+			return $this->_extra_data[$key];
239 239
 		} else {
240 240
 			return $default;
241 241
 		}
@@ -248,8 +248,8 @@  discard block
 block discarded – undo
248 248
 	 * @param string $key
249 249
 	 * @param string|int|array|null $value almost any extra data you want to store
250 250
 	 */
251
-	function add_extra_data( $key, $value ) {
252
-		$this->_extra_data[ $key ] = $value;
251
+	function add_extra_data($key, $value) {
252
+		$this->_extra_data[$key] = $value;
253 253
 	}
254 254
 
255 255
 
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
 	 * Sets the job size. You decide what units to use
279 279
 	 * @param int $size
280 280
 	 */
281
-	function set_job_size( $size ) {
281
+	function set_job_size($size) {
282 282
 		$this->_job_size = $size;
283 283
 	}
284 284
 
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
 	 * @param int $newly_processed
300 300
 	 * @return int updated units processed
301 301
 	 */
302
-	function mark_processed( $newly_processed ) {
302
+	function mark_processed($newly_processed) {
303 303
 		$this->_units_processed += $newly_processed;
304 304
 		return $this->_units_processed;
305 305
 	}
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
 	 * Sets the total count of units processed. You might prefer to use mark_processed
311 311
 	 * @param int $total_units_processed
312 312
 	 */
313
-	function set_units_processed( $total_units_processed ) {
313
+	function set_units_processed($total_units_processed) {
314 314
 		$this->_units_processed = $total_units_processed;
315 315
 	}
316 316
 
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
 	 * Sets the job's ID
321 321
 	 * @param string $job_id
322 322
 	 */
323
-	function set_job_id( $job_id ) {
323
+	function set_job_id($job_id) {
324 324
 		$this->_job_id = $job_id;
325 325
 	}
326 326
 
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
 	 * sets the classname
331 331
 	 * @param string $classname
332 332
 	 */
333
-	function set_classname( $classname ) {
333
+	function set_classname($classname) {
334 334
 		$this->_classname = $classname;
335 335
 	}
336 336
 
@@ -340,7 +340,7 @@  discard block
 block discarded – undo
340 340
 	 * Sets the request data
341 341
 	 * @param array $request_data
342 342
 	 */
343
-	function set_request_data( $request_data ) {
343
+	function set_request_data($request_data) {
344 344
 		$this->_request_data = $request_data;
345 345
 	}
346 346
 
@@ -350,7 +350,7 @@  discard block
 block discarded – undo
350 350
 	 * Sets the array of extra data we want to store on this request
351 351
 	 * @param array $extra_data
352 352
 	 */
353
-	function set_extra_data( $extra_data ) {
353
+	function set_extra_data($extra_data) {
354 354
 		$this->_extra_data = $extra_data;
355 355
 	}
356 356
 
@@ -361,7 +361,7 @@  discard block
 block discarded – undo
361 361
 	 * @return string
362 362
 	 */
363 363
 	function option_name() {
364
-		return JobParameters::wp_option_prefix . $this->job_id();
364
+		return JobParameters::wp_option_prefix.$this->job_id();
365 365
 	}
366 366
 
367 367
 
@@ -380,7 +380,7 @@  discard block
 block discarded – undo
380 380
 	 *
381 381
 	 * @param string $status on eof JobParameters::valid_stati()
382 382
 	 */
383
-	public function set_status( $status ) {
383
+	public function set_status($status) {
384 384
 		$this->_status = $status;
385 385
 	}
386 386
 
Please login to merge, or discard this patch.
core/domain/entities/DbSafeDateTime.php 3 patches
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -1,8 +1,8 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 namespace EventEspresso\core\domain\entities;
3 3
 
4
-if ( ! defined( 'EVENT_ESPRESSO_VERSION' ) ) {
5
-	exit( 'No direct script access allowed' );
4
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
5
+	exit('No direct script access allowed');
6 6
 }
7 7
 
8 8
 
@@ -47,20 +47,20 @@  discard block
 block discarded – undo
47 47
     {
48 48
         // if the folder path is writable, then except the path + filename, else keep empty
49 49
         $this->_error_log_dir = is_writable(str_replace(basename($error_log_dir), '', $error_log_dir))
50
-            ?  $error_log_dir
50
+            ? $error_log_dir
51 51
             : '';
52 52
     }
53 53
 
54 54
 
55 55
 
56 56
 	public function __toString() {
57
-		return $this->format( DbSafeDateTime::db_safe_timestamp_format );
57
+		return $this->format(DbSafeDateTime::db_safe_timestamp_format);
58 58
 	}
59 59
 
60 60
 
61 61
 
62 62
 	public function __sleep() {
63
-		$this->_datetime_string = $this->format( DbSafeDateTime::db_safe_timestamp_format );
63
+		$this->_datetime_string = $this->format(DbSafeDateTime::db_safe_timestamp_format);
64 64
         $date = \DateTime::createFromFormat(DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string);
65 65
         if ( ! $date instanceof \DateTime) {
66 66
             try {
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
                 )
84 84
             );
85 85
         }
86
-        return array( '_datetime_string' );
86
+        return array('_datetime_string');
87 87
 	}
88 88
 
89 89
 
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
         // but still result in the internal date for that object being set to "-0001-11-30 10:00:00.000000".
97 97
         // so we're no better off, but at least things won't go fatal on us.
98 98
         $this->_datetime_string = str_replace('-0001-11-30', '0000-00-00', $this->_datetime_string);
99
-		$date = \DateTime::createFromFormat( DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string );
99
+		$date = \DateTime::createFromFormat(DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string);
100 100
 		if ( ! $date instanceof \DateTime) {
101 101
             $this->writeToErrorLog(
102 102
                 sprintf(
Please login to merge, or discard this patch.
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -32,24 +32,24 @@  discard block
 block discarded – undo
32 32
 	protected $_datetime_string = '';
33 33
 
34 34
 	/**
35
-     * where to write the error log to
36
-     *
37
-     * @type string $_error_log_dir
35
+	 * where to write the error log to
36
+	 *
37
+	 * @type string $_error_log_dir
38 38
 	 */
39 39
 	protected $_error_log_dir = '';
40 40
 
41 41
 
42 42
 
43
-    /**
44
-     * @param string $error_log_dir
45
-     */
46
-    public function setErrorLogDir($error_log_dir)
47
-    {
48
-        // if the folder path is writable, then except the path + filename, else keep empty
49
-        $this->_error_log_dir = is_writable(str_replace(basename($error_log_dir), '', $error_log_dir))
50
-            ?  $error_log_dir
51
-            : '';
52
-    }
43
+	/**
44
+	 * @param string $error_log_dir
45
+	 */
46
+	public function setErrorLogDir($error_log_dir)
47
+	{
48
+		// if the folder path is writable, then except the path + filename, else keep empty
49
+		$this->_error_log_dir = is_writable(str_replace(basename($error_log_dir), '', $error_log_dir))
50
+			?  $error_log_dir
51
+			: '';
52
+	}
53 53
 
54 54
 
55 55
 
@@ -61,84 +61,84 @@  discard block
 block discarded – undo
61 61
 
62 62
 	public function __sleep() {
63 63
 		$this->_datetime_string = $this->format( DbSafeDateTime::db_safe_timestamp_format );
64
-        $date = \DateTime::createFromFormat(DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string);
65
-        if ( ! $date instanceof \DateTime) {
66
-            try {
67
-                // we want a stack trace to determine where the malformed date came from, so...
68
-                throw new \DomainException();
69
-            } catch (\DomainException $e) {
70
-                $stack_trace = $e->getTraceAsString();
71
-            }
72
-            $this->writeToErrorLog(
73
-                sprintf(
74
-                    __(
75
-                        'A valid DateTime could not be generated from "%1$s" because the following errors occurred: %2$s %3$s %2$s PHP version: %4$s %2$s Stack Trace: %5$s',
76
-                        'event_espresso'
77
-                    ),
78
-                    $this->_datetime_string,
79
-                    '<br />',
80
-                    print_r(\DateTime::getLastErrors(), true),
81
-                    PHP_VERSION,
82
-                    $stack_trace
83
-                )
84
-            );
85
-        }
86
-        return array( '_datetime_string' );
64
+		$date = \DateTime::createFromFormat(DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string);
65
+		if ( ! $date instanceof \DateTime) {
66
+			try {
67
+				// we want a stack trace to determine where the malformed date came from, so...
68
+				throw new \DomainException();
69
+			} catch (\DomainException $e) {
70
+				$stack_trace = $e->getTraceAsString();
71
+			}
72
+			$this->writeToErrorLog(
73
+				sprintf(
74
+					__(
75
+						'A valid DateTime could not be generated from "%1$s" because the following errors occurred: %2$s %3$s %2$s PHP version: %4$s %2$s Stack Trace: %5$s',
76
+						'event_espresso'
77
+					),
78
+					$this->_datetime_string,
79
+					'<br />',
80
+					print_r(\DateTime::getLastErrors(), true),
81
+					PHP_VERSION,
82
+					$stack_trace
83
+				)
84
+			);
85
+		}
86
+		return array( '_datetime_string' );
87 87
 	}
88 88
 
89 89
 
90 90
 
91 91
 	public function __wakeup() {
92
-	    // if an empty or null value got saved to the db for a datetime,
93
-        // then some servers and/or PHP itself will incorrectly convert that date string
94
-        // resulting in "-0001-11-30" for the year-month-day.
95
-        // We'll replace those with "0000-00-00" which will allow a valid DateTime object to be created,
96
-        // but still result in the internal date for that object being set to "-0001-11-30 10:00:00.000000".
97
-        // so we're no better off, but at least things won't go fatal on us.
98
-        $this->_datetime_string = str_replace('-0001-11-30', '0000-00-00', $this->_datetime_string);
92
+		// if an empty or null value got saved to the db for a datetime,
93
+		// then some servers and/or PHP itself will incorrectly convert that date string
94
+		// resulting in "-0001-11-30" for the year-month-day.
95
+		// We'll replace those with "0000-00-00" which will allow a valid DateTime object to be created,
96
+		// but still result in the internal date for that object being set to "-0001-11-30 10:00:00.000000".
97
+		// so we're no better off, but at least things won't go fatal on us.
98
+		$this->_datetime_string = str_replace('-0001-11-30', '0000-00-00', $this->_datetime_string);
99 99
 		$date = \DateTime::createFromFormat( DbSafeDateTime::db_safe_timestamp_format, $this->_datetime_string );
100 100
 		if ( ! $date instanceof \DateTime) {
101
-            $this->writeToErrorLog(
102
-                sprintf(
103
-                    __(
104
-                        'A valid DateTime could not be recreated from "%1$s" because the following errors occurred: %2$s %3$s %2$s PHP version: %4$s',
105
-                        'event_espresso'
106
-                    ),
107
-                    $this->_datetime_string,
108
-                    '<br />',
109
-                    print_r(\DateTime::getLastErrors(), true),
110
-                    PHP_VERSION
111
-                )
112
-            );
113
-        } else {
114
-            $this->__construct(
115
-                $date->format(\EE_Datetime_Field::mysql_timestamp_format),
116
-                new \DateTimeZone($date->format('e'))
117
-            );
118
-        }
101
+			$this->writeToErrorLog(
102
+				sprintf(
103
+					__(
104
+						'A valid DateTime could not be recreated from "%1$s" because the following errors occurred: %2$s %3$s %2$s PHP version: %4$s',
105
+						'event_espresso'
106
+					),
107
+					$this->_datetime_string,
108
+					'<br />',
109
+					print_r(\DateTime::getLastErrors(), true),
110
+					PHP_VERSION
111
+				)
112
+			);
113
+		} else {
114
+			$this->__construct(
115
+				$date->format(\EE_Datetime_Field::mysql_timestamp_format),
116
+				new \DateTimeZone($date->format('e'))
117
+			);
118
+		}
119 119
 	}
120 120
 
121
-    /**
122
-     * Creates a DbSafeDateTime from ye old DateTime
123
-     * @param \DateTime $datetime
124
-     * @return \EventEspresso\core\domain\entities\DbSafeDateTime
125
-     */
126
-    public static function createFromDateTime(\DateTime $datetime)
127
-    {
128
-        return new DbSafeDateTime(
129
-            $datetime->format(\EE_Datetime_Field::mysql_timestamp_format),
130
-            new \DateTimeZone($datetime->format('e'))
131
-        );
132
-    }
133
-
134
-    private function writeToErrorLog($message)
135
-    {
136
-        if ( ! empty($this->_error_log_dir)) {
137
-            error_log($message, 3, $this->_error_log_dir);
138
-        } else {
139
-            error_log($message);
140
-        }
141
-    }
121
+	/**
122
+	 * Creates a DbSafeDateTime from ye old DateTime
123
+	 * @param \DateTime $datetime
124
+	 * @return \EventEspresso\core\domain\entities\DbSafeDateTime
125
+	 */
126
+	public static function createFromDateTime(\DateTime $datetime)
127
+	{
128
+		return new DbSafeDateTime(
129
+			$datetime->format(\EE_Datetime_Field::mysql_timestamp_format),
130
+			new \DateTimeZone($datetime->format('e'))
131
+		);
132
+	}
133
+
134
+	private function writeToErrorLog($message)
135
+	{
136
+		if ( ! empty($this->_error_log_dir)) {
137
+			error_log($message, 3, $this->_error_log_dir);
138
+		} else {
139
+			error_log($message);
140
+		}
141
+	}
142 142
 
143 143
 
144 144
 }
Please login to merge, or discard this patch.
Doc Comments   +3 added lines patch added patch discarded remove patch
@@ -131,6 +131,9 @@
 block discarded – undo
131 131
         );
132 132
     }
133 133
 
134
+    /**
135
+     * @param string $message
136
+     */
134 137
     private function writeToErrorLog($message)
135 138
     {
136 139
         if ( ! empty($this->_error_log_dir)) {
Please login to merge, or discard this patch.
core/db_classes/EE_Message.class.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -697,7 +697,7 @@
 block discarded – undo
697 697
     /**
698 698
      * Gets any error message.
699 699
      *
700
-     * @return mixed|null
700
+     * @return string
701 701
      */
702 702
     public function error_message()
703 703
     {
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php if (! defined('EVENT_ESPRESSO_VERSION')) {
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2 2
     exit('No direct script access allowed');
3 3
 }
4 4
 
@@ -859,7 +859,7 @@  discard block
 block discarded – undo
859 859
      */
860 860
     public function set_messenger_is_executing()
861 861
     {
862
-        $this->set_STS_ID( EEM_Message::status_messenger_executing );
862
+        $this->set_STS_ID(EEM_Message::status_messenger_executing);
863 863
         $this->set_error_message(
864 864
             esc_html__(
865 865
                 'A message with this status indicates that there was a problem that occurred while the message was being
Please login to merge, or discard this patch.
Indentation   +860 added lines, -860 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if (! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 
5 5
 /**
@@ -12,869 +12,869 @@  discard block
 block discarded – undo
12 12
 class EE_Message extends EE_Base_Class implements EEI_Admin_Links
13 13
 {
14 14
 
15
-    /**
16
-     * @deprecated 4.9.0  Added for backward compat with add-on's
17
-     * @type null
18
-     */
19
-    public $template_pack;
20
-
21
-    /**
22
-     * @deprecated 4.9.0 Added for backward compat with add-on's
23
-     * @type null
24
-     */
25
-    public $template_variation;
26
-
27
-    /**
28
-     * @deprecated 4.9.0 Added for backward compat with add-on's
29
-     * @type string
30
-     */
31
-    public $content = '';
32
-
33
-
34
-    /**
35
-     * @type EE_messenger $_messenger
36
-     */
37
-    protected $_messenger = null;
38
-
39
-    /**
40
-     * @type EE_message_type $_message_type
41
-     */
42
-    protected $_message_type = null;
43
-
44
-
45
-    /**
46
-     * @param array  $props_n_values
47
-     * @param string $timezone
48
-     * @param array  $date_formats incoming date formats in an array.  First value is the date_format, second is time
49
-     *                             format.
50
-     * @return EE_Message
51
-     */
52
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
53
-    {
54
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
55
-        //if object doesn't exist, let's generate a unique token on instantiation so that its available even before saving to db.
56
-        if ( ! $has_object) {
57
-            EE_Registry::instance()->load_helper('URL');
58
-            $props_n_values['MSG_token'] = EEH_URL::generate_unique_token();
59
-        }
60
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
61
-    }
62
-
63
-
64
-    /**
65
-     * @param array  $props_n_values
66
-     * @param string $timezone
67
-     * @return EE_Message
68
-     */
69
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
70
-    {
71
-        return new self($props_n_values, true, $timezone);
72
-    }
73
-
74
-
75
-    /**
76
-     * Gets MSG_token
77
-     *
78
-     * @return int
79
-     */
80
-    public function MSG_token()
81
-    {
82
-        return $this->get('MSG_token');
83
-    }
84
-
85
-
86
-    /**
87
-     * Sets MSG_token
88
-     *
89
-     * @param int $MSG_token
90
-     */
91
-    public function set_MSG_token($MSG_token)
92
-    {
93
-        $this->set('MSG_token', $MSG_token);
94
-    }
95
-
96
-
97
-    /**
98
-     * Gets GRP_ID
99
-     *
100
-     * @return int
101
-     */
102
-    public function GRP_ID()
103
-    {
104
-        return $this->get('GRP_ID');
105
-    }
106
-
107
-
108
-    /**
109
-     * Sets GRP_ID
110
-     *
111
-     * @param int $GRP_ID
112
-     */
113
-    public function set_GRP_ID($GRP_ID)
114
-    {
115
-        $this->set('GRP_ID', $GRP_ID);
116
-    }
117
-
118
-
119
-    /**
120
-     * Gets TXN_ID
121
-     *
122
-     * @return int
123
-     */
124
-    public function TXN_ID()
125
-    {
126
-        return $this->get('TXN_ID');
127
-    }
128
-
129
-
130
-    /**
131
-     * Sets TXN_ID
132
-     *
133
-     * @param int $TXN_ID
134
-     */
135
-    public function set_TXN_ID($TXN_ID)
136
-    {
137
-        $this->set('TXN_ID', $TXN_ID);
138
-    }
139
-
140
-
141
-    /**
142
-     * Gets messenger
143
-     *
144
-     * @return string
145
-     */
146
-    public function messenger()
147
-    {
148
-        return $this->get('MSG_messenger');
149
-    }
150
-
151
-
152
-    /**
153
-     * Sets messenger
154
-     *
155
-     * @param string $messenger
156
-     */
157
-    public function set_messenger($messenger)
158
-    {
159
-        $this->set('MSG_messenger', $messenger);
160
-    }
161
-
162
-
163
-    /**
164
-     * Returns corresponding messenger object for the set messenger on this message
165
-     *
166
-     * @return EE_messenger | null
167
-     */
168
-    public function messenger_object()
169
-    {
170
-        return $this->_messenger;
171
-    }
172
-
173
-
174
-    /**
175
-     * Sets messenger
176
-     *
177
-     * @param EE_messenger $messenger
178
-     */
179
-    public function set_messenger_object(EE_messenger $messenger)
180
-    {
181
-        $this->_messenger = $messenger;
182
-    }
183
-
184
-
185
-    /**
186
-     * validates messenger
187
-     *
188
-     * @param bool $throw_exceptions
189
-     * @return bool
190
-     * @throws \EE_Error
191
-     */
192
-    public function valid_messenger($throw_exceptions = false)
193
-    {
194
-        if ($this->_messenger instanceof EE_messenger) {
195
-            return true;
196
-        }
197
-        if ($throw_exceptions) {
198
-            throw new EE_Error(
199
-                sprintf(
200
-                    __(
201
-                        'The "%1$s" messenger set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
202
-                        'event_espresso'
203
-                    ),
204
-                    $this->messenger()
205
-                )
206
-            );
207
-        }
208
-        return false;
209
-    }
210
-
211
-
212
-    /**
213
-     * This returns the set localized label for the messenger on this message.
214
-     * Note, if unable to retrieve the EE_messenger object then will just return the messenger slug saved
215
-     * with this message.
216
-     *
217
-     * @param   bool $plural whether to return the plural label or not.
218
-     * @return string
219
-     */
220
-    public function messenger_label($plural = false)
221
-    {
222
-        $label_type = $plural ? 'plural' : 'singular';
223
-        $messenger  = $this->messenger_object();
224
-        return $messenger instanceof EE_messenger ? $messenger->label[$label_type] : $this->messenger();
225
-    }
226
-
227
-
228
-    /**
229
-     * Gets message_type
230
-     *
231
-     * @return string
232
-     */
233
-    public function message_type()
234
-    {
235
-        return $this->get('MSG_message_type');
236
-    }
237
-
238
-
239
-    /**
240
-     * Sets message_type
241
-     *
242
-     * @param string $message_type
243
-     */
244
-    public function set_message_type($message_type)
245
-    {
246
-        $this->set('MSG_message_type', $message_type);
247
-    }
248
-
249
-
250
-    /**
251
-     * Returns the message type object for the set message type on this message
252
-     *
253
-     * @return EE_message_type | null
254
-     */
255
-    public function message_type_object()
256
-    {
257
-        return $this->_message_type;
258
-    }
259
-
260
-
261
-    /**
262
-     * Sets message_type
263
-     *
264
-     * @param EE_message_type $message_type
265
-     * @param bool            $set_priority   This indicates whether to set the priority to whatever the priority is on
266
-     *                                        the message type or not.
267
-     */
268
-    public function set_message_type_object(EE_message_type $message_type, $set_priority = false)
269
-    {
270
-        $this->_message_type = $message_type;
271
-        if ($set_priority) {
272
-            $this->set_priority($this->_message_type->get_priority());
273
-        }
274
-    }
275
-
276
-
277
-    /**
278
-     * validates message_type
279
-     *
280
-     * @param bool $throw_exceptions
281
-     * @return bool
282
-     * @throws \EE_Error
283
-     */
284
-    public function valid_message_type($throw_exceptions = false)
285
-    {
286
-        if ($this->_message_type instanceof EE_message_type) {
287
-            return true;
288
-        }
289
-        if ($throw_exceptions) {
290
-            throw new EE_Error(
291
-                sprintf(
292
-                    __(
293
-                        'The %1$s message type set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
294
-                        'event_espresso'
295
-                    ),
296
-                    $this->message_type()
297
-                )
298
-            );
299
-        }
300
-        return false;
301
-    }
302
-
303
-
304
-    /**
305
-     * validates messenger and message_type (that they are valid EE_messenger and EE_message_type objects).
306
-     *
307
-     * @param bool $throw_exceptions
308
-     * @return bool
309
-     * @throws \EE_Error
310
-     */
311
-    public function is_valid($throw_exceptions = false)
312
-    {
313
-        if ($this->valid_messenger($throw_exceptions) && $this->valid_message_type($throw_exceptions)) {
314
-            return true;
315
-        }
316
-        return false;
317
-    }
318
-
319
-
320
-    /**
321
-     * This validates whether the internal messenger and message type objects are valid for sending.
322
-     * Three checks are done:
323
-     * 1. There is a valid messenger object.
324
-     * 2. There is a valid message type object.
325
-     * 3. The message type object is active for the messenger.
326
-     *
327
-     * @throws EE_Error  But only if $throw_exceptions is set to true.
328
-     * @param bool $throw_exceptions
329
-     * @return bool
330
-     */
331
-    public function is_valid_for_sending_or_generation($throw_exceptions = false)
332
-    {
333
-        $valid = false;
334
-        if ($this->is_valid($throw_exceptions)) {
335
-            /** @var EE_Message_Resource_Manager $message_resource_manager */
336
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
337
-            $valid                    = $message_resource_manager->is_message_type_active_for_messenger($this->messenger(),
338
-                $this->message_type());
339
-            if ( ! $valid && $throw_exceptions) {
340
-                throw new EE_Error(
341
-                    sprintf(
342
-                        __('The %1$s message type is not a valid message type for the %2$s messenger so it will not be sent.',
343
-                            'event_espresso'),
344
-                        $this->message_type(),
345
-                        $this->messenger()
346
-                    )
347
-                );
348
-            }
349
-        }
350
-        return $valid;
351
-    }
352
-
353
-
354
-    /**
355
-     * This returns the set localized label for the message type on this message.
356
-     * Note, if unable to retrieve the EE_message_type object then will just return the message type slug saved
357
-     * with this message.
358
-     *
359
-     * @param   bool $plural whether to return the plural label or not.
360
-     * @return string
361
-     */
362
-    public function message_type_label($plural = false)
363
-    {
364
-        $label_type   = $plural ? 'plural' : 'singular';
365
-        $message_type = $this->message_type_object();
366
-        return $message_type instanceof EE_message_type ? $message_type->label[$label_type] : str_replace(
367
-            '_',
368
-            ' ',
369
-            $this->message_type()
370
-        );
371
-    }
372
-
373
-
374
-    /**
375
-     * Gets context
376
-     *
377
-     * @return string
378
-     */
379
-    public function context()
380
-    {
381
-        return $this->get('MSG_context');
382
-    }
383
-
384
-
385
-    /**
386
-     * This returns the corresponding localized label for the given context slug, if possible from installed message
387
-     * types. Otherwise, this will just return the set context slug on this object.
388
-     *
389
-     * @return string
390
-     */
391
-    public function context_label()
392
-    {
393
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
394
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
395
-        $contexts                 = $message_resource_manager->get_all_contexts();
396
-        return isset($contexts[$this->context()]) ? $contexts[$this->context()] : $this->context();
397
-    }
398
-
399
-
400
-    /**
401
-     * Sets context
402
-     *
403
-     * @param string $context
404
-     */
405
-    public function set_context($context)
406
-    {
407
-        $this->set('MSG_context', $context);
408
-    }
409
-
410
-
411
-    /**
412
-     * Gets recipient_ID
413
-     *
414
-     * @return int
415
-     */
416
-    public function recipient_ID()
417
-    {
418
-        return $this->get('MSG_recipient_ID');
419
-    }
420
-
421
-
422
-    /**
423
-     * Sets recipient_ID
424
-     *
425
-     * @param string $recipient_ID
426
-     */
427
-    public function set_recipient_ID($recipient_ID)
428
-    {
429
-        $this->set('MSG_recipient_ID', $recipient_ID);
430
-    }
431
-
432
-
433
-    /**
434
-     * Gets recipient_type
435
-     *
436
-     * @return string
437
-     */
438
-    public function recipient_type()
439
-    {
440
-        return $this->get('MSG_recipient_type');
441
-    }
442
-
443
-
444
-    /**
445
-     * Return the related object matching the recipient type and ID.
446
-     *
447
-     * @return EE_Base_Class | null
448
-     */
449
-    public function recipient_object()
450
-    {
451
-        if ( ! $this->recipient_type() || ! $this->recipient_ID()) {
452
-            return null;
453
-        }
454
-
455
-        return $this->get_first_related($this->recipient_type());
456
-    }
457
-
458
-
459
-    /**
460
-     * Sets recipient_type
461
-     *
462
-     * @param string $recipient_type
463
-     */
464
-    public function set_recipient_type($recipient_type)
465
-    {
466
-        $this->set('MSG_recipient_type', $recipient_type);
467
-    }
468
-
469
-
470
-    /**
471
-     * Gets content
472
-     *
473
-     * @return string
474
-     */
475
-    public function content()
476
-    {
477
-        return $this->get('MSG_content');
478
-    }
479
-
480
-
481
-    /**
482
-     * Sets content
483
-     *
484
-     * @param string $content
485
-     */
486
-    public function set_content($content)
487
-    {
488
-        $this->set('MSG_content', $content);
489
-    }
490
-
491
-
492
-    /**
493
-     * Gets subject
494
-     *
495
-     * @return string
496
-     */
497
-    public function subject()
498
-    {
499
-        return $this->get('MSG_subject');
500
-    }
501
-
502
-
503
-    /**
504
-     * Sets subject
505
-     *
506
-     * @param string $subject
507
-     */
508
-    public function set_subject($subject)
509
-    {
510
-        $this->set('MSG_subject', $subject);
511
-    }
512
-
513
-
514
-    /**
515
-     * Gets to
516
-     *
517
-     * @return string
518
-     */
519
-    public function to()
520
-    {
521
-        $to = $this->get('MSG_to');
522
-        return empty($to) ? __('No recipient', 'event_espresso') : $to;
523
-    }
524
-
525
-
526
-    /**
527
-     * Sets to
528
-     *
529
-     * @param string $to
530
-     */
531
-    public function set_to($to)
532
-    {
533
-        $this->set('MSG_to', $to);
534
-    }
535
-
536
-
537
-    /**
538
-     * Gets from
539
-     *
540
-     * @return string
541
-     */
542
-    public function from()
543
-    {
544
-        return $this->get('MSG_from');
545
-    }
546
-
547
-
548
-    /**
549
-     * Sets from
550
-     *
551
-     * @param string $from
552
-     */
553
-    public function set_from($from)
554
-    {
555
-        $this->set('MSG_from', $from);
556
-    }
557
-
558
-
559
-    /**
560
-     * Gets priority
561
-     *
562
-     * @return int
563
-     */
564
-    public function priority()
565
-    {
566
-        return $this->get('MSG_priority');
567
-    }
568
-
569
-
570
-    /**
571
-     * Sets priority
572
-     * Note.  Send Now Messengers always override any priority that may be set on a Message.  So
573
-     * this method calls the send_now method to verify that.
574
-     *
575
-     * @param int $priority
576
-     */
577
-    public function set_priority($priority)
578
-    {
579
-        $priority = $this->send_now() ? EEM_Message::priority_high : $priority;
580
-        parent::set('MSG_priority', $priority);
581
-    }
582
-
583
-
584
-    /**
585
-     * Overrides parent::set method so we can capture any sets for priority.
586
-     *
587
-     * @see parent::set() for phpdocs
588
-     * @param string $field_name
589
-     * @param mixed  $field_value
590
-     * @param bool   $use_default
591
-     * @throws EE_Error
592
-     */
593
-    public function set($field_name, $field_value, $use_default = false)
594
-    {
595
-        if ($field_name === 'MSG_priority') {
596
-            $this->set_priority($field_value);
597
-        }
598
-        parent::set($field_name, $field_value, $use_default);
599
-    }
600
-
601
-
602
-    /**
603
-     * @return bool
604
-     * @throws \EE_Error
605
-     */
606
-    public function send_now()
607
-    {
608
-        $send_now = $this->valid_messenger() && $this->messenger_object()->send_now() ? EEM_Message::priority_high : $this->priority();
609
-        return $send_now === EEM_Message::priority_high ? true : false;
610
-    }
611
-
612
-
613
-    /**
614
-     * Gets STS_ID
615
-     *
616
-     * @return string
617
-     */
618
-    public function STS_ID()
619
-    {
620
-        return $this->get('STS_ID');
621
-    }
622
-
623
-
624
-    /**
625
-     * Sets STS_ID
626
-     *
627
-     * @param string $STS_ID
628
-     */
629
-    public function set_STS_ID($STS_ID)
630
-    {
631
-        $this->set('STS_ID', $STS_ID);
632
-    }
633
-
634
-
635
-    /**
636
-     * Gets created
637
-     *
638
-     * @return string
639
-     */
640
-    public function created()
641
-    {
642
-        return $this->get('MSG_created');
643
-    }
644
-
645
-
646
-    /**
647
-     * Sets created
648
-     *
649
-     * @param string $created
650
-     */
651
-    public function set_created($created)
652
-    {
653
-        $this->set('MSG_created', $created);
654
-    }
655
-
656
-
657
-    /**
658
-     * Gets modified
659
-     *
660
-     * @return string
661
-     */
662
-    public function modified()
663
-    {
664
-        return $this->get('MSG_modified');
665
-    }
666
-
667
-
668
-    /**
669
-     * Sets modified
670
-     *
671
-     * @param string $modified
672
-     */
673
-    public function set_modified($modified)
674
-    {
675
-        $this->set('MSG_modified', $modified);
676
-    }
677
-
678
-
679
-    /**
680
-     * Sets generation data for this message.
681
-     *
682
-     * @param mixed $data
683
-     */
684
-    public function set_generation_data($data)
685
-    {
686
-        $this->set_field_or_extra_meta('MSG_generation_data', $data);
687
-    }
688
-
689
-
690
-    /**
691
-     * Returns any set generation data for this message.
692
-     *
693
-     * @return mixed|null
694
-     */
695
-    public function get_generation_data()
696
-    {
697
-        return $this->get_field_or_extra_meta('MSG_generation_data');
698
-    }
699
-
700
-
701
-    /**
702
-     * Gets any error message.
703
-     *
704
-     * @return mixed|null
705
-     */
706
-    public function error_message()
707
-    {
708
-        return $this->get_field_or_extra_meta('MSG_error');
709
-    }
710
-
711
-
712
-    /**
713
-     * Sets an error message.
714
-     *
715
-     * @param $message
716
-     * @return bool|int
717
-     */
718
-    public function set_error_message($message)
719
-    {
720
-        return $this->set_field_or_extra_meta('MSG_error', $message);
721
-    }
722
-
723
-
724
-    /**
725
-     * This retrieves the associated template pack with this message.
726
-     *
727
-     * @return EE_Messages_Template_Pack | null
728
-     */
729
-    public function get_template_pack()
730
-    {
731
-        /**
732
-         * This is deprecated functionality that will be removed eventually but included here now for backward compat.
733
-         */
734
-        if ( ! empty($this->template_pack)) {
735
-            return $this->template_pack;
736
-        }
737
-        /** @type EE_Message_Template_Group $grp */
738
-        $grp = $this->get_first_related('Message_Template_Group');
739
-        //if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
740
-        if ( ! $grp instanceof EE_Message_Template_Group) {
741
-            $grp = EEM_Message_Template_Group::instance()->get_one(
742
-                array(
743
-                    array(
744
-                        'MTP_messenger'    => $this->messenger(),
745
-                        'MTP_message_type' => $this->message_type(),
746
-                        'MTP_is_global'    => true,
747
-                    ),
748
-                )
749
-            );
750
-        }
751
-
752
-        return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack() : null;
753
-    }
754
-
755
-
756
-    /**
757
-     * Retrieves the variation used for generating this message.
758
-     *
759
-     * @return string
760
-     */
761
-    public function get_template_pack_variation()
762
-    {
763
-        /**
764
-         * This is deprecated functionality that will be removed eventually but included here now for backward compat.
765
-         */
766
-        if ( ! empty($this->template_variation)) {
767
-            return $this->template_variation;
768
-        }
769
-
770
-        /** @type EE_Message_Template_Group $grp */
771
-        $grp = $this->get_first_related('Message_Template_Group');
772
-
773
-        //if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
774
-        if ( ! $grp instanceof EE_Message_Template_Group) {
775
-            $grp = EEM_Message_Template_Group::instance()->get_one(
776
-                array(
777
-                    array(
778
-                        'MTP_messenger'    => $this->messenger(),
779
-                        'MTP_message_type' => $this->message_type(),
780
-                        'MTP_is_global'    => true,
781
-                    ),
782
-                )
783
-            );
784
-        }
785
-
786
-        return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack_variation() : '';
787
-    }
788
-
789
-    /**
790
-     * Return the link to the admin details for the object.
791
-     *
792
-     * @return string
793
-     */
794
-    public function get_admin_details_link()
795
-    {
796
-        EE_Registry::instance()->load_helper('URL');
797
-        EE_Registry::instance()->load_helper('MSG_Template');
798
-        switch ($this->STS_ID()) {
799
-            case EEM_Message::status_failed :
800
-            case EEM_Message::status_debug_only :
801
-                return EEH_MSG_Template::generate_error_display_trigger($this);
802
-                break;
803
-
804
-            case EEM_Message::status_sent :
805
-                return EEH_MSG_Template::generate_browser_trigger($this);
806
-                break;
807
-
808
-            default :
809
-                return '';
810
-        }
811
-    }
812
-
813
-    /**
814
-     * Returns the link to the editor for the object.  Sometimes this is the same as the details.
815
-     *
816
-     * @return string
817
-     */
818
-    public function get_admin_edit_link()
819
-    {
820
-        return $this->get_admin_details_link();
821
-    }
822
-
823
-    /**
824
-     * Returns the link to a settings page for the object.
825
-     *
826
-     * @return string
827
-     */
828
-    public function get_admin_settings_link()
829
-    {
830
-        EE_Registry::instance()->load_helper('URL');
831
-        return EEH_URL::add_query_args_and_nonce(
832
-            array(
833
-                'page'   => 'espresso_messages',
834
-                'action' => 'settings',
835
-            ),
836
-            admin_url('admin.php')
837
-        );
838
-    }
839
-
840
-    /**
841
-     * Returns the link to the "overview" for the object (typically the "list table" view).
842
-     *
843
-     * @return string
844
-     */
845
-    public function get_admin_overview_link()
846
-    {
847
-        EE_Registry::instance()->load_helper('URL');
848
-        return EEH_URL::add_query_args_and_nonce(
849
-            array(
850
-                'page'   => 'espresso_messages',
851
-                'action' => 'default',
852
-            ),
853
-            admin_url('admin.php')
854
-        );
855
-    }
856
-
857
-
858
-    /**
859
-     * This sets the EEM_Message::status_messenger_executing class on the message and the appropriate error message for
860
-     * it.
861
-     * Note this also SAVES the current message object to the db because it adds an error message to accompany the status.
862
-     *
863
-     */
864
-    public function set_messenger_is_executing()
865
-    {
866
-        $this->set_STS_ID( EEM_Message::status_messenger_executing );
867
-        $this->set_error_message(
868
-            esc_html__(
869
-                'A message with this status indicates that there was a problem that occurred while the message was being
15
+	/**
16
+	 * @deprecated 4.9.0  Added for backward compat with add-on's
17
+	 * @type null
18
+	 */
19
+	public $template_pack;
20
+
21
+	/**
22
+	 * @deprecated 4.9.0 Added for backward compat with add-on's
23
+	 * @type null
24
+	 */
25
+	public $template_variation;
26
+
27
+	/**
28
+	 * @deprecated 4.9.0 Added for backward compat with add-on's
29
+	 * @type string
30
+	 */
31
+	public $content = '';
32
+
33
+
34
+	/**
35
+	 * @type EE_messenger $_messenger
36
+	 */
37
+	protected $_messenger = null;
38
+
39
+	/**
40
+	 * @type EE_message_type $_message_type
41
+	 */
42
+	protected $_message_type = null;
43
+
44
+
45
+	/**
46
+	 * @param array  $props_n_values
47
+	 * @param string $timezone
48
+	 * @param array  $date_formats incoming date formats in an array.  First value is the date_format, second is time
49
+	 *                             format.
50
+	 * @return EE_Message
51
+	 */
52
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
53
+	{
54
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
55
+		//if object doesn't exist, let's generate a unique token on instantiation so that its available even before saving to db.
56
+		if ( ! $has_object) {
57
+			EE_Registry::instance()->load_helper('URL');
58
+			$props_n_values['MSG_token'] = EEH_URL::generate_unique_token();
59
+		}
60
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
61
+	}
62
+
63
+
64
+	/**
65
+	 * @param array  $props_n_values
66
+	 * @param string $timezone
67
+	 * @return EE_Message
68
+	 */
69
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
70
+	{
71
+		return new self($props_n_values, true, $timezone);
72
+	}
73
+
74
+
75
+	/**
76
+	 * Gets MSG_token
77
+	 *
78
+	 * @return int
79
+	 */
80
+	public function MSG_token()
81
+	{
82
+		return $this->get('MSG_token');
83
+	}
84
+
85
+
86
+	/**
87
+	 * Sets MSG_token
88
+	 *
89
+	 * @param int $MSG_token
90
+	 */
91
+	public function set_MSG_token($MSG_token)
92
+	{
93
+		$this->set('MSG_token', $MSG_token);
94
+	}
95
+
96
+
97
+	/**
98
+	 * Gets GRP_ID
99
+	 *
100
+	 * @return int
101
+	 */
102
+	public function GRP_ID()
103
+	{
104
+		return $this->get('GRP_ID');
105
+	}
106
+
107
+
108
+	/**
109
+	 * Sets GRP_ID
110
+	 *
111
+	 * @param int $GRP_ID
112
+	 */
113
+	public function set_GRP_ID($GRP_ID)
114
+	{
115
+		$this->set('GRP_ID', $GRP_ID);
116
+	}
117
+
118
+
119
+	/**
120
+	 * Gets TXN_ID
121
+	 *
122
+	 * @return int
123
+	 */
124
+	public function TXN_ID()
125
+	{
126
+		return $this->get('TXN_ID');
127
+	}
128
+
129
+
130
+	/**
131
+	 * Sets TXN_ID
132
+	 *
133
+	 * @param int $TXN_ID
134
+	 */
135
+	public function set_TXN_ID($TXN_ID)
136
+	{
137
+		$this->set('TXN_ID', $TXN_ID);
138
+	}
139
+
140
+
141
+	/**
142
+	 * Gets messenger
143
+	 *
144
+	 * @return string
145
+	 */
146
+	public function messenger()
147
+	{
148
+		return $this->get('MSG_messenger');
149
+	}
150
+
151
+
152
+	/**
153
+	 * Sets messenger
154
+	 *
155
+	 * @param string $messenger
156
+	 */
157
+	public function set_messenger($messenger)
158
+	{
159
+		$this->set('MSG_messenger', $messenger);
160
+	}
161
+
162
+
163
+	/**
164
+	 * Returns corresponding messenger object for the set messenger on this message
165
+	 *
166
+	 * @return EE_messenger | null
167
+	 */
168
+	public function messenger_object()
169
+	{
170
+		return $this->_messenger;
171
+	}
172
+
173
+
174
+	/**
175
+	 * Sets messenger
176
+	 *
177
+	 * @param EE_messenger $messenger
178
+	 */
179
+	public function set_messenger_object(EE_messenger $messenger)
180
+	{
181
+		$this->_messenger = $messenger;
182
+	}
183
+
184
+
185
+	/**
186
+	 * validates messenger
187
+	 *
188
+	 * @param bool $throw_exceptions
189
+	 * @return bool
190
+	 * @throws \EE_Error
191
+	 */
192
+	public function valid_messenger($throw_exceptions = false)
193
+	{
194
+		if ($this->_messenger instanceof EE_messenger) {
195
+			return true;
196
+		}
197
+		if ($throw_exceptions) {
198
+			throw new EE_Error(
199
+				sprintf(
200
+					__(
201
+						'The "%1$s" messenger set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
202
+						'event_espresso'
203
+					),
204
+					$this->messenger()
205
+				)
206
+			);
207
+		}
208
+		return false;
209
+	}
210
+
211
+
212
+	/**
213
+	 * This returns the set localized label for the messenger on this message.
214
+	 * Note, if unable to retrieve the EE_messenger object then will just return the messenger slug saved
215
+	 * with this message.
216
+	 *
217
+	 * @param   bool $plural whether to return the plural label or not.
218
+	 * @return string
219
+	 */
220
+	public function messenger_label($plural = false)
221
+	{
222
+		$label_type = $plural ? 'plural' : 'singular';
223
+		$messenger  = $this->messenger_object();
224
+		return $messenger instanceof EE_messenger ? $messenger->label[$label_type] : $this->messenger();
225
+	}
226
+
227
+
228
+	/**
229
+	 * Gets message_type
230
+	 *
231
+	 * @return string
232
+	 */
233
+	public function message_type()
234
+	{
235
+		return $this->get('MSG_message_type');
236
+	}
237
+
238
+
239
+	/**
240
+	 * Sets message_type
241
+	 *
242
+	 * @param string $message_type
243
+	 */
244
+	public function set_message_type($message_type)
245
+	{
246
+		$this->set('MSG_message_type', $message_type);
247
+	}
248
+
249
+
250
+	/**
251
+	 * Returns the message type object for the set message type on this message
252
+	 *
253
+	 * @return EE_message_type | null
254
+	 */
255
+	public function message_type_object()
256
+	{
257
+		return $this->_message_type;
258
+	}
259
+
260
+
261
+	/**
262
+	 * Sets message_type
263
+	 *
264
+	 * @param EE_message_type $message_type
265
+	 * @param bool            $set_priority   This indicates whether to set the priority to whatever the priority is on
266
+	 *                                        the message type or not.
267
+	 */
268
+	public function set_message_type_object(EE_message_type $message_type, $set_priority = false)
269
+	{
270
+		$this->_message_type = $message_type;
271
+		if ($set_priority) {
272
+			$this->set_priority($this->_message_type->get_priority());
273
+		}
274
+	}
275
+
276
+
277
+	/**
278
+	 * validates message_type
279
+	 *
280
+	 * @param bool $throw_exceptions
281
+	 * @return bool
282
+	 * @throws \EE_Error
283
+	 */
284
+	public function valid_message_type($throw_exceptions = false)
285
+	{
286
+		if ($this->_message_type instanceof EE_message_type) {
287
+			return true;
288
+		}
289
+		if ($throw_exceptions) {
290
+			throw new EE_Error(
291
+				sprintf(
292
+					__(
293
+						'The %1$s message type set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
294
+						'event_espresso'
295
+					),
296
+					$this->message_type()
297
+				)
298
+			);
299
+		}
300
+		return false;
301
+	}
302
+
303
+
304
+	/**
305
+	 * validates messenger and message_type (that they are valid EE_messenger and EE_message_type objects).
306
+	 *
307
+	 * @param bool $throw_exceptions
308
+	 * @return bool
309
+	 * @throws \EE_Error
310
+	 */
311
+	public function is_valid($throw_exceptions = false)
312
+	{
313
+		if ($this->valid_messenger($throw_exceptions) && $this->valid_message_type($throw_exceptions)) {
314
+			return true;
315
+		}
316
+		return false;
317
+	}
318
+
319
+
320
+	/**
321
+	 * This validates whether the internal messenger and message type objects are valid for sending.
322
+	 * Three checks are done:
323
+	 * 1. There is a valid messenger object.
324
+	 * 2. There is a valid message type object.
325
+	 * 3. The message type object is active for the messenger.
326
+	 *
327
+	 * @throws EE_Error  But only if $throw_exceptions is set to true.
328
+	 * @param bool $throw_exceptions
329
+	 * @return bool
330
+	 */
331
+	public function is_valid_for_sending_or_generation($throw_exceptions = false)
332
+	{
333
+		$valid = false;
334
+		if ($this->is_valid($throw_exceptions)) {
335
+			/** @var EE_Message_Resource_Manager $message_resource_manager */
336
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
337
+			$valid                    = $message_resource_manager->is_message_type_active_for_messenger($this->messenger(),
338
+				$this->message_type());
339
+			if ( ! $valid && $throw_exceptions) {
340
+				throw new EE_Error(
341
+					sprintf(
342
+						__('The %1$s message type is not a valid message type for the %2$s messenger so it will not be sent.',
343
+							'event_espresso'),
344
+						$this->message_type(),
345
+						$this->messenger()
346
+					)
347
+				);
348
+			}
349
+		}
350
+		return $valid;
351
+	}
352
+
353
+
354
+	/**
355
+	 * This returns the set localized label for the message type on this message.
356
+	 * Note, if unable to retrieve the EE_message_type object then will just return the message type slug saved
357
+	 * with this message.
358
+	 *
359
+	 * @param   bool $plural whether to return the plural label or not.
360
+	 * @return string
361
+	 */
362
+	public function message_type_label($plural = false)
363
+	{
364
+		$label_type   = $plural ? 'plural' : 'singular';
365
+		$message_type = $this->message_type_object();
366
+		return $message_type instanceof EE_message_type ? $message_type->label[$label_type] : str_replace(
367
+			'_',
368
+			' ',
369
+			$this->message_type()
370
+		);
371
+	}
372
+
373
+
374
+	/**
375
+	 * Gets context
376
+	 *
377
+	 * @return string
378
+	 */
379
+	public function context()
380
+	{
381
+		return $this->get('MSG_context');
382
+	}
383
+
384
+
385
+	/**
386
+	 * This returns the corresponding localized label for the given context slug, if possible from installed message
387
+	 * types. Otherwise, this will just return the set context slug on this object.
388
+	 *
389
+	 * @return string
390
+	 */
391
+	public function context_label()
392
+	{
393
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
394
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
395
+		$contexts                 = $message_resource_manager->get_all_contexts();
396
+		return isset($contexts[$this->context()]) ? $contexts[$this->context()] : $this->context();
397
+	}
398
+
399
+
400
+	/**
401
+	 * Sets context
402
+	 *
403
+	 * @param string $context
404
+	 */
405
+	public function set_context($context)
406
+	{
407
+		$this->set('MSG_context', $context);
408
+	}
409
+
410
+
411
+	/**
412
+	 * Gets recipient_ID
413
+	 *
414
+	 * @return int
415
+	 */
416
+	public function recipient_ID()
417
+	{
418
+		return $this->get('MSG_recipient_ID');
419
+	}
420
+
421
+
422
+	/**
423
+	 * Sets recipient_ID
424
+	 *
425
+	 * @param string $recipient_ID
426
+	 */
427
+	public function set_recipient_ID($recipient_ID)
428
+	{
429
+		$this->set('MSG_recipient_ID', $recipient_ID);
430
+	}
431
+
432
+
433
+	/**
434
+	 * Gets recipient_type
435
+	 *
436
+	 * @return string
437
+	 */
438
+	public function recipient_type()
439
+	{
440
+		return $this->get('MSG_recipient_type');
441
+	}
442
+
443
+
444
+	/**
445
+	 * Return the related object matching the recipient type and ID.
446
+	 *
447
+	 * @return EE_Base_Class | null
448
+	 */
449
+	public function recipient_object()
450
+	{
451
+		if ( ! $this->recipient_type() || ! $this->recipient_ID()) {
452
+			return null;
453
+		}
454
+
455
+		return $this->get_first_related($this->recipient_type());
456
+	}
457
+
458
+
459
+	/**
460
+	 * Sets recipient_type
461
+	 *
462
+	 * @param string $recipient_type
463
+	 */
464
+	public function set_recipient_type($recipient_type)
465
+	{
466
+		$this->set('MSG_recipient_type', $recipient_type);
467
+	}
468
+
469
+
470
+	/**
471
+	 * Gets content
472
+	 *
473
+	 * @return string
474
+	 */
475
+	public function content()
476
+	{
477
+		return $this->get('MSG_content');
478
+	}
479
+
480
+
481
+	/**
482
+	 * Sets content
483
+	 *
484
+	 * @param string $content
485
+	 */
486
+	public function set_content($content)
487
+	{
488
+		$this->set('MSG_content', $content);
489
+	}
490
+
491
+
492
+	/**
493
+	 * Gets subject
494
+	 *
495
+	 * @return string
496
+	 */
497
+	public function subject()
498
+	{
499
+		return $this->get('MSG_subject');
500
+	}
501
+
502
+
503
+	/**
504
+	 * Sets subject
505
+	 *
506
+	 * @param string $subject
507
+	 */
508
+	public function set_subject($subject)
509
+	{
510
+		$this->set('MSG_subject', $subject);
511
+	}
512
+
513
+
514
+	/**
515
+	 * Gets to
516
+	 *
517
+	 * @return string
518
+	 */
519
+	public function to()
520
+	{
521
+		$to = $this->get('MSG_to');
522
+		return empty($to) ? __('No recipient', 'event_espresso') : $to;
523
+	}
524
+
525
+
526
+	/**
527
+	 * Sets to
528
+	 *
529
+	 * @param string $to
530
+	 */
531
+	public function set_to($to)
532
+	{
533
+		$this->set('MSG_to', $to);
534
+	}
535
+
536
+
537
+	/**
538
+	 * Gets from
539
+	 *
540
+	 * @return string
541
+	 */
542
+	public function from()
543
+	{
544
+		return $this->get('MSG_from');
545
+	}
546
+
547
+
548
+	/**
549
+	 * Sets from
550
+	 *
551
+	 * @param string $from
552
+	 */
553
+	public function set_from($from)
554
+	{
555
+		$this->set('MSG_from', $from);
556
+	}
557
+
558
+
559
+	/**
560
+	 * Gets priority
561
+	 *
562
+	 * @return int
563
+	 */
564
+	public function priority()
565
+	{
566
+		return $this->get('MSG_priority');
567
+	}
568
+
569
+
570
+	/**
571
+	 * Sets priority
572
+	 * Note.  Send Now Messengers always override any priority that may be set on a Message.  So
573
+	 * this method calls the send_now method to verify that.
574
+	 *
575
+	 * @param int $priority
576
+	 */
577
+	public function set_priority($priority)
578
+	{
579
+		$priority = $this->send_now() ? EEM_Message::priority_high : $priority;
580
+		parent::set('MSG_priority', $priority);
581
+	}
582
+
583
+
584
+	/**
585
+	 * Overrides parent::set method so we can capture any sets for priority.
586
+	 *
587
+	 * @see parent::set() for phpdocs
588
+	 * @param string $field_name
589
+	 * @param mixed  $field_value
590
+	 * @param bool   $use_default
591
+	 * @throws EE_Error
592
+	 */
593
+	public function set($field_name, $field_value, $use_default = false)
594
+	{
595
+		if ($field_name === 'MSG_priority') {
596
+			$this->set_priority($field_value);
597
+		}
598
+		parent::set($field_name, $field_value, $use_default);
599
+	}
600
+
601
+
602
+	/**
603
+	 * @return bool
604
+	 * @throws \EE_Error
605
+	 */
606
+	public function send_now()
607
+	{
608
+		$send_now = $this->valid_messenger() && $this->messenger_object()->send_now() ? EEM_Message::priority_high : $this->priority();
609
+		return $send_now === EEM_Message::priority_high ? true : false;
610
+	}
611
+
612
+
613
+	/**
614
+	 * Gets STS_ID
615
+	 *
616
+	 * @return string
617
+	 */
618
+	public function STS_ID()
619
+	{
620
+		return $this->get('STS_ID');
621
+	}
622
+
623
+
624
+	/**
625
+	 * Sets STS_ID
626
+	 *
627
+	 * @param string $STS_ID
628
+	 */
629
+	public function set_STS_ID($STS_ID)
630
+	{
631
+		$this->set('STS_ID', $STS_ID);
632
+	}
633
+
634
+
635
+	/**
636
+	 * Gets created
637
+	 *
638
+	 * @return string
639
+	 */
640
+	public function created()
641
+	{
642
+		return $this->get('MSG_created');
643
+	}
644
+
645
+
646
+	/**
647
+	 * Sets created
648
+	 *
649
+	 * @param string $created
650
+	 */
651
+	public function set_created($created)
652
+	{
653
+		$this->set('MSG_created', $created);
654
+	}
655
+
656
+
657
+	/**
658
+	 * Gets modified
659
+	 *
660
+	 * @return string
661
+	 */
662
+	public function modified()
663
+	{
664
+		return $this->get('MSG_modified');
665
+	}
666
+
667
+
668
+	/**
669
+	 * Sets modified
670
+	 *
671
+	 * @param string $modified
672
+	 */
673
+	public function set_modified($modified)
674
+	{
675
+		$this->set('MSG_modified', $modified);
676
+	}
677
+
678
+
679
+	/**
680
+	 * Sets generation data for this message.
681
+	 *
682
+	 * @param mixed $data
683
+	 */
684
+	public function set_generation_data($data)
685
+	{
686
+		$this->set_field_or_extra_meta('MSG_generation_data', $data);
687
+	}
688
+
689
+
690
+	/**
691
+	 * Returns any set generation data for this message.
692
+	 *
693
+	 * @return mixed|null
694
+	 */
695
+	public function get_generation_data()
696
+	{
697
+		return $this->get_field_or_extra_meta('MSG_generation_data');
698
+	}
699
+
700
+
701
+	/**
702
+	 * Gets any error message.
703
+	 *
704
+	 * @return mixed|null
705
+	 */
706
+	public function error_message()
707
+	{
708
+		return $this->get_field_or_extra_meta('MSG_error');
709
+	}
710
+
711
+
712
+	/**
713
+	 * Sets an error message.
714
+	 *
715
+	 * @param $message
716
+	 * @return bool|int
717
+	 */
718
+	public function set_error_message($message)
719
+	{
720
+		return $this->set_field_or_extra_meta('MSG_error', $message);
721
+	}
722
+
723
+
724
+	/**
725
+	 * This retrieves the associated template pack with this message.
726
+	 *
727
+	 * @return EE_Messages_Template_Pack | null
728
+	 */
729
+	public function get_template_pack()
730
+	{
731
+		/**
732
+		 * This is deprecated functionality that will be removed eventually but included here now for backward compat.
733
+		 */
734
+		if ( ! empty($this->template_pack)) {
735
+			return $this->template_pack;
736
+		}
737
+		/** @type EE_Message_Template_Group $grp */
738
+		$grp = $this->get_first_related('Message_Template_Group');
739
+		//if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
740
+		if ( ! $grp instanceof EE_Message_Template_Group) {
741
+			$grp = EEM_Message_Template_Group::instance()->get_one(
742
+				array(
743
+					array(
744
+						'MTP_messenger'    => $this->messenger(),
745
+						'MTP_message_type' => $this->message_type(),
746
+						'MTP_is_global'    => true,
747
+					),
748
+				)
749
+			);
750
+		}
751
+
752
+		return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack() : null;
753
+	}
754
+
755
+
756
+	/**
757
+	 * Retrieves the variation used for generating this message.
758
+	 *
759
+	 * @return string
760
+	 */
761
+	public function get_template_pack_variation()
762
+	{
763
+		/**
764
+		 * This is deprecated functionality that will be removed eventually but included here now for backward compat.
765
+		 */
766
+		if ( ! empty($this->template_variation)) {
767
+			return $this->template_variation;
768
+		}
769
+
770
+		/** @type EE_Message_Template_Group $grp */
771
+		$grp = $this->get_first_related('Message_Template_Group');
772
+
773
+		//if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
774
+		if ( ! $grp instanceof EE_Message_Template_Group) {
775
+			$grp = EEM_Message_Template_Group::instance()->get_one(
776
+				array(
777
+					array(
778
+						'MTP_messenger'    => $this->messenger(),
779
+						'MTP_message_type' => $this->message_type(),
780
+						'MTP_is_global'    => true,
781
+					),
782
+				)
783
+			);
784
+		}
785
+
786
+		return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack_variation() : '';
787
+	}
788
+
789
+	/**
790
+	 * Return the link to the admin details for the object.
791
+	 *
792
+	 * @return string
793
+	 */
794
+	public function get_admin_details_link()
795
+	{
796
+		EE_Registry::instance()->load_helper('URL');
797
+		EE_Registry::instance()->load_helper('MSG_Template');
798
+		switch ($this->STS_ID()) {
799
+			case EEM_Message::status_failed :
800
+			case EEM_Message::status_debug_only :
801
+				return EEH_MSG_Template::generate_error_display_trigger($this);
802
+				break;
803
+
804
+			case EEM_Message::status_sent :
805
+				return EEH_MSG_Template::generate_browser_trigger($this);
806
+				break;
807
+
808
+			default :
809
+				return '';
810
+		}
811
+	}
812
+
813
+	/**
814
+	 * Returns the link to the editor for the object.  Sometimes this is the same as the details.
815
+	 *
816
+	 * @return string
817
+	 */
818
+	public function get_admin_edit_link()
819
+	{
820
+		return $this->get_admin_details_link();
821
+	}
822
+
823
+	/**
824
+	 * Returns the link to a settings page for the object.
825
+	 *
826
+	 * @return string
827
+	 */
828
+	public function get_admin_settings_link()
829
+	{
830
+		EE_Registry::instance()->load_helper('URL');
831
+		return EEH_URL::add_query_args_and_nonce(
832
+			array(
833
+				'page'   => 'espresso_messages',
834
+				'action' => 'settings',
835
+			),
836
+			admin_url('admin.php')
837
+		);
838
+	}
839
+
840
+	/**
841
+	 * Returns the link to the "overview" for the object (typically the "list table" view).
842
+	 *
843
+	 * @return string
844
+	 */
845
+	public function get_admin_overview_link()
846
+	{
847
+		EE_Registry::instance()->load_helper('URL');
848
+		return EEH_URL::add_query_args_and_nonce(
849
+			array(
850
+				'page'   => 'espresso_messages',
851
+				'action' => 'default',
852
+			),
853
+			admin_url('admin.php')
854
+		);
855
+	}
856
+
857
+
858
+	/**
859
+	 * This sets the EEM_Message::status_messenger_executing class on the message and the appropriate error message for
860
+	 * it.
861
+	 * Note this also SAVES the current message object to the db because it adds an error message to accompany the status.
862
+	 *
863
+	 */
864
+	public function set_messenger_is_executing()
865
+	{
866
+		$this->set_STS_ID( EEM_Message::status_messenger_executing );
867
+		$this->set_error_message(
868
+			esc_html__(
869
+				'A message with this status indicates that there was a problem that occurred while the message was being
870 870
                 processed by the messenger.  It is still possible that the message was sent successfully, but at some
871 871
                 point during the processing there was a failure.  This usually is indicative of a timeout issue with PHP 
872 872
                 or memory limits being reached.  If you see this repeatedly you may want to consider upgrading the memory 
873 873
                 available to PHP on your server.',
874
-                'event_espresso'
875
-            )
876
-        );
877
-    }
874
+				'event_espresso'
875
+			)
876
+		);
877
+	}
878 878
 }
879 879
 /* End of file EE_Message.class.php */
880 880
 /* Location: /core/db_classes/EE_Message.class.php */
881 881
\ No newline at end of file
Please login to merge, or discard this patch.
core/libraries/messages/EE_Messages_Queue.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -603,7 +603,7 @@
 block discarded – undo
603 603
      * @param EE_Message      $message
604 604
      * @param EE_messenger    $messenger
605 605
      * @param EE_message_type $message_type
606
-     * @param                 $test_send
606
+     * @param                 boolean $test_send
607 607
      * @return bool   true means all went well, false means, not so much.
608 608
      */
609 609
     protected function _do_preview(
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 use \EventEspresso\core\exceptions\SendMessageException;
3 3
 
4
-if (! defined('EVENT_ESPRESSO_VERSION')) {
4
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
5 5
     exit('No direct script access allowed');
6 6
 }
7 7
 
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
             'order_by' => $this->_get_priority_orderby(),
183 183
             'limit'    => $this->_batch_count,
184 184
         );
185
-        $messages   = EEM_Message::instance()->get_all($query_args);
185
+        $messages = EEM_Message::instance()->get_all($query_args);
186 186
 
187 187
         if ( ! $messages) {
188 188
             return false; //nothing to generate
@@ -287,7 +287,7 @@  discard block
 block discarded – undo
287 287
      */
288 288
     protected function _get_lock_key($type = EE_Messages_Queue::action_generating)
289 289
     {
290
-        return '_ee_lock_' . $type;
290
+        return '_ee_lock_'.$type;
291 291
     }
292 292
 
293 293
 
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
      */
300 300
     protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating)
301 301
     {
302
-        return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type);
302
+        return (int) apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type);
303 303
     }
304 304
 
305 305
 
@@ -321,7 +321,7 @@  discard block
 block discarded – undo
321 321
      */
322 322
     protected function _get_rate_limit_expiry()
323 323
     {
324
-        return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS);
324
+        return (int) apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS);
325 325
     }
326 326
 
327 327
 
@@ -332,7 +332,7 @@  discard block
 block discarded – undo
332 332
      */
333 333
     protected function _default_rate_limit()
334 334
     {
335
-        return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200);
335
+        return (int) apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200);
336 336
     }
337 337
 
338 338
 
@@ -413,7 +413,7 @@  discard block
 block discarded – undo
413 413
         $rate_limit = $this->get_rate_limit();
414 414
         $new_limit  = $rate_limit - $batch_completed;
415 415
         //updating the transient option directly to avoid resetting the expiry.
416
-        update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit);
416
+        update_option('_transient_'.$this->_get_rate_limit_key(), $new_limit);
417 417
     }
418 418
 
419 419
 
@@ -494,7 +494,7 @@  discard block
 block discarded – undo
494 494
             /** @type EE_Message $message */
495 495
             $message = $this->_message_repository->current();
496 496
             //only process things that are queued for sending
497
-            if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) {
497
+            if ( ! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) {
498 498
                 $this->_message_repository->next();
499 499
                 continue;
500 500
             }
@@ -504,13 +504,13 @@  discard block
 block discarded – undo
504 504
                 continue;
505 505
             }
506 506
             //error checking
507
-            if (! $message->valid_messenger()) {
507
+            if ( ! $message->valid_messenger()) {
508 508
                 $error_messages[] = sprintf(
509 509
                     __('The %s messenger is not active at time of sending.', 'event_espresso'),
510 510
                     $message->messenger()
511 511
                 );
512 512
             }
513
-            if (! $message->valid_message_type()) {
513
+            if ( ! $message->valid_message_type()) {
514 514
                 $error_messages[] = sprintf(
515 515
                     __('The %s message type is not active at the time of sending.', 'event_espresso'),
516 516
                     $message->message_type()
@@ -675,7 +675,7 @@  discard block
 block discarded – undo
675 675
      */
676 676
     protected function _set_error_message(EE_Message $message, $error_messages)
677 677
     {
678
-        $error_messages = (array)$error_messages;
678
+        $error_messages = (array) $error_messages;
679 679
         if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) {
680 680
             $notices          = EE_Error::has_notices();
681 681
             $error_messages[] = __(
@@ -690,7 +690,7 @@  discard block
 block discarded – undo
690 690
         }
691 691
         if (count($error_messages) > 0) {
692 692
             $msg = __('Message was not executed successfully.', 'event_espresso');
693
-            $msg = $msg . "\n" . implode("\n", $error_messages);
693
+            $msg = $msg."\n".implode("\n", $error_messages);
694 694
             $message->set_error_message($msg);
695 695
         }
696 696
     }
Please login to merge, or discard this patch.
Indentation   +677 added lines, -677 removed lines patch added patch discarded remove patch
@@ -2,7 +2,7 @@  discard block
 block discarded – undo
2 2
 use \EventEspresso\core\exceptions\SendMessageException;
3 3
 
4 4
 if (! defined('EVENT_ESPRESSO_VERSION')) {
5
-    exit('No direct script access allowed');
5
+	exit('No direct script access allowed');
6 6
 }
7 7
 
8 8
 /**
@@ -18,681 +18,681 @@  discard block
 block discarded – undo
18 18
 {
19 19
 
20 20
 
21
-    /**
22
-     * @type    string  reference for sending action
23
-     */
24
-    const action_sending = 'sending';
25
-
26
-    /**
27
-     * @type    string  reference for generation action
28
-     */
29
-    const action_generating = 'generation';
30
-
31
-
32
-    /**
33
-     * @type EE_Message_Repository $_message_repository
34
-     */
35
-    protected $_message_repository;
36
-
37
-    /**
38
-     * Sets the limit of how many messages are generated per process.
39
-     *
40
-     * @type int
41
-     */
42
-    protected $_batch_count;
43
-
44
-    /**
45
-     * Sets the limit of how many messages can be sent per hour.
46
-     *
47
-     * @type int
48
-     */
49
-    protected $_rate_limit;
50
-
51
-    /**
52
-     * This is an array of cached queue items being stored in this object.
53
-     * The array keys will be the ID of the EE_Message in the db if saved.  If the EE_Message
54
-     * is not saved to the db then its key will be an increment of "UNS" (i.e. UNS1, UNS2 etc.)
55
-     *
56
-     * @type EE_Message[]
57
-     */
58
-    protected $_cached_queue_items;
59
-
60
-    /**
61
-     * Tracks the number of unsaved queue items.
62
-     *
63
-     * @type int
64
-     */
65
-    protected $_unsaved_count = 0;
66
-
67
-    /**
68
-     * used to record if a do_messenger_hooks has already been called for a message type.  This prevents multiple
69
-     * hooks getting fired if users have setup their action/filter hooks to prevent duplicate calls.
70
-     *
71
-     * @type array
72
-     */
73
-    protected $_did_hook = array();
74
-
75
-
76
-    /**
77
-     * Constructor.
78
-     * Setup all the initial properties and load a EE_Message_Repository.
79
-     *
80
-     * @param \EE_Message_Repository $message_repository
81
-     */
82
-    public function __construct(EE_Message_Repository $message_repository)
83
-    {
84
-        $this->_batch_count        = apply_filters('FHEE__EE_Messages_Queue___batch_count', 50);
85
-        $this->_rate_limit         = $this->get_rate_limit();
86
-        $this->_message_repository = $message_repository;
87
-    }
88
-
89
-
90
-    /**
91
-     * Add a EE_Message object to the queue
92
-     *
93
-     * @param EE_Message $message
94
-     * @param array      $data         This will be an array of data to attach to the object in the repository.  If the
95
-     *                                 object is persisted, this data will be saved on an extra_meta object related to
96
-     *                                 EE_Message.
97
-     * @param  bool      $preview      Whether this EE_Message represents a preview or not.
98
-     * @param  bool      $test_send    This indicates whether to do a test send instead of actual send. A test send will
99
-     *                                 use the messenger send method but typically is based on preview data.
100
-     * @return bool          Whether the message was successfully added to the repository or not.
101
-     */
102
-    public function add(EE_Message $message, $data = array(), $preview = false, $test_send = false)
103
-    {
104
-        $data['preview']   = $preview;
105
-        $data['test_send'] = $test_send;
106
-        return $this->_message_repository->add($message, $data);
107
-    }
108
-
109
-
110
-    /**
111
-     * Removes EE_Message from _queue that matches the given EE_Message if the pointer is on a matching EE_Message
112
-     *
113
-     * @param EE_Message $message The message to detach from the queue
114
-     * @param bool       $persist This flag indicates whether to attempt to delete the object from the db as well.
115
-     * @return bool
116
-     */
117
-    public function remove(EE_Message $message, $persist = false)
118
-    {
119
-        if ($persist && $this->_message_repository->current() !== $message) {
120
-            //get pointer on right message
121
-            if ($this->_message_repository->has($message)) {
122
-                $this->_message_repository->rewind();
123
-                while ($this->_message_repository->valid()) {
124
-                    if ($this->_message_repository->current() === $message) {
125
-                        break;
126
-                    }
127
-                    $this->_message_repository->next();
128
-                }
129
-            } else {
130
-                return false;
131
-            }
132
-        }
133
-        return $persist ? $this->_message_repository->delete() : $this->_message_repository->remove($message);
134
-    }
135
-
136
-
137
-    /**
138
-     * Persists all queued EE_Message objects to the db.
139
-     *
140
-     * @param bool $do_hooks_only       @see EE_Message_Repository::saveAll
141
-     * @return array @see EE_Messages_Repository::saveAll() for return values.
142
-     */
143
-    public function save($do_hooks_only = false)
144
-    {
145
-        return $this->_message_repository->saveAll($do_hooks_only);
146
-    }
147
-
148
-
149
-    /**
150
-     * @return EE_Message_Repository
151
-     */
152
-    public function get_message_repository()
153
-    {
154
-        return $this->_message_repository;
155
-    }
156
-
157
-
158
-    /**
159
-     * This does the following things:
160
-     * 1. Checks if there is a lock on generation (prevents race conditions).  If there is a lock then exits (return
161
-     * false).
162
-     * 2. If no lock, sets lock, then retrieves a batch of non-generated EE_Message objects and adds to queue
163
-     * 3. Returns bool.  True = batch ready.  False = no batch ready (or nothing available for generation).
164
-     * Note: Callers should make sure they release the lock otherwise batch generation will be prevented from
165
-     * continuing. The lock is on a transient that is set to expire after one hour as a fallback in case locks are not
166
-     * removed.
167
-     *
168
-     * @return bool  true if successfully retrieved batch, false no batch ready.
169
-     */
170
-    public function get_batch_to_generate()
171
-    {
172
-        if ($this->is_locked(EE_Messages_Queue::action_generating)) {
173
-            return false;
174
-        }
175
-
176
-        //lock batch generation to prevent race conditions.
177
-        $this->lock_queue(EE_Messages_Queue::action_generating);
178
-
179
-        $query_args = array(
180
-            // key 0 = where conditions
181
-            0          => array('STS_ID' => EEM_Message::status_incomplete),
182
-            'order_by' => $this->_get_priority_orderby(),
183
-            'limit'    => $this->_batch_count,
184
-        );
185
-        $messages   = EEM_Message::instance()->get_all($query_args);
186
-
187
-        if ( ! $messages) {
188
-            return false; //nothing to generate
189
-        }
190
-
191
-        foreach ($messages as $message) {
192
-            if ($message instanceof EE_Message) {
193
-                $data = $message->all_extra_meta_array();
194
-                $this->add($message, $data);
195
-            }
196
-        }
197
-        return true;
198
-    }
199
-
200
-
201
-    /**
202
-     * This does the following things:
203
-     * 1. Checks if there is a lock on sending (prevents race conditions).  If there is a lock then exits (return
204
-     * false).
205
-     * 2. Grabs the allowed number of messages to send for the rate_limit.  If cannot send any more messages, then
206
-     * return false.
207
-     * 2. If no lock, sets lock, then retrieves a batch of EE_Message objects, adds to queue and triggers execution.
208
-     * 3. On success or unsuccessful send, sets status appropriately.
209
-     * 4. Saves messages via the queue
210
-     * 5. Releases lock.
211
-     *
212
-     * @return bool  true on success, false if something preventing sending (i.e. lock set).  Note: true does not
213
-     *               necessarily mean that all messages were successfully sent.  It just means that this method
214
-     *               successfully completed. On true, client may want to call $this->count_STS_in_queue(
215
-     *               EEM_Message::status_failed ) to see if any failed EE_Message objects.  Each failed message object
216
-     *               will also have a saved error message on it to assist with notifying user.
217
-     */
218
-    public function get_to_send_batch_and_send()
219
-    {
220
-        if ($this->is_locked(EE_Messages_Queue::action_sending) || $this->_rate_limit < 1) {
221
-            return false;
222
-        }
223
-
224
-        $this->lock_queue(EE_Messages_Queue::action_sending);
225
-
226
-        $batch = $this->_batch_count < $this->_rate_limit ? $this->_batch_count : $this->_rate_limit;
227
-
228
-        $query_args = array(
229
-            // key 0 = where conditions
230
-            0          => array('STS_ID' => array('IN', EEM_Message::instance()->stati_indicating_to_send())),
231
-            'order_by' => $this->_get_priority_orderby(),
232
-            'limit'    => $batch,
233
-        );
234
-
235
-        $messages_to_send = EEM_Message::instance()->get_all($query_args);
236
-
237
-
238
-        //any to send?
239
-        if ( ! $messages_to_send) {
240
-            $this->unlock_queue(EE_Messages_Queue::action_sending);
241
-            return false;
242
-        }
243
-
244
-        //add to queue.
245
-        foreach ($messages_to_send as $message) {
246
-            if ($message instanceof EE_Message) {
247
-                $this->add($message);
248
-            }
249
-        }
250
-
251
-        //send messages  (this also updates the rate limit)
252
-        $this->execute();
253
-
254
-        //release lock
255
-        $this->unlock_queue(EE_Messages_Queue::action_sending);
256
-        return true;
257
-    }
258
-
259
-
260
-    /**
261
-     * Locks the queue so that no other queues can call the "batch" methods.
262
-     *
263
-     * @param   string $type The type of queue being locked.
264
-     */
265
-    public function lock_queue($type = EE_Messages_Queue::action_generating)
266
-    {
267
-        set_transient($this->_get_lock_key($type), 1, $this->_get_lock_expiry($type));
268
-    }
269
-
270
-
271
-    /**
272
-     * Unlocks the queue so that batch methods can be used.
273
-     *
274
-     * @param   string $type The type of queue being unlocked.
275
-     */
276
-    public function unlock_queue($type = EE_Messages_Queue::action_generating)
277
-    {
278
-        delete_transient($this->_get_lock_key($type));
279
-    }
280
-
281
-
282
-    /**
283
-     * Retrieve the key used for the lock transient.
284
-     *
285
-     * @param string $type The type of lock.
286
-     * @return string
287
-     */
288
-    protected function _get_lock_key($type = EE_Messages_Queue::action_generating)
289
-    {
290
-        return '_ee_lock_' . $type;
291
-    }
292
-
293
-
294
-    /**
295
-     * Retrieve the expiry time for the lock transient.
296
-     *
297
-     * @param string $type The type of lock
298
-     * @return int   time to expiry in seconds.
299
-     */
300
-    protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating)
301
-    {
302
-        return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type);
303
-    }
304
-
305
-
306
-    /**
307
-     * Returns the key used for rate limit transient.
308
-     *
309
-     * @return string
310
-     */
311
-    protected function _get_rate_limit_key()
312
-    {
313
-        return '_ee_rate_limit';
314
-    }
315
-
316
-
317
-    /**
318
-     * Returns the rate limit expiry time.
319
-     *
320
-     * @return int
321
-     */
322
-    protected function _get_rate_limit_expiry()
323
-    {
324
-        return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS);
325
-    }
326
-
327
-
328
-    /**
329
-     * Returns the default rate limit for sending messages.
330
-     *
331
-     * @return int
332
-     */
333
-    protected function _default_rate_limit()
334
-    {
335
-        return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200);
336
-    }
337
-
338
-
339
-    /**
340
-     * Return the orderby array for priority.
341
-     *
342
-     * @return array
343
-     */
344
-    protected function _get_priority_orderby()
345
-    {
346
-        return array(
347
-            'MSG_priority' => 'ASC',
348
-            'MSG_modified' => 'DESC',
349
-        );
350
-    }
351
-
352
-
353
-    /**
354
-     * Returns whether batch methods are "locked" or not.
355
-     *
356
-     * @param  string $type The type of lock being checked for.
357
-     * @return bool
358
-     */
359
-    public function is_locked($type = EE_Messages_Queue::action_generating)
360
-    {
361
-        /**
362
-         * This filters the default is_locked behaviour.
363
-         */
364
-        $is_locked = filter_var(
365
-            apply_filters(
366
-                'FHEE__EE_Messages_Queue__is_locked',
367
-                get_transient($this->_get_lock_key($type)),
368
-                $this
369
-            ),
370
-            FILTER_VALIDATE_BOOLEAN
371
-        );
372
-
373
-        /**
374
-         * @see usage of this filter in EE_Messages_Queue::initiate_request_by_priority() method.
375
-         *            Also implemented here because messages processed on the same request should not have any locks applied.
376
-         */
377
-        if (
378
-            apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false)
379
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
380
-        ) {
381
-            $is_locked = false;
382
-        }
383
-
384
-
385
-        return $is_locked;
386
-    }
387
-
388
-
389
-    /**
390
-     * Retrieves the rate limit that may be cached as a transient.
391
-     * If the rate limit is not set, then this sets the default rate limit and expiry and returns it.
392
-     *
393
-     * @return int
394
-     */
395
-    public function get_rate_limit()
396
-    {
397
-        if ( ! $rate_limit = get_transient($this->_get_rate_limit_key())) {
398
-            $rate_limit = $this->_default_rate_limit();
399
-            set_transient($this->_get_rate_limit_key(), $rate_limit, $this->_get_rate_limit_key());
400
-        }
401
-        return $rate_limit;
402
-    }
403
-
404
-
405
-    /**
406
-     * This updates existing rate limit with the new limit which is the old minus the batch.
407
-     *
408
-     * @param int $batch_completed This sets the new rate limit based on the given batch that was completed.
409
-     */
410
-    public function set_rate_limit($batch_completed)
411
-    {
412
-        //first get the most up to date rate limit (in case its expired and reset)
413
-        $rate_limit = $this->get_rate_limit();
414
-        $new_limit  = $rate_limit - $batch_completed;
415
-        //updating the transient option directly to avoid resetting the expiry.
416
-        update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit);
417
-    }
418
-
419
-
420
-    /**
421
-     * This method checks the queue for ANY EE_Message objects with a priority matching the given priority passed in.
422
-     * If that exists, then we immediately initiate a non-blocking request to do the requested action type.
423
-     * Note: Keep in mind that there is the possibility that the request will not execute if there is already another
424
-     * request running on a queue for the given task.
425
-     *
426
-     * @param string $task     This indicates what type of request is going to be initiated.
427
-     * @param int    $priority This indicates the priority that triggers initiating the request.
428
-     */
429
-    public function initiate_request_by_priority($task = 'generate', $priority = EEM_Message::priority_high)
430
-    {
431
-        //determine what status is matched with the priority as part of the trigger conditions.
432
-        $status = $task == 'generate'
433
-            ? EEM_Message::status_incomplete
434
-            : EEM_Message::instance()->stati_indicating_to_send();
435
-        // always make sure we save because either this will get executed immediately on a separate request
436
-        // or remains in the queue for the regularly scheduled queue batch.
437
-        $this->save();
438
-        /**
439
-         * This filter/option allows users to override processing of messages on separate requests and instead have everything
440
-         * happen on the same request.  If this is utilized remember:
441
-         * - message priorities don't matter
442
-         * - existing unprocessed messages in the queue will not get processed unless manually triggered.
443
-         * - things will be perceived to take longer to happen for end users (i.e. registrations) because of the additional
444
-         *   processing happening on the same request.
445
-         * - any race condition protection (locks) are removed because they don't apply when things are processed on
446
-         *   the same request.
447
-         */
448
-        if (
449
-            apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false)
450
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
451
-        ) {
452
-            $messages_processor = EE_Registry::instance()->load_lib('Messages_Processor');
453
-            if ($messages_processor instanceof EE_Messages_Processor) {
454
-                return $messages_processor->process_immediately_from_queue($this);
455
-            }
456
-            //if we get here then that means the messages processor couldn't be loaded so messages will just remain
457
-            //queued for manual triggering by end user.
458
-        }
459
-
460
-        if ($this->_message_repository->count_by_priority_and_status($priority, $status)) {
461
-            EE_Messages_Scheduler::initiate_scheduled_non_blocking_request($task);
462
-        }
463
-    }
464
-
465
-
466
-    /**
467
-     *  Loops through the EE_Message objects in the _queue and calls the messenger send methods for each message.
468
-     *
469
-     * @param   bool     $save                    Used to indicate whether to save the message queue after sending
470
-     *                                            (default will save).
471
-     * @param   mixed    $sending_messenger       (optional) When the sending messenger is different than
472
-     *                                            what is on the EE_Message object in the queue.
473
-     *                                            For instance, showing the browser view of an email message,
474
-     *                                            or giving a pdf generated view of an html document.
475
-     *                                            This should be an instance of EE_messenger but if you call this
476
-     *                                            method
477
-     *                                            intending it to be a sending messenger but a valid one could not be
478
-     *                                            retrieved then send in an instance of EE_Error that contains the
479
-     *                                            related error message.
480
-     * @param   bool|int $by_priority             When set, this indicates that only messages
481
-     *                                            matching the given priority should be executed.
482
-     * @return int        Number of messages sent.  Note, 0 does not mean that no messages were processed.
483
-     *                                            Also, if the messenger is an request type messenger (or a preview),
484
-     *                                            its entirely possible that the messenger will exit before
485
-     */
486
-    public function execute($save = true, $sending_messenger = null, $by_priority = false)
487
-    {
488
-        $messages_sent   = 0;
489
-        $this->_did_hook = array();
490
-        $this->_message_repository->rewind();
491
-
492
-        while ($this->_message_repository->valid()) {
493
-            $error_messages = array();
494
-            /** @type EE_Message $message */
495
-            $message = $this->_message_repository->current();
496
-            //only process things that are queued for sending
497
-            if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) {
498
-                $this->_message_repository->next();
499
-                continue;
500
-            }
501
-            //if $by_priority is set and does not match then continue;
502
-            if ($by_priority && $by_priority != $message->priority()) {
503
-                $this->_message_repository->next();
504
-                continue;
505
-            }
506
-            //error checking
507
-            if (! $message->valid_messenger()) {
508
-                $error_messages[] = sprintf(
509
-                    __('The %s messenger is not active at time of sending.', 'event_espresso'),
510
-                    $message->messenger()
511
-                );
512
-            }
513
-            if (! $message->valid_message_type()) {
514
-                $error_messages[] = sprintf(
515
-                    __('The %s message type is not active at the time of sending.', 'event_espresso'),
516
-                    $message->message_type()
517
-                );
518
-            }
519
-            // if there was supposed to be a sending messenger for this message, but it was invalid/inactive,
520
-            // then it will instead be an EE_Error object, so let's check for that
521
-            if ($sending_messenger instanceof EE_Error) {
522
-                $error_messages[] = $sending_messenger->getMessage();
523
-            }
524
-            // if there are no errors, then let's process the message
525
-            if (empty($error_messages)) {
526
-                if ($save) {
527
-                    $message->set_messenger_is_executing();
528
-                }
529
-                if ($this->_process_message($message, $sending_messenger)) {
530
-                    $messages_sent++;
531
-                }
532
-            }
533
-            $this->_set_error_message($message, $error_messages);
534
-            //add modified time
535
-            $message->set_modified(time());
536
-            //we save each message after its processed to make sure its status persists in case PHP times-out or runs
537
-            //out of memory. @see https://events.codebasehq.com/projects/event-espresso/tickets/10281
538
-            if ($save) {
539
-                $message->save();
540
-            }
541
-
542
-            $this->_message_repository->next();
543
-        }
544
-        if ($save) {
545
-            $this->save(true);
546
-        }
547
-        return $messages_sent;
548
-    }
549
-
550
-
551
-    /**
552
-     * _process_message
553
-     *
554
-     * @param EE_Message $message
555
-     * @param mixed      $sending_messenger (optional)
556
-     * @return bool
557
-     */
558
-    protected function _process_message(EE_Message $message, $sending_messenger = null)
559
-    {
560
-        // these *should* have been validated in the execute() method above
561
-        $messenger    = $message->messenger_object();
562
-        $message_type = $message->message_type_object();
563
-        //do actions for sending messenger if it differs from generating messenger and swap values.
564
-        if (
565
-            $sending_messenger instanceof EE_messenger
566
-            && $messenger instanceof EE_messenger
567
-            && $sending_messenger->name != $messenger->name
568
-        ) {
569
-            $messenger->do_secondary_messenger_hooks($sending_messenger->name);
570
-            $messenger = $sending_messenger;
571
-        }
572
-        // send using messenger, but double check objects
573
-        if ($messenger instanceof EE_messenger && $message_type instanceof EE_message_type) {
574
-            //set hook for message type (but only if not using another messenger to send).
575
-            if ( ! isset($this->_did_hook[$message_type->name])) {
576
-                $message_type->do_messenger_hooks($messenger);
577
-                $this->_did_hook[$message_type->name] = 1;
578
-            }
579
-            //if preview then use preview method
580
-            return $this->_message_repository->is_preview()
581
-                ? $this->_do_preview($message, $messenger, $message_type, $this->_message_repository->is_test_send())
582
-                : $this->_do_send($message, $messenger, $message_type);
583
-        }
584
-        return false;
585
-    }
586
-
587
-
588
-    /**
589
-     * The intention of this method is to count how many EE_Message objects
590
-     * are in the queue with a given status.
591
-     * Example usage:
592
-     * After a caller calls the "EE_Message_Queue::execute()" method, the caller can check if there were any failed
593
-     * sends by calling $queue->count_STS_in_queue( EEM_Message_Queue::status_failed ).
594
-     *
595
-     * @param array|string $status Stati to check for in queue
596
-     * @return int  Count of EE_Message's matching the given status.
597
-     */
598
-    public function count_STS_in_queue($status)
599
-    {
600
-        $count  = 0;
601
-        $status = is_array($status) ? $status : array($status);
602
-        $this->_message_repository->rewind();
603
-        foreach ($this->_message_repository as $message) {
604
-            if (in_array($message->STS_ID(), $status)) {
605
-                $count++;
606
-            }
607
-        }
608
-        return $count;
609
-    }
610
-
611
-
612
-    /**
613
-     * Executes the get_preview method on the provided messenger.
614
-     *
615
-     * @param EE_Message      $message
616
-     * @param EE_messenger    $messenger
617
-     * @param EE_message_type $message_type
618
-     * @param                 $test_send
619
-     * @return bool   true means all went well, false means, not so much.
620
-     */
621
-    protected function _do_preview(
622
-        EE_Message $message,
623
-        EE_messenger $messenger,
624
-        EE_message_type $message_type,
625
-        $test_send
626
-    ) {
627
-        if ($preview = $messenger->get_preview($message, $message_type, $test_send)) {
628
-            if ( ! $test_send) {
629
-                $message->set_content($preview);
630
-            }
631
-            $message->set_STS_ID(EEM_Message::status_sent);
632
-            return true;
633
-        } else {
634
-            $message->set_STS_ID(EEM_Message::status_failed);
635
-            return false;
636
-        }
637
-    }
638
-
639
-
640
-    /**
641
-     * Executes the send method on the provided messenger
642
-     * EE_Messengers are expected to:
643
-     * - return true if the send was successful.
644
-     * - return false if the send was unsuccessful but can be tried again.
645
-     * - throw an Exception if the send was unsuccessful and cannot be tried again.
646
-     *
647
-     * @param EE_Message      $message
648
-     * @param EE_messenger    $messenger
649
-     * @param EE_message_type $message_type
650
-     * @return bool true means all went well, false means, not so much.
651
-     */
652
-    protected function _do_send(EE_Message $message, EE_messenger $messenger, EE_message_type $message_type)
653
-    {
654
-        try {
655
-            if ($messenger->send_message($message, $message_type)) {
656
-                $message->set_STS_ID(EEM_Message::status_sent);
657
-                return true;
658
-            } else {
659
-                $message->set_STS_ID(EEM_Message::status_retry);
660
-                return false;
661
-            }
662
-        } catch (SendMessageException $e) {
663
-            $message->set_STS_ID(EEM_Message::status_failed);
664
-            $message->set_error_message($e->getMessage());
665
-            return false;
666
-        }
667
-    }
668
-
669
-
670
-    /**
671
-     * This sets any necessary error messages on the message object and its status to failed.
672
-     *
673
-     * @param EE_Message $message
674
-     * @param array      $error_messages the response from the messenger.
675
-     */
676
-    protected function _set_error_message(EE_Message $message, $error_messages)
677
-    {
678
-        $error_messages = (array)$error_messages;
679
-        if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) {
680
-            $notices          = EE_Error::has_notices();
681
-            $error_messages[] = __(
682
-                'Messenger and Message Type were valid and active, but the messenger send method failed.',
683
-                'event_espresso'
684
-            );
685
-            if ($notices === 1) {
686
-                $notices           = EE_Error::get_vanilla_notices();
687
-                $notices['errors'] = isset($notices['errors']) ? $notices['errors'] : array();
688
-                $error_messages[]  = implode("\n", $notices['errors']);
689
-            }
690
-        }
691
-        if (count($error_messages) > 0) {
692
-            $msg = __('Message was not executed successfully.', 'event_espresso');
693
-            $msg = $msg . "\n" . implode("\n", $error_messages);
694
-            $message->set_error_message($msg);
695
-        }
696
-    }
21
+	/**
22
+	 * @type    string  reference for sending action
23
+	 */
24
+	const action_sending = 'sending';
25
+
26
+	/**
27
+	 * @type    string  reference for generation action
28
+	 */
29
+	const action_generating = 'generation';
30
+
31
+
32
+	/**
33
+	 * @type EE_Message_Repository $_message_repository
34
+	 */
35
+	protected $_message_repository;
36
+
37
+	/**
38
+	 * Sets the limit of how many messages are generated per process.
39
+	 *
40
+	 * @type int
41
+	 */
42
+	protected $_batch_count;
43
+
44
+	/**
45
+	 * Sets the limit of how many messages can be sent per hour.
46
+	 *
47
+	 * @type int
48
+	 */
49
+	protected $_rate_limit;
50
+
51
+	/**
52
+	 * This is an array of cached queue items being stored in this object.
53
+	 * The array keys will be the ID of the EE_Message in the db if saved.  If the EE_Message
54
+	 * is not saved to the db then its key will be an increment of "UNS" (i.e. UNS1, UNS2 etc.)
55
+	 *
56
+	 * @type EE_Message[]
57
+	 */
58
+	protected $_cached_queue_items;
59
+
60
+	/**
61
+	 * Tracks the number of unsaved queue items.
62
+	 *
63
+	 * @type int
64
+	 */
65
+	protected $_unsaved_count = 0;
66
+
67
+	/**
68
+	 * used to record if a do_messenger_hooks has already been called for a message type.  This prevents multiple
69
+	 * hooks getting fired if users have setup their action/filter hooks to prevent duplicate calls.
70
+	 *
71
+	 * @type array
72
+	 */
73
+	protected $_did_hook = array();
74
+
75
+
76
+	/**
77
+	 * Constructor.
78
+	 * Setup all the initial properties and load a EE_Message_Repository.
79
+	 *
80
+	 * @param \EE_Message_Repository $message_repository
81
+	 */
82
+	public function __construct(EE_Message_Repository $message_repository)
83
+	{
84
+		$this->_batch_count        = apply_filters('FHEE__EE_Messages_Queue___batch_count', 50);
85
+		$this->_rate_limit         = $this->get_rate_limit();
86
+		$this->_message_repository = $message_repository;
87
+	}
88
+
89
+
90
+	/**
91
+	 * Add a EE_Message object to the queue
92
+	 *
93
+	 * @param EE_Message $message
94
+	 * @param array      $data         This will be an array of data to attach to the object in the repository.  If the
95
+	 *                                 object is persisted, this data will be saved on an extra_meta object related to
96
+	 *                                 EE_Message.
97
+	 * @param  bool      $preview      Whether this EE_Message represents a preview or not.
98
+	 * @param  bool      $test_send    This indicates whether to do a test send instead of actual send. A test send will
99
+	 *                                 use the messenger send method but typically is based on preview data.
100
+	 * @return bool          Whether the message was successfully added to the repository or not.
101
+	 */
102
+	public function add(EE_Message $message, $data = array(), $preview = false, $test_send = false)
103
+	{
104
+		$data['preview']   = $preview;
105
+		$data['test_send'] = $test_send;
106
+		return $this->_message_repository->add($message, $data);
107
+	}
108
+
109
+
110
+	/**
111
+	 * Removes EE_Message from _queue that matches the given EE_Message if the pointer is on a matching EE_Message
112
+	 *
113
+	 * @param EE_Message $message The message to detach from the queue
114
+	 * @param bool       $persist This flag indicates whether to attempt to delete the object from the db as well.
115
+	 * @return bool
116
+	 */
117
+	public function remove(EE_Message $message, $persist = false)
118
+	{
119
+		if ($persist && $this->_message_repository->current() !== $message) {
120
+			//get pointer on right message
121
+			if ($this->_message_repository->has($message)) {
122
+				$this->_message_repository->rewind();
123
+				while ($this->_message_repository->valid()) {
124
+					if ($this->_message_repository->current() === $message) {
125
+						break;
126
+					}
127
+					$this->_message_repository->next();
128
+				}
129
+			} else {
130
+				return false;
131
+			}
132
+		}
133
+		return $persist ? $this->_message_repository->delete() : $this->_message_repository->remove($message);
134
+	}
135
+
136
+
137
+	/**
138
+	 * Persists all queued EE_Message objects to the db.
139
+	 *
140
+	 * @param bool $do_hooks_only       @see EE_Message_Repository::saveAll
141
+	 * @return array @see EE_Messages_Repository::saveAll() for return values.
142
+	 */
143
+	public function save($do_hooks_only = false)
144
+	{
145
+		return $this->_message_repository->saveAll($do_hooks_only);
146
+	}
147
+
148
+
149
+	/**
150
+	 * @return EE_Message_Repository
151
+	 */
152
+	public function get_message_repository()
153
+	{
154
+		return $this->_message_repository;
155
+	}
156
+
157
+
158
+	/**
159
+	 * This does the following things:
160
+	 * 1. Checks if there is a lock on generation (prevents race conditions).  If there is a lock then exits (return
161
+	 * false).
162
+	 * 2. If no lock, sets lock, then retrieves a batch of non-generated EE_Message objects and adds to queue
163
+	 * 3. Returns bool.  True = batch ready.  False = no batch ready (or nothing available for generation).
164
+	 * Note: Callers should make sure they release the lock otherwise batch generation will be prevented from
165
+	 * continuing. The lock is on a transient that is set to expire after one hour as a fallback in case locks are not
166
+	 * removed.
167
+	 *
168
+	 * @return bool  true if successfully retrieved batch, false no batch ready.
169
+	 */
170
+	public function get_batch_to_generate()
171
+	{
172
+		if ($this->is_locked(EE_Messages_Queue::action_generating)) {
173
+			return false;
174
+		}
175
+
176
+		//lock batch generation to prevent race conditions.
177
+		$this->lock_queue(EE_Messages_Queue::action_generating);
178
+
179
+		$query_args = array(
180
+			// key 0 = where conditions
181
+			0          => array('STS_ID' => EEM_Message::status_incomplete),
182
+			'order_by' => $this->_get_priority_orderby(),
183
+			'limit'    => $this->_batch_count,
184
+		);
185
+		$messages   = EEM_Message::instance()->get_all($query_args);
186
+
187
+		if ( ! $messages) {
188
+			return false; //nothing to generate
189
+		}
190
+
191
+		foreach ($messages as $message) {
192
+			if ($message instanceof EE_Message) {
193
+				$data = $message->all_extra_meta_array();
194
+				$this->add($message, $data);
195
+			}
196
+		}
197
+		return true;
198
+	}
199
+
200
+
201
+	/**
202
+	 * This does the following things:
203
+	 * 1. Checks if there is a lock on sending (prevents race conditions).  If there is a lock then exits (return
204
+	 * false).
205
+	 * 2. Grabs the allowed number of messages to send for the rate_limit.  If cannot send any more messages, then
206
+	 * return false.
207
+	 * 2. If no lock, sets lock, then retrieves a batch of EE_Message objects, adds to queue and triggers execution.
208
+	 * 3. On success or unsuccessful send, sets status appropriately.
209
+	 * 4. Saves messages via the queue
210
+	 * 5. Releases lock.
211
+	 *
212
+	 * @return bool  true on success, false if something preventing sending (i.e. lock set).  Note: true does not
213
+	 *               necessarily mean that all messages were successfully sent.  It just means that this method
214
+	 *               successfully completed. On true, client may want to call $this->count_STS_in_queue(
215
+	 *               EEM_Message::status_failed ) to see if any failed EE_Message objects.  Each failed message object
216
+	 *               will also have a saved error message on it to assist with notifying user.
217
+	 */
218
+	public function get_to_send_batch_and_send()
219
+	{
220
+		if ($this->is_locked(EE_Messages_Queue::action_sending) || $this->_rate_limit < 1) {
221
+			return false;
222
+		}
223
+
224
+		$this->lock_queue(EE_Messages_Queue::action_sending);
225
+
226
+		$batch = $this->_batch_count < $this->_rate_limit ? $this->_batch_count : $this->_rate_limit;
227
+
228
+		$query_args = array(
229
+			// key 0 = where conditions
230
+			0          => array('STS_ID' => array('IN', EEM_Message::instance()->stati_indicating_to_send())),
231
+			'order_by' => $this->_get_priority_orderby(),
232
+			'limit'    => $batch,
233
+		);
234
+
235
+		$messages_to_send = EEM_Message::instance()->get_all($query_args);
236
+
237
+
238
+		//any to send?
239
+		if ( ! $messages_to_send) {
240
+			$this->unlock_queue(EE_Messages_Queue::action_sending);
241
+			return false;
242
+		}
243
+
244
+		//add to queue.
245
+		foreach ($messages_to_send as $message) {
246
+			if ($message instanceof EE_Message) {
247
+				$this->add($message);
248
+			}
249
+		}
250
+
251
+		//send messages  (this also updates the rate limit)
252
+		$this->execute();
253
+
254
+		//release lock
255
+		$this->unlock_queue(EE_Messages_Queue::action_sending);
256
+		return true;
257
+	}
258
+
259
+
260
+	/**
261
+	 * Locks the queue so that no other queues can call the "batch" methods.
262
+	 *
263
+	 * @param   string $type The type of queue being locked.
264
+	 */
265
+	public function lock_queue($type = EE_Messages_Queue::action_generating)
266
+	{
267
+		set_transient($this->_get_lock_key($type), 1, $this->_get_lock_expiry($type));
268
+	}
269
+
270
+
271
+	/**
272
+	 * Unlocks the queue so that batch methods can be used.
273
+	 *
274
+	 * @param   string $type The type of queue being unlocked.
275
+	 */
276
+	public function unlock_queue($type = EE_Messages_Queue::action_generating)
277
+	{
278
+		delete_transient($this->_get_lock_key($type));
279
+	}
280
+
281
+
282
+	/**
283
+	 * Retrieve the key used for the lock transient.
284
+	 *
285
+	 * @param string $type The type of lock.
286
+	 * @return string
287
+	 */
288
+	protected function _get_lock_key($type = EE_Messages_Queue::action_generating)
289
+	{
290
+		return '_ee_lock_' . $type;
291
+	}
292
+
293
+
294
+	/**
295
+	 * Retrieve the expiry time for the lock transient.
296
+	 *
297
+	 * @param string $type The type of lock
298
+	 * @return int   time to expiry in seconds.
299
+	 */
300
+	protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating)
301
+	{
302
+		return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type);
303
+	}
304
+
305
+
306
+	/**
307
+	 * Returns the key used for rate limit transient.
308
+	 *
309
+	 * @return string
310
+	 */
311
+	protected function _get_rate_limit_key()
312
+	{
313
+		return '_ee_rate_limit';
314
+	}
315
+
316
+
317
+	/**
318
+	 * Returns the rate limit expiry time.
319
+	 *
320
+	 * @return int
321
+	 */
322
+	protected function _get_rate_limit_expiry()
323
+	{
324
+		return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS);
325
+	}
326
+
327
+
328
+	/**
329
+	 * Returns the default rate limit for sending messages.
330
+	 *
331
+	 * @return int
332
+	 */
333
+	protected function _default_rate_limit()
334
+	{
335
+		return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200);
336
+	}
337
+
338
+
339
+	/**
340
+	 * Return the orderby array for priority.
341
+	 *
342
+	 * @return array
343
+	 */
344
+	protected function _get_priority_orderby()
345
+	{
346
+		return array(
347
+			'MSG_priority' => 'ASC',
348
+			'MSG_modified' => 'DESC',
349
+		);
350
+	}
351
+
352
+
353
+	/**
354
+	 * Returns whether batch methods are "locked" or not.
355
+	 *
356
+	 * @param  string $type The type of lock being checked for.
357
+	 * @return bool
358
+	 */
359
+	public function is_locked($type = EE_Messages_Queue::action_generating)
360
+	{
361
+		/**
362
+		 * This filters the default is_locked behaviour.
363
+		 */
364
+		$is_locked = filter_var(
365
+			apply_filters(
366
+				'FHEE__EE_Messages_Queue__is_locked',
367
+				get_transient($this->_get_lock_key($type)),
368
+				$this
369
+			),
370
+			FILTER_VALIDATE_BOOLEAN
371
+		);
372
+
373
+		/**
374
+		 * @see usage of this filter in EE_Messages_Queue::initiate_request_by_priority() method.
375
+		 *            Also implemented here because messages processed on the same request should not have any locks applied.
376
+		 */
377
+		if (
378
+			apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false)
379
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
380
+		) {
381
+			$is_locked = false;
382
+		}
383
+
384
+
385
+		return $is_locked;
386
+	}
387
+
388
+
389
+	/**
390
+	 * Retrieves the rate limit that may be cached as a transient.
391
+	 * If the rate limit is not set, then this sets the default rate limit and expiry and returns it.
392
+	 *
393
+	 * @return int
394
+	 */
395
+	public function get_rate_limit()
396
+	{
397
+		if ( ! $rate_limit = get_transient($this->_get_rate_limit_key())) {
398
+			$rate_limit = $this->_default_rate_limit();
399
+			set_transient($this->_get_rate_limit_key(), $rate_limit, $this->_get_rate_limit_key());
400
+		}
401
+		return $rate_limit;
402
+	}
403
+
404
+
405
+	/**
406
+	 * This updates existing rate limit with the new limit which is the old minus the batch.
407
+	 *
408
+	 * @param int $batch_completed This sets the new rate limit based on the given batch that was completed.
409
+	 */
410
+	public function set_rate_limit($batch_completed)
411
+	{
412
+		//first get the most up to date rate limit (in case its expired and reset)
413
+		$rate_limit = $this->get_rate_limit();
414
+		$new_limit  = $rate_limit - $batch_completed;
415
+		//updating the transient option directly to avoid resetting the expiry.
416
+		update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit);
417
+	}
418
+
419
+
420
+	/**
421
+	 * This method checks the queue for ANY EE_Message objects with a priority matching the given priority passed in.
422
+	 * If that exists, then we immediately initiate a non-blocking request to do the requested action type.
423
+	 * Note: Keep in mind that there is the possibility that the request will not execute if there is already another
424
+	 * request running on a queue for the given task.
425
+	 *
426
+	 * @param string $task     This indicates what type of request is going to be initiated.
427
+	 * @param int    $priority This indicates the priority that triggers initiating the request.
428
+	 */
429
+	public function initiate_request_by_priority($task = 'generate', $priority = EEM_Message::priority_high)
430
+	{
431
+		//determine what status is matched with the priority as part of the trigger conditions.
432
+		$status = $task == 'generate'
433
+			? EEM_Message::status_incomplete
434
+			: EEM_Message::instance()->stati_indicating_to_send();
435
+		// always make sure we save because either this will get executed immediately on a separate request
436
+		// or remains in the queue for the regularly scheduled queue batch.
437
+		$this->save();
438
+		/**
439
+		 * This filter/option allows users to override processing of messages on separate requests and instead have everything
440
+		 * happen on the same request.  If this is utilized remember:
441
+		 * - message priorities don't matter
442
+		 * - existing unprocessed messages in the queue will not get processed unless manually triggered.
443
+		 * - things will be perceived to take longer to happen for end users (i.e. registrations) because of the additional
444
+		 *   processing happening on the same request.
445
+		 * - any race condition protection (locks) are removed because they don't apply when things are processed on
446
+		 *   the same request.
447
+		 */
448
+		if (
449
+			apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false)
450
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
451
+		) {
452
+			$messages_processor = EE_Registry::instance()->load_lib('Messages_Processor');
453
+			if ($messages_processor instanceof EE_Messages_Processor) {
454
+				return $messages_processor->process_immediately_from_queue($this);
455
+			}
456
+			//if we get here then that means the messages processor couldn't be loaded so messages will just remain
457
+			//queued for manual triggering by end user.
458
+		}
459
+
460
+		if ($this->_message_repository->count_by_priority_and_status($priority, $status)) {
461
+			EE_Messages_Scheduler::initiate_scheduled_non_blocking_request($task);
462
+		}
463
+	}
464
+
465
+
466
+	/**
467
+	 *  Loops through the EE_Message objects in the _queue and calls the messenger send methods for each message.
468
+	 *
469
+	 * @param   bool     $save                    Used to indicate whether to save the message queue after sending
470
+	 *                                            (default will save).
471
+	 * @param   mixed    $sending_messenger       (optional) When the sending messenger is different than
472
+	 *                                            what is on the EE_Message object in the queue.
473
+	 *                                            For instance, showing the browser view of an email message,
474
+	 *                                            or giving a pdf generated view of an html document.
475
+	 *                                            This should be an instance of EE_messenger but if you call this
476
+	 *                                            method
477
+	 *                                            intending it to be a sending messenger but a valid one could not be
478
+	 *                                            retrieved then send in an instance of EE_Error that contains the
479
+	 *                                            related error message.
480
+	 * @param   bool|int $by_priority             When set, this indicates that only messages
481
+	 *                                            matching the given priority should be executed.
482
+	 * @return int        Number of messages sent.  Note, 0 does not mean that no messages were processed.
483
+	 *                                            Also, if the messenger is an request type messenger (or a preview),
484
+	 *                                            its entirely possible that the messenger will exit before
485
+	 */
486
+	public function execute($save = true, $sending_messenger = null, $by_priority = false)
487
+	{
488
+		$messages_sent   = 0;
489
+		$this->_did_hook = array();
490
+		$this->_message_repository->rewind();
491
+
492
+		while ($this->_message_repository->valid()) {
493
+			$error_messages = array();
494
+			/** @type EE_Message $message */
495
+			$message = $this->_message_repository->current();
496
+			//only process things that are queued for sending
497
+			if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) {
498
+				$this->_message_repository->next();
499
+				continue;
500
+			}
501
+			//if $by_priority is set and does not match then continue;
502
+			if ($by_priority && $by_priority != $message->priority()) {
503
+				$this->_message_repository->next();
504
+				continue;
505
+			}
506
+			//error checking
507
+			if (! $message->valid_messenger()) {
508
+				$error_messages[] = sprintf(
509
+					__('The %s messenger is not active at time of sending.', 'event_espresso'),
510
+					$message->messenger()
511
+				);
512
+			}
513
+			if (! $message->valid_message_type()) {
514
+				$error_messages[] = sprintf(
515
+					__('The %s message type is not active at the time of sending.', 'event_espresso'),
516
+					$message->message_type()
517
+				);
518
+			}
519
+			// if there was supposed to be a sending messenger for this message, but it was invalid/inactive,
520
+			// then it will instead be an EE_Error object, so let's check for that
521
+			if ($sending_messenger instanceof EE_Error) {
522
+				$error_messages[] = $sending_messenger->getMessage();
523
+			}
524
+			// if there are no errors, then let's process the message
525
+			if (empty($error_messages)) {
526
+				if ($save) {
527
+					$message->set_messenger_is_executing();
528
+				}
529
+				if ($this->_process_message($message, $sending_messenger)) {
530
+					$messages_sent++;
531
+				}
532
+			}
533
+			$this->_set_error_message($message, $error_messages);
534
+			//add modified time
535
+			$message->set_modified(time());
536
+			//we save each message after its processed to make sure its status persists in case PHP times-out or runs
537
+			//out of memory. @see https://events.codebasehq.com/projects/event-espresso/tickets/10281
538
+			if ($save) {
539
+				$message->save();
540
+			}
541
+
542
+			$this->_message_repository->next();
543
+		}
544
+		if ($save) {
545
+			$this->save(true);
546
+		}
547
+		return $messages_sent;
548
+	}
549
+
550
+
551
+	/**
552
+	 * _process_message
553
+	 *
554
+	 * @param EE_Message $message
555
+	 * @param mixed      $sending_messenger (optional)
556
+	 * @return bool
557
+	 */
558
+	protected function _process_message(EE_Message $message, $sending_messenger = null)
559
+	{
560
+		// these *should* have been validated in the execute() method above
561
+		$messenger    = $message->messenger_object();
562
+		$message_type = $message->message_type_object();
563
+		//do actions for sending messenger if it differs from generating messenger and swap values.
564
+		if (
565
+			$sending_messenger instanceof EE_messenger
566
+			&& $messenger instanceof EE_messenger
567
+			&& $sending_messenger->name != $messenger->name
568
+		) {
569
+			$messenger->do_secondary_messenger_hooks($sending_messenger->name);
570
+			$messenger = $sending_messenger;
571
+		}
572
+		// send using messenger, but double check objects
573
+		if ($messenger instanceof EE_messenger && $message_type instanceof EE_message_type) {
574
+			//set hook for message type (but only if not using another messenger to send).
575
+			if ( ! isset($this->_did_hook[$message_type->name])) {
576
+				$message_type->do_messenger_hooks($messenger);
577
+				$this->_did_hook[$message_type->name] = 1;
578
+			}
579
+			//if preview then use preview method
580
+			return $this->_message_repository->is_preview()
581
+				? $this->_do_preview($message, $messenger, $message_type, $this->_message_repository->is_test_send())
582
+				: $this->_do_send($message, $messenger, $message_type);
583
+		}
584
+		return false;
585
+	}
586
+
587
+
588
+	/**
589
+	 * The intention of this method is to count how many EE_Message objects
590
+	 * are in the queue with a given status.
591
+	 * Example usage:
592
+	 * After a caller calls the "EE_Message_Queue::execute()" method, the caller can check if there were any failed
593
+	 * sends by calling $queue->count_STS_in_queue( EEM_Message_Queue::status_failed ).
594
+	 *
595
+	 * @param array|string $status Stati to check for in queue
596
+	 * @return int  Count of EE_Message's matching the given status.
597
+	 */
598
+	public function count_STS_in_queue($status)
599
+	{
600
+		$count  = 0;
601
+		$status = is_array($status) ? $status : array($status);
602
+		$this->_message_repository->rewind();
603
+		foreach ($this->_message_repository as $message) {
604
+			if (in_array($message->STS_ID(), $status)) {
605
+				$count++;
606
+			}
607
+		}
608
+		return $count;
609
+	}
610
+
611
+
612
+	/**
613
+	 * Executes the get_preview method on the provided messenger.
614
+	 *
615
+	 * @param EE_Message      $message
616
+	 * @param EE_messenger    $messenger
617
+	 * @param EE_message_type $message_type
618
+	 * @param                 $test_send
619
+	 * @return bool   true means all went well, false means, not so much.
620
+	 */
621
+	protected function _do_preview(
622
+		EE_Message $message,
623
+		EE_messenger $messenger,
624
+		EE_message_type $message_type,
625
+		$test_send
626
+	) {
627
+		if ($preview = $messenger->get_preview($message, $message_type, $test_send)) {
628
+			if ( ! $test_send) {
629
+				$message->set_content($preview);
630
+			}
631
+			$message->set_STS_ID(EEM_Message::status_sent);
632
+			return true;
633
+		} else {
634
+			$message->set_STS_ID(EEM_Message::status_failed);
635
+			return false;
636
+		}
637
+	}
638
+
639
+
640
+	/**
641
+	 * Executes the send method on the provided messenger
642
+	 * EE_Messengers are expected to:
643
+	 * - return true if the send was successful.
644
+	 * - return false if the send was unsuccessful but can be tried again.
645
+	 * - throw an Exception if the send was unsuccessful and cannot be tried again.
646
+	 *
647
+	 * @param EE_Message      $message
648
+	 * @param EE_messenger    $messenger
649
+	 * @param EE_message_type $message_type
650
+	 * @return bool true means all went well, false means, not so much.
651
+	 */
652
+	protected function _do_send(EE_Message $message, EE_messenger $messenger, EE_message_type $message_type)
653
+	{
654
+		try {
655
+			if ($messenger->send_message($message, $message_type)) {
656
+				$message->set_STS_ID(EEM_Message::status_sent);
657
+				return true;
658
+			} else {
659
+				$message->set_STS_ID(EEM_Message::status_retry);
660
+				return false;
661
+			}
662
+		} catch (SendMessageException $e) {
663
+			$message->set_STS_ID(EEM_Message::status_failed);
664
+			$message->set_error_message($e->getMessage());
665
+			return false;
666
+		}
667
+	}
668
+
669
+
670
+	/**
671
+	 * This sets any necessary error messages on the message object and its status to failed.
672
+	 *
673
+	 * @param EE_Message $message
674
+	 * @param array      $error_messages the response from the messenger.
675
+	 */
676
+	protected function _set_error_message(EE_Message $message, $error_messages)
677
+	{
678
+		$error_messages = (array)$error_messages;
679
+		if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) {
680
+			$notices          = EE_Error::has_notices();
681
+			$error_messages[] = __(
682
+				'Messenger and Message Type were valid and active, but the messenger send method failed.',
683
+				'event_espresso'
684
+			);
685
+			if ($notices === 1) {
686
+				$notices           = EE_Error::get_vanilla_notices();
687
+				$notices['errors'] = isset($notices['errors']) ? $notices['errors'] : array();
688
+				$error_messages[]  = implode("\n", $notices['errors']);
689
+			}
690
+		}
691
+		if (count($error_messages) > 0) {
692
+			$msg = __('Message was not executed successfully.', 'event_espresso');
693
+			$msg = $msg . "\n" . implode("\n", $error_messages);
694
+			$message->set_error_message($msg);
695
+		}
696
+	}
697 697
 
698 698
 } //end EE_Messages_Queue class
Please login to merge, or discard this patch.
core/db_models/EEM_Status.model.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php if (! defined('EVENT_ESPRESSO_VERSION')) {
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2 2
     exit('No direct script access allowed');
3 3
 }
4 4
 /**
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
  * @ version            4.0
13 13
  * ------------------------------------------------------------------------
14 14
  */
15
-require_once(EE_MODELS . 'EEM_Base.model.php');
15
+require_once(EE_MODELS.'EEM_Base.model.php');
16 16
 
17 17
 /**
18 18
  * Class EEM_Status
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
                     false,
50 50
                     'event',
51 51
                     array(
52
-                        'event'        => __("Event", "event_espresso"),//deprecated
52
+                        'event'        => __("Event", "event_espresso"), //deprecated
53 53
                         'registration' => __("Registration", "event_espresso"),
54 54
                         'transaction'  => __("Transaction", "event_espresso"),
55 55
                         'payment'      => __("Payment", "event_espresso"),
Please login to merge, or discard this patch.
Indentation   +275 added lines, -275 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if (! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /**
5 5
  * Event Espresso
@@ -25,291 +25,291 @@  discard block
 block discarded – undo
25 25
 class EEM_Status extends EEM_Base
26 26
 {
27 27
 
28
-    // private instance of the Attendee object
29
-    protected static $_instance = null;
28
+	// private instance of the Attendee object
29
+	protected static $_instance = null;
30 30
 
31 31
 
32
-    /**
33
-     * @return EEM_Status
34
-     */
35
-    protected function __construct($timezone = null)
36
-    {
37
-        $this->singular_item    = __('Status', 'event_espresso');
38
-        $this->plural_item      = __('Stati', 'event_espresso');
39
-        $this->_tables          = array(
40
-            'StatusTable' => new EE_Primary_Table('esp_status', 'STS_ID'),
41
-        );
42
-        $this->_fields          = array(
43
-            'StatusTable' => array(
44
-                'STS_ID'       => new EE_Primary_Key_String_Field('STS_ID', __('Status ID', 'event_espresso')),
45
-                'STS_code'     => new EE_Plain_Text_Field('STS_code', __('Status Code', 'event_espresso'), false, ''),
46
-                'STS_type'     => new EE_Enum_Text_Field(
47
-                    'STS_type',
48
-                    __("Type", "event_espresso"),
49
-                    false,
50
-                    'event',
51
-                    array(
52
-                        'event'        => __("Event", "event_espresso"),//deprecated
53
-                        'registration' => __("Registration", "event_espresso"),
54
-                        'transaction'  => __("Transaction", "event_espresso"),
55
-                        'payment'      => __("Payment", "event_espresso"),
56
-                        'email'        => __("Email", "event_espresso"),
57
-                        'message'      => __("Message", "event_espresso"),
58
-                    )),
59
-                'STS_can_edit' => new EE_Boolean_Field('STS_can_edit', __('Editable?', 'event_espresso'), false, false),
60
-                'STS_desc'     => new EE_Simple_HTML_Field('STS_desc', __("Description", "event_espresso"), false, ''),
61
-                'STS_open'     => new EE_Boolean_Field('STS_open', __("Open?", "event_espresso"), false, false),
62
-            ),
63
-        );
64
-        $this->_model_relations = array(
65
-            'Registration' => new EE_Has_Many_Relation(),
66
-            'Transaction'  => new EE_Has_Many_Relation(),
67
-            'Payment'      => new EE_Has_Many_Relation(),
68
-        );
69
-        //this model is generally available for reading
70
-        $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
32
+	/**
33
+	 * @return EEM_Status
34
+	 */
35
+	protected function __construct($timezone = null)
36
+	{
37
+		$this->singular_item    = __('Status', 'event_espresso');
38
+		$this->plural_item      = __('Stati', 'event_espresso');
39
+		$this->_tables          = array(
40
+			'StatusTable' => new EE_Primary_Table('esp_status', 'STS_ID'),
41
+		);
42
+		$this->_fields          = array(
43
+			'StatusTable' => array(
44
+				'STS_ID'       => new EE_Primary_Key_String_Field('STS_ID', __('Status ID', 'event_espresso')),
45
+				'STS_code'     => new EE_Plain_Text_Field('STS_code', __('Status Code', 'event_espresso'), false, ''),
46
+				'STS_type'     => new EE_Enum_Text_Field(
47
+					'STS_type',
48
+					__("Type", "event_espresso"),
49
+					false,
50
+					'event',
51
+					array(
52
+						'event'        => __("Event", "event_espresso"),//deprecated
53
+						'registration' => __("Registration", "event_espresso"),
54
+						'transaction'  => __("Transaction", "event_espresso"),
55
+						'payment'      => __("Payment", "event_espresso"),
56
+						'email'        => __("Email", "event_espresso"),
57
+						'message'      => __("Message", "event_espresso"),
58
+					)),
59
+				'STS_can_edit' => new EE_Boolean_Field('STS_can_edit', __('Editable?', 'event_espresso'), false, false),
60
+				'STS_desc'     => new EE_Simple_HTML_Field('STS_desc', __("Description", "event_espresso"), false, ''),
61
+				'STS_open'     => new EE_Boolean_Field('STS_open', __("Open?", "event_espresso"), false, false),
62
+			),
63
+		);
64
+		$this->_model_relations = array(
65
+			'Registration' => new EE_Has_Many_Relation(),
66
+			'Transaction'  => new EE_Has_Many_Relation(),
67
+			'Payment'      => new EE_Has_Many_Relation(),
68
+		);
69
+		//this model is generally available for reading
70
+		$this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public();
71 71
 
72
-        parent::__construct($timezone);
73
-    }
72
+		parent::__construct($timezone);
73
+	}
74 74
 
75 75
 
76
-    /**
77
-     * This method provides the localized singular or plural string for a given status id
78
-     *
79
-     * @param  array   $statuses This should be an array of statuses in the format array( $status_id, $status_code ).
80
-     *                           That way if there isn't a translation in the index we'll return the default code.
81
-     * @param  boolean $plural   Whether to return plural string or not. Note, nearly all of the plural strings are the
82
-     *                           same as the singular (in English), however, this may NOT be the case with other
83
-     *                           languages
84
-     * @param  string  $schema   This can be either 'upper', 'lower', or 'sentence'.  Basically indicates how we want
85
-     *                           the status string returned ( UPPER, lower, Sentence)
86
-     * @throws EE_Error
87
-     * @return array             an array of translated strings for the incoming status id.
88
-     */
89
-    public function localized_status($statuses, $plural = false, $schema = 'upper')
90
-    {
91
-        //note these are all in lower case because ucwords() on upper case will NOT convert.
92
-        $translation_array = array(
93
-            EEM_Registration::status_id_pending_payment => array(
94
-                __('pending payment', 'event_espresso'), //singular
95
-                __('pending payments', 'event_espresso') //plural
96
-            ),
97
-            EEM_Registration::status_id_approved        => array(
98
-                __('approved', 'event_espresso'), //singular
99
-                __('approved', 'event_espresso') //plural
100
-            ),
101
-            EEM_Registration::status_id_not_approved    => array(
102
-                __('not approved', 'event_espresso'),
103
-                __('not approved', 'event_espresso'),
104
-            ),
105
-            EEM_Registration::status_id_cancelled       => array(
106
-                __('cancelled', 'event_espresso'),
107
-                __('cancelled', 'event_espresso'),
108
-            ),
109
-            EEM_Registration::status_id_incomplete      => array(
110
-                __('incomplete', 'event_espresso'),
111
-                __('incomplete', 'event_espresso'),
112
-            ),
113
-            EEM_Registration::status_id_declined        => array(
114
-                __('declined', 'event_espresso'),
115
-                __('declined', 'event_espresso'),
116
-            ),
117
-            EEM_Registration::status_id_wait_list       => array(
118
-                __('wait list', 'event_espresso'),
119
-                __('wait list', 'event_espresso'),
120
-            ),
121
-            EEM_Transaction::overpaid_status_code       => array(
122
-                __('overpaid', 'event_espresso'),
123
-                __('overpaid', 'event_espresso'),
124
-            ),
125
-            EEM_Transaction::complete_status_code       => array(
126
-                __('complete', 'event_espresso'),
127
-                __('complete', 'event_espresso'),
128
-            ),
129
-            EEM_Transaction::incomplete_status_code     => array(
130
-                __('incomplete', 'event_espresso'),
131
-                __('incomplete', 'event_espresso'),
132
-            ),
133
-            EEM_Transaction::failed_status_code         => array(
134
-                __('failed', 'event_espresso'),
135
-                __('failed', 'event_espresso'),
136
-            ),
137
-            EEM_Transaction::abandoned_status_code      => array(
138
-                __('abandoned', 'event_espresso'),
139
-                __('abandoned', 'event_espresso'),
140
-            ),
141
-            EEM_Payment::status_id_approved             => array(
142
-                __('accepted', 'event_espresso'),
143
-                __('accepted', 'event_espresso'),
144
-            ),
145
-            EEM_Payment::status_id_pending              => array(
146
-                __('pending', 'event_espresso'),
147
-                __('pending', 'event_espresso'),
148
-            ),
149
-            EEM_Payment::status_id_cancelled            => array(
150
-                __('cancelled', 'event_espresso'),
151
-                __('cancelled', 'event_espresso'),
152
-            ),
153
-            EEM_Payment::status_id_declined             => array(
154
-                __('declined', 'event_espresso'),
155
-                __('declined', 'event_espresso'),
156
-            ),
157
-            EEM_Payment::status_id_failed               => array(
158
-                __('failed', 'event_espresso'),
159
-                __('failed', 'event_espresso'),
160
-            ),
161
-            //following statuses are NOT part of the EEM_Status but to keep things centralized we include in here.
162
-            EEM_Event::sold_out                         => array(
163
-                __('sold out', 'event_espresso'),
164
-                __('sold out', 'event_espresso'),
165
-            ),
166
-            EEM_Event::postponed                        => array(
167
-                __('postponed', 'event_espresso'),
168
-                __('Postponed', 'event_espresso'),
169
-            ),
170
-            EEM_Event::cancelled                        => array(
171
-                __('cancelled', 'event_espresso'),
172
-                __('cancelled', 'event_espresso'),
173
-            ),
174
-            EE_Ticket::archived                         => array(
175
-                __('archived', 'event_espresso'),
176
-                __('archived', 'event_espresso'),
177
-            ),
178
-            EE_Ticket::expired                          => array(
179
-                __('expired', 'event_espresso'),
180
-                __('expired', 'event_espresso'),
181
-            ),
182
-            EE_Ticket::sold_out                         => array(
183
-                __('sold out', 'event_espresso'),
184
-                __('sold out', 'event_espresso'),
185
-            ),
186
-            EE_Ticket::pending                          => array(
187
-                __('upcoming', 'event_espresso'),
188
-                __('upcoming', 'event_espresso'),
189
-            ),
190
-            EE_Ticket::onsale                           => array(
191
-                __('on sale', 'event_espresso'),
192
-                __('on sale', 'event_espresso'),
193
-            ),
194
-            EE_Datetime::cancelled                      => array(
195
-                __('cancelled', 'event_espresso'),
196
-                __('cancelled', 'event_espresso'),
197
-            ),
198
-            EE_Datetime::sold_out                       => array(
199
-                __('sold out', 'event_espresso'),
200
-                __('sold out', 'event_espresso'),
201
-            ),
202
-            EE_Datetime::expired                        => array(
203
-                __('expired', 'event_espresso'),
204
-                __('expired', 'event_espresso'),
205
-            ),
206
-            EE_Datetime::inactive                       => array(
207
-                __('inactive', 'event_espresso'),
208
-                __('inactive', 'event_espresso'),
209
-            ),
210
-            EE_Datetime::upcoming                       => array(
211
-                __('upcoming', 'event_espresso'),
212
-                __('upcoming', 'event_espresso'),
213
-            ),
214
-            EE_Datetime::active                         => array(
215
-                __('active', 'event_espresso'),
216
-                __('active', 'event_espresso'),
217
-            ),
218
-            EE_Datetime::postponed                      => array(
219
-                __('postponed', 'event_espresso'),
220
-                __('postponed', 'event_espresso'),
221
-            ),
222
-            //messages related
223
-            EEM_Message::status_sent                    => array(
224
-                __('sent', 'event_espresso'),
225
-                __('sent', 'event_espresso'),
226
-            ),
227
-            EEM_Message::status_idle                    => array(
228
-                __('queued for sending', 'event_espresso'),
229
-                __('queued for sending', 'event_espresso'),
230
-            ),
231
-            EEM_Message::status_failed                  => array(
232
-                __('failed', 'event_espresso'),
233
-                __('failed', 'event_espresso'),
234
-            ),
235
-            EEM_Message::status_debug_only              => array(
236
-                __('debug only', 'event_espresso'),
237
-                __('debug only', 'event_espresso'),
238
-            ),
239
-            EEM_Message::status_messenger_executing     => array(
240
-                __('messenger is executing', 'event_espresso'),
241
-                __('messenger is executing', 'event_espresso'),
242
-            ),
243
-            EEM_Message::status_resend                  => array(
244
-                __('queued for resending', 'event_espresso'),
245
-                __('queued for resending', 'event_espresso'),
246
-            ),
247
-            EEM_Message::status_incomplete              => array(
248
-                __('queued for generating', 'event_espresso'),
249
-                __('queued for generating', 'event_espresso'),
250
-            ),
251
-            EEM_Message::status_retry                   => array(
252
-                __('failed sending, can be retried', 'event_espresso'),
253
-                __('failed sending, can be retried', 'event_espresso'),
254
-            ),
255
-            EEM_CPT_Base::post_status_publish           => array(
256
-                __('published', 'event_espresso'),
257
-                __('published', 'event_espresso'),
258
-            ),
259
-            EEM_CPT_Base::post_status_future            => array(
260
-                __('scheduled', 'event_espresso'),
261
-                __('scheduled', 'event_espresso'),
262
-            ),
263
-            EEM_CPT_Base::post_status_draft             => array(
264
-                __('draft', 'event_espresso'),
265
-                __('draft', 'event_espresso'),
266
-            ),
267
-            EEM_CPT_Base::post_status_pending           => array(
268
-                __('pending', 'event_espresso'),
269
-                __('pending', 'event_espresso'),
270
-            ),
271
-            EEM_CPT_Base::post_status_private           => array(
272
-                __('private', 'event_espresso'),
273
-                __('private', 'event_espresso'),
274
-            ),
275
-            EEM_CPT_Base::post_status_trashed           => array(
276
-                __('trashed', 'event_espresso'),
277
-                __('trashed', 'event_espresso'),
278
-            ),
279
-        );
76
+	/**
77
+	 * This method provides the localized singular or plural string for a given status id
78
+	 *
79
+	 * @param  array   $statuses This should be an array of statuses in the format array( $status_id, $status_code ).
80
+	 *                           That way if there isn't a translation in the index we'll return the default code.
81
+	 * @param  boolean $plural   Whether to return plural string or not. Note, nearly all of the plural strings are the
82
+	 *                           same as the singular (in English), however, this may NOT be the case with other
83
+	 *                           languages
84
+	 * @param  string  $schema   This can be either 'upper', 'lower', or 'sentence'.  Basically indicates how we want
85
+	 *                           the status string returned ( UPPER, lower, Sentence)
86
+	 * @throws EE_Error
87
+	 * @return array             an array of translated strings for the incoming status id.
88
+	 */
89
+	public function localized_status($statuses, $plural = false, $schema = 'upper')
90
+	{
91
+		//note these are all in lower case because ucwords() on upper case will NOT convert.
92
+		$translation_array = array(
93
+			EEM_Registration::status_id_pending_payment => array(
94
+				__('pending payment', 'event_espresso'), //singular
95
+				__('pending payments', 'event_espresso') //plural
96
+			),
97
+			EEM_Registration::status_id_approved        => array(
98
+				__('approved', 'event_espresso'), //singular
99
+				__('approved', 'event_espresso') //plural
100
+			),
101
+			EEM_Registration::status_id_not_approved    => array(
102
+				__('not approved', 'event_espresso'),
103
+				__('not approved', 'event_espresso'),
104
+			),
105
+			EEM_Registration::status_id_cancelled       => array(
106
+				__('cancelled', 'event_espresso'),
107
+				__('cancelled', 'event_espresso'),
108
+			),
109
+			EEM_Registration::status_id_incomplete      => array(
110
+				__('incomplete', 'event_espresso'),
111
+				__('incomplete', 'event_espresso'),
112
+			),
113
+			EEM_Registration::status_id_declined        => array(
114
+				__('declined', 'event_espresso'),
115
+				__('declined', 'event_espresso'),
116
+			),
117
+			EEM_Registration::status_id_wait_list       => array(
118
+				__('wait list', 'event_espresso'),
119
+				__('wait list', 'event_espresso'),
120
+			),
121
+			EEM_Transaction::overpaid_status_code       => array(
122
+				__('overpaid', 'event_espresso'),
123
+				__('overpaid', 'event_espresso'),
124
+			),
125
+			EEM_Transaction::complete_status_code       => array(
126
+				__('complete', 'event_espresso'),
127
+				__('complete', 'event_espresso'),
128
+			),
129
+			EEM_Transaction::incomplete_status_code     => array(
130
+				__('incomplete', 'event_espresso'),
131
+				__('incomplete', 'event_espresso'),
132
+			),
133
+			EEM_Transaction::failed_status_code         => array(
134
+				__('failed', 'event_espresso'),
135
+				__('failed', 'event_espresso'),
136
+			),
137
+			EEM_Transaction::abandoned_status_code      => array(
138
+				__('abandoned', 'event_espresso'),
139
+				__('abandoned', 'event_espresso'),
140
+			),
141
+			EEM_Payment::status_id_approved             => array(
142
+				__('accepted', 'event_espresso'),
143
+				__('accepted', 'event_espresso'),
144
+			),
145
+			EEM_Payment::status_id_pending              => array(
146
+				__('pending', 'event_espresso'),
147
+				__('pending', 'event_espresso'),
148
+			),
149
+			EEM_Payment::status_id_cancelled            => array(
150
+				__('cancelled', 'event_espresso'),
151
+				__('cancelled', 'event_espresso'),
152
+			),
153
+			EEM_Payment::status_id_declined             => array(
154
+				__('declined', 'event_espresso'),
155
+				__('declined', 'event_espresso'),
156
+			),
157
+			EEM_Payment::status_id_failed               => array(
158
+				__('failed', 'event_espresso'),
159
+				__('failed', 'event_espresso'),
160
+			),
161
+			//following statuses are NOT part of the EEM_Status but to keep things centralized we include in here.
162
+			EEM_Event::sold_out                         => array(
163
+				__('sold out', 'event_espresso'),
164
+				__('sold out', 'event_espresso'),
165
+			),
166
+			EEM_Event::postponed                        => array(
167
+				__('postponed', 'event_espresso'),
168
+				__('Postponed', 'event_espresso'),
169
+			),
170
+			EEM_Event::cancelled                        => array(
171
+				__('cancelled', 'event_espresso'),
172
+				__('cancelled', 'event_espresso'),
173
+			),
174
+			EE_Ticket::archived                         => array(
175
+				__('archived', 'event_espresso'),
176
+				__('archived', 'event_espresso'),
177
+			),
178
+			EE_Ticket::expired                          => array(
179
+				__('expired', 'event_espresso'),
180
+				__('expired', 'event_espresso'),
181
+			),
182
+			EE_Ticket::sold_out                         => array(
183
+				__('sold out', 'event_espresso'),
184
+				__('sold out', 'event_espresso'),
185
+			),
186
+			EE_Ticket::pending                          => array(
187
+				__('upcoming', 'event_espresso'),
188
+				__('upcoming', 'event_espresso'),
189
+			),
190
+			EE_Ticket::onsale                           => array(
191
+				__('on sale', 'event_espresso'),
192
+				__('on sale', 'event_espresso'),
193
+			),
194
+			EE_Datetime::cancelled                      => array(
195
+				__('cancelled', 'event_espresso'),
196
+				__('cancelled', 'event_espresso'),
197
+			),
198
+			EE_Datetime::sold_out                       => array(
199
+				__('sold out', 'event_espresso'),
200
+				__('sold out', 'event_espresso'),
201
+			),
202
+			EE_Datetime::expired                        => array(
203
+				__('expired', 'event_espresso'),
204
+				__('expired', 'event_espresso'),
205
+			),
206
+			EE_Datetime::inactive                       => array(
207
+				__('inactive', 'event_espresso'),
208
+				__('inactive', 'event_espresso'),
209
+			),
210
+			EE_Datetime::upcoming                       => array(
211
+				__('upcoming', 'event_espresso'),
212
+				__('upcoming', 'event_espresso'),
213
+			),
214
+			EE_Datetime::active                         => array(
215
+				__('active', 'event_espresso'),
216
+				__('active', 'event_espresso'),
217
+			),
218
+			EE_Datetime::postponed                      => array(
219
+				__('postponed', 'event_espresso'),
220
+				__('postponed', 'event_espresso'),
221
+			),
222
+			//messages related
223
+			EEM_Message::status_sent                    => array(
224
+				__('sent', 'event_espresso'),
225
+				__('sent', 'event_espresso'),
226
+			),
227
+			EEM_Message::status_idle                    => array(
228
+				__('queued for sending', 'event_espresso'),
229
+				__('queued for sending', 'event_espresso'),
230
+			),
231
+			EEM_Message::status_failed                  => array(
232
+				__('failed', 'event_espresso'),
233
+				__('failed', 'event_espresso'),
234
+			),
235
+			EEM_Message::status_debug_only              => array(
236
+				__('debug only', 'event_espresso'),
237
+				__('debug only', 'event_espresso'),
238
+			),
239
+			EEM_Message::status_messenger_executing     => array(
240
+				__('messenger is executing', 'event_espresso'),
241
+				__('messenger is executing', 'event_espresso'),
242
+			),
243
+			EEM_Message::status_resend                  => array(
244
+				__('queued for resending', 'event_espresso'),
245
+				__('queued for resending', 'event_espresso'),
246
+			),
247
+			EEM_Message::status_incomplete              => array(
248
+				__('queued for generating', 'event_espresso'),
249
+				__('queued for generating', 'event_espresso'),
250
+			),
251
+			EEM_Message::status_retry                   => array(
252
+				__('failed sending, can be retried', 'event_espresso'),
253
+				__('failed sending, can be retried', 'event_espresso'),
254
+			),
255
+			EEM_CPT_Base::post_status_publish           => array(
256
+				__('published', 'event_espresso'),
257
+				__('published', 'event_espresso'),
258
+			),
259
+			EEM_CPT_Base::post_status_future            => array(
260
+				__('scheduled', 'event_espresso'),
261
+				__('scheduled', 'event_espresso'),
262
+			),
263
+			EEM_CPT_Base::post_status_draft             => array(
264
+				__('draft', 'event_espresso'),
265
+				__('draft', 'event_espresso'),
266
+			),
267
+			EEM_CPT_Base::post_status_pending           => array(
268
+				__('pending', 'event_espresso'),
269
+				__('pending', 'event_espresso'),
270
+			),
271
+			EEM_CPT_Base::post_status_private           => array(
272
+				__('private', 'event_espresso'),
273
+				__('private', 'event_espresso'),
274
+			),
275
+			EEM_CPT_Base::post_status_trashed           => array(
276
+				__('trashed', 'event_espresso'),
277
+				__('trashed', 'event_espresso'),
278
+			),
279
+		);
280 280
 
281
-        $translation_array = apply_filters('FHEE__EEM_Status__localized_status__translation_array', $translation_array);
281
+		$translation_array = apply_filters('FHEE__EEM_Status__localized_status__translation_array', $translation_array);
282 282
 
283
-        if ( ! is_array($statuses)) {
284
-            throw new EE_Error(__('The incoming statuses argument must be an array with keys as the $status_id and values as the $status_code',
285
-                'event_espresso'));
286
-        }
283
+		if ( ! is_array($statuses)) {
284
+			throw new EE_Error(__('The incoming statuses argument must be an array with keys as the $status_id and values as the $status_code',
285
+				'event_espresso'));
286
+		}
287 287
 
288
-        $translation = array();
288
+		$translation = array();
289 289
 
290
-        foreach ($statuses as $id => $code) {
291
-            if (isset($translation_array[$id])) {
292
-                $translation[$id] = $plural ? $translation_array[$id][1] : $translation_array[$id][0];
293
-            } else {
294
-                $translation[$id] = $code;
295
-            }
290
+		foreach ($statuses as $id => $code) {
291
+			if (isset($translation_array[$id])) {
292
+				$translation[$id] = $plural ? $translation_array[$id][1] : $translation_array[$id][0];
293
+			} else {
294
+				$translation[$id] = $code;
295
+			}
296 296
 
297
-            //schema
298
-            switch ($schema) {
299
-                case 'lower' :
300
-                    $translation[$id] = strtolower($translation[$id]); //even though these start in lower case, this will catch any statuses added via filter.
301
-                    break;
302
-                case 'sentence' :
303
-                    $translation[$id] = ucwords($translation[$id]);
304
-                    break;
305
-                case 'upper' :
306
-                    $translation[$id] = strtoupper($translation[$id]);
307
-                    break;
308
-            }
309
-        }
297
+			//schema
298
+			switch ($schema) {
299
+				case 'lower' :
300
+					$translation[$id] = strtolower($translation[$id]); //even though these start in lower case, this will catch any statuses added via filter.
301
+					break;
302
+				case 'sentence' :
303
+					$translation[$id] = ucwords($translation[$id]);
304
+					break;
305
+				case 'upper' :
306
+					$translation[$id] = strtoupper($translation[$id]);
307
+					break;
308
+			}
309
+		}
310 310
 
311
-        return $translation;
312
-    }
311
+		return $translation;
312
+	}
313 313
 
314 314
 
315 315
 }
Please login to merge, or discard this patch.
admin_pages/messages/EE_Message_List_Table.class.php 2 patches
Indentation   +427 added lines, -427 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if (! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('NO direct script access allowed');
3
+	exit('NO direct script access allowed');
4 4
 }
5 5
 
6 6
 /**
@@ -15,430 +15,430 @@  discard block
 block discarded – undo
15 15
 {
16 16
 
17 17
 
18
-    /**
19
-     * @return Messages_Admin_Page
20
-     */
21
-    public function get_admin_page()
22
-    {
23
-        return $this->_admin_page;
24
-    }
25
-
26
-
27
-    protected function _setup_data()
28
-    {
29
-        $this->_data           = $this->_get_messages($this->_per_page, $this->_view);
30
-        $this->_all_data_count = $this->_get_messages($this->_per_page, $this->_view, true);
31
-    }
32
-
33
-
34
-    protected function _set_properties()
35
-    {
36
-        $this->_wp_list_args = array(
37
-            'singular' => __('Message', 'event_espresso'),
38
-            'plural'   => __('Messages', 'event_espresso'),
39
-            'ajax'     => true,
40
-            'screen'   => $this->get_admin_page()->get_current_screen()->id,
41
-        );
42
-
43
-        $this->_columns = array(
44
-            'cb'           => '<input type="checkbox" />',
45
-            'to'           => __('To', 'event_espresso'),
46
-            'from'         => __('From', 'event_espresso'),
47
-            'messenger'    => __('Messenger', 'event_espresso'),
48
-            'message_type' => __('Message Type', 'event_espresso'),
49
-            'context'      => __('Context', 'event_espresso'),
50
-            'modified'     => __('Modified', 'event_espresso'),
51
-            'action'       => __('Actions', 'event_espresso'),
52
-            'msg_id'       => __('ID', 'event_espresso'),
53
-        );
54
-
55
-        $this->_sortable_columns = array(
56
-            'modified'     => array('MSG_modified' => true),
57
-            'message_type' => array('MSG_message_type' => false),
58
-            'messenger'    => array('MSG_messenger' => false),
59
-            'to'           => array('MSG_to' => false),
60
-            'from'         => array('MSG_from' => false),
61
-            'context'      => array('MSG_context' => false),
62
-            'msg_id'       => array('MSG_ID', false),
63
-        );
64
-
65
-        $this->_primary_column = 'to';
66
-
67
-        $this->_hidden_columns = array(
68
-            'msg_id',
69
-        );
70
-    }
71
-
72
-
73
-    /**
74
-     * This simply sets up the row class for the table rows.
75
-     * Allows for easier overriding of child methods for setting up sorting.
76
-     *
77
-     * @param  object $item the current item
78
-     * @return string
79
-     */
80
-    protected function _get_row_class($item)
81
-    {
82
-        $class = parent::_get_row_class($item);
83
-        //add status class
84
-        $class .= ' ee-status-strip msg-status-' . $item->STS_ID();
85
-        if ($this->_has_checkbox_column) {
86
-            $class .= ' has-checkbox-column';
87
-        }
88
-        return $class;
89
-    }
90
-
91
-
92
-    /**
93
-     * _get_table_filters
94
-     * We use this to assemble and return any filters that are associated with this table that help further refine what
95
-     * get's shown in the table.
96
-     *
97
-     * @abstract
98
-     * @access protected
99
-     * @return string
100
-     * @throws \EE_Error
101
-     */
102
-    protected function _get_table_filters()
103
-    {
104
-        $filters = array();
105
-
106
-        //get select_inputs
107
-        $select_inputs = array(
108
-            $this->_get_messengers_dropdown_filter(),
109
-            $this->_get_message_types_dropdown_filter(),
110
-            $this->_get_contexts_for_message_types_dropdown_filter(),
111
-        );
112
-
113
-        //set filters to select inputs if they aren't empty
114
-        foreach ($select_inputs as $select_input) {
115
-            if ($select_input) {
116
-                $filters[] = $select_input;
117
-            }
118
-        }
119
-        return $filters;
120
-    }
121
-
122
-
123
-    protected function _add_view_counts()
124
-    {
125
-        foreach ($this->_views as $view => $args) {
126
-            $this->_views[$view]['count'] = $this->_get_messages($this->_per_page, $view, true, true);
127
-        }
128
-    }
129
-
130
-
131
-    /**
132
-     * @param EE_Message $message
133
-     * @return string   checkbox
134
-     * @throws \EE_Error
135
-     */
136
-    public function column_cb($message)
137
-    {
138
-        return sprintf('<input type="checkbox" name="MSG_ID[%s]" value="1" />', $message->ID());
139
-    }
140
-
141
-
142
-    /**
143
-     * @param EE_Message $message
144
-     * @return string
145
-     * @throws \EE_Error
146
-     */
147
-    public function column_msg_id(EE_Message $message)
148
-    {
149
-        return $message->ID();
150
-    }
151
-
152
-
153
-    /**
154
-     * @param EE_Message $message
155
-     * @return string    The recipient of the message
156
-     * @throws \EE_Error
157
-     */
158
-    public function column_to(EE_Message $message)
159
-    {
160
-        EE_Registry::instance()->load_helper('URL');
161
-        $actions           = array();
162
-        $actions['delete'] = '<a href="'
163
-                             . EEH_URL::add_query_args_and_nonce(
164
-                array(
165
-                    'page'   => 'espresso_messages',
166
-                    'action' => 'delete_ee_message',
167
-                    'MSG_ID' => $message->ID(),
168
-                ),
169
-                admin_url('admin.php')
170
-            )
171
-                             . '">' . __('Delete', 'event_espresso') . '</a>';
172
-        return esc_html($message->to()) . $this->row_actions($actions);
173
-    }
174
-
175
-
176
-    /**
177
-     * @param EE_Message $message
178
-     * @return string   The sender of the message
179
-     */
180
-    public function column_from(EE_Message $message)
181
-    {
182
-        return esc_html($message->from());
183
-    }
184
-
185
-
186
-    /**
187
-     * @param EE_Message $message
188
-     * @return string  The messenger used to send the message.
189
-     */
190
-    public function column_messenger(EE_Message $message)
191
-    {
192
-        return ucwords($message->messenger_label());
193
-    }
194
-
195
-
196
-    /**
197
-     * @param EE_Message $message
198
-     * @return string  The message type used to generate the message.
199
-     */
200
-    public function column_message_type(EE_Message $message)
201
-    {
202
-        return ucwords($message->message_type_label());
203
-    }
204
-
205
-
206
-    /**
207
-     * @param EE_Message $message
208
-     * @return string  The context the message was generated for.
209
-     */
210
-    public function column_context(EE_Message $message)
211
-    {
212
-        return $message->context_label();
213
-    }
214
-
215
-
216
-    /**
217
-     * @param EE_Message $message
218
-     * @return string    The timestamp when this message was last modified.
219
-     */
220
-    public function column_modified(EE_Message $message)
221
-    {
222
-        return $message->modified();
223
-    }
224
-
225
-
226
-    /**
227
-     * @param EE_Message $message
228
-     * @return string   Actions that can be done on the current message.
229
-     */
230
-    public function column_action(EE_Message $message)
231
-    {
232
-        EE_Registry::instance()->load_helper('MSG_Template');
233
-        $action_links = array(
234
-            'view'                => EEH_MSG_Template::get_message_action_link('view', $message),
235
-            'error'               => EEH_MSG_Template::get_message_action_link('error', $message),
236
-            'generate_now'        => EEH_MSG_Template::get_message_action_link('generate_now', $message),
237
-            'send_now'            => EEH_MSG_Template::get_message_action_link('send_now', $message),
238
-            'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message),
239
-            'view_transaction'    => EEH_MSG_Template::get_message_action_link('view_transaction', $message),
240
-        );
241
-        $content      = '';
242
-        switch ($message->STS_ID()) {
243
-            case EEM_Message::status_sent :
244
-                $content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction'];
245
-                break;
246
-            case EEM_Message::status_resend :
247
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
248
-                break;
249
-            case EEM_Message::status_retry :
250
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction'];
251
-                break;
252
-            case EEM_Message::status_failed :
253
-            case EEM_Message::status_debug_only :
254
-                $content = $action_links['error'] . $action_links['view_transaction'];
255
-                break;
256
-            case EEM_Message::status_idle :
257
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
258
-                break;
259
-            case EEM_Message::status_incomplete;
260
-                $content = $action_links['generate_now'] . $action_links['view_transaction'];
261
-                break;
262
-        }
263
-        return $content;
264
-    }
265
-
266
-
267
-    /**
268
-     * Retrieve the EE_Message objects for the list table.
269
-     *
270
-     * @param int    $perpage The number of items per page
271
-     * @param string $view    The view items are being retrieved for
272
-     * @param bool   $count   Whether to just return a count or not.
273
-     * @param bool   $all     Disregard any paging info (no limit on data returned).
274
-     * @return int|EE_Message[]
275
-     * @throws \EE_Error
276
-     */
277
-    protected function _get_messages($perpage = 10, $view = 'all', $count = false, $all = false)
278
-    {
279
-
280
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
281
-            ? $this->_req_data['paged']
282
-            : 1;
283
-
284
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
285
-            ? $this->_req_data['perpage']
286
-            : $perpage;
287
-
288
-        $offset       = ($current_page - 1) * $per_page;
289
-        $limit        = $all || $count ? null : array($offset, $per_page);
290
-        $query_params = array(
291
-            'order_by' => empty($this->_req_data['orderby']) ? 'MSG_modified' : $this->_req_data['orderby'],
292
-            'order'    => empty($this->_req_data['order']) ? 'DESC' : $this->_req_data['order'],
293
-            'limit'    => $limit,
294
-        );
295
-
296
-        /**
297
-         * Any filters coming in from other routes?
298
-         */
299
-        if (isset($this->_req_data['filterby'])) {
300
-            $query_params = array_merge($query_params, EEM_Message::instance()->filter_by_query_params());
301
-            if ( ! $count) {
302
-                $query_params['group_by'] = 'MSG_ID';
303
-            }
304
-        }
305
-
306
-        //view conditionals
307
-        if ($view !== 'all' && $count && $all) {
308
-            $query_params[0]['AND*view_conditional'] = array(
309
-                'STS_ID' => strtoupper($view),
310
-            );
311
-        }
312
-
313
-        if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') {
314
-            $query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed
315
-                ? array(
316
-                    'STS_ID' => array(
317
-                        'IN',
318
-                        array(EEM_Message::status_failed, EEM_Message::status_messenger_executing)
319
-                    )
320
-                )
321
-                : array( 'STS_ID' => strtoupper($this->_req_data['status']) );
322
-        }
323
-
324
-        if (! $all && ! empty($this->_req_data['s'])) {
325
-            $search_string         = '%' . $this->_req_data['s'] . '%';
326
-            $query_params[0]['OR'] = array(
327
-                'MSG_to'      => array('LIKE', $search_string),
328
-                'MSG_from'    => array('LIKE', $search_string),
329
-                'MSG_subject' => array('LIKE', $search_string),
330
-                'MSG_content' => array('LIKE', $search_string),
331
-            );
332
-        }
333
-
334
-        //account for debug only status.  We don't show Messages with the EEM_Message::status_debug_only to clients when
335
-        //the messages system is in debug mode.
336
-        //Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only
337
-        //messages in the database.
338
-        if (! EEM_Message::debug()) {
339
-            $query_params[0]['AND*debug_only_conditional'] = array(
340
-                'STS_ID' => array('!=', EEM_Message::status_debug_only),
341
-            );
342
-        }
343
-
344
-        //account for filters
345
-        if (! $all
346
-            && isset($this->_req_data['ee_messenger_filter_by'])
347
-            && $this->_req_data['ee_messenger_filter_by'] !== 'none_selected'
348
-        ) {
349
-            $query_params[0]['AND*messenger_filter'] = array(
350
-                'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'],
351
-            );
352
-        }
353
-        if (! $all
354
-            && ! empty($this->_req_data['ee_message_type_filter_by'])
355
-            && $this->_req_data['ee_message_type_filter_by'] !== 'none_selected'
356
-        ) {
357
-            $query_params[0]['AND*message_type_filter'] = array(
358
-                'MSG_message_type' => $this->_req_data['ee_message_type_filter_by'],
359
-            );
360
-        }
361
-
362
-        if (! $all
363
-            && ! empty($this->_req_data['ee_context_filter_by'])
364
-            && $this->_req_data['ee_context_filter_by'] !== 'none_selected'
365
-        ) {
366
-            $query_params[0]['AND*context_filter'] = array(
367
-                'MSG_context' => array('IN', explode(',', $this->_req_data['ee_context_filter_by'])),
368
-            );
369
-        }
370
-
371
-        return $count
372
-            /** @type int */
373
-            ? EEM_Message::instance()->count($query_params, null, true)
374
-            /** @type EE_Message[] */
375
-            : EEM_Message::instance()->get_all($query_params);
376
-    }
377
-
378
-
379
-    /**
380
-     * Generate dropdown filter select input for messengers.
381
-     *
382
-     * @return string
383
-     */
384
-    protected function _get_messengers_dropdown_filter()
385
-    {
386
-        $messenger_options                    = array();
387
-        $active_messages_grouped_by_messenger = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
388
-
389
-        //setup array of messenger options
390
-        foreach ($active_messages_grouped_by_messenger as $active_message) {
391
-            if ($active_message instanceof EE_Message) {
392
-                $messenger_options[$active_message->messenger()] = ucwords($active_message->messenger_label());
393
-            }
394
-        }
395
-        return $this->get_admin_page()->get_messengers_select_input($messenger_options);
396
-    }
397
-
398
-
399
-    /**
400
-     * Generate dropdown filter select input for message types
401
-     *
402
-     * @return string
403
-     */
404
-    protected function _get_message_types_dropdown_filter()
405
-    {
406
-        $message_type_options                    = array();
407
-        $active_messages_grouped_by_message_type = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
408
-
409
-        //setup array of message type options
410
-        foreach ($active_messages_grouped_by_message_type as $active_message) {
411
-            if ($active_message instanceof EE_Message) {
412
-                $message_type_options[$active_message->message_type()] = ucwords($active_message->message_type_label());
413
-            }
414
-        }
415
-        return $this->get_admin_page()->get_message_types_select_input($message_type_options);
416
-    }
417
-
418
-
419
-    /**
420
-     * Generate dropdown filter select input for message type contexts
421
-     *
422
-     * @return string
423
-     */
424
-    protected function _get_contexts_for_message_types_dropdown_filter()
425
-    {
426
-        $context_options                    = array();
427
-        $active_messages_grouped_by_context = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
428
-
429
-        //setup array of context options
430
-        foreach ($active_messages_grouped_by_context as $active_message) {
431
-            if ($active_message instanceof EE_Message) {
432
-                $message_type = $active_message->message_type_object();
433
-                if ($message_type instanceof EE_message_type) {
434
-                    foreach ($message_type->get_contexts() as $context => $context_details) {
435
-                        if (isset($context_details['label'])) {
436
-                            $context_options[$context] = $context_details['label'];
437
-                        }
438
-                    }
439
-                }
440
-            }
441
-        }
442
-        return $this->get_admin_page()->get_contexts_for_message_types_select_input($context_options);
443
-    }
18
+	/**
19
+	 * @return Messages_Admin_Page
20
+	 */
21
+	public function get_admin_page()
22
+	{
23
+		return $this->_admin_page;
24
+	}
25
+
26
+
27
+	protected function _setup_data()
28
+	{
29
+		$this->_data           = $this->_get_messages($this->_per_page, $this->_view);
30
+		$this->_all_data_count = $this->_get_messages($this->_per_page, $this->_view, true);
31
+	}
32
+
33
+
34
+	protected function _set_properties()
35
+	{
36
+		$this->_wp_list_args = array(
37
+			'singular' => __('Message', 'event_espresso'),
38
+			'plural'   => __('Messages', 'event_espresso'),
39
+			'ajax'     => true,
40
+			'screen'   => $this->get_admin_page()->get_current_screen()->id,
41
+		);
42
+
43
+		$this->_columns = array(
44
+			'cb'           => '<input type="checkbox" />',
45
+			'to'           => __('To', 'event_espresso'),
46
+			'from'         => __('From', 'event_espresso'),
47
+			'messenger'    => __('Messenger', 'event_espresso'),
48
+			'message_type' => __('Message Type', 'event_espresso'),
49
+			'context'      => __('Context', 'event_espresso'),
50
+			'modified'     => __('Modified', 'event_espresso'),
51
+			'action'       => __('Actions', 'event_espresso'),
52
+			'msg_id'       => __('ID', 'event_espresso'),
53
+		);
54
+
55
+		$this->_sortable_columns = array(
56
+			'modified'     => array('MSG_modified' => true),
57
+			'message_type' => array('MSG_message_type' => false),
58
+			'messenger'    => array('MSG_messenger' => false),
59
+			'to'           => array('MSG_to' => false),
60
+			'from'         => array('MSG_from' => false),
61
+			'context'      => array('MSG_context' => false),
62
+			'msg_id'       => array('MSG_ID', false),
63
+		);
64
+
65
+		$this->_primary_column = 'to';
66
+
67
+		$this->_hidden_columns = array(
68
+			'msg_id',
69
+		);
70
+	}
71
+
72
+
73
+	/**
74
+	 * This simply sets up the row class for the table rows.
75
+	 * Allows for easier overriding of child methods for setting up sorting.
76
+	 *
77
+	 * @param  object $item the current item
78
+	 * @return string
79
+	 */
80
+	protected function _get_row_class($item)
81
+	{
82
+		$class = parent::_get_row_class($item);
83
+		//add status class
84
+		$class .= ' ee-status-strip msg-status-' . $item->STS_ID();
85
+		if ($this->_has_checkbox_column) {
86
+			$class .= ' has-checkbox-column';
87
+		}
88
+		return $class;
89
+	}
90
+
91
+
92
+	/**
93
+	 * _get_table_filters
94
+	 * We use this to assemble and return any filters that are associated with this table that help further refine what
95
+	 * get's shown in the table.
96
+	 *
97
+	 * @abstract
98
+	 * @access protected
99
+	 * @return string
100
+	 * @throws \EE_Error
101
+	 */
102
+	protected function _get_table_filters()
103
+	{
104
+		$filters = array();
105
+
106
+		//get select_inputs
107
+		$select_inputs = array(
108
+			$this->_get_messengers_dropdown_filter(),
109
+			$this->_get_message_types_dropdown_filter(),
110
+			$this->_get_contexts_for_message_types_dropdown_filter(),
111
+		);
112
+
113
+		//set filters to select inputs if they aren't empty
114
+		foreach ($select_inputs as $select_input) {
115
+			if ($select_input) {
116
+				$filters[] = $select_input;
117
+			}
118
+		}
119
+		return $filters;
120
+	}
121
+
122
+
123
+	protected function _add_view_counts()
124
+	{
125
+		foreach ($this->_views as $view => $args) {
126
+			$this->_views[$view]['count'] = $this->_get_messages($this->_per_page, $view, true, true);
127
+		}
128
+	}
129
+
130
+
131
+	/**
132
+	 * @param EE_Message $message
133
+	 * @return string   checkbox
134
+	 * @throws \EE_Error
135
+	 */
136
+	public function column_cb($message)
137
+	{
138
+		return sprintf('<input type="checkbox" name="MSG_ID[%s]" value="1" />', $message->ID());
139
+	}
140
+
141
+
142
+	/**
143
+	 * @param EE_Message $message
144
+	 * @return string
145
+	 * @throws \EE_Error
146
+	 */
147
+	public function column_msg_id(EE_Message $message)
148
+	{
149
+		return $message->ID();
150
+	}
151
+
152
+
153
+	/**
154
+	 * @param EE_Message $message
155
+	 * @return string    The recipient of the message
156
+	 * @throws \EE_Error
157
+	 */
158
+	public function column_to(EE_Message $message)
159
+	{
160
+		EE_Registry::instance()->load_helper('URL');
161
+		$actions           = array();
162
+		$actions['delete'] = '<a href="'
163
+							 . EEH_URL::add_query_args_and_nonce(
164
+				array(
165
+					'page'   => 'espresso_messages',
166
+					'action' => 'delete_ee_message',
167
+					'MSG_ID' => $message->ID(),
168
+				),
169
+				admin_url('admin.php')
170
+			)
171
+							 . '">' . __('Delete', 'event_espresso') . '</a>';
172
+		return esc_html($message->to()) . $this->row_actions($actions);
173
+	}
174
+
175
+
176
+	/**
177
+	 * @param EE_Message $message
178
+	 * @return string   The sender of the message
179
+	 */
180
+	public function column_from(EE_Message $message)
181
+	{
182
+		return esc_html($message->from());
183
+	}
184
+
185
+
186
+	/**
187
+	 * @param EE_Message $message
188
+	 * @return string  The messenger used to send the message.
189
+	 */
190
+	public function column_messenger(EE_Message $message)
191
+	{
192
+		return ucwords($message->messenger_label());
193
+	}
194
+
195
+
196
+	/**
197
+	 * @param EE_Message $message
198
+	 * @return string  The message type used to generate the message.
199
+	 */
200
+	public function column_message_type(EE_Message $message)
201
+	{
202
+		return ucwords($message->message_type_label());
203
+	}
204
+
205
+
206
+	/**
207
+	 * @param EE_Message $message
208
+	 * @return string  The context the message was generated for.
209
+	 */
210
+	public function column_context(EE_Message $message)
211
+	{
212
+		return $message->context_label();
213
+	}
214
+
215
+
216
+	/**
217
+	 * @param EE_Message $message
218
+	 * @return string    The timestamp when this message was last modified.
219
+	 */
220
+	public function column_modified(EE_Message $message)
221
+	{
222
+		return $message->modified();
223
+	}
224
+
225
+
226
+	/**
227
+	 * @param EE_Message $message
228
+	 * @return string   Actions that can be done on the current message.
229
+	 */
230
+	public function column_action(EE_Message $message)
231
+	{
232
+		EE_Registry::instance()->load_helper('MSG_Template');
233
+		$action_links = array(
234
+			'view'                => EEH_MSG_Template::get_message_action_link('view', $message),
235
+			'error'               => EEH_MSG_Template::get_message_action_link('error', $message),
236
+			'generate_now'        => EEH_MSG_Template::get_message_action_link('generate_now', $message),
237
+			'send_now'            => EEH_MSG_Template::get_message_action_link('send_now', $message),
238
+			'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message),
239
+			'view_transaction'    => EEH_MSG_Template::get_message_action_link('view_transaction', $message),
240
+		);
241
+		$content      = '';
242
+		switch ($message->STS_ID()) {
243
+			case EEM_Message::status_sent :
244
+				$content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction'];
245
+				break;
246
+			case EEM_Message::status_resend :
247
+				$content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
248
+				break;
249
+			case EEM_Message::status_retry :
250
+				$content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction'];
251
+				break;
252
+			case EEM_Message::status_failed :
253
+			case EEM_Message::status_debug_only :
254
+				$content = $action_links['error'] . $action_links['view_transaction'];
255
+				break;
256
+			case EEM_Message::status_idle :
257
+				$content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
258
+				break;
259
+			case EEM_Message::status_incomplete;
260
+				$content = $action_links['generate_now'] . $action_links['view_transaction'];
261
+				break;
262
+		}
263
+		return $content;
264
+	}
265
+
266
+
267
+	/**
268
+	 * Retrieve the EE_Message objects for the list table.
269
+	 *
270
+	 * @param int    $perpage The number of items per page
271
+	 * @param string $view    The view items are being retrieved for
272
+	 * @param bool   $count   Whether to just return a count or not.
273
+	 * @param bool   $all     Disregard any paging info (no limit on data returned).
274
+	 * @return int|EE_Message[]
275
+	 * @throws \EE_Error
276
+	 */
277
+	protected function _get_messages($perpage = 10, $view = 'all', $count = false, $all = false)
278
+	{
279
+
280
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
281
+			? $this->_req_data['paged']
282
+			: 1;
283
+
284
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
285
+			? $this->_req_data['perpage']
286
+			: $perpage;
287
+
288
+		$offset       = ($current_page - 1) * $per_page;
289
+		$limit        = $all || $count ? null : array($offset, $per_page);
290
+		$query_params = array(
291
+			'order_by' => empty($this->_req_data['orderby']) ? 'MSG_modified' : $this->_req_data['orderby'],
292
+			'order'    => empty($this->_req_data['order']) ? 'DESC' : $this->_req_data['order'],
293
+			'limit'    => $limit,
294
+		);
295
+
296
+		/**
297
+		 * Any filters coming in from other routes?
298
+		 */
299
+		if (isset($this->_req_data['filterby'])) {
300
+			$query_params = array_merge($query_params, EEM_Message::instance()->filter_by_query_params());
301
+			if ( ! $count) {
302
+				$query_params['group_by'] = 'MSG_ID';
303
+			}
304
+		}
305
+
306
+		//view conditionals
307
+		if ($view !== 'all' && $count && $all) {
308
+			$query_params[0]['AND*view_conditional'] = array(
309
+				'STS_ID' => strtoupper($view),
310
+			);
311
+		}
312
+
313
+		if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') {
314
+			$query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed
315
+				? array(
316
+					'STS_ID' => array(
317
+						'IN',
318
+						array(EEM_Message::status_failed, EEM_Message::status_messenger_executing)
319
+					)
320
+				)
321
+				: array( 'STS_ID' => strtoupper($this->_req_data['status']) );
322
+		}
323
+
324
+		if (! $all && ! empty($this->_req_data['s'])) {
325
+			$search_string         = '%' . $this->_req_data['s'] . '%';
326
+			$query_params[0]['OR'] = array(
327
+				'MSG_to'      => array('LIKE', $search_string),
328
+				'MSG_from'    => array('LIKE', $search_string),
329
+				'MSG_subject' => array('LIKE', $search_string),
330
+				'MSG_content' => array('LIKE', $search_string),
331
+			);
332
+		}
333
+
334
+		//account for debug only status.  We don't show Messages with the EEM_Message::status_debug_only to clients when
335
+		//the messages system is in debug mode.
336
+		//Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only
337
+		//messages in the database.
338
+		if (! EEM_Message::debug()) {
339
+			$query_params[0]['AND*debug_only_conditional'] = array(
340
+				'STS_ID' => array('!=', EEM_Message::status_debug_only),
341
+			);
342
+		}
343
+
344
+		//account for filters
345
+		if (! $all
346
+			&& isset($this->_req_data['ee_messenger_filter_by'])
347
+			&& $this->_req_data['ee_messenger_filter_by'] !== 'none_selected'
348
+		) {
349
+			$query_params[0]['AND*messenger_filter'] = array(
350
+				'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'],
351
+			);
352
+		}
353
+		if (! $all
354
+			&& ! empty($this->_req_data['ee_message_type_filter_by'])
355
+			&& $this->_req_data['ee_message_type_filter_by'] !== 'none_selected'
356
+		) {
357
+			$query_params[0]['AND*message_type_filter'] = array(
358
+				'MSG_message_type' => $this->_req_data['ee_message_type_filter_by'],
359
+			);
360
+		}
361
+
362
+		if (! $all
363
+			&& ! empty($this->_req_data['ee_context_filter_by'])
364
+			&& $this->_req_data['ee_context_filter_by'] !== 'none_selected'
365
+		) {
366
+			$query_params[0]['AND*context_filter'] = array(
367
+				'MSG_context' => array('IN', explode(',', $this->_req_data['ee_context_filter_by'])),
368
+			);
369
+		}
370
+
371
+		return $count
372
+			/** @type int */
373
+			? EEM_Message::instance()->count($query_params, null, true)
374
+			/** @type EE_Message[] */
375
+			: EEM_Message::instance()->get_all($query_params);
376
+	}
377
+
378
+
379
+	/**
380
+	 * Generate dropdown filter select input for messengers.
381
+	 *
382
+	 * @return string
383
+	 */
384
+	protected function _get_messengers_dropdown_filter()
385
+	{
386
+		$messenger_options                    = array();
387
+		$active_messages_grouped_by_messenger = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
388
+
389
+		//setup array of messenger options
390
+		foreach ($active_messages_grouped_by_messenger as $active_message) {
391
+			if ($active_message instanceof EE_Message) {
392
+				$messenger_options[$active_message->messenger()] = ucwords($active_message->messenger_label());
393
+			}
394
+		}
395
+		return $this->get_admin_page()->get_messengers_select_input($messenger_options);
396
+	}
397
+
398
+
399
+	/**
400
+	 * Generate dropdown filter select input for message types
401
+	 *
402
+	 * @return string
403
+	 */
404
+	protected function _get_message_types_dropdown_filter()
405
+	{
406
+		$message_type_options                    = array();
407
+		$active_messages_grouped_by_message_type = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
408
+
409
+		//setup array of message type options
410
+		foreach ($active_messages_grouped_by_message_type as $active_message) {
411
+			if ($active_message instanceof EE_Message) {
412
+				$message_type_options[$active_message->message_type()] = ucwords($active_message->message_type_label());
413
+			}
414
+		}
415
+		return $this->get_admin_page()->get_message_types_select_input($message_type_options);
416
+	}
417
+
418
+
419
+	/**
420
+	 * Generate dropdown filter select input for message type contexts
421
+	 *
422
+	 * @return string
423
+	 */
424
+	protected function _get_contexts_for_message_types_dropdown_filter()
425
+	{
426
+		$context_options                    = array();
427
+		$active_messages_grouped_by_context = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
428
+
429
+		//setup array of context options
430
+		foreach ($active_messages_grouped_by_context as $active_message) {
431
+			if ($active_message instanceof EE_Message) {
432
+				$message_type = $active_message->message_type_object();
433
+				if ($message_type instanceof EE_message_type) {
434
+					foreach ($message_type->get_contexts() as $context => $context_details) {
435
+						if (isset($context_details['label'])) {
436
+							$context_options[$context] = $context_details['label'];
437
+						}
438
+					}
439
+				}
440
+			}
441
+		}
442
+		return $this->get_admin_page()->get_contexts_for_message_types_select_input($context_options);
443
+	}
444 444
 } //end EE_Message_List_Table class
445 445
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-if (! defined('EVENT_ESPRESSO_VERSION')) {
2
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3 3
     exit('NO direct script access allowed');
4 4
 }
5 5
 
@@ -81,7 +81,7 @@  discard block
 block discarded – undo
81 81
     {
82 82
         $class = parent::_get_row_class($item);
83 83
         //add status class
84
-        $class .= ' ee-status-strip msg-status-' . $item->STS_ID();
84
+        $class .= ' ee-status-strip msg-status-'.$item->STS_ID();
85 85
         if ($this->_has_checkbox_column) {
86 86
             $class .= ' has-checkbox-column';
87 87
         }
@@ -168,8 +168,8 @@  discard block
 block discarded – undo
168 168
                 ),
169 169
                 admin_url('admin.php')
170 170
             )
171
-                             . '">' . __('Delete', 'event_espresso') . '</a>';
172
-        return esc_html($message->to()) . $this->row_actions($actions);
171
+                             . '">'.__('Delete', 'event_espresso').'</a>';
172
+        return esc_html($message->to()).$this->row_actions($actions);
173 173
     }
174 174
 
175 175
 
@@ -238,26 +238,26 @@  discard block
 block discarded – undo
238 238
             'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message),
239 239
             'view_transaction'    => EEH_MSG_Template::get_message_action_link('view_transaction', $message),
240 240
         );
241
-        $content      = '';
241
+        $content = '';
242 242
         switch ($message->STS_ID()) {
243 243
             case EEM_Message::status_sent :
244
-                $content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction'];
244
+                $content = $action_links['view'].$action_links['queue_for_resending'].$action_links['view_transaction'];
245 245
                 break;
246 246
             case EEM_Message::status_resend :
247
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
247
+                $content = $action_links['view'].$action_links['send_now'].$action_links['view_transaction'];
248 248
                 break;
249 249
             case EEM_Message::status_retry :
250
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction'];
250
+                $content = $action_links['view'].$action_links['send_now'].$action_links['error'].$action_links['view_transaction'];
251 251
                 break;
252 252
             case EEM_Message::status_failed :
253 253
             case EEM_Message::status_debug_only :
254
-                $content = $action_links['error'] . $action_links['view_transaction'];
254
+                $content = $action_links['error'].$action_links['view_transaction'];
255 255
                 break;
256 256
             case EEM_Message::status_idle :
257
-                $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction'];
257
+                $content = $action_links['view'].$action_links['send_now'].$action_links['view_transaction'];
258 258
                 break;
259 259
             case EEM_Message::status_incomplete;
260
-                $content = $action_links['generate_now'] . $action_links['view_transaction'];
260
+                $content = $action_links['generate_now'].$action_links['view_transaction'];
261 261
                 break;
262 262
         }
263 263
         return $content;
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
             );
311 311
         }
312 312
 
313
-        if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') {
313
+        if ( ! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') {
314 314
             $query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed
315 315
                 ? array(
316 316
                     'STS_ID' => array(
@@ -318,11 +318,11 @@  discard block
 block discarded – undo
318 318
                         array(EEM_Message::status_failed, EEM_Message::status_messenger_executing)
319 319
                     )
320 320
                 )
321
-                : array( 'STS_ID' => strtoupper($this->_req_data['status']) );
321
+                : array('STS_ID' => strtoupper($this->_req_data['status']));
322 322
         }
323 323
 
324
-        if (! $all && ! empty($this->_req_data['s'])) {
325
-            $search_string         = '%' . $this->_req_data['s'] . '%';
324
+        if ( ! $all && ! empty($this->_req_data['s'])) {
325
+            $search_string         = '%'.$this->_req_data['s'].'%';
326 326
             $query_params[0]['OR'] = array(
327 327
                 'MSG_to'      => array('LIKE', $search_string),
328 328
                 'MSG_from'    => array('LIKE', $search_string),
@@ -335,14 +335,14 @@  discard block
 block discarded – undo
335 335
         //the messages system is in debug mode.
336 336
         //Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only
337 337
         //messages in the database.
338
-        if (! EEM_Message::debug()) {
338
+        if ( ! EEM_Message::debug()) {
339 339
             $query_params[0]['AND*debug_only_conditional'] = array(
340 340
                 'STS_ID' => array('!=', EEM_Message::status_debug_only),
341 341
             );
342 342
         }
343 343
 
344 344
         //account for filters
345
-        if (! $all
345
+        if ( ! $all
346 346
             && isset($this->_req_data['ee_messenger_filter_by'])
347 347
             && $this->_req_data['ee_messenger_filter_by'] !== 'none_selected'
348 348
         ) {
@@ -350,7 +350,7 @@  discard block
 block discarded – undo
350 350
                 'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'],
351 351
             );
352 352
         }
353
-        if (! $all
353
+        if ( ! $all
354 354
             && ! empty($this->_req_data['ee_message_type_filter_by'])
355 355
             && $this->_req_data['ee_message_type_filter_by'] !== 'none_selected'
356 356
         ) {
@@ -359,7 +359,7 @@  discard block
 block discarded – undo
359 359
             );
360 360
         }
361 361
 
362
-        if (! $all
362
+        if ( ! $all
363 363
             && ! empty($this->_req_data['ee_context_filter_by'])
364 364
             && $this->_req_data['ee_context_filter_by'] !== 'none_selected'
365 365
         ) {
Please login to merge, or discard this patch.