Completed
Branch TASK-10784-decaf-about-page (62f2e5)
by
unknown
109:00 queued 96:17
created
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Spacing   +85 added lines, -85 removed lines patch added patch discarded remove patch
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
         // when adding a new registration...
70 70
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71 71
             EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
72
+            if ( ! isset($this->_req_data['processing_registration'])
73 73
                  || absint($this->_req_data['processing_registration']) !== 1
74 74
             ) {
75 75
                 // and it's NOT the attendee information reg step
@@ -577,7 +577,7 @@  discard block
 block discarded – undo
577 577
         //style
578 578
         wp_register_style(
579 579
             'espresso_reg',
580
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
580
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
581 581
             array('ee-admin-css'),
582 582
             EVENT_ESPRESSO_VERSION
583 583
         );
@@ -585,7 +585,7 @@  discard block
 block discarded – undo
585 585
         //script
586 586
         wp_register_script(
587 587
             'espresso_reg',
588
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
588
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
589 589
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590 590
             EVENT_ESPRESSO_VERSION,
591 591
             true
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
         wp_deregister_style('espresso_reg');
624 624
         wp_register_style(
625 625
             'espresso_att',
626
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
626
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
627 627
             array('ee-admin-css'),
628 628
             EVENT_ESPRESSO_VERSION
629 629
         );
@@ -635,7 +635,7 @@  discard block
 block discarded – undo
635 635
     {
636 636
         wp_register_script(
637 637
             'ee-spco-for-admin',
638
-            REG_ASSETS_URL . 'spco_for_admin.js',
638
+            REG_ASSETS_URL.'spco_for_admin.js',
639 639
             array('underscore', 'jquery'),
640 640
             EVENT_ESPRESSO_VERSION,
641 641
             true
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
                     'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769 769
                 ),
770 770
             );
771
-            $this->_views['trash']      = array(
771
+            $this->_views['trash'] = array(
772 772
                 'slug'        => 'trash',
773 773
                 'label'       => esc_html__('Trash', 'event_espresso'),
774 774
                 'count'       => 0,
@@ -857,7 +857,7 @@  discard block
 block discarded – undo
857 857
         }
858 858
         $sc_items = array(
859 859
             'approved_status'   => array(
860
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
860
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
861 861
                 'desc'  => EEH_Template::pretty_status(
862 862
                     EEM_Registration::status_id_approved,
863 863
                     false,
@@ -865,7 +865,7 @@  discard block
 block discarded – undo
865 865
                 ),
866 866
             ),
867 867
             'pending_status'    => array(
868
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
868
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
869 869
                 'desc'  => EEH_Template::pretty_status(
870 870
                     EEM_Registration::status_id_pending_payment,
871 871
                     false,
@@ -873,7 +873,7 @@  discard block
 block discarded – undo
873 873
                 ),
874 874
             ),
875 875
             'wait_list'         => array(
876
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
876
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
877 877
                 'desc'  => EEH_Template::pretty_status(
878 878
                     EEM_Registration::status_id_wait_list,
879 879
                     false,
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
                 ),
882 882
             ),
883 883
             'incomplete_status' => array(
884
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
884
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
885 885
                 'desc'  => EEH_Template::pretty_status(
886 886
                     EEM_Registration::status_id_incomplete,
887 887
                     false,
@@ -889,7 +889,7 @@  discard block
 block discarded – undo
889 889
                 ),
890 890
             ),
891 891
             'not_approved'      => array(
892
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
892
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
893 893
                 'desc'  => EEH_Template::pretty_status(
894 894
                     EEM_Registration::status_id_not_approved,
895 895
                     false,
@@ -897,7 +897,7 @@  discard block
 block discarded – undo
897 897
                 ),
898 898
             ),
899 899
             'declined_status'   => array(
900
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
900
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
901 901
                 'desc'  => EEH_Template::pretty_status(
902 902
                     EEM_Registration::status_id_declined,
903 903
                     false,
@@ -905,7 +905,7 @@  discard block
 block discarded – undo
905 905
                 ),
906 906
             ),
907 907
             'cancelled_status'  => array(
908
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
908
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
909 909
                 'desc'  => EEH_Template::pretty_status(
910 910
                     EEM_Registration::status_id_cancelled,
911 911
                     false,
@@ -934,7 +934,7 @@  discard block
 block discarded – undo
934 934
                 'espresso_registrations_new_registration',
935 935
                 $EVT_ID
936 936
             )) {
937
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
937
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
938 938
                     'new_registration',
939 939
                     'add-registrant',
940 940
                     array('event_id' => $EVT_ID),
@@ -974,7 +974,7 @@  discard block
 block discarded – undo
974 974
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975 975
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976 976
                 $this->_template_args['admin_page_header'] .= $datetime->name();
977
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
977
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
978 978
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
979 979
             }
980 980
         }
@@ -1074,7 +1074,7 @@  discard block
 block discarded – undo
1074 1074
             'caps'                     => EEM_Registration::caps_read_admin,
1075 1075
             'default_where_conditions' => 'this_model_only',
1076 1076
         );
1077
-        if (! $count) {
1077
+        if ( ! $count) {
1078 1078
             $query_params = array_merge(
1079 1079
                 $query_params,
1080 1080
                 $this->_get_orderby_for_registrations_query(),
@@ -1095,7 +1095,7 @@  discard block
 block discarded – undo
1095 1095
     protected function _add_event_id_to_where_conditions(array $request)
1096 1096
     {
1097 1097
         $where = array();
1098
-        if (! empty($request['event_id'])) {
1098
+        if ( ! empty($request['event_id'])) {
1099 1099
             $where['EVT_ID'] = absint($request['event_id']);
1100 1100
         }
1101 1101
         return $where;
@@ -1111,7 +1111,7 @@  discard block
 block discarded – undo
1111 1111
     protected function _add_category_id_to_where_conditions(array $request)
1112 1112
     {
1113 1113
         $where = array();
1114
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1114
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1115 1115
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116 1116
         }
1117 1117
         return $where;
@@ -1127,10 +1127,10 @@  discard block
 block discarded – undo
1127 1127
     protected function _add_datetime_id_to_where_conditions(array $request)
1128 1128
     {
1129 1129
         $where = array();
1130
-        if (! empty($request['datetime_id'])) {
1130
+        if ( ! empty($request['datetime_id'])) {
1131 1131
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132 1132
         }
1133
-        if (! empty($request['DTT_ID'])) {
1133
+        if ( ! empty($request['DTT_ID'])) {
1134 1134
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135 1135
         }
1136 1136
         return $where;
@@ -1156,7 +1156,7 @@  discard block
 block discarded – undo
1156 1156
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1157 1157
          * UNLESS viewing trashed registrations.
1158 1158
          */
1159
-        if (! empty($registration_status)) {
1159
+        if ( ! empty($registration_status)) {
1160 1160
             $where['STS_ID'] = $registration_status;
1161 1161
         } else {
1162 1162
             //make sure we exclude incomplete registrations, but only if not trashed.
@@ -1196,12 +1196,12 @@  discard block
 block discarded – undo
1196 1196
                 array(
1197 1197
                     EEM_Registration::instance()->convert_datetime_for_query(
1198 1198
                         'REG_date',
1199
-                        $now . ' 00:00:00',
1199
+                        $now.' 00:00:00',
1200 1200
                         'Y-m-d H:i:s'
1201 1201
                     ),
1202 1202
                     EEM_Registration::instance()->convert_datetime_for_query(
1203 1203
                         'REG_date',
1204
-                        $now . ' 23:59:59',
1204
+                        $now.' 23:59:59',
1205 1205
                         'Y-m-d H:i:s'
1206 1206
                     ),
1207 1207
                 ),
@@ -1214,12 +1214,12 @@  discard block
 block discarded – undo
1214 1214
                 array(
1215 1215
                     EEM_Registration::instance()->convert_datetime_for_query(
1216 1216
                         'REG_date',
1217
-                        $current_year_and_month . '-01 00:00:00',
1217
+                        $current_year_and_month.'-01 00:00:00',
1218 1218
                         'Y-m-d H:i:s'
1219 1219
                     ),
1220 1220
                     EEM_Registration::instance()->convert_datetime_for_query(
1221 1221
                         'REG_date',
1222
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1222
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1223 1223
                         'Y-m-d H:i:s'
1224 1224
                     ),
1225 1225
                 ),
@@ -1234,18 +1234,18 @@  discard block
 block discarded – undo
1234 1234
                 : '';
1235 1235
             //if there is not a month or year then we can't go further
1236 1236
             if ($month_requested && $year_requested) {
1237
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1237
+                $days_in_month     = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1238 1238
                 $where['REG_date'] = array(
1239 1239
                     'BETWEEN',
1240 1240
                     array(
1241 1241
                         EEM_Registration::instance()->convert_datetime_for_query(
1242 1242
                             'REG_date',
1243
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1243
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1244 1244
                             'Y-m-d H:i:s'
1245 1245
                         ),
1246 1246
                         EEM_Registration::instance()->convert_datetime_for_query(
1247 1247
                             'REG_date',
1248
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1248
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1249 1249
                             'Y-m-d H:i:s'
1250 1250
                         ),
1251 1251
                     ),
@@ -1265,8 +1265,8 @@  discard block
 block discarded – undo
1265 1265
     protected function _add_search_to_where_conditions(array $request)
1266 1266
     {
1267 1267
         $where = array();
1268
-        if (! empty($request['s'])) {
1269
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1268
+        if ( ! empty($request['s'])) {
1269
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1270 1270
             $where['OR*search_conditions'] = array(
1271 1271
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1272 1272
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1379,7 +1379,7 @@  discard block
 block discarded – undo
1379 1379
             : $per_page;
1380 1380
 
1381 1381
         //-1 means return all results so get out if that's set.
1382
-        if ((int)$per_page === -1) {
1382
+        if ((int) $per_page === -1) {
1383 1383
             return array();
1384 1384
         }
1385 1385
         $per_page = absint($per_page);
@@ -1432,7 +1432,7 @@  discard block
 block discarded – undo
1432 1432
                 ),
1433 1433
                 REG_ADMIN_URL
1434 1434
             );
1435
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1435
+            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1436 1436
                 array(
1437 1437
                     'action' => 'default',
1438 1438
                     'EVT_ID' => $event_id,
@@ -1440,7 +1440,7 @@  discard block
 block discarded – undo
1440 1440
                 ),
1441 1441
                 admin_url('admin.php')
1442 1442
             );
1443
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1443
+            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1444 1444
                 array(
1445 1445
                     'page'   => 'espresso_events',
1446 1446
                     'action' => 'edit',
@@ -1449,12 +1449,12 @@  discard block
 block discarded – undo
1449 1449
                 admin_url('admin.php')
1450 1450
             );
1451 1451
             //next and previous links
1452
-            $next_reg                                      = $this->_registration->next(
1452
+            $next_reg = $this->_registration->next(
1453 1453
                 null,
1454 1454
                 array(),
1455 1455
                 'REG_ID'
1456 1456
             );
1457
-            $this->_template_args['next_registration']     = $next_reg
1457
+            $this->_template_args['next_registration'] = $next_reg
1458 1458
                 ? $this->_next_link(
1459 1459
                     EE_Admin_Page::add_query_args_and_nonce(
1460 1460
                         array(
@@ -1466,7 +1466,7 @@  discard block
 block discarded – undo
1466 1466
                     'dashicons dashicons-arrow-right ee-icon-size-22'
1467 1467
                 )
1468 1468
                 : '';
1469
-            $previous_reg                                  = $this->_registration->previous(
1469
+            $previous_reg = $this->_registration->previous(
1470 1470
                 null,
1471 1471
                 array(),
1472 1472
                 'REG_ID'
@@ -1484,7 +1484,7 @@  discard block
 block discarded – undo
1484 1484
                 )
1485 1485
                 : '';
1486 1486
             // grab header
1487
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1487
+            $template_path                             = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1488 1488
             $this->_template_args['REG_ID']            = $this->_registration->ID();
1489 1489
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490 1490
                 $template_path,
@@ -1599,7 +1599,7 @@  discard block
 block discarded – undo
1599 1599
                             EEH_HTML::strong(
1600 1600
                                 $this->_registration->pretty_status(),
1601 1601
                                 '',
1602
-                                'status-' . $this->_registration->status_ID(),
1602
+                                'status-'.$this->_registration->status_ID(),
1603 1603
                                 'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604 1604
                             )
1605 1605
                         )
@@ -1669,9 +1669,9 @@  discard block
 block discarded – undo
1669 1669
     {
1670 1670
         if (isset($this->_req_data['reg_status_change_form'])) {
1671 1671
             $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1672
+                ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673 1673
         } else {
1674
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1674
+            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array) $this->_req_data['_REG_ID'] : array();
1675 1675
         }
1676 1676
         $success = $this->_set_registration_status($REG_IDs, $status);
1677 1677
         //notify?
@@ -1703,7 +1703,7 @@  discard block
 block discarded – undo
1703 1703
     {
1704 1704
         $success = false;
1705 1705
         // typecast $REG_IDs
1706
-        $REG_IDs = (array)$REG_IDs;
1706
+        $REG_IDs = (array) $REG_IDs;
1707 1707
         if ( ! empty($REG_IDs)) {
1708 1708
             $success = true;
1709 1709
             // set default status if none is passed
@@ -1933,7 +1933,7 @@  discard block
 block discarded – undo
1933 1933
             $filtered_line_item_tree,
1934 1934
             array('EE_Registration' => $this->_registration)
1935 1935
         );
1936
-        $attendee                                = $this->_registration->attendee();
1936
+        $attendee = $this->_registration->attendee();
1937 1937
         if (EE_Registry::instance()->CAP->current_user_can(
1938 1938
             'ee_read_transaction',
1939 1939
             'espresso_transactions_view_transaction'
@@ -2012,7 +2012,7 @@  discard block
 block discarded – undo
2012 2012
                 'Payment method response',
2013 2013
                 'event_espresso'
2014 2014
             );
2015
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2015
+            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2016 2016
         }
2017 2017
         $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018 2018
         $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
@@ -2040,7 +2040,7 @@  discard block
 block discarded – undo
2040 2040
         $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041 2041
         $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042 2042
         $template_path                                                        =
2043
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2043
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2044 2044
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045 2045
     }
2046 2046
 
@@ -2069,7 +2069,7 @@  discard block
 block discarded – undo
2069 2069
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070 2070
             $this->_template_args['REG_ID']                    = $this->_registration->ID();
2071 2071
             $template_path                                     =
2072
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2072
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2073 2073
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074 2074
         }
2075 2075
     }
@@ -2086,7 +2086,7 @@  discard block
 block discarded – undo
2086 2086
     public function form_before_question_group($output)
2087 2087
     {
2088 2088
         EE_Error::doing_it_wrong(
2089
-            __CLASS__ . '::' . __FUNCTION__,
2089
+            __CLASS__.'::'.__FUNCTION__,
2090 2090
             esc_html__(
2091 2091
                 '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.',
2092 2092
                 'event_espresso'
@@ -2111,7 +2111,7 @@  discard block
 block discarded – undo
2111 2111
     public function form_after_question_group($output)
2112 2112
     {
2113 2113
         EE_Error::doing_it_wrong(
2114
-            __CLASS__ . '::' . __FUNCTION__,
2114
+            __CLASS__.'::'.__FUNCTION__,
2115 2115
             esc_html__(
2116 2116
                 '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.',
2117 2117
                 'event_espresso'
@@ -2149,7 +2149,7 @@  discard block
 block discarded – undo
2149 2149
     public function form_form_field_label_wrap($label)
2150 2150
     {
2151 2151
         EE_Error::doing_it_wrong(
2152
-            __CLASS__ . '::' . __FUNCTION__,
2152
+            __CLASS__.'::'.__FUNCTION__,
2153 2153
             esc_html__(
2154 2154
                 '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.',
2155 2155
                 'event_espresso'
@@ -2159,7 +2159,7 @@  discard block
 block discarded – undo
2159 2159
         return '
2160 2160
 			<tr>
2161 2161
 				<th>
2162
-					' . $label . '
2162
+					' . $label.'
2163 2163
 				</th>';
2164 2164
     }
2165 2165
 
@@ -2175,7 +2175,7 @@  discard block
 block discarded – undo
2175 2175
     public function form_form_field_input__wrap($input)
2176 2176
     {
2177 2177
         EE_Error::doing_it_wrong(
2178
-            __CLASS__ . '::' . __FUNCTION__,
2178
+            __CLASS__.'::'.__FUNCTION__,
2179 2179
             esc_html__(
2180 2180
                 '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.',
2181 2181
                 'event_espresso'
@@ -2184,7 +2184,7 @@  discard block
 block discarded – undo
2184 2184
         );
2185 2185
         return '
2186 2186
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2187
-					' . $input . '
2187
+					' . $input.'
2188 2188
 				</td>
2189 2189
 			</tr>';
2190 2190
     }
@@ -2226,7 +2226,7 @@  discard block
 block discarded – undo
2226 2226
     protected function _get_reg_custom_questions_form($REG_ID)
2227 2227
     {
2228 2228
         if ( ! $this->_reg_custom_questions_form) {
2229
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2229
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
2230 2230
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231 2231
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232 2232
             );
@@ -2259,7 +2259,7 @@  discard block
 block discarded – undo
2259 2259
         if ($form->is_valid()) {
2260 2260
             foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261 2261
                 foreach ($question_group_form->inputs() as $question_id => $input) {
2262
-                    $where_conditions    = array(
2262
+                    $where_conditions = array(
2263 2263
                         'QST_ID' => $question_id,
2264 2264
                         'REG_ID' => $REG_ID,
2265 2265
                     );
@@ -2297,7 +2297,7 @@  discard block
 block discarded – undo
2297 2297
         $REG = EEM_Registration::instance();
2298 2298
         //get all other registrations on this transaction, and cache
2299 2299
         //the attendees for them so we don't have to run another query using force_join
2300
-        $registrations                           = $REG->get_all(array(
2300
+        $registrations = $REG->get_all(array(
2301 2301
             array(
2302 2302
                 'TXN_ID' => $this->_registration->transaction_ID(),
2303 2303
                 'REG_ID' => array('!=', $this->_registration->ID()),
@@ -2321,7 +2321,7 @@  discard block
 block discarded – undo
2321 2321
             $att_nmbr = 1;
2322 2322
             foreach ($registrations as $registration) {
2323 2323
                 /* @var $registration EE_Registration */
2324
-                $attendee                                                    = $registration->attendee()
2324
+                $attendee = $registration->attendee()
2325 2325
                     ? $registration->attendee()
2326 2326
                     : EEM_Attendee::instance()
2327 2327
                                   ->create_default_object();
@@ -2334,19 +2334,19 @@  discard block
 block discarded – undo
2334 2334
                     ', ',
2335 2335
                     $attendee->full_address_as_array()
2336 2336
                 );
2337
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2337
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2338 2338
                     array(
2339 2339
                         'action' => 'edit_attendee',
2340 2340
                         'post'   => $attendee->ID(),
2341 2341
                     ),
2342 2342
                     REG_ADMIN_URL
2343 2343
                 );
2344
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2344
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj()->name();
2345 2345
                 $att_nmbr++;
2346 2346
             }
2347 2347
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348 2348
         }
2349
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2349
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2350 2350
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351 2351
     }
2352 2352
 
@@ -2386,20 +2386,20 @@  discard block
 block discarded – undo
2386 2386
         $this->_template_args['phone']             = $attendee->phone();
2387 2387
         $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388 2388
         //edit link
2389
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2389
+        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
2390 2390
             'action' => 'edit_attendee',
2391 2391
             'post'   => $attendee->ID(),
2392 2392
         ), REG_ADMIN_URL);
2393 2393
         $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394 2394
         //create link
2395
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2395
+        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2396 2396
             ? EE_Admin_Page::add_query_args_and_nonce(array(
2397 2397
                 'action'  => 'duplicate_attendee',
2398 2398
                 '_REG_ID' => $this->_registration->ID(),
2399 2399
             ), REG_ADMIN_URL) : '';
2400 2400
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401 2401
         $this->_template_args['att_check']    = $att_check;
2402
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2402
+        $template_path                        = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2403 2403
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404 2404
     }
2405 2405
 
@@ -2441,7 +2441,7 @@  discard block
 block discarded – undo
2441 2441
             /** @var EE_Registration $REG */
2442 2442
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443 2443
             $payments = $REG->registration_payments();
2444
-            if (! empty($payments)) {
2444
+            if ( ! empty($payments)) {
2445 2445
                 $name = $REG->attendee() instanceof EE_Attendee
2446 2446
                     ? $REG->attendee()->full_name()
2447 2447
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2634,7 +2634,7 @@  discard block
 block discarded – undo
2634 2634
                 'action' => 'edit',
2635 2635
                 'post'   => $this->_reg_event->ID(),
2636 2636
             ), EVENTS_ADMIN_URL);
2637
-            $edit_event_lnk                     = '<a href="'
2637
+            $edit_event_lnk = '<a href="'
2638 2638
                                                   . $edit_event_url
2639 2639
                                                   . '" title="'
2640 2640
                                                   . esc_attr__('Edit ', 'event_espresso')
@@ -2652,7 +2652,7 @@  discard block
 block discarded – undo
2652 2652
         }
2653 2653
         // grab header
2654 2654
         $template_path                              =
2655
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2655
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2656 2656
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657 2657
             $this->_template_args, true);
2658 2658
         //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
@@ -2687,7 +2687,7 @@  discard block
 block discarded – undo
2687 2687
                 '</b>'
2688 2688
             );
2689 2689
             return '
2690
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2690
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2691 2691
 	<script >
2692 2692
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2693 2693
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2755,7 +2755,7 @@  discard block
 block discarded – undo
2755 2755
         //we come back to the process_registration_step route.
2756 2756
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757 2757
         return EEH_Template::display_template(
2758
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2758
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2759 2759
             $template_args,
2760 2760
             true
2761 2761
         );
@@ -2774,7 +2774,7 @@  discard block
 block discarded – undo
2774 2774
         if (is_object($this->_reg_event)) {
2775 2775
             return true;
2776 2776
         }
2777
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2777
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778 2778
         if ( ! $EVT_ID) {
2779 2779
             return false;
2780 2780
         }
@@ -2840,7 +2840,7 @@  discard block
 block discarded – undo
2840 2840
                 }
2841 2841
                 break;
2842 2842
             case 'questions' :
2843
-                if (! isset(
2843
+                if ( ! isset(
2844 2844
                     $this->_req_data['txn_reg_status_change'],
2845 2845
                     $this->_req_data['txn_reg_status_change']['send_notifications'])
2846 2846
                 ) {
@@ -2954,7 +2954,7 @@  discard block
 block discarded – undo
2954 2954
     public function get_attendees($per_page, $count = false, $trash = false)
2955 2955
     {
2956 2956
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2957
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
2958 2958
         $ATT_MDL                    = EEM_Attendee::instance();
2959 2959
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960 2960
         switch ($this->_req_data['orderby']) {
@@ -2991,7 +2991,7 @@  discard block
 block discarded – undo
2991 2991
             : $per_page;
2992 2992
         $_where       = array();
2993 2993
         if ( ! empty($this->_req_data['s'])) {
2994
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2994
+            $sstr         = '%'.$this->_req_data['s'].'%';
2995 2995
             $_where['OR'] = array(
2996 2996
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997 2997
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3067,9 +3067,9 @@  discard block
 block discarded – undo
3067 3067
      *                                                     the query parameters from the request
3068 3068
      * @return void ends the request with a redirect or download
3069 3069
      */
3070
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3070
+    public function _registrations_report_base($method_name_for_getting_query_params)
3071 3071
     {
3072
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3072
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073 3073
             wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074 3074
                 array(
3075 3075
                     'page'        => 'espresso_batch',
@@ -3078,7 +3078,7 @@  discard block
 block discarded – undo
3078 3078
                     'filters'     => urlencode(
3079 3079
                         serialize(
3080 3080
                             call_user_func(
3081
-                                array( $this, $method_name_for_getting_query_params ),
3081
+                                array($this, $method_name_for_getting_query_params),
3082 3082
                                 EEH_Array::is_set(
3083 3083
                                     $this->_req_data,
3084 3084
                                     'filters',
@@ -3098,8 +3098,8 @@  discard block
 block discarded – undo
3098 3098
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099 3099
             );
3100 3100
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3101
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3102
+                require_once(EE_CLASSES.'EE_Export.class.php');
3103 3103
                 $EE_Export = EE_Export::instance($this->_req_data);
3104 3104
                 $EE_Export->export();
3105 3105
             }
@@ -3120,8 +3120,8 @@  discard block
 block discarded – undo
3120 3120
 
3121 3121
     public function _contact_list_export()
3122 3122
     {
3123
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3123
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3124
+            require_once(EE_CLASSES.'EE_Export.class.php');
3125 3125
             $EE_Export = EE_Export::instance($this->_req_data);
3126 3126
             $EE_Export->export_attendees();
3127 3127
         }
@@ -3138,8 +3138,8 @@  discard block
 block discarded – undo
3138 3138
                 'return_url'  => urlencode($this->_req_data['return_url']),
3139 3139
             )));
3140 3140
         } else {
3141
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3141
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3142
+                require_once(EE_CLASSES.'EE_Export.class.php');
3143 3143
                 $EE_Export = EE_Export::instance($this->_req_data);
3144 3144
                 $EE_Export->report_attendees();
3145 3145
             }
@@ -3205,7 +3205,7 @@  discard block
 block discarded – undo
3205 3205
             $updated_fields = array(
3206 3206
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3207 3207
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3208
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3209 3209
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210 3210
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211 3211
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3338,7 +3338,7 @@  discard block
 block discarded – undo
3338 3338
     {
3339 3339
         //get attendee object ( should already have it )
3340 3340
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3341
+        $template                         = REG_TEMPLATE_PATH.'attendee_contact_info_metabox_content.template.php';
3342 3342
         EEH_Template::display_template($template, $this->_template_args);
3343 3343
     }
3344 3344
 
@@ -3400,8 +3400,8 @@  discard block
 block discarded – undo
3400 3400
                 )
3401 3401
             )
3402 3402
         );
3403
-        $template                             =
3404
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3403
+        $template =
3404
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3405 3405
         EEH_Template::display_template($template, $this->_template_args);
3406 3406
     }
3407 3407
 
@@ -3420,7 +3420,7 @@  discard block
 block discarded – undo
3420 3420
         $this->_template_args['attendee']      = $this->_cpt_model_obj;
3421 3421
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422 3422
         $template                              =
3423
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3423
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3424 3424
         EEH_Template::display_template($template, $this->_template_args);
3425 3425
     }
3426 3426
 
@@ -3435,7 +3435,7 @@  discard block
 block discarded – undo
3435 3435
     public function after_title_form_fields($post)
3436 3436
     {
3437 3437
         if ($post->post_type == 'espresso_attendees') {
3438
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3438
+            $template                  = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3439 3439
             $template_args['attendee'] = $this->_cpt_model_obj;
3440 3440
             EEH_Template::display_template($template, $template_args);
3441 3441
         }
Please login to merge, or discard this patch.
Indentation   +3425 added lines, -3425 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
 
@@ -23,2111 +23,2111 @@  discard block
 block discarded – undo
23 23
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Registration
28
-     */
29
-    private $_registration;
30
-
31
-    /**
32
-     * @var EE_Event
33
-     */
34
-    private $_reg_event;
35
-
36
-    /**
37
-     * @var EE_Session
38
-     */
39
-    private $_session;
40
-
41
-    private static $_reg_status;
42
-
43
-    /**
44
-     * Form for displaying the custom questions for this registration.
45
-     * This gets used a few times throughout the request so its best to cache it
46
-     *
47
-     * @var EE_Registration_Custom_Questions_Form
48
-     */
49
-    protected $_reg_custom_questions_form = null;
50
-
51
-
52
-    /**
53
-     *        constructor
54
-     *
55
-     * @Constructor
56
-     * @access public
57
-     * @param bool $routing
58
-     * @return Registrations_Admin_Page
59
-     */
60
-    public function __construct($routing = true)
61
-    {
62
-        parent::__construct($routing);
63
-        add_action('wp_loaded', array($this, 'wp_loaded'));
64
-    }
65
-
66
-
67
-    public function wp_loaded()
68
-    {
69
-        // when adding a new registration...
70
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
-            EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
73
-                 || absint($this->_req_data['processing_registration']) !== 1
74
-            ) {
75
-                // and it's NOT the attendee information reg step
76
-                // force cookie expiration by setting time to last week
77
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
-                // and update the global
79
-                $_COOKIE['ee_registration_added'] = 0;
80
-            }
81
-        }
82
-    }
83
-
84
-
85
-    protected function _init_page_props()
86
-    {
87
-        $this->page_slug        = REG_PG_SLUG;
88
-        $this->_admin_base_url  = REG_ADMIN_URL;
89
-        $this->_admin_base_path = REG_ADMIN;
90
-        $this->page_label       = esc_html__('Registrations', 'event_espresso');
91
-        $this->_cpt_routes      = array(
92
-            'add_new_attendee' => 'espresso_attendees',
93
-            'edit_attendee'    => 'espresso_attendees',
94
-            'insert_attendee'  => 'espresso_attendees',
95
-            'update_attendee'  => 'espresso_attendees',
96
-        );
97
-        $this->_cpt_model_names = array(
98
-            'add_new_attendee' => 'EEM_Attendee',
99
-            'edit_attendee'    => 'EEM_Attendee',
100
-        );
101
-        $this->_cpt_edit_routes = array(
102
-            'espresso_attendees' => 'edit_attendee',
103
-        );
104
-        $this->_pagenow_map     = array(
105
-            'add_new_attendee' => 'post-new.php',
106
-            'edit_attendee'    => 'post.php',
107
-            'trash'            => 'post.php',
108
-        );
109
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
-        //add filters so that the comment urls don't take users to a confusing 404 page
111
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
-    }
113
-
114
-
115
-    public function clear_comment_link($link, $comment, $args)
116
-    {
117
-        //gotta make sure this only happens on this route
118
-        $post_type = get_post_type($comment->comment_post_ID);
119
-        if ($post_type === 'espresso_attendees') {
120
-            return '#commentsdiv';
121
-        }
122
-        return $link;
123
-    }
124
-
125
-
126
-    protected function _ajax_hooks()
127
-    {
128
-        //todo: all hooks for registrations ajax goes in here
129
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
-    }
131
-
132
-
133
-    protected function _define_page_props()
134
-    {
135
-        $this->_admin_page_title = $this->page_label;
136
-        $this->_labels           = array(
137
-            'buttons'                      => array(
138
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
-                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
-                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
-            ),
147
-            'publishbox'                   => array(
148
-                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
-                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
-            ),
151
-            'hide_add_button_on_cpt_route' => array(
152
-                'edit_attendee' => true,
153
-            ),
154
-        );
155
-    }
156
-
157
-
158
-    /**
159
-     *        grab url requests and route them
160
-     *
161
-     * @access private
162
-     * @return void
163
-     */
164
-    public function _set_page_routes()
165
-    {
166
-        $this->_get_registration_status_array();
167
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
-            ? $this->_req_data['_REG_ID'] : 0;
169
-        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
-            ? $this->_req_data['ATT_ID'] : 0;
171
-        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
172
-            ? $this->_req_data['post']
173
-            : $att_id;
174
-        $this->_page_routes = array(
175
-            'default'                            => array(
176
-                'func'       => '_registrations_overview_list_table',
177
-                'capability' => 'ee_read_registrations',
178
-            ),
179
-            'view_registration'                  => array(
180
-                'func'       => '_registration_details',
181
-                'capability' => 'ee_read_registration',
182
-                'obj_id'     => $reg_id,
183
-            ),
184
-            'edit_registration'                  => array(
185
-                'func'               => '_update_attendee_registration_form',
186
-                'noheader'           => true,
187
-                'headers_sent_route' => 'view_registration',
188
-                'capability'         => 'ee_edit_registration',
189
-                'obj_id'             => $reg_id,
190
-                '_REG_ID'            => $reg_id,
191
-            ),
192
-            'trash_registrations'                => array(
193
-                'func'       => '_trash_or_restore_registrations',
194
-                'args'       => array('trash' => true),
195
-                'noheader'   => true,
196
-                'capability' => 'ee_delete_registrations',
197
-            ),
198
-            'restore_registrations'              => array(
199
-                'func'       => '_trash_or_restore_registrations',
200
-                'args'       => array('trash' => false),
201
-                'noheader'   => true,
202
-                'capability' => 'ee_delete_registrations',
203
-            ),
204
-            'delete_registrations'               => array(
205
-                'func'       => '_delete_registrations',
206
-                'noheader'   => true,
207
-                'capability' => 'ee_delete_registrations',
208
-            ),
209
-            'new_registration'                   => array(
210
-                'func'       => 'new_registration',
211
-                'capability' => 'ee_edit_registrations',
212
-            ),
213
-            'process_reg_step'                   => array(
214
-                'func'       => 'process_reg_step',
215
-                'noheader'   => true,
216
-                'capability' => 'ee_edit_registrations',
217
-            ),
218
-            'redirect_to_txn'                    => array(
219
-                'func'       => 'redirect_to_txn',
220
-                'noheader'   => true,
221
-                'capability' => 'ee_edit_registrations',
222
-            ),
223
-            'change_reg_status'                  => array(
224
-                'func'       => '_change_reg_status',
225
-                'noheader'   => true,
226
-                'capability' => 'ee_edit_registration',
227
-                'obj_id'     => $reg_id,
228
-            ),
229
-            'approve_registration'               => array(
230
-                'func'       => 'approve_registration',
231
-                'noheader'   => true,
232
-                'capability' => 'ee_edit_registration',
233
-                'obj_id'     => $reg_id,
234
-            ),
235
-            'approve_and_notify_registration'    => array(
236
-                'func'       => 'approve_registration',
237
-                'noheader'   => true,
238
-                'args'       => array(true),
239
-                'capability' => 'ee_edit_registration',
240
-                'obj_id'     => $reg_id,
241
-            ),
242
-            'decline_registration'               => array(
243
-                'func'       => 'decline_registration',
244
-                'noheader'   => true,
245
-                'capability' => 'ee_edit_registration',
246
-                'obj_id'     => $reg_id,
247
-            ),
248
-            'decline_and_notify_registration'    => array(
249
-                'func'       => 'decline_registration',
250
-                'noheader'   => true,
251
-                'args'       => array(true),
252
-                'capability' => 'ee_edit_registration',
253
-                'obj_id'     => $reg_id,
254
-            ),
255
-            'pending_registration'               => array(
256
-                'func'       => 'pending_registration',
257
-                'noheader'   => true,
258
-                'capability' => 'ee_edit_registration',
259
-                'obj_id'     => $reg_id,
260
-            ),
261
-            'pending_and_notify_registration'    => array(
262
-                'func'       => 'pending_registration',
263
-                'noheader'   => true,
264
-                'args'       => array(true),
265
-                'capability' => 'ee_edit_registration',
266
-                'obj_id'     => $reg_id,
267
-            ),
268
-            'no_approve_registration'            => array(
269
-                'func'       => 'not_approve_registration',
270
-                'noheader'   => true,
271
-                'capability' => 'ee_edit_registration',
272
-                'obj_id'     => $reg_id,
273
-            ),
274
-            'no_approve_and_notify_registration' => array(
275
-                'func'       => 'not_approve_registration',
276
-                'noheader'   => true,
277
-                'args'       => array(true),
278
-                'capability' => 'ee_edit_registration',
279
-                'obj_id'     => $reg_id,
280
-            ),
281
-            'cancel_registration'                => array(
282
-                'func'       => 'cancel_registration',
283
-                'noheader'   => true,
284
-                'capability' => 'ee_edit_registration',
285
-                'obj_id'     => $reg_id,
286
-            ),
287
-            'cancel_and_notify_registration'     => array(
288
-                'func'       => 'cancel_registration',
289
-                'noheader'   => true,
290
-                'args'       => array(true),
291
-                'capability' => 'ee_edit_registration',
292
-                'obj_id'     => $reg_id,
293
-            ),
294
-            'contact_list'                       => array(
295
-                'func'       => '_attendee_contact_list_table',
296
-                'capability' => 'ee_read_contacts',
297
-            ),
298
-            'add_new_attendee'                   => array(
299
-                'func' => '_create_new_cpt_item',
300
-                'args' => array(
301
-                    'new_attendee' => true,
302
-                    'capability'   => 'ee_edit_contacts',
303
-                ),
304
-            ),
305
-            'edit_attendee'                      => array(
306
-                'func'       => '_edit_cpt_item',
307
-                'capability' => 'ee_edit_contacts',
308
-                'obj_id'     => $att_id,
309
-            ),
310
-            'duplicate_attendee'                 => array(
311
-                'func'       => '_duplicate_attendee',
312
-                'noheader'   => true,
313
-                'capability' => 'ee_edit_contacts',
314
-                'obj_id'     => $att_id,
315
-            ),
316
-            'insert_attendee'                    => array(
317
-                'func'       => '_insert_or_update_attendee',
318
-                'args'       => array(
319
-                    'new_attendee' => true,
320
-                ),
321
-                'noheader'   => true,
322
-                'capability' => 'ee_edit_contacts',
323
-            ),
324
-            'update_attendee'                    => array(
325
-                'func'       => '_insert_or_update_attendee',
326
-                'args'       => array(
327
-                    'new_attendee' => false,
328
-                ),
329
-                'noheader'   => true,
330
-                'capability' => 'ee_edit_contacts',
331
-                'obj_id'     => $att_id,
332
-            ),
333
-            'trash_attendee'                    => array(
334
-                'func'       => '_trash_or_restore_attendees',
335
-                'args'       => array(
336
-                    'trash' => true,
337
-                ),
338
-                'noheader'   => true,
339
-                'capability' => 'ee_delete_contacts',
340
-                'obj_id'     => $att_id,
341
-            ),
342
-            'restore_attendees'                  => array(
343
-                'func'       => '_trash_or_restore_attendees',
344
-                'args'       => array(
345
-                    'trash' => false,
346
-                ),
347
-                'noheader'   => true,
348
-                'capability' => 'ee_delete_contacts',
349
-                'obj_id'     => $att_id,
350
-            ),
351
-            'resend_registration'                => array(
352
-                'func'       => '_resend_registration',
353
-                'noheader'   => true,
354
-                'capability' => 'ee_send_message',
355
-            ),
356
-            'registrations_report'               => array(
357
-                'func'       => '_registrations_report',
358
-                'noheader'   => true,
359
-                'capability' => 'ee_read_registrations',
360
-            ),
361
-            'contact_list_export'                => array(
362
-                'func'       => '_contact_list_export',
363
-                'noheader'   => true,
364
-                'capability' => 'export',
365
-            ),
366
-            'contact_list_report'                => array(
367
-                'func'       => '_contact_list_report',
368
-                'noheader'   => true,
369
-                'capability' => 'ee_read_contacts',
370
-            ),
371
-        );
372
-    }
373
-
374
-
375
-    protected function _set_page_config()
376
-    {
377
-        $this->_page_config = array(
378
-            'default'           => array(
379
-                'nav'           => array(
380
-                    'label' => esc_html__('Overview', 'event_espresso'),
381
-                    'order' => 5,
382
-                ),
383
-                'help_tabs'     => array(
384
-                    'registrations_overview_help_tab'                       => array(
385
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
386
-                        'filename' => 'registrations_overview',
387
-                    ),
388
-                    'registrations_overview_table_column_headings_help_tab' => array(
389
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
390
-                        'filename' => 'registrations_overview_table_column_headings',
391
-                    ),
392
-                    'registrations_overview_filters_help_tab'               => array(
393
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
394
-                        'filename' => 'registrations_overview_filters',
395
-                    ),
396
-                    'registrations_overview_views_help_tab'                 => array(
397
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
398
-                        'filename' => 'registrations_overview_views',
399
-                    ),
400
-                    'registrations_regoverview_other_help_tab'              => array(
401
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
402
-                        'filename' => 'registrations_overview_other',
403
-                    ),
404
-                ),
405
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
406
-                'qtips'         => array('Registration_List_Table_Tips'),
407
-                'list_table'    => 'EE_Registrations_List_Table',
408
-                'require_nonce' => false,
409
-            ),
410
-            'view_registration' => array(
411
-                'nav'           => array(
412
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
413
-                    'order'      => 15,
414
-                    'url'        => isset($this->_req_data['_REG_ID'])
415
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
416
-                        : $this->_admin_base_url,
417
-                    'persistent' => false,
418
-                ),
419
-                'help_tabs'     => array(
420
-                    'registrations_details_help_tab'                    => array(
421
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
422
-                        'filename' => 'registrations_details',
423
-                    ),
424
-                    'registrations_details_table_help_tab'              => array(
425
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
426
-                        'filename' => 'registrations_details_table',
427
-                    ),
428
-                    'registrations_details_form_answers_help_tab'       => array(
429
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
430
-                        'filename' => 'registrations_details_form_answers',
431
-                    ),
432
-                    'registrations_details_registrant_details_help_tab' => array(
433
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
434
-                        'filename' => 'registrations_details_registrant_details',
435
-                    ),
436
-                ),
437
-                'help_tour'     => array('Registration_Details_Help_Tour'),
438
-                'metaboxes'     => array_merge(
439
-                    $this->_default_espresso_metaboxes,
440
-                    array('_registration_details_metaboxes')
441
-                ),
442
-                'require_nonce' => false,
443
-            ),
444
-            'new_registration'  => array(
445
-                'nav'           => array(
446
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
447
-                    'url'        => '#',
448
-                    'order'      => 15,
449
-                    'persistent' => false,
450
-                ),
451
-                'metaboxes'     => $this->_default_espresso_metaboxes,
452
-                'labels'        => array(
453
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
454
-                ),
455
-                'require_nonce' => false,
456
-            ),
457
-            'add_new_attendee'  => array(
458
-                'nav'           => array(
459
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
460
-                    'order'      => 15,
461
-                    'persistent' => false,
462
-                ),
463
-                'metaboxes'     => array_merge(
464
-                    $this->_default_espresso_metaboxes,
465
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
466
-                ),
467
-                'require_nonce' => false,
468
-            ),
469
-            'edit_attendee'     => array(
470
-                'nav'           => array(
471
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
472
-                    'order'      => 15,
473
-                    'persistent' => false,
474
-                    'url'        => isset($this->_req_data['ATT_ID'])
475
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
476
-                        : $this->_admin_base_url,
477
-                ),
478
-                'metaboxes'     => array('attendee_editor_metaboxes'),
479
-                'require_nonce' => false,
480
-            ),
481
-            'contact_list'      => array(
482
-                'nav'           => array(
483
-                    'label' => esc_html__('Contact List', 'event_espresso'),
484
-                    'order' => 20,
485
-                ),
486
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
487
-                'help_tabs'     => array(
488
-                    'registrations_contact_list_help_tab'                       => array(
489
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
490
-                        'filename' => 'registrations_contact_list',
491
-                    ),
492
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
493
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
494
-                        'filename' => 'registrations_contact_list_table_column_headings',
495
-                    ),
496
-                    'registrations_contact_list_views_help_tab'                 => array(
497
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
498
-                        'filename' => 'registrations_contact_list_views',
499
-                    ),
500
-                    'registrations_contact_list_other_help_tab'                 => array(
501
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
502
-                        'filename' => 'registrations_contact_list_other',
503
-                    ),
504
-                ),
505
-                'help_tour'     => array('Contact_List_Help_Tour'),
506
-                'metaboxes'     => array(),
507
-                'require_nonce' => false,
508
-            ),
509
-            //override default cpt routes
510
-            'create_new'        => '',
511
-            'edit'              => '',
512
-        );
513
-    }
514
-
515
-
516
-    /**
517
-     * The below methods aren't used by this class currently
518
-     */
519
-    protected function _add_screen_options()
520
-    {
521
-    }
522
-
523
-
524
-    protected function _add_feature_pointers()
525
-    {
526
-    }
527
-
528
-
529
-    public function admin_init()
530
-    {
531
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
532
-            'click "Update Registration Questions" to save your changes',
533
-            'event_espresso'
534
-        );
535
-    }
536
-
537
-
538
-    public function admin_notices()
539
-    {
540
-    }
541
-
542
-
543
-    public function admin_footer_scripts()
544
-    {
545
-    }
546
-
547
-
548
-    /**
549
-     *        get list of registration statuses
550
-     *
551
-     * @access private
552
-     * @return void
553
-     */
554
-    private function _get_registration_status_array()
555
-    {
556
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
557
-    }
558
-
559
-
560
-    protected function _add_screen_options_default()
561
-    {
562
-        $this->_per_page_screen_option();
563
-    }
564
-
565
-
566
-    protected function _add_screen_options_contact_list()
567
-    {
568
-        $page_title              = $this->_admin_page_title;
569
-        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
570
-        $this->_per_page_screen_option();
571
-        $this->_admin_page_title = $page_title;
572
-    }
573
-
574
-
575
-    public function load_scripts_styles()
576
-    {
577
-        //style
578
-        wp_register_style(
579
-            'espresso_reg',
580
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
581
-            array('ee-admin-css'),
582
-            EVENT_ESPRESSO_VERSION
583
-        );
584
-        wp_enqueue_style('espresso_reg');
585
-        //script
586
-        wp_register_script(
587
-            'espresso_reg',
588
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
589
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590
-            EVENT_ESPRESSO_VERSION,
591
-            true
592
-        );
593
-        wp_enqueue_script('espresso_reg');
594
-    }
595
-
596
-
597
-    public function load_scripts_styles_edit_attendee()
598
-    {
599
-        //stuff to only show up on our attendee edit details page.
600
-        $attendee_details_translations = array(
601
-            'att_publish_text' => sprintf(
602
-                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
603
-                $this->_cpt_model_obj->get_datetime('ATT_created')
604
-            ),
605
-        );
606
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
607
-        wp_enqueue_script('jquery-validate');
608
-    }
609
-
610
-
611
-    public function load_scripts_styles_view_registration()
612
-    {
613
-        //styles
614
-        wp_enqueue_style('espresso-ui-theme');
615
-        //scripts
616
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
617
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
618
-    }
619
-
620
-
621
-    public function load_scripts_styles_contact_list()
622
-    {
623
-        wp_deregister_style('espresso_reg');
624
-        wp_register_style(
625
-            'espresso_att',
626
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
627
-            array('ee-admin-css'),
628
-            EVENT_ESPRESSO_VERSION
629
-        );
630
-        wp_enqueue_style('espresso_att');
631
-    }
632
-
633
-
634
-    public function load_scripts_styles_new_registration()
635
-    {
636
-        wp_register_script(
637
-            'ee-spco-for-admin',
638
-            REG_ASSETS_URL . 'spco_for_admin.js',
639
-            array('underscore', 'jquery'),
640
-            EVENT_ESPRESSO_VERSION,
641
-            true
642
-        );
643
-        wp_enqueue_script('ee-spco-for-admin');
644
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
645
-        EE_Form_Section_Proper::wp_enqueue_scripts();
646
-        EED_Ticket_Selector::load_tckt_slctr_assets();
647
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
648
-    }
649
-
650
-
651
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
652
-    {
653
-        add_filter('FHEE_load_EE_messages', '__return_true');
654
-    }
655
-
656
-
657
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
658
-    {
659
-        add_filter('FHEE_load_EE_messages', '__return_true');
660
-    }
661
-
662
-
663
-    protected function _set_list_table_views_default()
664
-    {
665
-        //for notification related bulk actions we need to make sure only active messengers have an option.
666
-        EED_Messages::set_autoloaders();
667
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
668
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
669
-        $active_mts               = $message_resource_manager->list_of_active_message_types();
670
-        //key= bulk_action_slug, value= message type.
671
-        $match_array = array(
672
-            'approve_registration'    => 'registration',
673
-            'decline_registration'    => 'declined_registration',
674
-            'pending_registration'    => 'pending_approval',
675
-            'no_approve_registration' => 'not_approved_registration',
676
-            'cancel_registration'     => 'cancelled_registration',
677
-        );
678
-        /** setup reg status bulk actions **/
679
-        $def_reg_status_actions['approve_registration'] = esc_html__('Approve Registrations', 'event_espresso');
680
-        if (in_array($match_array['approve_registration'], $active_mts)
681
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
682
-        ) {
683
-            $def_reg_status_actions['approve_and_notify_registration'] = esc_html__(
684
-                'Approve and Notify Registrations',
685
-                'event_espresso'
686
-            );
687
-        }
688
-        $def_reg_status_actions['decline_registration'] = esc_html__('Decline Registrations', 'event_espresso');
689
-        if (in_array($match_array['decline_registration'], $active_mts)
690
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
691
-        ) {
692
-            $def_reg_status_actions['decline_and_notify_registration'] = esc_html__(
693
-                'Decline and Notify Registrations',
694
-                'event_espresso'
695
-            );
696
-        }
697
-        $def_reg_status_actions['pending_registration'] = esc_html__(
698
-            'Set Registrations to Pending Payment',
699
-            'event_espresso'
700
-        );
701
-        if (in_array($match_array['pending_registration'], $active_mts)
702
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
703
-        ) {
704
-            $def_reg_status_actions['pending_and_notify_registration'] = esc_html__(
705
-                'Set Registrations to Pending Payment and Notify',
706
-                'event_espresso'
707
-            );
708
-        }
709
-        $def_reg_status_actions['no_approve_registration'] = esc_html__(
710
-            'Set Registrations to Not Approved',
711
-            'event_espresso'
712
-        );
713
-        if (in_array($match_array['no_approve_registration'], $active_mts)
714
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
715
-        ) {
716
-            $def_reg_status_actions['no_approve_and_notify_registration'] = esc_html__(
717
-                'Set Registrations to Not Approved and Notify',
718
-                'event_espresso'
719
-            );
720
-        }
721
-        $def_reg_status_actions['cancel_registration'] = esc_html__('Cancel Registrations', 'event_espresso');
722
-        if (in_array($match_array['cancel_registration'], $active_mts)
723
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
724
-        ) {
725
-            $def_reg_status_actions['cancel_and_notify_registration'] = esc_html__(
726
-                'Cancel Registrations and Notify',
727
-                'event_espresso'
728
-            );
729
-        }
730
-        $this->_views = array(
731
-            'all'   => array(
732
-                'slug'        => 'all',
733
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
734
-                'count'       => 0,
735
-                'bulk_action' => array_merge($def_reg_status_actions, array(
736
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
737
-                )),
738
-            ),
739
-            'month' => array(
740
-                'slug'        => 'month',
741
-                'label'       => esc_html__('This Month', 'event_espresso'),
742
-                'count'       => 0,
743
-                'bulk_action' => array_merge($def_reg_status_actions, array(
744
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
745
-                )),
746
-            ),
747
-            'today' => array(
748
-                'slug'        => 'today',
749
-                'label'       => sprintf(
750
-                    esc_html__('Today - %s', 'event_espresso'),
751
-                    date('M d, Y', current_time('timestamp'))
752
-                ),
753
-                'count'       => 0,
754
-                'bulk_action' => array_merge($def_reg_status_actions, array(
755
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
756
-                )),
757
-            ),
758
-        );
759
-        if (EE_Registry::instance()->CAP->current_user_can(
760
-            'ee_delete_registrations',
761
-            'espresso_registrations_delete_registration'
762
-        )) {
763
-            $this->_views['incomplete'] = array(
764
-                'slug'        => 'incomplete',
765
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
766
-                'count'       => 0,
767
-                'bulk_action' => array(
768
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769
-                ),
770
-            );
771
-            $this->_views['trash']      = array(
772
-                'slug'        => 'trash',
773
-                'label'       => esc_html__('Trash', 'event_espresso'),
774
-                'count'       => 0,
775
-                'bulk_action' => array(
776
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
777
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
778
-                ),
779
-            );
780
-        }
781
-    }
782
-
783
-
784
-    protected function _set_list_table_views_contact_list()
785
-    {
786
-        $this->_views = array(
787
-            'in_use' => array(
788
-                'slug'        => 'in_use',
789
-                'label'       => esc_html__('In Use', 'event_espresso'),
790
-                'count'       => 0,
791
-                'bulk_action' => array(
792
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
793
-                ),
794
-            ),
795
-        );
796
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
797
-            'espresso_registrations_trash_attendees')
798
-        ) {
799
-            $this->_views['trash'] = array(
800
-                'slug'        => 'trash',
801
-                'label'       => esc_html__('Trash', 'event_espresso'),
802
-                'count'       => 0,
803
-                'bulk_action' => array(
804
-                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
805
-                ),
806
-            );
807
-        }
808
-    }
809
-
810
-
811
-    protected function _registration_legend_items()
812
-    {
813
-        $fc_items = array(
814
-            'star-icon'        => array(
815
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
816
-                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
817
-            ),
818
-            'view_details'     => array(
819
-                'class' => 'dashicons dashicons-clipboard',
820
-                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
821
-            ),
822
-            'edit_attendee'    => array(
823
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
824
-                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
825
-            ),
826
-            'view_transaction' => array(
827
-                'class' => 'dashicons dashicons-cart',
828
-                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
829
-            ),
830
-            'view_invoice'     => array(
831
-                'class' => 'dashicons dashicons-media-spreadsheet',
832
-                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
833
-            ),
834
-        );
835
-        if (EE_Registry::instance()->CAP->current_user_can(
836
-            'ee_send_message',
837
-            'espresso_registrations_resend_registration'
838
-        )) {
839
-            $fc_items['resend_registration'] = array(
840
-                'class' => 'dashicons dashicons-email-alt',
841
-                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
842
-            );
843
-        } else {
844
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
845
-        }
846
-        if (EE_Registry::instance()->CAP->current_user_can(
847
-            'ee_read_global_messages',
848
-            'view_filtered_messages'
849
-        )) {
850
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
851
-            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
852
-                $fc_items['view_related_messages'] = array(
853
-                    'class' => $related_for_icon['css_class'],
854
-                    'desc'  => $related_for_icon['label'],
855
-                );
856
-            }
857
-        }
858
-        $sc_items = array(
859
-            'approved_status'   => array(
860
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
861
-                'desc'  => EEH_Template::pretty_status(
862
-                    EEM_Registration::status_id_approved,
863
-                    false,
864
-                    'sentence'
865
-                ),
866
-            ),
867
-            'pending_status'    => array(
868
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
869
-                'desc'  => EEH_Template::pretty_status(
870
-                    EEM_Registration::status_id_pending_payment,
871
-                    false,
872
-                    'sentence'
873
-                ),
874
-            ),
875
-            'wait_list'         => array(
876
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
877
-                'desc'  => EEH_Template::pretty_status(
878
-                    EEM_Registration::status_id_wait_list,
879
-                    false,
880
-                    'sentence'
881
-                ),
882
-            ),
883
-            'incomplete_status' => array(
884
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
885
-                'desc'  => EEH_Template::pretty_status(
886
-                    EEM_Registration::status_id_incomplete,
887
-                    false,
888
-                    'sentence'
889
-                ),
890
-            ),
891
-            'not_approved'      => array(
892
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
893
-                'desc'  => EEH_Template::pretty_status(
894
-                    EEM_Registration::status_id_not_approved,
895
-                    false,
896
-                    'sentence'
897
-                ),
898
-            ),
899
-            'declined_status'   => array(
900
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
901
-                'desc'  => EEH_Template::pretty_status(
902
-                    EEM_Registration::status_id_declined,
903
-                    false,
904
-                    'sentence'
905
-                ),
906
-            ),
907
-            'cancelled_status'  => array(
908
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
909
-                'desc'  => EEH_Template::pretty_status(
910
-                    EEM_Registration::status_id_cancelled,
911
-                    false,
912
-                    'sentence'
913
-                ),
914
-            ),
915
-        );
916
-        return array_merge($fc_items, $sc_items);
917
-    }
918
-
919
-
920
-
921
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
922
-    /**
923
-     * @throws \EE_Error
924
-     */
925
-    protected function _registrations_overview_list_table()
926
-    {
927
-        $this->_template_args['admin_page_header'] = '';
928
-        $EVT_ID                                    = ! empty($this->_req_data['event_id'])
929
-            ? absint($this->_req_data['event_id'])
930
-            : 0;
931
-        if ($EVT_ID) {
932
-            if (EE_Registry::instance()->CAP->current_user_can(
933
-                'ee_edit_registrations',
934
-                'espresso_registrations_new_registration',
935
-                $EVT_ID
936
-            )) {
937
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
938
-                    'new_registration',
939
-                    'add-registrant',
940
-                    array('event_id' => $EVT_ID),
941
-                    'add-new-h2'
942
-                );
943
-            }
944
-            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
945
-            if ($event instanceof EE_Event) {
946
-                $this->_template_args['admin_page_header'] = sprintf(
947
-                    esc_html__(
948
-                        '%s Viewing registrations for the event: %s%s',
949
-                        'event_espresso'
950
-                    ),
951
-                    '<h3 style="line-height:1.5em;">',
952
-                    '<br /><a href="'
953
-                        . EE_Admin_Page::add_query_args_and_nonce(
954
-                            array(
955
-                                'action' => 'edit',
956
-                                'post'   => $event->ID(),
957
-                            ),
958
-                            EVENTS_ADMIN_URL
959
-                        )
960
-                        . '">&nbsp;'
961
-                        . $event->get('EVT_name')
962
-                        . '&nbsp;</a>&nbsp;',
963
-                    '</h3>'
964
-                );
965
-            }
966
-            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
967
-            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
968
-            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
969
-                $this->_template_args['admin_page_header'] = substr(
970
-                    $this->_template_args['admin_page_header'],
971
-                    0,
972
-                    -5
973
-                );
974
-                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975
-                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976
-                $this->_template_args['admin_page_header'] .= $datetime->name();
977
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
978
-                $this->_template_args['admin_page_header'] .= '</span></h3>';
979
-            }
980
-        }
981
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
982
-        $this->display_admin_list_table_page_with_no_sidebar();
983
-    }
984
-
985
-
986
-    /**
987
-     * This sets the _registration property for the registration details screen
988
-     *
989
-     * @access private
990
-     * @return bool
991
-     */
992
-    private function _set_registration_object()
993
-    {
994
-        //get out if we've already set the object
995
-        if (is_object($this->_registration)) {
996
-            return true;
997
-        }
998
-        $REG    = EEM_Registration::instance();
999
-        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1000
-        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1001
-            return true;
1002
-        } else {
1003
-            $error_msg = sprintf(
1004
-                esc_html__(
1005
-                    'An error occurred and the details for Registration ID #%s could not be retrieved.',
1006
-                    'event_espresso'
1007
-                ),
1008
-                $REG_ID
1009
-            );
1010
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1011
-            $this->_registration = null;
1012
-            return false;
1013
-        }
1014
-    }
1015
-
1016
-
1017
-    /**
1018
-     * Used to retrieve registrations for the list table.
1019
-     *
1020
-     * @param int  $per_page
1021
-     * @param bool $count
1022
-     * @param bool $this_month
1023
-     * @param bool $today
1024
-     * @return EE_Registration[]|int
1025
-     * @throws EE_Error
1026
-     */
1027
-    public function get_registrations(
1028
-        $per_page = 10,
1029
-        $count = false,
1030
-        $this_month = false,
1031
-        $today = false
1032
-    ) {
1033
-        if ($this_month) {
1034
-            $this->_req_data['status'] = 'month';
1035
-        }
1036
-        if ($today) {
1037
-            $this->_req_data['status'] = 'today';
1038
-        }
1039
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1040
-        /**
1041
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1042
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1043
-         * @see EEM_Base::get_all()
1044
-         */
1045
-        $query_params['group_by'] = '';
1046
-
1047
-        return $count
1048
-            ? EEM_Registration::instance()->count($query_params)
1049
-            /** @type EE_Registration[] */
1050
-            : EEM_Registration::instance()->get_all($query_params);
1051
-    }
1052
-
1053
-
1054
-
1055
-    /**
1056
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1057
-     * Note: this listens to values on the request for some of the query parameters.
1058
-     *
1059
-     * @param array $request
1060
-     * @param int    $per_page
1061
-     * @param bool   $count
1062
-     * @return array
1063
-     */
1064
-    protected function _get_registration_query_parameters(
1065
-        $request = array(),
1066
-        $per_page = 10,
1067
-        $count = false
1068
-    ) {
1069
-
1070
-        $query_params = array(
1071
-            0                          => $this->_get_where_conditions_for_registrations_query(
1072
-                $request
1073
-            ),
1074
-            'caps'                     => EEM_Registration::caps_read_admin,
1075
-            'default_where_conditions' => 'this_model_only',
1076
-        );
1077
-        if (! $count) {
1078
-            $query_params = array_merge(
1079
-                $query_params,
1080
-                $this->_get_orderby_for_registrations_query(),
1081
-                $this->_get_limit($per_page)
1082
-            );
1083
-        }
1084
-
1085
-        return $query_params;
1086
-    }
1087
-
1088
-
1089
-    /**
1090
-     * This will add EVT_ID to the provided $where array for EE model query parameters.
1091
-     *
1092
-     * @param array $request usually the same as $this->_req_data but not necessarily
1093
-     * @return array
1094
-     */
1095
-    protected function _add_event_id_to_where_conditions(array $request)
1096
-    {
1097
-        $where = array();
1098
-        if (! empty($request['event_id'])) {
1099
-            $where['EVT_ID'] = absint($request['event_id']);
1100
-        }
1101
-        return $where;
1102
-    }
1103
-
1104
-
1105
-    /**
1106
-     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1107
-     *
1108
-     * @param array $request usually the same as $this->_req_data but not necessarily
1109
-     * @return array
1110
-     */
1111
-    protected function _add_category_id_to_where_conditions(array $request)
1112
-    {
1113
-        $where = array();
1114
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1115
-            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116
-        }
1117
-        return $where;
1118
-    }
1119
-
1120
-
1121
-    /**
1122
-     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1123
-     *
1124
-     * @param array $request usually the same as $this->_req_data but not necessarily
1125
-     * @return array
1126
-     */
1127
-    protected function _add_datetime_id_to_where_conditions(array $request)
1128
-    {
1129
-        $where = array();
1130
-        if (! empty($request['datetime_id'])) {
1131
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132
-        }
1133
-        if (! empty($request['DTT_ID'])) {
1134
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135
-        }
1136
-        return $where;
1137
-    }
1138
-
1139
-
1140
-    /**
1141
-     * Adds the correct registration status to the where conditions for the registrations query.
1142
-     *
1143
-     * @param array $request usually the same as $this->_req_data but not necessarily
1144
-     * @return array
1145
-     */
1146
-    protected function _add_registration_status_to_where_conditions(array $request)
1147
-    {
1148
-        $where = array();
1149
-        $view = EEH_Array::is_set($request, 'status', '');
1150
-        $registration_status = ! empty($request['_reg_status'])
1151
-            ? sanitize_text_field($request['_reg_status'])
1152
-            : '';
1153
-
1154
-        /*
26
+	/**
27
+	 * @var EE_Registration
28
+	 */
29
+	private $_registration;
30
+
31
+	/**
32
+	 * @var EE_Event
33
+	 */
34
+	private $_reg_event;
35
+
36
+	/**
37
+	 * @var EE_Session
38
+	 */
39
+	private $_session;
40
+
41
+	private static $_reg_status;
42
+
43
+	/**
44
+	 * Form for displaying the custom questions for this registration.
45
+	 * This gets used a few times throughout the request so its best to cache it
46
+	 *
47
+	 * @var EE_Registration_Custom_Questions_Form
48
+	 */
49
+	protected $_reg_custom_questions_form = null;
50
+
51
+
52
+	/**
53
+	 *        constructor
54
+	 *
55
+	 * @Constructor
56
+	 * @access public
57
+	 * @param bool $routing
58
+	 * @return Registrations_Admin_Page
59
+	 */
60
+	public function __construct($routing = true)
61
+	{
62
+		parent::__construct($routing);
63
+		add_action('wp_loaded', array($this, 'wp_loaded'));
64
+	}
65
+
66
+
67
+	public function wp_loaded()
68
+	{
69
+		// when adding a new registration...
70
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
+			EE_System::do_not_cache();
72
+			if (! isset($this->_req_data['processing_registration'])
73
+				 || absint($this->_req_data['processing_registration']) !== 1
74
+			) {
75
+				// and it's NOT the attendee information reg step
76
+				// force cookie expiration by setting time to last week
77
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
+				// and update the global
79
+				$_COOKIE['ee_registration_added'] = 0;
80
+			}
81
+		}
82
+	}
83
+
84
+
85
+	protected function _init_page_props()
86
+	{
87
+		$this->page_slug        = REG_PG_SLUG;
88
+		$this->_admin_base_url  = REG_ADMIN_URL;
89
+		$this->_admin_base_path = REG_ADMIN;
90
+		$this->page_label       = esc_html__('Registrations', 'event_espresso');
91
+		$this->_cpt_routes      = array(
92
+			'add_new_attendee' => 'espresso_attendees',
93
+			'edit_attendee'    => 'espresso_attendees',
94
+			'insert_attendee'  => 'espresso_attendees',
95
+			'update_attendee'  => 'espresso_attendees',
96
+		);
97
+		$this->_cpt_model_names = array(
98
+			'add_new_attendee' => 'EEM_Attendee',
99
+			'edit_attendee'    => 'EEM_Attendee',
100
+		);
101
+		$this->_cpt_edit_routes = array(
102
+			'espresso_attendees' => 'edit_attendee',
103
+		);
104
+		$this->_pagenow_map     = array(
105
+			'add_new_attendee' => 'post-new.php',
106
+			'edit_attendee'    => 'post.php',
107
+			'trash'            => 'post.php',
108
+		);
109
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
+		//add filters so that the comment urls don't take users to a confusing 404 page
111
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
+	}
113
+
114
+
115
+	public function clear_comment_link($link, $comment, $args)
116
+	{
117
+		//gotta make sure this only happens on this route
118
+		$post_type = get_post_type($comment->comment_post_ID);
119
+		if ($post_type === 'espresso_attendees') {
120
+			return '#commentsdiv';
121
+		}
122
+		return $link;
123
+	}
124
+
125
+
126
+	protected function _ajax_hooks()
127
+	{
128
+		//todo: all hooks for registrations ajax goes in here
129
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
+	}
131
+
132
+
133
+	protected function _define_page_props()
134
+	{
135
+		$this->_admin_page_title = $this->page_label;
136
+		$this->_labels           = array(
137
+			'buttons'                      => array(
138
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
+				'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
+				'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
+			),
147
+			'publishbox'                   => array(
148
+				'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
+				'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
+			),
151
+			'hide_add_button_on_cpt_route' => array(
152
+				'edit_attendee' => true,
153
+			),
154
+		);
155
+	}
156
+
157
+
158
+	/**
159
+	 *        grab url requests and route them
160
+	 *
161
+	 * @access private
162
+	 * @return void
163
+	 */
164
+	public function _set_page_routes()
165
+	{
166
+		$this->_get_registration_status_array();
167
+		$reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
+			? $this->_req_data['_REG_ID'] : 0;
169
+		$att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
+			? $this->_req_data['ATT_ID'] : 0;
171
+		$att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
172
+			? $this->_req_data['post']
173
+			: $att_id;
174
+		$this->_page_routes = array(
175
+			'default'                            => array(
176
+				'func'       => '_registrations_overview_list_table',
177
+				'capability' => 'ee_read_registrations',
178
+			),
179
+			'view_registration'                  => array(
180
+				'func'       => '_registration_details',
181
+				'capability' => 'ee_read_registration',
182
+				'obj_id'     => $reg_id,
183
+			),
184
+			'edit_registration'                  => array(
185
+				'func'               => '_update_attendee_registration_form',
186
+				'noheader'           => true,
187
+				'headers_sent_route' => 'view_registration',
188
+				'capability'         => 'ee_edit_registration',
189
+				'obj_id'             => $reg_id,
190
+				'_REG_ID'            => $reg_id,
191
+			),
192
+			'trash_registrations'                => array(
193
+				'func'       => '_trash_or_restore_registrations',
194
+				'args'       => array('trash' => true),
195
+				'noheader'   => true,
196
+				'capability' => 'ee_delete_registrations',
197
+			),
198
+			'restore_registrations'              => array(
199
+				'func'       => '_trash_or_restore_registrations',
200
+				'args'       => array('trash' => false),
201
+				'noheader'   => true,
202
+				'capability' => 'ee_delete_registrations',
203
+			),
204
+			'delete_registrations'               => array(
205
+				'func'       => '_delete_registrations',
206
+				'noheader'   => true,
207
+				'capability' => 'ee_delete_registrations',
208
+			),
209
+			'new_registration'                   => array(
210
+				'func'       => 'new_registration',
211
+				'capability' => 'ee_edit_registrations',
212
+			),
213
+			'process_reg_step'                   => array(
214
+				'func'       => 'process_reg_step',
215
+				'noheader'   => true,
216
+				'capability' => 'ee_edit_registrations',
217
+			),
218
+			'redirect_to_txn'                    => array(
219
+				'func'       => 'redirect_to_txn',
220
+				'noheader'   => true,
221
+				'capability' => 'ee_edit_registrations',
222
+			),
223
+			'change_reg_status'                  => array(
224
+				'func'       => '_change_reg_status',
225
+				'noheader'   => true,
226
+				'capability' => 'ee_edit_registration',
227
+				'obj_id'     => $reg_id,
228
+			),
229
+			'approve_registration'               => array(
230
+				'func'       => 'approve_registration',
231
+				'noheader'   => true,
232
+				'capability' => 'ee_edit_registration',
233
+				'obj_id'     => $reg_id,
234
+			),
235
+			'approve_and_notify_registration'    => array(
236
+				'func'       => 'approve_registration',
237
+				'noheader'   => true,
238
+				'args'       => array(true),
239
+				'capability' => 'ee_edit_registration',
240
+				'obj_id'     => $reg_id,
241
+			),
242
+			'decline_registration'               => array(
243
+				'func'       => 'decline_registration',
244
+				'noheader'   => true,
245
+				'capability' => 'ee_edit_registration',
246
+				'obj_id'     => $reg_id,
247
+			),
248
+			'decline_and_notify_registration'    => array(
249
+				'func'       => 'decline_registration',
250
+				'noheader'   => true,
251
+				'args'       => array(true),
252
+				'capability' => 'ee_edit_registration',
253
+				'obj_id'     => $reg_id,
254
+			),
255
+			'pending_registration'               => array(
256
+				'func'       => 'pending_registration',
257
+				'noheader'   => true,
258
+				'capability' => 'ee_edit_registration',
259
+				'obj_id'     => $reg_id,
260
+			),
261
+			'pending_and_notify_registration'    => array(
262
+				'func'       => 'pending_registration',
263
+				'noheader'   => true,
264
+				'args'       => array(true),
265
+				'capability' => 'ee_edit_registration',
266
+				'obj_id'     => $reg_id,
267
+			),
268
+			'no_approve_registration'            => array(
269
+				'func'       => 'not_approve_registration',
270
+				'noheader'   => true,
271
+				'capability' => 'ee_edit_registration',
272
+				'obj_id'     => $reg_id,
273
+			),
274
+			'no_approve_and_notify_registration' => array(
275
+				'func'       => 'not_approve_registration',
276
+				'noheader'   => true,
277
+				'args'       => array(true),
278
+				'capability' => 'ee_edit_registration',
279
+				'obj_id'     => $reg_id,
280
+			),
281
+			'cancel_registration'                => array(
282
+				'func'       => 'cancel_registration',
283
+				'noheader'   => true,
284
+				'capability' => 'ee_edit_registration',
285
+				'obj_id'     => $reg_id,
286
+			),
287
+			'cancel_and_notify_registration'     => array(
288
+				'func'       => 'cancel_registration',
289
+				'noheader'   => true,
290
+				'args'       => array(true),
291
+				'capability' => 'ee_edit_registration',
292
+				'obj_id'     => $reg_id,
293
+			),
294
+			'contact_list'                       => array(
295
+				'func'       => '_attendee_contact_list_table',
296
+				'capability' => 'ee_read_contacts',
297
+			),
298
+			'add_new_attendee'                   => array(
299
+				'func' => '_create_new_cpt_item',
300
+				'args' => array(
301
+					'new_attendee' => true,
302
+					'capability'   => 'ee_edit_contacts',
303
+				),
304
+			),
305
+			'edit_attendee'                      => array(
306
+				'func'       => '_edit_cpt_item',
307
+				'capability' => 'ee_edit_contacts',
308
+				'obj_id'     => $att_id,
309
+			),
310
+			'duplicate_attendee'                 => array(
311
+				'func'       => '_duplicate_attendee',
312
+				'noheader'   => true,
313
+				'capability' => 'ee_edit_contacts',
314
+				'obj_id'     => $att_id,
315
+			),
316
+			'insert_attendee'                    => array(
317
+				'func'       => '_insert_or_update_attendee',
318
+				'args'       => array(
319
+					'new_attendee' => true,
320
+				),
321
+				'noheader'   => true,
322
+				'capability' => 'ee_edit_contacts',
323
+			),
324
+			'update_attendee'                    => array(
325
+				'func'       => '_insert_or_update_attendee',
326
+				'args'       => array(
327
+					'new_attendee' => false,
328
+				),
329
+				'noheader'   => true,
330
+				'capability' => 'ee_edit_contacts',
331
+				'obj_id'     => $att_id,
332
+			),
333
+			'trash_attendee'                    => array(
334
+				'func'       => '_trash_or_restore_attendees',
335
+				'args'       => array(
336
+					'trash' => true,
337
+				),
338
+				'noheader'   => true,
339
+				'capability' => 'ee_delete_contacts',
340
+				'obj_id'     => $att_id,
341
+			),
342
+			'restore_attendees'                  => array(
343
+				'func'       => '_trash_or_restore_attendees',
344
+				'args'       => array(
345
+					'trash' => false,
346
+				),
347
+				'noheader'   => true,
348
+				'capability' => 'ee_delete_contacts',
349
+				'obj_id'     => $att_id,
350
+			),
351
+			'resend_registration'                => array(
352
+				'func'       => '_resend_registration',
353
+				'noheader'   => true,
354
+				'capability' => 'ee_send_message',
355
+			),
356
+			'registrations_report'               => array(
357
+				'func'       => '_registrations_report',
358
+				'noheader'   => true,
359
+				'capability' => 'ee_read_registrations',
360
+			),
361
+			'contact_list_export'                => array(
362
+				'func'       => '_contact_list_export',
363
+				'noheader'   => true,
364
+				'capability' => 'export',
365
+			),
366
+			'contact_list_report'                => array(
367
+				'func'       => '_contact_list_report',
368
+				'noheader'   => true,
369
+				'capability' => 'ee_read_contacts',
370
+			),
371
+		);
372
+	}
373
+
374
+
375
+	protected function _set_page_config()
376
+	{
377
+		$this->_page_config = array(
378
+			'default'           => array(
379
+				'nav'           => array(
380
+					'label' => esc_html__('Overview', 'event_espresso'),
381
+					'order' => 5,
382
+				),
383
+				'help_tabs'     => array(
384
+					'registrations_overview_help_tab'                       => array(
385
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
386
+						'filename' => 'registrations_overview',
387
+					),
388
+					'registrations_overview_table_column_headings_help_tab' => array(
389
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
390
+						'filename' => 'registrations_overview_table_column_headings',
391
+					),
392
+					'registrations_overview_filters_help_tab'               => array(
393
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
394
+						'filename' => 'registrations_overview_filters',
395
+					),
396
+					'registrations_overview_views_help_tab'                 => array(
397
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
398
+						'filename' => 'registrations_overview_views',
399
+					),
400
+					'registrations_regoverview_other_help_tab'              => array(
401
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
402
+						'filename' => 'registrations_overview_other',
403
+					),
404
+				),
405
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
406
+				'qtips'         => array('Registration_List_Table_Tips'),
407
+				'list_table'    => 'EE_Registrations_List_Table',
408
+				'require_nonce' => false,
409
+			),
410
+			'view_registration' => array(
411
+				'nav'           => array(
412
+					'label'      => esc_html__('REG Details', 'event_espresso'),
413
+					'order'      => 15,
414
+					'url'        => isset($this->_req_data['_REG_ID'])
415
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
416
+						: $this->_admin_base_url,
417
+					'persistent' => false,
418
+				),
419
+				'help_tabs'     => array(
420
+					'registrations_details_help_tab'                    => array(
421
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
422
+						'filename' => 'registrations_details',
423
+					),
424
+					'registrations_details_table_help_tab'              => array(
425
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
426
+						'filename' => 'registrations_details_table',
427
+					),
428
+					'registrations_details_form_answers_help_tab'       => array(
429
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
430
+						'filename' => 'registrations_details_form_answers',
431
+					),
432
+					'registrations_details_registrant_details_help_tab' => array(
433
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
434
+						'filename' => 'registrations_details_registrant_details',
435
+					),
436
+				),
437
+				'help_tour'     => array('Registration_Details_Help_Tour'),
438
+				'metaboxes'     => array_merge(
439
+					$this->_default_espresso_metaboxes,
440
+					array('_registration_details_metaboxes')
441
+				),
442
+				'require_nonce' => false,
443
+			),
444
+			'new_registration'  => array(
445
+				'nav'           => array(
446
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
447
+					'url'        => '#',
448
+					'order'      => 15,
449
+					'persistent' => false,
450
+				),
451
+				'metaboxes'     => $this->_default_espresso_metaboxes,
452
+				'labels'        => array(
453
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
454
+				),
455
+				'require_nonce' => false,
456
+			),
457
+			'add_new_attendee'  => array(
458
+				'nav'           => array(
459
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
460
+					'order'      => 15,
461
+					'persistent' => false,
462
+				),
463
+				'metaboxes'     => array_merge(
464
+					$this->_default_espresso_metaboxes,
465
+					array('_publish_post_box', 'attendee_editor_metaboxes')
466
+				),
467
+				'require_nonce' => false,
468
+			),
469
+			'edit_attendee'     => array(
470
+				'nav'           => array(
471
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
472
+					'order'      => 15,
473
+					'persistent' => false,
474
+					'url'        => isset($this->_req_data['ATT_ID'])
475
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
476
+						: $this->_admin_base_url,
477
+				),
478
+				'metaboxes'     => array('attendee_editor_metaboxes'),
479
+				'require_nonce' => false,
480
+			),
481
+			'contact_list'      => array(
482
+				'nav'           => array(
483
+					'label' => esc_html__('Contact List', 'event_espresso'),
484
+					'order' => 20,
485
+				),
486
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
487
+				'help_tabs'     => array(
488
+					'registrations_contact_list_help_tab'                       => array(
489
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
490
+						'filename' => 'registrations_contact_list',
491
+					),
492
+					'registrations_contact-list_table_column_headings_help_tab' => array(
493
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
494
+						'filename' => 'registrations_contact_list_table_column_headings',
495
+					),
496
+					'registrations_contact_list_views_help_tab'                 => array(
497
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
498
+						'filename' => 'registrations_contact_list_views',
499
+					),
500
+					'registrations_contact_list_other_help_tab'                 => array(
501
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
502
+						'filename' => 'registrations_contact_list_other',
503
+					),
504
+				),
505
+				'help_tour'     => array('Contact_List_Help_Tour'),
506
+				'metaboxes'     => array(),
507
+				'require_nonce' => false,
508
+			),
509
+			//override default cpt routes
510
+			'create_new'        => '',
511
+			'edit'              => '',
512
+		);
513
+	}
514
+
515
+
516
+	/**
517
+	 * The below methods aren't used by this class currently
518
+	 */
519
+	protected function _add_screen_options()
520
+	{
521
+	}
522
+
523
+
524
+	protected function _add_feature_pointers()
525
+	{
526
+	}
527
+
528
+
529
+	public function admin_init()
530
+	{
531
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
532
+			'click "Update Registration Questions" to save your changes',
533
+			'event_espresso'
534
+		);
535
+	}
536
+
537
+
538
+	public function admin_notices()
539
+	{
540
+	}
541
+
542
+
543
+	public function admin_footer_scripts()
544
+	{
545
+	}
546
+
547
+
548
+	/**
549
+	 *        get list of registration statuses
550
+	 *
551
+	 * @access private
552
+	 * @return void
553
+	 */
554
+	private function _get_registration_status_array()
555
+	{
556
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
557
+	}
558
+
559
+
560
+	protected function _add_screen_options_default()
561
+	{
562
+		$this->_per_page_screen_option();
563
+	}
564
+
565
+
566
+	protected function _add_screen_options_contact_list()
567
+	{
568
+		$page_title              = $this->_admin_page_title;
569
+		$this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
570
+		$this->_per_page_screen_option();
571
+		$this->_admin_page_title = $page_title;
572
+	}
573
+
574
+
575
+	public function load_scripts_styles()
576
+	{
577
+		//style
578
+		wp_register_style(
579
+			'espresso_reg',
580
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
581
+			array('ee-admin-css'),
582
+			EVENT_ESPRESSO_VERSION
583
+		);
584
+		wp_enqueue_style('espresso_reg');
585
+		//script
586
+		wp_register_script(
587
+			'espresso_reg',
588
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
589
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590
+			EVENT_ESPRESSO_VERSION,
591
+			true
592
+		);
593
+		wp_enqueue_script('espresso_reg');
594
+	}
595
+
596
+
597
+	public function load_scripts_styles_edit_attendee()
598
+	{
599
+		//stuff to only show up on our attendee edit details page.
600
+		$attendee_details_translations = array(
601
+			'att_publish_text' => sprintf(
602
+				esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
603
+				$this->_cpt_model_obj->get_datetime('ATT_created')
604
+			),
605
+		);
606
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
607
+		wp_enqueue_script('jquery-validate');
608
+	}
609
+
610
+
611
+	public function load_scripts_styles_view_registration()
612
+	{
613
+		//styles
614
+		wp_enqueue_style('espresso-ui-theme');
615
+		//scripts
616
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
617
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
618
+	}
619
+
620
+
621
+	public function load_scripts_styles_contact_list()
622
+	{
623
+		wp_deregister_style('espresso_reg');
624
+		wp_register_style(
625
+			'espresso_att',
626
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
627
+			array('ee-admin-css'),
628
+			EVENT_ESPRESSO_VERSION
629
+		);
630
+		wp_enqueue_style('espresso_att');
631
+	}
632
+
633
+
634
+	public function load_scripts_styles_new_registration()
635
+	{
636
+		wp_register_script(
637
+			'ee-spco-for-admin',
638
+			REG_ASSETS_URL . 'spco_for_admin.js',
639
+			array('underscore', 'jquery'),
640
+			EVENT_ESPRESSO_VERSION,
641
+			true
642
+		);
643
+		wp_enqueue_script('ee-spco-for-admin');
644
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
645
+		EE_Form_Section_Proper::wp_enqueue_scripts();
646
+		EED_Ticket_Selector::load_tckt_slctr_assets();
647
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
648
+	}
649
+
650
+
651
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
652
+	{
653
+		add_filter('FHEE_load_EE_messages', '__return_true');
654
+	}
655
+
656
+
657
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
658
+	{
659
+		add_filter('FHEE_load_EE_messages', '__return_true');
660
+	}
661
+
662
+
663
+	protected function _set_list_table_views_default()
664
+	{
665
+		//for notification related bulk actions we need to make sure only active messengers have an option.
666
+		EED_Messages::set_autoloaders();
667
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
668
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
669
+		$active_mts               = $message_resource_manager->list_of_active_message_types();
670
+		//key= bulk_action_slug, value= message type.
671
+		$match_array = array(
672
+			'approve_registration'    => 'registration',
673
+			'decline_registration'    => 'declined_registration',
674
+			'pending_registration'    => 'pending_approval',
675
+			'no_approve_registration' => 'not_approved_registration',
676
+			'cancel_registration'     => 'cancelled_registration',
677
+		);
678
+		/** setup reg status bulk actions **/
679
+		$def_reg_status_actions['approve_registration'] = esc_html__('Approve Registrations', 'event_espresso');
680
+		if (in_array($match_array['approve_registration'], $active_mts)
681
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
682
+		) {
683
+			$def_reg_status_actions['approve_and_notify_registration'] = esc_html__(
684
+				'Approve and Notify Registrations',
685
+				'event_espresso'
686
+			);
687
+		}
688
+		$def_reg_status_actions['decline_registration'] = esc_html__('Decline Registrations', 'event_espresso');
689
+		if (in_array($match_array['decline_registration'], $active_mts)
690
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
691
+		) {
692
+			$def_reg_status_actions['decline_and_notify_registration'] = esc_html__(
693
+				'Decline and Notify Registrations',
694
+				'event_espresso'
695
+			);
696
+		}
697
+		$def_reg_status_actions['pending_registration'] = esc_html__(
698
+			'Set Registrations to Pending Payment',
699
+			'event_espresso'
700
+		);
701
+		if (in_array($match_array['pending_registration'], $active_mts)
702
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
703
+		) {
704
+			$def_reg_status_actions['pending_and_notify_registration'] = esc_html__(
705
+				'Set Registrations to Pending Payment and Notify',
706
+				'event_espresso'
707
+			);
708
+		}
709
+		$def_reg_status_actions['no_approve_registration'] = esc_html__(
710
+			'Set Registrations to Not Approved',
711
+			'event_espresso'
712
+		);
713
+		if (in_array($match_array['no_approve_registration'], $active_mts)
714
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
715
+		) {
716
+			$def_reg_status_actions['no_approve_and_notify_registration'] = esc_html__(
717
+				'Set Registrations to Not Approved and Notify',
718
+				'event_espresso'
719
+			);
720
+		}
721
+		$def_reg_status_actions['cancel_registration'] = esc_html__('Cancel Registrations', 'event_espresso');
722
+		if (in_array($match_array['cancel_registration'], $active_mts)
723
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
724
+		) {
725
+			$def_reg_status_actions['cancel_and_notify_registration'] = esc_html__(
726
+				'Cancel Registrations and Notify',
727
+				'event_espresso'
728
+			);
729
+		}
730
+		$this->_views = array(
731
+			'all'   => array(
732
+				'slug'        => 'all',
733
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
734
+				'count'       => 0,
735
+				'bulk_action' => array_merge($def_reg_status_actions, array(
736
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
737
+				)),
738
+			),
739
+			'month' => array(
740
+				'slug'        => 'month',
741
+				'label'       => esc_html__('This Month', 'event_espresso'),
742
+				'count'       => 0,
743
+				'bulk_action' => array_merge($def_reg_status_actions, array(
744
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
745
+				)),
746
+			),
747
+			'today' => array(
748
+				'slug'        => 'today',
749
+				'label'       => sprintf(
750
+					esc_html__('Today - %s', 'event_espresso'),
751
+					date('M d, Y', current_time('timestamp'))
752
+				),
753
+				'count'       => 0,
754
+				'bulk_action' => array_merge($def_reg_status_actions, array(
755
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
756
+				)),
757
+			),
758
+		);
759
+		if (EE_Registry::instance()->CAP->current_user_can(
760
+			'ee_delete_registrations',
761
+			'espresso_registrations_delete_registration'
762
+		)) {
763
+			$this->_views['incomplete'] = array(
764
+				'slug'        => 'incomplete',
765
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
766
+				'count'       => 0,
767
+				'bulk_action' => array(
768
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769
+				),
770
+			);
771
+			$this->_views['trash']      = array(
772
+				'slug'        => 'trash',
773
+				'label'       => esc_html__('Trash', 'event_espresso'),
774
+				'count'       => 0,
775
+				'bulk_action' => array(
776
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
777
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
778
+				),
779
+			);
780
+		}
781
+	}
782
+
783
+
784
+	protected function _set_list_table_views_contact_list()
785
+	{
786
+		$this->_views = array(
787
+			'in_use' => array(
788
+				'slug'        => 'in_use',
789
+				'label'       => esc_html__('In Use', 'event_espresso'),
790
+				'count'       => 0,
791
+				'bulk_action' => array(
792
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
793
+				),
794
+			),
795
+		);
796
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
797
+			'espresso_registrations_trash_attendees')
798
+		) {
799
+			$this->_views['trash'] = array(
800
+				'slug'        => 'trash',
801
+				'label'       => esc_html__('Trash', 'event_espresso'),
802
+				'count'       => 0,
803
+				'bulk_action' => array(
804
+					'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
805
+				),
806
+			);
807
+		}
808
+	}
809
+
810
+
811
+	protected function _registration_legend_items()
812
+	{
813
+		$fc_items = array(
814
+			'star-icon'        => array(
815
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
816
+				'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
817
+			),
818
+			'view_details'     => array(
819
+				'class' => 'dashicons dashicons-clipboard',
820
+				'desc'  => esc_html__('View Registration Details', 'event_espresso'),
821
+			),
822
+			'edit_attendee'    => array(
823
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
824
+				'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
825
+			),
826
+			'view_transaction' => array(
827
+				'class' => 'dashicons dashicons-cart',
828
+				'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
829
+			),
830
+			'view_invoice'     => array(
831
+				'class' => 'dashicons dashicons-media-spreadsheet',
832
+				'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
833
+			),
834
+		);
835
+		if (EE_Registry::instance()->CAP->current_user_can(
836
+			'ee_send_message',
837
+			'espresso_registrations_resend_registration'
838
+		)) {
839
+			$fc_items['resend_registration'] = array(
840
+				'class' => 'dashicons dashicons-email-alt',
841
+				'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
842
+			);
843
+		} else {
844
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
845
+		}
846
+		if (EE_Registry::instance()->CAP->current_user_can(
847
+			'ee_read_global_messages',
848
+			'view_filtered_messages'
849
+		)) {
850
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
851
+			if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
852
+				$fc_items['view_related_messages'] = array(
853
+					'class' => $related_for_icon['css_class'],
854
+					'desc'  => $related_for_icon['label'],
855
+				);
856
+			}
857
+		}
858
+		$sc_items = array(
859
+			'approved_status'   => array(
860
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
861
+				'desc'  => EEH_Template::pretty_status(
862
+					EEM_Registration::status_id_approved,
863
+					false,
864
+					'sentence'
865
+				),
866
+			),
867
+			'pending_status'    => array(
868
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
869
+				'desc'  => EEH_Template::pretty_status(
870
+					EEM_Registration::status_id_pending_payment,
871
+					false,
872
+					'sentence'
873
+				),
874
+			),
875
+			'wait_list'         => array(
876
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
877
+				'desc'  => EEH_Template::pretty_status(
878
+					EEM_Registration::status_id_wait_list,
879
+					false,
880
+					'sentence'
881
+				),
882
+			),
883
+			'incomplete_status' => array(
884
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
885
+				'desc'  => EEH_Template::pretty_status(
886
+					EEM_Registration::status_id_incomplete,
887
+					false,
888
+					'sentence'
889
+				),
890
+			),
891
+			'not_approved'      => array(
892
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
893
+				'desc'  => EEH_Template::pretty_status(
894
+					EEM_Registration::status_id_not_approved,
895
+					false,
896
+					'sentence'
897
+				),
898
+			),
899
+			'declined_status'   => array(
900
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
901
+				'desc'  => EEH_Template::pretty_status(
902
+					EEM_Registration::status_id_declined,
903
+					false,
904
+					'sentence'
905
+				),
906
+			),
907
+			'cancelled_status'  => array(
908
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
909
+				'desc'  => EEH_Template::pretty_status(
910
+					EEM_Registration::status_id_cancelled,
911
+					false,
912
+					'sentence'
913
+				),
914
+			),
915
+		);
916
+		return array_merge($fc_items, $sc_items);
917
+	}
918
+
919
+
920
+
921
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
922
+	/**
923
+	 * @throws \EE_Error
924
+	 */
925
+	protected function _registrations_overview_list_table()
926
+	{
927
+		$this->_template_args['admin_page_header'] = '';
928
+		$EVT_ID                                    = ! empty($this->_req_data['event_id'])
929
+			? absint($this->_req_data['event_id'])
930
+			: 0;
931
+		if ($EVT_ID) {
932
+			if (EE_Registry::instance()->CAP->current_user_can(
933
+				'ee_edit_registrations',
934
+				'espresso_registrations_new_registration',
935
+				$EVT_ID
936
+			)) {
937
+				$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
938
+					'new_registration',
939
+					'add-registrant',
940
+					array('event_id' => $EVT_ID),
941
+					'add-new-h2'
942
+				);
943
+			}
944
+			$event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
945
+			if ($event instanceof EE_Event) {
946
+				$this->_template_args['admin_page_header'] = sprintf(
947
+					esc_html__(
948
+						'%s Viewing registrations for the event: %s%s',
949
+						'event_espresso'
950
+					),
951
+					'<h3 style="line-height:1.5em;">',
952
+					'<br /><a href="'
953
+						. EE_Admin_Page::add_query_args_and_nonce(
954
+							array(
955
+								'action' => 'edit',
956
+								'post'   => $event->ID(),
957
+							),
958
+							EVENTS_ADMIN_URL
959
+						)
960
+						. '">&nbsp;'
961
+						. $event->get('EVT_name')
962
+						. '&nbsp;</a>&nbsp;',
963
+					'</h3>'
964
+				);
965
+			}
966
+			$DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
967
+			$datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
968
+			if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
969
+				$this->_template_args['admin_page_header'] = substr(
970
+					$this->_template_args['admin_page_header'],
971
+					0,
972
+					-5
973
+				);
974
+				$this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975
+				$this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976
+				$this->_template_args['admin_page_header'] .= $datetime->name();
977
+				$this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
978
+				$this->_template_args['admin_page_header'] .= '</span></h3>';
979
+			}
980
+		}
981
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
982
+		$this->display_admin_list_table_page_with_no_sidebar();
983
+	}
984
+
985
+
986
+	/**
987
+	 * This sets the _registration property for the registration details screen
988
+	 *
989
+	 * @access private
990
+	 * @return bool
991
+	 */
992
+	private function _set_registration_object()
993
+	{
994
+		//get out if we've already set the object
995
+		if (is_object($this->_registration)) {
996
+			return true;
997
+		}
998
+		$REG    = EEM_Registration::instance();
999
+		$REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1000
+		if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1001
+			return true;
1002
+		} else {
1003
+			$error_msg = sprintf(
1004
+				esc_html__(
1005
+					'An error occurred and the details for Registration ID #%s could not be retrieved.',
1006
+					'event_espresso'
1007
+				),
1008
+				$REG_ID
1009
+			);
1010
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1011
+			$this->_registration = null;
1012
+			return false;
1013
+		}
1014
+	}
1015
+
1016
+
1017
+	/**
1018
+	 * Used to retrieve registrations for the list table.
1019
+	 *
1020
+	 * @param int  $per_page
1021
+	 * @param bool $count
1022
+	 * @param bool $this_month
1023
+	 * @param bool $today
1024
+	 * @return EE_Registration[]|int
1025
+	 * @throws EE_Error
1026
+	 */
1027
+	public function get_registrations(
1028
+		$per_page = 10,
1029
+		$count = false,
1030
+		$this_month = false,
1031
+		$today = false
1032
+	) {
1033
+		if ($this_month) {
1034
+			$this->_req_data['status'] = 'month';
1035
+		}
1036
+		if ($today) {
1037
+			$this->_req_data['status'] = 'today';
1038
+		}
1039
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1040
+		/**
1041
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1042
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1043
+		 * @see EEM_Base::get_all()
1044
+		 */
1045
+		$query_params['group_by'] = '';
1046
+
1047
+		return $count
1048
+			? EEM_Registration::instance()->count($query_params)
1049
+			/** @type EE_Registration[] */
1050
+			: EEM_Registration::instance()->get_all($query_params);
1051
+	}
1052
+
1053
+
1054
+
1055
+	/**
1056
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1057
+	 * Note: this listens to values on the request for some of the query parameters.
1058
+	 *
1059
+	 * @param array $request
1060
+	 * @param int    $per_page
1061
+	 * @param bool   $count
1062
+	 * @return array
1063
+	 */
1064
+	protected function _get_registration_query_parameters(
1065
+		$request = array(),
1066
+		$per_page = 10,
1067
+		$count = false
1068
+	) {
1069
+
1070
+		$query_params = array(
1071
+			0                          => $this->_get_where_conditions_for_registrations_query(
1072
+				$request
1073
+			),
1074
+			'caps'                     => EEM_Registration::caps_read_admin,
1075
+			'default_where_conditions' => 'this_model_only',
1076
+		);
1077
+		if (! $count) {
1078
+			$query_params = array_merge(
1079
+				$query_params,
1080
+				$this->_get_orderby_for_registrations_query(),
1081
+				$this->_get_limit($per_page)
1082
+			);
1083
+		}
1084
+
1085
+		return $query_params;
1086
+	}
1087
+
1088
+
1089
+	/**
1090
+	 * This will add EVT_ID to the provided $where array for EE model query parameters.
1091
+	 *
1092
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1093
+	 * @return array
1094
+	 */
1095
+	protected function _add_event_id_to_where_conditions(array $request)
1096
+	{
1097
+		$where = array();
1098
+		if (! empty($request['event_id'])) {
1099
+			$where['EVT_ID'] = absint($request['event_id']);
1100
+		}
1101
+		return $where;
1102
+	}
1103
+
1104
+
1105
+	/**
1106
+	 * Adds category ID if it exists in the request to the where conditions for the registrations query.
1107
+	 *
1108
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1109
+	 * @return array
1110
+	 */
1111
+	protected function _add_category_id_to_where_conditions(array $request)
1112
+	{
1113
+		$where = array();
1114
+		if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1115
+			$where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116
+		}
1117
+		return $where;
1118
+	}
1119
+
1120
+
1121
+	/**
1122
+	 * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1123
+	 *
1124
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1125
+	 * @return array
1126
+	 */
1127
+	protected function _add_datetime_id_to_where_conditions(array $request)
1128
+	{
1129
+		$where = array();
1130
+		if (! empty($request['datetime_id'])) {
1131
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132
+		}
1133
+		if (! empty($request['DTT_ID'])) {
1134
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135
+		}
1136
+		return $where;
1137
+	}
1138
+
1139
+
1140
+	/**
1141
+	 * Adds the correct registration status to the where conditions for the registrations query.
1142
+	 *
1143
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1144
+	 * @return array
1145
+	 */
1146
+	protected function _add_registration_status_to_where_conditions(array $request)
1147
+	{
1148
+		$where = array();
1149
+		$view = EEH_Array::is_set($request, 'status', '');
1150
+		$registration_status = ! empty($request['_reg_status'])
1151
+			? sanitize_text_field($request['_reg_status'])
1152
+			: '';
1153
+
1154
+		/*
1155 1155
          * If filtering by registration status, then we show registrations matching that status.
1156 1156
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1157 1157
          * UNLESS viewing trashed registrations.
1158 1158
          */
1159
-        if (! empty($registration_status)) {
1160
-            $where['STS_ID'] = $registration_status;
1161
-        } else {
1162
-            //make sure we exclude incomplete registrations, but only if not trashed.
1163
-            if ($view === 'trash') {
1164
-                $where['REG_deleted'] = true;
1165
-            } elseif ($view === 'incomplete') {
1166
-                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1167
-            } else {
1168
-                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1169
-            }
1170
-        }
1171
-        return $where;
1172
-    }
1173
-
1174
-
1175
-    /**
1176
-     * Adds any provided date restraints to the where conditions for the registrations query.
1177
-     *
1178
-     * @param array $request usually the same as $this->_req_data but not necessarily
1179
-     * @return array
1180
-     * @throws EE_Error
1181
-     */
1182
-    protected function _add_date_to_where_conditions(array $request)
1183
-    {
1184
-        $where = array();
1185
-        $view = EEH_Array::is_set($request, 'status', '');
1186
-        $month_range             = ! empty($request['month_range'])
1187
-            ? sanitize_text_field($request['month_range'])
1188
-            : '';
1189
-        $retrieve_for_today      = $view === 'today';
1190
-        $retrieve_for_this_month = $view === 'month';
1191
-
1192
-        if ($retrieve_for_today) {
1193
-            $now               = date('Y-m-d', current_time('timestamp'));
1194
-            $where['REG_date'] = array(
1195
-                'BETWEEN',
1196
-                array(
1197
-                    EEM_Registration::instance()->convert_datetime_for_query(
1198
-                        'REG_date',
1199
-                        $now . ' 00:00:00',
1200
-                        'Y-m-d H:i:s'
1201
-                    ),
1202
-                    EEM_Registration::instance()->convert_datetime_for_query(
1203
-                        'REG_date',
1204
-                        $now . ' 23:59:59',
1205
-                        'Y-m-d H:i:s'
1206
-                    ),
1207
-                ),
1208
-            );
1209
-        } elseif ($retrieve_for_this_month) {
1210
-            $current_year_and_month = date('Y-m', current_time('timestamp'));
1211
-            $days_this_month        = date('t', current_time('timestamp'));
1212
-            $where['REG_date']      = array(
1213
-                'BETWEEN',
1214
-                array(
1215
-                    EEM_Registration::instance()->convert_datetime_for_query(
1216
-                        'REG_date',
1217
-                        $current_year_and_month . '-01 00:00:00',
1218
-                        'Y-m-d H:i:s'
1219
-                    ),
1220
-                    EEM_Registration::instance()->convert_datetime_for_query(
1221
-                        'REG_date',
1222
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1223
-                        'Y-m-d H:i:s'
1224
-                    ),
1225
-                ),
1226
-            );
1227
-        } elseif ($month_range) {
1228
-            $pieces          = explode(' ', $month_range, 3);
1229
-            $month_requested = ! empty($pieces[0])
1230
-                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1231
-                : '';
1232
-            $year_requested  = ! empty($pieces[1])
1233
-                ? $pieces[1]
1234
-                : '';
1235
-            //if there is not a month or year then we can't go further
1236
-            if ($month_requested && $year_requested) {
1237
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1238
-                $where['REG_date'] = array(
1239
-                    'BETWEEN',
1240
-                    array(
1241
-                        EEM_Registration::instance()->convert_datetime_for_query(
1242
-                            'REG_date',
1243
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1244
-                            'Y-m-d H:i:s'
1245
-                        ),
1246
-                        EEM_Registration::instance()->convert_datetime_for_query(
1247
-                            'REG_date',
1248
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1249
-                            'Y-m-d H:i:s'
1250
-                        ),
1251
-                    ),
1252
-                );
1253
-            }
1254
-        }
1255
-        return $where;
1256
-    }
1257
-
1258
-
1259
-    /**
1260
-     * Adds any provided search restraints to the where conditions for the registrations query
1261
-     *
1262
-     * @param array $request usually the same as $this->_req_data but not necessarily
1263
-     * @return array
1264
-     */
1265
-    protected function _add_search_to_where_conditions(array $request)
1266
-    {
1267
-        $where = array();
1268
-        if (! empty($request['s'])) {
1269
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1270
-            $where['OR*search_conditions'] = array(
1271
-                'Event.EVT_name'                          => array('LIKE', $search_string),
1272
-                'Event.EVT_desc'                          => array('LIKE', $search_string),
1273
-                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1274
-                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1275
-                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1276
-                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1277
-                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1278
-                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1279
-                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1280
-                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1281
-                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1282
-                'REG_final_price'                         => array('LIKE', $search_string),
1283
-                'REG_code'                                => array('LIKE', $search_string),
1284
-                'REG_count'                               => array('LIKE', $search_string),
1285
-                'REG_group_size'                          => array('LIKE', $search_string),
1286
-                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1287
-                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1288
-                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1289
-            );
1290
-        }
1291
-        return $where;
1292
-    }
1293
-
1294
-
1295
-    /**
1296
-     * Sets up the where conditions for the registrations query.
1297
-     *
1298
-     * @param array $request
1299
-     * @return array
1300
-     * @throws EE_Error
1301
-     */
1302
-    protected function _get_where_conditions_for_registrations_query($request)
1303
-    {
1304
-        return apply_filters(
1305
-            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1306
-            array_merge(
1307
-                $this->_add_event_id_to_where_conditions($request),
1308
-                $this->_add_category_id_to_where_conditions($request),
1309
-                $this->_add_datetime_id_to_where_conditions($request),
1310
-                $this->_add_registration_status_to_where_conditions($request),
1311
-                $this->_add_date_to_where_conditions($request),
1312
-                $this->_add_search_to_where_conditions($request)
1313
-            ),
1314
-            $request
1315
-        );
1316
-    }
1317
-
1318
-
1319
-    /**
1320
-     * Sets up the orderby for the registrations query.
1321
-     *
1322
-     * @return array
1323
-     */
1324
-    protected function _get_orderby_for_registrations_query()
1325
-    {
1326
-        $orderby_field = ! empty($this->_req_data['orderby'])
1327
-            ? sanitize_text_field($this->_req_data['orderby'])
1328
-            : '';
1329
-        switch ($orderby_field) {
1330
-            case '_REG_ID':
1331
-                $orderby_field = 'REG_ID';
1332
-                break;
1333
-            case '_Reg_status':
1334
-                $orderby_field = 'STS_ID';
1335
-                break;
1336
-            case 'ATT_fname':
1337
-                $orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1338
-                break;
1339
-            case 'ATT_lname':
1340
-                $orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1341
-                break;
1342
-            case 'event_name':
1343
-                $orderby_field = 'Event.EVT_name';
1344
-                break;
1345
-            case 'DTT_EVT_start':
1346
-                $orderby_field = 'Event.Datetime.DTT_EVT_start';
1347
-                break;
1348
-            default: //'REG_date'
1349
-                $orderby_field = 'REG_date';
1350
-        }
1351
-
1352
-        //order
1353
-        $order = ! empty($this->_req_data['order'])
1354
-            ? sanitize_text_field($this->_req_data['order'])
1355
-            : 'DESC';
1356
-
1357
-        //mutate orderby_field
1358
-        $orderby_field = array_combine(
1359
-            (array) $orderby_field,
1360
-            array_fill(0, count($orderby_field), $order)
1361
-        );
1362
-        return array('order_by' => $orderby_field);
1363
-    }
1364
-
1365
-
1366
-    /**
1367
-     * Sets up the limit for the registrations query.
1368
-     *
1369
-     * @param $per_page
1370
-     * @return array
1371
-     */
1372
-    protected function _get_limit($per_page)
1373
-    {
1374
-        $current_page = ! empty($this->_req_data['paged'])
1375
-            ? absint($this->_req_data['paged'])
1376
-            : 1;
1377
-        $per_page     = ! empty($this->_req_data['perpage'])
1378
-            ? $this->_req_data['perpage']
1379
-            : $per_page;
1380
-
1381
-        //-1 means return all results so get out if that's set.
1382
-        if ((int)$per_page === -1) {
1383
-            return array();
1384
-        }
1385
-        $per_page = absint($per_page);
1386
-        $offset   = ($current_page - 1) * $per_page;
1387
-        return array('limit' => array($offset, $per_page));
1388
-    }
1389
-
1390
-
1391
-    public function get_registration_status_array()
1392
-    {
1393
-        return self::$_reg_status;
1394
-    }
1395
-
1396
-
1397
-
1398
-
1399
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1400
-    /**
1401
-     *        generates HTML for the View Registration Details Admin page
1402
-     *
1403
-     * @access protected
1404
-     * @return void
1405
-     * @throws DomainException
1406
-     * @throws EE_Error
1407
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1408
-     */
1409
-    protected function _registration_details()
1410
-    {
1411
-        $this->_template_args = array();
1412
-        $this->_set_registration_object();
1413
-        if (is_object($this->_registration)) {
1414
-            $transaction                                   = $this->_registration->transaction()
1415
-                ? $this->_registration->transaction()
1416
-                : EE_Transaction::new_instance();
1417
-            $this->_session                                = $transaction->session_data();
1418
-            $event_id                                      = $this->_registration->event_ID();
1419
-            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1420
-            $this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1421
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1422
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1423
-            $this->_template_args['grand_total']           = $transaction->total();
1424
-            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1425
-            // link back to overview
1426
-            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1427
-            $this->_template_args['registration']                = $this->_registration;
1428
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1429
-                array(
1430
-                    'action'   => 'default',
1431
-                    'event_id' => $event_id,
1432
-                ),
1433
-                REG_ADMIN_URL
1434
-            );
1435
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1436
-                array(
1437
-                    'action' => 'default',
1438
-                    'EVT_ID' => $event_id,
1439
-                    'page'   => 'espresso_transactions',
1440
-                ),
1441
-                admin_url('admin.php')
1442
-            );
1443
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1444
-                array(
1445
-                    'page'   => 'espresso_events',
1446
-                    'action' => 'edit',
1447
-                    'post'   => $event_id,
1448
-                ),
1449
-                admin_url('admin.php')
1450
-            );
1451
-            //next and previous links
1452
-            $next_reg                                      = $this->_registration->next(
1453
-                null,
1454
-                array(),
1455
-                'REG_ID'
1456
-            );
1457
-            $this->_template_args['next_registration']     = $next_reg
1458
-                ? $this->_next_link(
1459
-                    EE_Admin_Page::add_query_args_and_nonce(
1460
-                        array(
1461
-                            'action'  => 'view_registration',
1462
-                            '_REG_ID' => $next_reg['REG_ID'],
1463
-                        ),
1464
-                        REG_ADMIN_URL
1465
-                    ),
1466
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1467
-                )
1468
-                : '';
1469
-            $previous_reg                                  = $this->_registration->previous(
1470
-                null,
1471
-                array(),
1472
-                'REG_ID'
1473
-            );
1474
-            $this->_template_args['previous_registration'] = $previous_reg
1475
-                ? $this->_previous_link(
1476
-                    EE_Admin_Page::add_query_args_and_nonce(
1477
-                        array(
1478
-                            'action'  => 'view_registration',
1479
-                            '_REG_ID' => $previous_reg['REG_ID'],
1480
-                        ),
1481
-                        REG_ADMIN_URL
1482
-                    ),
1483
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1484
-                )
1485
-                : '';
1486
-            // grab header
1487
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1488
-            $this->_template_args['REG_ID']            = $this->_registration->ID();
1489
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490
-                $template_path,
1491
-                $this->_template_args,
1492
-                true
1493
-            );
1494
-        } else {
1495
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1496
-        }
1497
-        // the details template wrapper
1498
-        $this->display_admin_page_with_sidebar();
1499
-    }
1500
-
1501
-
1502
-    protected function _registration_details_metaboxes()
1503
-    {
1504
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1505
-        $this->_set_registration_object();
1506
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1507
-        add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1508
-            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1509
-        add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1510
-            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1511
-        if ($attendee instanceof EE_Attendee
1512
-            && EE_Registry::instance()->CAP->current_user_can(
1513
-                'ee_edit_registration',
1514
-                'edit-reg-questions-mbox'
1515
-            )
1516
-        ) {
1517
-            add_meta_box(
1518
-                'edit-reg-questions-mbox',
1519
-                esc_html__('Registration Form Answers', 'event_espresso'),
1520
-                array($this, '_reg_questions_meta_box'),
1521
-                $this->wp_page_slug,
1522
-                'normal',
1523
-                'high'
1524
-            );
1525
-        }
1526
-        add_meta_box(
1527
-            'edit-reg-registrant-mbox',
1528
-            esc_html__('Contact Details', 'event_espresso'),
1529
-            array($this, '_reg_registrant_side_meta_box'),
1530
-            $this->wp_page_slug,
1531
-            'side',
1532
-            'high'
1533
-        );
1534
-        if ($this->_registration->group_size() > 1) {
1535
-            add_meta_box(
1536
-                'edit-reg-attendees-mbox',
1537
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1538
-                array($this, '_reg_attendees_meta_box'),
1539
-                $this->wp_page_slug,
1540
-                'normal',
1541
-                'high'
1542
-            );
1543
-        }
1544
-    }
1545
-
1546
-
1547
-    /**
1548
-     * set_reg_status_buttons_metabox
1549
-     *
1550
-     * @access protected
1551
-     * @return string
1552
-     * @throws \EE_Error
1553
-     */
1554
-    public function set_reg_status_buttons_metabox()
1555
-    {
1556
-        $this->_set_registration_object();
1557
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1558
-        echo $change_reg_status_form->form_open(
1559
-            self::add_query_args_and_nonce(
1560
-                array(
1561
-                    'action' => 'change_reg_status',
1562
-                ),
1563
-                REG_ADMIN_URL
1564
-            )
1565
-        );
1566
-        echo $change_reg_status_form->get_html();
1567
-        echo $change_reg_status_form->form_close();
1568
-    }
1569
-
1570
-
1571
-    /**
1572
-     * @return EE_Form_Section_Proper
1573
-     * @throws EE_Error
1574
-     */
1575
-    protected function _generate_reg_status_change_form()
1576
-    {
1577
-        return new EE_Form_Section_Proper(array(
1578
-            'name'            => 'reg_status_change_form',
1579
-            'html_id'         => 'reg-status-change-form',
1580
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1581
-            'subsections'     => array(
1582
-                'return'             => new EE_Hidden_Input(array(
1583
-                    'name'    => 'return',
1584
-                    'default' => 'view_registration',
1585
-                )),
1586
-                'REG_ID'             => new EE_Hidden_Input(array(
1587
-                    'name'    => 'REG_ID',
1588
-                    'default' => $this->_registration->ID(),
1589
-                )),
1590
-                'current_status'     => new EE_Form_Section_HTML(
1591
-                    EEH_HTML::tr(
1592
-                        EEH_HTML::th(
1593
-                            EEH_HTML::label(
1594
-                                EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1595
-                                )
1596
-                            )
1597
-                        )
1598
-                        . EEH_HTML::td(
1599
-                            EEH_HTML::strong(
1600
-                                $this->_registration->pretty_status(),
1601
-                                '',
1602
-                                'status-' . $this->_registration->status_ID(),
1603
-                                'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604
-                            )
1605
-                        )
1606
-                    )
1607
-                ),
1608
-                'reg_status'         => new EE_Select_Input(
1609
-                    $this->_get_reg_statuses(),
1610
-                    array(
1611
-                        'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1612
-                        'default'         => $this->_registration->status_ID(),
1613
-                    )
1614
-                ),
1615
-                'send_notifications' => new EE_Yes_No_Input(
1616
-                    array(
1617
-                        'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1618
-                        'default'         => false,
1619
-                        'html_help_text'  => esc_html__(
1620
-                            'If set to "Yes", then the related messages will be sent to the registrant.',
1621
-                            'event_espresso'
1622
-                        ),
1623
-                    )
1624
-                ),
1625
-                'submit'             => new EE_Submit_Input(
1626
-                    array(
1627
-                        'html_class'      => 'button-primary',
1628
-                        'html_label_text' => '&nbsp;',
1629
-                        'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1630
-                    )
1631
-                ),
1632
-            ),
1633
-        ));
1634
-    }
1635
-
1636
-
1637
-    /**
1638
-     * Returns an array of all the buttons for the various statuses and switch status actions
1639
-     *
1640
-     * @return array
1641
-     * @throws EE_Error
1642
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1643
-     */
1644
-    protected function _get_reg_statuses()
1645
-    {
1646
-        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1647
-        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1648
-        // get current reg status
1649
-        $current_status = $this->_registration->status_ID();
1650
-        // is registration for free event? This will determine whether to display the pending payment option
1651
-        if ($current_status != EEM_Registration::status_id_pending_payment
1652
-            && $this->_registration->transaction()
1653
-                                   ->is_free()
1654
-        ) {
1655
-            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1656
-        }
1657
-        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1658
-    }
1659
-
1660
-
1661
-    /**
1662
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1663
-     *
1664
-     * @param bool $status REG status given for changing registrations to.
1665
-     * @param bool $notify Whether to send messages notifications or not.
1666
-     * @return array  (array with reg_id(s) updated and whether update was successful.
1667
-     */
1668
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1669
-    {
1670
-        if (isset($this->_req_data['reg_status_change_form'])) {
1671
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673
-        } else {
1674
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1675
-        }
1676
-        $success = $this->_set_registration_status($REG_IDs, $status);
1677
-        //notify?
1678
-        if ($success
1679
-            && $notify
1680
-            && EE_Registry::instance()->CAP->current_user_can(
1681
-                'ee_send_message',
1682
-                'espresso_registrations_resend_registration'
1683
-            )
1684
-        ) {
1685
-            $this->_process_resend_registration();
1686
-        }
1687
-        return $success;
1688
-    }
1689
-
1690
-
1691
-    /**
1692
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1693
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1694
-     *
1695
-     * @param array $REG_IDs
1696
-     * @param bool  $status
1697
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1698
-     *               the array of updated registrations).
1699
-     * @throws EE_Error
1700
-     * @throws RuntimeException
1701
-     */
1702
-    protected function _set_registration_status($REG_IDs = array(), $status = false)
1703
-    {
1704
-        $success = false;
1705
-        // typecast $REG_IDs
1706
-        $REG_IDs = (array)$REG_IDs;
1707
-        if ( ! empty($REG_IDs)) {
1708
-            $success = true;
1709
-            // set default status if none is passed
1710
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1711
-            // sanitize $REG_IDs
1712
-            $REG_IDs = array_filter($REG_IDs, 'absint');
1713
-            //loop through REG_ID's and change status
1714
-            foreach ($REG_IDs as $REG_ID) {
1715
-                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1716
-                if ($registration instanceof EE_Registration) {
1717
-                    $registration->set_status($status);
1718
-                    $result = $registration->save();
1719
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1720
-                    $success = $result !== false ? $success : false;
1721
-                }
1722
-            }
1723
-        }
1724
-        //reset _req_data['_REG_ID'] for any potential future messages notifications
1725
-        $this->_req_data['_REG_ID'] = $REG_IDs;
1726
-        //return $success and processed registrations
1727
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1728
-    }
1729
-
1730
-
1731
-    /**
1732
-     * Common logic for setting up success message and redirecting to appropriate route
1733
-     *
1734
-     * @param  string $STS_ID status id for the registration changed to
1735
-     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1736
-     * @return void
1737
-     */
1738
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1739
-    {
1740
-        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1741
-            : array('success' => false);
1742
-        $success = isset($result['success']) && $result['success'];
1743
-        //setup success message
1744
-        if ($success) {
1745
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1746
-                $msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1747
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1748
-            } else {
1749
-                $msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1750
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1751
-            }
1752
-            EE_Error::add_success($msg);
1753
-        } else {
1754
-            EE_Error::add_error(
1755
-                esc_html__(
1756
-                    'Something went wrong, and the status was not changed',
1757
-                    'event_espresso'
1758
-                ), __FILE__, __LINE__, __FUNCTION__
1759
-            );
1760
-        }
1761
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1762
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1763
-        } else {
1764
-            $route = array('action' => 'default');
1765
-        }
1766
-        //unset nonces
1767
-        foreach ($this->_req_data as $ref => $value) {
1768
-            if (strpos($ref, 'nonce') !== false) {
1769
-                unset($this->_req_data[$ref]);
1770
-                continue;
1771
-            }
1772
-            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1773
-            $this->_req_data[$ref] = $value;
1774
-        }
1775
-        //merge request vars so that the reloaded list table contains any existing filter query params
1776
-        $route = array_merge($this->_req_data, $route);
1777
-        $this->_redirect_after_action($success, '', '', $route, true);
1778
-    }
1779
-
1780
-
1781
-    /**
1782
-     * incoming reg status change from reg details page.
1783
-     *
1784
-     * @return void
1785
-     */
1786
-    protected function _change_reg_status()
1787
-    {
1788
-        $this->_req_data['return'] = 'view_registration';
1789
-        //set notify based on whether the send notifications toggle is set or not
1790
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1791
-        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1792
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1793
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1794
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1795
-            case EEM_Registration::status_id_approved :
1796
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1797
-                $this->approve_registration($notify);
1798
-                break;
1799
-            case EEM_Registration::status_id_pending_payment :
1800
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1801
-                $this->pending_registration($notify);
1802
-                break;
1803
-            case EEM_Registration::status_id_not_approved :
1804
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1805
-                $this->not_approve_registration($notify);
1806
-                break;
1807
-            case EEM_Registration::status_id_declined :
1808
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1809
-                $this->decline_registration($notify);
1810
-                break;
1811
-            case EEM_Registration::status_id_cancelled :
1812
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1813
-                $this->cancel_registration($notify);
1814
-                break;
1815
-            case EEM_Registration::status_id_wait_list :
1816
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1817
-                $this->waitlist_registration($notify);
1818
-                break;
1819
-            case EEM_Registration::status_id_incomplete :
1820
-            default :
1821
-                $result['success'] = false;
1822
-                unset($this->_req_data['return']);
1823
-                $this->_reg_status_change_return('', false);
1824
-                break;
1825
-        }
1826
-    }
1827
-
1828
-
1829
-    /**
1830
-     * approve_registration
1831
-     *
1832
-     * @access protected
1833
-     * @param bool $notify whether or not to notify the registrant about their approval.
1834
-     * @return void
1835
-     */
1836
-    protected function approve_registration($notify = false)
1837
-    {
1838
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1839
-    }
1840
-
1841
-
1842
-    /**
1843
-     *        decline_registration
1844
-     *
1845
-     * @access protected
1846
-     * @param bool $notify whether or not to notify the registrant about their status change.
1847
-     * @return void
1848
-     */
1849
-    protected function decline_registration($notify = false)
1850
-    {
1851
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1852
-    }
1853
-
1854
-
1855
-    /**
1856
-     *        cancel_registration
1857
-     *
1858
-     * @access protected
1859
-     * @param bool $notify whether or not to notify the registrant about their status change.
1860
-     * @return void
1861
-     */
1862
-    protected function cancel_registration($notify = false)
1863
-    {
1864
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1865
-    }
1866
-
1867
-
1868
-    /**
1869
-     *        not_approve_registration
1870
-     *
1871
-     * @access protected
1872
-     * @param bool $notify whether or not to notify the registrant about their status change.
1873
-     * @return void
1874
-     */
1875
-    protected function not_approve_registration($notify = false)
1876
-    {
1877
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1878
-    }
1879
-
1880
-
1881
-    /**
1882
-     *        decline_registration
1883
-     *
1884
-     * @access protected
1885
-     * @param bool $notify whether or not to notify the registrant about their status change.
1886
-     * @return void
1887
-     */
1888
-    protected function pending_registration($notify = false)
1889
-    {
1890
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1891
-    }
1892
-
1893
-
1894
-    /**
1895
-     * waitlist_registration
1896
-     *
1897
-     * @access protected
1898
-     * @param bool $notify whether or not to notify the registrant about their status change.
1899
-     * @return void
1900
-     */
1901
-    protected function waitlist_registration($notify = false)
1902
-    {
1903
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1904
-    }
1905
-
1906
-
1907
-    /**
1908
-     *        generates HTML for the Registration main meta box
1909
-     *
1910
-     * @access public
1911
-     * @return void
1912
-     * @throws DomainException
1913
-     * @throws EE_Error
1914
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1915
-     */
1916
-    public function _reg_details_meta_box()
1917
-    {
1918
-        EEH_Autoloader::register_line_item_display_autoloaders();
1919
-        EEH_Autoloader::register_line_item_filter_autoloaders();
1920
-        EE_Registry::instance()->load_helper('Line_Item');
1921
-        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1922
-            : EE_Transaction::new_instance();
1923
-        $this->_session = $transaction->session_data();
1924
-        $filters        = new EE_Line_Item_Filter_Collection();
1925
-        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1926
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1927
-        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1928
-            $transaction->total_line_item());
1929
-        $filtered_line_item_tree                 = $line_item_filter_processor->process();
1930
-        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1931
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1932
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
1933
-            $filtered_line_item_tree,
1934
-            array('EE_Registration' => $this->_registration)
1935
-        );
1936
-        $attendee                                = $this->_registration->attendee();
1937
-        if (EE_Registry::instance()->CAP->current_user_can(
1938
-            'ee_read_transaction',
1939
-            'espresso_transactions_view_transaction'
1940
-        )) {
1941
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
1942
-                EE_Admin_Page::add_query_args_and_nonce(
1943
-                    array(
1944
-                        'action' => 'view_transaction',
1945
-                        'TXN_ID' => $transaction->ID(),
1946
-                    ),
1947
-                    TXN_ADMIN_URL
1948
-                ),
1949
-                esc_html__(' View Transaction', 'event_espresso'),
1950
-                'button secondary-button right',
1951
-                'dashicons dashicons-cart'
1952
-            );
1953
-        } else {
1954
-            $this->_template_args['view_transaction_button'] = '';
1955
-        }
1956
-        if ($attendee instanceof EE_Attendee
1957
-            && EE_Registry::instance()->CAP->current_user_can(
1958
-                'ee_send_message',
1959
-                'espresso_registrations_resend_registration'
1960
-            )
1961
-        ) {
1962
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
1963
-                EE_Admin_Page::add_query_args_and_nonce(
1964
-                    array(
1965
-                        'action'      => 'resend_registration',
1966
-                        '_REG_ID'     => $this->_registration->ID(),
1967
-                        'redirect_to' => 'view_registration',
1968
-                    ),
1969
-                    REG_ADMIN_URL
1970
-                ),
1971
-                esc_html__(' Resend Registration', 'event_espresso'),
1972
-                'button secondary-button right',
1973
-                'dashicons dashicons-email-alt'
1974
-            );
1975
-        } else {
1976
-            $this->_template_args['resend_registration_button'] = '';
1977
-        }
1978
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1979
-        $payment                               = $transaction->get_first_related('Payment');
1980
-        $payment                               = ! $payment instanceof EE_Payment
1981
-            ? EE_Payment::new_instance()
1982
-            : $payment;
1983
-        $payment_method                        = $payment->get_first_related('Payment_Method');
1984
-        $payment_method                        = ! $payment_method instanceof EE_Payment_Method
1985
-            ? EE_Payment_Method::new_instance()
1986
-            : $payment_method;
1987
-        $reg_details                           = array(
1988
-            'payment_method'       => $payment_method->name(),
1989
-            'response_msg'         => $payment->gateway_response(),
1990
-            'registration_id'      => $this->_registration->get('REG_code'),
1991
-            'registration_session' => $this->_registration->session_ID(),
1992
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1993
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1994
-        );
1995
-        if (isset($reg_details['registration_id'])) {
1996
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1997
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
1998
-                'Registration ID',
1999
-                'event_espresso'
2000
-            );
2001
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2002
-        }
2003
-        if (isset($reg_details['payment_method'])) {
2004
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2005
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2006
-                'Most Recent Payment Method',
2007
-                'event_espresso'
2008
-            );
2009
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2010
-            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2011
-            $this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2012
-                'Payment method response',
2013
-                'event_espresso'
2014
-            );
2015
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2016
-        }
2017
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2019
-            'Registration Session',
2020
-            'event_espresso'
2021
-        );
2022
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2023
-        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2024
-        $this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2025
-            'Registration placed from IP',
2026
-            'event_espresso'
2027
-        );
2028
-        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2029
-        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2030
-        $this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2031
-            'event_espresso');
2032
-        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2033
-        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2034
-            array(
2035
-                'action'   => 'default',
2036
-                'event_id' => $this->_registration->event_ID(),
2037
-            ),
2038
-            REG_ADMIN_URL
2039
-        );
2040
-        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041
-        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042
-        $template_path                                                        =
2043
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2044
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045
-    }
2046
-
2047
-
2048
-    /**
2049
-     * generates HTML for the Registration Questions meta box.
2050
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2051
-     * otherwise uses new forms system
2052
-     *
2053
-     * @access public
2054
-     * @return void
2055
-     * @throws DomainException
2056
-     * @throws EE_Error
2057
-     */
2058
-    public function _reg_questions_meta_box()
2059
-    {
2060
-        //allow someone to override this method entirely
2061
-        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2062
-            $this->_registration)) {
2063
-            $form                                              = $this->_get_reg_custom_questions_form(
2064
-                $this->_registration->ID()
2065
-            );
2066
-            $this->_template_args['att_questions']             = count($form->subforms()) > 0
2067
-                ? $form->get_html_and_js()
2068
-                : '';
2069
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070
-            $this->_template_args['REG_ID']                    = $this->_registration->ID();
2071
-            $template_path                                     =
2072
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2073
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074
-        }
2075
-    }
2076
-
2077
-
2078
-    /**
2079
-     * form_before_question_group
2080
-     *
2081
-     * @deprecated    as of 4.8.32.rc.000
2082
-     * @access        public
2083
-     * @param        string $output
2084
-     * @return        string
2085
-     */
2086
-    public function form_before_question_group($output)
2087
-    {
2088
-        EE_Error::doing_it_wrong(
2089
-            __CLASS__ . '::' . __FUNCTION__,
2090
-            esc_html__(
2091
-                '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.',
2092
-                'event_espresso'
2093
-            ),
2094
-            '4.8.32.rc.000'
2095
-        );
2096
-        return '
1159
+		if (! empty($registration_status)) {
1160
+			$where['STS_ID'] = $registration_status;
1161
+		} else {
1162
+			//make sure we exclude incomplete registrations, but only if not trashed.
1163
+			if ($view === 'trash') {
1164
+				$where['REG_deleted'] = true;
1165
+			} elseif ($view === 'incomplete') {
1166
+				$where['STS_ID'] = EEM_Registration::status_id_incomplete;
1167
+			} else {
1168
+				$where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1169
+			}
1170
+		}
1171
+		return $where;
1172
+	}
1173
+
1174
+
1175
+	/**
1176
+	 * Adds any provided date restraints to the where conditions for the registrations query.
1177
+	 *
1178
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1179
+	 * @return array
1180
+	 * @throws EE_Error
1181
+	 */
1182
+	protected function _add_date_to_where_conditions(array $request)
1183
+	{
1184
+		$where = array();
1185
+		$view = EEH_Array::is_set($request, 'status', '');
1186
+		$month_range             = ! empty($request['month_range'])
1187
+			? sanitize_text_field($request['month_range'])
1188
+			: '';
1189
+		$retrieve_for_today      = $view === 'today';
1190
+		$retrieve_for_this_month = $view === 'month';
1191
+
1192
+		if ($retrieve_for_today) {
1193
+			$now               = date('Y-m-d', current_time('timestamp'));
1194
+			$where['REG_date'] = array(
1195
+				'BETWEEN',
1196
+				array(
1197
+					EEM_Registration::instance()->convert_datetime_for_query(
1198
+						'REG_date',
1199
+						$now . ' 00:00:00',
1200
+						'Y-m-d H:i:s'
1201
+					),
1202
+					EEM_Registration::instance()->convert_datetime_for_query(
1203
+						'REG_date',
1204
+						$now . ' 23:59:59',
1205
+						'Y-m-d H:i:s'
1206
+					),
1207
+				),
1208
+			);
1209
+		} elseif ($retrieve_for_this_month) {
1210
+			$current_year_and_month = date('Y-m', current_time('timestamp'));
1211
+			$days_this_month        = date('t', current_time('timestamp'));
1212
+			$where['REG_date']      = array(
1213
+				'BETWEEN',
1214
+				array(
1215
+					EEM_Registration::instance()->convert_datetime_for_query(
1216
+						'REG_date',
1217
+						$current_year_and_month . '-01 00:00:00',
1218
+						'Y-m-d H:i:s'
1219
+					),
1220
+					EEM_Registration::instance()->convert_datetime_for_query(
1221
+						'REG_date',
1222
+						$current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1223
+						'Y-m-d H:i:s'
1224
+					),
1225
+				),
1226
+			);
1227
+		} elseif ($month_range) {
1228
+			$pieces          = explode(' ', $month_range, 3);
1229
+			$month_requested = ! empty($pieces[0])
1230
+				? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1231
+				: '';
1232
+			$year_requested  = ! empty($pieces[1])
1233
+				? $pieces[1]
1234
+				: '';
1235
+			//if there is not a month or year then we can't go further
1236
+			if ($month_requested && $year_requested) {
1237
+				$days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1238
+				$where['REG_date'] = array(
1239
+					'BETWEEN',
1240
+					array(
1241
+						EEM_Registration::instance()->convert_datetime_for_query(
1242
+							'REG_date',
1243
+							$year_requested . '-' . $month_requested . '-01 00:00:00',
1244
+							'Y-m-d H:i:s'
1245
+						),
1246
+						EEM_Registration::instance()->convert_datetime_for_query(
1247
+							'REG_date',
1248
+							$year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1249
+							'Y-m-d H:i:s'
1250
+						),
1251
+					),
1252
+				);
1253
+			}
1254
+		}
1255
+		return $where;
1256
+	}
1257
+
1258
+
1259
+	/**
1260
+	 * Adds any provided search restraints to the where conditions for the registrations query
1261
+	 *
1262
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1263
+	 * @return array
1264
+	 */
1265
+	protected function _add_search_to_where_conditions(array $request)
1266
+	{
1267
+		$where = array();
1268
+		if (! empty($request['s'])) {
1269
+			$search_string = '%' . sanitize_text_field($request['s']) . '%';
1270
+			$where['OR*search_conditions'] = array(
1271
+				'Event.EVT_name'                          => array('LIKE', $search_string),
1272
+				'Event.EVT_desc'                          => array('LIKE', $search_string),
1273
+				'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1274
+				'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1275
+				'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1276
+				'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1277
+				'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1278
+				'Attendee.ATT_email'                      => array('LIKE', $search_string),
1279
+				'Attendee.ATT_address'                    => array('LIKE', $search_string),
1280
+				'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1281
+				'Attendee.ATT_city'                       => array('LIKE', $search_string),
1282
+				'REG_final_price'                         => array('LIKE', $search_string),
1283
+				'REG_code'                                => array('LIKE', $search_string),
1284
+				'REG_count'                               => array('LIKE', $search_string),
1285
+				'REG_group_size'                          => array('LIKE', $search_string),
1286
+				'Ticket.TKT_name'                         => array('LIKE', $search_string),
1287
+				'Ticket.TKT_description'                  => array('LIKE', $search_string),
1288
+				'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1289
+			);
1290
+		}
1291
+		return $where;
1292
+	}
1293
+
1294
+
1295
+	/**
1296
+	 * Sets up the where conditions for the registrations query.
1297
+	 *
1298
+	 * @param array $request
1299
+	 * @return array
1300
+	 * @throws EE_Error
1301
+	 */
1302
+	protected function _get_where_conditions_for_registrations_query($request)
1303
+	{
1304
+		return apply_filters(
1305
+			'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1306
+			array_merge(
1307
+				$this->_add_event_id_to_where_conditions($request),
1308
+				$this->_add_category_id_to_where_conditions($request),
1309
+				$this->_add_datetime_id_to_where_conditions($request),
1310
+				$this->_add_registration_status_to_where_conditions($request),
1311
+				$this->_add_date_to_where_conditions($request),
1312
+				$this->_add_search_to_where_conditions($request)
1313
+			),
1314
+			$request
1315
+		);
1316
+	}
1317
+
1318
+
1319
+	/**
1320
+	 * Sets up the orderby for the registrations query.
1321
+	 *
1322
+	 * @return array
1323
+	 */
1324
+	protected function _get_orderby_for_registrations_query()
1325
+	{
1326
+		$orderby_field = ! empty($this->_req_data['orderby'])
1327
+			? sanitize_text_field($this->_req_data['orderby'])
1328
+			: '';
1329
+		switch ($orderby_field) {
1330
+			case '_REG_ID':
1331
+				$orderby_field = 'REG_ID';
1332
+				break;
1333
+			case '_Reg_status':
1334
+				$orderby_field = 'STS_ID';
1335
+				break;
1336
+			case 'ATT_fname':
1337
+				$orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1338
+				break;
1339
+			case 'ATT_lname':
1340
+				$orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1341
+				break;
1342
+			case 'event_name':
1343
+				$orderby_field = 'Event.EVT_name';
1344
+				break;
1345
+			case 'DTT_EVT_start':
1346
+				$orderby_field = 'Event.Datetime.DTT_EVT_start';
1347
+				break;
1348
+			default: //'REG_date'
1349
+				$orderby_field = 'REG_date';
1350
+		}
1351
+
1352
+		//order
1353
+		$order = ! empty($this->_req_data['order'])
1354
+			? sanitize_text_field($this->_req_data['order'])
1355
+			: 'DESC';
1356
+
1357
+		//mutate orderby_field
1358
+		$orderby_field = array_combine(
1359
+			(array) $orderby_field,
1360
+			array_fill(0, count($orderby_field), $order)
1361
+		);
1362
+		return array('order_by' => $orderby_field);
1363
+	}
1364
+
1365
+
1366
+	/**
1367
+	 * Sets up the limit for the registrations query.
1368
+	 *
1369
+	 * @param $per_page
1370
+	 * @return array
1371
+	 */
1372
+	protected function _get_limit($per_page)
1373
+	{
1374
+		$current_page = ! empty($this->_req_data['paged'])
1375
+			? absint($this->_req_data['paged'])
1376
+			: 1;
1377
+		$per_page     = ! empty($this->_req_data['perpage'])
1378
+			? $this->_req_data['perpage']
1379
+			: $per_page;
1380
+
1381
+		//-1 means return all results so get out if that's set.
1382
+		if ((int)$per_page === -1) {
1383
+			return array();
1384
+		}
1385
+		$per_page = absint($per_page);
1386
+		$offset   = ($current_page - 1) * $per_page;
1387
+		return array('limit' => array($offset, $per_page));
1388
+	}
1389
+
1390
+
1391
+	public function get_registration_status_array()
1392
+	{
1393
+		return self::$_reg_status;
1394
+	}
1395
+
1396
+
1397
+
1398
+
1399
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1400
+	/**
1401
+	 *        generates HTML for the View Registration Details Admin page
1402
+	 *
1403
+	 * @access protected
1404
+	 * @return void
1405
+	 * @throws DomainException
1406
+	 * @throws EE_Error
1407
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1408
+	 */
1409
+	protected function _registration_details()
1410
+	{
1411
+		$this->_template_args = array();
1412
+		$this->_set_registration_object();
1413
+		if (is_object($this->_registration)) {
1414
+			$transaction                                   = $this->_registration->transaction()
1415
+				? $this->_registration->transaction()
1416
+				: EE_Transaction::new_instance();
1417
+			$this->_session                                = $transaction->session_data();
1418
+			$event_id                                      = $this->_registration->event_ID();
1419
+			$this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1420
+			$this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1421
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1422
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1423
+			$this->_template_args['grand_total']           = $transaction->total();
1424
+			$this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1425
+			// link back to overview
1426
+			$this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1427
+			$this->_template_args['registration']                = $this->_registration;
1428
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1429
+				array(
1430
+					'action'   => 'default',
1431
+					'event_id' => $event_id,
1432
+				),
1433
+				REG_ADMIN_URL
1434
+			);
1435
+			$this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1436
+				array(
1437
+					'action' => 'default',
1438
+					'EVT_ID' => $event_id,
1439
+					'page'   => 'espresso_transactions',
1440
+				),
1441
+				admin_url('admin.php')
1442
+			);
1443
+			$this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1444
+				array(
1445
+					'page'   => 'espresso_events',
1446
+					'action' => 'edit',
1447
+					'post'   => $event_id,
1448
+				),
1449
+				admin_url('admin.php')
1450
+			);
1451
+			//next and previous links
1452
+			$next_reg                                      = $this->_registration->next(
1453
+				null,
1454
+				array(),
1455
+				'REG_ID'
1456
+			);
1457
+			$this->_template_args['next_registration']     = $next_reg
1458
+				? $this->_next_link(
1459
+					EE_Admin_Page::add_query_args_and_nonce(
1460
+						array(
1461
+							'action'  => 'view_registration',
1462
+							'_REG_ID' => $next_reg['REG_ID'],
1463
+						),
1464
+						REG_ADMIN_URL
1465
+					),
1466
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1467
+				)
1468
+				: '';
1469
+			$previous_reg                                  = $this->_registration->previous(
1470
+				null,
1471
+				array(),
1472
+				'REG_ID'
1473
+			);
1474
+			$this->_template_args['previous_registration'] = $previous_reg
1475
+				? $this->_previous_link(
1476
+					EE_Admin_Page::add_query_args_and_nonce(
1477
+						array(
1478
+							'action'  => 'view_registration',
1479
+							'_REG_ID' => $previous_reg['REG_ID'],
1480
+						),
1481
+						REG_ADMIN_URL
1482
+					),
1483
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1484
+				)
1485
+				: '';
1486
+			// grab header
1487
+			$template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1488
+			$this->_template_args['REG_ID']            = $this->_registration->ID();
1489
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490
+				$template_path,
1491
+				$this->_template_args,
1492
+				true
1493
+			);
1494
+		} else {
1495
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1496
+		}
1497
+		// the details template wrapper
1498
+		$this->display_admin_page_with_sidebar();
1499
+	}
1500
+
1501
+
1502
+	protected function _registration_details_metaboxes()
1503
+	{
1504
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1505
+		$this->_set_registration_object();
1506
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1507
+		add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1508
+			array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1509
+		add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1510
+			array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1511
+		if ($attendee instanceof EE_Attendee
1512
+			&& EE_Registry::instance()->CAP->current_user_can(
1513
+				'ee_edit_registration',
1514
+				'edit-reg-questions-mbox'
1515
+			)
1516
+		) {
1517
+			add_meta_box(
1518
+				'edit-reg-questions-mbox',
1519
+				esc_html__('Registration Form Answers', 'event_espresso'),
1520
+				array($this, '_reg_questions_meta_box'),
1521
+				$this->wp_page_slug,
1522
+				'normal',
1523
+				'high'
1524
+			);
1525
+		}
1526
+		add_meta_box(
1527
+			'edit-reg-registrant-mbox',
1528
+			esc_html__('Contact Details', 'event_espresso'),
1529
+			array($this, '_reg_registrant_side_meta_box'),
1530
+			$this->wp_page_slug,
1531
+			'side',
1532
+			'high'
1533
+		);
1534
+		if ($this->_registration->group_size() > 1) {
1535
+			add_meta_box(
1536
+				'edit-reg-attendees-mbox',
1537
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1538
+				array($this, '_reg_attendees_meta_box'),
1539
+				$this->wp_page_slug,
1540
+				'normal',
1541
+				'high'
1542
+			);
1543
+		}
1544
+	}
1545
+
1546
+
1547
+	/**
1548
+	 * set_reg_status_buttons_metabox
1549
+	 *
1550
+	 * @access protected
1551
+	 * @return string
1552
+	 * @throws \EE_Error
1553
+	 */
1554
+	public function set_reg_status_buttons_metabox()
1555
+	{
1556
+		$this->_set_registration_object();
1557
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1558
+		echo $change_reg_status_form->form_open(
1559
+			self::add_query_args_and_nonce(
1560
+				array(
1561
+					'action' => 'change_reg_status',
1562
+				),
1563
+				REG_ADMIN_URL
1564
+			)
1565
+		);
1566
+		echo $change_reg_status_form->get_html();
1567
+		echo $change_reg_status_form->form_close();
1568
+	}
1569
+
1570
+
1571
+	/**
1572
+	 * @return EE_Form_Section_Proper
1573
+	 * @throws EE_Error
1574
+	 */
1575
+	protected function _generate_reg_status_change_form()
1576
+	{
1577
+		return new EE_Form_Section_Proper(array(
1578
+			'name'            => 'reg_status_change_form',
1579
+			'html_id'         => 'reg-status-change-form',
1580
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1581
+			'subsections'     => array(
1582
+				'return'             => new EE_Hidden_Input(array(
1583
+					'name'    => 'return',
1584
+					'default' => 'view_registration',
1585
+				)),
1586
+				'REG_ID'             => new EE_Hidden_Input(array(
1587
+					'name'    => 'REG_ID',
1588
+					'default' => $this->_registration->ID(),
1589
+				)),
1590
+				'current_status'     => new EE_Form_Section_HTML(
1591
+					EEH_HTML::tr(
1592
+						EEH_HTML::th(
1593
+							EEH_HTML::label(
1594
+								EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1595
+								)
1596
+							)
1597
+						)
1598
+						. EEH_HTML::td(
1599
+							EEH_HTML::strong(
1600
+								$this->_registration->pretty_status(),
1601
+								'',
1602
+								'status-' . $this->_registration->status_ID(),
1603
+								'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604
+							)
1605
+						)
1606
+					)
1607
+				),
1608
+				'reg_status'         => new EE_Select_Input(
1609
+					$this->_get_reg_statuses(),
1610
+					array(
1611
+						'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1612
+						'default'         => $this->_registration->status_ID(),
1613
+					)
1614
+				),
1615
+				'send_notifications' => new EE_Yes_No_Input(
1616
+					array(
1617
+						'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1618
+						'default'         => false,
1619
+						'html_help_text'  => esc_html__(
1620
+							'If set to "Yes", then the related messages will be sent to the registrant.',
1621
+							'event_espresso'
1622
+						),
1623
+					)
1624
+				),
1625
+				'submit'             => new EE_Submit_Input(
1626
+					array(
1627
+						'html_class'      => 'button-primary',
1628
+						'html_label_text' => '&nbsp;',
1629
+						'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1630
+					)
1631
+				),
1632
+			),
1633
+		));
1634
+	}
1635
+
1636
+
1637
+	/**
1638
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1639
+	 *
1640
+	 * @return array
1641
+	 * @throws EE_Error
1642
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1643
+	 */
1644
+	protected function _get_reg_statuses()
1645
+	{
1646
+		$reg_status_array = EEM_Registration::instance()->reg_status_array();
1647
+		unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1648
+		// get current reg status
1649
+		$current_status = $this->_registration->status_ID();
1650
+		// is registration for free event? This will determine whether to display the pending payment option
1651
+		if ($current_status != EEM_Registration::status_id_pending_payment
1652
+			&& $this->_registration->transaction()
1653
+								   ->is_free()
1654
+		) {
1655
+			unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1656
+		}
1657
+		return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1658
+	}
1659
+
1660
+
1661
+	/**
1662
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1663
+	 *
1664
+	 * @param bool $status REG status given for changing registrations to.
1665
+	 * @param bool $notify Whether to send messages notifications or not.
1666
+	 * @return array  (array with reg_id(s) updated and whether update was successful.
1667
+	 */
1668
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1669
+	{
1670
+		if (isset($this->_req_data['reg_status_change_form'])) {
1671
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
+				? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673
+		} else {
1674
+			$REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1675
+		}
1676
+		$success = $this->_set_registration_status($REG_IDs, $status);
1677
+		//notify?
1678
+		if ($success
1679
+			&& $notify
1680
+			&& EE_Registry::instance()->CAP->current_user_can(
1681
+				'ee_send_message',
1682
+				'espresso_registrations_resend_registration'
1683
+			)
1684
+		) {
1685
+			$this->_process_resend_registration();
1686
+		}
1687
+		return $success;
1688
+	}
1689
+
1690
+
1691
+	/**
1692
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1693
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1694
+	 *
1695
+	 * @param array $REG_IDs
1696
+	 * @param bool  $status
1697
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1698
+	 *               the array of updated registrations).
1699
+	 * @throws EE_Error
1700
+	 * @throws RuntimeException
1701
+	 */
1702
+	protected function _set_registration_status($REG_IDs = array(), $status = false)
1703
+	{
1704
+		$success = false;
1705
+		// typecast $REG_IDs
1706
+		$REG_IDs = (array)$REG_IDs;
1707
+		if ( ! empty($REG_IDs)) {
1708
+			$success = true;
1709
+			// set default status if none is passed
1710
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1711
+			// sanitize $REG_IDs
1712
+			$REG_IDs = array_filter($REG_IDs, 'absint');
1713
+			//loop through REG_ID's and change status
1714
+			foreach ($REG_IDs as $REG_ID) {
1715
+				$registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1716
+				if ($registration instanceof EE_Registration) {
1717
+					$registration->set_status($status);
1718
+					$result = $registration->save();
1719
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1720
+					$success = $result !== false ? $success : false;
1721
+				}
1722
+			}
1723
+		}
1724
+		//reset _req_data['_REG_ID'] for any potential future messages notifications
1725
+		$this->_req_data['_REG_ID'] = $REG_IDs;
1726
+		//return $success and processed registrations
1727
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1728
+	}
1729
+
1730
+
1731
+	/**
1732
+	 * Common logic for setting up success message and redirecting to appropriate route
1733
+	 *
1734
+	 * @param  string $STS_ID status id for the registration changed to
1735
+	 * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1736
+	 * @return void
1737
+	 */
1738
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1739
+	{
1740
+		$result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1741
+			: array('success' => false);
1742
+		$success = isset($result['success']) && $result['success'];
1743
+		//setup success message
1744
+		if ($success) {
1745
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1746
+				$msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1747
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1748
+			} else {
1749
+				$msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1750
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1751
+			}
1752
+			EE_Error::add_success($msg);
1753
+		} else {
1754
+			EE_Error::add_error(
1755
+				esc_html__(
1756
+					'Something went wrong, and the status was not changed',
1757
+					'event_espresso'
1758
+				), __FILE__, __LINE__, __FUNCTION__
1759
+			);
1760
+		}
1761
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1762
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1763
+		} else {
1764
+			$route = array('action' => 'default');
1765
+		}
1766
+		//unset nonces
1767
+		foreach ($this->_req_data as $ref => $value) {
1768
+			if (strpos($ref, 'nonce') !== false) {
1769
+				unset($this->_req_data[$ref]);
1770
+				continue;
1771
+			}
1772
+			$value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1773
+			$this->_req_data[$ref] = $value;
1774
+		}
1775
+		//merge request vars so that the reloaded list table contains any existing filter query params
1776
+		$route = array_merge($this->_req_data, $route);
1777
+		$this->_redirect_after_action($success, '', '', $route, true);
1778
+	}
1779
+
1780
+
1781
+	/**
1782
+	 * incoming reg status change from reg details page.
1783
+	 *
1784
+	 * @return void
1785
+	 */
1786
+	protected function _change_reg_status()
1787
+	{
1788
+		$this->_req_data['return'] = 'view_registration';
1789
+		//set notify based on whether the send notifications toggle is set or not
1790
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1791
+		//$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1792
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1793
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1794
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1795
+			case EEM_Registration::status_id_approved :
1796
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1797
+				$this->approve_registration($notify);
1798
+				break;
1799
+			case EEM_Registration::status_id_pending_payment :
1800
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1801
+				$this->pending_registration($notify);
1802
+				break;
1803
+			case EEM_Registration::status_id_not_approved :
1804
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1805
+				$this->not_approve_registration($notify);
1806
+				break;
1807
+			case EEM_Registration::status_id_declined :
1808
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1809
+				$this->decline_registration($notify);
1810
+				break;
1811
+			case EEM_Registration::status_id_cancelled :
1812
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1813
+				$this->cancel_registration($notify);
1814
+				break;
1815
+			case EEM_Registration::status_id_wait_list :
1816
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1817
+				$this->waitlist_registration($notify);
1818
+				break;
1819
+			case EEM_Registration::status_id_incomplete :
1820
+			default :
1821
+				$result['success'] = false;
1822
+				unset($this->_req_data['return']);
1823
+				$this->_reg_status_change_return('', false);
1824
+				break;
1825
+		}
1826
+	}
1827
+
1828
+
1829
+	/**
1830
+	 * approve_registration
1831
+	 *
1832
+	 * @access protected
1833
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1834
+	 * @return void
1835
+	 */
1836
+	protected function approve_registration($notify = false)
1837
+	{
1838
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1839
+	}
1840
+
1841
+
1842
+	/**
1843
+	 *        decline_registration
1844
+	 *
1845
+	 * @access protected
1846
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1847
+	 * @return void
1848
+	 */
1849
+	protected function decline_registration($notify = false)
1850
+	{
1851
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1852
+	}
1853
+
1854
+
1855
+	/**
1856
+	 *        cancel_registration
1857
+	 *
1858
+	 * @access protected
1859
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1860
+	 * @return void
1861
+	 */
1862
+	protected function cancel_registration($notify = false)
1863
+	{
1864
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1865
+	}
1866
+
1867
+
1868
+	/**
1869
+	 *        not_approve_registration
1870
+	 *
1871
+	 * @access protected
1872
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1873
+	 * @return void
1874
+	 */
1875
+	protected function not_approve_registration($notify = false)
1876
+	{
1877
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1878
+	}
1879
+
1880
+
1881
+	/**
1882
+	 *        decline_registration
1883
+	 *
1884
+	 * @access protected
1885
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1886
+	 * @return void
1887
+	 */
1888
+	protected function pending_registration($notify = false)
1889
+	{
1890
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1891
+	}
1892
+
1893
+
1894
+	/**
1895
+	 * waitlist_registration
1896
+	 *
1897
+	 * @access protected
1898
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1899
+	 * @return void
1900
+	 */
1901
+	protected function waitlist_registration($notify = false)
1902
+	{
1903
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1904
+	}
1905
+
1906
+
1907
+	/**
1908
+	 *        generates HTML for the Registration main meta box
1909
+	 *
1910
+	 * @access public
1911
+	 * @return void
1912
+	 * @throws DomainException
1913
+	 * @throws EE_Error
1914
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1915
+	 */
1916
+	public function _reg_details_meta_box()
1917
+	{
1918
+		EEH_Autoloader::register_line_item_display_autoloaders();
1919
+		EEH_Autoloader::register_line_item_filter_autoloaders();
1920
+		EE_Registry::instance()->load_helper('Line_Item');
1921
+		$transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1922
+			: EE_Transaction::new_instance();
1923
+		$this->_session = $transaction->session_data();
1924
+		$filters        = new EE_Line_Item_Filter_Collection();
1925
+		//$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1926
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1927
+		$line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1928
+			$transaction->total_line_item());
1929
+		$filtered_line_item_tree                 = $line_item_filter_processor->process();
1930
+		$line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1931
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1932
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
1933
+			$filtered_line_item_tree,
1934
+			array('EE_Registration' => $this->_registration)
1935
+		);
1936
+		$attendee                                = $this->_registration->attendee();
1937
+		if (EE_Registry::instance()->CAP->current_user_can(
1938
+			'ee_read_transaction',
1939
+			'espresso_transactions_view_transaction'
1940
+		)) {
1941
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
1942
+				EE_Admin_Page::add_query_args_and_nonce(
1943
+					array(
1944
+						'action' => 'view_transaction',
1945
+						'TXN_ID' => $transaction->ID(),
1946
+					),
1947
+					TXN_ADMIN_URL
1948
+				),
1949
+				esc_html__(' View Transaction', 'event_espresso'),
1950
+				'button secondary-button right',
1951
+				'dashicons dashicons-cart'
1952
+			);
1953
+		} else {
1954
+			$this->_template_args['view_transaction_button'] = '';
1955
+		}
1956
+		if ($attendee instanceof EE_Attendee
1957
+			&& EE_Registry::instance()->CAP->current_user_can(
1958
+				'ee_send_message',
1959
+				'espresso_registrations_resend_registration'
1960
+			)
1961
+		) {
1962
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
1963
+				EE_Admin_Page::add_query_args_and_nonce(
1964
+					array(
1965
+						'action'      => 'resend_registration',
1966
+						'_REG_ID'     => $this->_registration->ID(),
1967
+						'redirect_to' => 'view_registration',
1968
+					),
1969
+					REG_ADMIN_URL
1970
+				),
1971
+				esc_html__(' Resend Registration', 'event_espresso'),
1972
+				'button secondary-button right',
1973
+				'dashicons dashicons-email-alt'
1974
+			);
1975
+		} else {
1976
+			$this->_template_args['resend_registration_button'] = '';
1977
+		}
1978
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1979
+		$payment                               = $transaction->get_first_related('Payment');
1980
+		$payment                               = ! $payment instanceof EE_Payment
1981
+			? EE_Payment::new_instance()
1982
+			: $payment;
1983
+		$payment_method                        = $payment->get_first_related('Payment_Method');
1984
+		$payment_method                        = ! $payment_method instanceof EE_Payment_Method
1985
+			? EE_Payment_Method::new_instance()
1986
+			: $payment_method;
1987
+		$reg_details                           = array(
1988
+			'payment_method'       => $payment_method->name(),
1989
+			'response_msg'         => $payment->gateway_response(),
1990
+			'registration_id'      => $this->_registration->get('REG_code'),
1991
+			'registration_session' => $this->_registration->session_ID(),
1992
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1993
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1994
+		);
1995
+		if (isset($reg_details['registration_id'])) {
1996
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1997
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
1998
+				'Registration ID',
1999
+				'event_espresso'
2000
+			);
2001
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2002
+		}
2003
+		if (isset($reg_details['payment_method'])) {
2004
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2005
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2006
+				'Most Recent Payment Method',
2007
+				'event_espresso'
2008
+			);
2009
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2010
+			$this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2011
+			$this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2012
+				'Payment method response',
2013
+				'event_espresso'
2014
+			);
2015
+			$this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2016
+		}
2017
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2019
+			'Registration Session',
2020
+			'event_espresso'
2021
+		);
2022
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2023
+		$this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2024
+		$this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2025
+			'Registration placed from IP',
2026
+			'event_espresso'
2027
+		);
2028
+		$this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2029
+		$this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2030
+		$this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2031
+			'event_espresso');
2032
+		$this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2033
+		$this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2034
+			array(
2035
+				'action'   => 'default',
2036
+				'event_id' => $this->_registration->event_ID(),
2037
+			),
2038
+			REG_ADMIN_URL
2039
+		);
2040
+		$this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041
+		$this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042
+		$template_path                                                        =
2043
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2044
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045
+	}
2046
+
2047
+
2048
+	/**
2049
+	 * generates HTML for the Registration Questions meta box.
2050
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2051
+	 * otherwise uses new forms system
2052
+	 *
2053
+	 * @access public
2054
+	 * @return void
2055
+	 * @throws DomainException
2056
+	 * @throws EE_Error
2057
+	 */
2058
+	public function _reg_questions_meta_box()
2059
+	{
2060
+		//allow someone to override this method entirely
2061
+		if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2062
+			$this->_registration)) {
2063
+			$form                                              = $this->_get_reg_custom_questions_form(
2064
+				$this->_registration->ID()
2065
+			);
2066
+			$this->_template_args['att_questions']             = count($form->subforms()) > 0
2067
+				? $form->get_html_and_js()
2068
+				: '';
2069
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070
+			$this->_template_args['REG_ID']                    = $this->_registration->ID();
2071
+			$template_path                                     =
2072
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2073
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074
+		}
2075
+	}
2076
+
2077
+
2078
+	/**
2079
+	 * form_before_question_group
2080
+	 *
2081
+	 * @deprecated    as of 4.8.32.rc.000
2082
+	 * @access        public
2083
+	 * @param        string $output
2084
+	 * @return        string
2085
+	 */
2086
+	public function form_before_question_group($output)
2087
+	{
2088
+		EE_Error::doing_it_wrong(
2089
+			__CLASS__ . '::' . __FUNCTION__,
2090
+			esc_html__(
2091
+				'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.',
2092
+				'event_espresso'
2093
+			),
2094
+			'4.8.32.rc.000'
2095
+		);
2096
+		return '
2097 2097
 	<table class="form-table ee-width-100">
2098 2098
 		<tbody>
2099 2099
 			';
2100
-    }
2101
-
2102
-
2103
-    /**
2104
-     * form_after_question_group
2105
-     *
2106
-     * @deprecated    as of 4.8.32.rc.000
2107
-     * @access        public
2108
-     * @param        string $output
2109
-     * @return        string
2110
-     */
2111
-    public function form_after_question_group($output)
2112
-    {
2113
-        EE_Error::doing_it_wrong(
2114
-            __CLASS__ . '::' . __FUNCTION__,
2115
-            esc_html__(
2116
-                '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.',
2117
-                'event_espresso'
2118
-            ),
2119
-            '4.8.32.rc.000'
2120
-        );
2121
-        return '
2100
+	}
2101
+
2102
+
2103
+	/**
2104
+	 * form_after_question_group
2105
+	 *
2106
+	 * @deprecated    as of 4.8.32.rc.000
2107
+	 * @access        public
2108
+	 * @param        string $output
2109
+	 * @return        string
2110
+	 */
2111
+	public function form_after_question_group($output)
2112
+	{
2113
+		EE_Error::doing_it_wrong(
2114
+			__CLASS__ . '::' . __FUNCTION__,
2115
+			esc_html__(
2116
+				'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.',
2117
+				'event_espresso'
2118
+			),
2119
+			'4.8.32.rc.000'
2120
+		);
2121
+		return '
2122 2122
 			<tr class="hide-if-no-js">
2123 2123
 				<th> </th>
2124 2124
 				<td class="reg-admin-edit-attendee-question-td">
2125 2125
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2126
-               . esc_attr__('click to edit question', 'event_espresso')
2127
-               . '">
2126
+			   . esc_attr__('click to edit question', 'event_espresso')
2127
+			   . '">
2128 2128
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2129
-               . esc_html__('edit the above question group', 'event_espresso')
2130
-               . '</span>
2129
+			   . esc_html__('edit the above question group', 'event_espresso')
2130
+			   . '</span>
2131 2131
 						<div class="dashicons dashicons-edit"></div>
2132 2132
 					</a>
2133 2133
 				</td>
@@ -2135,558 +2135,558 @@  discard block
 block discarded – undo
2135 2135
 		</tbody>
2136 2136
 	</table>
2137 2137
 ';
2138
-    }
2139
-
2140
-
2141
-    /**
2142
-     * form_form_field_label_wrap
2143
-     *
2144
-     * @deprecated    as of 4.8.32.rc.000
2145
-     * @access        public
2146
-     * @param        string $label
2147
-     * @return        string
2148
-     */
2149
-    public function form_form_field_label_wrap($label)
2150
-    {
2151
-        EE_Error::doing_it_wrong(
2152
-            __CLASS__ . '::' . __FUNCTION__,
2153
-            esc_html__(
2154
-                '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.',
2155
-                'event_espresso'
2156
-            ),
2157
-            '4.8.32.rc.000'
2158
-        );
2159
-        return '
2138
+	}
2139
+
2140
+
2141
+	/**
2142
+	 * form_form_field_label_wrap
2143
+	 *
2144
+	 * @deprecated    as of 4.8.32.rc.000
2145
+	 * @access        public
2146
+	 * @param        string $label
2147
+	 * @return        string
2148
+	 */
2149
+	public function form_form_field_label_wrap($label)
2150
+	{
2151
+		EE_Error::doing_it_wrong(
2152
+			__CLASS__ . '::' . __FUNCTION__,
2153
+			esc_html__(
2154
+				'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.',
2155
+				'event_espresso'
2156
+			),
2157
+			'4.8.32.rc.000'
2158
+		);
2159
+		return '
2160 2160
 			<tr>
2161 2161
 				<th>
2162 2162
 					' . $label . '
2163 2163
 				</th>';
2164
-    }
2165
-
2166
-
2167
-    /**
2168
-     * form_form_field_input__wrap
2169
-     *
2170
-     * @deprecated    as of 4.8.32.rc.000
2171
-     * @access        public
2172
-     * @param        string $input
2173
-     * @return        string
2174
-     */
2175
-    public function form_form_field_input__wrap($input)
2176
-    {
2177
-        EE_Error::doing_it_wrong(
2178
-            __CLASS__ . '::' . __FUNCTION__,
2179
-            esc_html__(
2180
-                '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.',
2181
-                'event_espresso'
2182
-            ),
2183
-            '4.8.32.rc.000'
2184
-        );
2185
-        return '
2164
+	}
2165
+
2166
+
2167
+	/**
2168
+	 * form_form_field_input__wrap
2169
+	 *
2170
+	 * @deprecated    as of 4.8.32.rc.000
2171
+	 * @access        public
2172
+	 * @param        string $input
2173
+	 * @return        string
2174
+	 */
2175
+	public function form_form_field_input__wrap($input)
2176
+	{
2177
+		EE_Error::doing_it_wrong(
2178
+			__CLASS__ . '::' . __FUNCTION__,
2179
+			esc_html__(
2180
+				'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.',
2181
+				'event_espresso'
2182
+			),
2183
+			'4.8.32.rc.000'
2184
+		);
2185
+		return '
2186 2186
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2187 2187
 					' . $input . '
2188 2188
 				</td>
2189 2189
 			</tr>';
2190
-    }
2191
-
2192
-
2193
-    /**
2194
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2195
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2196
-     * to display the page
2197
-     *
2198
-     * @access protected
2199
-     * @return void
2200
-     * @throws EE_Error
2201
-     */
2202
-    protected function _update_attendee_registration_form()
2203
-    {
2204
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2205
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2206
-            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2207
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2208
-            if ($success) {
2209
-                $what  = esc_html__('Registration Form', 'event_espresso');
2210
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2211
-                    : array('action' => 'default');
2212
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2213
-            }
2214
-        }
2215
-    }
2216
-
2217
-
2218
-    /**
2219
-     * Gets the form for saving registrations custom questions (if done
2220
-     * previously retrieves the cached form object, which may have validation errors in it)
2221
-     *
2222
-     * @param int $REG_ID
2223
-     * @return EE_Registration_Custom_Questions_Form
2224
-     * @throws EE_Error
2225
-     */
2226
-    protected function _get_reg_custom_questions_form($REG_ID)
2227
-    {
2228
-        if ( ! $this->_reg_custom_questions_form) {
2229
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2230
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231
-                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232
-            );
2233
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2234
-        }
2235
-        return $this->_reg_custom_questions_form;
2236
-    }
2237
-
2238
-
2239
-    /**
2240
-     * Saves
2241
-     *
2242
-     * @access private
2243
-     * @param bool $REG_ID
2244
-     * @return bool
2245
-     * @throws EE_Error
2246
-     */
2247
-    private function _save_reg_custom_questions_form($REG_ID = false)
2248
-    {
2249
-        if ( ! $REG_ID) {
2250
-            EE_Error::add_error(
2251
-                esc_html__(
2252
-                    'An error occurred. No registration ID was received.', 'event_espresso'),
2253
-                __FILE__, __FUNCTION__, __LINE__
2254
-            );
2255
-        }
2256
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2257
-        $form->receive_form_submission($this->_req_data);
2258
-        $success = false;
2259
-        if ($form->is_valid()) {
2260
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2262
-                    $where_conditions    = array(
2263
-                        'QST_ID' => $question_id,
2264
-                        'REG_ID' => $REG_ID,
2265
-                    );
2266
-                    $possibly_new_values = array(
2267
-                        'ANS_value' => $input->normalized_value(),
2268
-                    );
2269
-                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2270
-                    if ($answer instanceof EE_Answer) {
2271
-                        $success = $answer->save($possibly_new_values);
2272
-                    } else {
2273
-                        //insert it then
2274
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2275
-                        $answer      = EE_Answer::new_instance($cols_n_vals);
2276
-                        $success     = $answer->save();
2277
-                    }
2278
-                }
2279
-            }
2280
-        } else {
2281
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2282
-        }
2283
-        return $success;
2284
-    }
2285
-
2286
-
2287
-    /**
2288
-     *        generates HTML for the Registration main meta box
2289
-     *
2290
-     * @access public
2291
-     * @return void
2292
-     * @throws DomainException
2293
-     * @throws EE_Error
2294
-     */
2295
-    public function _reg_attendees_meta_box()
2296
-    {
2297
-        $REG = EEM_Registration::instance();
2298
-        //get all other registrations on this transaction, and cache
2299
-        //the attendees for them so we don't have to run another query using force_join
2300
-        $registrations                           = $REG->get_all(array(
2301
-            array(
2302
-                'TXN_ID' => $this->_registration->transaction_ID(),
2303
-                'REG_ID' => array('!=', $this->_registration->ID()),
2304
-            ),
2305
-            'force_join' => array('Attendee'),
2306
-        ));
2307
-        $this->_template_args['attendees']       = array();
2308
-        $this->_template_args['attendee_notice'] = '';
2309
-        if (empty($registrations)
2310
-            || (is_array($registrations)
2311
-                && ! EEH_Array::get_one_item_from_array($registrations))
2312
-        ) {
2313
-            EE_Error::add_error(
2314
-                esc_html__(
2315
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2316
-                    'event_espresso'
2317
-                ), __FILE__, __FUNCTION__, __LINE__
2318
-            );
2319
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2320
-        } else {
2321
-            $att_nmbr = 1;
2322
-            foreach ($registrations as $registration) {
2323
-                /* @var $registration EE_Registration */
2324
-                $attendee                                                    = $registration->attendee()
2325
-                    ? $registration->attendee()
2326
-                    : EEM_Attendee::instance()
2327
-                                  ->create_default_object();
2328
-                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2329
-                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2330
-                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2331
-                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2332
-                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2333
-                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2334
-                    ', ',
2335
-                    $attendee->full_address_as_array()
2336
-                );
2337
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2338
-                    array(
2339
-                        'action' => 'edit_attendee',
2340
-                        'post'   => $attendee->ID(),
2341
-                    ),
2342
-                    REG_ADMIN_URL
2343
-                );
2344
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2345
-                $att_nmbr++;
2346
-            }
2347
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348
-        }
2349
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2350
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351
-    }
2352
-
2353
-
2354
-    /**
2355
-     *        generates HTML for the Edit Registration side meta box
2356
-     *
2357
-     * @access public
2358
-     * @return void
2359
-     * @throws DomainException
2360
-     * @throws EE_Error
2361
-     */
2362
-    public function _reg_registrant_side_meta_box()
2363
-    {
2364
-        /*@var $attendee EE_Attendee */
2365
-        $att_check = $this->_registration->attendee();
2366
-        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2367
-        //now let's determine if this is not the primary registration.  If it isn't then we set the
2368
-        //primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2369
-        //primary registration object (that way we know if we need to show create button or not)
2370
-        if ( ! $this->_registration->is_primary_registrant()) {
2371
-            $primary_registration = $this->_registration->get_primary_registration();
2372
-            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2373
-                : null;
2374
-            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2375
-                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2376
-                //custom attendee object so let's not worry about the primary reg.
2377
-                $primary_registration = null;
2378
-            }
2379
-        } else {
2380
-            $primary_registration = null;
2381
-        }
2382
-        $this->_template_args['ATT_ID']            = $attendee->ID();
2383
-        $this->_template_args['fname']             = $attendee->fname();
2384
-        $this->_template_args['lname']             = $attendee->lname();
2385
-        $this->_template_args['email']             = $attendee->email();
2386
-        $this->_template_args['phone']             = $attendee->phone();
2387
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388
-        //edit link
2389
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2390
-            'action' => 'edit_attendee',
2391
-            'post'   => $attendee->ID(),
2392
-        ), REG_ADMIN_URL);
2393
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394
-        //create link
2395
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2396
-            ? EE_Admin_Page::add_query_args_and_nonce(array(
2397
-                'action'  => 'duplicate_attendee',
2398
-                '_REG_ID' => $this->_registration->ID(),
2399
-            ), REG_ADMIN_URL) : '';
2400
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401
-        $this->_template_args['att_check']    = $att_check;
2402
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2403
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404
-    }
2405
-
2406
-
2407
-    /**
2408
-     * trash or restore registrations
2409
-     *
2410
-     * @param  boolean $trash whether to archive or restore
2411
-     * @return void
2412
-     * @throws EE_Error
2413
-     * @throws RuntimeException
2414
-     * @access protected
2415
-     */
2416
-    protected function _trash_or_restore_registrations($trash = true)
2417
-    {
2418
-        //if empty _REG_ID then get out because there's nothing to do
2419
-        if (empty($this->_req_data['_REG_ID'])) {
2420
-            EE_Error::add_error(
2421
-                sprintf(
2422
-                    esc_html__(
2423
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2424
-                        'event_espresso'
2425
-                    ),
2426
-                    $trash ? 'trash' : 'restore'
2427
-                ),
2428
-                __FILE__, __LINE__, __FUNCTION__
2429
-            );
2430
-            $this->_redirect_after_action(false, '', '', array(), true);
2431
-        }
2432
-        $success = 0;
2433
-        $overwrite_msgs = false;
2434
-        //Checkboxes
2435
-        if ( ! is_array($this->_req_data['_REG_ID'])) {
2436
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2437
-        }
2438
-        $reg_count = count($this->_req_data['_REG_ID']);
2439
-        // cycle thru checkboxes
2440
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2441
-            /** @var EE_Registration $REG */
2442
-            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443
-            $payments = $REG->registration_payments();
2444
-            if (! empty($payments)) {
2445
-                $name = $REG->attendee() instanceof EE_Attendee
2446
-                    ? $REG->attendee()->full_name()
2447
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2448
-                $overwrite_msgs = true;
2449
-                EE_Error::add_error(
2450
-                    sprintf(
2451
-                        esc_html__(
2452
-                            '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.',
2453
-                            'event_espresso'
2454
-                        ),
2455
-                        $name
2456
-                    ),
2457
-                    __FILE__, __FUNCTION__, __LINE__
2458
-                );
2459
-                //can't trash this registration because it has payments.
2460
-                continue;
2461
-            }
2462
-            $updated = $trash ? $REG->delete() : $REG->restore();
2463
-            if ($updated) {
2464
-                $success++;
2465
-            }
2466
-        }
2467
-        $this->_redirect_after_action(
2468
-            $success === $reg_count, // were ALL registrations affected?
2469
-            $success > 1
2470
-                ? esc_html__('Registrations', 'event_espresso')
2471
-                : esc_html__('Registration', 'event_espresso'),
2472
-            $trash
2473
-                ? esc_html__('moved to the trash', 'event_espresso')
2474
-                : esc_html__('restored', 'event_espresso'),
2475
-            array('action' => 'default'),
2476
-            $overwrite_msgs
2477
-        );
2478
-    }
2479
-
2480
-
2481
-    /**
2482
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2483
-     * registration but also.
2484
-     * 1. Removing relations to EE_Attendee
2485
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2486
-     * ALSO trashed.
2487
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2488
-     * 4. Removing relationships between all tickets and the related registrations
2489
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2490
-     * 6. Deleting permanently any related Checkins.
2491
-     *
2492
-     * @return void
2493
-     * @throws EE_Error
2494
-     */
2495
-    protected function _delete_registrations()
2496
-    {
2497
-        $REG_MDL = EEM_Registration::instance();
2498
-        $success = 1;
2499
-        //Checkboxes
2500
-        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2501
-            // if array has more than one element than success message should be plural
2502
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2503
-            // cycle thru checkboxes
2504
-            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2505
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2506
-                if ( ! $REG instanceof EE_Registration) {
2507
-                    continue;
2508
-                }
2509
-                $deleted = $this->_delete_registration($REG);
2510
-                if ( ! $deleted) {
2511
-                    $success = 0;
2512
-                }
2513
-            }
2514
-        } else {
2515
-            // grab single id and delete
2516
-            $REG_ID  = $this->_req_data['_REG_ID'];
2517
-            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2518
-            $deleted = $this->_delete_registration($REG);
2519
-            if ( ! $deleted) {
2520
-                $success = 0;
2521
-            }
2522
-        }
2523
-        $what        = $success > 1
2524
-            ? esc_html__('Registrations', 'event_espresso')
2525
-            : esc_html__('Registration', 'event_espresso');
2526
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2527
-        $this->_redirect_after_action(
2528
-            $success,
2529
-            $what,
2530
-            $action_desc,
2531
-            array('action' => 'default'),
2532
-            true
2533
-        );
2534
-    }
2535
-
2536
-
2537
-    /**
2538
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2539
-     * models get affected.
2540
-     *
2541
-     * @param  EE_Registration $REG registration to be deleted permenantly
2542
-     * @return bool true = successful deletion, false = fail.
2543
-     * @throws EE_Error
2544
-     */
2545
-    protected function _delete_registration(EE_Registration $REG)
2546
-    {
2547
-        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2548
-        //registrations on the transaction that are NOT trashed.
2549
-        $TXN         = $REG->get_first_related('Transaction');
2550
-        $REGS        = $TXN->get_many_related('Registration');
2551
-        $all_trashed = true;
2552
-        foreach ($REGS as $registration) {
2553
-            if ( ! $registration->get('REG_deleted')) {
2554
-                $all_trashed = false;
2555
-            }
2556
-        }
2557
-        if ( ! $all_trashed) {
2558
-            EE_Error::add_error(
2559
-                esc_html__(
2560
-                    '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.',
2561
-                    'event_espresso'
2562
-                ),
2563
-                __FILE__, __FUNCTION__, __LINE__
2564
-            );
2565
-            return false;
2566
-        }
2567
-        //k made it here so that means we can delete all the related transactions and their answers (but let's do them
2568
-        //separately from THIS one).
2569
-        foreach ($REGS as $registration) {
2570
-            //delete related answers
2571
-            $registration->delete_related_permanently('Answer');
2572
-            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2573
-            $attendee = $registration->get_first_related('Attendee');
2574
-            if ($attendee instanceof EE_Attendee) {
2575
-                $registration->_remove_relation_to($attendee, 'Attendee');
2576
-            }
2577
-            //now remove relationships to tickets on this registration.
2578
-            $registration->_remove_relations('Ticket');
2579
-            //now delete permanently the checkins related to this registration.
2580
-            $registration->delete_related_permanently('Checkin');
2581
-            if ($registration->ID() === $REG->ID()) {
2582
-                continue;
2583
-            } //we don't want to delete permanently the existing registration just yet.
2584
-            //remove relation to transaction for these registrations if NOT the existing registrations
2585
-            $registration->_remove_relations('Transaction');
2586
-            //delete permanently any related messages.
2587
-            $registration->delete_related_permanently('Message');
2588
-            //now delete this registration permanently
2589
-            $registration->delete_permanently();
2590
-        }
2591
-        //now all related registrations on the transaction are handled.  So let's just handle this registration itself
2592
-        // (the transaction and line items should be all that's left).
2593
-        // delete the line items related to the transaction for this registration.
2594
-        $TXN->delete_related_permanently('Line_Item');
2595
-        //we need to remove all the relationships on the transaction
2596
-        $TXN->delete_related_permanently('Payment');
2597
-        $TXN->delete_related_permanently('Extra_Meta');
2598
-        $TXN->delete_related_permanently('Message');
2599
-        //now we can delete this REG permanently (and the transaction of course)
2600
-        $REG->delete_related_permanently('Transaction');
2601
-        return $REG->delete_permanently();
2602
-    }
2603
-
2604
-
2605
-    /**
2606
-     *    generates HTML for the Register New Attendee Admin page
2607
-     *
2608
-     * @access private
2609
-     * @throws DomainException
2610
-     * @throws EE_Error
2611
-     */
2612
-    public function new_registration()
2613
-    {
2614
-        if ( ! $this->_set_reg_event()) {
2615
-            throw new EE_Error(
2616
-                esc_html__(
2617
-                    'Unable to continue with registering because there is no Event ID in the request',
2618
-                    'event_espresso'
2619
-                )
2620
-            );
2621
-        }
2622
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2623
-        // gotta start with a clean slate if we're not coming here via ajax
2624
-        if ( ! defined('DOING_AJAX')
2625
-             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2626
-        ) {
2627
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2628
-        }
2629
-        $this->_template_args['event_name'] = '';
2630
-        // event name
2631
-        if ($this->_reg_event) {
2632
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2633
-            $edit_event_url                     = self::add_query_args_and_nonce(array(
2634
-                'action' => 'edit',
2635
-                'post'   => $this->_reg_event->ID(),
2636
-            ), EVENTS_ADMIN_URL);
2637
-            $edit_event_lnk                     = '<a href="'
2638
-                                                  . $edit_event_url
2639
-                                                  . '" title="'
2640
-                                                  . esc_attr__('Edit ', 'event_espresso')
2641
-                                                  . $this->_reg_event->name()
2642
-                                                  . '">'
2643
-                                                  . esc_html__('Edit Event', 'event_espresso')
2644
-                                                  . '</a>';
2645
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2646
-                                                   . $edit_event_lnk
2647
-                                                   . '</span>';
2648
-        }
2649
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2650
-        if (defined('DOING_AJAX')) {
2651
-            $this->_return_json();
2652
-        }
2653
-        // grab header
2654
-        $template_path                              =
2655
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2656
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657
-            $this->_template_args, true);
2658
-        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2659
-        // the details template wrapper
2660
-        $this->display_admin_page_with_sidebar();
2661
-    }
2662
-
2663
-
2664
-    /**
2665
-     * This returns the content for a registration step
2666
-     *
2667
-     * @access protected
2668
-     * @return string html
2669
-     * @throws DomainException
2670
-     * @throws EE_Error
2671
-     */
2672
-    protected function _get_registration_step_content()
2673
-    {
2674
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2675
-            $warning_msg = sprintf(
2676
-                esc_html__(
2677
-                    '%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',
2678
-                    'event_espresso'
2679
-                ),
2680
-                '<br />',
2681
-                '<h3 class="important-notice">',
2682
-                '</h3>',
2683
-                '<div class="float-right">',
2684
-                '<span id="redirect_timer" class="important-notice">30</span>',
2685
-                '</div>',
2686
-                '<b>',
2687
-                '</b>'
2688
-            );
2689
-            return '
2190
+	}
2191
+
2192
+
2193
+	/**
2194
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2195
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2196
+	 * to display the page
2197
+	 *
2198
+	 * @access protected
2199
+	 * @return void
2200
+	 * @throws EE_Error
2201
+	 */
2202
+	protected function _update_attendee_registration_form()
2203
+	{
2204
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2205
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2206
+			$REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2207
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2208
+			if ($success) {
2209
+				$what  = esc_html__('Registration Form', 'event_espresso');
2210
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2211
+					: array('action' => 'default');
2212
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2213
+			}
2214
+		}
2215
+	}
2216
+
2217
+
2218
+	/**
2219
+	 * Gets the form for saving registrations custom questions (if done
2220
+	 * previously retrieves the cached form object, which may have validation errors in it)
2221
+	 *
2222
+	 * @param int $REG_ID
2223
+	 * @return EE_Registration_Custom_Questions_Form
2224
+	 * @throws EE_Error
2225
+	 */
2226
+	protected function _get_reg_custom_questions_form($REG_ID)
2227
+	{
2228
+		if ( ! $this->_reg_custom_questions_form) {
2229
+			require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2230
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231
+				EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232
+			);
2233
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2234
+		}
2235
+		return $this->_reg_custom_questions_form;
2236
+	}
2237
+
2238
+
2239
+	/**
2240
+	 * Saves
2241
+	 *
2242
+	 * @access private
2243
+	 * @param bool $REG_ID
2244
+	 * @return bool
2245
+	 * @throws EE_Error
2246
+	 */
2247
+	private function _save_reg_custom_questions_form($REG_ID = false)
2248
+	{
2249
+		if ( ! $REG_ID) {
2250
+			EE_Error::add_error(
2251
+				esc_html__(
2252
+					'An error occurred. No registration ID was received.', 'event_espresso'),
2253
+				__FILE__, __FUNCTION__, __LINE__
2254
+			);
2255
+		}
2256
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2257
+		$form->receive_form_submission($this->_req_data);
2258
+		$success = false;
2259
+		if ($form->is_valid()) {
2260
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2262
+					$where_conditions    = array(
2263
+						'QST_ID' => $question_id,
2264
+						'REG_ID' => $REG_ID,
2265
+					);
2266
+					$possibly_new_values = array(
2267
+						'ANS_value' => $input->normalized_value(),
2268
+					);
2269
+					$answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2270
+					if ($answer instanceof EE_Answer) {
2271
+						$success = $answer->save($possibly_new_values);
2272
+					} else {
2273
+						//insert it then
2274
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2275
+						$answer      = EE_Answer::new_instance($cols_n_vals);
2276
+						$success     = $answer->save();
2277
+					}
2278
+				}
2279
+			}
2280
+		} else {
2281
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2282
+		}
2283
+		return $success;
2284
+	}
2285
+
2286
+
2287
+	/**
2288
+	 *        generates HTML for the Registration main meta box
2289
+	 *
2290
+	 * @access public
2291
+	 * @return void
2292
+	 * @throws DomainException
2293
+	 * @throws EE_Error
2294
+	 */
2295
+	public function _reg_attendees_meta_box()
2296
+	{
2297
+		$REG = EEM_Registration::instance();
2298
+		//get all other registrations on this transaction, and cache
2299
+		//the attendees for them so we don't have to run another query using force_join
2300
+		$registrations                           = $REG->get_all(array(
2301
+			array(
2302
+				'TXN_ID' => $this->_registration->transaction_ID(),
2303
+				'REG_ID' => array('!=', $this->_registration->ID()),
2304
+			),
2305
+			'force_join' => array('Attendee'),
2306
+		));
2307
+		$this->_template_args['attendees']       = array();
2308
+		$this->_template_args['attendee_notice'] = '';
2309
+		if (empty($registrations)
2310
+			|| (is_array($registrations)
2311
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2312
+		) {
2313
+			EE_Error::add_error(
2314
+				esc_html__(
2315
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2316
+					'event_espresso'
2317
+				), __FILE__, __FUNCTION__, __LINE__
2318
+			);
2319
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2320
+		} else {
2321
+			$att_nmbr = 1;
2322
+			foreach ($registrations as $registration) {
2323
+				/* @var $registration EE_Registration */
2324
+				$attendee                                                    = $registration->attendee()
2325
+					? $registration->attendee()
2326
+					: EEM_Attendee::instance()
2327
+								  ->create_default_object();
2328
+				$this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2329
+				$this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2330
+				$this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2331
+				$this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2332
+				$this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2333
+				$this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2334
+					', ',
2335
+					$attendee->full_address_as_array()
2336
+				);
2337
+				$this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2338
+					array(
2339
+						'action' => 'edit_attendee',
2340
+						'post'   => $attendee->ID(),
2341
+					),
2342
+					REG_ADMIN_URL
2343
+				);
2344
+				$this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2345
+				$att_nmbr++;
2346
+			}
2347
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348
+		}
2349
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2350
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351
+	}
2352
+
2353
+
2354
+	/**
2355
+	 *        generates HTML for the Edit Registration side meta box
2356
+	 *
2357
+	 * @access public
2358
+	 * @return void
2359
+	 * @throws DomainException
2360
+	 * @throws EE_Error
2361
+	 */
2362
+	public function _reg_registrant_side_meta_box()
2363
+	{
2364
+		/*@var $attendee EE_Attendee */
2365
+		$att_check = $this->_registration->attendee();
2366
+		$attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2367
+		//now let's determine if this is not the primary registration.  If it isn't then we set the
2368
+		//primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2369
+		//primary registration object (that way we know if we need to show create button or not)
2370
+		if ( ! $this->_registration->is_primary_registrant()) {
2371
+			$primary_registration = $this->_registration->get_primary_registration();
2372
+			$primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2373
+				: null;
2374
+			if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2375
+				//in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2376
+				//custom attendee object so let's not worry about the primary reg.
2377
+				$primary_registration = null;
2378
+			}
2379
+		} else {
2380
+			$primary_registration = null;
2381
+		}
2382
+		$this->_template_args['ATT_ID']            = $attendee->ID();
2383
+		$this->_template_args['fname']             = $attendee->fname();
2384
+		$this->_template_args['lname']             = $attendee->lname();
2385
+		$this->_template_args['email']             = $attendee->email();
2386
+		$this->_template_args['phone']             = $attendee->phone();
2387
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388
+		//edit link
2389
+		$this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2390
+			'action' => 'edit_attendee',
2391
+			'post'   => $attendee->ID(),
2392
+		), REG_ADMIN_URL);
2393
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394
+		//create link
2395
+		$this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2396
+			? EE_Admin_Page::add_query_args_and_nonce(array(
2397
+				'action'  => 'duplicate_attendee',
2398
+				'_REG_ID' => $this->_registration->ID(),
2399
+			), REG_ADMIN_URL) : '';
2400
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401
+		$this->_template_args['att_check']    = $att_check;
2402
+		$template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2403
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404
+	}
2405
+
2406
+
2407
+	/**
2408
+	 * trash or restore registrations
2409
+	 *
2410
+	 * @param  boolean $trash whether to archive or restore
2411
+	 * @return void
2412
+	 * @throws EE_Error
2413
+	 * @throws RuntimeException
2414
+	 * @access protected
2415
+	 */
2416
+	protected function _trash_or_restore_registrations($trash = true)
2417
+	{
2418
+		//if empty _REG_ID then get out because there's nothing to do
2419
+		if (empty($this->_req_data['_REG_ID'])) {
2420
+			EE_Error::add_error(
2421
+				sprintf(
2422
+					esc_html__(
2423
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2424
+						'event_espresso'
2425
+					),
2426
+					$trash ? 'trash' : 'restore'
2427
+				),
2428
+				__FILE__, __LINE__, __FUNCTION__
2429
+			);
2430
+			$this->_redirect_after_action(false, '', '', array(), true);
2431
+		}
2432
+		$success = 0;
2433
+		$overwrite_msgs = false;
2434
+		//Checkboxes
2435
+		if ( ! is_array($this->_req_data['_REG_ID'])) {
2436
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2437
+		}
2438
+		$reg_count = count($this->_req_data['_REG_ID']);
2439
+		// cycle thru checkboxes
2440
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2441
+			/** @var EE_Registration $REG */
2442
+			$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443
+			$payments = $REG->registration_payments();
2444
+			if (! empty($payments)) {
2445
+				$name = $REG->attendee() instanceof EE_Attendee
2446
+					? $REG->attendee()->full_name()
2447
+					: esc_html__('Unknown Attendee', 'event_espresso');
2448
+				$overwrite_msgs = true;
2449
+				EE_Error::add_error(
2450
+					sprintf(
2451
+						esc_html__(
2452
+							'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.',
2453
+							'event_espresso'
2454
+						),
2455
+						$name
2456
+					),
2457
+					__FILE__, __FUNCTION__, __LINE__
2458
+				);
2459
+				//can't trash this registration because it has payments.
2460
+				continue;
2461
+			}
2462
+			$updated = $trash ? $REG->delete() : $REG->restore();
2463
+			if ($updated) {
2464
+				$success++;
2465
+			}
2466
+		}
2467
+		$this->_redirect_after_action(
2468
+			$success === $reg_count, // were ALL registrations affected?
2469
+			$success > 1
2470
+				? esc_html__('Registrations', 'event_espresso')
2471
+				: esc_html__('Registration', 'event_espresso'),
2472
+			$trash
2473
+				? esc_html__('moved to the trash', 'event_espresso')
2474
+				: esc_html__('restored', 'event_espresso'),
2475
+			array('action' => 'default'),
2476
+			$overwrite_msgs
2477
+		);
2478
+	}
2479
+
2480
+
2481
+	/**
2482
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2483
+	 * registration but also.
2484
+	 * 1. Removing relations to EE_Attendee
2485
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2486
+	 * ALSO trashed.
2487
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2488
+	 * 4. Removing relationships between all tickets and the related registrations
2489
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2490
+	 * 6. Deleting permanently any related Checkins.
2491
+	 *
2492
+	 * @return void
2493
+	 * @throws EE_Error
2494
+	 */
2495
+	protected function _delete_registrations()
2496
+	{
2497
+		$REG_MDL = EEM_Registration::instance();
2498
+		$success = 1;
2499
+		//Checkboxes
2500
+		if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2501
+			// if array has more than one element than success message should be plural
2502
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2503
+			// cycle thru checkboxes
2504
+			while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2505
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2506
+				if ( ! $REG instanceof EE_Registration) {
2507
+					continue;
2508
+				}
2509
+				$deleted = $this->_delete_registration($REG);
2510
+				if ( ! $deleted) {
2511
+					$success = 0;
2512
+				}
2513
+			}
2514
+		} else {
2515
+			// grab single id and delete
2516
+			$REG_ID  = $this->_req_data['_REG_ID'];
2517
+			$REG     = $REG_MDL->get_one_by_ID($REG_ID);
2518
+			$deleted = $this->_delete_registration($REG);
2519
+			if ( ! $deleted) {
2520
+				$success = 0;
2521
+			}
2522
+		}
2523
+		$what        = $success > 1
2524
+			? esc_html__('Registrations', 'event_espresso')
2525
+			: esc_html__('Registration', 'event_espresso');
2526
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2527
+		$this->_redirect_after_action(
2528
+			$success,
2529
+			$what,
2530
+			$action_desc,
2531
+			array('action' => 'default'),
2532
+			true
2533
+		);
2534
+	}
2535
+
2536
+
2537
+	/**
2538
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2539
+	 * models get affected.
2540
+	 *
2541
+	 * @param  EE_Registration $REG registration to be deleted permenantly
2542
+	 * @return bool true = successful deletion, false = fail.
2543
+	 * @throws EE_Error
2544
+	 */
2545
+	protected function _delete_registration(EE_Registration $REG)
2546
+	{
2547
+		//first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2548
+		//registrations on the transaction that are NOT trashed.
2549
+		$TXN         = $REG->get_first_related('Transaction');
2550
+		$REGS        = $TXN->get_many_related('Registration');
2551
+		$all_trashed = true;
2552
+		foreach ($REGS as $registration) {
2553
+			if ( ! $registration->get('REG_deleted')) {
2554
+				$all_trashed = false;
2555
+			}
2556
+		}
2557
+		if ( ! $all_trashed) {
2558
+			EE_Error::add_error(
2559
+				esc_html__(
2560
+					'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.',
2561
+					'event_espresso'
2562
+				),
2563
+				__FILE__, __FUNCTION__, __LINE__
2564
+			);
2565
+			return false;
2566
+		}
2567
+		//k made it here so that means we can delete all the related transactions and their answers (but let's do them
2568
+		//separately from THIS one).
2569
+		foreach ($REGS as $registration) {
2570
+			//delete related answers
2571
+			$registration->delete_related_permanently('Answer');
2572
+			//remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2573
+			$attendee = $registration->get_first_related('Attendee');
2574
+			if ($attendee instanceof EE_Attendee) {
2575
+				$registration->_remove_relation_to($attendee, 'Attendee');
2576
+			}
2577
+			//now remove relationships to tickets on this registration.
2578
+			$registration->_remove_relations('Ticket');
2579
+			//now delete permanently the checkins related to this registration.
2580
+			$registration->delete_related_permanently('Checkin');
2581
+			if ($registration->ID() === $REG->ID()) {
2582
+				continue;
2583
+			} //we don't want to delete permanently the existing registration just yet.
2584
+			//remove relation to transaction for these registrations if NOT the existing registrations
2585
+			$registration->_remove_relations('Transaction');
2586
+			//delete permanently any related messages.
2587
+			$registration->delete_related_permanently('Message');
2588
+			//now delete this registration permanently
2589
+			$registration->delete_permanently();
2590
+		}
2591
+		//now all related registrations on the transaction are handled.  So let's just handle this registration itself
2592
+		// (the transaction and line items should be all that's left).
2593
+		// delete the line items related to the transaction for this registration.
2594
+		$TXN->delete_related_permanently('Line_Item');
2595
+		//we need to remove all the relationships on the transaction
2596
+		$TXN->delete_related_permanently('Payment');
2597
+		$TXN->delete_related_permanently('Extra_Meta');
2598
+		$TXN->delete_related_permanently('Message');
2599
+		//now we can delete this REG permanently (and the transaction of course)
2600
+		$REG->delete_related_permanently('Transaction');
2601
+		return $REG->delete_permanently();
2602
+	}
2603
+
2604
+
2605
+	/**
2606
+	 *    generates HTML for the Register New Attendee Admin page
2607
+	 *
2608
+	 * @access private
2609
+	 * @throws DomainException
2610
+	 * @throws EE_Error
2611
+	 */
2612
+	public function new_registration()
2613
+	{
2614
+		if ( ! $this->_set_reg_event()) {
2615
+			throw new EE_Error(
2616
+				esc_html__(
2617
+					'Unable to continue with registering because there is no Event ID in the request',
2618
+					'event_espresso'
2619
+				)
2620
+			);
2621
+		}
2622
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2623
+		// gotta start with a clean slate if we're not coming here via ajax
2624
+		if ( ! defined('DOING_AJAX')
2625
+			 && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2626
+		) {
2627
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2628
+		}
2629
+		$this->_template_args['event_name'] = '';
2630
+		// event name
2631
+		if ($this->_reg_event) {
2632
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2633
+			$edit_event_url                     = self::add_query_args_and_nonce(array(
2634
+				'action' => 'edit',
2635
+				'post'   => $this->_reg_event->ID(),
2636
+			), EVENTS_ADMIN_URL);
2637
+			$edit_event_lnk                     = '<a href="'
2638
+												  . $edit_event_url
2639
+												  . '" title="'
2640
+												  . esc_attr__('Edit ', 'event_espresso')
2641
+												  . $this->_reg_event->name()
2642
+												  . '">'
2643
+												  . esc_html__('Edit Event', 'event_espresso')
2644
+												  . '</a>';
2645
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2646
+												   . $edit_event_lnk
2647
+												   . '</span>';
2648
+		}
2649
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2650
+		if (defined('DOING_AJAX')) {
2651
+			$this->_return_json();
2652
+		}
2653
+		// grab header
2654
+		$template_path                              =
2655
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2656
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657
+			$this->_template_args, true);
2658
+		//$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2659
+		// the details template wrapper
2660
+		$this->display_admin_page_with_sidebar();
2661
+	}
2662
+
2663
+
2664
+	/**
2665
+	 * This returns the content for a registration step
2666
+	 *
2667
+	 * @access protected
2668
+	 * @return string html
2669
+	 * @throws DomainException
2670
+	 * @throws EE_Error
2671
+	 */
2672
+	protected function _get_registration_step_content()
2673
+	{
2674
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2675
+			$warning_msg = sprintf(
2676
+				esc_html__(
2677
+					'%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',
2678
+					'event_espresso'
2679
+				),
2680
+				'<br />',
2681
+				'<h3 class="important-notice">',
2682
+				'</h3>',
2683
+				'<div class="float-right">',
2684
+				'<span id="redirect_timer" class="important-notice">30</span>',
2685
+				'</div>',
2686
+				'<b>',
2687
+				'</b>'
2688
+			);
2689
+			return '
2690 2690
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2691 2691
 	<script >
2692 2692
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2699,792 +2699,792 @@  discard block
 block discarded – undo
2699 2699
 	        }
2700 2700
 	    }, 800 );
2701 2701
 	</script >';
2702
-        }
2703
-        $template_args = array(
2704
-            'title'                    => '',
2705
-            'content'                  => '',
2706
-            'step_button_text'         => '',
2707
-            'show_notification_toggle' => false,
2708
-        );
2709
-        //to indicate we're processing a new registration
2710
-        $hidden_fields = array(
2711
-            'processing_registration' => array(
2712
-                'type'  => 'hidden',
2713
-                'value' => 0,
2714
-            ),
2715
-            'event_id'                => array(
2716
-                'type'  => 'hidden',
2717
-                'value' => $this->_reg_event->ID(),
2718
-            ),
2719
-        );
2720
-        //if the cart is empty then we know we're at step one so we'll display ticket selector
2721
-        $cart = EE_Registry::instance()->SSN->cart();
2722
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2723
-        switch ($step) {
2724
-            case 'ticket' :
2725
-                $hidden_fields['processing_registration']['value'] = 1;
2726
-                $template_args['title']                            = esc_html__(
2727
-                    'Step One: Select the Ticket for this registration',
2728
-                    'event_espresso'
2729
-                );
2730
-                $template_args['content']                          =
2731
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2732
-                $template_args['step_button_text']                 = esc_html__(
2733
-                    'Add Tickets and Continue to Registrant Details',
2734
-                    'event_espresso'
2735
-                );
2736
-                $template_args['show_notification_toggle']         = false;
2737
-                break;
2738
-            case 'questions' :
2739
-                $hidden_fields['processing_registration']['value'] = 2;
2740
-                $template_args['title']                            = esc_html__(
2741
-                    'Step Two: Add Registrant Details for this Registration',
2742
-                    'event_espresso'
2743
-                );
2744
-                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2745
-                // properly by the first process_reg_step run.
2746
-                $template_args['content']                  =
2747
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2748
-                $template_args['step_button_text']         = esc_html__(
2749
-                    'Save Registration and Continue to Details',
2750
-                    'event_espresso'
2751
-                );
2752
-                $template_args['show_notification_toggle'] = true;
2753
-                break;
2754
-        }
2755
-        //we come back to the process_registration_step route.
2756
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757
-        return EEH_Template::display_template(
2758
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2759
-            $template_args,
2760
-            true
2761
-        );
2762
-    }
2763
-
2764
-
2765
-    /**
2766
-     *        set_reg_event
2767
-     *
2768
-     * @access private
2769
-     * @return bool
2770
-     * @throws EE_Error
2771
-     */
2772
-    private function _set_reg_event()
2773
-    {
2774
-        if (is_object($this->_reg_event)) {
2775
-            return true;
2776
-        }
2777
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778
-        if ( ! $EVT_ID) {
2779
-            return false;
2780
-        }
2781
-        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2782
-        return true;
2783
-    }
2784
-
2785
-
2786
-    /**
2787
-     * process_reg_step
2788
-     *
2789
-     * @access        public
2790
-     * @return string
2791
-     * @throws DomainException
2792
-     * @throws EE_Error
2793
-     * @throws RuntimeException
2794
-     */
2795
-    public function process_reg_step()
2796
-    {
2797
-        EE_System::do_not_cache();
2798
-        $this->_set_reg_event();
2799
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2800
-        EE_Registry::instance()->REQ->set('uts', time());
2801
-        //what step are we on?
2802
-        $cart = EE_Registry::instance()->SSN->cart();
2803
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2804
-        //if doing ajax then we need to verify the nonce
2805
-        if (defined('DOING_AJAX')) {
2806
-            $nonce = isset($this->_req_data[$this->_req_nonce])
2807
-                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2808
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2809
-        }
2810
-        switch ($step) {
2811
-            case 'ticket' :
2812
-                //process ticket selection
2813
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
2814
-                if ($success) {
2815
-                    EE_Error::add_success(
2816
-                        esc_html__(
2817
-                            'Tickets Selected. Now complete the registration.',
2818
-                            'event_espresso'
2819
-                        )
2820
-                    );
2821
-                } else {
2822
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
2823
-                }
2824
-                if (defined('DOING_AJAX')) {
2825
-                    $this->new_registration(); //display next step
2826
-                } else {
2827
-                    $query_args = array(
2828
-                        'action'                  => 'new_registration',
2829
-                        'processing_registration' => 1,
2830
-                        'event_id'                => $this->_reg_event->ID(),
2831
-                        'uts'                     => time(),
2832
-                    );
2833
-                    $this->_redirect_after_action(
2834
-                        false,
2835
-                        '',
2836
-                        '',
2837
-                        $query_args,
2838
-                        true
2839
-                    );
2840
-                }
2841
-                break;
2842
-            case 'questions' :
2843
-                if (! isset(
2844
-                    $this->_req_data['txn_reg_status_change'],
2845
-                    $this->_req_data['txn_reg_status_change']['send_notifications'])
2846
-                ) {
2847
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2848
-                }
2849
-                //process registration
2850
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2851
-                if ($cart instanceof EE_Cart) {
2852
-                    $grand_total = $cart->get_cart_grand_total();
2853
-                    if ($grand_total instanceof EE_Line_Item) {
2854
-                        $grand_total->save_this_and_descendants_to_txn();
2855
-                    }
2856
-                }
2857
-                if ( ! $transaction instanceof EE_Transaction) {
2858
-                    $query_args = array(
2859
-                        'action'                  => 'new_registration',
2860
-                        'processing_registration' => 2,
2861
-                        'event_id'                => $this->_reg_event->ID(),
2862
-                        'uts'                     => time(),
2863
-                    );
2864
-                    if (defined('DOING_AJAX')) {
2865
-                        //display registration form again because there are errors (maybe validation?)
2866
-                        $this->new_registration();
2867
-                        return;
2868
-                    } else {
2869
-                        $this->_redirect_after_action(
2870
-                            false,
2871
-                            '',
2872
-                            '',
2873
-                            $query_args,
2874
-                            true
2875
-                        );
2876
-                        return;
2877
-                    }
2878
-                }
2879
-                // maybe update status, and make sure to save transaction if not done already
2880
-                if ( ! $transaction->update_status_based_on_total_paid()) {
2881
-                    $transaction->save();
2882
-                }
2883
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2884
-                $this->_req_data = array();
2885
-                $query_args      = array(
2886
-                    'action'        => 'redirect_to_txn',
2887
-                    'TXN_ID'        => $transaction->ID(),
2888
-                    'EVT_ID'        => $this->_reg_event->ID(),
2889
-                    'event_name'    => urlencode($this->_reg_event->name()),
2890
-                    'redirect_from' => 'new_registration',
2891
-                );
2892
-                $this->_redirect_after_action(false, '', '', $query_args, true);
2893
-                break;
2894
-        }
2895
-        //what are you looking here for?  Should be nothing to do at this point.
2896
-    }
2897
-
2898
-
2899
-    /**
2900
-     * redirect_to_txn
2901
-     *
2902
-     * @access public
2903
-     * @return void
2904
-     * @throws EE_Error
2905
-     */
2906
-    public function redirect_to_txn()
2907
-    {
2908
-        EE_System::do_not_cache();
2909
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2910
-        $query_args = array(
2911
-            'action' => 'view_transaction',
2912
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2913
-            'page'   => 'espresso_transactions',
2914
-        );
2915
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2916
-            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2917
-            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
2918
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
2919
-        }
2920
-        EE_Error::add_success(
2921
-            esc_html__(
2922
-                'Registration Created.  Please review the transaction and add any payments as necessary',
2923
-                'event_espresso'
2924
-            )
2925
-        );
2926
-        $this->_redirect_after_action(false, '', '', $query_args, true);
2927
-    }
2928
-
2929
-
2930
-    /**
2931
-     *        generates HTML for the Attendee Contact List
2932
-     *
2933
-     * @access protected
2934
-     * @return void
2935
-     */
2936
-    protected function _attendee_contact_list_table()
2937
-    {
2938
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2939
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
2940
-        $this->display_admin_list_table_page_with_no_sidebar();
2941
-    }
2942
-
2943
-
2944
-    /**
2945
-     *        get_attendees
2946
-     *
2947
-     * @param      $per_page
2948
-     * @param bool $count whether to return count or data.
2949
-     * @param bool $trash
2950
-     * @return array
2951
-     * @throws EE_Error
2952
-     * @access public
2953
-     */
2954
-    public function get_attendees($per_page, $count = false, $trash = false)
2955
-    {
2956
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2958
-        $ATT_MDL                    = EEM_Attendee::instance();
2959
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960
-        switch ($this->_req_data['orderby']) {
2961
-            case 'ATT_ID':
2962
-                $orderby = 'ATT_ID';
2963
-                break;
2964
-            case 'ATT_fname':
2965
-                $orderby = 'ATT_fname';
2966
-                break;
2967
-            case 'ATT_email':
2968
-                $orderby = 'ATT_email';
2969
-                break;
2970
-            case 'ATT_city':
2971
-                $orderby = 'ATT_city';
2972
-                break;
2973
-            case 'STA_ID':
2974
-                $orderby = 'STA_ID';
2975
-                break;
2976
-            case 'CNT_ID':
2977
-                $orderby = 'CNT_ID';
2978
-                break;
2979
-            default:
2980
-                $orderby = 'ATT_lname';
2981
-        }
2982
-        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
2983
-            ? $this->_req_data['order']
2984
-            : 'ASC';
2985
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2986
-            ? $this->_req_data['paged']
2987
-            : 1;
2988
-        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2989
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2990
-            ? $this->_req_data['perpage']
2991
-            : $per_page;
2992
-        $_where       = array();
2993
-        if ( ! empty($this->_req_data['s'])) {
2994
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2995
-            $_where['OR'] = array(
2996
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2998
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2999
-                'ATT_fname'                         => array('LIKE', $sstr),
3000
-                'ATT_lname'                         => array('LIKE', $sstr),
3001
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3002
-                'ATT_email'                         => array('LIKE', $sstr),
3003
-                'ATT_address'                       => array('LIKE', $sstr),
3004
-                'ATT_address2'                      => array('LIKE', $sstr),
3005
-                'ATT_city'                          => array('LIKE', $sstr),
3006
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3007
-                'State.STA_name'                    => array('LIKE', $sstr),
3008
-                'ATT_phone'                         => array('LIKE', $sstr),
3009
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3010
-                'Registration.REG_code'             => array('LIKE', $sstr),
3011
-                'Registration.REG_count'            => array('LIKE', $sstr),
3012
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3013
-            );
3014
-        }
3015
-        $offset = ($current_page - 1) * $per_page;
3016
-        $limit  = $count ? null : array($offset, $per_page);
3017
-        if ($trash) {
3018
-            $_where['status'] = array('!=', 'publish');
3019
-            $all_attendees    = $count
3020
-                ? $ATT_MDL->count(array(
3021
-                    $_where,
3022
-                    'order_by' => array($orderby => $sort),
3023
-                    'limit'    => $limit,
3024
-                ), 'ATT_ID', true)
3025
-                : $ATT_MDL->get_all(array(
3026
-                    $_where,
3027
-                    'order_by' => array($orderby => $sort),
3028
-                    'limit'    => $limit,
3029
-                ));
3030
-        } else {
3031
-            $_where['status'] = array('IN', array('publish'));
3032
-            $all_attendees    = $count
3033
-                ? $ATT_MDL->count(array(
3034
-                    $_where,
3035
-                    'order_by' => array($orderby => $sort),
3036
-                    'limit'    => $limit,
3037
-                ), 'ATT_ID', true)
3038
-                : $ATT_MDL->get_all(array(
3039
-                    $_where,
3040
-                    'order_by' => array($orderby => $sort),
3041
-                    'limit'    => $limit,
3042
-                ));
3043
-        }
3044
-        return $all_attendees;
3045
-    }
3046
-
3047
-
3048
-    /**
3049
-     * This is just taking care of resending the registration confirmation
3050
-     *
3051
-     * @access protected
3052
-     * @return void
3053
-     */
3054
-    protected function _resend_registration()
3055
-    {
3056
-        $this->_process_resend_registration();
3057
-        $query_args = isset($this->_req_data['redirect_to'])
3058
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3059
-            : array('action' => 'default');
3060
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3061
-    }
3062
-
3063
-    /**
3064
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3065
-     * to use when selecting registrations
3066
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3067
-     *                                                     the query parameters from the request
3068
-     * @return void ends the request with a redirect or download
3069
-     */
3070
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3071
-    {
3072
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074
-                array(
3075
-                    'page'        => 'espresso_batch',
3076
-                    'batch'       => 'file',
3077
-                    'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3078
-                    'filters'     => urlencode(
3079
-                        serialize(
3080
-                            call_user_func(
3081
-                                array( $this, $method_name_for_getting_query_params ),
3082
-                                EEH_Array::is_set(
3083
-                                    $this->_req_data,
3084
-                                    'filters',
3085
-                                    array()
3086
-                                )
3087
-                            )
3088
-                        )
3089
-                ),
3090
-                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3091
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3092
-                'return_url'  => urlencode($this->_req_data['return_url']),
3093
-            )));
3094
-        } else {
3095
-            $new_request_args = array(
3096
-                'export' => 'report',
3097
-                'action' => 'registrations_report_for_event',
3098
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099
-            );
3100
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3103
-                $EE_Export = EE_Export::instance($this->_req_data);
3104
-                $EE_Export->export();
3105
-            }
3106
-        }
3107
-    }
3108
-
3109
-
3110
-
3111
-    /**
3112
-     * Creates a registration report using only query parameters in the request
3113
-     * @return void
3114
-     */
3115
-    public function _registrations_report()
3116
-    {
3117
-        $this->_registrations_report_base('_get_registration_query_parameters');
3118
-    }
3119
-
3120
-
3121
-    public function _contact_list_export()
3122
-    {
3123
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3125
-            $EE_Export = EE_Export::instance($this->_req_data);
3126
-            $EE_Export->export_attendees();
3127
-        }
3128
-    }
3129
-
3130
-
3131
-    public function _contact_list_report()
3132
-    {
3133
-        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3134
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3135
-                'page'        => 'espresso_batch',
3136
-                'batch'       => 'file',
3137
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3138
-                'return_url'  => urlencode($this->_req_data['return_url']),
3139
-            )));
3140
-        } else {
3141
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3143
-                $EE_Export = EE_Export::instance($this->_req_data);
3144
-                $EE_Export->report_attendees();
3145
-            }
3146
-        }
3147
-    }
3148
-
3149
-
3150
-
3151
-
3152
-
3153
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3154
-    /**
3155
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3156
-     *
3157
-     * @return void
3158
-     * @throws EE_Error
3159
-     */
3160
-    protected function _duplicate_attendee()
3161
-    {
3162
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3163
-        //verify we have necessary info
3164
-        if (empty($this->_req_data['_REG_ID'])) {
3165
-            EE_Error::add_error(
3166
-                esc_html__(
3167
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3168
-                    'event_espresso'
3169
-                ), __FILE__, __LINE__, __FUNCTION__
3170
-            );
3171
-            $query_args = array('action' => $action);
3172
-            $this->_redirect_after_action('', '', '', $query_args, true);
3173
-        }
3174
-        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3175
-        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3176
-        $attendee     = $registration->attendee();
3177
-        //remove relation of existing attendee on registration
3178
-        $registration->_remove_relation_to($attendee, 'Attendee');
3179
-        //new attendee
3180
-        $new_attendee = clone $attendee;
3181
-        $new_attendee->set('ATT_ID', 0);
3182
-        $new_attendee->save();
3183
-        //add new attendee to reg
3184
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3185
-        EE_Error::add_success(
3186
-            esc_html__(
3187
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3188
-                'event_espresso'
3189
-            )
3190
-        );
3191
-        //redirect to edit page for attendee
3192
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3193
-        $this->_redirect_after_action('', '', '', $query_args, true);
3194
-    }
3195
-
3196
-
3197
-    //related to cpt routes
3198
-    protected function _insert_update_cpt_item($post_id, $post)
3199
-    {
3200
-        $success  = true;
3201
-        $attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3202
-        //for attendee updates
3203
-        if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3204
-            //note we should only be UPDATING attendees at this point.
3205
-            $updated_fields = array(
3206
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3207
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3209
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3212
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3213
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3214
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3215
-                'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3216
-                'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3217
-            );
3218
-            foreach ($updated_fields as $field => $value) {
3219
-                $attendee->set($field, $value);
3220
-            }
3221
-            $success                   = $attendee->save();
3222
-            $attendee_update_callbacks = apply_filters(
3223
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3224
-                array()
3225
-            );
3226
-            foreach ($attendee_update_callbacks as $a_callback) {
3227
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3228
-                    throw new EE_Error(
3229
-                        sprintf(
3230
-                            esc_html__(
3231
-                                '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.',
3232
-                                'event_espresso'
3233
-                            ),
3234
-                            $a_callback
3235
-                        )
3236
-                    );
3237
-                }
3238
-            }
3239
-        }
3240
-        if ($success === false) {
3241
-            EE_Error::add_error(
3242
-                esc_html__(
3243
-                    'Something went wrong with updating the meta table data for the registration.',
3244
-                    'event_espresso'
3245
-                ),
3246
-                __FILE__, __FUNCTION__, __LINE__
3247
-            );
3248
-        }
3249
-    }
3250
-
3251
-
3252
-    public function trash_cpt_item($post_id)
3253
-    {
3254
-    }
3255
-
3256
-
3257
-    public function delete_cpt_item($post_id)
3258
-    {
3259
-    }
3260
-
3261
-
3262
-    public function restore_cpt_item($post_id)
3263
-    {
3264
-    }
3265
-
3266
-
3267
-    protected function _restore_cpt_item($post_id, $revision_id)
3268
-    {
3269
-    }
3270
-
3271
-
3272
-    public function attendee_editor_metaboxes()
3273
-    {
3274
-        $this->verify_cpt_object();
3275
-        remove_meta_box(
3276
-            'postexcerpt',
3277
-            esc_html__('Excerpt', 'event_espresso'),
3278
-            'post_excerpt_meta_box',
3279
-            $this->_cpt_routes[$this->_req_action],
3280
-            'normal',
3281
-            'core'
3282
-        );
3283
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3284
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3285
-            add_meta_box(
3286
-                'postexcerpt',
3287
-                esc_html__('Short Biography', 'event_espresso'),
3288
-                'post_excerpt_meta_box',
3289
-                $this->_cpt_routes[$this->_req_action],
3290
-                'normal'
3291
-            );
3292
-        }
3293
-        if (post_type_supports('espresso_attendees', 'comments')) {
3294
-            add_meta_box(
3295
-                'commentsdiv',
3296
-                esc_html__('Notes on the Contact', 'event_espresso'),
3297
-                'post_comment_meta_box',
3298
-                $this->_cpt_routes[$this->_req_action],
3299
-                'normal',
3300
-                'core'
3301
-            );
3302
-        }
3303
-        add_meta_box(
3304
-            'attendee_contact_info',
3305
-            esc_html__('Contact Info', 'event_espresso'),
3306
-            array($this, 'attendee_contact_info'),
3307
-            $this->_cpt_routes[$this->_req_action],
3308
-            'side',
3309
-            'core'
3310
-        );
3311
-        add_meta_box(
3312
-            'attendee_details_address',
3313
-            esc_html__('Address Details', 'event_espresso'),
3314
-            array($this, 'attendee_address_details'),
3315
-            $this->_cpt_routes[$this->_req_action],
3316
-            'normal',
3317
-            'core'
3318
-        );
3319
-        add_meta_box(
3320
-            'attendee_registrations',
3321
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3322
-            array($this, 'attendee_registrations_meta_box'),
3323
-            $this->_cpt_routes[$this->_req_action],
3324
-            'normal',
3325
-            'high'
3326
-        );
3327
-    }
3328
-
3329
-
3330
-    /**
3331
-     * Metabox for attendee contact info
3332
-     *
3333
-     * @param  WP_Post $post wp post object
3334
-     * @return string attendee contact info ( and form )
3335
-     * @throws DomainException
3336
-     */
3337
-    public function attendee_contact_info($post)
3338
-    {
3339
-        //get attendee object ( should already have it )
3340
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3342
-        EEH_Template::display_template($template, $this->_template_args);
3343
-    }
3344
-
3345
-
3346
-    /**
3347
-     * Metabox for attendee details
3348
-     *
3349
-     * @param  WP_Post $post wp post object
3350
-     * @return string attendee address details (and form)
3351
-     * @throws DomainException
3352
-     */
3353
-    public function attendee_address_details($post)
3354
-    {
3355
-        //get attendee object (should already have it)
3356
-        $this->_template_args['attendee']     = $this->_cpt_model_obj;
3357
-        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3358
-            new EE_Question_Form_Input(
3359
-                EE_Question::new_instance(
3360
-                    array(
3361
-                        'QST_ID'           => 0,
3362
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3363
-                        'QST_system'       => 'admin-state',
3364
-                    )
3365
-                ),
3366
-                EE_Answer::new_instance(
3367
-                    array(
3368
-                        'ANS_ID'    => 0,
3369
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3370
-                    )
3371
-                ),
3372
-                array(
3373
-                    'input_id'       => 'STA_ID',
3374
-                    'input_name'     => 'STA_ID',
3375
-                    'input_prefix'   => '',
3376
-                    'append_qstn_id' => false,
3377
-                )
3378
-            )
3379
-        );
3380
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3381
-            new EE_Question_Form_Input(
3382
-                EE_Question::new_instance(
3383
-                    array(
3384
-                        'QST_ID'           => 0,
3385
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3386
-                        'QST_system'       => 'admin-country',
3387
-                    )
3388
-                ),
3389
-                EE_Answer::new_instance(
3390
-                    array(
3391
-                        'ANS_ID'    => 0,
3392
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3393
-                    )
3394
-                ),
3395
-                array(
3396
-                    'input_id'       => 'CNT_ISO',
3397
-                    'input_name'     => 'CNT_ISO',
3398
-                    'input_prefix'   => '',
3399
-                    'append_qstn_id' => false,
3400
-                )
3401
-            )
3402
-        );
3403
-        $template                             =
3404
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3405
-        EEH_Template::display_template($template, $this->_template_args);
3406
-    }
3407
-
3408
-
3409
-    /**
3410
-     *        _attendee_details
3411
-     *
3412
-     * @access protected
3413
-     * @param $post
3414
-     * @return void
3415
-     * @throws DomainException
3416
-     * @throws EE_Error
3417
-     */
3418
-    public function attendee_registrations_meta_box($post)
3419
-    {
3420
-        $this->_template_args['attendee']      = $this->_cpt_model_obj;
3421
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422
-        $template                              =
3423
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3424
-        EEH_Template::display_template($template, $this->_template_args);
3425
-    }
3426
-
3427
-
3428
-    /**
3429
-     * add in the form fields for the attendee edit
3430
-     *
3431
-     * @param  WP_Post $post wp post object
3432
-     * @return string html for new form.
3433
-     * @throws DomainException
3434
-     */
3435
-    public function after_title_form_fields($post)
3436
-    {
3437
-        if ($post->post_type == 'espresso_attendees') {
3438
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3439
-            $template_args['attendee'] = $this->_cpt_model_obj;
3440
-            EEH_Template::display_template($template, $template_args);
3441
-        }
3442
-    }
3443
-
3444
-
3445
-    /**
3446
-     *        _trash_or_restore_attendee
3447
-     *
3448
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3449
-     * @return void
3450
-     * @throws EE_Error
3451
-     * @access protected
3452
-     */
3453
-    protected function _trash_or_restore_attendees($trash = true)
3454
-    {
3455
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3456
-        $ATT_MDL = EEM_Attendee::instance();
3457
-        $success = 1;
3458
-        //Checkboxes
3459
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3460
-            // if array has more than one element than success message should be plural
3461
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3462
-            // cycle thru checkboxes
3463
-            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3464
-                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3465
-                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3466
-                if ( ! $updated) {
3467
-                    $success = 0;
3468
-                }
3469
-            }
3470
-        } else {
3471
-            // grab single id and delete
3472
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3473
-            //get attendee
3474
-            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3475
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3476
-            $updated = $att->save();
3477
-            if ( ! $updated) {
3478
-                $success = 0;
3479
-            }
3480
-        }
3481
-        $what        = $success > 1
3482
-            ? esc_html__('Contacts', 'event_espresso')
3483
-            : esc_html__('Contact', 'event_espresso');
3484
-        $action_desc = $trash
3485
-            ? esc_html__('moved to the trash', 'event_espresso')
3486
-            : esc_html__('restored', 'event_espresso');
3487
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3488
-    }
2702
+		}
2703
+		$template_args = array(
2704
+			'title'                    => '',
2705
+			'content'                  => '',
2706
+			'step_button_text'         => '',
2707
+			'show_notification_toggle' => false,
2708
+		);
2709
+		//to indicate we're processing a new registration
2710
+		$hidden_fields = array(
2711
+			'processing_registration' => array(
2712
+				'type'  => 'hidden',
2713
+				'value' => 0,
2714
+			),
2715
+			'event_id'                => array(
2716
+				'type'  => 'hidden',
2717
+				'value' => $this->_reg_event->ID(),
2718
+			),
2719
+		);
2720
+		//if the cart is empty then we know we're at step one so we'll display ticket selector
2721
+		$cart = EE_Registry::instance()->SSN->cart();
2722
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2723
+		switch ($step) {
2724
+			case 'ticket' :
2725
+				$hidden_fields['processing_registration']['value'] = 1;
2726
+				$template_args['title']                            = esc_html__(
2727
+					'Step One: Select the Ticket for this registration',
2728
+					'event_espresso'
2729
+				);
2730
+				$template_args['content']                          =
2731
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2732
+				$template_args['step_button_text']                 = esc_html__(
2733
+					'Add Tickets and Continue to Registrant Details',
2734
+					'event_espresso'
2735
+				);
2736
+				$template_args['show_notification_toggle']         = false;
2737
+				break;
2738
+			case 'questions' :
2739
+				$hidden_fields['processing_registration']['value'] = 2;
2740
+				$template_args['title']                            = esc_html__(
2741
+					'Step Two: Add Registrant Details for this Registration',
2742
+					'event_espresso'
2743
+				);
2744
+				//in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2745
+				// properly by the first process_reg_step run.
2746
+				$template_args['content']                  =
2747
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
2748
+				$template_args['step_button_text']         = esc_html__(
2749
+					'Save Registration and Continue to Details',
2750
+					'event_espresso'
2751
+				);
2752
+				$template_args['show_notification_toggle'] = true;
2753
+				break;
2754
+		}
2755
+		//we come back to the process_registration_step route.
2756
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757
+		return EEH_Template::display_template(
2758
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2759
+			$template_args,
2760
+			true
2761
+		);
2762
+	}
2763
+
2764
+
2765
+	/**
2766
+	 *        set_reg_event
2767
+	 *
2768
+	 * @access private
2769
+	 * @return bool
2770
+	 * @throws EE_Error
2771
+	 */
2772
+	private function _set_reg_event()
2773
+	{
2774
+		if (is_object($this->_reg_event)) {
2775
+			return true;
2776
+		}
2777
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778
+		if ( ! $EVT_ID) {
2779
+			return false;
2780
+		}
2781
+		$this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2782
+		return true;
2783
+	}
2784
+
2785
+
2786
+	/**
2787
+	 * process_reg_step
2788
+	 *
2789
+	 * @access        public
2790
+	 * @return string
2791
+	 * @throws DomainException
2792
+	 * @throws EE_Error
2793
+	 * @throws RuntimeException
2794
+	 */
2795
+	public function process_reg_step()
2796
+	{
2797
+		EE_System::do_not_cache();
2798
+		$this->_set_reg_event();
2799
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2800
+		EE_Registry::instance()->REQ->set('uts', time());
2801
+		//what step are we on?
2802
+		$cart = EE_Registry::instance()->SSN->cart();
2803
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2804
+		//if doing ajax then we need to verify the nonce
2805
+		if (defined('DOING_AJAX')) {
2806
+			$nonce = isset($this->_req_data[$this->_req_nonce])
2807
+				? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2808
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2809
+		}
2810
+		switch ($step) {
2811
+			case 'ticket' :
2812
+				//process ticket selection
2813
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
2814
+				if ($success) {
2815
+					EE_Error::add_success(
2816
+						esc_html__(
2817
+							'Tickets Selected. Now complete the registration.',
2818
+							'event_espresso'
2819
+						)
2820
+					);
2821
+				} else {
2822
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
2823
+				}
2824
+				if (defined('DOING_AJAX')) {
2825
+					$this->new_registration(); //display next step
2826
+				} else {
2827
+					$query_args = array(
2828
+						'action'                  => 'new_registration',
2829
+						'processing_registration' => 1,
2830
+						'event_id'                => $this->_reg_event->ID(),
2831
+						'uts'                     => time(),
2832
+					);
2833
+					$this->_redirect_after_action(
2834
+						false,
2835
+						'',
2836
+						'',
2837
+						$query_args,
2838
+						true
2839
+					);
2840
+				}
2841
+				break;
2842
+			case 'questions' :
2843
+				if (! isset(
2844
+					$this->_req_data['txn_reg_status_change'],
2845
+					$this->_req_data['txn_reg_status_change']['send_notifications'])
2846
+				) {
2847
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2848
+				}
2849
+				//process registration
2850
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2851
+				if ($cart instanceof EE_Cart) {
2852
+					$grand_total = $cart->get_cart_grand_total();
2853
+					if ($grand_total instanceof EE_Line_Item) {
2854
+						$grand_total->save_this_and_descendants_to_txn();
2855
+					}
2856
+				}
2857
+				if ( ! $transaction instanceof EE_Transaction) {
2858
+					$query_args = array(
2859
+						'action'                  => 'new_registration',
2860
+						'processing_registration' => 2,
2861
+						'event_id'                => $this->_reg_event->ID(),
2862
+						'uts'                     => time(),
2863
+					);
2864
+					if (defined('DOING_AJAX')) {
2865
+						//display registration form again because there are errors (maybe validation?)
2866
+						$this->new_registration();
2867
+						return;
2868
+					} else {
2869
+						$this->_redirect_after_action(
2870
+							false,
2871
+							'',
2872
+							'',
2873
+							$query_args,
2874
+							true
2875
+						);
2876
+						return;
2877
+					}
2878
+				}
2879
+				// maybe update status, and make sure to save transaction if not done already
2880
+				if ( ! $transaction->update_status_based_on_total_paid()) {
2881
+					$transaction->save();
2882
+				}
2883
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2884
+				$this->_req_data = array();
2885
+				$query_args      = array(
2886
+					'action'        => 'redirect_to_txn',
2887
+					'TXN_ID'        => $transaction->ID(),
2888
+					'EVT_ID'        => $this->_reg_event->ID(),
2889
+					'event_name'    => urlencode($this->_reg_event->name()),
2890
+					'redirect_from' => 'new_registration',
2891
+				);
2892
+				$this->_redirect_after_action(false, '', '', $query_args, true);
2893
+				break;
2894
+		}
2895
+		//what are you looking here for?  Should be nothing to do at this point.
2896
+	}
2897
+
2898
+
2899
+	/**
2900
+	 * redirect_to_txn
2901
+	 *
2902
+	 * @access public
2903
+	 * @return void
2904
+	 * @throws EE_Error
2905
+	 */
2906
+	public function redirect_to_txn()
2907
+	{
2908
+		EE_System::do_not_cache();
2909
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2910
+		$query_args = array(
2911
+			'action' => 'view_transaction',
2912
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2913
+			'page'   => 'espresso_transactions',
2914
+		);
2915
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2916
+			$query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2917
+			$query_args['event_name']    = urlencode($this->_req_data['event_name']);
2918
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
2919
+		}
2920
+		EE_Error::add_success(
2921
+			esc_html__(
2922
+				'Registration Created.  Please review the transaction and add any payments as necessary',
2923
+				'event_espresso'
2924
+			)
2925
+		);
2926
+		$this->_redirect_after_action(false, '', '', $query_args, true);
2927
+	}
2928
+
2929
+
2930
+	/**
2931
+	 *        generates HTML for the Attendee Contact List
2932
+	 *
2933
+	 * @access protected
2934
+	 * @return void
2935
+	 */
2936
+	protected function _attendee_contact_list_table()
2937
+	{
2938
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2939
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
2940
+		$this->display_admin_list_table_page_with_no_sidebar();
2941
+	}
2942
+
2943
+
2944
+	/**
2945
+	 *        get_attendees
2946
+	 *
2947
+	 * @param      $per_page
2948
+	 * @param bool $count whether to return count or data.
2949
+	 * @param bool $trash
2950
+	 * @return array
2951
+	 * @throws EE_Error
2952
+	 * @access public
2953
+	 */
2954
+	public function get_attendees($per_page, $count = false, $trash = false)
2955
+	{
2956
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2958
+		$ATT_MDL                    = EEM_Attendee::instance();
2959
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960
+		switch ($this->_req_data['orderby']) {
2961
+			case 'ATT_ID':
2962
+				$orderby = 'ATT_ID';
2963
+				break;
2964
+			case 'ATT_fname':
2965
+				$orderby = 'ATT_fname';
2966
+				break;
2967
+			case 'ATT_email':
2968
+				$orderby = 'ATT_email';
2969
+				break;
2970
+			case 'ATT_city':
2971
+				$orderby = 'ATT_city';
2972
+				break;
2973
+			case 'STA_ID':
2974
+				$orderby = 'STA_ID';
2975
+				break;
2976
+			case 'CNT_ID':
2977
+				$orderby = 'CNT_ID';
2978
+				break;
2979
+			default:
2980
+				$orderby = 'ATT_lname';
2981
+		}
2982
+		$sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
2983
+			? $this->_req_data['order']
2984
+			: 'ASC';
2985
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2986
+			? $this->_req_data['paged']
2987
+			: 1;
2988
+		$per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2989
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2990
+			? $this->_req_data['perpage']
2991
+			: $per_page;
2992
+		$_where       = array();
2993
+		if ( ! empty($this->_req_data['s'])) {
2994
+			$sstr         = '%' . $this->_req_data['s'] . '%';
2995
+			$_where['OR'] = array(
2996
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2998
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2999
+				'ATT_fname'                         => array('LIKE', $sstr),
3000
+				'ATT_lname'                         => array('LIKE', $sstr),
3001
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3002
+				'ATT_email'                         => array('LIKE', $sstr),
3003
+				'ATT_address'                       => array('LIKE', $sstr),
3004
+				'ATT_address2'                      => array('LIKE', $sstr),
3005
+				'ATT_city'                          => array('LIKE', $sstr),
3006
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3007
+				'State.STA_name'                    => array('LIKE', $sstr),
3008
+				'ATT_phone'                         => array('LIKE', $sstr),
3009
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3010
+				'Registration.REG_code'             => array('LIKE', $sstr),
3011
+				'Registration.REG_count'            => array('LIKE', $sstr),
3012
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3013
+			);
3014
+		}
3015
+		$offset = ($current_page - 1) * $per_page;
3016
+		$limit  = $count ? null : array($offset, $per_page);
3017
+		if ($trash) {
3018
+			$_where['status'] = array('!=', 'publish');
3019
+			$all_attendees    = $count
3020
+				? $ATT_MDL->count(array(
3021
+					$_where,
3022
+					'order_by' => array($orderby => $sort),
3023
+					'limit'    => $limit,
3024
+				), 'ATT_ID', true)
3025
+				: $ATT_MDL->get_all(array(
3026
+					$_where,
3027
+					'order_by' => array($orderby => $sort),
3028
+					'limit'    => $limit,
3029
+				));
3030
+		} else {
3031
+			$_where['status'] = array('IN', array('publish'));
3032
+			$all_attendees    = $count
3033
+				? $ATT_MDL->count(array(
3034
+					$_where,
3035
+					'order_by' => array($orderby => $sort),
3036
+					'limit'    => $limit,
3037
+				), 'ATT_ID', true)
3038
+				: $ATT_MDL->get_all(array(
3039
+					$_where,
3040
+					'order_by' => array($orderby => $sort),
3041
+					'limit'    => $limit,
3042
+				));
3043
+		}
3044
+		return $all_attendees;
3045
+	}
3046
+
3047
+
3048
+	/**
3049
+	 * This is just taking care of resending the registration confirmation
3050
+	 *
3051
+	 * @access protected
3052
+	 * @return void
3053
+	 */
3054
+	protected function _resend_registration()
3055
+	{
3056
+		$this->_process_resend_registration();
3057
+		$query_args = isset($this->_req_data['redirect_to'])
3058
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3059
+			: array('action' => 'default');
3060
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3061
+	}
3062
+
3063
+	/**
3064
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3065
+	 * to use when selecting registrations
3066
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3067
+	 *                                                     the query parameters from the request
3068
+	 * @return void ends the request with a redirect or download
3069
+	 */
3070
+	public function _registrations_report_base( $method_name_for_getting_query_params )
3071
+	{
3072
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074
+				array(
3075
+					'page'        => 'espresso_batch',
3076
+					'batch'       => 'file',
3077
+					'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3078
+					'filters'     => urlencode(
3079
+						serialize(
3080
+							call_user_func(
3081
+								array( $this, $method_name_for_getting_query_params ),
3082
+								EEH_Array::is_set(
3083
+									$this->_req_data,
3084
+									'filters',
3085
+									array()
3086
+								)
3087
+							)
3088
+						)
3089
+				),
3090
+				'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3091
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3092
+				'return_url'  => urlencode($this->_req_data['return_url']),
3093
+			)));
3094
+		} else {
3095
+			$new_request_args = array(
3096
+				'export' => 'report',
3097
+				'action' => 'registrations_report_for_event',
3098
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099
+			);
3100
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3103
+				$EE_Export = EE_Export::instance($this->_req_data);
3104
+				$EE_Export->export();
3105
+			}
3106
+		}
3107
+	}
3108
+
3109
+
3110
+
3111
+	/**
3112
+	 * Creates a registration report using only query parameters in the request
3113
+	 * @return void
3114
+	 */
3115
+	public function _registrations_report()
3116
+	{
3117
+		$this->_registrations_report_base('_get_registration_query_parameters');
3118
+	}
3119
+
3120
+
3121
+	public function _contact_list_export()
3122
+	{
3123
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3125
+			$EE_Export = EE_Export::instance($this->_req_data);
3126
+			$EE_Export->export_attendees();
3127
+		}
3128
+	}
3129
+
3130
+
3131
+	public function _contact_list_report()
3132
+	{
3133
+		if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3134
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3135
+				'page'        => 'espresso_batch',
3136
+				'batch'       => 'file',
3137
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3138
+				'return_url'  => urlencode($this->_req_data['return_url']),
3139
+			)));
3140
+		} else {
3141
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3143
+				$EE_Export = EE_Export::instance($this->_req_data);
3144
+				$EE_Export->report_attendees();
3145
+			}
3146
+		}
3147
+	}
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3154
+	/**
3155
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3156
+	 *
3157
+	 * @return void
3158
+	 * @throws EE_Error
3159
+	 */
3160
+	protected function _duplicate_attendee()
3161
+	{
3162
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3163
+		//verify we have necessary info
3164
+		if (empty($this->_req_data['_REG_ID'])) {
3165
+			EE_Error::add_error(
3166
+				esc_html__(
3167
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3168
+					'event_espresso'
3169
+				), __FILE__, __LINE__, __FUNCTION__
3170
+			);
3171
+			$query_args = array('action' => $action);
3172
+			$this->_redirect_after_action('', '', '', $query_args, true);
3173
+		}
3174
+		//okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3175
+		$registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3176
+		$attendee     = $registration->attendee();
3177
+		//remove relation of existing attendee on registration
3178
+		$registration->_remove_relation_to($attendee, 'Attendee');
3179
+		//new attendee
3180
+		$new_attendee = clone $attendee;
3181
+		$new_attendee->set('ATT_ID', 0);
3182
+		$new_attendee->save();
3183
+		//add new attendee to reg
3184
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3185
+		EE_Error::add_success(
3186
+			esc_html__(
3187
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3188
+				'event_espresso'
3189
+			)
3190
+		);
3191
+		//redirect to edit page for attendee
3192
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3193
+		$this->_redirect_after_action('', '', '', $query_args, true);
3194
+	}
3195
+
3196
+
3197
+	//related to cpt routes
3198
+	protected function _insert_update_cpt_item($post_id, $post)
3199
+	{
3200
+		$success  = true;
3201
+		$attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3202
+		//for attendee updates
3203
+		if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3204
+			//note we should only be UPDATING attendees at this point.
3205
+			$updated_fields = array(
3206
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3207
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3209
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3212
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3213
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3214
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3215
+				'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3216
+				'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3217
+			);
3218
+			foreach ($updated_fields as $field => $value) {
3219
+				$attendee->set($field, $value);
3220
+			}
3221
+			$success                   = $attendee->save();
3222
+			$attendee_update_callbacks = apply_filters(
3223
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3224
+				array()
3225
+			);
3226
+			foreach ($attendee_update_callbacks as $a_callback) {
3227
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3228
+					throw new EE_Error(
3229
+						sprintf(
3230
+							esc_html__(
3231
+								'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.',
3232
+								'event_espresso'
3233
+							),
3234
+							$a_callback
3235
+						)
3236
+					);
3237
+				}
3238
+			}
3239
+		}
3240
+		if ($success === false) {
3241
+			EE_Error::add_error(
3242
+				esc_html__(
3243
+					'Something went wrong with updating the meta table data for the registration.',
3244
+					'event_espresso'
3245
+				),
3246
+				__FILE__, __FUNCTION__, __LINE__
3247
+			);
3248
+		}
3249
+	}
3250
+
3251
+
3252
+	public function trash_cpt_item($post_id)
3253
+	{
3254
+	}
3255
+
3256
+
3257
+	public function delete_cpt_item($post_id)
3258
+	{
3259
+	}
3260
+
3261
+
3262
+	public function restore_cpt_item($post_id)
3263
+	{
3264
+	}
3265
+
3266
+
3267
+	protected function _restore_cpt_item($post_id, $revision_id)
3268
+	{
3269
+	}
3270
+
3271
+
3272
+	public function attendee_editor_metaboxes()
3273
+	{
3274
+		$this->verify_cpt_object();
3275
+		remove_meta_box(
3276
+			'postexcerpt',
3277
+			esc_html__('Excerpt', 'event_espresso'),
3278
+			'post_excerpt_meta_box',
3279
+			$this->_cpt_routes[$this->_req_action],
3280
+			'normal',
3281
+			'core'
3282
+		);
3283
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3284
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3285
+			add_meta_box(
3286
+				'postexcerpt',
3287
+				esc_html__('Short Biography', 'event_espresso'),
3288
+				'post_excerpt_meta_box',
3289
+				$this->_cpt_routes[$this->_req_action],
3290
+				'normal'
3291
+			);
3292
+		}
3293
+		if (post_type_supports('espresso_attendees', 'comments')) {
3294
+			add_meta_box(
3295
+				'commentsdiv',
3296
+				esc_html__('Notes on the Contact', 'event_espresso'),
3297
+				'post_comment_meta_box',
3298
+				$this->_cpt_routes[$this->_req_action],
3299
+				'normal',
3300
+				'core'
3301
+			);
3302
+		}
3303
+		add_meta_box(
3304
+			'attendee_contact_info',
3305
+			esc_html__('Contact Info', 'event_espresso'),
3306
+			array($this, 'attendee_contact_info'),
3307
+			$this->_cpt_routes[$this->_req_action],
3308
+			'side',
3309
+			'core'
3310
+		);
3311
+		add_meta_box(
3312
+			'attendee_details_address',
3313
+			esc_html__('Address Details', 'event_espresso'),
3314
+			array($this, 'attendee_address_details'),
3315
+			$this->_cpt_routes[$this->_req_action],
3316
+			'normal',
3317
+			'core'
3318
+		);
3319
+		add_meta_box(
3320
+			'attendee_registrations',
3321
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3322
+			array($this, 'attendee_registrations_meta_box'),
3323
+			$this->_cpt_routes[$this->_req_action],
3324
+			'normal',
3325
+			'high'
3326
+		);
3327
+	}
3328
+
3329
+
3330
+	/**
3331
+	 * Metabox for attendee contact info
3332
+	 *
3333
+	 * @param  WP_Post $post wp post object
3334
+	 * @return string attendee contact info ( and form )
3335
+	 * @throws DomainException
3336
+	 */
3337
+	public function attendee_contact_info($post)
3338
+	{
3339
+		//get attendee object ( should already have it )
3340
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
+		$template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3342
+		EEH_Template::display_template($template, $this->_template_args);
3343
+	}
3344
+
3345
+
3346
+	/**
3347
+	 * Metabox for attendee details
3348
+	 *
3349
+	 * @param  WP_Post $post wp post object
3350
+	 * @return string attendee address details (and form)
3351
+	 * @throws DomainException
3352
+	 */
3353
+	public function attendee_address_details($post)
3354
+	{
3355
+		//get attendee object (should already have it)
3356
+		$this->_template_args['attendee']     = $this->_cpt_model_obj;
3357
+		$this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3358
+			new EE_Question_Form_Input(
3359
+				EE_Question::new_instance(
3360
+					array(
3361
+						'QST_ID'           => 0,
3362
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3363
+						'QST_system'       => 'admin-state',
3364
+					)
3365
+				),
3366
+				EE_Answer::new_instance(
3367
+					array(
3368
+						'ANS_ID'    => 0,
3369
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3370
+					)
3371
+				),
3372
+				array(
3373
+					'input_id'       => 'STA_ID',
3374
+					'input_name'     => 'STA_ID',
3375
+					'input_prefix'   => '',
3376
+					'append_qstn_id' => false,
3377
+				)
3378
+			)
3379
+		);
3380
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3381
+			new EE_Question_Form_Input(
3382
+				EE_Question::new_instance(
3383
+					array(
3384
+						'QST_ID'           => 0,
3385
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3386
+						'QST_system'       => 'admin-country',
3387
+					)
3388
+				),
3389
+				EE_Answer::new_instance(
3390
+					array(
3391
+						'ANS_ID'    => 0,
3392
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3393
+					)
3394
+				),
3395
+				array(
3396
+					'input_id'       => 'CNT_ISO',
3397
+					'input_name'     => 'CNT_ISO',
3398
+					'input_prefix'   => '',
3399
+					'append_qstn_id' => false,
3400
+				)
3401
+			)
3402
+		);
3403
+		$template                             =
3404
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3405
+		EEH_Template::display_template($template, $this->_template_args);
3406
+	}
3407
+
3408
+
3409
+	/**
3410
+	 *        _attendee_details
3411
+	 *
3412
+	 * @access protected
3413
+	 * @param $post
3414
+	 * @return void
3415
+	 * @throws DomainException
3416
+	 * @throws EE_Error
3417
+	 */
3418
+	public function attendee_registrations_meta_box($post)
3419
+	{
3420
+		$this->_template_args['attendee']      = $this->_cpt_model_obj;
3421
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422
+		$template                              =
3423
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3424
+		EEH_Template::display_template($template, $this->_template_args);
3425
+	}
3426
+
3427
+
3428
+	/**
3429
+	 * add in the form fields for the attendee edit
3430
+	 *
3431
+	 * @param  WP_Post $post wp post object
3432
+	 * @return string html for new form.
3433
+	 * @throws DomainException
3434
+	 */
3435
+	public function after_title_form_fields($post)
3436
+	{
3437
+		if ($post->post_type == 'espresso_attendees') {
3438
+			$template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3439
+			$template_args['attendee'] = $this->_cpt_model_obj;
3440
+			EEH_Template::display_template($template, $template_args);
3441
+		}
3442
+	}
3443
+
3444
+
3445
+	/**
3446
+	 *        _trash_or_restore_attendee
3447
+	 *
3448
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3449
+	 * @return void
3450
+	 * @throws EE_Error
3451
+	 * @access protected
3452
+	 */
3453
+	protected function _trash_or_restore_attendees($trash = true)
3454
+	{
3455
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3456
+		$ATT_MDL = EEM_Attendee::instance();
3457
+		$success = 1;
3458
+		//Checkboxes
3459
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3460
+			// if array has more than one element than success message should be plural
3461
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3462
+			// cycle thru checkboxes
3463
+			while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3464
+				$updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3465
+					: $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3466
+				if ( ! $updated) {
3467
+					$success = 0;
3468
+				}
3469
+			}
3470
+		} else {
3471
+			// grab single id and delete
3472
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3473
+			//get attendee
3474
+			$att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3475
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3476
+			$updated = $att->save();
3477
+			if ( ! $updated) {
3478
+				$success = 0;
3479
+			}
3480
+		}
3481
+		$what        = $success > 1
3482
+			? esc_html__('Contacts', 'event_espresso')
3483
+			: esc_html__('Contact', 'event_espresso');
3484
+		$action_desc = $trash
3485
+			? esc_html__('moved to the trash', 'event_espresso')
3486
+			: esc_html__('restored', 'event_espresso');
3487
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3488
+	}
3489 3489
 
3490 3490
 }
Please login to merge, or discard this patch.
core/domain/entities/shortcodes/EspressoEventAttendees.php 1 patch
Indentation   +239 added lines, -239 removed lines patch added patch discarded remove patch
@@ -28,245 +28,245 @@
 block discarded – undo
28 28
 class EspressoEventAttendees extends EspressoShortcode
29 29
 {
30 30
 
31
-    private $query_params = array(
32
-        0 => array()
33
-    );
34
-
35
-    private $template_args = array(
36
-        'contacts'      => array(),
37
-        'event'         => null,
38
-        'datetime'      => null,
39
-        'ticket'        => null,
40
-    );
41
-
42
-    /**
43
-     * the actual shortcode tag that gets registered with WordPress
44
-     *
45
-     * @return string
46
-     */
47
-    public function getTag()
48
-    {
49
-        return 'ESPRESSO_EVENT_ATTENDEES';
50
-    }
51
-
52
-
53
-
54
-    /**
55
-     * the time in seconds to cache the results of the processShortcode() method
56
-     * 0 means the processShortcode() results will NOT be cached at all
57
-     *
58
-     * @return int
59
-     */
60
-    public function cacheExpiration()
61
-    {
62
-        return 0;
63
-    }
64
-
65
-
66
-
67
-    /**
68
-     * a place for adding any initialization code that needs to run prior to wp_header().
69
-     * this may be required for shortcodes that utilize a corresponding module,
70
-     * and need to enqueue assets for that module
71
-     *
72
-     * @return void
73
-     */
74
-    public function initializeShortcode()
75
-    {
76
-        $this->shortcodeHasBeenInitialized();
77
-    }
78
-
79
-
80
-
81
-    /**
82
-     * process_shortcode - ESPRESSO_EVENT_ATTENDEES - Returns a list of attendees to an event.
83
-     *  [ESPRESSO_EVENT_ATTENDEES] - defaults to attendees for earliest active event, or earliest upcoming event.
84
-     *  [ESPRESSO_EVENT_ATTENDEES event_id=123] - attendees for specific event.
85
-     *  [ESPRESSO_EVENT_ATTENDEES datetime_id=245] - attendees for a specific datetime.
86
-     *  [ESPRESSO_EVENT_ATTENDEES ticket_id=123] - attendees for a specific ticket.
87
-     *  [ESPRESSO_EVENT_ATTENDEES status=all] - specific registration status (use status id) or all for all attendees
88
-     *                                          regardless of status.  Note default is to only return approved attendees
89
-     *  [ESPRESSO_EVENT_ATTENDEES show_gravatar=true] - default is to not return gravatar.  Otherwise if this is set
90
-     *                                                  then return gravatar for email address given.
91
-     *  Note: because of the relationship between event_id, ticket_id, and datetime_id.
92
-     * If more than one of those params is included then preference is given to the following:
93
-     *  - event_id is used whenever its present and any others are ignored.
94
-     *  - if no event_id then datetime is used whenever its present and any others are ignored.
95
-     *  - otherwise ticket_id is used if present.
96
-     *
97
-     * @param array $attributes
98
-     * @return string
99
-     * @throws \EE_Error
100
-     */
101
-    public function processShortcode($attributes = array())
102
-    {
103
-        // grab attributes and merge with defaults
104
-        $attributes = $this->getAttributes((array)$attributes);
105
-        // add attributes to template args
106
-        $this->template_args['show_gravatar'] = $attributes['show_gravatar'];
107
-        // add required objects: event, datetime, and ticket
108
-        $this->template_args['event'] = $this->getEventAndQueryParams($attributes);
109
-        $this->template_args['datetime'] = $this->getDatetimeAndQueryParams($attributes);
110
-        $this->template_args['ticket'] = $this->getTicketAndQueryParams($attributes);
111
-
112
-        // if any of the above objects is invalid or missing,
113
-        // then there was an invalid parameter or the shortcode was used incorrectly
114
-        // so when WP_DEBUG is set and true, we'll show a message,
115
-        // otherwise we'll just return an empty string.
116
-         if (
117
-            ! $this->template_args['event'] instanceof EE_Event
118
-            || empty($this->query_params[0])
119
-            || ($attributes['datetime_id'] && ! $this->template_args['datetime'] instanceof EE_Datetime)
120
-            || ($attributes['ticket_id'] && ! $this->template_args['ticket'] instanceof EE_Ticket)
121
-        ) {
122
-            if (WP_DEBUG) {
123
-                return '<div class="important-notice ee-attention">'
124
-                       . esc_html__('The [ESPRESSO_EVENT_ATTENDEES] shortcode has been used incorrectly.  Please double check the arguments you used for any typos.  In the case of ID type arguments, its possible the given ID does not correspond to existing data in the database.',
125
-                        'event_espresso')
126
-                       . '</div>';
127
-            } else {
128
-                return '';
129
-            }
130
-        }
131
-        $this->setAdditionalQueryParams($attributes);
132
-        //get contacts!
133
-        $this->template_args['contacts'] = EEM_Attendee::instance()->get_all($this->query_params);
134
-        //all set let's load up the template and return.
135
-        return EEH_Template::locate_template('loop-espresso_event_attendees.php', $this->template_args, true, true);
136
-    }
137
-
138
-
139
-
140
-    /**
141
-     * merge incoming attributes with filtered defaults
142
-     *
143
-     * @param array $attributes
144
-     * @return array
145
-     */
146
-    private function getAttributes(array $attributes)
147
-    {
148
-        return array_merge(
149
-            (array) apply_filters(
150
-                'EES_Espresso_Event_Attendees__process_shortcode__default_shortcode_atts',
151
-                array(
152
-                    'event_id'      => null,
153
-                    'datetime_id'   => null,
154
-                    'ticket_id'     => null,
155
-                    'status'        => EEM_Registration::status_id_approved,
156
-                    'show_gravatar' => false
157
-                )
158
-            ),
159
-            $attributes
160
-        );
161
-    }
162
-
163
-
164
-
165
-    /**
166
-     * @param array $attributes
167
-     * @return EE_Event|null
168
-     * @throws \EE_Error
169
-     */
170
-    private function getEventAndQueryParams(array $attributes){
171
-        if ( ! empty($attributes['event_id'])) {
172
-            $event = EEM_Event::instance()->get_one_by_ID($attributes['event_id']);
173
-            if ($event instanceof EE_Event) {
174
-                $this->query_params[0]['Registration.EVT_ID'] = $attributes['event_id'];
175
-                return $event;
176
-            }
177
-        }
178
-        //seems like is_espresso_event_single() isn't working as expected. So using alternate method.
179
-        if (is_single() && is_espresso_event()) {
180
-            $event = EEH_Event_View::get_event();
181
-            if ($event instanceof EE_Event) {
182
-                $this->query_params[0]['Registration.EVT_ID'] = $event->ID();
183
-                return $event;
184
-            }
185
-        }
186
-        // one last shot...
187
-        // try getting the earliest active event
188
-        $events = EEM_Event::instance()->get_active_events(array(
189
-            'limit'    => 1,
190
-            'order_by' => array('Datetime.DTT_EVT_start' => 'ASC')
191
-        ));
192
-        //  if none then get the next upcoming
193
-        $events = empty($events)
194
-            ? EEM_Event::instance()->get_upcoming_events(array(
195
-                'limit'    => 1,
196
-                'order_by' => array('Datetime.DTT_EVT_start' => 'ASC')
197
-            ))
198
-            : $events;
199
-        $event = reset($events);
200
-        if ($event instanceof EE_Event) {
201
-            $this->query_params[0]['Registration.EVT_ID'] = $event->ID();
202
-            return $event;
203
-        }
204
-        return null;
205
-    }
206
-
207
-
208
-
209
-    /**
210
-     * @param array $attributes
211
-     * @return EE_Datetime|null
212
-     */
213
-    private function getDatetimeAndQueryParams(array $attributes)
214
-    {
215
-        if ( ! empty($attributes['datetime_id'])) {
216
-            $datetime = EEM_Datetime::instance()->get_one_by_ID($attributes['datetime_id']);
217
-            if ($datetime instanceof EE_Datetime) {
218
-                $this->query_params[0]['Registration.Ticket.Datetime.DTT_ID'] = $attributes['datetime_id'];
219
-                $this->query_params['default_where_conditions'] = 'this_model_only';
220
-                if ( ! $this->template_args['event'] instanceof EE_Event) {
221
-                    $this->template_args['event'] = $datetime->event();
222
-                }
223
-                return $datetime;
224
-            }
225
-        }
226
-        return null;
227
-    }
228
-
229
-
230
-
231
-    /**
232
-     * @param array $attributes
233
-     * @return \EE_Base_Class|null
234
-     * @throws \EE_Error
235
-     */
236
-    private function getTicketAndQueryParams(array $attributes)
237
-    {
238
-        if ( ! empty($attributes['ticket_id']) && empty($attributes['event_id']) && empty($attributes['datetime_id'])) {
239
-            $ticket = EEM_Ticket::instance()->get_one_by_ID($attributes['ticket_id']);
240
-            if ($ticket instanceof EE_Ticket) {
241
-                $this->query_params[0]['Registration.TKT_ID'] = $attributes['ticket_id'];
242
-                if ( ! $this->template_args['event'] instanceof EE_Event) {
243
-                    $this->template_args['event'] = $ticket->first_datetime() instanceof EE_Datetime
244
-                        ? $ticket->first_datetime()->event()
245
-                        : null;
246
-                }
247
-                return $ticket;
248
-            }
249
-        }
250
-        return null;
251
-    }
252
-
253
-
254
-
255
-    /**
256
-     * @param array $attributes
257
-     */
258
-    private function setAdditionalQueryParams(array $attributes)
259
-    {
260
-        $reg_status_array = EEM_Registration::reg_status_array();
261
-        if ($attributes['status'] !== 'all' && isset($reg_status_array[$attributes['status']])) {
262
-            $this->query_params[0]['Registration.STS_ID'] = $attributes['status'];
263
-        }
264
-        $this->query_params['group_by'] = array('ATT_ID');
265
-        $this->query_params['order_by'] = (array) apply_filters(
266
-            'FHEE__EES_Espresso_Event_Attendees__process_shortcode__order_by',
267
-            array('ATT_lname' => 'ASC', 'ATT_fname' => 'ASC')
268
-        );
269
-    }
31
+	private $query_params = array(
32
+		0 => array()
33
+	);
34
+
35
+	private $template_args = array(
36
+		'contacts'      => array(),
37
+		'event'         => null,
38
+		'datetime'      => null,
39
+		'ticket'        => null,
40
+	);
41
+
42
+	/**
43
+	 * the actual shortcode tag that gets registered with WordPress
44
+	 *
45
+	 * @return string
46
+	 */
47
+	public function getTag()
48
+	{
49
+		return 'ESPRESSO_EVENT_ATTENDEES';
50
+	}
51
+
52
+
53
+
54
+	/**
55
+	 * the time in seconds to cache the results of the processShortcode() method
56
+	 * 0 means the processShortcode() results will NOT be cached at all
57
+	 *
58
+	 * @return int
59
+	 */
60
+	public function cacheExpiration()
61
+	{
62
+		return 0;
63
+	}
64
+
65
+
66
+
67
+	/**
68
+	 * a place for adding any initialization code that needs to run prior to wp_header().
69
+	 * this may be required for shortcodes that utilize a corresponding module,
70
+	 * and need to enqueue assets for that module
71
+	 *
72
+	 * @return void
73
+	 */
74
+	public function initializeShortcode()
75
+	{
76
+		$this->shortcodeHasBeenInitialized();
77
+	}
78
+
79
+
80
+
81
+	/**
82
+	 * process_shortcode - ESPRESSO_EVENT_ATTENDEES - Returns a list of attendees to an event.
83
+	 *  [ESPRESSO_EVENT_ATTENDEES] - defaults to attendees for earliest active event, or earliest upcoming event.
84
+	 *  [ESPRESSO_EVENT_ATTENDEES event_id=123] - attendees for specific event.
85
+	 *  [ESPRESSO_EVENT_ATTENDEES datetime_id=245] - attendees for a specific datetime.
86
+	 *  [ESPRESSO_EVENT_ATTENDEES ticket_id=123] - attendees for a specific ticket.
87
+	 *  [ESPRESSO_EVENT_ATTENDEES status=all] - specific registration status (use status id) or all for all attendees
88
+	 *                                          regardless of status.  Note default is to only return approved attendees
89
+	 *  [ESPRESSO_EVENT_ATTENDEES show_gravatar=true] - default is to not return gravatar.  Otherwise if this is set
90
+	 *                                                  then return gravatar for email address given.
91
+	 *  Note: because of the relationship between event_id, ticket_id, and datetime_id.
92
+	 * If more than one of those params is included then preference is given to the following:
93
+	 *  - event_id is used whenever its present and any others are ignored.
94
+	 *  - if no event_id then datetime is used whenever its present and any others are ignored.
95
+	 *  - otherwise ticket_id is used if present.
96
+	 *
97
+	 * @param array $attributes
98
+	 * @return string
99
+	 * @throws \EE_Error
100
+	 */
101
+	public function processShortcode($attributes = array())
102
+	{
103
+		// grab attributes and merge with defaults
104
+		$attributes = $this->getAttributes((array)$attributes);
105
+		// add attributes to template args
106
+		$this->template_args['show_gravatar'] = $attributes['show_gravatar'];
107
+		// add required objects: event, datetime, and ticket
108
+		$this->template_args['event'] = $this->getEventAndQueryParams($attributes);
109
+		$this->template_args['datetime'] = $this->getDatetimeAndQueryParams($attributes);
110
+		$this->template_args['ticket'] = $this->getTicketAndQueryParams($attributes);
111
+
112
+		// if any of the above objects is invalid or missing,
113
+		// then there was an invalid parameter or the shortcode was used incorrectly
114
+		// so when WP_DEBUG is set and true, we'll show a message,
115
+		// otherwise we'll just return an empty string.
116
+		 if (
117
+			! $this->template_args['event'] instanceof EE_Event
118
+			|| empty($this->query_params[0])
119
+			|| ($attributes['datetime_id'] && ! $this->template_args['datetime'] instanceof EE_Datetime)
120
+			|| ($attributes['ticket_id'] && ! $this->template_args['ticket'] instanceof EE_Ticket)
121
+		) {
122
+			if (WP_DEBUG) {
123
+				return '<div class="important-notice ee-attention">'
124
+					   . esc_html__('The [ESPRESSO_EVENT_ATTENDEES] shortcode has been used incorrectly.  Please double check the arguments you used for any typos.  In the case of ID type arguments, its possible the given ID does not correspond to existing data in the database.',
125
+						'event_espresso')
126
+					   . '</div>';
127
+			} else {
128
+				return '';
129
+			}
130
+		}
131
+		$this->setAdditionalQueryParams($attributes);
132
+		//get contacts!
133
+		$this->template_args['contacts'] = EEM_Attendee::instance()->get_all($this->query_params);
134
+		//all set let's load up the template and return.
135
+		return EEH_Template::locate_template('loop-espresso_event_attendees.php', $this->template_args, true, true);
136
+	}
137
+
138
+
139
+
140
+	/**
141
+	 * merge incoming attributes with filtered defaults
142
+	 *
143
+	 * @param array $attributes
144
+	 * @return array
145
+	 */
146
+	private function getAttributes(array $attributes)
147
+	{
148
+		return array_merge(
149
+			(array) apply_filters(
150
+				'EES_Espresso_Event_Attendees__process_shortcode__default_shortcode_atts',
151
+				array(
152
+					'event_id'      => null,
153
+					'datetime_id'   => null,
154
+					'ticket_id'     => null,
155
+					'status'        => EEM_Registration::status_id_approved,
156
+					'show_gravatar' => false
157
+				)
158
+			),
159
+			$attributes
160
+		);
161
+	}
162
+
163
+
164
+
165
+	/**
166
+	 * @param array $attributes
167
+	 * @return EE_Event|null
168
+	 * @throws \EE_Error
169
+	 */
170
+	private function getEventAndQueryParams(array $attributes){
171
+		if ( ! empty($attributes['event_id'])) {
172
+			$event = EEM_Event::instance()->get_one_by_ID($attributes['event_id']);
173
+			if ($event instanceof EE_Event) {
174
+				$this->query_params[0]['Registration.EVT_ID'] = $attributes['event_id'];
175
+				return $event;
176
+			}
177
+		}
178
+		//seems like is_espresso_event_single() isn't working as expected. So using alternate method.
179
+		if (is_single() && is_espresso_event()) {
180
+			$event = EEH_Event_View::get_event();
181
+			if ($event instanceof EE_Event) {
182
+				$this->query_params[0]['Registration.EVT_ID'] = $event->ID();
183
+				return $event;
184
+			}
185
+		}
186
+		// one last shot...
187
+		// try getting the earliest active event
188
+		$events = EEM_Event::instance()->get_active_events(array(
189
+			'limit'    => 1,
190
+			'order_by' => array('Datetime.DTT_EVT_start' => 'ASC')
191
+		));
192
+		//  if none then get the next upcoming
193
+		$events = empty($events)
194
+			? EEM_Event::instance()->get_upcoming_events(array(
195
+				'limit'    => 1,
196
+				'order_by' => array('Datetime.DTT_EVT_start' => 'ASC')
197
+			))
198
+			: $events;
199
+		$event = reset($events);
200
+		if ($event instanceof EE_Event) {
201
+			$this->query_params[0]['Registration.EVT_ID'] = $event->ID();
202
+			return $event;
203
+		}
204
+		return null;
205
+	}
206
+
207
+
208
+
209
+	/**
210
+	 * @param array $attributes
211
+	 * @return EE_Datetime|null
212
+	 */
213
+	private function getDatetimeAndQueryParams(array $attributes)
214
+	{
215
+		if ( ! empty($attributes['datetime_id'])) {
216
+			$datetime = EEM_Datetime::instance()->get_one_by_ID($attributes['datetime_id']);
217
+			if ($datetime instanceof EE_Datetime) {
218
+				$this->query_params[0]['Registration.Ticket.Datetime.DTT_ID'] = $attributes['datetime_id'];
219
+				$this->query_params['default_where_conditions'] = 'this_model_only';
220
+				if ( ! $this->template_args['event'] instanceof EE_Event) {
221
+					$this->template_args['event'] = $datetime->event();
222
+				}
223
+				return $datetime;
224
+			}
225
+		}
226
+		return null;
227
+	}
228
+
229
+
230
+
231
+	/**
232
+	 * @param array $attributes
233
+	 * @return \EE_Base_Class|null
234
+	 * @throws \EE_Error
235
+	 */
236
+	private function getTicketAndQueryParams(array $attributes)
237
+	{
238
+		if ( ! empty($attributes['ticket_id']) && empty($attributes['event_id']) && empty($attributes['datetime_id'])) {
239
+			$ticket = EEM_Ticket::instance()->get_one_by_ID($attributes['ticket_id']);
240
+			if ($ticket instanceof EE_Ticket) {
241
+				$this->query_params[0]['Registration.TKT_ID'] = $attributes['ticket_id'];
242
+				if ( ! $this->template_args['event'] instanceof EE_Event) {
243
+					$this->template_args['event'] = $ticket->first_datetime() instanceof EE_Datetime
244
+						? $ticket->first_datetime()->event()
245
+						: null;
246
+				}
247
+				return $ticket;
248
+			}
249
+		}
250
+		return null;
251
+	}
252
+
253
+
254
+
255
+	/**
256
+	 * @param array $attributes
257
+	 */
258
+	private function setAdditionalQueryParams(array $attributes)
259
+	{
260
+		$reg_status_array = EEM_Registration::reg_status_array();
261
+		if ($attributes['status'] !== 'all' && isset($reg_status_array[$attributes['status']])) {
262
+			$this->query_params[0]['Registration.STS_ID'] = $attributes['status'];
263
+		}
264
+		$this->query_params['group_by'] = array('ATT_ID');
265
+		$this->query_params['order_by'] = (array) apply_filters(
266
+			'FHEE__EES_Espresso_Event_Attendees__process_shortcode__order_by',
267
+			array('ATT_lname' => 'ASC', 'ATT_fname' => 'ASC')
268
+		);
269
+	}
270 270
 
271 271
 
272 272
 
Please login to merge, or discard this patch.
core/domain/entities/shortcodes/EspressoTicketSelector.php 1 patch
Indentation   +76 added lines, -76 removed lines patch added patch discarded remove patch
@@ -24,82 +24,82 @@
 block discarded – undo
24 24
 
25 25
 
26 26
 
27
-    /**
28
-     * the actual shortcode tag that gets registered with WordPress
29
-     *
30
-     * @return string
31
-     */
32
-    public function getTag()
33
-    {
34
-        return 'ESPRESSO_TICKET_SELECTOR';
35
-    }
36
-
37
-
38
-
39
-    /**
40
-     * the time in seconds to cache the results of the processShortcode() method
41
-     * 0 means the processShortcode() results will NOT be cached at all
42
-     *
43
-     * @return int
44
-     */
45
-    public function cacheExpiration()
46
-    {
47
-        return 0;
48
-    }
49
-
50
-
51
-    /**
52
-     * a place for adding any initialization code that needs to run prior to wp_header().
53
-     * this may be required for shortcodes that utilize a corresponding module,
54
-     * and need to enqueue assets for that module
55
-     *
56
-     * @return void
57
-     */
58
-    public function initializeShortcode()
59
-    {
60
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
61
-        $this->shortcodeHasBeenInitialized();
62
-    }
63
-
64
-
65
-
66
-    /**
67
-     * callback that runs when the shortcode is encountered in post content.
68
-     * IMPORTANT !!!
69
-     * remember that shortcode content should be RETURNED and NOT echoed out
70
-     *
71
-     * @param array $attributes
72
-     * @return string
73
-     * @throws InvalidArgumentException
74
-     */
75
-    public function processShortcode($attributes = array())
76
-    {
77
-        extract($attributes, EXTR_OVERWRITE);
78
-        $event_id = isset($event_id) ? $event_id : 0;
79
-        $event = EE_Registry::instance()->load_model('Event')->get_one_by_ID($event_id);
80
-        if (! $event instanceof EE_Event) {
81
-            new ExceptionStackTraceDisplay(
82
-                new InvalidArgumentException(
83
-                    sprintf(
84
-                        esc_html__(
85
-                            'A valid Event ID is required to use the "%1$s" shortcode.%4$sAn Event with an ID of "%2$s" could not be found.%4$sPlease verify that the shortcode added to this post\'s content includes an "%3$s" argument and that it\'s value corresponds to a valid Event ID.',
86
-                            'event_espresso'
87
-                        ),
88
-                        $this->getTag(),
89
-                        $event_id,
90
-                        'event_id',
91
-                        '<br />'
92
-                    )
93
-                )
94
-            );
95
-            return '';
96
-        }
97
-        ob_start();
98
-        do_action('AHEE_event_details_before_post', $event_id);
99
-        espresso_ticket_selector($event);
100
-        do_action('AHEE_event_details_after_post');
101
-        return ob_get_clean();
102
-    }
27
+	/**
28
+	 * the actual shortcode tag that gets registered with WordPress
29
+	 *
30
+	 * @return string
31
+	 */
32
+	public function getTag()
33
+	{
34
+		return 'ESPRESSO_TICKET_SELECTOR';
35
+	}
36
+
37
+
38
+
39
+	/**
40
+	 * the time in seconds to cache the results of the processShortcode() method
41
+	 * 0 means the processShortcode() results will NOT be cached at all
42
+	 *
43
+	 * @return int
44
+	 */
45
+	public function cacheExpiration()
46
+	{
47
+		return 0;
48
+	}
49
+
50
+
51
+	/**
52
+	 * a place for adding any initialization code that needs to run prior to wp_header().
53
+	 * this may be required for shortcodes that utilize a corresponding module,
54
+	 * and need to enqueue assets for that module
55
+	 *
56
+	 * @return void
57
+	 */
58
+	public function initializeShortcode()
59
+	{
60
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
61
+		$this->shortcodeHasBeenInitialized();
62
+	}
63
+
64
+
65
+
66
+	/**
67
+	 * callback that runs when the shortcode is encountered in post content.
68
+	 * IMPORTANT !!!
69
+	 * remember that shortcode content should be RETURNED and NOT echoed out
70
+	 *
71
+	 * @param array $attributes
72
+	 * @return string
73
+	 * @throws InvalidArgumentException
74
+	 */
75
+	public function processShortcode($attributes = array())
76
+	{
77
+		extract($attributes, EXTR_OVERWRITE);
78
+		$event_id = isset($event_id) ? $event_id : 0;
79
+		$event = EE_Registry::instance()->load_model('Event')->get_one_by_ID($event_id);
80
+		if (! $event instanceof EE_Event) {
81
+			new ExceptionStackTraceDisplay(
82
+				new InvalidArgumentException(
83
+					sprintf(
84
+						esc_html__(
85
+							'A valid Event ID is required to use the "%1$s" shortcode.%4$sAn Event with an ID of "%2$s" could not be found.%4$sPlease verify that the shortcode added to this post\'s content includes an "%3$s" argument and that it\'s value corresponds to a valid Event ID.',
86
+							'event_espresso'
87
+						),
88
+						$this->getTag(),
89
+						$event_id,
90
+						'event_id',
91
+						'<br />'
92
+					)
93
+				)
94
+			);
95
+			return '';
96
+		}
97
+		ob_start();
98
+		do_action('AHEE_event_details_before_post', $event_id);
99
+		espresso_ticket_selector($event);
100
+		do_action('AHEE_event_details_after_post');
101
+		return ob_get_clean();
102
+	}
103 103
 
104 104
 
105 105
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/EventsAdmin.php 1 patch
Indentation   +105 added lines, -105 removed lines patch added patch discarded remove patch
@@ -14,109 +14,109 @@
 block discarded – undo
14 14
 trait EventsAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * @param string $additional_params
19
-     */
20
-    public function amOnDefaultEventsListTablePage($additional_params = '')
21
-    {
22
-        $this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
-    }
24
-
25
-
26
-    /**
27
-     * Triggers the publishing of the Event.
28
-     */
29
-    public function publishEvent()
30
-    {
31
-        $this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
-    }
33
-
34
-
35
-    /**
36
-     * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
-     * First this will search using the given title and then attempt to edit from the results of the search.
38
-     *
39
-     * Assumes actor is already logged in.
40
-     * @param $event_title
41
-     */
42
-    public function amEditingTheEventWithTitle($event_title)
43
-    {
44
-        $this->amOnDefaultEventsListTablePage();
45
-        $this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
-        $this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
-        $this->actor()->waitForText('Displaying search results for');
48
-        $this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
-    }
50
-
51
-
52
-    /**
53
-     * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
-     * link for the event in the event list table.
55
-     * Assumes the actor is already logged in and on the Event list table page.
56
-     *
57
-     * @param string $event_title
58
-     */
59
-    public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
-    {
61
-        $this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
-        $this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
-    }
64
-
65
-
66
-    /**
67
-     * This performs the click action on the gear icon that triggers the advanced settings view state.
68
-     * Assumes the actor is already logged in and editing an event.
69
-     *
70
-     * @param int $row_number  What ticket row to toggle open/close.
71
-     */
72
-    public function toggleAdvancedSettingsViewForTicketRow($row_number = 1)
73
-    {
74
-        $this->actor()->click(EventsPage::eventEditorTicketAdvancedDetailsSelector($row_number));
75
-    }
76
-
77
-
78
-    /**
79
-     * Toggles the TKT_is_taxable checkbox for the ticket in the given row.
80
-     * Assumes the actor is already logged in and editing an event and that the advanced settings view state for that
81
-     * ticket is "open".
82
-     *
83
-     * @param int $row_number  What ticket row to toggle the checkbox for.
84
-     */
85
-    public function toggleTicketIsTaxableForTicketRow($row_number = 1)
86
-    {
87
-        $this->actor()->click(EventsPage::eventEditorTicketTaxableCheckboxSelector($row_number));
88
-    }
89
-
90
-
91
-    /**
92
-     * Use to change the default registration status for the event.
93
-     * Assumes the view is already on the event editor.
94
-     * @param $registration_status
95
-     */
96
-    public function changeDefaultRegistrationStatusTo($registration_status)
97
-    {
98
-        $this->actor()->selectOption(
99
-            EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
100
-            $registration_status
101
-        );
102
-    }
103
-
104
-
105
-    /**
106
-     * Use this from the context of the event editor to select the given custom template for a given message type and
107
-     * messenger.
108
-     *
109
-     * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
110
-     * @param string $messenger_slug      The slug for the messenger (eg 'email')
111
-     * @param string $custom_template_label The visible label in the select input for the custom template you want
112
-     *                                      selected.
113
-     */
114
-    public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
115
-    {
116
-        $this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
117
-        $this->actor()->selectOption(
118
-            EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
119
-            $custom_template_label
120
-        );
121
-    }
17
+	/**
18
+	 * @param string $additional_params
19
+	 */
20
+	public function amOnDefaultEventsListTablePage($additional_params = '')
21
+	{
22
+		$this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
+	}
24
+
25
+
26
+	/**
27
+	 * Triggers the publishing of the Event.
28
+	 */
29
+	public function publishEvent()
30
+	{
31
+		$this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
+	}
33
+
34
+
35
+	/**
36
+	 * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
+	 * First this will search using the given title and then attempt to edit from the results of the search.
38
+	 *
39
+	 * Assumes actor is already logged in.
40
+	 * @param $event_title
41
+	 */
42
+	public function amEditingTheEventWithTitle($event_title)
43
+	{
44
+		$this->amOnDefaultEventsListTablePage();
45
+		$this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
+		$this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
+		$this->actor()->waitForText('Displaying search results for');
48
+		$this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
+	}
50
+
51
+
52
+	/**
53
+	 * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
+	 * link for the event in the event list table.
55
+	 * Assumes the actor is already logged in and on the Event list table page.
56
+	 *
57
+	 * @param string $event_title
58
+	 */
59
+	public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
+	{
61
+		$this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
+		$this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
+	}
64
+
65
+
66
+	/**
67
+	 * This performs the click action on the gear icon that triggers the advanced settings view state.
68
+	 * Assumes the actor is already logged in and editing an event.
69
+	 *
70
+	 * @param int $row_number  What ticket row to toggle open/close.
71
+	 */
72
+	public function toggleAdvancedSettingsViewForTicketRow($row_number = 1)
73
+	{
74
+		$this->actor()->click(EventsPage::eventEditorTicketAdvancedDetailsSelector($row_number));
75
+	}
76
+
77
+
78
+	/**
79
+	 * Toggles the TKT_is_taxable checkbox for the ticket in the given row.
80
+	 * Assumes the actor is already logged in and editing an event and that the advanced settings view state for that
81
+	 * ticket is "open".
82
+	 *
83
+	 * @param int $row_number  What ticket row to toggle the checkbox for.
84
+	 */
85
+	public function toggleTicketIsTaxableForTicketRow($row_number = 1)
86
+	{
87
+		$this->actor()->click(EventsPage::eventEditorTicketTaxableCheckboxSelector($row_number));
88
+	}
89
+
90
+
91
+	/**
92
+	 * Use to change the default registration status for the event.
93
+	 * Assumes the view is already on the event editor.
94
+	 * @param $registration_status
95
+	 */
96
+	public function changeDefaultRegistrationStatusTo($registration_status)
97
+	{
98
+		$this->actor()->selectOption(
99
+			EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
100
+			$registration_status
101
+		);
102
+	}
103
+
104
+
105
+	/**
106
+	 * Use this from the context of the event editor to select the given custom template for a given message type and
107
+	 * messenger.
108
+	 *
109
+	 * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
110
+	 * @param string $messenger_slug      The slug for the messenger (eg 'email')
111
+	 * @param string $custom_template_label The visible label in the select input for the custom template you want
112
+	 *                                      selected.
113
+	 */
114
+	public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
115
+	{
116
+		$this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
117
+		$this->actor()->selectOption(
118
+			EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
119
+			$custom_template_label
120
+		);
121
+	}
122 122
 }
123 123
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Helpers/MessagesAdmin.php 1 patch
Indentation   +233 added lines, -233 removed lines patch added patch discarded remove patch
@@ -10,237 +10,237 @@
 block discarded – undo
10 10
  */
11 11
 trait MessagesAdmin
12 12
 {
13
-    /**
14
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
15
-     *                                  a string.
16
-     */
17
-    public function amOnMessagesActivityListTablePage($additional_params = '')
18
-    {
19
-        $this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
-    }
21
-
22
-    /**
23
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
24
-     *                                  a string.
25
-     */
26
-    public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
-    {
28
-        $this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
-    }
30
-
31
-
32
-    /**
33
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
34
-     *                                  a string.
35
-     */
36
-    public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
-    {
38
-        $this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
-    }
40
-
41
-
42
-    /**
43
-     * Directs to message settings page
44
-     */
45
-    public function amOnMessageSettingsPage()
46
-    {
47
-        $this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
-    }
49
-
50
-
51
-    public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
-    {
53
-        $this->actor()->dragAndDrop(
54
-            MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
-            MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
-        );
57
-    }
58
-
59
-
60
-    /**
61
-     * Assumes you are already on the list table page that has the ui for editing the template.
62
-     * @param string $message_type_slug
63
-     * @param string $context [optional] if you want to click directly to the given context in the editor
64
-     */
65
-    public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
-    {
67
-        $this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
-    }
69
-
70
-
71
-    /**
72
-     * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
-     * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
-     *
75
-     * @param int    $expected_occurence_count
76
-     * @param string $text_to_check_for
77
-     * @param string $field
78
-     * @param string $message_type_label
79
-     * @param string $message_status
80
-     * @param string $messenger
81
-     * @param string $context
82
-     */
83
-    public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
-        $expected_occurence_count,
85
-        $text_to_check_for,
86
-        $field,
87
-        $message_type_label,
88
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
-        $messenger = 'Email',
90
-        $context = 'Event Admin'
91
-    ) {
92
-        $elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
-            $field,
94
-            $message_type_label,
95
-            $message_status,
96
-            $messenger,
97
-            $context,
98
-            $text_to_check_for,
99
-            0
100
-        ));
101
-        $actual_count = count($elements);
102
-        $this->actor()->assertEquals(
103
-            $expected_occurence_count,
104
-            $actual_count,
105
-            sprintf(
106
-                'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
-                $expected_occurence_count,
108
-                $text_to_check_for,
109
-                $field,
110
-                $actual_count
111
-            )
112
-        );
113
-    }
114
-
115
-
116
-    /**
117
-     * This will create a custom message template for the given messenger and message type from the context of the
118
-     * default (global) message template list table.
119
-     * Also takes care of verifying the template was created.
120
-     * @param string $message_type_label
121
-     * @param string $messenger_label
122
-     */
123
-    public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
-    {
125
-        $this->amOnDefaultMessageTemplateListTablePage();
126
-        $this->actor()->click(
127
-            MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
-                $message_type_label,
129
-                $messenger_label
130
-            )
131
-        );
132
-        $this->actor()->seeInField('#title', 'New Custom Template');
133
-    }
134
-
135
-
136
-    /**
137
-     * This switches the context of the current messages template to the given reference.
138
-     * @param string $context_reference  This should be the visible label for the option.
139
-     */
140
-    public function switchContextTo($context_reference)
141
-    {
142
-        $this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
-        $this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
-        $this->actor()->waitForText($context_reference, 10, 'h1');
145
-    }
146
-
147
-
148
-    /**
149
-     * This takes care of clicking the View Message icon for the given parameters.
150
-     * Assumes you are already viewing the messages activity list table.
151
-     * @param        $message_type_label
152
-     * @param        $message_status
153
-     * @param string $messenger
154
-     * @param string $context
155
-     * @param int    $number_in_set
156
-     */
157
-    public function viewMessageInMessagesListTableFor(
158
-        $message_type_label,
159
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
-        $messenger = 'Email',
161
-        $context = 'Event Admin',
162
-        $number_in_set = 1
163
-    ) {
164
-        $this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
-            $message_type_label,
166
-            $message_status,
167
-            $messenger,
168
-            $context,
169
-            $number_in_set
170
-        ));
171
-    }
172
-
173
-
174
-    /**
175
-     * Takes care of deleting a message matching the given parameters via the message activity list table.
176
-     * Assumes you are already viewing the messages activity list table.
177
-     * @param        $message_type_label
178
-     * @param        $message_status
179
-     * @param string $messenger
180
-     * @param string $context
181
-     * @param int    $number_in_set
182
-     */
183
-    public function deleteMessageInMessagesListTableFor(
184
-        $message_type_label,
185
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
-        $messenger = 'Email',
187
-        $context = 'Event Admin',
188
-        $number_in_set = 1
189
-    ) {
190
-        $this->actor()->moveMouseOver(
191
-            MessagesPage::messagesActivityListTableCellSelectorFor(
192
-                'to',
193
-                $message_type_label,
194
-                $message_status,
195
-                $messenger,
196
-                $context,
197
-                '',
198
-                $number_in_set
199
-            )
200
-        );
201
-        $this->actor()->waitForElementVisible(
202
-            MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
-                $message_type_label,
204
-                $message_status,
205
-                $messenger,
206
-                $context,
207
-                $number_in_set
208
-            )
209
-        );
210
-        $this->actor()->click(
211
-            MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
212
-                $message_type_label,
213
-                $message_status,
214
-                $messenger,
215
-                $context,
216
-                $number_in_set
217
-            )
218
-        );
219
-        $this->actor()->waitForText('successfully deleted');
220
-    }
221
-
222
-
223
-    /**
224
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
225
-     * list table, this will take care of validating the given text is in that window.
226
-     * @param string $text_to_view
227
-     */
228
-    public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
229
-    {
230
-        $this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
231
-        $this->actor()->switchToIframe('message-view-window');
232
-        $should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
233
-        $this->actor()->switchToIframe();
234
-    }
235
-
236
-
237
-    /**
238
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
239
-     * list table, this will take care of validating the given text is NOT that window.
240
-     * @param string $text_to_view
241
-     */
242
-    public function dontSeeTextInViewMessageModal($text_to_view)
243
-    {
244
-        $this->seeTextInViewMessageModal($text_to_view, true);
245
-    }
13
+	/**
14
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
15
+	 *                                  a string.
16
+	 */
17
+	public function amOnMessagesActivityListTablePage($additional_params = '')
18
+	{
19
+		$this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
+	}
21
+
22
+	/**
23
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
24
+	 *                                  a string.
25
+	 */
26
+	public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
+	{
28
+		$this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
+	}
30
+
31
+
32
+	/**
33
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
34
+	 *                                  a string.
35
+	 */
36
+	public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
+	{
38
+		$this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
+	}
40
+
41
+
42
+	/**
43
+	 * Directs to message settings page
44
+	 */
45
+	public function amOnMessageSettingsPage()
46
+	{
47
+		$this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
+	}
49
+
50
+
51
+	public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
+	{
53
+		$this->actor()->dragAndDrop(
54
+			MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
+			MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
+		);
57
+	}
58
+
59
+
60
+	/**
61
+	 * Assumes you are already on the list table page that has the ui for editing the template.
62
+	 * @param string $message_type_slug
63
+	 * @param string $context [optional] if you want to click directly to the given context in the editor
64
+	 */
65
+	public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
+	{
67
+		$this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
+	}
69
+
70
+
71
+	/**
72
+	 * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
+	 * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
+	 *
75
+	 * @param int    $expected_occurence_count
76
+	 * @param string $text_to_check_for
77
+	 * @param string $field
78
+	 * @param string $message_type_label
79
+	 * @param string $message_status
80
+	 * @param string $messenger
81
+	 * @param string $context
82
+	 */
83
+	public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
+		$expected_occurence_count,
85
+		$text_to_check_for,
86
+		$field,
87
+		$message_type_label,
88
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
+		$messenger = 'Email',
90
+		$context = 'Event Admin'
91
+	) {
92
+		$elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
+			$field,
94
+			$message_type_label,
95
+			$message_status,
96
+			$messenger,
97
+			$context,
98
+			$text_to_check_for,
99
+			0
100
+		));
101
+		$actual_count = count($elements);
102
+		$this->actor()->assertEquals(
103
+			$expected_occurence_count,
104
+			$actual_count,
105
+			sprintf(
106
+				'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
+				$expected_occurence_count,
108
+				$text_to_check_for,
109
+				$field,
110
+				$actual_count
111
+			)
112
+		);
113
+	}
114
+
115
+
116
+	/**
117
+	 * This will create a custom message template for the given messenger and message type from the context of the
118
+	 * default (global) message template list table.
119
+	 * Also takes care of verifying the template was created.
120
+	 * @param string $message_type_label
121
+	 * @param string $messenger_label
122
+	 */
123
+	public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
+	{
125
+		$this->amOnDefaultMessageTemplateListTablePage();
126
+		$this->actor()->click(
127
+			MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
+				$message_type_label,
129
+				$messenger_label
130
+			)
131
+		);
132
+		$this->actor()->seeInField('#title', 'New Custom Template');
133
+	}
134
+
135
+
136
+	/**
137
+	 * This switches the context of the current messages template to the given reference.
138
+	 * @param string $context_reference  This should be the visible label for the option.
139
+	 */
140
+	public function switchContextTo($context_reference)
141
+	{
142
+		$this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
+		$this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
+		$this->actor()->waitForText($context_reference, 10, 'h1');
145
+	}
146
+
147
+
148
+	/**
149
+	 * This takes care of clicking the View Message icon for the given parameters.
150
+	 * Assumes you are already viewing the messages activity list table.
151
+	 * @param        $message_type_label
152
+	 * @param        $message_status
153
+	 * @param string $messenger
154
+	 * @param string $context
155
+	 * @param int    $number_in_set
156
+	 */
157
+	public function viewMessageInMessagesListTableFor(
158
+		$message_type_label,
159
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
+		$messenger = 'Email',
161
+		$context = 'Event Admin',
162
+		$number_in_set = 1
163
+	) {
164
+		$this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
+			$message_type_label,
166
+			$message_status,
167
+			$messenger,
168
+			$context,
169
+			$number_in_set
170
+		));
171
+	}
172
+
173
+
174
+	/**
175
+	 * Takes care of deleting a message matching the given parameters via the message activity list table.
176
+	 * Assumes you are already viewing the messages activity list table.
177
+	 * @param        $message_type_label
178
+	 * @param        $message_status
179
+	 * @param string $messenger
180
+	 * @param string $context
181
+	 * @param int    $number_in_set
182
+	 */
183
+	public function deleteMessageInMessagesListTableFor(
184
+		$message_type_label,
185
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
+		$messenger = 'Email',
187
+		$context = 'Event Admin',
188
+		$number_in_set = 1
189
+	) {
190
+		$this->actor()->moveMouseOver(
191
+			MessagesPage::messagesActivityListTableCellSelectorFor(
192
+				'to',
193
+				$message_type_label,
194
+				$message_status,
195
+				$messenger,
196
+				$context,
197
+				'',
198
+				$number_in_set
199
+			)
200
+		);
201
+		$this->actor()->waitForElementVisible(
202
+			MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
+				$message_type_label,
204
+				$message_status,
205
+				$messenger,
206
+				$context,
207
+				$number_in_set
208
+			)
209
+		);
210
+		$this->actor()->click(
211
+			MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
212
+				$message_type_label,
213
+				$message_status,
214
+				$messenger,
215
+				$context,
216
+				$number_in_set
217
+			)
218
+		);
219
+		$this->actor()->waitForText('successfully deleted');
220
+	}
221
+
222
+
223
+	/**
224
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
225
+	 * list table, this will take care of validating the given text is in that window.
226
+	 * @param string $text_to_view
227
+	 */
228
+	public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
229
+	{
230
+		$this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
231
+		$this->actor()->switchToIframe('message-view-window');
232
+		$should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
233
+		$this->actor()->switchToIframe();
234
+	}
235
+
236
+
237
+	/**
238
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
239
+	 * list table, this will take care of validating the given text is NOT that window.
240
+	 * @param string $text_to_view
241
+	 */
242
+	public function dontSeeTextInViewMessageModal($text_to_view)
243
+	{
244
+		$this->seeTextInViewMessageModal($text_to_view, true);
245
+	}
246 246
 }
Please login to merge, or discard this patch.
acceptance_tests/Page/EventsAdmin.php 1 patch
Indentation   +218 added lines, -218 removed lines patch added patch discarded remove patch
@@ -14,225 +14,225 @@
 block discarded – undo
14 14
 class EventsAdmin extends CoreAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * Selector for the Add new Event button in the admin.
19
-     * @var string
20
-     */
21
-    const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
-
23
-
24
-    /**
25
-     * Selector for the Event Title field in the event editor
26
-     * @var string
27
-     */
28
-    const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
-
30
-    /**
31
-     * Selector for the publish submit button in the event editor.
32
-     * @var string
33
-     */
34
-    const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
-
36
-
37
-    /**
38
-     * @var string
39
-     */
40
-    const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
-
42
-    /**
43
-     * Selector for the view link after publishing an event.
44
-     * @var string
45
-     */
46
-    const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
17
+	/**
18
+	 * Selector for the Add new Event button in the admin.
19
+	 * @var string
20
+	 */
21
+	const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
+
23
+
24
+	/**
25
+	 * Selector for the Event Title field in the event editor
26
+	 * @var string
27
+	 */
28
+	const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
+
30
+	/**
31
+	 * Selector for the publish submit button in the event editor.
32
+	 * @var string
33
+	 */
34
+	const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
+
36
+
37
+	/**
38
+	 * @var string
39
+	 */
40
+	const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
+
42
+	/**
43
+	 * Selector for the view link after publishing an event.
44
+	 * @var string
45
+	 */
46
+	const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
47 47
 
48
-
49
-    /**
50
-     * Selector for the ID of the event in the event editor
51
-     * @var string
52
-     */
53
-    const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
48
+
49
+	/**
50
+	 * Selector for the ID of the event in the event editor
51
+	 * @var string
52
+	 */
53
+	const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
54 54
 
55 55
 
56
-    /**
57
-     * Selector for the search input on the event list table page.
58
-     * @var string
59
-     */
60
-    const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
-
62
-
63
-
64
-
65
-    /**
66
-     * @param string $additional_params
67
-     * @return string
68
-     */
69
-    public static function defaultEventsListTableUrl($additional_params = '')
70
-    {
71
-        return self::adminUrl('espresso_events', 'default', $additional_params);
72
-    }
73
-
74
-
75
-    /**
76
-     * The selector for the DTTname field for the given row in the event editor.
77
-     * @param int $row_number
78
-     * @return string
79
-     */
80
-    public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
-    {
82
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
-    }
84
-
85
-
86
-    /**
87
-     * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
-     * @param int $row_number
89
-     * @return string
90
-     */
91
-    public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
-    {
93
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
-    }
95
-
96
-
97
-    /**
98
-     * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
-     *
100
-     * @param string $field_name
101
-     * @param int    $row_number
102
-     * @return string
103
-     */
104
-    public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
-    {
106
-        return "//input[@id='event-datetime-$field_name-$row_number']";
107
-    }
108
-
109
-
110
-    /**
111
-     * The selector for the TKT_name field for the given display row in the event editor.
112
-     * @param int $row_number
113
-     * @return string
114
-     */
115
-    public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
-    {
117
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
-    }
119
-
120
-
121
-    public static function eventEditorTicketPriceFieldSelector($row_number = 1)
122
-    {
123
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_base_price', $row_number);
124
-    }
125
-
126
-
127
-    public static function eventEditorTicketAdvancedDetailsSelector($row_number = 1)
128
-    {
129
-        return "//tr[@id='display-ticketrow-$row_number']//span[contains(@class, 'gear-icon')]";
130
-    }
131
-
132
-
133
-    public static function eventEditorTicketAdvancedDetailsSubtotalSelector($row_number = 1)
134
-    {
135
-        return "//span[@id='price-total-amount-$row_number']";
136
-    }
137
-
138
-
139
-    public static function eventEditorTicketAdvancedDetailsTotalSelector($row_number = 1)
140
-    {
141
-        return "//span[@id='price-total-amount-$row_number']";
142
-    }
143
-
144
-
145
-    public static function eventEditorTicketTaxableCheckboxSelector($row_number = 1)
146
-    {
147
-        return "//input[@id='edit-ticket-TKT_taxable-$row_number']";
148
-    }
149
-
150
-
151
-    /**
152
-     * This returns the xpath locater for the Tax amount display container within the advanced settings view for the
153
-     * given ticket (row) and the given tax id (PRC_ID).
154
-     *
155
-     * @param int $tax_id     The PRC_ID for the tax you want the locater for.  Note, this defaults to the default tax
156
-     *                        setup on a fresh install.
157
-     * @param int $row_number What row representing the ticket you want the locator for.
158
-     * @return string
159
-     */
160
-    public static function eventEditorTicketTaxAmountDisplayForTaxIdAndTicketRowSelector($tax_id = 2, $row_number = 1)
161
-    {
162
-        return "//span[@id='TKT-tax-amount-display-$tax_id-$row_number']";
163
-    }
164
-
165
-
166
-    /**
167
-     * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
168
-     * @param     $field_name
169
-     * @param int $row_number
170
-     * @return string
171
-     */
172
-    public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
173
-    {
174
-        return "//tr[@id='display-ticketrow-$row_number']//input[contains(@class, 'edit-ticket-$field_name')]";
175
-    }
176
-
177
-
178
-    /**
179
-     * Returns the selector for the event title edit link in the events list table for the given Event Title.
180
-     * @param string $event_title
181
-     * @return string
182
-     */
183
-    public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
184
-    {
185
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
186
-    }
187
-
188
-
189
-    /**
190
-     * Locator for for the ID column in the event list table for a given event title.
191
-     * @param string $event_title
192
-     * @return string
193
-     */
194
-    public static function eventListTableEventIdSelectorForTitle($event_title)
195
-    {
196
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
197
-               . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
198
-    }
199
-
200
-
201
-    /**
202
-     * Locator for the view link in the row of an event list table for the given event title.
203
-     * @param string $event_title
204
-     * @return string
205
-     */
206
-    public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
207
-    {
208
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
209
-               . "//ancestor::td//span[@class='view']/a";
210
-    }
211
-
212
-
213
-    /**
214
-     * Locator for the messenger tab in the Notifications metabox in the event editor.
215
-     * @param string $messenger_slug  The slug for the messenger (it's reference slug).
216
-     * @return string
217
-     */
218
-    public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
219
-    {
220
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
221
-               . "//a[@rel='ee-tab-$messenger_slug']";
222
-    }
223
-
224
-
225
-    /**
226
-     * Locator for the select input within the notifications metabox.
227
-     * Note, this assumes the tab content for the related messenger is already visible.
228
-     * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
229
-     * @return string
230
-     */
231
-    public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
232
-    {
233
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
234
-               . "//table[@class='messages-custom-template-switcher']"
235
-               . "//tr/td[contains(.,'Registration Approved')]"
236
-               . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
237
-    }
56
+	/**
57
+	 * Selector for the search input on the event list table page.
58
+	 * @var string
59
+	 */
60
+	const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
+
62
+
63
+
64
+
65
+	/**
66
+	 * @param string $additional_params
67
+	 * @return string
68
+	 */
69
+	public static function defaultEventsListTableUrl($additional_params = '')
70
+	{
71
+		return self::adminUrl('espresso_events', 'default', $additional_params);
72
+	}
73
+
74
+
75
+	/**
76
+	 * The selector for the DTTname field for the given row in the event editor.
77
+	 * @param int $row_number
78
+	 * @return string
79
+	 */
80
+	public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
+	{
82
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
+	}
84
+
85
+
86
+	/**
87
+	 * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
+	 * @param int $row_number
89
+	 * @return string
90
+	 */
91
+	public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
+	{
93
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
+	}
95
+
96
+
97
+	/**
98
+	 * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
+	 *
100
+	 * @param string $field_name
101
+	 * @param int    $row_number
102
+	 * @return string
103
+	 */
104
+	public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
+	{
106
+		return "//input[@id='event-datetime-$field_name-$row_number']";
107
+	}
108
+
109
+
110
+	/**
111
+	 * The selector for the TKT_name field for the given display row in the event editor.
112
+	 * @param int $row_number
113
+	 * @return string
114
+	 */
115
+	public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
+	{
117
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
+	}
119
+
120
+
121
+	public static function eventEditorTicketPriceFieldSelector($row_number = 1)
122
+	{
123
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_base_price', $row_number);
124
+	}
125
+
126
+
127
+	public static function eventEditorTicketAdvancedDetailsSelector($row_number = 1)
128
+	{
129
+		return "//tr[@id='display-ticketrow-$row_number']//span[contains(@class, 'gear-icon')]";
130
+	}
131
+
132
+
133
+	public static function eventEditorTicketAdvancedDetailsSubtotalSelector($row_number = 1)
134
+	{
135
+		return "//span[@id='price-total-amount-$row_number']";
136
+	}
137
+
138
+
139
+	public static function eventEditorTicketAdvancedDetailsTotalSelector($row_number = 1)
140
+	{
141
+		return "//span[@id='price-total-amount-$row_number']";
142
+	}
143
+
144
+
145
+	public static function eventEditorTicketTaxableCheckboxSelector($row_number = 1)
146
+	{
147
+		return "//input[@id='edit-ticket-TKT_taxable-$row_number']";
148
+	}
149
+
150
+
151
+	/**
152
+	 * This returns the xpath locater for the Tax amount display container within the advanced settings view for the
153
+	 * given ticket (row) and the given tax id (PRC_ID).
154
+	 *
155
+	 * @param int $tax_id     The PRC_ID for the tax you want the locater for.  Note, this defaults to the default tax
156
+	 *                        setup on a fresh install.
157
+	 * @param int $row_number What row representing the ticket you want the locator for.
158
+	 * @return string
159
+	 */
160
+	public static function eventEditorTicketTaxAmountDisplayForTaxIdAndTicketRowSelector($tax_id = 2, $row_number = 1)
161
+	{
162
+		return "//span[@id='TKT-tax-amount-display-$tax_id-$row_number']";
163
+	}
164
+
165
+
166
+	/**
167
+	 * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
168
+	 * @param     $field_name
169
+	 * @param int $row_number
170
+	 * @return string
171
+	 */
172
+	public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
173
+	{
174
+		return "//tr[@id='display-ticketrow-$row_number']//input[contains(@class, 'edit-ticket-$field_name')]";
175
+	}
176
+
177
+
178
+	/**
179
+	 * Returns the selector for the event title edit link in the events list table for the given Event Title.
180
+	 * @param string $event_title
181
+	 * @return string
182
+	 */
183
+	public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
184
+	{
185
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
186
+	}
187
+
188
+
189
+	/**
190
+	 * Locator for for the ID column in the event list table for a given event title.
191
+	 * @param string $event_title
192
+	 * @return string
193
+	 */
194
+	public static function eventListTableEventIdSelectorForTitle($event_title)
195
+	{
196
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
197
+			   . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
198
+	}
199
+
200
+
201
+	/**
202
+	 * Locator for the view link in the row of an event list table for the given event title.
203
+	 * @param string $event_title
204
+	 * @return string
205
+	 */
206
+	public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
207
+	{
208
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
209
+			   . "//ancestor::td//span[@class='view']/a";
210
+	}
211
+
212
+
213
+	/**
214
+	 * Locator for the messenger tab in the Notifications metabox in the event editor.
215
+	 * @param string $messenger_slug  The slug for the messenger (it's reference slug).
216
+	 * @return string
217
+	 */
218
+	public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
219
+	{
220
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
221
+			   . "//a[@rel='ee-tab-$messenger_slug']";
222
+	}
223
+
224
+
225
+	/**
226
+	 * Locator for the select input within the notifications metabox.
227
+	 * Note, this assumes the tab content for the related messenger is already visible.
228
+	 * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
229
+	 * @return string
230
+	 */
231
+	public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
232
+	{
233
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
234
+			   . "//table[@class='messages-custom-template-switcher']"
235
+			   . "//tr/td[contains(.,'Registration Approved')]"
236
+			   . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
237
+	}
238 238
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +219 added lines, -219 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('ABSPATH')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /*
5 5
   Plugin Name:		Event Espresso
@@ -40,243 +40,243 @@  discard block
 block discarded – undo
40 40
  * @since            4.0
41 41
  */
42 42
 if (function_exists('espresso_version')) {
43
-    /**
44
-     *    espresso_duplicate_plugin_error
45
-     *    displays if more than one version of EE is activated at the same time
46
-     */
47
-    function espresso_duplicate_plugin_error()
48
-    {
49
-        ?>
43
+	/**
44
+	 *    espresso_duplicate_plugin_error
45
+	 *    displays if more than one version of EE is activated at the same time
46
+	 */
47
+	function espresso_duplicate_plugin_error()
48
+	{
49
+		?>
50 50
         <div class="error">
51 51
             <p>
52 52
                 <?php echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                ); ?>
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+				); ?>
56 56
             </p>
57 57
         </div>
58 58
         <?php
59
-        espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-    }
59
+		espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+	}
61 61
 
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
-    if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
+	if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                            esc_html__(
79
-                                    'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                                    'event_espresso'
81
-                            ),
82
-                            EE_MIN_PHP_VER_REQUIRED,
83
-                            PHP_VERSION,
84
-                            '<br/>',
85
-                            '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+							esc_html__(
79
+									'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+									'event_espresso'
81
+							),
82
+							EE_MIN_PHP_VER_REQUIRED,
83
+							PHP_VERSION,
84
+							'<br/>',
85
+							'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        /**
97
-         * espresso_version
98
-         * Returns the plugin version
99
-         *
100
-         * @return string
101
-         */
102
-        function espresso_version()
103
-        {
104
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.43.rc.014');
105
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		/**
97
+		 * espresso_version
98
+		 * Returns the plugin version
99
+		 *
100
+		 * @return string
101
+		 */
102
+		function espresso_version()
103
+		{
104
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.43.rc.014');
105
+		}
106 106
 
107
-        // define versions
108
-        define('EVENT_ESPRESSO_VERSION', espresso_version());
109
-        define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
-        define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
-        define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
-        //used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
-        if ( ! defined('DS')) {
115
-            define('DS', '/');
116
-        }
117
-        if ( ! defined('PS')) {
118
-            define('PS', PATH_SEPARATOR);
119
-        }
120
-        if ( ! defined('SP')) {
121
-            define('SP', ' ');
122
-        }
123
-        if ( ! defined('EENL')) {
124
-            define('EENL', "\n");
125
-        }
126
-        define('EE_SUPPORT_EMAIL', '[email protected]');
127
-        // define the plugin directory and URL
128
-        define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
-        define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
-        define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
-        // main root folder paths
132
-        define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
-        define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
-        define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
-        define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
-        define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
-        define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
-        define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
-        define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
-        // core system paths
141
-        define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
-        define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
-        define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
-        define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
-        define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
-        define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
-        define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
-        define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
-        define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
-        define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
-        define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
-        define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
-        // gateways
154
-        define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
-        define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
-        // asset URL paths
157
-        define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
-        define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
-        define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
-        define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
-        define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
-        define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
-        // define upload paths
164
-        $uploads = wp_upload_dir();
165
-        // define the uploads directory and URL
166
-        define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
-        define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
-        // define the templates directory and URL
169
-        define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
-        define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
-        // define the gateway directory and URL
172
-        define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
-        define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
-        // languages folder/path
175
-        define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
-        define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
-        //check for dompdf fonts in uploads
178
-        if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
-            define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
-        }
181
-        //ajax constants
182
-        define(
183
-                'EE_FRONT_AJAX',
184
-                isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
-        );
186
-        define(
187
-                'EE_ADMIN_AJAX',
188
-                isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
-        );
190
-        //just a handy constant occasionally needed for finding values representing infinity in the DB
191
-        //you're better to use this than its straight value (currently -1) in case you ever
192
-        //want to change its default value! or find when -1 means infinity
193
-        define('EE_INF_IN_DB', -1);
194
-        define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
-        define('EE_DEBUG', false);
196
-        // for older WP versions
197
-        if ( ! defined('MONTH_IN_SECONDS')) {
198
-            define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
-        }
200
-        /**
201
-         *    espresso_plugin_activation
202
-         *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
-         */
204
-        function espresso_plugin_activation()
205
-        {
206
-            update_option('ee_espresso_activation', true);
207
-        }
107
+		// define versions
108
+		define('EVENT_ESPRESSO_VERSION', espresso_version());
109
+		define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
+		define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
+		define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
+		//used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
+		if ( ! defined('DS')) {
115
+			define('DS', '/');
116
+		}
117
+		if ( ! defined('PS')) {
118
+			define('PS', PATH_SEPARATOR);
119
+		}
120
+		if ( ! defined('SP')) {
121
+			define('SP', ' ');
122
+		}
123
+		if ( ! defined('EENL')) {
124
+			define('EENL', "\n");
125
+		}
126
+		define('EE_SUPPORT_EMAIL', '[email protected]');
127
+		// define the plugin directory and URL
128
+		define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
+		define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
+		define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
+		// main root folder paths
132
+		define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
+		define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
+		define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
+		define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
+		define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
+		define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
+		define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
+		define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
+		// core system paths
141
+		define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
+		define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
+		define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
+		define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
+		define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
+		define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
+		define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
+		define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
+		define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
+		define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
+		define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
+		define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
+		// gateways
154
+		define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
+		define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
+		// asset URL paths
157
+		define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
+		define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
+		define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
+		define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
+		define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
+		define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
+		// define upload paths
164
+		$uploads = wp_upload_dir();
165
+		// define the uploads directory and URL
166
+		define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
+		define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
+		// define the templates directory and URL
169
+		define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
+		define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
+		// define the gateway directory and URL
172
+		define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
+		define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
+		// languages folder/path
175
+		define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
+		define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
+		//check for dompdf fonts in uploads
178
+		if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
+			define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
+		}
181
+		//ajax constants
182
+		define(
183
+				'EE_FRONT_AJAX',
184
+				isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
+		);
186
+		define(
187
+				'EE_ADMIN_AJAX',
188
+				isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
+		);
190
+		//just a handy constant occasionally needed for finding values representing infinity in the DB
191
+		//you're better to use this than its straight value (currently -1) in case you ever
192
+		//want to change its default value! or find when -1 means infinity
193
+		define('EE_INF_IN_DB', -1);
194
+		define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
+		define('EE_DEBUG', false);
196
+		// for older WP versions
197
+		if ( ! defined('MONTH_IN_SECONDS')) {
198
+			define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
+		}
200
+		/**
201
+		 *    espresso_plugin_activation
202
+		 *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
+		 */
204
+		function espresso_plugin_activation()
205
+		{
206
+			update_option('ee_espresso_activation', true);
207
+		}
208 208
 
209
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
-        /**
211
-         *    espresso_load_error_handling
212
-         *    this function loads EE's class for handling exceptions and errors
213
-         */
214
-        function espresso_load_error_handling()
215
-        {
216
-            // load debugging tools
217
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
-                require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
-                EEH_Debug_Tools::instance();
220
-            }
221
-            // load error handling
222
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
-                require_once(EE_CORE . 'EE_Error.core.php');
224
-            } else {
225
-                wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
-            }
227
-        }
209
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
+		/**
211
+		 *    espresso_load_error_handling
212
+		 *    this function loads EE's class for handling exceptions and errors
213
+		 */
214
+		function espresso_load_error_handling()
215
+		{
216
+			// load debugging tools
217
+			if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
+				require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
+				EEH_Debug_Tools::instance();
220
+			}
221
+			// load error handling
222
+			if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
+				require_once(EE_CORE . 'EE_Error.core.php');
224
+			} else {
225
+				wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
+			}
227
+		}
228 228
 
229
-        /**
230
-         *    espresso_load_required
231
-         *    given a class name and path, this function will load that file or throw an exception
232
-         *
233
-         * @param    string $classname
234
-         * @param    string $full_path_to_file
235
-         * @throws    EE_Error
236
-         */
237
-        function espresso_load_required($classname, $full_path_to_file)
238
-        {
239
-            static $error_handling_loaded = false;
240
-            if ( ! $error_handling_loaded) {
241
-                espresso_load_error_handling();
242
-                $error_handling_loaded = true;
243
-            }
244
-            if (is_readable($full_path_to_file)) {
245
-                require_once($full_path_to_file);
246
-            } else {
247
-                throw new EE_Error (
248
-                        sprintf(
249
-                                esc_html__(
250
-                                        'The %s class file could not be located or is not readable due to file permissions.',
251
-                                        'event_espresso'
252
-                                ),
253
-                                $classname
254
-                        )
255
-                );
256
-            }
257
-        }
229
+		/**
230
+		 *    espresso_load_required
231
+		 *    given a class name and path, this function will load that file or throw an exception
232
+		 *
233
+		 * @param    string $classname
234
+		 * @param    string $full_path_to_file
235
+		 * @throws    EE_Error
236
+		 */
237
+		function espresso_load_required($classname, $full_path_to_file)
238
+		{
239
+			static $error_handling_loaded = false;
240
+			if ( ! $error_handling_loaded) {
241
+				espresso_load_error_handling();
242
+				$error_handling_loaded = true;
243
+			}
244
+			if (is_readable($full_path_to_file)) {
245
+				require_once($full_path_to_file);
246
+			} else {
247
+				throw new EE_Error (
248
+						sprintf(
249
+								esc_html__(
250
+										'The %s class file could not be located or is not readable due to file permissions.',
251
+										'event_espresso'
252
+								),
253
+								$classname
254
+						)
255
+				);
256
+			}
257
+		}
258 258
 
259
-        espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
-        espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
-        espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
-        new EE_Bootstrap();
263
-    }
259
+		espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
+		espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
+		espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
+		new EE_Bootstrap();
263
+	}
264 264
 }
265 265
 if ( ! function_exists('espresso_deactivate_plugin')) {
266
-    /**
267
-     *    deactivate_plugin
268
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
-     *
270
-     * @access public
271
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
-     * @return    void
273
-     */
274
-    function espresso_deactivate_plugin($plugin_basename = '')
275
-    {
276
-        if ( ! function_exists('deactivate_plugins')) {
277
-            require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
-        }
279
-        unset($_GET['activate'], $_REQUEST['activate']);
280
-        deactivate_plugins($plugin_basename);
281
-    }
266
+	/**
267
+	 *    deactivate_plugin
268
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
+	 *
270
+	 * @access public
271
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
+	 * @return    void
273
+	 */
274
+	function espresso_deactivate_plugin($plugin_basename = '')
275
+	{
276
+		if ( ! function_exists('deactivate_plugins')) {
277
+			require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
+		}
279
+		unset($_GET['activate'], $_REQUEST['activate']);
280
+		deactivate_plugins($plugin_basename);
281
+	}
282 282
 }
283 283
\ No newline at end of file
Please login to merge, or discard this patch.
caffeinated/admin/extend/about/Extend_About_Admin_Page.core.php 1 patch
Spacing   +18 added lines, -18 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
 /**
@@ -32,15 +32,15 @@  discard block
 block discarded – undo
32 32
 
33 33
 
34 34
 
35
-	public function __construct( $routing = TRUE ) {
36
-		parent::__construct( $routing );
37
-		define( 'EE_ABOUT_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'about/templates/' );
35
+	public function __construct($routing = TRUE) {
36
+		parent::__construct($routing);
37
+		define('EE_ABOUT_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND.'about/templates/');
38 38
 	}
39 39
 
40 40
 
41 41
 
42 42
 	protected function _extend_page_config() {
43
-		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'about';
43
+		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND.'about';
44 44
 	}
45 45
 
46 46
 	protected function _set_page_routes() {
@@ -112,11 +112,11 @@  discard block
 block discarded – undo
112 112
 	protected function _whats_new() {
113 113
 		$steps = EE_Maintenance_Mode::instance()->level() != EE_Maintenance_Mode::level_2_complete_maintenance ? $this->_get_started_steps() : FALSE;
114 114
 		$steps = $steps !== FALSE ? $steps : '';
115
-		$this->_admin_page_title = sprintf( __('Welcome to Event Espresso %s', 'event_espresso'), EVENT_ESPRESSO_VERSION );
115
+		$this->_admin_page_title = sprintf(__('Welcome to Event Espresso %s', 'event_espresso'), EVENT_ESPRESSO_VERSION);
116 116
 		$settings_message = $steps;
117
-		$this->_template_args['admin_page_subtitle'] = __('Thank you for choosing Event Espresso, the most powerful Event Management plugin for WordPress.', 'event_espresso'). $settings_message ;
118
-		$template = is_readable(EE_ABOUT_CAF_TEMPLATE_PATH . 'whats_new.template.php') ? EE_ABOUT_CAF_TEMPLATE_PATH . 'whats_new.template.php' : EE_ABOUT_TEMPLATE_PATH . 'whats_new.template.php';
119
-		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template( $template, $this->_template_args, TRUE );
117
+		$this->_template_args['admin_page_subtitle'] = __('Thank you for choosing Event Espresso, the most powerful Event Management plugin for WordPress.', 'event_espresso').$settings_message;
118
+		$template = is_readable(EE_ABOUT_CAF_TEMPLATE_PATH.'whats_new.template.php') ? EE_ABOUT_CAF_TEMPLATE_PATH.'whats_new.template.php' : EE_ABOUT_TEMPLATE_PATH.'whats_new.template.php';
119
+		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template($template, $this->_template_args, TRUE);
120 120
 		$this->display_about_admin_page();
121 121
 	}
122 122
 
@@ -124,32 +124,32 @@  discard block
 block discarded – undo
124 124
 	protected function _overview() {
125 125
 		$this->_admin_page_title = __('About Event Espresso', 'event_espresso');
126 126
 		$this->_template_args['admin_page_subtitle'] = __('Thank you for choosing Event Espresso, the most powerful Event Management plugin for WordPress.', 'event_espresso');
127
-		$template = is_readable(EE_ABOUT_CAF_TEMPLATE_PATH . 'ee4-overview.template.php') ? EE_ABOUT_CAF_TEMPLATE_PATH . 'ee4-overview.template.php' : EE_ABOUT_TEMPLATE_PATH . 'ee4-overview.template.php';
128
-		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template( $template, $this->_template_args, TRUE );
127
+		$template = is_readable(EE_ABOUT_CAF_TEMPLATE_PATH.'ee4-overview.template.php') ? EE_ABOUT_CAF_TEMPLATE_PATH.'ee4-overview.template.php' : EE_ABOUT_TEMPLATE_PATH.'ee4-overview.template.php';
128
+		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template($template, $this->_template_args, TRUE);
129 129
 		$this->display_about_admin_page();
130 130
 	}
131 131
 
132 132
 	protected function _credits() {
133 133
 	//	$this->_template_args['admin_page_title'] = sprintf( __('Welcome to Event Espresso %s', 'event_espresso'), EVENT_ESPRESSO_VERSION );
134 134
 		$this->_template_args['admin_page_subtitle'] = __('Thank you for choosing Event Espresso, the most powerful Event Management plugin for WordPress.', 'event_espresso');
135
-		$template = EE_ABOUT_TEMPLATE_PATH . 'credits.template.php';
136
-		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template( $template, $this->_template_args, TRUE );
135
+		$template = EE_ABOUT_TEMPLATE_PATH.'credits.template.php';
136
+		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template($template, $this->_template_args, TRUE);
137 137
 		$this->display_about_admin_page();
138 138
 	}
139 139
 
140 140
 	protected function _decafvpro() {
141
-		$this->_template_args['admin_page_title'] = sprintf( __('Welcome to Event Espresso %s', 'event_espresso'), EVENT_ESPRESSO_VERSION );
141
+		$this->_template_args['admin_page_title'] = sprintf(__('Welcome to Event Espresso %s', 'event_espresso'), EVENT_ESPRESSO_VERSION);
142 142
 		$this->_template_args['admin_page_subtitle'] = sprintf(__('Event Espresso lets you focus on doing %swhat you love%s — %sorganizing your events%s', 'event_espresso'), '<em>', '</em>', '<strong>', '</strong>');
143
-		$template = EE_ABOUT_TEMPLATE_PATH . 'decafvpro.template.php';
144
-		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template( $template, $this->_template_args, TRUE );
143
+		$template = EE_ABOUT_TEMPLATE_PATH.'decafvpro.template.php';
144
+		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template($template, $this->_template_args, TRUE);
145 145
 		$this->display_about_admin_page();
146 146
 	}
147 147
 
148 148
 	protected function _reviews() {
149 149
 		$this->_template_args['admin_page_title'] = __('Rave Reviews About Event Espresso 4', 'event_espresso');
150 150
 		$this->_template_args['admin_page_subtitle'] = __('At Event Espresso, customer satisfaction is our ultimate goal.', 'event_espresso');
151
-		$template = EE_ABOUT_TEMPLATE_PATH . 'reviews.template.php';
152
-		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template( $template, $this->_template_args, TRUE );
151
+		$template = EE_ABOUT_TEMPLATE_PATH.'reviews.template.php';
152
+		$this->_template_args['about_admin_page_content'] = EEH_Template::display_template($template, $this->_template_args, TRUE);
153 153
 		$this->display_about_admin_page();
154 154
 	}
155 155
 }
Please login to merge, or discard this patch.
caffeinated/admin/extend/about/templates/ee4-overview.template.php 1 patch
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,8 +1,8 @@  discard block
 block discarded – undo
1 1
 <div class="changelog">
2 2
 	<h2 class="about-headline-callout"><?php esc_html_e('Welcome to Event Espresso 4!', 'event_espresso'); ?></h2>
3
-	<p><?php echo sprintf( esc_html__('Manage your events from your WordPress dashboard. Reduce your admin, reduce your costs, make your life easier! This is the Caffeinated/Regular version of Event Espresso, but we also have a hosted version called %sEvent Smart%s for customers that want to cut back on their hosting and security expenses.', 'event_espresso'),'<a href="https://eventsmart.com//?utm_source=ee4_decaf&amp;utm_medium=link&amp;utm_campaign=espresso_about_tab&amp;utm_content=EE4+Caffeinated">','</a>'); ?></p>
3
+	<p><?php echo sprintf(esc_html__('Manage your events from your WordPress dashboard. Reduce your admin, reduce your costs, make your life easier! This is the Caffeinated/Regular version of Event Espresso, but we also have a hosted version called %sEvent Smart%s for customers that want to cut back on their hosting and security expenses.', 'event_espresso'), '<a href="https://eventsmart.com//?utm_source=ee4_decaf&amp;utm_medium=link&amp;utm_campaign=espresso_about_tab&amp;utm_content=EE4+Caffeinated">', '</a>'); ?></p>
4 4
 	<h2><?php esc_html_e('Powering 40,000+ event websites; $100 million in ticket sales per year!', 'event_espresso'); ?></h2>
5
-	<p><?php echo sprintf( esc_html__('Event Espresso is a %sWordPress event manager%s which makes it easy for you to register attendees for classes, workshops, events, trainings, conferences or concerts, all from your WordPress website. Event Espresso events are created from the WordPress admin area. You can create signup forms to collect information about your attendees, accept payments, and create reports. The lite version of the plugin provides everything that you need to manage your event using WordPress.', 'event_espresso'),'<a href="http://eventespresso.com/?utm_source=wordpress_org&amp;utm_medium=link&amp;utm_campaign=espresso_about_tab&amp;utm_content=EE4+Decaf" rel="nofollow">','</a>'); ?></p>
5
+	<p><?php echo sprintf(esc_html__('Event Espresso is a %sWordPress event manager%s which makes it easy for you to register attendees for classes, workshops, events, trainings, conferences or concerts, all from your WordPress website. Event Espresso events are created from the WordPress admin area. You can create signup forms to collect information about your attendees, accept payments, and create reports. The lite version of the plugin provides everything that you need to manage your event using WordPress.', 'event_espresso'), '<a href="http://eventespresso.com/?utm_source=wordpress_org&amp;utm_medium=link&amp;utm_campaign=espresso_about_tab&amp;utm_content=EE4+Decaf" rel="nofollow">', '</a>'); ?></p>
6 6
 	<div class="feature-section col three-col about-updates">
7 7
 		<div class="col-1">
8 8
 			<img src="<?php echo EE_GLOBAL_ASSETS_URL; ?>images/screenshots/publish_meta_box.jpg">
@@ -60,11 +60,11 @@  discard block
 block discarded – undo
60 60
 	<h2 class="about-headline-callout"><?php esc_html_e('People Like You Manage Event Registration with WordPress', 'event_espresso'); ?></h2>
61 61
 	<div class="feature-section col two-col">
62 62
 		<div class="grid_6">
63
-			<p><?php echo sprintf( esc_html__('Trusted by thousands, Event Espresso is the best WordPress event online registration and ticketing manager plugin–and the best supported with full-time support. Turn your existing blog or website into a %sfully-featured event management website%s and a new way to make money. With Event Espresso you get it all; everything from custom registration forms and emails, seating limits, multiple price options, and discount codes to printable tickets.', 'event_espresso'),'<strong>','</strong>'); ?></p>
63
+			<p><?php echo sprintf(esc_html__('Trusted by thousands, Event Espresso is the best WordPress event online registration and ticketing manager plugin–and the best supported with full-time support. Turn your existing blog or website into a %sfully-featured event management website%s and a new way to make money. With Event Espresso you get it all; everything from custom registration forms and emails, seating limits, multiple price options, and discount codes to printable tickets.', 'event_espresso'), '<strong>', '</strong>'); ?></p>
64 64
 			<p><?php esc_html_e('Event Espresso works perfectly for classes, workshops, fundraisers, sporting, trainings, conferences, networking, religion, social, non-profit, and nearly any other type of event.', 'event_espresso'); ?></p>
65 65
 		</div>
66 66
 			<div class="grid_6">
67
-			<p><?php echo sprintf( esc_html__('Our online event registration software can %smake your organization more profitable and efficient%s by helping you save money on registration and ticketing fees, reduce the countless hours of time you spend manually processing registrations, create a “green” and paperless event registration process and you will be open for business to accept registrations and payment 24/7.', 'event_espresso'),'<strong>','</strong>'); ?></p>
67
+			<p><?php echo sprintf(esc_html__('Our online event registration software can %smake your organization more profitable and efficient%s by helping you save money on registration and ticketing fees, reduce the countless hours of time you spend manually processing registrations, create a “green” and paperless event registration process and you will be open for business to accept registrations and payment 24/7.', 'event_espresso'), '<strong>', '</strong>'); ?></p>
68 68
 			<p><?php esc_html_e('If you\'re doing event registration and ticketing any other way, then you’re wasting time and money. We offer packages and prices to fit any budget, so get started with your online event registration and ticketing management system today.', 'event_espresso'); ?></p>
69 69
 		</div>
70 70
 	</div>
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
 			<h3><?php esc_html_e('Turn your blog into a complete event registration and management system', 'event_espresso'); ?></h3>
75 75
 			<p><?php esc_html_e('Create a beautiful event page with ticket selection, venue details, and an integrated single page checkout system. With WordPress, Event Espresso, and Espresso Arabica 2014 (based on the "Twenty Fourteen" theme by WordPress), your events will certainly sell out faster than ever!', 'event_espresso'); ?></p>
76 76
 			<p><?php esc_html_e('With a striking design that does not compromise the simplicity of WordPress and Event Espresso 4, Espresso Arabica 2014 will be the best event theme on the market.', 'event_espresso'); ?></p>
77
-			<p><?php echo sprintf( esc_html__('%sLearn more >>%s', 'event_espresso'), '<a href="http://eventespresso.com/wiki/setup-event-espresso-arabica-theme/">', '</a>' ); ?></p>
77
+			<p><?php echo sprintf(esc_html__('%sLearn more >>%s', 'event_espresso'), '<a href="http://eventespresso.com/wiki/setup-event-espresso-arabica-theme/">', '</a>'); ?></p>
78 78
 		</div>
79 79
 		<div><img src="<?php echo EE_GLOBAL_ASSETS_URL; ?>images/screenshots/single-event-page.jpg"></div>
80 80
 	</div>
Please login to merge, or discard this patch.