Completed
Branch models-cleanup/main (de94a1)
by
unknown
86:45 queued 77:08
created
caffeinated/admin/new/pricing/espresso_events_Pricing_Hooks.class.php 3 patches
Doc Comments   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -1163,8 +1163,8 @@  discard block
 block discarded – undo
1163 1163
      * @param array       $datetime_tickets
1164 1164
      * @param array       $all_tickets
1165 1165
      * @param bool        $default
1166
-     * @param array       $all_datetimes
1167
-     * @return mixed
1166
+     * @param EE_Datetime[]       $all_datetimes
1167
+     * @return string
1168 1168
      * @throws DomainException
1169 1169
      * @throws EE_Error
1170 1170
      */
@@ -1275,7 +1275,7 @@  discard block
 block discarded – undo
1275 1275
      * @param array       $datetime_tickets
1276 1276
      * @param array       $all_tickets
1277 1277
      * @param bool        $default
1278
-     * @return mixed
1278
+     * @return string
1279 1279
      * @throws DomainException
1280 1280
      * @throws EE_Error
1281 1281
      */
@@ -1343,7 +1343,7 @@  discard block
 block discarded – undo
1343 1343
      * @param EE_Ticket   $ticket
1344 1344
      * @param array       $datetime_tickets
1345 1345
      * @param bool        $default
1346
-     * @return mixed
1346
+     * @return string
1347 1347
      * @throws DomainException
1348 1348
      * @throws EE_Error
1349 1349
      */
@@ -1413,7 +1413,7 @@  discard block
 block discarded – undo
1413 1413
      * @param bool          $default          Whether default row being generated or not.
1414 1414
      * @param EE_Ticket[]   $all_tickets      This is an array of all tickets attached to the event
1415 1415
      *                                        (or empty in the case of defaults)
1416
-     * @return mixed
1416
+     * @return string
1417 1417
      * @throws InvalidArgumentException
1418 1418
      * @throws InvalidInterfaceException
1419 1419
      * @throws InvalidDataTypeException
@@ -1737,7 +1737,7 @@  discard block
 block discarded – undo
1737 1737
      * @param EE_Ticket|null $ticket
1738 1738
      * @param bool           $show_trash
1739 1739
      * @param bool           $show_create
1740
-     * @return mixed
1740
+     * @return string
1741 1741
      * @throws InvalidArgumentException
1742 1742
      * @throws InvalidInterfaceException
1743 1743
      * @throws InvalidDataTypeException
@@ -1840,7 +1840,7 @@  discard block
 block discarded – undo
1840 1840
      * @param EE_Price $price
1841 1841
      * @param bool     $default
1842 1842
      * @param bool     $disabled
1843
-     * @return mixed
1843
+     * @return string
1844 1844
      * @throws ReflectionException
1845 1845
      * @throws InvalidArgumentException
1846 1846
      * @throws InvalidInterfaceException
@@ -1873,7 +1873,7 @@  discard block
 block discarded – undo
1873 1873
      * @param int      $price_row
1874 1874
      * @param EE_Price $price
1875 1875
      * @param bool     $default
1876
-     * @return mixed
1876
+     * @return string
1877 1877
      * @throws DomainException
1878 1878
      * @throws EE_Error
1879 1879
      */
@@ -1910,7 +1910,7 @@  discard block
 block discarded – undo
1910 1910
      * @param EE_Price $price
1911 1911
      * @param bool     $default
1912 1912
      * @param bool     $disabled
1913
-     * @return mixed
1913
+     * @return string
1914 1914
      * @throws ReflectionException
1915 1915
      * @throws InvalidArgumentException
1916 1916
      * @throws InvalidInterfaceException
@@ -2012,7 +2012,7 @@  discard block
 block discarded – undo
2012 2012
      * @param EE_Ticket|null   $ticket
2013 2013
      * @param array            $ticket_datetimes
2014 2014
      * @param bool             $default
2015
-     * @return mixed
2015
+     * @return string
2016 2016
      * @throws DomainException
2017 2017
      * @throws EE_Error
2018 2018
      */
@@ -2065,9 +2065,9 @@  discard block
 block discarded – undo
2065 2065
 
2066 2066
 
2067 2067
     /**
2068
-     * @param array $all_datetimes
2068
+     * @param EE_Datetime[] $all_datetimes
2069 2069
      * @param array $all_tickets
2070
-     * @return mixed
2070
+     * @return string
2071 2071
      * @throws ReflectionException
2072 2072
      * @throws InvalidArgumentException
2073 2073
      * @throws InvalidInterfaceException
Please login to merge, or discard this patch.
Spacing   +78 added lines, -78 removed lines patch added patch discarded remove patch
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
             );
152 152
             $msg .= '</p><ul>';
153 153
             foreach ($format_validation as $error) {
154
-                $msg .= '<li>' . $error . '</li>';
154
+                $msg .= '<li>'.$error.'</li>';
155 155
             }
156 156
             $msg .= '</ul><p>';
157 157
             $msg .= sprintf(
@@ -180,11 +180,11 @@  discard block
 block discarded – undo
180 180
         $this->_scripts_styles = array(
181 181
             'registers'   => array(
182 182
                 'ee-tickets-datetimes-css' => array(
183
-                    'url'  => PRICING_ASSETS_URL . 'event-tickets-datetimes.css',
183
+                    'url'  => PRICING_ASSETS_URL.'event-tickets-datetimes.css',
184 184
                     'type' => 'css',
185 185
                 ),
186 186
                 'ee-dtt-ticket-metabox'    => array(
187
-                    'url'     => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js',
187
+                    'url'     => PRICING_ASSETS_URL.'ee-datetime-ticket-metabox.js',
188 188
                     'depends' => array('ee-datepicker', 'ee-dialog', 'underscore'),
189 189
                 ),
190 190
             ),
@@ -208,9 +208,9 @@  discard block
 block discarded – undo
208 208
                             'event_espresso'
209 209
                         ),
210 210
                         'cancel_button'           => '<button class="button-secondary ee-modal-cancel">'
211
-                                                     . esc_html__('Cancel', 'event_espresso') . '</button>',
211
+                                                     . esc_html__('Cancel', 'event_espresso').'</button>',
212 212
                         'close_button'            => '<button class="button-secondary ee-modal-cancel">'
213
-                                                     . esc_html__('Close', 'event_espresso') . '</button>',
213
+                                                     . esc_html__('Close', 'event_espresso').'</button>',
214 214
                         'single_warning_from_tkt' => esc_html__(
215 215
                             'The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.',
216 216
                             'event_espresso'
@@ -220,7 +220,7 @@  discard block
 block discarded – undo
220 220
                             'event_espresso'
221 221
                         ),
222 222
                         'dismiss_button'          => '<button class="button-secondary ee-modal-cancel">'
223
-                                                     . esc_html__('Dismiss', 'event_espresso') . '</button>',
223
+                                                     . esc_html__('Dismiss', 'event_espresso').'</button>',
224 224
                     ),
225 225
                     'DTT_ERROR_MSG'         => array(
226 226
                         'no_ticket_name' => esc_html__('General Admission', 'event_espresso'),
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
     {
259 259
         foreach ($update_callbacks as $key => $callback) {
260 260
             if ($callback[1] === '_default_tickets_update') {
261
-                unset($update_callbacks[ $key ]);
261
+                unset($update_callbacks[$key]);
262 262
             }
263 263
         }
264 264
         $update_callbacks[] = array($this, 'datetime_and_tickets_caf_update');
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
         foreach ($data['edit_event_datetimes'] as $row => $datetime_data) {
317 317
             // trim all values to ensure any excess whitespace is removed.
318 318
             $datetime_data = array_map(
319
-                function ($datetime_data) {
319
+                function($datetime_data) {
320 320
                     return is_array($datetime_data) ? $datetime_data : trim($datetime_data);
321 321
                 },
322 322
                 $datetime_data
@@ -346,7 +346,7 @@  discard block
 block discarded – undo
346 346
             );
347 347
             // if we have an id then let's get existing object first and then set the new values.
348 348
             // Otherwise we instantiate a new object for save.
349
-            if (! empty($datetime_data['DTT_ID'])) {
349
+            if ( ! empty($datetime_data['DTT_ID'])) {
350 350
                 $datetime = EE_Registry::instance()
351 351
                                        ->load_model('Datetime', array($timezone))
352 352
                                        ->get_one_by_ID($datetime_data['DTT_ID']);
@@ -360,7 +360,7 @@  discard block
 block discarded – undo
360 360
                 // after the add_relation_to() the autosave replaces it.
361 361
                 // We need to do this so we dont' TRASH the parent DTT.
362 362
                 // (save the ID for both key and value to avoid duplications)
363
-                $saved_dtt_ids[ $datetime->ID() ] = $datetime->ID();
363
+                $saved_dtt_ids[$datetime->ID()] = $datetime->ID();
364 364
             } else {
365 365
                 $datetime = EE_Registry::instance()->load_class(
366 366
                     'Datetime',
@@ -389,8 +389,8 @@  discard block
 block discarded – undo
389 389
             // because it is possible there was a new one created for the autosave.
390 390
             // (save the ID for both key and value to avoid duplications)
391 391
             $DTT_ID = $datetime->ID();
392
-            $saved_dtt_ids[ $DTT_ID ] = $DTT_ID;
393
-            $saved_dtt_objs[ $row ] = $datetime;
392
+            $saved_dtt_ids[$DTT_ID] = $DTT_ID;
393
+            $saved_dtt_objs[$row] = $datetime;
394 394
             // @todo if ANY of these updates fail then we want the appropriate global error message.
395 395
         }
396 396
         $event->save();
@@ -455,13 +455,13 @@  discard block
 block discarded – undo
455 455
             $update_prices = $create_new_TKT = false;
456 456
             // figure out what datetimes were added to the ticket
457 457
             // and what datetimes were removed from the ticket in the session.
458
-            $starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][ $row ]);
459
-            $tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][ $row ]);
458
+            $starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][$row]);
459
+            $tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][$row]);
460 460
             $datetimes_added = array_diff($tkt_dtt_rows, $starting_tkt_dtt_rows);
461 461
             $datetimes_removed = array_diff($starting_tkt_dtt_rows, $tkt_dtt_rows);
462 462
             // trim inputs to ensure any excess whitespace is removed.
463 463
             $tkt = array_map(
464
-                function ($ticket_data) {
464
+                function($ticket_data) {
465 465
                     return is_array($ticket_data) ? $ticket_data : trim($ticket_data);
466 466
                 },
467 467
                 $tkt
@@ -483,8 +483,8 @@  discard block
 block discarded – undo
483 483
             $base_price_id = isset($tkt['TKT_base_price_ID'])
484 484
                 ? $tkt['TKT_base_price_ID']
485 485
                 : 0;
486
-            $price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][ $row ])
487
-                ? $data['edit_prices'][ $row ]
486
+            $price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][$row])
487
+                ? $data['edit_prices'][$row]
488 488
                 : array();
489 489
             $now = null;
490 490
             if (empty($tkt['TKT_start_date'])) {
@@ -496,7 +496,7 @@  discard block
 block discarded – undo
496 496
                 /**
497 497
                  * set the TKT_end_date to the first datetime attached to the ticket.
498 498
                  */
499
-                $first_dtt = $saved_datetimes[ reset($tkt_dtt_rows) ];
499
+                $first_dtt = $saved_datetimes[reset($tkt_dtt_rows)];
500 500
                 $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_time_format);
501 501
             }
502 502
             $TKT_values = array(
@@ -631,7 +631,7 @@  discard block
 block discarded – undo
631 631
             // need to make sue that the TKT_price is accurate after saving the prices.
632 632
             $ticket->ensure_TKT_Price_correct();
633 633
             // handle CREATING a default tkt from the incoming tkt but ONLY if this isn't an autosave.
634
-            if (! defined('DOING_AUTOSAVE') && ! empty($tkt['TKT_is_default_selector'])) {
634
+            if ( ! defined('DOING_AUTOSAVE') && ! empty($tkt['TKT_is_default_selector'])) {
635 635
                 $update_prices = true;
636 636
                 $new_default = clone $ticket;
637 637
                 $new_default->set('TKT_ID', 0);
@@ -676,7 +676,7 @@  discard block
 block discarded – undo
676 676
                 // save new TKT
677 677
                 $new_tkt->save();
678 678
                 // add new ticket to array
679
-                $saved_tickets[ $new_tkt->ID() ] = $new_tkt;
679
+                $saved_tickets[$new_tkt->ID()] = $new_tkt;
680 680
                 do_action(
681 681
                     'AHEE__espresso_events_Pricing_Hooks___update_tkts_new_ticket',
682 682
                     $new_tkt,
@@ -686,7 +686,7 @@  discard block
 block discarded – undo
686 686
                 );
687 687
             } else {
688 688
                 // add tkt to saved tkts
689
-                $saved_tickets[ $ticket->ID() ] = $ticket;
689
+                $saved_tickets[$ticket->ID()] = $ticket;
690 690
                 do_action(
691 691
                     'AHEE__espresso_events_Pricing_Hooks___update_tkts_update_ticket',
692 692
                     $ticket,
@@ -753,31 +753,31 @@  discard block
 block discarded – undo
753 753
         // to start we have to add the ticket to all the datetimes its supposed to be with,
754 754
         // and removing the ticket from datetimes it got removed from.
755 755
         // first let's add datetimes
756
-        if (! empty($added_datetimes) && is_array($added_datetimes)) {
756
+        if ( ! empty($added_datetimes) && is_array($added_datetimes)) {
757 757
             foreach ($added_datetimes as $row_id) {
758 758
                 $row_id = (int) $row_id;
759
-                if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
760
-                    $ticket->_add_relation_to($saved_datetimes[ $row_id ], 'Datetime');
759
+                if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) {
760
+                    $ticket->_add_relation_to($saved_datetimes[$row_id], 'Datetime');
761 761
                     // Is this an existing ticket (has an ID) and does it have any sold?
762 762
                     // If so, then we need to add that to the DTT sold because this DTT is getting added.
763 763
                     if ($ticket->ID() && $ticket->sold() > 0) {
764
-                        $saved_datetimes[ $row_id ]->increaseSold($ticket->sold(), false);
764
+                        $saved_datetimes[$row_id]->increaseSold($ticket->sold(), false);
765 765
                     }
766 766
                 }
767 767
             }
768 768
         }
769 769
         // then remove datetimes
770
-        if (! empty($removed_datetimes) && is_array($removed_datetimes)) {
770
+        if ( ! empty($removed_datetimes) && is_array($removed_datetimes)) {
771 771
             foreach ($removed_datetimes as $row_id) {
772 772
                 $row_id = (int) $row_id;
773 773
                 // its entirely possible that a datetime got deleted (instead of just removed from relationship.
774 774
                 // So make sure we skip over this if the dtt isn't in the $saved_datetimes array)
775
-                if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
776
-                    $ticket->_remove_relation_to($saved_datetimes[ $row_id ], 'Datetime');
775
+                if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) {
776
+                    $ticket->_remove_relation_to($saved_datetimes[$row_id], 'Datetime');
777 777
                     // Is this an existing ticket (has an ID) and does it have any sold?
778 778
                     // If so, then we need to remove it's sold from the DTT_sold.
779 779
                     if ($ticket->ID() && $ticket->sold() > 0) {
780
-                        $saved_datetimes[ $row_id ]->decreaseSold($ticket->sold());
780
+                        $saved_datetimes[$row_id]->decreaseSold($ticket->sold());
781 781
                     }
782 782
                 }
783 783
             }
@@ -890,7 +890,7 @@  discard block
 block discarded – undo
890 890
             );
891 891
         }
892 892
         // possibly need to save tkt
893
-        if (! $ticket->ID()) {
893
+        if ( ! $ticket->ID()) {
894 894
             $ticket->save();
895 895
         }
896 896
         foreach ($prices as $row => $prc) {
@@ -924,17 +924,17 @@  discard block
 block discarded – undo
924 924
                 }
925 925
             }
926 926
             $price->save();
927
-            $updated_prices[ $price->ID() ] = $price;
927
+            $updated_prices[$price->ID()] = $price;
928 928
             $ticket->_add_relation_to($price, 'Price');
929 929
         }
930 930
         // now let's remove any prices that got removed from the ticket
931
-        if (! empty($current_prices_on_ticket)) {
931
+        if ( ! empty($current_prices_on_ticket)) {
932 932
             $current = array_keys($current_prices_on_ticket);
933 933
             $updated = array_keys($updated_prices);
934 934
             $prices_to_remove = array_diff($current, $updated);
935
-            if (! empty($prices_to_remove)) {
935
+            if ( ! empty($prices_to_remove)) {
936 936
                 foreach ($prices_to_remove as $prc_id) {
937
-                    $p = $current_prices_on_ticket[ $prc_id ];
937
+                    $p = $current_prices_on_ticket[$prc_id];
938 938
                     $ticket->_remove_relation_to($p, 'Price');
939 939
                     // delete permanently the price
940 940
                     $p->delete_permanently();
@@ -1085,18 +1085,18 @@  discard block
 block discarded – undo
1085 1085
                 $TKT_ID = $ticket->get('TKT_ID');
1086 1086
                 $ticket_row = $ticket->get('TKT_row');
1087 1087
                 // we only want unique tickets in our final display!!
1088
-                if (! in_array($TKT_ID, $existing_ticket_ids, true)) {
1088
+                if ( ! in_array($TKT_ID, $existing_ticket_ids, true)) {
1089 1089
                     $existing_ticket_ids[] = $TKT_ID;
1090 1090
                     $all_tickets[] = $ticket;
1091 1091
                 }
1092 1092
                 // temporary cache of this ticket info for this datetime for later processing of datetime rows.
1093
-                $datetime_tickets[ $DTT_ID ][] = $ticket_row;
1093
+                $datetime_tickets[$DTT_ID][] = $ticket_row;
1094 1094
                 // temporary cache of this datetime info for this ticket for later processing of ticket rows.
1095 1095
                 if (
1096
-                    ! isset($ticket_datetimes[ $TKT_ID ])
1097
-                    || ! in_array($datetime_row, $ticket_datetimes[ $TKT_ID ], true)
1096
+                    ! isset($ticket_datetimes[$TKT_ID])
1097
+                    || ! in_array($datetime_row, $ticket_datetimes[$TKT_ID], true)
1098 1098
                 ) {
1099
-                    $ticket_datetimes[ $TKT_ID ][] = $datetime_row;
1099
+                    $ticket_datetimes[$TKT_ID][] = $datetime_row;
1100 1100
                 }
1101 1101
             }
1102 1102
             $datetime_row++;
@@ -1107,7 +1107,7 @@  discard block
 block discarded – undo
1107 1107
         // sort $all_tickets by order
1108 1108
         usort(
1109 1109
             $all_tickets,
1110
-            function (EE_Ticket $a, EE_Ticket $b) {
1110
+            function(EE_Ticket $a, EE_Ticket $b) {
1111 1111
                 $a_order = (int) $a->get('TKT_order');
1112 1112
                 $b_order = (int) $b->get('TKT_order');
1113 1113
                 if ($a_order === $b_order) {
@@ -1148,16 +1148,16 @@  discard block
 block discarded – undo
1148 1148
         $status_change_notice = EventEspresso\core\services\loaders\LoaderFactory::getLoader()->getShared(
1149 1149
             'EventEspresso\core\admin\StatusChangeNotice'
1150 1150
         );
1151
-        if (! $status_change_notice->isDismissed()) {
1151
+        if ( ! $status_change_notice->isDismissed()) {
1152 1152
             $main_template_args['status_change_notice'] = EEH_Template::display_template(
1153
-                EE_ADMIN_TEMPLATE . 'status_change_notice.template.php',
1153
+                EE_ADMIN_TEMPLATE.'status_change_notice.template.php',
1154 1154
                 ['context' => '__event-editor', 'page_slug' => 'espresso-events'],
1155 1155
                 true
1156 1156
             );
1157 1157
         }
1158 1158
 
1159 1159
         EEH_Template::display_template(
1160
-            PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php',
1160
+            PRICING_TEMPLATE_PATH.'event_tickets_metabox_main.template.php',
1161 1161
             $main_template_args
1162 1162
         );
1163 1163
     }
@@ -1199,7 +1199,7 @@  discard block
 block discarded – undo
1199 1199
             'dtt_row'                  => $default ? 'DTTNUM' : $datetime_row,
1200 1200
         );
1201 1201
         return EEH_Template::display_template(
1202
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php',
1202
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_row_wrapper.template.php',
1203 1203
             $dtt_display_template_args,
1204 1204
             true
1205 1205
         );
@@ -1268,7 +1268,7 @@  discard block
 block discarded – undo
1268 1268
             $this->_is_creating_event
1269 1269
         );
1270 1270
         return EEH_Template::display_template(
1271
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php',
1271
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_edit_row.template.php',
1272 1272
             $template_args,
1273 1273
             true
1274 1274
         );
@@ -1309,7 +1309,7 @@  discard block
 block discarded – undo
1309 1309
             'DTT_ID'                            => $default ? '' : $datetime->ID(),
1310 1310
         );
1311 1311
         // need to setup the list items (but only if this isn't a default skeleton setup)
1312
-        if (! $default) {
1312
+        if ( ! $default) {
1313 1313
             $ticket_row = 1;
1314 1314
             foreach ($all_tickets as $ticket) {
1315 1315
                 $template_args['datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item(
@@ -1335,7 +1335,7 @@  discard block
 block discarded – undo
1335 1335
             $this->_is_creating_event
1336 1336
         );
1337 1337
         return EEH_Template::display_template(
1338
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php',
1338
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_attached_tickets_row.template.php',
1339 1339
             $template_args,
1340 1340
             true
1341 1341
         );
@@ -1361,8 +1361,8 @@  discard block
 block discarded – undo
1361 1361
         $datetime_tickets = array(),
1362 1362
         $default
1363 1363
     ) {
1364
-        $dtt_tkts = $datetime instanceof EE_Datetime && isset($datetime_tickets[ $datetime->ID() ])
1365
-            ? $datetime_tickets[ $datetime->ID() ]
1364
+        $dtt_tkts = $datetime instanceof EE_Datetime && isset($datetime_tickets[$datetime->ID()])
1365
+            ? $datetime_tickets[$datetime->ID()]
1366 1366
             : array();
1367 1367
         $display_row = $ticket instanceof EE_Ticket ? $ticket->get('TKT_row') : 0;
1368 1368
         $no_ticket = $default && empty($ticket);
@@ -1383,8 +1383,8 @@  discard block
 block discarded – undo
1383 1383
                 ? 'TKTNAME'
1384 1384
                 : $ticket->get('TKT_name'),
1385 1385
             'tkt_status_class'        => $no_ticket || $this->_is_creating_event
1386
-                ? ' tkt-status-' . EE_Ticket::onsale
1387
-                : ' tkt-status-' . $ticket->ticket_status(),
1386
+                ? ' tkt-status-'.EE_Ticket::onsale
1387
+                : ' tkt-status-'.$ticket->ticket_status(),
1388 1388
         );
1389 1389
         // filter template args
1390 1390
         $template_args = apply_filters(
@@ -1399,7 +1399,7 @@  discard block
 block discarded – undo
1399 1399
             $this->_is_creating_event
1400 1400
         );
1401 1401
         return EEH_Template::display_template(
1402
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php',
1402
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_dtt_tickets_list.template.php',
1403 1403
             $template_args,
1404 1404
             true
1405 1405
         );
@@ -1455,19 +1455,19 @@  discard block
 block discarded – undo
1455 1455
         // (otherwise there won't be any new relationships created for tickets based off of the default ticket).
1456 1456
         // This will future proof in case there is ever any behaviour change between what the primary_key defaults to.
1457 1457
         $default_dtt = $default || ($ticket instanceof EE_Ticket && $ticket->is_default());
1458
-        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
1459
-            ? $ticket_datetimes[ $ticket->ID() ]
1458
+        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()])
1459
+            ? $ticket_datetimes[$ticket->ID()]
1460 1460
             : array();
1461 1461
         $ticket_subtotal = $default ? 0 : $ticket->get_ticket_subtotal();
1462 1462
         $base_price = $default ? null : $ticket->base_price();
1463 1463
         $count_price_mods = EEM_Price::instance()->get_all_default_prices(true);
1464 1464
         // breaking out complicated condition for ticket_status
1465 1465
         if ($default) {
1466
-            $ticket_status_class = ' tkt-status-' . EE_Ticket::onsale;
1466
+            $ticket_status_class = ' tkt-status-'.EE_Ticket::onsale;
1467 1467
         } else {
1468 1468
             $ticket_status_class = $ticket->is_default()
1469
-                ? ' tkt-status-' . EE_Ticket::onsale
1470
-                : ' tkt-status-' . $ticket->ticket_status();
1469
+                ? ' tkt-status-'.EE_Ticket::onsale
1470
+                : ' tkt-status-'.$ticket->ticket_status();
1471 1471
         }
1472 1472
         // breaking out complicated condition for TKT_taxable
1473 1473
         if ($default) {
@@ -1559,7 +1559,7 @@  discard block
 block discarded – undo
1559 1559
                 : ' style="display:none;"',
1560 1560
             'show_price_mod_button'         => count($prices) > 1
1561 1561
                                                || ($default && $count_price_mods > 0)
1562
-                                               || (! $default && $ticket->deleted())
1562
+                                               || ( ! $default && $ticket->deleted())
1563 1563
                 ? ' style="display:none;"'
1564 1564
                 : '',
1565 1565
             'total_price_rows'              => count($prices) > 1 ? count($prices) : 1,
@@ -1603,7 +1603,7 @@  discard block
 block discarded – undo
1603 1603
                 $this->_date_time_format,
1604 1604
                 current_time('timestamp')
1605 1605
             );
1606
-            $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1606
+            $template_args['tkt_status_class'] = ' tkt-status-'.EE_Ticket::onsale;
1607 1607
         }
1608 1608
         if (empty($template_args['TKT_end_date'])) {
1609 1609
             // get the earliest datetime (if present);
@@ -1613,7 +1613,7 @@  discard block
 block discarded – undo
1613 1613
                     array('order_by' => array('DTT_EVT_start' => 'ASC'))
1614 1614
                 )
1615 1615
                 : null;
1616
-            if (! empty($earliest_dtt)) {
1616
+            if ( ! empty($earliest_dtt)) {
1617 1617
                 $template_args['TKT_end_date'] = $earliest_dtt->get_datetime(
1618 1618
                     'DTT_EVT_start',
1619 1619
                     $this->_date_time_format
@@ -1632,10 +1632,10 @@  discard block
 block discarded – undo
1632 1632
                     )
1633 1633
                 );
1634 1634
             }
1635
-            $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1635
+            $template_args['tkt_status_class'] = ' tkt-status-'.EE_Ticket::onsale;
1636 1636
         }
1637 1637
         // generate ticket_datetime items
1638
-        if (! $default) {
1638
+        if ( ! $default) {
1639 1639
             $datetime_row = 1;
1640 1640
             foreach ($all_datetimes as $datetime) {
1641 1641
                 $template_args['ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item(
@@ -1651,7 +1651,7 @@  discard block
 block discarded – undo
1651 1651
         }
1652 1652
         $price_row = 1;
1653 1653
         foreach ($prices as $price) {
1654
-            if (! $price instanceof EE_Price) {
1654
+            if ( ! $price instanceof EE_Price) {
1655 1655
                 continue;
1656 1656
             }
1657 1657
             if ($price->is_base_price()) {
@@ -1684,7 +1684,7 @@  discard block
 block discarded – undo
1684 1684
             $this->_is_creating_event
1685 1685
         );
1686 1686
         return EEH_Template::display_template(
1687
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php',
1687
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_row.template.php',
1688 1688
             $template_args,
1689 1689
             true
1690 1690
         );
@@ -1724,7 +1724,7 @@  discard block
 block discarded – undo
1724 1724
                 $this->_is_creating_event
1725 1725
             );
1726 1726
             $tax_rows .= EEH_Template::display_template(
1727
-                PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php',
1727
+                PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_tax_row.template.php',
1728 1728
                 $template_args,
1729 1729
                 true
1730 1730
             );
@@ -1843,7 +1843,7 @@  discard block
 block discarded – undo
1843 1843
             $this->_is_creating_event
1844 1844
         );
1845 1845
         return EEH_Template::display_template(
1846
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php',
1846
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_price_row.template.php',
1847 1847
             $template_args,
1848 1848
             true
1849 1849
         );
@@ -1913,7 +1913,7 @@  discard block
 block discarded – undo
1913 1913
             $this->_is_creating_event
1914 1914
         );
1915 1915
         return EEH_Template::display_template(
1916
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php',
1916
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_type_base.template.php',
1917 1917
             $template_args,
1918 1918
             true
1919 1919
         );
@@ -1943,7 +1943,7 @@  discard block
 block discarded – undo
1943 1943
     ) {
1944 1944
         $select_name = $default && ! $price instanceof EE_Price
1945 1945
             ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]'
1946
-            : 'edit_prices[' . $ticket_row . '][' . $price_row . '][PRT_ID]';
1946
+            : 'edit_prices['.$ticket_row.']['.$price_row.'][PRT_ID]';
1947 1947
         /** @var EEM_Price_Type $price_type_model */
1948 1948
         $price_type_model = EE_Registry::instance()->load_model('Price_Type');
1949 1949
         $price_types = $price_type_model->get_all(array(
@@ -1961,10 +1961,10 @@  discard block
 block discarded – undo
1961 1961
         $price_option_spans = '';
1962 1962
         // setup price types for selector
1963 1963
         foreach ($price_types as $price_type) {
1964
-            if (! $price_type instanceof EE_Price_Type) {
1964
+            if ( ! $price_type instanceof EE_Price_Type) {
1965 1965
                 continue;
1966 1966
             }
1967
-            $all_price_types[ $price_type->ID() ] = $price_type->get('PRT_name');
1967
+            $all_price_types[$price_type->ID()] = $price_type->get('PRT_name');
1968 1968
             // while we're in the loop let's setup the option spans used by js
1969 1969
             $span_args = array(
1970 1970
                 'PRT_ID'         => $price_type->ID(),
@@ -1972,12 +1972,12 @@  discard block
 block discarded – undo
1972 1972
                 'PRT_is_percent' => $price_type->get('PRT_is_percent') ? 1 : 0,
1973 1973
             );
1974 1974
             $price_option_spans .= EEH_Template::display_template(
1975
-                PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php',
1975
+                PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_option_span.template.php',
1976 1976
                 $span_args,
1977 1977
                 true
1978 1978
             );
1979 1979
         }
1980
-        $select_name = $disabled ? 'archive_price[' . $ticket_row . '][' . $price_row . '][PRT_ID]'
1980
+        $select_name = $disabled ? 'archive_price['.$ticket_row.']['.$price_row.'][PRT_ID]'
1981 1981
             : $select_name;
1982 1982
         $select_input = new EE_Select_Input(
1983 1983
             $all_price_types,
@@ -2014,7 +2014,7 @@  discard block
 block discarded – undo
2014 2014
             $this->_is_creating_event
2015 2015
         );
2016 2016
         return EEH_Template::display_template(
2017
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php',
2017
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_modifier_selector.template.php',
2018 2018
             $template_args,
2019 2019
             true
2020 2020
         );
@@ -2040,8 +2040,8 @@  discard block
 block discarded – undo
2040 2040
         $ticket_datetimes = array(),
2041 2041
         $default
2042 2042
     ) {
2043
-        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
2044
-            ? $ticket_datetimes[ $ticket->ID() ]
2043
+        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()])
2044
+            ? $ticket_datetimes[$ticket->ID()]
2045 2045
             : array();
2046 2046
         $template_args = array(
2047 2047
             'dtt_row'                  => $default && ! $datetime instanceof EE_Datetime
@@ -2073,7 +2073,7 @@  discard block
 block discarded – undo
2073 2073
             $this->_is_creating_event
2074 2074
         );
2075 2075
         return EEH_Template::display_template(
2076
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php',
2076
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_datetimes_list_item.template.php',
2077 2077
             $template_args,
2078 2078
             true
2079 2079
         );
@@ -2179,7 +2179,7 @@  discard block
 block discarded – undo
2179 2179
         $default_prices = $price_model->get_all_default_prices();
2180 2180
         $price_row = 1;
2181 2181
         foreach ($default_prices as $price) {
2182
-            if (! $price instanceof EE_Price) {
2182
+            if ( ! $price instanceof EE_Price) {
2183 2183
                 continue;
2184 2184
             }
2185 2185
             if ($price->is_base_price()) {
@@ -2216,7 +2216,7 @@  discard block
 block discarded – undo
2216 2216
             $this->_is_creating_event
2217 2217
         );
2218 2218
         return EEH_Template::display_template(
2219
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php',
2219
+            PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_js_structure.template.php',
2220 2220
             $template_args,
2221 2221
             true
2222 2222
         );
Please login to merge, or discard this patch.
Indentation   +2155 added lines, -2155 removed lines patch added patch discarded remove patch
@@ -15,2217 +15,2217 @@
 block discarded – undo
15 15
 class espresso_events_Pricing_Hooks extends EE_Admin_Hooks
16 16
 {
17 17
 
18
-    /**
19
-     * This property is just used to hold the status of whether an event is currently being
20
-     * created (true) or edited (false)
21
-     *
22
-     * @access protected
23
-     * @var bool
24
-     */
25
-    protected $_is_creating_event;
18
+	/**
19
+	 * This property is just used to hold the status of whether an event is currently being
20
+	 * created (true) or edited (false)
21
+	 *
22
+	 * @access protected
23
+	 * @var bool
24
+	 */
25
+	protected $_is_creating_event;
26 26
 
27
-    /**
28
-     * Used to contain the format strings for date and time that will be used for php date and
29
-     * time.
30
-     * Is set in the _set_hooks_properties() method.
31
-     *
32
-     * @var array
33
-     */
34
-    protected $_date_format_strings;
27
+	/**
28
+	 * Used to contain the format strings for date and time that will be used for php date and
29
+	 * time.
30
+	 * Is set in the _set_hooks_properties() method.
31
+	 *
32
+	 * @var array
33
+	 */
34
+	protected $_date_format_strings;
35 35
 
36
-    /**
37
-     * @var string $_date_time_format
38
-     */
39
-    protected $_date_time_format;
36
+	/**
37
+	 * @var string $_date_time_format
38
+	 */
39
+	protected $_date_time_format;
40 40
 
41 41
 
42
-    /**
43
-     * @throws InvalidArgumentException
44
-     * @throws InvalidInterfaceException
45
-     * @throws InvalidDataTypeException
46
-     */
47
-    protected function _set_hooks_properties()
48
-    {
49
-        $this->_name = 'pricing';
50
-        // capability check
51
-        if (
52
-            EE_Registry::instance()->CFG->admin->useAdvancedEditor() ||
53
-            ! EE_Registry::instance()->CAP->current_user_can(
54
-                'ee_read_default_prices',
55
-                'advanced_ticket_datetime_metabox'
56
-            )
57
-        ) {
58
-            return;
59
-        }
60
-        $this->_setup_metaboxes();
61
-        $this->_set_date_time_formats();
62
-        $this->_validate_format_strings();
63
-        $this->_set_scripts_styles();
64
-        // commented out temporarily until logic is implemented in callback
65
-        // add_action(
66
-        //     'AHEE__EE_Admin_Page_CPT__do_extra_autosave_stuff__after_Extend_Events_Admin_Page',
67
-        //     array($this, 'autosave_handling')
68
-        // );
69
-        add_filter(
70
-            'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
71
-            array($this, 'caf_updates')
72
-        );
73
-    }
42
+	/**
43
+	 * @throws InvalidArgumentException
44
+	 * @throws InvalidInterfaceException
45
+	 * @throws InvalidDataTypeException
46
+	 */
47
+	protected function _set_hooks_properties()
48
+	{
49
+		$this->_name = 'pricing';
50
+		// capability check
51
+		if (
52
+			EE_Registry::instance()->CFG->admin->useAdvancedEditor() ||
53
+			! EE_Registry::instance()->CAP->current_user_can(
54
+				'ee_read_default_prices',
55
+				'advanced_ticket_datetime_metabox'
56
+			)
57
+		) {
58
+			return;
59
+		}
60
+		$this->_setup_metaboxes();
61
+		$this->_set_date_time_formats();
62
+		$this->_validate_format_strings();
63
+		$this->_set_scripts_styles();
64
+		// commented out temporarily until logic is implemented in callback
65
+		// add_action(
66
+		//     'AHEE__EE_Admin_Page_CPT__do_extra_autosave_stuff__after_Extend_Events_Admin_Page',
67
+		//     array($this, 'autosave_handling')
68
+		// );
69
+		add_filter(
70
+			'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
71
+			array($this, 'caf_updates')
72
+		);
73
+	}
74 74
 
75 75
 
76
-    /**
77
-     * @return void
78
-     */
79
-    protected function _setup_metaboxes()
80
-    {
81
-        // if we were going to add our own metaboxes we'd use the below.
82
-        $this->_metaboxes = array(
83
-            0 => array(
84
-                'page_route' => array('edit', 'create_new'),
85
-                'func'       => 'pricing_metabox',
86
-                'label'      => esc_html__('Event Tickets & Datetimes', 'event_espresso'),
87
-                'priority'   => 'high',
88
-                'context'    => 'normal',
89
-            ),
90
-        );
91
-        $this->_remove_metaboxes = array(
92
-            0 => array(
93
-                'page_route' => array('edit', 'create_new'),
94
-                'id'         => 'espresso_event_editor_tickets',
95
-                'context'    => 'normal',
96
-            ),
97
-        );
98
-    }
76
+	/**
77
+	 * @return void
78
+	 */
79
+	protected function _setup_metaboxes()
80
+	{
81
+		// if we were going to add our own metaboxes we'd use the below.
82
+		$this->_metaboxes = array(
83
+			0 => array(
84
+				'page_route' => array('edit', 'create_new'),
85
+				'func'       => 'pricing_metabox',
86
+				'label'      => esc_html__('Event Tickets & Datetimes', 'event_espresso'),
87
+				'priority'   => 'high',
88
+				'context'    => 'normal',
89
+			),
90
+		);
91
+		$this->_remove_metaboxes = array(
92
+			0 => array(
93
+				'page_route' => array('edit', 'create_new'),
94
+				'id'         => 'espresso_event_editor_tickets',
95
+				'context'    => 'normal',
96
+			),
97
+		);
98
+	}
99 99
 
100 100
 
101
-    /**
102
-     * @return void
103
-     */
104
-    protected function _set_date_time_formats()
105
-    {
106
-        /**
107
-         * Format strings for date and time.  Defaults are existing behaviour from 4.1.
108
-         * Note, that if you return null as the value for 'date', and 'time' in the array, then
109
-         * EE will automatically use the set wp_options, 'date_format', and 'time_format'.
110
-         *
111
-         * @since 4.6.7
112
-         * @var array  Expected an array returned with 'date' and 'time' keys.
113
-         */
114
-        $this->_date_format_strings = apply_filters(
115
-            'FHEE__espresso_events_Pricing_Hooks___set_hooks_properties__date_format_strings',
116
-            array(
117
-                'date' => 'Y-m-d',
118
-                'time' => 'h:i a',
119
-            )
120
-        );
121
-        // validate
122
-        $this->_date_format_strings['date'] = isset($this->_date_format_strings['date'])
123
-            ? $this->_date_format_strings['date']
124
-            : null;
125
-        $this->_date_format_strings['time'] = isset($this->_date_format_strings['time'])
126
-            ? $this->_date_format_strings['time']
127
-            : null;
128
-        $this->_date_time_format = $this->_date_format_strings['date']
129
-                                   . ' '
130
-                                   . $this->_date_format_strings['time'];
131
-    }
101
+	/**
102
+	 * @return void
103
+	 */
104
+	protected function _set_date_time_formats()
105
+	{
106
+		/**
107
+		 * Format strings for date and time.  Defaults are existing behaviour from 4.1.
108
+		 * Note, that if you return null as the value for 'date', and 'time' in the array, then
109
+		 * EE will automatically use the set wp_options, 'date_format', and 'time_format'.
110
+		 *
111
+		 * @since 4.6.7
112
+		 * @var array  Expected an array returned with 'date' and 'time' keys.
113
+		 */
114
+		$this->_date_format_strings = apply_filters(
115
+			'FHEE__espresso_events_Pricing_Hooks___set_hooks_properties__date_format_strings',
116
+			array(
117
+				'date' => 'Y-m-d',
118
+				'time' => 'h:i a',
119
+			)
120
+		);
121
+		// validate
122
+		$this->_date_format_strings['date'] = isset($this->_date_format_strings['date'])
123
+			? $this->_date_format_strings['date']
124
+			: null;
125
+		$this->_date_format_strings['time'] = isset($this->_date_format_strings['time'])
126
+			? $this->_date_format_strings['time']
127
+			: null;
128
+		$this->_date_time_format = $this->_date_format_strings['date']
129
+								   . ' '
130
+								   . $this->_date_format_strings['time'];
131
+	}
132 132
 
133 133
 
134
-    /**
135
-     * @return void
136
-     */
137
-    protected function _validate_format_strings()
138
-    {
139
-        // validate format strings
140
-        $format_validation = EEH_DTT_Helper::validate_format_string(
141
-            $this->_date_time_format
142
-        );
143
-        if (is_array($format_validation)) {
144
-            $msg = '<p>';
145
-            $msg .= sprintf(
146
-                esc_html__(
147
-                    'The format "%s" was likely added via a filter and is invalid for the following reasons:',
148
-                    'event_espresso'
149
-                ),
150
-                $this->_date_time_format
151
-            );
152
-            $msg .= '</p><ul>';
153
-            foreach ($format_validation as $error) {
154
-                $msg .= '<li>' . $error . '</li>';
155
-            }
156
-            $msg .= '</ul><p>';
157
-            $msg .= sprintf(
158
-                esc_html__(
159
-                    '%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s',
160
-                    'event_espresso'
161
-                ),
162
-                '<span style="color:#D54E21;">',
163
-                '</span>'
164
-            );
165
-            $msg .= '</p>';
166
-            EE_Error::add_attention($msg, __FILE__, __FUNCTION__, __LINE__);
167
-            $this->_date_format_strings = array(
168
-                'date' => 'Y-m-d',
169
-                'time' => 'h:i a',
170
-            );
171
-        }
172
-    }
134
+	/**
135
+	 * @return void
136
+	 */
137
+	protected function _validate_format_strings()
138
+	{
139
+		// validate format strings
140
+		$format_validation = EEH_DTT_Helper::validate_format_string(
141
+			$this->_date_time_format
142
+		);
143
+		if (is_array($format_validation)) {
144
+			$msg = '<p>';
145
+			$msg .= sprintf(
146
+				esc_html__(
147
+					'The format "%s" was likely added via a filter and is invalid for the following reasons:',
148
+					'event_espresso'
149
+				),
150
+				$this->_date_time_format
151
+			);
152
+			$msg .= '</p><ul>';
153
+			foreach ($format_validation as $error) {
154
+				$msg .= '<li>' . $error . '</li>';
155
+			}
156
+			$msg .= '</ul><p>';
157
+			$msg .= sprintf(
158
+				esc_html__(
159
+					'%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s',
160
+					'event_espresso'
161
+				),
162
+				'<span style="color:#D54E21;">',
163
+				'</span>'
164
+			);
165
+			$msg .= '</p>';
166
+			EE_Error::add_attention($msg, __FILE__, __FUNCTION__, __LINE__);
167
+			$this->_date_format_strings = array(
168
+				'date' => 'Y-m-d',
169
+				'time' => 'h:i a',
170
+			);
171
+		}
172
+	}
173 173
 
174 174
 
175
-    /**
176
-     * @return void
177
-     */
178
-    protected function _set_scripts_styles()
179
-    {
180
-        $this->_scripts_styles = array(
181
-            'registers'   => array(
182
-                'ee-tickets-datetimes-css' => array(
183
-                    'url'  => PRICING_ASSETS_URL . 'event-tickets-datetimes.css',
184
-                    'type' => 'css',
185
-                ),
186
-                'ee-dtt-ticket-metabox'    => array(
187
-                    'url'     => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js',
188
-                    'depends' => array('ee-datepicker', 'ee-dialog', 'underscore'),
189
-                ),
190
-            ),
191
-            'deregisters' => array(
192
-                'event-editor-css'       => array('type' => 'css'),
193
-                'event-datetime-metabox' => array('type' => 'js'),
194
-            ),
195
-            'enqueues'    => array(
196
-                'ee-tickets-datetimes-css' => array('edit', 'create_new'),
197
-                'ee-dtt-ticket-metabox'    => array('edit', 'create_new'),
198
-            ),
199
-            'localize'    => array(
200
-                'ee-dtt-ticket-metabox' => array(
201
-                    'DTT_TRASH_BLOCK'       => array(
202
-                        'main_warning'            => esc_html__(
203
-                            'The Datetime you are attempting to trash is the only datetime selected for the following ticket(s):',
204
-                            'event_espresso'
205
-                        ),
206
-                        'after_warning'           => esc_html__(
207
-                            'In order to trash this datetime you must first make sure the above ticket(s) are assigned to other datetimes.',
208
-                            'event_espresso'
209
-                        ),
210
-                        'cancel_button'           => '<button class="button-secondary ee-modal-cancel">'
211
-                                                     . esc_html__('Cancel', 'event_espresso') . '</button>',
212
-                        'close_button'            => '<button class="button-secondary ee-modal-cancel">'
213
-                                                     . esc_html__('Close', 'event_espresso') . '</button>',
214
-                        'single_warning_from_tkt' => esc_html__(
215
-                            'The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.',
216
-                            'event_espresso'
217
-                        ),
218
-                        'single_warning_from_dtt' => esc_html__(
219
-                            'The ticket you are attempting to unassign from this datetime cannot be unassigned because the datetime is the only remaining datetime for the ticket.  Tickets must always have at least one datetime assigned to them.',
220
-                            'event_espresso'
221
-                        ),
222
-                        'dismiss_button'          => '<button class="button-secondary ee-modal-cancel">'
223
-                                                     . esc_html__('Dismiss', 'event_espresso') . '</button>',
224
-                    ),
225
-                    'DTT_ERROR_MSG'         => array(
226
-                        'no_ticket_name' => esc_html__('General Admission', 'event_espresso'),
227
-                        'dismiss_button' => '<div class="save-cancel-button-container">'
228
-                                            . '<button class="button-secondary ee-modal-cancel">'
229
-                                            . esc_html__('Dismiss', 'event_espresso')
230
-                                            . '</button></div>',
231
-                    ),
232
-                    'DTT_OVERSELL_WARNING'  => array(
233
-                        'datetime_ticket' => esc_html__(
234
-                            'You cannot add this ticket to this datetime because it has a sold amount that is greater than the amount of spots remaining for this datetime.',
235
-                            'event_espresso'
236
-                        ),
237
-                        'ticket_datetime' => esc_html__(
238
-                            'You cannot add this datetime to this ticket because the ticket has a sold amount that is greater than the amount of spots remaining on the datetime.',
239
-                            'event_espresso'
240
-                        ),
241
-                    ),
242
-                    'DTT_CONVERTED_FORMATS' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats(
243
-                        $this->_date_format_strings['date'],
244
-                        $this->_date_format_strings['time']
245
-                    ),
246
-                    'DTT_START_OF_WEEK'     => array('dayValue' => (int) get_option('start_of_week')),
247
-                ),
248
-            ),
249
-        );
250
-    }
175
+	/**
176
+	 * @return void
177
+	 */
178
+	protected function _set_scripts_styles()
179
+	{
180
+		$this->_scripts_styles = array(
181
+			'registers'   => array(
182
+				'ee-tickets-datetimes-css' => array(
183
+					'url'  => PRICING_ASSETS_URL . 'event-tickets-datetimes.css',
184
+					'type' => 'css',
185
+				),
186
+				'ee-dtt-ticket-metabox'    => array(
187
+					'url'     => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js',
188
+					'depends' => array('ee-datepicker', 'ee-dialog', 'underscore'),
189
+				),
190
+			),
191
+			'deregisters' => array(
192
+				'event-editor-css'       => array('type' => 'css'),
193
+				'event-datetime-metabox' => array('type' => 'js'),
194
+			),
195
+			'enqueues'    => array(
196
+				'ee-tickets-datetimes-css' => array('edit', 'create_new'),
197
+				'ee-dtt-ticket-metabox'    => array('edit', 'create_new'),
198
+			),
199
+			'localize'    => array(
200
+				'ee-dtt-ticket-metabox' => array(
201
+					'DTT_TRASH_BLOCK'       => array(
202
+						'main_warning'            => esc_html__(
203
+							'The Datetime you are attempting to trash is the only datetime selected for the following ticket(s):',
204
+							'event_espresso'
205
+						),
206
+						'after_warning'           => esc_html__(
207
+							'In order to trash this datetime you must first make sure the above ticket(s) are assigned to other datetimes.',
208
+							'event_espresso'
209
+						),
210
+						'cancel_button'           => '<button class="button-secondary ee-modal-cancel">'
211
+													 . esc_html__('Cancel', 'event_espresso') . '</button>',
212
+						'close_button'            => '<button class="button-secondary ee-modal-cancel">'
213
+													 . esc_html__('Close', 'event_espresso') . '</button>',
214
+						'single_warning_from_tkt' => esc_html__(
215
+							'The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.',
216
+							'event_espresso'
217
+						),
218
+						'single_warning_from_dtt' => esc_html__(
219
+							'The ticket you are attempting to unassign from this datetime cannot be unassigned because the datetime is the only remaining datetime for the ticket.  Tickets must always have at least one datetime assigned to them.',
220
+							'event_espresso'
221
+						),
222
+						'dismiss_button'          => '<button class="button-secondary ee-modal-cancel">'
223
+													 . esc_html__('Dismiss', 'event_espresso') . '</button>',
224
+					),
225
+					'DTT_ERROR_MSG'         => array(
226
+						'no_ticket_name' => esc_html__('General Admission', 'event_espresso'),
227
+						'dismiss_button' => '<div class="save-cancel-button-container">'
228
+											. '<button class="button-secondary ee-modal-cancel">'
229
+											. esc_html__('Dismiss', 'event_espresso')
230
+											. '</button></div>',
231
+					),
232
+					'DTT_OVERSELL_WARNING'  => array(
233
+						'datetime_ticket' => esc_html__(
234
+							'You cannot add this ticket to this datetime because it has a sold amount that is greater than the amount of spots remaining for this datetime.',
235
+							'event_espresso'
236
+						),
237
+						'ticket_datetime' => esc_html__(
238
+							'You cannot add this datetime to this ticket because the ticket has a sold amount that is greater than the amount of spots remaining on the datetime.',
239
+							'event_espresso'
240
+						),
241
+					),
242
+					'DTT_CONVERTED_FORMATS' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats(
243
+						$this->_date_format_strings['date'],
244
+						$this->_date_format_strings['time']
245
+					),
246
+					'DTT_START_OF_WEEK'     => array('dayValue' => (int) get_option('start_of_week')),
247
+				),
248
+			),
249
+		);
250
+	}
251 251
 
252 252
 
253
-    /**
254
-     * @param array $update_callbacks
255
-     * @return array
256
-     */
257
-    public function caf_updates(array $update_callbacks)
258
-    {
259
-        foreach ($update_callbacks as $key => $callback) {
260
-            if ($callback[1] === '_default_tickets_update') {
261
-                unset($update_callbacks[ $key ]);
262
-            }
263
-        }
264
-        $update_callbacks[] = array($this, 'datetime_and_tickets_caf_update');
265
-        return $update_callbacks;
266
-    }
253
+	/**
254
+	 * @param array $update_callbacks
255
+	 * @return array
256
+	 */
257
+	public function caf_updates(array $update_callbacks)
258
+	{
259
+		foreach ($update_callbacks as $key => $callback) {
260
+			if ($callback[1] === '_default_tickets_update') {
261
+				unset($update_callbacks[ $key ]);
262
+			}
263
+		}
264
+		$update_callbacks[] = array($this, 'datetime_and_tickets_caf_update');
265
+		return $update_callbacks;
266
+	}
267 267
 
268 268
 
269
-    /**
270
-     * Handles saving everything related to Tickets (datetimes, tickets, prices)
271
-     *
272
-     * @param  EE_Event $event The Event object we're attaching data to
273
-     * @param  array    $data  The request data from the form
274
-     * @throws ReflectionException
275
-     * @throws Exception
276
-     * @throws InvalidInterfaceException
277
-     * @throws InvalidDataTypeException
278
-     * @throws EE_Error
279
-     * @throws InvalidArgumentException
280
-     */
281
-    public function datetime_and_tickets_caf_update($event, $data)
282
-    {
283
-        // first we need to start with datetimes cause they are the "root" items attached to events.
284
-        $saved_datetimes = $this->_update_datetimes($event, $data);
285
-        // next tackle the tickets (and prices?)
286
-        $this->_update_tickets($event, $saved_datetimes, $data);
287
-    }
269
+	/**
270
+	 * Handles saving everything related to Tickets (datetimes, tickets, prices)
271
+	 *
272
+	 * @param  EE_Event $event The Event object we're attaching data to
273
+	 * @param  array    $data  The request data from the form
274
+	 * @throws ReflectionException
275
+	 * @throws Exception
276
+	 * @throws InvalidInterfaceException
277
+	 * @throws InvalidDataTypeException
278
+	 * @throws EE_Error
279
+	 * @throws InvalidArgumentException
280
+	 */
281
+	public function datetime_and_tickets_caf_update($event, $data)
282
+	{
283
+		// first we need to start with datetimes cause they are the "root" items attached to events.
284
+		$saved_datetimes = $this->_update_datetimes($event, $data);
285
+		// next tackle the tickets (and prices?)
286
+		$this->_update_tickets($event, $saved_datetimes, $data);
287
+	}
288 288
 
289 289
 
290
-    /**
291
-     * update event_datetimes
292
-     *
293
-     * @param  EE_Event $event Event being updated
294
-     * @param  array    $data  the request data from the form
295
-     * @return EE_Datetime[]
296
-     * @throws Exception
297
-     * @throws ReflectionException
298
-     * @throws InvalidInterfaceException
299
-     * @throws InvalidDataTypeException
300
-     * @throws InvalidArgumentException
301
-     * @throws EE_Error
302
-     */
303
-    protected function _update_datetimes($event, $data)
304
-    {
305
-        $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null;
306
-        $saved_dtt_ids = array();
307
-        $saved_dtt_objs = array();
308
-        if (empty($data['edit_event_datetimes']) || ! is_array($data['edit_event_datetimes'])) {
309
-            throw new InvalidArgumentException(
310
-                esc_html__(
311
-                    'The "edit_event_datetimes" array is invalid therefore the event can not be updated.',
312
-                    'event_espresso'
313
-                )
314
-            );
315
-        }
316
-        foreach ($data['edit_event_datetimes'] as $row => $datetime_data) {
317
-            // trim all values to ensure any excess whitespace is removed.
318
-            $datetime_data = array_map(
319
-                function ($datetime_data) {
320
-                    return is_array($datetime_data) ? $datetime_data : trim($datetime_data);
321
-                },
322
-                $datetime_data
323
-            );
324
-            $datetime_data['DTT_EVT_end'] = isset($datetime_data['DTT_EVT_end'])
325
-                                            && ! empty($datetime_data['DTT_EVT_end'])
326
-                ? $datetime_data['DTT_EVT_end']
327
-                : $datetime_data['DTT_EVT_start'];
328
-            $datetime_values = array(
329
-                'DTT_ID'          => ! empty($datetime_data['DTT_ID'])
330
-                    ? $datetime_data['DTT_ID']
331
-                    : null,
332
-                'DTT_name'        => ! empty($datetime_data['DTT_name'])
333
-                    ? $datetime_data['DTT_name']
334
-                    : '',
335
-                'DTT_description' => ! empty($datetime_data['DTT_description'])
336
-                    ? $datetime_data['DTT_description']
337
-                    : '',
338
-                'DTT_EVT_start'   => $datetime_data['DTT_EVT_start'],
339
-                'DTT_EVT_end'     => $datetime_data['DTT_EVT_end'],
340
-                'DTT_reg_limit'   => empty($datetime_data['DTT_reg_limit'])
341
-                    ? EE_INF
342
-                    : $datetime_data['DTT_reg_limit'],
343
-                'DTT_order'       => ! isset($datetime_data['DTT_order'])
344
-                    ? $row
345
-                    : $datetime_data['DTT_order'],
346
-            );
347
-            // if we have an id then let's get existing object first and then set the new values.
348
-            // Otherwise we instantiate a new object for save.
349
-            if (! empty($datetime_data['DTT_ID'])) {
350
-                $datetime = EE_Registry::instance()
351
-                                       ->load_model('Datetime', array($timezone))
352
-                                       ->get_one_by_ID($datetime_data['DTT_ID']);
353
-                // set date and time format according to what is set in this class.
354
-                $datetime->set_date_format($this->_date_format_strings['date']);
355
-                $datetime->set_time_format($this->_date_format_strings['time']);
356
-                foreach ($datetime_values as $field => $value) {
357
-                    $datetime->set($field, $value);
358
-                }
359
-                // make sure the $dtt_id here is saved just in case
360
-                // after the add_relation_to() the autosave replaces it.
361
-                // We need to do this so we dont' TRASH the parent DTT.
362
-                // (save the ID for both key and value to avoid duplications)
363
-                $saved_dtt_ids[ $datetime->ID() ] = $datetime->ID();
364
-            } else {
365
-                $datetime = EE_Registry::instance()->load_class(
366
-                    'Datetime',
367
-                    array(
368
-                        $datetime_values,
369
-                        $timezone,
370
-                        array($this->_date_format_strings['date'], $this->_date_format_strings['time']),
371
-                    ),
372
-                    false,
373
-                    false
374
-                );
375
-                foreach ($datetime_values as $field => $value) {
376
-                    $datetime->set($field, $value);
377
-                }
378
-            }
379
-            $datetime->save();
380
-            do_action(
381
-                'AHEE__espresso_events_Pricing_Hooks___update_datetimes_after_save',
382
-                $datetime,
383
-                $row,
384
-                $datetime_data,
385
-                $data
386
-            );
387
-            $datetime = $event->_add_relation_to($datetime, 'Datetime');
388
-            // before going any further make sure our dates are setup correctly
389
-            // so that the end date is always equal or greater than the start date.
390
-            if ($datetime->get_raw('DTT_EVT_start') > $datetime->get_raw('DTT_EVT_end')) {
391
-                $datetime->set('DTT_EVT_end', $datetime->get('DTT_EVT_start'));
392
-                $datetime = EEH_DTT_Helper::date_time_add($datetime, 'DTT_EVT_end', 'days');
393
-                $datetime->save();
394
-            }
395
-            // now we have to make sure we add the new DTT_ID to the $saved_dtt_ids array
396
-            // because it is possible there was a new one created for the autosave.
397
-            // (save the ID for both key and value to avoid duplications)
398
-            $DTT_ID = $datetime->ID();
399
-            $saved_dtt_ids[ $DTT_ID ] = $DTT_ID;
400
-            $saved_dtt_objs[ $row ] = $datetime;
401
-            // @todo if ANY of these updates fail then we want the appropriate global error message.
402
-        }
403
-        $event->save();
404
-        // now we need to REMOVE any datetimes that got deleted.
405
-        // Keep in mind that this process will only kick in for datetimes that don't have any DTT_sold on them.
406
-        // So its safe to permanently delete at this point.
407
-        $old_datetimes = explode(',', $data['datetime_IDs']);
408
-        $old_datetimes = $old_datetimes[0] === '' ? array() : $old_datetimes;
409
-        if (is_array($old_datetimes)) {
410
-            $datetimes_to_delete = array_diff($old_datetimes, $saved_dtt_ids);
411
-            foreach ($datetimes_to_delete as $id) {
412
-                $id = absint($id);
413
-                if (empty($id)) {
414
-                    continue;
415
-                }
416
-                $dtt_to_remove = EE_Registry::instance()->load_model('Datetime')->get_one_by_ID($id);
417
-                // remove tkt relationships.
418
-                $related_tickets = $dtt_to_remove->get_many_related('Ticket');
419
-                foreach ($related_tickets as $tkt) {
420
-                    $dtt_to_remove->_remove_relation_to($tkt, 'Ticket');
421
-                }
422
-                $event->_remove_relation_to($id, 'Datetime');
423
-                $dtt_to_remove->refresh_cache_of_related_objects();
424
-            }
425
-        }
426
-        return $saved_dtt_objs;
427
-    }
290
+	/**
291
+	 * update event_datetimes
292
+	 *
293
+	 * @param  EE_Event $event Event being updated
294
+	 * @param  array    $data  the request data from the form
295
+	 * @return EE_Datetime[]
296
+	 * @throws Exception
297
+	 * @throws ReflectionException
298
+	 * @throws InvalidInterfaceException
299
+	 * @throws InvalidDataTypeException
300
+	 * @throws InvalidArgumentException
301
+	 * @throws EE_Error
302
+	 */
303
+	protected function _update_datetimes($event, $data)
304
+	{
305
+		$timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null;
306
+		$saved_dtt_ids = array();
307
+		$saved_dtt_objs = array();
308
+		if (empty($data['edit_event_datetimes']) || ! is_array($data['edit_event_datetimes'])) {
309
+			throw new InvalidArgumentException(
310
+				esc_html__(
311
+					'The "edit_event_datetimes" array is invalid therefore the event can not be updated.',
312
+					'event_espresso'
313
+				)
314
+			);
315
+		}
316
+		foreach ($data['edit_event_datetimes'] as $row => $datetime_data) {
317
+			// trim all values to ensure any excess whitespace is removed.
318
+			$datetime_data = array_map(
319
+				function ($datetime_data) {
320
+					return is_array($datetime_data) ? $datetime_data : trim($datetime_data);
321
+				},
322
+				$datetime_data
323
+			);
324
+			$datetime_data['DTT_EVT_end'] = isset($datetime_data['DTT_EVT_end'])
325
+											&& ! empty($datetime_data['DTT_EVT_end'])
326
+				? $datetime_data['DTT_EVT_end']
327
+				: $datetime_data['DTT_EVT_start'];
328
+			$datetime_values = array(
329
+				'DTT_ID'          => ! empty($datetime_data['DTT_ID'])
330
+					? $datetime_data['DTT_ID']
331
+					: null,
332
+				'DTT_name'        => ! empty($datetime_data['DTT_name'])
333
+					? $datetime_data['DTT_name']
334
+					: '',
335
+				'DTT_description' => ! empty($datetime_data['DTT_description'])
336
+					? $datetime_data['DTT_description']
337
+					: '',
338
+				'DTT_EVT_start'   => $datetime_data['DTT_EVT_start'],
339
+				'DTT_EVT_end'     => $datetime_data['DTT_EVT_end'],
340
+				'DTT_reg_limit'   => empty($datetime_data['DTT_reg_limit'])
341
+					? EE_INF
342
+					: $datetime_data['DTT_reg_limit'],
343
+				'DTT_order'       => ! isset($datetime_data['DTT_order'])
344
+					? $row
345
+					: $datetime_data['DTT_order'],
346
+			);
347
+			// if we have an id then let's get existing object first and then set the new values.
348
+			// Otherwise we instantiate a new object for save.
349
+			if (! empty($datetime_data['DTT_ID'])) {
350
+				$datetime = EE_Registry::instance()
351
+									   ->load_model('Datetime', array($timezone))
352
+									   ->get_one_by_ID($datetime_data['DTT_ID']);
353
+				// set date and time format according to what is set in this class.
354
+				$datetime->set_date_format($this->_date_format_strings['date']);
355
+				$datetime->set_time_format($this->_date_format_strings['time']);
356
+				foreach ($datetime_values as $field => $value) {
357
+					$datetime->set($field, $value);
358
+				}
359
+				// make sure the $dtt_id here is saved just in case
360
+				// after the add_relation_to() the autosave replaces it.
361
+				// We need to do this so we dont' TRASH the parent DTT.
362
+				// (save the ID for both key and value to avoid duplications)
363
+				$saved_dtt_ids[ $datetime->ID() ] = $datetime->ID();
364
+			} else {
365
+				$datetime = EE_Registry::instance()->load_class(
366
+					'Datetime',
367
+					array(
368
+						$datetime_values,
369
+						$timezone,
370
+						array($this->_date_format_strings['date'], $this->_date_format_strings['time']),
371
+					),
372
+					false,
373
+					false
374
+				);
375
+				foreach ($datetime_values as $field => $value) {
376
+					$datetime->set($field, $value);
377
+				}
378
+			}
379
+			$datetime->save();
380
+			do_action(
381
+				'AHEE__espresso_events_Pricing_Hooks___update_datetimes_after_save',
382
+				$datetime,
383
+				$row,
384
+				$datetime_data,
385
+				$data
386
+			);
387
+			$datetime = $event->_add_relation_to($datetime, 'Datetime');
388
+			// before going any further make sure our dates are setup correctly
389
+			// so that the end date is always equal or greater than the start date.
390
+			if ($datetime->get_raw('DTT_EVT_start') > $datetime->get_raw('DTT_EVT_end')) {
391
+				$datetime->set('DTT_EVT_end', $datetime->get('DTT_EVT_start'));
392
+				$datetime = EEH_DTT_Helper::date_time_add($datetime, 'DTT_EVT_end', 'days');
393
+				$datetime->save();
394
+			}
395
+			// now we have to make sure we add the new DTT_ID to the $saved_dtt_ids array
396
+			// because it is possible there was a new one created for the autosave.
397
+			// (save the ID for both key and value to avoid duplications)
398
+			$DTT_ID = $datetime->ID();
399
+			$saved_dtt_ids[ $DTT_ID ] = $DTT_ID;
400
+			$saved_dtt_objs[ $row ] = $datetime;
401
+			// @todo if ANY of these updates fail then we want the appropriate global error message.
402
+		}
403
+		$event->save();
404
+		// now we need to REMOVE any datetimes that got deleted.
405
+		// Keep in mind that this process will only kick in for datetimes that don't have any DTT_sold on them.
406
+		// So its safe to permanently delete at this point.
407
+		$old_datetimes = explode(',', $data['datetime_IDs']);
408
+		$old_datetimes = $old_datetimes[0] === '' ? array() : $old_datetimes;
409
+		if (is_array($old_datetimes)) {
410
+			$datetimes_to_delete = array_diff($old_datetimes, $saved_dtt_ids);
411
+			foreach ($datetimes_to_delete as $id) {
412
+				$id = absint($id);
413
+				if (empty($id)) {
414
+					continue;
415
+				}
416
+				$dtt_to_remove = EE_Registry::instance()->load_model('Datetime')->get_one_by_ID($id);
417
+				// remove tkt relationships.
418
+				$related_tickets = $dtt_to_remove->get_many_related('Ticket');
419
+				foreach ($related_tickets as $tkt) {
420
+					$dtt_to_remove->_remove_relation_to($tkt, 'Ticket');
421
+				}
422
+				$event->_remove_relation_to($id, 'Datetime');
423
+				$dtt_to_remove->refresh_cache_of_related_objects();
424
+			}
425
+		}
426
+		return $saved_dtt_objs;
427
+	}
428 428
 
429 429
 
430
-    /**
431
-     * update tickets
432
-     *
433
-     * @param  EE_Event      $event           Event object being updated
434
-     * @param  EE_Datetime[] $saved_datetimes an array of datetime ids being updated
435
-     * @param  array         $data            incoming request data
436
-     * @return EE_Ticket[]
437
-     * @throws Exception
438
-     * @throws ReflectionException
439
-     * @throws InvalidInterfaceException
440
-     * @throws InvalidDataTypeException
441
-     * @throws InvalidArgumentException
442
-     * @throws EE_Error
443
-     */
444
-    protected function _update_tickets($event, $saved_datetimes, $data)
445
-    {
446
-        $new_tkt = null;
447
-        $new_default = null;
448
-        // stripslashes because WP filtered the $_POST ($data) array to add slashes
449
-        $data = stripslashes_deep($data);
450
-        $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null;
451
-        $saved_tickets = $datetimes_on_existing = array();
452
-        $old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array();
453
-        if (empty($data['edit_tickets']) || ! is_array($data['edit_tickets'])) {
454
-            throw new InvalidArgumentException(
455
-                esc_html__(
456
-                    'The "edit_tickets" array is invalid therefore the event can not be updated.',
457
-                    'event_espresso'
458
-                )
459
-            );
460
-        }
461
-        foreach ($data['edit_tickets'] as $row => $tkt) {
462
-            $update_prices = $create_new_TKT = false;
463
-            // figure out what datetimes were added to the ticket
464
-            // and what datetimes were removed from the ticket in the session.
465
-            $starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][ $row ]);
466
-            $tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][ $row ]);
467
-            $datetimes_added = array_diff($tkt_dtt_rows, $starting_tkt_dtt_rows);
468
-            $datetimes_removed = array_diff($starting_tkt_dtt_rows, $tkt_dtt_rows);
469
-            // trim inputs to ensure any excess whitespace is removed.
470
-            $tkt = array_map(
471
-                function ($ticket_data) {
472
-                    return is_array($ticket_data) ? $ticket_data : trim($ticket_data);
473
-                },
474
-                $tkt
475
-            );
476
-            // note we are doing conversions to floats here instead of allowing EE_Money_Field to handle
477
-            // because we're doing calculations prior to using the models.
478
-            // note incoming ['TKT_price'] value is already in standard notation (via js).
479
-            $ticket_price = isset($tkt['TKT_price'])
480
-                ? round((float) $tkt['TKT_price'], 3)
481
-                : 0;
482
-            // note incoming base price needs converted from localized value.
483
-            $base_price = isset($tkt['TKT_base_price'])
484
-                ? EEH_Money::convert_to_float_from_localized_money($tkt['TKT_base_price'])
485
-                : 0;
486
-            // if ticket price == 0 and $base_price != 0 then ticket price == base_price
487
-            $ticket_price = $ticket_price === 0 && $base_price !== 0
488
-                ? $base_price
489
-                : $ticket_price;
490
-            $base_price_id = isset($tkt['TKT_base_price_ID'])
491
-                ? $tkt['TKT_base_price_ID']
492
-                : 0;
493
-            $price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][ $row ])
494
-                ? $data['edit_prices'][ $row ]
495
-                : array();
496
-            $now = null;
497
-            if (empty($tkt['TKT_start_date'])) {
498
-                // lets' use now in the set timezone.
499
-                $now = new DateTime('now', new DateTimeZone($event->get_timezone()));
500
-                $tkt['TKT_start_date'] = $now->format($this->_date_time_format);
501
-            }
502
-            if (empty($tkt['TKT_end_date'])) {
503
-                /**
504
-                 * set the TKT_end_date to the first datetime attached to the ticket.
505
-                 */
506
-                $first_dtt = $saved_datetimes[ reset($tkt_dtt_rows) ];
507
-                $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_time_format);
508
-            }
509
-            $TKT_values = array(
510
-                'TKT_ID'          => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null,
511
-                'TTM_ID'          => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0,
512
-                'TKT_name'        => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '',
513
-                'TKT_description' => ! empty($tkt['TKT_description'])
514
-                                     && $tkt['TKT_description'] !== esc_html__(
515
-                                         'You can modify this description',
516
-                                         'event_espresso'
517
-                                     )
518
-                    ? $tkt['TKT_description']
519
-                    : '',
520
-                'TKT_start_date'  => $tkt['TKT_start_date'],
521
-                'TKT_end_date'    => $tkt['TKT_end_date'],
522
-                'TKT_qty'         => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === ''
523
-                    ? EE_INF
524
-                    : $tkt['TKT_qty'],
525
-                'TKT_uses'        => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === ''
526
-                    ? EE_INF
527
-                    : $tkt['TKT_uses'],
528
-                'TKT_min'         => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'],
529
-                'TKT_max'         => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'],
530
-                'TKT_row'         => $row,
531
-                'TKT_order'       => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : 0,
532
-                'TKT_taxable'     => ! empty($tkt['TKT_taxable']) ? 1 : 0,
533
-                'TKT_required'    => ! empty($tkt['TKT_required']) ? 1 : 0,
534
-                'TKT_price'       => $ticket_price,
535
-            );
536
-            // if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly,
537
-            // which means in turn that the prices will become new prices as well.
538
-            if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) {
539
-                $TKT_values['TKT_ID'] = 0;
540
-                $TKT_values['TKT_is_default'] = 0;
541
-                $update_prices = true;
542
-            }
543
-            // if we have a TKT_ID then we need to get that existing TKT_obj and update it
544
-            // we actually do our saves ahead of doing any add_relations to
545
-            // because its entirely possible that this ticket wasn't removed or added to any datetime in the session
546
-            // but DID have it's items modified.
547
-            // keep in mind that if the TKT has been sold (and we have changed pricing information),
548
-            // then we won't be updating the tkt but instead a new tkt will be created and the old one archived.
549
-            if (absint($TKT_values['TKT_ID'])) {
550
-                $ticket = EE_Registry::instance()
551
-                                     ->load_model('Ticket', array($timezone))
552
-                                     ->get_one_by_ID($tkt['TKT_ID']);
553
-                if ($ticket instanceof EE_Ticket) {
554
-                    $ticket = $this->_update_ticket_datetimes(
555
-                        $ticket,
556
-                        $saved_datetimes,
557
-                        $datetimes_added,
558
-                        $datetimes_removed
559
-                    );
560
-                    // are there any registrations using this ticket ?
561
-                    $tickets_sold = $ticket->count_related(
562
-                        'Registration',
563
-                        array(
564
-                            array(
565
-                                'STS_ID' => array('NOT IN', array(EEM_Registration::status_id_incomplete)),
566
-                            ),
567
-                        )
568
-                    );
569
-                    // set ticket formats
570
-                    $ticket->set_date_format($this->_date_format_strings['date']);
571
-                    $ticket->set_time_format($this->_date_format_strings['time']);
572
-                    // let's just check the total price for the existing ticket
573
-                    // and determine if it matches the new total price.
574
-                    // if they are different then we create a new ticket (if tickets sold)
575
-                    // if they aren't different then we go ahead and modify existing ticket.
576
-                    $create_new_TKT = $tickets_sold > 0 && $ticket_price !== $ticket->price() && ! $ticket->deleted();
577
-                    // set new values
578
-                    foreach ($TKT_values as $field => $value) {
579
-                        if ($field === 'TKT_qty') {
580
-                            $ticket->set_qty($value);
581
-                        } else {
582
-                            $ticket->set($field, $value);
583
-                        }
584
-                    }
585
-                    // if $create_new_TKT is false then we can safely update the existing ticket.
586
-                    // Otherwise we have to create a new ticket.
587
-                    if ($create_new_TKT) {
588
-                        $new_tkt = $this->_duplicate_ticket(
589
-                            $ticket,
590
-                            $price_rows,
591
-                            $ticket_price,
592
-                            $base_price,
593
-                            $base_price_id
594
-                        );
595
-                    }
596
-                }
597
-            } else {
598
-                // no TKT_id so a new TKT
599
-                $ticket = EE_Ticket::new_instance(
600
-                    $TKT_values,
601
-                    $timezone,
602
-                    array($this->_date_format_strings['date'], $this->_date_format_strings['time'])
603
-                );
604
-                if ($ticket instanceof EE_Ticket) {
605
-                    // make sure ticket has an ID of setting relations won't work
606
-                    $ticket->save();
607
-                    $ticket = $this->_update_ticket_datetimes(
608
-                        $ticket,
609
-                        $saved_datetimes,
610
-                        $datetimes_added,
611
-                        $datetimes_removed
612
-                    );
613
-                    $update_prices = true;
614
-                }
615
-            }
616
-            // make sure any current values have been saved.
617
-            // $ticket->save();
618
-            // before going any further make sure our dates are setup correctly
619
-            // so that the end date is always equal or greater than the start date.
620
-            if ($ticket->get_raw('TKT_start_date') > $ticket->get_raw('TKT_end_date')) {
621
-                $ticket->set('TKT_end_date', $ticket->get('TKT_start_date'));
622
-                $ticket = EEH_DTT_Helper::date_time_add($ticket, 'TKT_end_date', 'days');
623
-            }
624
-            // let's make sure the base price is handled
625
-            $ticket = ! $create_new_TKT
626
-                ? $this->_add_prices_to_ticket(
627
-                    array(),
628
-                    $ticket,
629
-                    $update_prices,
630
-                    $base_price,
631
-                    $base_price_id
632
-                )
633
-                : $ticket;
634
-            // add/update price_modifiers
635
-            $ticket = ! $create_new_TKT
636
-                ? $this->_add_prices_to_ticket($price_rows, $ticket, $update_prices)
637
-                : $ticket;
638
-            // need to make sue that the TKT_price is accurate after saving the prices.
639
-            $ticket->ensure_TKT_Price_correct();
640
-            // handle CREATING a default tkt from the incoming tkt but ONLY if this isn't an autosave.
641
-            if (! defined('DOING_AUTOSAVE') && ! empty($tkt['TKT_is_default_selector'])) {
642
-                $update_prices = true;
643
-                $new_default = clone $ticket;
644
-                $new_default->set('TKT_ID', 0);
645
-                $new_default->set('TKT_is_default', 1);
646
-                $new_default->set('TKT_row', 1);
647
-                $new_default->set('TKT_price', $ticket_price);
648
-                // remove any dtt relations cause we DON'T want dtt relations attached
649
-                // (note this is just removing the cached relations in the object)
650
-                $new_default->_remove_relations('Datetime');
651
-                // @todo we need to add the current attached prices as new prices to the new default ticket.
652
-                $new_default = $this->_add_prices_to_ticket(
653
-                    $price_rows,
654
-                    $new_default,
655
-                    $update_prices
656
-                );
657
-                // don't forget the base price!
658
-                $new_default = $this->_add_prices_to_ticket(
659
-                    array(),
660
-                    $new_default,
661
-                    $update_prices,
662
-                    $base_price,
663
-                    $base_price_id
664
-                );
665
-                $new_default->save();
666
-                do_action(
667
-                    'AHEE__espresso_events_Pricing_Hooks___update_tkts_new_default_ticket',
668
-                    $new_default,
669
-                    $row,
670
-                    $ticket,
671
-                    $data
672
-                );
673
-            }
674
-            // DO ALL dtt relationships for both current tickets and any archived tickets
675
-            // for the given dtt that are related to the current ticket.
676
-            // TODO... not sure exactly how we're going to do this considering we don't know
677
-            // what current ticket the archived tickets are related to
678
-            // (and TKT_parent is used for autosaves so that's not a field we can reliably use).
679
-            // let's assign any tickets that have been setup to the saved_tickets tracker
680
-            // save existing TKT
681
-            $ticket->save();
682
-            if ($create_new_TKT && $new_tkt instanceof EE_Ticket) {
683
-                // save new TKT
684
-                $new_tkt->save();
685
-                // add new ticket to array
686
-                $saved_tickets[ $new_tkt->ID() ] = $new_tkt;
687
-                do_action(
688
-                    'AHEE__espresso_events_Pricing_Hooks___update_tkts_new_ticket',
689
-                    $new_tkt,
690
-                    $row,
691
-                    $tkt,
692
-                    $data
693
-                );
694
-            } else {
695
-                // add tkt to saved tkts
696
-                $saved_tickets[ $ticket->ID() ] = $ticket;
697
-                do_action(
698
-                    'AHEE__espresso_events_Pricing_Hooks___update_tkts_update_ticket',
699
-                    $ticket,
700
-                    $row,
701
-                    $tkt,
702
-                    $data
703
-                );
704
-            }
705
-        }
706
-        // now we need to handle tickets actually "deleted permanently".
707
-        // There are cases where we'd want this to happen
708
-        // (i.e. autosaves are happening and then in between autosaves the user trashes a ticket).
709
-        // Or a draft event was saved and in the process of editing a ticket is trashed.
710
-        // No sense in keeping all the related data in the db!
711
-        $old_tickets = isset($old_tickets[0]) && $old_tickets[0] === '' ? array() : $old_tickets;
712
-        $tickets_removed = array_diff($old_tickets, array_keys($saved_tickets));
713
-        foreach ($tickets_removed as $id) {
714
-            $id = absint($id);
715
-            // get the ticket for this id
716
-            $tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id);
717
-            // if this tkt is a default tkt we leave it alone cause it won't be attached to the datetime
718
-            if ($tkt_to_remove->get('TKT_is_default')) {
719
-                continue;
720
-            }
721
-            // if this tkt has any registrations attached so then we just ARCHIVE
722
-            // because we don't actually permanently delete these tickets.
723
-            if ($tkt_to_remove->count_related('Registration') > 0) {
724
-                $tkt_to_remove->delete();
725
-                continue;
726
-            }
727
-            // need to get all the related datetimes on this ticket and remove from every single one of them
728
-            // (remember this process can ONLY kick off if there are NO tkts_sold)
729
-            $datetimes = $tkt_to_remove->get_many_related('Datetime');
730
-            foreach ($datetimes as $datetime) {
731
-                $tkt_to_remove->_remove_relation_to($datetime, 'Datetime');
732
-            }
733
-            // need to do the same for prices (except these prices can also be deleted because again,
734
-            // tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived))
735
-            $tkt_to_remove->delete_related_permanently('Price');
736
-            do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_delete_ticket', $tkt_to_remove);
737
-            // finally let's delete this ticket
738
-            // (which should not be blocked at this point b/c we've removed all our relationships)
739
-            $tkt_to_remove->delete_permanently();
740
-        }
741
-        return $saved_tickets;
742
-    }
430
+	/**
431
+	 * update tickets
432
+	 *
433
+	 * @param  EE_Event      $event           Event object being updated
434
+	 * @param  EE_Datetime[] $saved_datetimes an array of datetime ids being updated
435
+	 * @param  array         $data            incoming request data
436
+	 * @return EE_Ticket[]
437
+	 * @throws Exception
438
+	 * @throws ReflectionException
439
+	 * @throws InvalidInterfaceException
440
+	 * @throws InvalidDataTypeException
441
+	 * @throws InvalidArgumentException
442
+	 * @throws EE_Error
443
+	 */
444
+	protected function _update_tickets($event, $saved_datetimes, $data)
445
+	{
446
+		$new_tkt = null;
447
+		$new_default = null;
448
+		// stripslashes because WP filtered the $_POST ($data) array to add slashes
449
+		$data = stripslashes_deep($data);
450
+		$timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null;
451
+		$saved_tickets = $datetimes_on_existing = array();
452
+		$old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array();
453
+		if (empty($data['edit_tickets']) || ! is_array($data['edit_tickets'])) {
454
+			throw new InvalidArgumentException(
455
+				esc_html__(
456
+					'The "edit_tickets" array is invalid therefore the event can not be updated.',
457
+					'event_espresso'
458
+				)
459
+			);
460
+		}
461
+		foreach ($data['edit_tickets'] as $row => $tkt) {
462
+			$update_prices = $create_new_TKT = false;
463
+			// figure out what datetimes were added to the ticket
464
+			// and what datetimes were removed from the ticket in the session.
465
+			$starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][ $row ]);
466
+			$tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][ $row ]);
467
+			$datetimes_added = array_diff($tkt_dtt_rows, $starting_tkt_dtt_rows);
468
+			$datetimes_removed = array_diff($starting_tkt_dtt_rows, $tkt_dtt_rows);
469
+			// trim inputs to ensure any excess whitespace is removed.
470
+			$tkt = array_map(
471
+				function ($ticket_data) {
472
+					return is_array($ticket_data) ? $ticket_data : trim($ticket_data);
473
+				},
474
+				$tkt
475
+			);
476
+			// note we are doing conversions to floats here instead of allowing EE_Money_Field to handle
477
+			// because we're doing calculations prior to using the models.
478
+			// note incoming ['TKT_price'] value is already in standard notation (via js).
479
+			$ticket_price = isset($tkt['TKT_price'])
480
+				? round((float) $tkt['TKT_price'], 3)
481
+				: 0;
482
+			// note incoming base price needs converted from localized value.
483
+			$base_price = isset($tkt['TKT_base_price'])
484
+				? EEH_Money::convert_to_float_from_localized_money($tkt['TKT_base_price'])
485
+				: 0;
486
+			// if ticket price == 0 and $base_price != 0 then ticket price == base_price
487
+			$ticket_price = $ticket_price === 0 && $base_price !== 0
488
+				? $base_price
489
+				: $ticket_price;
490
+			$base_price_id = isset($tkt['TKT_base_price_ID'])
491
+				? $tkt['TKT_base_price_ID']
492
+				: 0;
493
+			$price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][ $row ])
494
+				? $data['edit_prices'][ $row ]
495
+				: array();
496
+			$now = null;
497
+			if (empty($tkt['TKT_start_date'])) {
498
+				// lets' use now in the set timezone.
499
+				$now = new DateTime('now', new DateTimeZone($event->get_timezone()));
500
+				$tkt['TKT_start_date'] = $now->format($this->_date_time_format);
501
+			}
502
+			if (empty($tkt['TKT_end_date'])) {
503
+				/**
504
+				 * set the TKT_end_date to the first datetime attached to the ticket.
505
+				 */
506
+				$first_dtt = $saved_datetimes[ reset($tkt_dtt_rows) ];
507
+				$tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_time_format);
508
+			}
509
+			$TKT_values = array(
510
+				'TKT_ID'          => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null,
511
+				'TTM_ID'          => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0,
512
+				'TKT_name'        => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '',
513
+				'TKT_description' => ! empty($tkt['TKT_description'])
514
+									 && $tkt['TKT_description'] !== esc_html__(
515
+										 'You can modify this description',
516
+										 'event_espresso'
517
+									 )
518
+					? $tkt['TKT_description']
519
+					: '',
520
+				'TKT_start_date'  => $tkt['TKT_start_date'],
521
+				'TKT_end_date'    => $tkt['TKT_end_date'],
522
+				'TKT_qty'         => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === ''
523
+					? EE_INF
524
+					: $tkt['TKT_qty'],
525
+				'TKT_uses'        => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === ''
526
+					? EE_INF
527
+					: $tkt['TKT_uses'],
528
+				'TKT_min'         => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'],
529
+				'TKT_max'         => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'],
530
+				'TKT_row'         => $row,
531
+				'TKT_order'       => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : 0,
532
+				'TKT_taxable'     => ! empty($tkt['TKT_taxable']) ? 1 : 0,
533
+				'TKT_required'    => ! empty($tkt['TKT_required']) ? 1 : 0,
534
+				'TKT_price'       => $ticket_price,
535
+			);
536
+			// if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly,
537
+			// which means in turn that the prices will become new prices as well.
538
+			if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) {
539
+				$TKT_values['TKT_ID'] = 0;
540
+				$TKT_values['TKT_is_default'] = 0;
541
+				$update_prices = true;
542
+			}
543
+			// if we have a TKT_ID then we need to get that existing TKT_obj and update it
544
+			// we actually do our saves ahead of doing any add_relations to
545
+			// because its entirely possible that this ticket wasn't removed or added to any datetime in the session
546
+			// but DID have it's items modified.
547
+			// keep in mind that if the TKT has been sold (and we have changed pricing information),
548
+			// then we won't be updating the tkt but instead a new tkt will be created and the old one archived.
549
+			if (absint($TKT_values['TKT_ID'])) {
550
+				$ticket = EE_Registry::instance()
551
+									 ->load_model('Ticket', array($timezone))
552
+									 ->get_one_by_ID($tkt['TKT_ID']);
553
+				if ($ticket instanceof EE_Ticket) {
554
+					$ticket = $this->_update_ticket_datetimes(
555
+						$ticket,
556
+						$saved_datetimes,
557
+						$datetimes_added,
558
+						$datetimes_removed
559
+					);
560
+					// are there any registrations using this ticket ?
561
+					$tickets_sold = $ticket->count_related(
562
+						'Registration',
563
+						array(
564
+							array(
565
+								'STS_ID' => array('NOT IN', array(EEM_Registration::status_id_incomplete)),
566
+							),
567
+						)
568
+					);
569
+					// set ticket formats
570
+					$ticket->set_date_format($this->_date_format_strings['date']);
571
+					$ticket->set_time_format($this->_date_format_strings['time']);
572
+					// let's just check the total price for the existing ticket
573
+					// and determine if it matches the new total price.
574
+					// if they are different then we create a new ticket (if tickets sold)
575
+					// if they aren't different then we go ahead and modify existing ticket.
576
+					$create_new_TKT = $tickets_sold > 0 && $ticket_price !== $ticket->price() && ! $ticket->deleted();
577
+					// set new values
578
+					foreach ($TKT_values as $field => $value) {
579
+						if ($field === 'TKT_qty') {
580
+							$ticket->set_qty($value);
581
+						} else {
582
+							$ticket->set($field, $value);
583
+						}
584
+					}
585
+					// if $create_new_TKT is false then we can safely update the existing ticket.
586
+					// Otherwise we have to create a new ticket.
587
+					if ($create_new_TKT) {
588
+						$new_tkt = $this->_duplicate_ticket(
589
+							$ticket,
590
+							$price_rows,
591
+							$ticket_price,
592
+							$base_price,
593
+							$base_price_id
594
+						);
595
+					}
596
+				}
597
+			} else {
598
+				// no TKT_id so a new TKT
599
+				$ticket = EE_Ticket::new_instance(
600
+					$TKT_values,
601
+					$timezone,
602
+					array($this->_date_format_strings['date'], $this->_date_format_strings['time'])
603
+				);
604
+				if ($ticket instanceof EE_Ticket) {
605
+					// make sure ticket has an ID of setting relations won't work
606
+					$ticket->save();
607
+					$ticket = $this->_update_ticket_datetimes(
608
+						$ticket,
609
+						$saved_datetimes,
610
+						$datetimes_added,
611
+						$datetimes_removed
612
+					);
613
+					$update_prices = true;
614
+				}
615
+			}
616
+			// make sure any current values have been saved.
617
+			// $ticket->save();
618
+			// before going any further make sure our dates are setup correctly
619
+			// so that the end date is always equal or greater than the start date.
620
+			if ($ticket->get_raw('TKT_start_date') > $ticket->get_raw('TKT_end_date')) {
621
+				$ticket->set('TKT_end_date', $ticket->get('TKT_start_date'));
622
+				$ticket = EEH_DTT_Helper::date_time_add($ticket, 'TKT_end_date', 'days');
623
+			}
624
+			// let's make sure the base price is handled
625
+			$ticket = ! $create_new_TKT
626
+				? $this->_add_prices_to_ticket(
627
+					array(),
628
+					$ticket,
629
+					$update_prices,
630
+					$base_price,
631
+					$base_price_id
632
+				)
633
+				: $ticket;
634
+			// add/update price_modifiers
635
+			$ticket = ! $create_new_TKT
636
+				? $this->_add_prices_to_ticket($price_rows, $ticket, $update_prices)
637
+				: $ticket;
638
+			// need to make sue that the TKT_price is accurate after saving the prices.
639
+			$ticket->ensure_TKT_Price_correct();
640
+			// handle CREATING a default tkt from the incoming tkt but ONLY if this isn't an autosave.
641
+			if (! defined('DOING_AUTOSAVE') && ! empty($tkt['TKT_is_default_selector'])) {
642
+				$update_prices = true;
643
+				$new_default = clone $ticket;
644
+				$new_default->set('TKT_ID', 0);
645
+				$new_default->set('TKT_is_default', 1);
646
+				$new_default->set('TKT_row', 1);
647
+				$new_default->set('TKT_price', $ticket_price);
648
+				// remove any dtt relations cause we DON'T want dtt relations attached
649
+				// (note this is just removing the cached relations in the object)
650
+				$new_default->_remove_relations('Datetime');
651
+				// @todo we need to add the current attached prices as new prices to the new default ticket.
652
+				$new_default = $this->_add_prices_to_ticket(
653
+					$price_rows,
654
+					$new_default,
655
+					$update_prices
656
+				);
657
+				// don't forget the base price!
658
+				$new_default = $this->_add_prices_to_ticket(
659
+					array(),
660
+					$new_default,
661
+					$update_prices,
662
+					$base_price,
663
+					$base_price_id
664
+				);
665
+				$new_default->save();
666
+				do_action(
667
+					'AHEE__espresso_events_Pricing_Hooks___update_tkts_new_default_ticket',
668
+					$new_default,
669
+					$row,
670
+					$ticket,
671
+					$data
672
+				);
673
+			}
674
+			// DO ALL dtt relationships for both current tickets and any archived tickets
675
+			// for the given dtt that are related to the current ticket.
676
+			// TODO... not sure exactly how we're going to do this considering we don't know
677
+			// what current ticket the archived tickets are related to
678
+			// (and TKT_parent is used for autosaves so that's not a field we can reliably use).
679
+			// let's assign any tickets that have been setup to the saved_tickets tracker
680
+			// save existing TKT
681
+			$ticket->save();
682
+			if ($create_new_TKT && $new_tkt instanceof EE_Ticket) {
683
+				// save new TKT
684
+				$new_tkt->save();
685
+				// add new ticket to array
686
+				$saved_tickets[ $new_tkt->ID() ] = $new_tkt;
687
+				do_action(
688
+					'AHEE__espresso_events_Pricing_Hooks___update_tkts_new_ticket',
689
+					$new_tkt,
690
+					$row,
691
+					$tkt,
692
+					$data
693
+				);
694
+			} else {
695
+				// add tkt to saved tkts
696
+				$saved_tickets[ $ticket->ID() ] = $ticket;
697
+				do_action(
698
+					'AHEE__espresso_events_Pricing_Hooks___update_tkts_update_ticket',
699
+					$ticket,
700
+					$row,
701
+					$tkt,
702
+					$data
703
+				);
704
+			}
705
+		}
706
+		// now we need to handle tickets actually "deleted permanently".
707
+		// There are cases where we'd want this to happen
708
+		// (i.e. autosaves are happening and then in between autosaves the user trashes a ticket).
709
+		// Or a draft event was saved and in the process of editing a ticket is trashed.
710
+		// No sense in keeping all the related data in the db!
711
+		$old_tickets = isset($old_tickets[0]) && $old_tickets[0] === '' ? array() : $old_tickets;
712
+		$tickets_removed = array_diff($old_tickets, array_keys($saved_tickets));
713
+		foreach ($tickets_removed as $id) {
714
+			$id = absint($id);
715
+			// get the ticket for this id
716
+			$tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id);
717
+			// if this tkt is a default tkt we leave it alone cause it won't be attached to the datetime
718
+			if ($tkt_to_remove->get('TKT_is_default')) {
719
+				continue;
720
+			}
721
+			// if this tkt has any registrations attached so then we just ARCHIVE
722
+			// because we don't actually permanently delete these tickets.
723
+			if ($tkt_to_remove->count_related('Registration') > 0) {
724
+				$tkt_to_remove->delete();
725
+				continue;
726
+			}
727
+			// need to get all the related datetimes on this ticket and remove from every single one of them
728
+			// (remember this process can ONLY kick off if there are NO tkts_sold)
729
+			$datetimes = $tkt_to_remove->get_many_related('Datetime');
730
+			foreach ($datetimes as $datetime) {
731
+				$tkt_to_remove->_remove_relation_to($datetime, 'Datetime');
732
+			}
733
+			// need to do the same for prices (except these prices can also be deleted because again,
734
+			// tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived))
735
+			$tkt_to_remove->delete_related_permanently('Price');
736
+			do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_delete_ticket', $tkt_to_remove);
737
+			// finally let's delete this ticket
738
+			// (which should not be blocked at this point b/c we've removed all our relationships)
739
+			$tkt_to_remove->delete_permanently();
740
+		}
741
+		return $saved_tickets;
742
+	}
743 743
 
744 744
 
745
-    /**
746
-     * @access  protected
747
-     * @param EE_Ticket      $ticket
748
-     * @param \EE_Datetime[] $saved_datetimes
749
-     * @param \EE_Datetime[] $added_datetimes
750
-     * @param \EE_Datetime[] $removed_datetimes
751
-     * @return EE_Ticket
752
-     * @throws EE_Error
753
-     */
754
-    protected function _update_ticket_datetimes(
755
-        EE_Ticket $ticket,
756
-        $saved_datetimes = array(),
757
-        $added_datetimes = array(),
758
-        $removed_datetimes = array()
759
-    ) {
760
-        // to start we have to add the ticket to all the datetimes its supposed to be with,
761
-        // and removing the ticket from datetimes it got removed from.
762
-        // first let's add datetimes
763
-        if (! empty($added_datetimes) && is_array($added_datetimes)) {
764
-            foreach ($added_datetimes as $row_id) {
765
-                $row_id = (int) $row_id;
766
-                if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
767
-                    $ticket->_add_relation_to($saved_datetimes[ $row_id ], 'Datetime');
768
-                    // Is this an existing ticket (has an ID) and does it have any sold?
769
-                    // If so, then we need to add that to the DTT sold because this DTT is getting added.
770
-                    if ($ticket->ID() && $ticket->sold() > 0) {
771
-                        $saved_datetimes[ $row_id ]->increaseSold($ticket->sold(), false);
772
-                    }
773
-                }
774
-            }
775
-        }
776
-        // then remove datetimes
777
-        if (! empty($removed_datetimes) && is_array($removed_datetimes)) {
778
-            foreach ($removed_datetimes as $row_id) {
779
-                $row_id = (int) $row_id;
780
-                // its entirely possible that a datetime got deleted (instead of just removed from relationship.
781
-                // So make sure we skip over this if the dtt isn't in the $saved_datetimes array)
782
-                if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
783
-                    $ticket->_remove_relation_to($saved_datetimes[ $row_id ], 'Datetime');
784
-                    // Is this an existing ticket (has an ID) and does it have any sold?
785
-                    // If so, then we need to remove it's sold from the DTT_sold.
786
-                    if ($ticket->ID() && $ticket->sold() > 0) {
787
-                        $saved_datetimes[ $row_id ]->decreaseSold($ticket->sold());
788
-                    }
789
-                }
790
-            }
791
-        }
792
-        // cap ticket qty by datetime reg limits
793
-        $ticket->set_qty(min($ticket->qty(), $ticket->qty('reg_limit')));
794
-        return $ticket;
795
-    }
745
+	/**
746
+	 * @access  protected
747
+	 * @param EE_Ticket      $ticket
748
+	 * @param \EE_Datetime[] $saved_datetimes
749
+	 * @param \EE_Datetime[] $added_datetimes
750
+	 * @param \EE_Datetime[] $removed_datetimes
751
+	 * @return EE_Ticket
752
+	 * @throws EE_Error
753
+	 */
754
+	protected function _update_ticket_datetimes(
755
+		EE_Ticket $ticket,
756
+		$saved_datetimes = array(),
757
+		$added_datetimes = array(),
758
+		$removed_datetimes = array()
759
+	) {
760
+		// to start we have to add the ticket to all the datetimes its supposed to be with,
761
+		// and removing the ticket from datetimes it got removed from.
762
+		// first let's add datetimes
763
+		if (! empty($added_datetimes) && is_array($added_datetimes)) {
764
+			foreach ($added_datetimes as $row_id) {
765
+				$row_id = (int) $row_id;
766
+				if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
767
+					$ticket->_add_relation_to($saved_datetimes[ $row_id ], 'Datetime');
768
+					// Is this an existing ticket (has an ID) and does it have any sold?
769
+					// If so, then we need to add that to the DTT sold because this DTT is getting added.
770
+					if ($ticket->ID() && $ticket->sold() > 0) {
771
+						$saved_datetimes[ $row_id ]->increaseSold($ticket->sold(), false);
772
+					}
773
+				}
774
+			}
775
+		}
776
+		// then remove datetimes
777
+		if (! empty($removed_datetimes) && is_array($removed_datetimes)) {
778
+			foreach ($removed_datetimes as $row_id) {
779
+				$row_id = (int) $row_id;
780
+				// its entirely possible that a datetime got deleted (instead of just removed from relationship.
781
+				// So make sure we skip over this if the dtt isn't in the $saved_datetimes array)
782
+				if (isset($saved_datetimes[ $row_id ]) && $saved_datetimes[ $row_id ] instanceof EE_Datetime) {
783
+					$ticket->_remove_relation_to($saved_datetimes[ $row_id ], 'Datetime');
784
+					// Is this an existing ticket (has an ID) and does it have any sold?
785
+					// If so, then we need to remove it's sold from the DTT_sold.
786
+					if ($ticket->ID() && $ticket->sold() > 0) {
787
+						$saved_datetimes[ $row_id ]->decreaseSold($ticket->sold());
788
+					}
789
+				}
790
+			}
791
+		}
792
+		// cap ticket qty by datetime reg limits
793
+		$ticket->set_qty(min($ticket->qty(), $ticket->qty('reg_limit')));
794
+		return $ticket;
795
+	}
796 796
 
797 797
 
798
-    /**
799
-     * @access  protected
800
-     * @param EE_Ticket $ticket
801
-     * @param array     $price_rows
802
-     * @param int       $ticket_price
803
-     * @param int       $base_price
804
-     * @param int       $base_price_id
805
-     * @return EE_Ticket
806
-     * @throws ReflectionException
807
-     * @throws InvalidArgumentException
808
-     * @throws InvalidInterfaceException
809
-     * @throws InvalidDataTypeException
810
-     * @throws EE_Error
811
-     */
812
-    protected function _duplicate_ticket(
813
-        EE_Ticket $ticket,
814
-        $price_rows = array(),
815
-        $ticket_price = 0,
816
-        $base_price = 0,
817
-        $base_price_id = 0
818
-    ) {
819
-        // create new ticket that's a copy of the existing
820
-        // except a new id of course (and not archived)
821
-        // AND has the new TKT_price associated with it.
822
-        $new_ticket = clone $ticket;
823
-        $new_ticket->set('TKT_ID', 0);
824
-        $new_ticket->set_deleted(0);
825
-        $new_ticket->set_price($ticket_price);
826
-        $new_ticket->set_sold(0);
827
-        // let's get a new ID for this ticket
828
-        $new_ticket->save();
829
-        // we also need to make sure this new ticket gets the same datetime attachments as the archived ticket
830
-        $datetimes_on_existing = $ticket->datetimes();
831
-        $new_ticket = $this->_update_ticket_datetimes(
832
-            $new_ticket,
833
-            $datetimes_on_existing,
834
-            array_keys($datetimes_on_existing)
835
-        );
836
-        // $ticket will get archived later b/c we are NOT adding it to the saved_tickets array.
837
-        // if existing $ticket has sold amount, then we need to adjust the qty for the new TKT to = the remaining
838
-        // available.
839
-        if ($ticket->sold() > 0) {
840
-            $new_qty = $ticket->qty() - $ticket->sold();
841
-            $new_ticket->set_qty($new_qty);
842
-        }
843
-        // now we update the prices just for this ticket
844
-        $new_ticket = $this->_add_prices_to_ticket($price_rows, $new_ticket, true);
845
-        // and we update the base price
846
-        $new_ticket = $this->_add_prices_to_ticket(
847
-            array(),
848
-            $new_ticket,
849
-            true,
850
-            $base_price,
851
-            $base_price_id
852
-        );
853
-        return $new_ticket;
854
-    }
798
+	/**
799
+	 * @access  protected
800
+	 * @param EE_Ticket $ticket
801
+	 * @param array     $price_rows
802
+	 * @param int       $ticket_price
803
+	 * @param int       $base_price
804
+	 * @param int       $base_price_id
805
+	 * @return EE_Ticket
806
+	 * @throws ReflectionException
807
+	 * @throws InvalidArgumentException
808
+	 * @throws InvalidInterfaceException
809
+	 * @throws InvalidDataTypeException
810
+	 * @throws EE_Error
811
+	 */
812
+	protected function _duplicate_ticket(
813
+		EE_Ticket $ticket,
814
+		$price_rows = array(),
815
+		$ticket_price = 0,
816
+		$base_price = 0,
817
+		$base_price_id = 0
818
+	) {
819
+		// create new ticket that's a copy of the existing
820
+		// except a new id of course (and not archived)
821
+		// AND has the new TKT_price associated with it.
822
+		$new_ticket = clone $ticket;
823
+		$new_ticket->set('TKT_ID', 0);
824
+		$new_ticket->set_deleted(0);
825
+		$new_ticket->set_price($ticket_price);
826
+		$new_ticket->set_sold(0);
827
+		// let's get a new ID for this ticket
828
+		$new_ticket->save();
829
+		// we also need to make sure this new ticket gets the same datetime attachments as the archived ticket
830
+		$datetimes_on_existing = $ticket->datetimes();
831
+		$new_ticket = $this->_update_ticket_datetimes(
832
+			$new_ticket,
833
+			$datetimes_on_existing,
834
+			array_keys($datetimes_on_existing)
835
+		);
836
+		// $ticket will get archived later b/c we are NOT adding it to the saved_tickets array.
837
+		// if existing $ticket has sold amount, then we need to adjust the qty for the new TKT to = the remaining
838
+		// available.
839
+		if ($ticket->sold() > 0) {
840
+			$new_qty = $ticket->qty() - $ticket->sold();
841
+			$new_ticket->set_qty($new_qty);
842
+		}
843
+		// now we update the prices just for this ticket
844
+		$new_ticket = $this->_add_prices_to_ticket($price_rows, $new_ticket, true);
845
+		// and we update the base price
846
+		$new_ticket = $this->_add_prices_to_ticket(
847
+			array(),
848
+			$new_ticket,
849
+			true,
850
+			$base_price,
851
+			$base_price_id
852
+		);
853
+		return $new_ticket;
854
+	}
855 855
 
856 856
 
857
-    /**
858
-     * This attaches a list of given prices to a ticket.
859
-     * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change
860
-     * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old
861
-     * price info and prices are automatically "archived" via the ticket.
862
-     *
863
-     * @access  private
864
-     * @param array     $prices        Array of prices from the form.
865
-     * @param EE_Ticket $ticket        EE_Ticket object that prices are being attached to.
866
-     * @param bool      $new_prices    Whether attach existing incoming prices or create new ones.
867
-     * @param int|bool  $base_price    if FALSE then NOT doing a base price add.
868
-     * @param int|bool  $base_price_id if present then this is the base_price_id being updated.
869
-     * @return EE_Ticket
870
-     * @throws ReflectionException
871
-     * @throws InvalidArgumentException
872
-     * @throws InvalidInterfaceException
873
-     * @throws InvalidDataTypeException
874
-     * @throws EE_Error
875
-     */
876
-    protected function _add_prices_to_ticket(
877
-        $prices = array(),
878
-        EE_Ticket $ticket,
879
-        $new_prices = false,
880
-        $base_price = false,
881
-        $base_price_id = false
882
-    ) {
883
-        // let's just get any current prices that may exist on the given ticket
884
-        // so we can remove any prices that got trashed in this session.
885
-        $current_prices_on_ticket = $base_price !== false
886
-            ? $ticket->base_price(true)
887
-            : $ticket->price_modifiers();
888
-        $updated_prices = array();
889
-        // if $base_price ! FALSE then updating a base price.
890
-        if ($base_price !== false) {
891
-            $prices[1] = array(
892
-                'PRC_ID'     => $new_prices || $base_price_id === 1 ? null : $base_price_id,
893
-                'PRT_ID'     => 1,
894
-                'PRC_amount' => $base_price,
895
-                'PRC_name'   => $ticket->get('TKT_name'),
896
-                'PRC_desc'   => $ticket->get('TKT_description'),
897
-            );
898
-        }
899
-        // possibly need to save tkt
900
-        if (! $ticket->ID()) {
901
-            $ticket->save();
902
-        }
903
-        foreach ($prices as $row => $prc) {
904
-            $prt_id = ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null;
905
-            if (empty($prt_id)) {
906
-                continue;
907
-            } //prices MUST have a price type id.
908
-            $PRC_values = array(
909
-                'PRC_ID'         => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null,
910
-                'PRT_ID'         => $prt_id,
911
-                'PRC_amount'     => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0,
912
-                'PRC_name'       => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '',
913
-                'PRC_desc'       => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '',
914
-                'PRC_is_default' => false,
915
-                // make sure we set PRC_is_default to false for all ticket saves from event_editor
916
-                'PRC_order'      => $row,
917
-            );
918
-            if ($new_prices || empty($PRC_values['PRC_ID'])) {
919
-                $PRC_values['PRC_ID'] = 0;
920
-                $price = EE_Registry::instance()->load_class(
921
-                    'Price',
922
-                    array($PRC_values),
923
-                    false,
924
-                    false
925
-                );
926
-            } else {
927
-                $price = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']);
928
-                // update this price with new values
929
-                foreach ($PRC_values as $field => $value) {
930
-                    $price->set($field, $value);
931
-                }
932
-            }
933
-            $price->save();
934
-            $updated_prices[ $price->ID() ] = $price;
935
-            $ticket->_add_relation_to($price, 'Price');
936
-        }
937
-        // now let's remove any prices that got removed from the ticket
938
-        if (! empty($current_prices_on_ticket)) {
939
-            $current = array_keys($current_prices_on_ticket);
940
-            $updated = array_keys($updated_prices);
941
-            $prices_to_remove = array_diff($current, $updated);
942
-            if (! empty($prices_to_remove)) {
943
-                foreach ($prices_to_remove as $prc_id) {
944
-                    $p = $current_prices_on_ticket[ $prc_id ];
945
-                    $ticket->_remove_relation_to($p, 'Price');
946
-                    // delete permanently the price
947
-                    $p->delete_permanently();
948
-                }
949
-            }
950
-        }
951
-        return $ticket;
952
-    }
857
+	/**
858
+	 * This attaches a list of given prices to a ticket.
859
+	 * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change
860
+	 * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old
861
+	 * price info and prices are automatically "archived" via the ticket.
862
+	 *
863
+	 * @access  private
864
+	 * @param array     $prices        Array of prices from the form.
865
+	 * @param EE_Ticket $ticket        EE_Ticket object that prices are being attached to.
866
+	 * @param bool      $new_prices    Whether attach existing incoming prices or create new ones.
867
+	 * @param int|bool  $base_price    if FALSE then NOT doing a base price add.
868
+	 * @param int|bool  $base_price_id if present then this is the base_price_id being updated.
869
+	 * @return EE_Ticket
870
+	 * @throws ReflectionException
871
+	 * @throws InvalidArgumentException
872
+	 * @throws InvalidInterfaceException
873
+	 * @throws InvalidDataTypeException
874
+	 * @throws EE_Error
875
+	 */
876
+	protected function _add_prices_to_ticket(
877
+		$prices = array(),
878
+		EE_Ticket $ticket,
879
+		$new_prices = false,
880
+		$base_price = false,
881
+		$base_price_id = false
882
+	) {
883
+		// let's just get any current prices that may exist on the given ticket
884
+		// so we can remove any prices that got trashed in this session.
885
+		$current_prices_on_ticket = $base_price !== false
886
+			? $ticket->base_price(true)
887
+			: $ticket->price_modifiers();
888
+		$updated_prices = array();
889
+		// if $base_price ! FALSE then updating a base price.
890
+		if ($base_price !== false) {
891
+			$prices[1] = array(
892
+				'PRC_ID'     => $new_prices || $base_price_id === 1 ? null : $base_price_id,
893
+				'PRT_ID'     => 1,
894
+				'PRC_amount' => $base_price,
895
+				'PRC_name'   => $ticket->get('TKT_name'),
896
+				'PRC_desc'   => $ticket->get('TKT_description'),
897
+			);
898
+		}
899
+		// possibly need to save tkt
900
+		if (! $ticket->ID()) {
901
+			$ticket->save();
902
+		}
903
+		foreach ($prices as $row => $prc) {
904
+			$prt_id = ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null;
905
+			if (empty($prt_id)) {
906
+				continue;
907
+			} //prices MUST have a price type id.
908
+			$PRC_values = array(
909
+				'PRC_ID'         => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null,
910
+				'PRT_ID'         => $prt_id,
911
+				'PRC_amount'     => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0,
912
+				'PRC_name'       => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '',
913
+				'PRC_desc'       => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '',
914
+				'PRC_is_default' => false,
915
+				// make sure we set PRC_is_default to false for all ticket saves from event_editor
916
+				'PRC_order'      => $row,
917
+			);
918
+			if ($new_prices || empty($PRC_values['PRC_ID'])) {
919
+				$PRC_values['PRC_ID'] = 0;
920
+				$price = EE_Registry::instance()->load_class(
921
+					'Price',
922
+					array($PRC_values),
923
+					false,
924
+					false
925
+				);
926
+			} else {
927
+				$price = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']);
928
+				// update this price with new values
929
+				foreach ($PRC_values as $field => $value) {
930
+					$price->set($field, $value);
931
+				}
932
+			}
933
+			$price->save();
934
+			$updated_prices[ $price->ID() ] = $price;
935
+			$ticket->_add_relation_to($price, 'Price');
936
+		}
937
+		// now let's remove any prices that got removed from the ticket
938
+		if (! empty($current_prices_on_ticket)) {
939
+			$current = array_keys($current_prices_on_ticket);
940
+			$updated = array_keys($updated_prices);
941
+			$prices_to_remove = array_diff($current, $updated);
942
+			if (! empty($prices_to_remove)) {
943
+				foreach ($prices_to_remove as $prc_id) {
944
+					$p = $current_prices_on_ticket[ $prc_id ];
945
+					$ticket->_remove_relation_to($p, 'Price');
946
+					// delete permanently the price
947
+					$p->delete_permanently();
948
+				}
949
+			}
950
+		}
951
+		return $ticket;
952
+	}
953 953
 
954 954
 
955
-    /**
956
-     * @param Events_Admin_Page $event_admin_obj
957
-     * @return Events_Admin_Page
958
-     */
959
-    public function autosave_handling(Events_Admin_Page $event_admin_obj)
960
-    {
961
-        return $event_admin_obj;
962
-        // doing nothing for the moment.
963
-        // todo when I get to this remember that I need to set the template args on the $event_admin_obj
964
-        // (use the set_template_args() method)
965
-        /**
966
-         * need to remember to handle TICKET DEFAULT saves correctly:  I've got two input fields in the dom:
967
-         * 1. TKT_is_default_selector (visible)
968
-         * 2. TKT_is_default (hidden)
969
-         * I think we'll use the TKT_is_default for recording whether the ticket displayed IS a default ticket
970
-         * (on new event creations). Whereas the TKT_is_default_selector is for the user to indicate they want
971
-         * this ticket to be saved as a default.
972
-         * The tricky part is, on an initial display on create or edit (or after manually updating),
973
-         * the TKT_is_default_selector will always be unselected and the TKT_is_default will only be true
974
-         * if this is a create.  However, after an autosave, users will want some sort of indicator that
975
-         * the TKT HAS been saved as a default..
976
-         * in other words we don't want to remove the check on TKT_is_default_selector. So here's what I'm thinking.
977
-         * On Autosave:
978
-         * 1. If TKT_is_default is true: we create a new TKT, send back the new id and add id to related elements,
979
-         * then set the TKT_is_default to false.
980
-         * 2. If TKT_is_default_selector is true: we create/edit existing ticket (following conditions above as well).
981
-         *  We do NOT create a new default ticket.  The checkbox stays selected after autosave.
982
-         * 3. only on MANUAL update do we check for the selection and if selected create the new default ticket.
983
-         */
984
-    }
955
+	/**
956
+	 * @param Events_Admin_Page $event_admin_obj
957
+	 * @return Events_Admin_Page
958
+	 */
959
+	public function autosave_handling(Events_Admin_Page $event_admin_obj)
960
+	{
961
+		return $event_admin_obj;
962
+		// doing nothing for the moment.
963
+		// todo when I get to this remember that I need to set the template args on the $event_admin_obj
964
+		// (use the set_template_args() method)
965
+		/**
966
+		 * need to remember to handle TICKET DEFAULT saves correctly:  I've got two input fields in the dom:
967
+		 * 1. TKT_is_default_selector (visible)
968
+		 * 2. TKT_is_default (hidden)
969
+		 * I think we'll use the TKT_is_default for recording whether the ticket displayed IS a default ticket
970
+		 * (on new event creations). Whereas the TKT_is_default_selector is for the user to indicate they want
971
+		 * this ticket to be saved as a default.
972
+		 * The tricky part is, on an initial display on create or edit (or after manually updating),
973
+		 * the TKT_is_default_selector will always be unselected and the TKT_is_default will only be true
974
+		 * if this is a create.  However, after an autosave, users will want some sort of indicator that
975
+		 * the TKT HAS been saved as a default..
976
+		 * in other words we don't want to remove the check on TKT_is_default_selector. So here's what I'm thinking.
977
+		 * On Autosave:
978
+		 * 1. If TKT_is_default is true: we create a new TKT, send back the new id and add id to related elements,
979
+		 * then set the TKT_is_default to false.
980
+		 * 2. If TKT_is_default_selector is true: we create/edit existing ticket (following conditions above as well).
981
+		 *  We do NOT create a new default ticket.  The checkbox stays selected after autosave.
982
+		 * 3. only on MANUAL update do we check for the selection and if selected create the new default ticket.
983
+		 */
984
+	}
985 985
 
986 986
 
987
-    /**
988
-     * @throws ReflectionException
989
-     * @throws InvalidArgumentException
990
-     * @throws InvalidInterfaceException
991
-     * @throws InvalidDataTypeException
992
-     * @throws DomainException
993
-     * @throws EE_Error
994
-     */
995
-    public function pricing_metabox()
996
-    {
997
-        $existing_datetime_ids = $existing_ticket_ids = $datetime_tickets = $ticket_datetimes = array();
998
-        $event = $this->_adminpage_obj->get_cpt_model_obj();
999
-        // set is_creating_event property.
1000
-        $EVT_ID = $event->ID();
1001
-        $this->_is_creating_event = empty($this->_req_data['post']);
1002
-        // default main template args
1003
-        $main_template_args = array(
1004
-            'event_datetime_help_link' => EEH_Template::get_help_tab_link(
1005
-                'event_editor_event_datetimes_help_tab',
1006
-                $this->_adminpage_obj->page_slug,
1007
-                $this->_adminpage_obj->get_req_action(),
1008
-                false,
1009
-                false
1010
-            ),
1011
-            // todo need to add a filter to the template for the help text
1012
-            // in the Events_Admin_Page core file so we can add further help
1013
-            'existing_datetime_ids'    => '',
1014
-            'total_dtt_rows'           => 1,
1015
-            'add_new_dtt_help_link'    => EEH_Template::get_help_tab_link(
1016
-                'add_new_dtt_info',
1017
-                $this->_adminpage_obj->page_slug,
1018
-                $this->_adminpage_obj->get_req_action(),
1019
-                false,
1020
-                false
1021
-            ),
1022
-            // todo need to add this help info id to the Events_Admin_Page core file so we can access it here.
1023
-            'datetime_rows'            => '',
1024
-            'show_tickets_container'   => '',
1025
-            // $this->_adminpage_obj->get_cpt_model_obj()->ID() > 1 ? ' style="display:none;"' : '',
1026
-            'ticket_rows'              => '',
1027
-            'existing_ticket_ids'      => '',
1028
-            'total_ticket_rows'        => 1,
1029
-            'ticket_js_structure'      => '',
1030
-            'ee_collapsible_status'    => ' ee-collapsible-open'
1031
-            // $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' ee-collapsible-closed' : ' ee-collapsible-open'
1032
-        );
1033
-        $timezone = $event instanceof EE_Event ? $event->timezone_string() : null;
1034
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1035
-        /**
1036
-         * 1. Start with retrieving Datetimes
1037
-         * 2. For each datetime get related tickets
1038
-         * 3. For each ticket get related prices
1039
-         */
1040
-        /** @var EEM_Datetime $datetime_model */
1041
-        $datetime_model = EE_Registry::instance()->load_model('Datetime', array($timezone));
1042
-        $datetimes = $datetime_model->get_all_event_dates($EVT_ID);
1043
-        $main_template_args['total_dtt_rows'] = count($datetimes);
1044
-        /**
1045
-         * @see https://events.codebasehq.com/projects/event-espresso/tickets/9486
1046
-         * for why we are counting $datetime_row and then setting that on the Datetime object
1047
-         */
1048
-        $datetime_row = 1;
1049
-        foreach ($datetimes as $datetime) {
1050
-            $DTT_ID = $datetime->get('DTT_ID');
1051
-            $datetime->set('DTT_order', $datetime_row);
1052
-            $existing_datetime_ids[] = $DTT_ID;
1053
-            // tickets attached
1054
-            $related_tickets = $datetime->ID() > 0
1055
-                ? $datetime->get_many_related(
1056
-                    'Ticket',
1057
-                    array(
1058
-                        array(
1059
-                            'OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0),
1060
-                        ),
1061
-                        'default_where_conditions' => 'none',
1062
-                        'order_by'                 => array('TKT_order' => 'ASC'),
1063
-                    )
1064
-                )
1065
-                : array();
1066
-            // if there are no related tickets this is likely a new event OR autodraft
1067
-            // event so we need to generate the default tickets because datetimes
1068
-            // ALWAYS have at least one related ticket!!.  EXCEPT, we dont' do this if there is already more than one
1069
-            // datetime on the event.
1070
-            if (empty($related_tickets) && count($datetimes) < 2) {
1071
-                /** @var EEM_Ticket $ticket_model */
1072
-                $ticket_model = EE_Registry::instance()->load_model('Ticket');
1073
-                $related_tickets = $ticket_model->get_all_default_tickets();
1074
-                // this should be ordered by TKT_ID, so let's grab the first default ticket
1075
-                // (which will be the main default) and ensure it has any default prices added to it (but do NOT save).
1076
-                $default_prices = EEM_Price::instance()->get_all_default_prices();
1077
-                $main_default_ticket = reset($related_tickets);
1078
-                if ($main_default_ticket instanceof EE_Ticket) {
1079
-                    foreach ($default_prices as $default_price) {
1080
-                        if ($default_price instanceof EE_Price && $default_price->is_base_price()) {
1081
-                            continue;
1082
-                        }
1083
-                        $main_default_ticket->cache('Price', $default_price);
1084
-                    }
1085
-                }
1086
-            }
1087
-            // we can't actually setup rows in this loop yet cause we don't know all
1088
-            // the unique tickets for this event yet (tickets are linked through all datetimes).
1089
-            // So we're going to temporarily cache some of that information.
1090
-            // loop through and setup the ticket rows and make sure the order is set.
1091
-            foreach ($related_tickets as $ticket) {
1092
-                $TKT_ID = $ticket->get('TKT_ID');
1093
-                $ticket_row = $ticket->get('TKT_row');
1094
-                // we only want unique tickets in our final display!!
1095
-                if (! in_array($TKT_ID, $existing_ticket_ids, true)) {
1096
-                    $existing_ticket_ids[] = $TKT_ID;
1097
-                    $all_tickets[] = $ticket;
1098
-                }
1099
-                // temporary cache of this ticket info for this datetime for later processing of datetime rows.
1100
-                $datetime_tickets[ $DTT_ID ][] = $ticket_row;
1101
-                // temporary cache of this datetime info for this ticket for later processing of ticket rows.
1102
-                if (
1103
-                    ! isset($ticket_datetimes[ $TKT_ID ])
1104
-                    || ! in_array($datetime_row, $ticket_datetimes[ $TKT_ID ], true)
1105
-                ) {
1106
-                    $ticket_datetimes[ $TKT_ID ][] = $datetime_row;
1107
-                }
1108
-            }
1109
-            $datetime_row++;
1110
-        }
1111
-        $main_template_args['total_ticket_rows'] = count($existing_ticket_ids);
1112
-        $main_template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids);
1113
-        $main_template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids);
1114
-        // sort $all_tickets by order
1115
-        usort(
1116
-            $all_tickets,
1117
-            function (EE_Ticket $a, EE_Ticket $b) {
1118
-                $a_order = (int) $a->get('TKT_order');
1119
-                $b_order = (int) $b->get('TKT_order');
1120
-                if ($a_order === $b_order) {
1121
-                    return 0;
1122
-                }
1123
-                return ($a_order < $b_order) ? -1 : 1;
1124
-            }
1125
-        );
1126
-        // k NOW we have all the data we need for setting up the dtt rows
1127
-        // and ticket rows so we start our dtt loop again.
1128
-        $datetime_row = 1;
1129
-        foreach ($datetimes as $datetime) {
1130
-            $main_template_args['datetime_rows'] .= $this->_get_datetime_row(
1131
-                $datetime_row,
1132
-                $datetime,
1133
-                $datetime_tickets,
1134
-                $all_tickets,
1135
-                false,
1136
-                $datetimes
1137
-            );
1138
-            $datetime_row++;
1139
-        }
1140
-        // then loop through all tickets for the ticket rows.
1141
-        $ticket_row = 1;
1142
-        foreach ($all_tickets as $ticket) {
1143
-            $main_template_args['ticket_rows'] .= $this->_get_ticket_row(
1144
-                $ticket_row,
1145
-                $ticket,
1146
-                $ticket_datetimes,
1147
-                $datetimes,
1148
-                false,
1149
-                $all_tickets
1150
-            );
1151
-            $ticket_row++;
1152
-        }
1153
-        $main_template_args['ticket_js_structure'] = $this->_get_ticket_js_structure($datetimes, $all_tickets);
987
+	/**
988
+	 * @throws ReflectionException
989
+	 * @throws InvalidArgumentException
990
+	 * @throws InvalidInterfaceException
991
+	 * @throws InvalidDataTypeException
992
+	 * @throws DomainException
993
+	 * @throws EE_Error
994
+	 */
995
+	public function pricing_metabox()
996
+	{
997
+		$existing_datetime_ids = $existing_ticket_ids = $datetime_tickets = $ticket_datetimes = array();
998
+		$event = $this->_adminpage_obj->get_cpt_model_obj();
999
+		// set is_creating_event property.
1000
+		$EVT_ID = $event->ID();
1001
+		$this->_is_creating_event = empty($this->_req_data['post']);
1002
+		// default main template args
1003
+		$main_template_args = array(
1004
+			'event_datetime_help_link' => EEH_Template::get_help_tab_link(
1005
+				'event_editor_event_datetimes_help_tab',
1006
+				$this->_adminpage_obj->page_slug,
1007
+				$this->_adminpage_obj->get_req_action(),
1008
+				false,
1009
+				false
1010
+			),
1011
+			// todo need to add a filter to the template for the help text
1012
+			// in the Events_Admin_Page core file so we can add further help
1013
+			'existing_datetime_ids'    => '',
1014
+			'total_dtt_rows'           => 1,
1015
+			'add_new_dtt_help_link'    => EEH_Template::get_help_tab_link(
1016
+				'add_new_dtt_info',
1017
+				$this->_adminpage_obj->page_slug,
1018
+				$this->_adminpage_obj->get_req_action(),
1019
+				false,
1020
+				false
1021
+			),
1022
+			// todo need to add this help info id to the Events_Admin_Page core file so we can access it here.
1023
+			'datetime_rows'            => '',
1024
+			'show_tickets_container'   => '',
1025
+			// $this->_adminpage_obj->get_cpt_model_obj()->ID() > 1 ? ' style="display:none;"' : '',
1026
+			'ticket_rows'              => '',
1027
+			'existing_ticket_ids'      => '',
1028
+			'total_ticket_rows'        => 1,
1029
+			'ticket_js_structure'      => '',
1030
+			'ee_collapsible_status'    => ' ee-collapsible-open'
1031
+			// $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' ee-collapsible-closed' : ' ee-collapsible-open'
1032
+		);
1033
+		$timezone = $event instanceof EE_Event ? $event->timezone_string() : null;
1034
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1035
+		/**
1036
+		 * 1. Start with retrieving Datetimes
1037
+		 * 2. For each datetime get related tickets
1038
+		 * 3. For each ticket get related prices
1039
+		 */
1040
+		/** @var EEM_Datetime $datetime_model */
1041
+		$datetime_model = EE_Registry::instance()->load_model('Datetime', array($timezone));
1042
+		$datetimes = $datetime_model->get_all_event_dates($EVT_ID);
1043
+		$main_template_args['total_dtt_rows'] = count($datetimes);
1044
+		/**
1045
+		 * @see https://events.codebasehq.com/projects/event-espresso/tickets/9486
1046
+		 * for why we are counting $datetime_row and then setting that on the Datetime object
1047
+		 */
1048
+		$datetime_row = 1;
1049
+		foreach ($datetimes as $datetime) {
1050
+			$DTT_ID = $datetime->get('DTT_ID');
1051
+			$datetime->set('DTT_order', $datetime_row);
1052
+			$existing_datetime_ids[] = $DTT_ID;
1053
+			// tickets attached
1054
+			$related_tickets = $datetime->ID() > 0
1055
+				? $datetime->get_many_related(
1056
+					'Ticket',
1057
+					array(
1058
+						array(
1059
+							'OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0),
1060
+						),
1061
+						'default_where_conditions' => 'none',
1062
+						'order_by'                 => array('TKT_order' => 'ASC'),
1063
+					)
1064
+				)
1065
+				: array();
1066
+			// if there are no related tickets this is likely a new event OR autodraft
1067
+			// event so we need to generate the default tickets because datetimes
1068
+			// ALWAYS have at least one related ticket!!.  EXCEPT, we dont' do this if there is already more than one
1069
+			// datetime on the event.
1070
+			if (empty($related_tickets) && count($datetimes) < 2) {
1071
+				/** @var EEM_Ticket $ticket_model */
1072
+				$ticket_model = EE_Registry::instance()->load_model('Ticket');
1073
+				$related_tickets = $ticket_model->get_all_default_tickets();
1074
+				// this should be ordered by TKT_ID, so let's grab the first default ticket
1075
+				// (which will be the main default) and ensure it has any default prices added to it (but do NOT save).
1076
+				$default_prices = EEM_Price::instance()->get_all_default_prices();
1077
+				$main_default_ticket = reset($related_tickets);
1078
+				if ($main_default_ticket instanceof EE_Ticket) {
1079
+					foreach ($default_prices as $default_price) {
1080
+						if ($default_price instanceof EE_Price && $default_price->is_base_price()) {
1081
+							continue;
1082
+						}
1083
+						$main_default_ticket->cache('Price', $default_price);
1084
+					}
1085
+				}
1086
+			}
1087
+			// we can't actually setup rows in this loop yet cause we don't know all
1088
+			// the unique tickets for this event yet (tickets are linked through all datetimes).
1089
+			// So we're going to temporarily cache some of that information.
1090
+			// loop through and setup the ticket rows and make sure the order is set.
1091
+			foreach ($related_tickets as $ticket) {
1092
+				$TKT_ID = $ticket->get('TKT_ID');
1093
+				$ticket_row = $ticket->get('TKT_row');
1094
+				// we only want unique tickets in our final display!!
1095
+				if (! in_array($TKT_ID, $existing_ticket_ids, true)) {
1096
+					$existing_ticket_ids[] = $TKT_ID;
1097
+					$all_tickets[] = $ticket;
1098
+				}
1099
+				// temporary cache of this ticket info for this datetime for later processing of datetime rows.
1100
+				$datetime_tickets[ $DTT_ID ][] = $ticket_row;
1101
+				// temporary cache of this datetime info for this ticket for later processing of ticket rows.
1102
+				if (
1103
+					! isset($ticket_datetimes[ $TKT_ID ])
1104
+					|| ! in_array($datetime_row, $ticket_datetimes[ $TKT_ID ], true)
1105
+				) {
1106
+					$ticket_datetimes[ $TKT_ID ][] = $datetime_row;
1107
+				}
1108
+			}
1109
+			$datetime_row++;
1110
+		}
1111
+		$main_template_args['total_ticket_rows'] = count($existing_ticket_ids);
1112
+		$main_template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids);
1113
+		$main_template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids);
1114
+		// sort $all_tickets by order
1115
+		usort(
1116
+			$all_tickets,
1117
+			function (EE_Ticket $a, EE_Ticket $b) {
1118
+				$a_order = (int) $a->get('TKT_order');
1119
+				$b_order = (int) $b->get('TKT_order');
1120
+				if ($a_order === $b_order) {
1121
+					return 0;
1122
+				}
1123
+				return ($a_order < $b_order) ? -1 : 1;
1124
+			}
1125
+		);
1126
+		// k NOW we have all the data we need for setting up the dtt rows
1127
+		// and ticket rows so we start our dtt loop again.
1128
+		$datetime_row = 1;
1129
+		foreach ($datetimes as $datetime) {
1130
+			$main_template_args['datetime_rows'] .= $this->_get_datetime_row(
1131
+				$datetime_row,
1132
+				$datetime,
1133
+				$datetime_tickets,
1134
+				$all_tickets,
1135
+				false,
1136
+				$datetimes
1137
+			);
1138
+			$datetime_row++;
1139
+		}
1140
+		// then loop through all tickets for the ticket rows.
1141
+		$ticket_row = 1;
1142
+		foreach ($all_tickets as $ticket) {
1143
+			$main_template_args['ticket_rows'] .= $this->_get_ticket_row(
1144
+				$ticket_row,
1145
+				$ticket,
1146
+				$ticket_datetimes,
1147
+				$datetimes,
1148
+				false,
1149
+				$all_tickets
1150
+			);
1151
+			$ticket_row++;
1152
+		}
1153
+		$main_template_args['ticket_js_structure'] = $this->_get_ticket_js_structure($datetimes, $all_tickets);
1154 1154
 
1155
-        $status_change_notice = EventEspresso\core\services\loaders\LoaderFactory::getLoader()->getShared(
1156
-            'EventEspresso\core\admin\StatusChangeNotice'
1157
-        );
1158
-        if (! $status_change_notice->isDismissed()) {
1159
-            $main_template_args['status_change_notice'] = EEH_Template::display_template(
1160
-                EE_ADMIN_TEMPLATE . 'status_change_notice.template.php',
1161
-                ['context' => '__event-editor', 'page_slug' => 'espresso-events'],
1162
-                true
1163
-            );
1164
-        }
1155
+		$status_change_notice = EventEspresso\core\services\loaders\LoaderFactory::getLoader()->getShared(
1156
+			'EventEspresso\core\admin\StatusChangeNotice'
1157
+		);
1158
+		if (! $status_change_notice->isDismissed()) {
1159
+			$main_template_args['status_change_notice'] = EEH_Template::display_template(
1160
+				EE_ADMIN_TEMPLATE . 'status_change_notice.template.php',
1161
+				['context' => '__event-editor', 'page_slug' => 'espresso-events'],
1162
+				true
1163
+			);
1164
+		}
1165 1165
 
1166
-        EEH_Template::display_template(
1167
-            PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php',
1168
-            $main_template_args
1169
-        );
1170
-    }
1166
+		EEH_Template::display_template(
1167
+			PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php',
1168
+			$main_template_args
1169
+		);
1170
+	}
1171 1171
 
1172 1172
 
1173
-    /**
1174
-     * @param int         $datetime_row
1175
-     * @param EE_Datetime $datetime
1176
-     * @param array       $datetime_tickets
1177
-     * @param array       $all_tickets
1178
-     * @param bool        $default
1179
-     * @param array       $all_datetimes
1180
-     * @return mixed
1181
-     * @throws DomainException
1182
-     * @throws EE_Error
1183
-     */
1184
-    protected function _get_datetime_row(
1185
-        $datetime_row,
1186
-        EE_Datetime $datetime,
1187
-        $datetime_tickets = array(),
1188
-        $all_tickets = array(),
1189
-        $default = false,
1190
-        $all_datetimes = array()
1191
-    ) {
1192
-        $dtt_display_template_args = array(
1193
-            'dtt_edit_row'             => $this->_get_dtt_edit_row(
1194
-                $datetime_row,
1195
-                $datetime,
1196
-                $default,
1197
-                $all_datetimes
1198
-            ),
1199
-            'dtt_attached_tickets_row' => $this->_get_dtt_attached_tickets_row(
1200
-                $datetime_row,
1201
-                $datetime,
1202
-                $datetime_tickets,
1203
-                $all_tickets,
1204
-                $default
1205
-            ),
1206
-            'dtt_row'                  => $default ? 'DTTNUM' : $datetime_row,
1207
-        );
1208
-        return EEH_Template::display_template(
1209
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php',
1210
-            $dtt_display_template_args,
1211
-            true
1212
-        );
1213
-    }
1173
+	/**
1174
+	 * @param int         $datetime_row
1175
+	 * @param EE_Datetime $datetime
1176
+	 * @param array       $datetime_tickets
1177
+	 * @param array       $all_tickets
1178
+	 * @param bool        $default
1179
+	 * @param array       $all_datetimes
1180
+	 * @return mixed
1181
+	 * @throws DomainException
1182
+	 * @throws EE_Error
1183
+	 */
1184
+	protected function _get_datetime_row(
1185
+		$datetime_row,
1186
+		EE_Datetime $datetime,
1187
+		$datetime_tickets = array(),
1188
+		$all_tickets = array(),
1189
+		$default = false,
1190
+		$all_datetimes = array()
1191
+	) {
1192
+		$dtt_display_template_args = array(
1193
+			'dtt_edit_row'             => $this->_get_dtt_edit_row(
1194
+				$datetime_row,
1195
+				$datetime,
1196
+				$default,
1197
+				$all_datetimes
1198
+			),
1199
+			'dtt_attached_tickets_row' => $this->_get_dtt_attached_tickets_row(
1200
+				$datetime_row,
1201
+				$datetime,
1202
+				$datetime_tickets,
1203
+				$all_tickets,
1204
+				$default
1205
+			),
1206
+			'dtt_row'                  => $default ? 'DTTNUM' : $datetime_row,
1207
+		);
1208
+		return EEH_Template::display_template(
1209
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php',
1210
+			$dtt_display_template_args,
1211
+			true
1212
+		);
1213
+	}
1214 1214
 
1215 1215
 
1216
-    /**
1217
-     * This method is used to generate a dtt fields  edit row.
1218
-     * The same row is used to generate a row with valid DTT objects
1219
-     * and the default row that is used as the skeleton by the js.
1220
-     *
1221
-     * @param int           $datetime_row  The row number for the row being generated.
1222
-     * @param EE_Datetime   $datetime
1223
-     * @param bool          $default       Whether a default row is being generated or not.
1224
-     * @param EE_Datetime[] $all_datetimes This is the array of all datetimes used in the editor.
1225
-     * @return string
1226
-     * @throws DomainException
1227
-     * @throws EE_Error
1228
-     */
1229
-    protected function _get_dtt_edit_row($datetime_row, $datetime, $default, $all_datetimes)
1230
-    {
1231
-        // if the incoming $datetime object is NOT an instance of EE_Datetime then force default to true.
1232
-        $default = ! $datetime instanceof EE_Datetime ? true : $default;
1233
-        $template_args = array(
1234
-            'dtt_row'              => $default ? 'DTTNUM' : $datetime_row,
1235
-            'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes',
1236
-            'edit_dtt_expanded'    => '',
1237
-            'DTT_ID'               => $default ? '' : $datetime->ID(),
1238
-            'DTT_name'             => $default ? '' : $datetime->get_f('DTT_name'),
1239
-            'DTT_description'      => $default ? '' : $datetime->get_f('DTT_description'),
1240
-            'DTT_EVT_start'        => $default ? '' : $datetime->start_date($this->_date_time_format),
1241
-            'DTT_EVT_end'          => $default ? '' : $datetime->end_date($this->_date_time_format),
1242
-            'DTT_reg_limit'        => $default
1243
-                ? ''
1244
-                : $datetime->get_pretty(
1245
-                    'DTT_reg_limit',
1246
-                    'input'
1247
-                ),
1248
-            'DTT_order'            => $default ? 'DTTNUM' : $datetime_row,
1249
-            'dtt_sold'             => $default ? '0' : $datetime->get('DTT_sold'),
1250
-            'dtt_reserved'         => $default ? '0' : $datetime->reserved(),
1251
-            'clone_icon'           => ! empty($datetime) && $datetime->get('DTT_sold') > 0
1252
-                ? ''
1253
-                : 'clone-icon ee-icon ee-icon-clone clickable',
1254
-            'trash_icon'           => ! empty($datetime) && $datetime->get('DTT_sold') > 0
1255
-                ? 'ee-lock-icon'
1256
-                : 'trash-icon dashicons dashicons-post-trash clickable',
1257
-            'reg_list_url'         => $default || ! $datetime->event() instanceof \EE_Event
1258
-                ? ''
1259
-                : EE_Admin_Page::add_query_args_and_nonce(
1260
-                    array('event_id' => $datetime->event()->ID(), 'datetime_id' => $datetime->ID()),
1261
-                    REG_ADMIN_URL
1262
-                ),
1263
-        );
1264
-        $template_args['show_trash'] = count($all_datetimes) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon'
1265
-            ? ' style="display:none"'
1266
-            : '';
1267
-        // allow filtering of template args at this point.
1268
-        $template_args = apply_filters(
1269
-            'FHEE__espresso_events_Pricing_Hooks___get_dtt_edit_row__template_args',
1270
-            $template_args,
1271
-            $datetime_row,
1272
-            $datetime,
1273
-            $default,
1274
-            $all_datetimes,
1275
-            $this->_is_creating_event
1276
-        );
1277
-        return EEH_Template::display_template(
1278
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php',
1279
-            $template_args,
1280
-            true
1281
-        );
1282
-    }
1216
+	/**
1217
+	 * This method is used to generate a dtt fields  edit row.
1218
+	 * The same row is used to generate a row with valid DTT objects
1219
+	 * and the default row that is used as the skeleton by the js.
1220
+	 *
1221
+	 * @param int           $datetime_row  The row number for the row being generated.
1222
+	 * @param EE_Datetime   $datetime
1223
+	 * @param bool          $default       Whether a default row is being generated or not.
1224
+	 * @param EE_Datetime[] $all_datetimes This is the array of all datetimes used in the editor.
1225
+	 * @return string
1226
+	 * @throws DomainException
1227
+	 * @throws EE_Error
1228
+	 */
1229
+	protected function _get_dtt_edit_row($datetime_row, $datetime, $default, $all_datetimes)
1230
+	{
1231
+		// if the incoming $datetime object is NOT an instance of EE_Datetime then force default to true.
1232
+		$default = ! $datetime instanceof EE_Datetime ? true : $default;
1233
+		$template_args = array(
1234
+			'dtt_row'              => $default ? 'DTTNUM' : $datetime_row,
1235
+			'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes',
1236
+			'edit_dtt_expanded'    => '',
1237
+			'DTT_ID'               => $default ? '' : $datetime->ID(),
1238
+			'DTT_name'             => $default ? '' : $datetime->get_f('DTT_name'),
1239
+			'DTT_description'      => $default ? '' : $datetime->get_f('DTT_description'),
1240
+			'DTT_EVT_start'        => $default ? '' : $datetime->start_date($this->_date_time_format),
1241
+			'DTT_EVT_end'          => $default ? '' : $datetime->end_date($this->_date_time_format),
1242
+			'DTT_reg_limit'        => $default
1243
+				? ''
1244
+				: $datetime->get_pretty(
1245
+					'DTT_reg_limit',
1246
+					'input'
1247
+				),
1248
+			'DTT_order'            => $default ? 'DTTNUM' : $datetime_row,
1249
+			'dtt_sold'             => $default ? '0' : $datetime->get('DTT_sold'),
1250
+			'dtt_reserved'         => $default ? '0' : $datetime->reserved(),
1251
+			'clone_icon'           => ! empty($datetime) && $datetime->get('DTT_sold') > 0
1252
+				? ''
1253
+				: 'clone-icon ee-icon ee-icon-clone clickable',
1254
+			'trash_icon'           => ! empty($datetime) && $datetime->get('DTT_sold') > 0
1255
+				? 'ee-lock-icon'
1256
+				: 'trash-icon dashicons dashicons-post-trash clickable',
1257
+			'reg_list_url'         => $default || ! $datetime->event() instanceof \EE_Event
1258
+				? ''
1259
+				: EE_Admin_Page::add_query_args_and_nonce(
1260
+					array('event_id' => $datetime->event()->ID(), 'datetime_id' => $datetime->ID()),
1261
+					REG_ADMIN_URL
1262
+				),
1263
+		);
1264
+		$template_args['show_trash'] = count($all_datetimes) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon'
1265
+			? ' style="display:none"'
1266
+			: '';
1267
+		// allow filtering of template args at this point.
1268
+		$template_args = apply_filters(
1269
+			'FHEE__espresso_events_Pricing_Hooks___get_dtt_edit_row__template_args',
1270
+			$template_args,
1271
+			$datetime_row,
1272
+			$datetime,
1273
+			$default,
1274
+			$all_datetimes,
1275
+			$this->_is_creating_event
1276
+		);
1277
+		return EEH_Template::display_template(
1278
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php',
1279
+			$template_args,
1280
+			true
1281
+		);
1282
+	}
1283 1283
 
1284 1284
 
1285
-    /**
1286
-     * @param int         $datetime_row
1287
-     * @param EE_Datetime $datetime
1288
-     * @param array       $datetime_tickets
1289
-     * @param array       $all_tickets
1290
-     * @param bool        $default
1291
-     * @return mixed
1292
-     * @throws DomainException
1293
-     * @throws EE_Error
1294
-     */
1295
-    protected function _get_dtt_attached_tickets_row(
1296
-        $datetime_row,
1297
-        $datetime,
1298
-        $datetime_tickets = array(),
1299
-        $all_tickets = array(),
1300
-        $default
1301
-    ) {
1302
-        $template_args = array(
1303
-            'dtt_row'                           => $default ? 'DTTNUM' : $datetime_row,
1304
-            'event_datetimes_name'              => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes',
1305
-            'DTT_description'                   => $default ? '' : $datetime->get_f('DTT_description'),
1306
-            'datetime_tickets_list'             => $default ? '<li class="hidden"></li>' : '',
1307
-            'show_tickets_row'                  => ' style="display:none;"',
1308
-            'add_new_datetime_ticket_help_link' => EEH_Template::get_help_tab_link(
1309
-                'add_new_ticket_via_datetime',
1310
-                $this->_adminpage_obj->page_slug,
1311
-                $this->_adminpage_obj->get_req_action(),
1312
-                false,
1313
-                false
1314
-            ),
1315
-            // todo need to add this help info id to the Events_Admin_Page core file so we can access it here.
1316
-            'DTT_ID'                            => $default ? '' : $datetime->ID(),
1317
-        );
1318
-        // need to setup the list items (but only if this isn't a default skeleton setup)
1319
-        if (! $default) {
1320
-            $ticket_row = 1;
1321
-            foreach ($all_tickets as $ticket) {
1322
-                $template_args['datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item(
1323
-                    $datetime_row,
1324
-                    $ticket_row,
1325
-                    $datetime,
1326
-                    $ticket,
1327
-                    $datetime_tickets,
1328
-                    $default
1329
-                );
1330
-                $ticket_row++;
1331
-            }
1332
-        }
1333
-        // filter template args at this point
1334
-        $template_args = apply_filters(
1335
-            'FHEE__espresso_events_Pricing_Hooks___get_dtt_attached_ticket_row__template_args',
1336
-            $template_args,
1337
-            $datetime_row,
1338
-            $datetime,
1339
-            $datetime_tickets,
1340
-            $all_tickets,
1341
-            $default,
1342
-            $this->_is_creating_event
1343
-        );
1344
-        return EEH_Template::display_template(
1345
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php',
1346
-            $template_args,
1347
-            true
1348
-        );
1349
-    }
1285
+	/**
1286
+	 * @param int         $datetime_row
1287
+	 * @param EE_Datetime $datetime
1288
+	 * @param array       $datetime_tickets
1289
+	 * @param array       $all_tickets
1290
+	 * @param bool        $default
1291
+	 * @return mixed
1292
+	 * @throws DomainException
1293
+	 * @throws EE_Error
1294
+	 */
1295
+	protected function _get_dtt_attached_tickets_row(
1296
+		$datetime_row,
1297
+		$datetime,
1298
+		$datetime_tickets = array(),
1299
+		$all_tickets = array(),
1300
+		$default
1301
+	) {
1302
+		$template_args = array(
1303
+			'dtt_row'                           => $default ? 'DTTNUM' : $datetime_row,
1304
+			'event_datetimes_name'              => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes',
1305
+			'DTT_description'                   => $default ? '' : $datetime->get_f('DTT_description'),
1306
+			'datetime_tickets_list'             => $default ? '<li class="hidden"></li>' : '',
1307
+			'show_tickets_row'                  => ' style="display:none;"',
1308
+			'add_new_datetime_ticket_help_link' => EEH_Template::get_help_tab_link(
1309
+				'add_new_ticket_via_datetime',
1310
+				$this->_adminpage_obj->page_slug,
1311
+				$this->_adminpage_obj->get_req_action(),
1312
+				false,
1313
+				false
1314
+			),
1315
+			// todo need to add this help info id to the Events_Admin_Page core file so we can access it here.
1316
+			'DTT_ID'                            => $default ? '' : $datetime->ID(),
1317
+		);
1318
+		// need to setup the list items (but only if this isn't a default skeleton setup)
1319
+		if (! $default) {
1320
+			$ticket_row = 1;
1321
+			foreach ($all_tickets as $ticket) {
1322
+				$template_args['datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item(
1323
+					$datetime_row,
1324
+					$ticket_row,
1325
+					$datetime,
1326
+					$ticket,
1327
+					$datetime_tickets,
1328
+					$default
1329
+				);
1330
+				$ticket_row++;
1331
+			}
1332
+		}
1333
+		// filter template args at this point
1334
+		$template_args = apply_filters(
1335
+			'FHEE__espresso_events_Pricing_Hooks___get_dtt_attached_ticket_row__template_args',
1336
+			$template_args,
1337
+			$datetime_row,
1338
+			$datetime,
1339
+			$datetime_tickets,
1340
+			$all_tickets,
1341
+			$default,
1342
+			$this->_is_creating_event
1343
+		);
1344
+		return EEH_Template::display_template(
1345
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php',
1346
+			$template_args,
1347
+			true
1348
+		);
1349
+	}
1350 1350
 
1351 1351
 
1352
-    /**
1353
-     * @param int         $datetime_row
1354
-     * @param int         $ticket_row
1355
-     * @param EE_Datetime $datetime
1356
-     * @param EE_Ticket   $ticket
1357
-     * @param array       $datetime_tickets
1358
-     * @param bool        $default
1359
-     * @return mixed
1360
-     * @throws DomainException
1361
-     * @throws EE_Error
1362
-     */
1363
-    protected function _get_datetime_tickets_list_item(
1364
-        $datetime_row,
1365
-        $ticket_row,
1366
-        $datetime,
1367
-        $ticket,
1368
-        $datetime_tickets = array(),
1369
-        $default
1370
-    ) {
1371
-        $dtt_tkts = $datetime instanceof EE_Datetime && isset($datetime_tickets[ $datetime->ID() ])
1372
-            ? $datetime_tickets[ $datetime->ID() ]
1373
-            : array();
1374
-        $display_row = $ticket instanceof EE_Ticket ? $ticket->get('TKT_row') : 0;
1375
-        $no_ticket = $default && empty($ticket);
1376
-        $template_args = array(
1377
-            'dtt_row'                 => $default
1378
-                ? 'DTTNUM'
1379
-                : $datetime_row,
1380
-            'tkt_row'                 => $no_ticket
1381
-                ? 'TICKETNUM'
1382
-                : $ticket_row,
1383
-            'datetime_ticket_checked' => in_array($display_row, $dtt_tkts, true)
1384
-                ? ' checked="checked"'
1385
-                : '',
1386
-            'ticket_selected'         => in_array($display_row, $dtt_tkts, true)
1387
-                ? ' ticket-selected'
1388
-                : '',
1389
-            'TKT_name'                => $no_ticket
1390
-                ? 'TKTNAME'
1391
-                : $ticket->get('TKT_name'),
1392
-            'tkt_status_class'        => $no_ticket || $this->_is_creating_event
1393
-                ? ' tkt-status-' . EE_Ticket::onsale
1394
-                : ' tkt-status-' . $ticket->ticket_status(),
1395
-        );
1396
-        // filter template args
1397
-        $template_args = apply_filters(
1398
-            'FHEE__espresso_events_Pricing_Hooks___get_datetime_tickets_list_item__template_args',
1399
-            $template_args,
1400
-            $datetime_row,
1401
-            $ticket_row,
1402
-            $datetime,
1403
-            $ticket,
1404
-            $datetime_tickets,
1405
-            $default,
1406
-            $this->_is_creating_event
1407
-        );
1408
-        return EEH_Template::display_template(
1409
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php',
1410
-            $template_args,
1411
-            true
1412
-        );
1413
-    }
1352
+	/**
1353
+	 * @param int         $datetime_row
1354
+	 * @param int         $ticket_row
1355
+	 * @param EE_Datetime $datetime
1356
+	 * @param EE_Ticket   $ticket
1357
+	 * @param array       $datetime_tickets
1358
+	 * @param bool        $default
1359
+	 * @return mixed
1360
+	 * @throws DomainException
1361
+	 * @throws EE_Error
1362
+	 */
1363
+	protected function _get_datetime_tickets_list_item(
1364
+		$datetime_row,
1365
+		$ticket_row,
1366
+		$datetime,
1367
+		$ticket,
1368
+		$datetime_tickets = array(),
1369
+		$default
1370
+	) {
1371
+		$dtt_tkts = $datetime instanceof EE_Datetime && isset($datetime_tickets[ $datetime->ID() ])
1372
+			? $datetime_tickets[ $datetime->ID() ]
1373
+			: array();
1374
+		$display_row = $ticket instanceof EE_Ticket ? $ticket->get('TKT_row') : 0;
1375
+		$no_ticket = $default && empty($ticket);
1376
+		$template_args = array(
1377
+			'dtt_row'                 => $default
1378
+				? 'DTTNUM'
1379
+				: $datetime_row,
1380
+			'tkt_row'                 => $no_ticket
1381
+				? 'TICKETNUM'
1382
+				: $ticket_row,
1383
+			'datetime_ticket_checked' => in_array($display_row, $dtt_tkts, true)
1384
+				? ' checked="checked"'
1385
+				: '',
1386
+			'ticket_selected'         => in_array($display_row, $dtt_tkts, true)
1387
+				? ' ticket-selected'
1388
+				: '',
1389
+			'TKT_name'                => $no_ticket
1390
+				? 'TKTNAME'
1391
+				: $ticket->get('TKT_name'),
1392
+			'tkt_status_class'        => $no_ticket || $this->_is_creating_event
1393
+				? ' tkt-status-' . EE_Ticket::onsale
1394
+				: ' tkt-status-' . $ticket->ticket_status(),
1395
+		);
1396
+		// filter template args
1397
+		$template_args = apply_filters(
1398
+			'FHEE__espresso_events_Pricing_Hooks___get_datetime_tickets_list_item__template_args',
1399
+			$template_args,
1400
+			$datetime_row,
1401
+			$ticket_row,
1402
+			$datetime,
1403
+			$ticket,
1404
+			$datetime_tickets,
1405
+			$default,
1406
+			$this->_is_creating_event
1407
+		);
1408
+		return EEH_Template::display_template(
1409
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php',
1410
+			$template_args,
1411
+			true
1412
+		);
1413
+	}
1414 1414
 
1415 1415
 
1416
-    /**
1417
-     * This generates the ticket row for tickets.
1418
-     * This same method is used to generate both the actual rows and the js skeleton row
1419
-     * (when default === true)
1420
-     *
1421
-     * @param int           $ticket_row       Represents the row number being generated.
1422
-     * @param               $ticket
1423
-     * @param EE_Datetime[] $ticket_datetimes Either an array of all datetimes on all tickets indexed by each ticket
1424
-     *                                        or empty for default
1425
-     * @param EE_Datetime[] $all_datetimes    All Datetimes on the event or empty for default.
1426
-     * @param bool          $default          Whether default row being generated or not.
1427
-     * @param EE_Ticket[]   $all_tickets      This is an array of all tickets attached to the event
1428
-     *                                        (or empty in the case of defaults)
1429
-     * @return mixed
1430
-     * @throws InvalidArgumentException
1431
-     * @throws InvalidInterfaceException
1432
-     * @throws InvalidDataTypeException
1433
-     * @throws DomainException
1434
-     * @throws EE_Error
1435
-     * @throws ReflectionException
1436
-     */
1437
-    protected function _get_ticket_row(
1438
-        $ticket_row,
1439
-        $ticket,
1440
-        $ticket_datetimes,
1441
-        $all_datetimes,
1442
-        $default = false,
1443
-        $all_tickets = array()
1444
-    ) {
1445
-        // if $ticket is not an instance of EE_Ticket then force default to true.
1446
-        $default = ! $ticket instanceof EE_Ticket ? true : $default;
1447
-        $prices = ! empty($ticket) && ! $default
1448
-            ? $ticket->get_many_related(
1449
-                'Price',
1450
-                array('default_where_conditions' => 'none', 'order_by' => array('PRC_order' => 'ASC'))
1451
-            )
1452
-            : array();
1453
-        // if there is only one price (which would be the base price)
1454
-        // or NO prices and this ticket is a default ticket,
1455
-        // let's just make sure there are no cached default prices on the object.
1456
-        // This is done by not including any query_params.
1457
-        if ($ticket instanceof EE_Ticket && $ticket->is_default() && (count($prices) === 1 || empty($prices))) {
1458
-            $prices = $ticket->prices();
1459
-        }
1460
-        // check if we're dealing with a default ticket in which case
1461
-        // we don't want any starting_ticket_datetime_row values set
1462
-        // (otherwise there won't be any new relationships created for tickets based off of the default ticket).
1463
-        // This will future proof in case there is ever any behaviour change between what the primary_key defaults to.
1464
-        $default_dtt = $default || ($ticket instanceof EE_Ticket && $ticket->is_default());
1465
-        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
1466
-            ? $ticket_datetimes[ $ticket->ID() ]
1467
-            : array();
1468
-        $ticket_subtotal = $default ? 0 : $ticket->get_ticket_subtotal();
1469
-        $base_price = $default ? null : $ticket->base_price();
1470
-        $count_price_mods = EEM_Price::instance()->get_all_default_prices(true);
1471
-        // breaking out complicated condition for ticket_status
1472
-        if ($default) {
1473
-            $ticket_status_class = ' tkt-status-' . EE_Ticket::onsale;
1474
-        } else {
1475
-            $ticket_status_class = $ticket->is_default()
1476
-                ? ' tkt-status-' . EE_Ticket::onsale
1477
-                : ' tkt-status-' . $ticket->ticket_status();
1478
-        }
1479
-        // breaking out complicated condition for TKT_taxable
1480
-        if ($default) {
1481
-            $TKT_taxable = '';
1482
-        } else {
1483
-            $TKT_taxable = $ticket->taxable()
1484
-                ? ' checked="checked"'
1485
-                : '';
1486
-        }
1487
-        if ($default) {
1488
-            $TKT_status = EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence');
1489
-        } elseif ($ticket->is_default()) {
1490
-            $TKT_status = EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence');
1491
-        } else {
1492
-            $TKT_status = $ticket->ticket_status(true);
1493
-        }
1494
-        if ($default) {
1495
-            $TKT_min = '';
1496
-        } else {
1497
-            $TKT_min = $ticket->min();
1498
-            if ($TKT_min === -1 || $TKT_min === 0) {
1499
-                $TKT_min = '';
1500
-            }
1501
-        }
1502
-        $template_args = array(
1503
-            'tkt_row'                       => $default ? 'TICKETNUM' : $ticket_row,
1504
-            'TKT_order'                     => $default ? 'TICKETNUM' : $ticket_row,
1505
-            // on initial page load this will always be the correct order.
1506
-            'tkt_status_class'              => $ticket_status_class,
1507
-            'display_edit_tkt_row'          => ' style="display:none;"',
1508
-            'edit_tkt_expanded'             => '',
1509
-            'edit_tickets_name'             => $default ? 'TICKETNAMEATTR' : 'edit_tickets',
1510
-            'TKT_name'                      => $default ? '' : $ticket->get_f('TKT_name'),
1511
-            'TKT_start_date'                => $default
1512
-                ? ''
1513
-                : $ticket->get_date('TKT_start_date', $this->_date_time_format),
1514
-            'TKT_end_date'                  => $default
1515
-                ? ''
1516
-                : $ticket->get_date('TKT_end_date', $this->_date_time_format),
1517
-            'TKT_status'                    => $TKT_status,
1518
-            'TKT_price'                     => $default
1519
-                ? ''
1520
-                : EEH_Template::format_currency(
1521
-                    $ticket->get_ticket_total_with_taxes(),
1522
-                    false,
1523
-                    false
1524
-                ),
1525
-            'TKT_price_code'                => EE_Registry::instance()->CFG->currency->code,
1526
-            'TKT_price_amount'              => $default ? 0 : $ticket_subtotal,
1527
-            'TKT_qty'                       => $default
1528
-                ? ''
1529
-                : $ticket->get_pretty('TKT_qty', 'symbol'),
1530
-            'TKT_qty_for_input'             => $default
1531
-                ? ''
1532
-                : $ticket->get_pretty('TKT_qty', 'input'),
1533
-            'TKT_uses'                      => $default
1534
-                ? ''
1535
-                : $ticket->get_pretty('TKT_uses', 'input'),
1536
-            'TKT_min'                       => $TKT_min,
1537
-            'TKT_max'                       => $default
1538
-                ? ''
1539
-                : $ticket->get_pretty('TKT_max', 'input'),
1540
-            'TKT_sold'                      => $default ? 0 : $ticket->tickets_sold('ticket'),
1541
-            'TKT_reserved'                  => $default ? 0 : $ticket->reserved(),
1542
-            'TKT_registrations'             => $default
1543
-                ? 0
1544
-                : $ticket->count_registrations(
1545
-                    array(
1546
-                        array(
1547
-                            'STS_ID' => array(
1548
-                                '!=',
1549
-                                EEM_Registration::status_id_incomplete,
1550
-                            ),
1551
-                        ),
1552
-                    )
1553
-                ),
1554
-            'TKT_ID'                        => $default ? 0 : $ticket->ID(),
1555
-            'TKT_description'               => $default ? '' : $ticket->get_f('TKT_description'),
1556
-            'TKT_is_default'                => $default ? 0 : $ticket->is_default(),
1557
-            'TKT_required'                  => $default ? 0 : $ticket->required(),
1558
-            'TKT_is_default_selector'       => '',
1559
-            'ticket_price_rows'             => '',
1560
-            'TKT_base_price'                => $default || ! $base_price instanceof EE_Price
1561
-                ? ''
1562
-                : $base_price->get_pretty('PRC_amount', 'localized_float'),
1563
-            'TKT_base_price_ID'             => $default || ! $base_price instanceof EE_Price ? 0 : $base_price->ID(),
1564
-            'show_price_modifier'           => count($prices) > 1 || ($default && $count_price_mods > 0)
1565
-                ? ''
1566
-                : ' style="display:none;"',
1567
-            'show_price_mod_button'         => count($prices) > 1
1568
-                                               || ($default && $count_price_mods > 0)
1569
-                                               || (! $default && $ticket->deleted())
1570
-                ? ' style="display:none;"'
1571
-                : '',
1572
-            'total_price_rows'              => count($prices) > 1 ? count($prices) : 1,
1573
-            'ticket_datetimes_list'         => $default ? '<li class="hidden"></li>' : '',
1574
-            'starting_ticket_datetime_rows' => $default || $default_dtt ? '' : implode(',', $tkt_datetimes),
1575
-            'ticket_datetime_rows'          => $default ? '' : implode(',', $tkt_datetimes),
1576
-            'existing_ticket_price_ids'     => $default ? '' : implode(',', array_keys($prices)),
1577
-            'ticket_template_id'            => $default ? 0 : $ticket->get('TTM_ID'),
1578
-            'TKT_taxable'                   => $TKT_taxable,
1579
-            'display_subtotal'              => $ticket instanceof EE_Ticket && $ticket->taxable()
1580
-                ? ''
1581
-                : ' style="display:none"',
1582
-            'price_currency_symbol'         => EE_Registry::instance()->CFG->currency->sign,
1583
-            'TKT_subtotal_amount_display'   => EEH_Template::format_currency(
1584
-                $ticket_subtotal,
1585
-                false,
1586
-                false
1587
-            ),
1588
-            'TKT_subtotal_amount'           => $ticket_subtotal,
1589
-            'tax_rows'                      => $this->_get_tax_rows($ticket_row, $ticket),
1590
-            'disabled'                      => $ticket instanceof EE_Ticket && $ticket->deleted(),
1591
-            'ticket_archive_class'          => $ticket instanceof EE_Ticket && $ticket->deleted()
1592
-                ? ' ticket-archived'
1593
-                : '',
1594
-            'trash_icon'                    => $ticket instanceof EE_Ticket
1595
-                                               && $ticket->deleted()
1596
-                                               && ! $ticket->is_permanently_deleteable()
1597
-                ? 'ee-lock-icon '
1598
-                : 'trash-icon dashicons dashicons-post-trash clickable',
1599
-            'clone_icon'                    => $ticket instanceof EE_Ticket && $ticket->deleted()
1600
-                ? ''
1601
-                : 'clone-icon ee-icon ee-icon-clone clickable',
1602
-        );
1603
-        $template_args['trash_hidden'] = count($all_tickets) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon'
1604
-            ? ' style="display:none"'
1605
-            : '';
1606
-        // handle rows that should NOT be empty
1607
-        if (empty($template_args['TKT_start_date'])) {
1608
-            // if empty then the start date will be now.
1609
-            $template_args['TKT_start_date'] = date(
1610
-                $this->_date_time_format,
1611
-                current_time('timestamp')
1612
-            );
1613
-            $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1614
-        }
1615
-        if (empty($template_args['TKT_end_date'])) {
1616
-            // get the earliest datetime (if present);
1617
-            $earliest_dtt = $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0
1618
-                ? $this->_adminpage_obj->get_cpt_model_obj()->get_first_related(
1619
-                    'Datetime',
1620
-                    array('order_by' => array('DTT_EVT_start' => 'ASC'))
1621
-                )
1622
-                : null;
1623
-            if (! empty($earliest_dtt)) {
1624
-                $template_args['TKT_end_date'] = $earliest_dtt->get_datetime(
1625
-                    'DTT_EVT_start',
1626
-                    $this->_date_time_format
1627
-                );
1628
-            } else {
1629
-                // default so let's just use what's been set for the default date-time which is 30 days from now.
1630
-                $template_args['TKT_end_date'] = date(
1631
-                    $this->_date_time_format,
1632
-                    mktime(
1633
-                        24,
1634
-                        0,
1635
-                        0,
1636
-                        date('m'),
1637
-                        date('d') + 29,
1638
-                        date('Y')
1639
-                    )
1640
-                );
1641
-            }
1642
-            $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1643
-        }
1644
-        // generate ticket_datetime items
1645
-        if (! $default) {
1646
-            $datetime_row = 1;
1647
-            foreach ($all_datetimes as $datetime) {
1648
-                $template_args['ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item(
1649
-                    $datetime_row,
1650
-                    $ticket_row,
1651
-                    $datetime,
1652
-                    $ticket,
1653
-                    $ticket_datetimes,
1654
-                    $default
1655
-                );
1656
-                $datetime_row++;
1657
-            }
1658
-        }
1659
-        $price_row = 1;
1660
-        foreach ($prices as $price) {
1661
-            if (! $price instanceof EE_Price) {
1662
-                continue;
1663
-            }
1664
-            if ($price->is_base_price()) {
1665
-                $price_row++;
1666
-                continue;
1667
-            }
1668
-            $show_trash = ! ((count($prices) > 1 && $price_row === 1) || count($prices) === 1);
1669
-            $show_create = ! (count($prices) > 1 && count($prices) !== $price_row);
1670
-            $template_args['ticket_price_rows'] .= $this->_get_ticket_price_row(
1671
-                $ticket_row,
1672
-                $price_row,
1673
-                $price,
1674
-                $default,
1675
-                $ticket,
1676
-                $show_trash,
1677
-                $show_create
1678
-            );
1679
-            $price_row++;
1680
-        }
1681
-        // filter $template_args
1682
-        $template_args = apply_filters(
1683
-            'FHEE__espresso_events_Pricing_Hooks___get_ticket_row__template_args',
1684
-            $template_args,
1685
-            $ticket_row,
1686
-            $ticket,
1687
-            $ticket_datetimes,
1688
-            $all_datetimes,
1689
-            $default,
1690
-            $all_tickets,
1691
-            $this->_is_creating_event
1692
-        );
1693
-        return EEH_Template::display_template(
1694
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php',
1695
-            $template_args,
1696
-            true
1697
-        );
1698
-    }
1416
+	/**
1417
+	 * This generates the ticket row for tickets.
1418
+	 * This same method is used to generate both the actual rows and the js skeleton row
1419
+	 * (when default === true)
1420
+	 *
1421
+	 * @param int           $ticket_row       Represents the row number being generated.
1422
+	 * @param               $ticket
1423
+	 * @param EE_Datetime[] $ticket_datetimes Either an array of all datetimes on all tickets indexed by each ticket
1424
+	 *                                        or empty for default
1425
+	 * @param EE_Datetime[] $all_datetimes    All Datetimes on the event or empty for default.
1426
+	 * @param bool          $default          Whether default row being generated or not.
1427
+	 * @param EE_Ticket[]   $all_tickets      This is an array of all tickets attached to the event
1428
+	 *                                        (or empty in the case of defaults)
1429
+	 * @return mixed
1430
+	 * @throws InvalidArgumentException
1431
+	 * @throws InvalidInterfaceException
1432
+	 * @throws InvalidDataTypeException
1433
+	 * @throws DomainException
1434
+	 * @throws EE_Error
1435
+	 * @throws ReflectionException
1436
+	 */
1437
+	protected function _get_ticket_row(
1438
+		$ticket_row,
1439
+		$ticket,
1440
+		$ticket_datetimes,
1441
+		$all_datetimes,
1442
+		$default = false,
1443
+		$all_tickets = array()
1444
+	) {
1445
+		// if $ticket is not an instance of EE_Ticket then force default to true.
1446
+		$default = ! $ticket instanceof EE_Ticket ? true : $default;
1447
+		$prices = ! empty($ticket) && ! $default
1448
+			? $ticket->get_many_related(
1449
+				'Price',
1450
+				array('default_where_conditions' => 'none', 'order_by' => array('PRC_order' => 'ASC'))
1451
+			)
1452
+			: array();
1453
+		// if there is only one price (which would be the base price)
1454
+		// or NO prices and this ticket is a default ticket,
1455
+		// let's just make sure there are no cached default prices on the object.
1456
+		// This is done by not including any query_params.
1457
+		if ($ticket instanceof EE_Ticket && $ticket->is_default() && (count($prices) === 1 || empty($prices))) {
1458
+			$prices = $ticket->prices();
1459
+		}
1460
+		// check if we're dealing with a default ticket in which case
1461
+		// we don't want any starting_ticket_datetime_row values set
1462
+		// (otherwise there won't be any new relationships created for tickets based off of the default ticket).
1463
+		// This will future proof in case there is ever any behaviour change between what the primary_key defaults to.
1464
+		$default_dtt = $default || ($ticket instanceof EE_Ticket && $ticket->is_default());
1465
+		$tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
1466
+			? $ticket_datetimes[ $ticket->ID() ]
1467
+			: array();
1468
+		$ticket_subtotal = $default ? 0 : $ticket->get_ticket_subtotal();
1469
+		$base_price = $default ? null : $ticket->base_price();
1470
+		$count_price_mods = EEM_Price::instance()->get_all_default_prices(true);
1471
+		// breaking out complicated condition for ticket_status
1472
+		if ($default) {
1473
+			$ticket_status_class = ' tkt-status-' . EE_Ticket::onsale;
1474
+		} else {
1475
+			$ticket_status_class = $ticket->is_default()
1476
+				? ' tkt-status-' . EE_Ticket::onsale
1477
+				: ' tkt-status-' . $ticket->ticket_status();
1478
+		}
1479
+		// breaking out complicated condition for TKT_taxable
1480
+		if ($default) {
1481
+			$TKT_taxable = '';
1482
+		} else {
1483
+			$TKT_taxable = $ticket->taxable()
1484
+				? ' checked="checked"'
1485
+				: '';
1486
+		}
1487
+		if ($default) {
1488
+			$TKT_status = EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence');
1489
+		} elseif ($ticket->is_default()) {
1490
+			$TKT_status = EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence');
1491
+		} else {
1492
+			$TKT_status = $ticket->ticket_status(true);
1493
+		}
1494
+		if ($default) {
1495
+			$TKT_min = '';
1496
+		} else {
1497
+			$TKT_min = $ticket->min();
1498
+			if ($TKT_min === -1 || $TKT_min === 0) {
1499
+				$TKT_min = '';
1500
+			}
1501
+		}
1502
+		$template_args = array(
1503
+			'tkt_row'                       => $default ? 'TICKETNUM' : $ticket_row,
1504
+			'TKT_order'                     => $default ? 'TICKETNUM' : $ticket_row,
1505
+			// on initial page load this will always be the correct order.
1506
+			'tkt_status_class'              => $ticket_status_class,
1507
+			'display_edit_tkt_row'          => ' style="display:none;"',
1508
+			'edit_tkt_expanded'             => '',
1509
+			'edit_tickets_name'             => $default ? 'TICKETNAMEATTR' : 'edit_tickets',
1510
+			'TKT_name'                      => $default ? '' : $ticket->get_f('TKT_name'),
1511
+			'TKT_start_date'                => $default
1512
+				? ''
1513
+				: $ticket->get_date('TKT_start_date', $this->_date_time_format),
1514
+			'TKT_end_date'                  => $default
1515
+				? ''
1516
+				: $ticket->get_date('TKT_end_date', $this->_date_time_format),
1517
+			'TKT_status'                    => $TKT_status,
1518
+			'TKT_price'                     => $default
1519
+				? ''
1520
+				: EEH_Template::format_currency(
1521
+					$ticket->get_ticket_total_with_taxes(),
1522
+					false,
1523
+					false
1524
+				),
1525
+			'TKT_price_code'                => EE_Registry::instance()->CFG->currency->code,
1526
+			'TKT_price_amount'              => $default ? 0 : $ticket_subtotal,
1527
+			'TKT_qty'                       => $default
1528
+				? ''
1529
+				: $ticket->get_pretty('TKT_qty', 'symbol'),
1530
+			'TKT_qty_for_input'             => $default
1531
+				? ''
1532
+				: $ticket->get_pretty('TKT_qty', 'input'),
1533
+			'TKT_uses'                      => $default
1534
+				? ''
1535
+				: $ticket->get_pretty('TKT_uses', 'input'),
1536
+			'TKT_min'                       => $TKT_min,
1537
+			'TKT_max'                       => $default
1538
+				? ''
1539
+				: $ticket->get_pretty('TKT_max', 'input'),
1540
+			'TKT_sold'                      => $default ? 0 : $ticket->tickets_sold('ticket'),
1541
+			'TKT_reserved'                  => $default ? 0 : $ticket->reserved(),
1542
+			'TKT_registrations'             => $default
1543
+				? 0
1544
+				: $ticket->count_registrations(
1545
+					array(
1546
+						array(
1547
+							'STS_ID' => array(
1548
+								'!=',
1549
+								EEM_Registration::status_id_incomplete,
1550
+							),
1551
+						),
1552
+					)
1553
+				),
1554
+			'TKT_ID'                        => $default ? 0 : $ticket->ID(),
1555
+			'TKT_description'               => $default ? '' : $ticket->get_f('TKT_description'),
1556
+			'TKT_is_default'                => $default ? 0 : $ticket->is_default(),
1557
+			'TKT_required'                  => $default ? 0 : $ticket->required(),
1558
+			'TKT_is_default_selector'       => '',
1559
+			'ticket_price_rows'             => '',
1560
+			'TKT_base_price'                => $default || ! $base_price instanceof EE_Price
1561
+				? ''
1562
+				: $base_price->get_pretty('PRC_amount', 'localized_float'),
1563
+			'TKT_base_price_ID'             => $default || ! $base_price instanceof EE_Price ? 0 : $base_price->ID(),
1564
+			'show_price_modifier'           => count($prices) > 1 || ($default && $count_price_mods > 0)
1565
+				? ''
1566
+				: ' style="display:none;"',
1567
+			'show_price_mod_button'         => count($prices) > 1
1568
+											   || ($default && $count_price_mods > 0)
1569
+											   || (! $default && $ticket->deleted())
1570
+				? ' style="display:none;"'
1571
+				: '',
1572
+			'total_price_rows'              => count($prices) > 1 ? count($prices) : 1,
1573
+			'ticket_datetimes_list'         => $default ? '<li class="hidden"></li>' : '',
1574
+			'starting_ticket_datetime_rows' => $default || $default_dtt ? '' : implode(',', $tkt_datetimes),
1575
+			'ticket_datetime_rows'          => $default ? '' : implode(',', $tkt_datetimes),
1576
+			'existing_ticket_price_ids'     => $default ? '' : implode(',', array_keys($prices)),
1577
+			'ticket_template_id'            => $default ? 0 : $ticket->get('TTM_ID'),
1578
+			'TKT_taxable'                   => $TKT_taxable,
1579
+			'display_subtotal'              => $ticket instanceof EE_Ticket && $ticket->taxable()
1580
+				? ''
1581
+				: ' style="display:none"',
1582
+			'price_currency_symbol'         => EE_Registry::instance()->CFG->currency->sign,
1583
+			'TKT_subtotal_amount_display'   => EEH_Template::format_currency(
1584
+				$ticket_subtotal,
1585
+				false,
1586
+				false
1587
+			),
1588
+			'TKT_subtotal_amount'           => $ticket_subtotal,
1589
+			'tax_rows'                      => $this->_get_tax_rows($ticket_row, $ticket),
1590
+			'disabled'                      => $ticket instanceof EE_Ticket && $ticket->deleted(),
1591
+			'ticket_archive_class'          => $ticket instanceof EE_Ticket && $ticket->deleted()
1592
+				? ' ticket-archived'
1593
+				: '',
1594
+			'trash_icon'                    => $ticket instanceof EE_Ticket
1595
+											   && $ticket->deleted()
1596
+											   && ! $ticket->is_permanently_deleteable()
1597
+				? 'ee-lock-icon '
1598
+				: 'trash-icon dashicons dashicons-post-trash clickable',
1599
+			'clone_icon'                    => $ticket instanceof EE_Ticket && $ticket->deleted()
1600
+				? ''
1601
+				: 'clone-icon ee-icon ee-icon-clone clickable',
1602
+		);
1603
+		$template_args['trash_hidden'] = count($all_tickets) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon'
1604
+			? ' style="display:none"'
1605
+			: '';
1606
+		// handle rows that should NOT be empty
1607
+		if (empty($template_args['TKT_start_date'])) {
1608
+			// if empty then the start date will be now.
1609
+			$template_args['TKT_start_date'] = date(
1610
+				$this->_date_time_format,
1611
+				current_time('timestamp')
1612
+			);
1613
+			$template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1614
+		}
1615
+		if (empty($template_args['TKT_end_date'])) {
1616
+			// get the earliest datetime (if present);
1617
+			$earliest_dtt = $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0
1618
+				? $this->_adminpage_obj->get_cpt_model_obj()->get_first_related(
1619
+					'Datetime',
1620
+					array('order_by' => array('DTT_EVT_start' => 'ASC'))
1621
+				)
1622
+				: null;
1623
+			if (! empty($earliest_dtt)) {
1624
+				$template_args['TKT_end_date'] = $earliest_dtt->get_datetime(
1625
+					'DTT_EVT_start',
1626
+					$this->_date_time_format
1627
+				);
1628
+			} else {
1629
+				// default so let's just use what's been set for the default date-time which is 30 days from now.
1630
+				$template_args['TKT_end_date'] = date(
1631
+					$this->_date_time_format,
1632
+					mktime(
1633
+						24,
1634
+						0,
1635
+						0,
1636
+						date('m'),
1637
+						date('d') + 29,
1638
+						date('Y')
1639
+					)
1640
+				);
1641
+			}
1642
+			$template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale;
1643
+		}
1644
+		// generate ticket_datetime items
1645
+		if (! $default) {
1646
+			$datetime_row = 1;
1647
+			foreach ($all_datetimes as $datetime) {
1648
+				$template_args['ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item(
1649
+					$datetime_row,
1650
+					$ticket_row,
1651
+					$datetime,
1652
+					$ticket,
1653
+					$ticket_datetimes,
1654
+					$default
1655
+				);
1656
+				$datetime_row++;
1657
+			}
1658
+		}
1659
+		$price_row = 1;
1660
+		foreach ($prices as $price) {
1661
+			if (! $price instanceof EE_Price) {
1662
+				continue;
1663
+			}
1664
+			if ($price->is_base_price()) {
1665
+				$price_row++;
1666
+				continue;
1667
+			}
1668
+			$show_trash = ! ((count($prices) > 1 && $price_row === 1) || count($prices) === 1);
1669
+			$show_create = ! (count($prices) > 1 && count($prices) !== $price_row);
1670
+			$template_args['ticket_price_rows'] .= $this->_get_ticket_price_row(
1671
+				$ticket_row,
1672
+				$price_row,
1673
+				$price,
1674
+				$default,
1675
+				$ticket,
1676
+				$show_trash,
1677
+				$show_create
1678
+			);
1679
+			$price_row++;
1680
+		}
1681
+		// filter $template_args
1682
+		$template_args = apply_filters(
1683
+			'FHEE__espresso_events_Pricing_Hooks___get_ticket_row__template_args',
1684
+			$template_args,
1685
+			$ticket_row,
1686
+			$ticket,
1687
+			$ticket_datetimes,
1688
+			$all_datetimes,
1689
+			$default,
1690
+			$all_tickets,
1691
+			$this->_is_creating_event
1692
+		);
1693
+		return EEH_Template::display_template(
1694
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php',
1695
+			$template_args,
1696
+			true
1697
+		);
1698
+	}
1699 1699
 
1700 1700
 
1701
-    /**
1702
-     * @param int            $ticket_row
1703
-     * @param EE_Ticket|null $ticket
1704
-     * @return string
1705
-     * @throws DomainException
1706
-     * @throws EE_Error
1707
-     */
1708
-    protected function _get_tax_rows($ticket_row, $ticket)
1709
-    {
1710
-        $tax_rows = '';
1711
-        /** @var EE_Price[] $taxes */
1712
-        $taxes = empty($ticket) ? EE_Taxes::get_taxes_for_admin() : $ticket->get_ticket_taxes_for_admin();
1713
-        foreach ($taxes as $tax) {
1714
-            $tax_added = $this->_get_tax_added($tax, $ticket);
1715
-            $template_args = array(
1716
-                'display_tax'       => ! empty($ticket) && $ticket->get('TKT_taxable')
1717
-                    ? ''
1718
-                    : ' style="display:none;"',
1719
-                'tax_id'            => $tax->ID(),
1720
-                'tkt_row'           => $ticket_row,
1721
-                'tax_label'         => $tax->get('PRC_name'),
1722
-                'tax_added'         => $tax_added,
1723
-                'tax_added_display' => EEH_Template::format_currency($tax_added, false, false),
1724
-                'tax_amount'        => $tax->get('PRC_amount'),
1725
-            );
1726
-            $template_args = apply_filters(
1727
-                'FHEE__espresso_events_Pricing_Hooks___get_tax_rows__template_args',
1728
-                $template_args,
1729
-                $ticket_row,
1730
-                $ticket,
1731
-                $this->_is_creating_event
1732
-            );
1733
-            $tax_rows .= EEH_Template::display_template(
1734
-                PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php',
1735
-                $template_args,
1736
-                true
1737
-            );
1738
-        }
1739
-        return $tax_rows;
1740
-    }
1701
+	/**
1702
+	 * @param int            $ticket_row
1703
+	 * @param EE_Ticket|null $ticket
1704
+	 * @return string
1705
+	 * @throws DomainException
1706
+	 * @throws EE_Error
1707
+	 */
1708
+	protected function _get_tax_rows($ticket_row, $ticket)
1709
+	{
1710
+		$tax_rows = '';
1711
+		/** @var EE_Price[] $taxes */
1712
+		$taxes = empty($ticket) ? EE_Taxes::get_taxes_for_admin() : $ticket->get_ticket_taxes_for_admin();
1713
+		foreach ($taxes as $tax) {
1714
+			$tax_added = $this->_get_tax_added($tax, $ticket);
1715
+			$template_args = array(
1716
+				'display_tax'       => ! empty($ticket) && $ticket->get('TKT_taxable')
1717
+					? ''
1718
+					: ' style="display:none;"',
1719
+				'tax_id'            => $tax->ID(),
1720
+				'tkt_row'           => $ticket_row,
1721
+				'tax_label'         => $tax->get('PRC_name'),
1722
+				'tax_added'         => $tax_added,
1723
+				'tax_added_display' => EEH_Template::format_currency($tax_added, false, false),
1724
+				'tax_amount'        => $tax->get('PRC_amount'),
1725
+			);
1726
+			$template_args = apply_filters(
1727
+				'FHEE__espresso_events_Pricing_Hooks___get_tax_rows__template_args',
1728
+				$template_args,
1729
+				$ticket_row,
1730
+				$ticket,
1731
+				$this->_is_creating_event
1732
+			);
1733
+			$tax_rows .= EEH_Template::display_template(
1734
+				PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php',
1735
+				$template_args,
1736
+				true
1737
+			);
1738
+		}
1739
+		return $tax_rows;
1740
+	}
1741 1741
 
1742 1742
 
1743
-    /**
1744
-     * @param EE_Price       $tax
1745
-     * @param EE_Ticket|null $ticket
1746
-     * @return float|int
1747
-     * @throws EE_Error
1748
-     */
1749
-    protected function _get_tax_added(EE_Price $tax, $ticket)
1750
-    {
1751
-        $subtotal = empty($ticket) ? 0 : $ticket->get_ticket_subtotal();
1752
-        return $subtotal * $tax->get('PRC_amount') / 100;
1753
-    }
1743
+	/**
1744
+	 * @param EE_Price       $tax
1745
+	 * @param EE_Ticket|null $ticket
1746
+	 * @return float|int
1747
+	 * @throws EE_Error
1748
+	 */
1749
+	protected function _get_tax_added(EE_Price $tax, $ticket)
1750
+	{
1751
+		$subtotal = empty($ticket) ? 0 : $ticket->get_ticket_subtotal();
1752
+		return $subtotal * $tax->get('PRC_amount') / 100;
1753
+	}
1754 1754
 
1755 1755
 
1756
-    /**
1757
-     * @param int            $ticket_row
1758
-     * @param int            $price_row
1759
-     * @param EE_Price|null  $price
1760
-     * @param bool           $default
1761
-     * @param EE_Ticket|null $ticket
1762
-     * @param bool           $show_trash
1763
-     * @param bool           $show_create
1764
-     * @return mixed
1765
-     * @throws InvalidArgumentException
1766
-     * @throws InvalidInterfaceException
1767
-     * @throws InvalidDataTypeException
1768
-     * @throws DomainException
1769
-     * @throws EE_Error
1770
-     * @throws ReflectionException
1771
-     */
1772
-    protected function _get_ticket_price_row(
1773
-        $ticket_row,
1774
-        $price_row,
1775
-        $price,
1776
-        $default,
1777
-        $ticket,
1778
-        $show_trash = true,
1779
-        $show_create = true
1780
-    ) {
1781
-        $send_disabled = ! empty($ticket) && $ticket->get('TKT_deleted');
1782
-        $template_args = array(
1783
-            'tkt_row'               => $default && empty($ticket)
1784
-                ? 'TICKETNUM'
1785
-                : $ticket_row,
1786
-            'PRC_order'             => $default && empty($price)
1787
-                ? 'PRICENUM'
1788
-                : $price_row,
1789
-            'edit_prices_name'      => $default && empty($price)
1790
-                ? 'PRICENAMEATTR'
1791
-                : 'edit_prices',
1792
-            'price_type_selector'   => $default && empty($price)
1793
-                ? $this->_get_base_price_template($ticket_row, $price_row, $price, $default)
1794
-                : $this->_get_price_type_selector(
1795
-                    $ticket_row,
1796
-                    $price_row,
1797
-                    $price,
1798
-                    $default,
1799
-                    $send_disabled
1800
-                ),
1801
-            'PRC_ID'                => $default && empty($price)
1802
-                ? 0
1803
-                : $price->ID(),
1804
-            'PRC_is_default'        => $default && empty($price)
1805
-                ? 0
1806
-                : $price->get('PRC_is_default'),
1807
-            'PRC_name'              => $default && empty($price)
1808
-                ? ''
1809
-                : $price->get('PRC_name'),
1810
-            'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign,
1811
-            'show_plus_or_minus'    => $default && empty($price)
1812
-                ? ''
1813
-                : ' style="display:none;"',
1814
-            'show_plus'             => ($default && empty($price)) || ($price->is_discount() || $price->is_base_price())
1815
-                ? ' style="display:none;"'
1816
-                : '',
1817
-            'show_minus'            => ($default && empty($price)) || ! $price->is_discount()
1818
-                ? ' style="display:none;"'
1819
-                : '',
1820
-            'show_currency_symbol'  => ($default && empty($price)) || $price->is_percent()
1821
-                ? ' style="display:none"'
1822
-                : '',
1823
-            'PRC_amount'            => $default && empty($price)
1824
-                ? 0
1825
-                : $price->get_pretty('PRC_amount', 'localized_float'),
1826
-            'show_percentage'       => ($default && empty($price)) || ! $price->is_percent()
1827
-                ? ' style="display:none;"'
1828
-                : '',
1829
-            'show_trash_icon'       => $show_trash
1830
-                ? ''
1831
-                : ' style="display:none;"',
1832
-            'show_create_button'    => $show_create
1833
-                ? ''
1834
-                : ' style="display:none;"',
1835
-            'PRC_desc'              => $default && empty($price)
1836
-                ? ''
1837
-                : $price->get('PRC_desc'),
1838
-            'disabled'              => ! empty($ticket) && $ticket->get('TKT_deleted'),
1839
-        );
1840
-        $template_args = apply_filters(
1841
-            'FHEE__espresso_events_Pricing_Hooks___get_ticket_price_row__template_args',
1842
-            $template_args,
1843
-            $ticket_row,
1844
-            $price_row,
1845
-            $price,
1846
-            $default,
1847
-            $ticket,
1848
-            $show_trash,
1849
-            $show_create,
1850
-            $this->_is_creating_event
1851
-        );
1852
-        return EEH_Template::display_template(
1853
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php',
1854
-            $template_args,
1855
-            true
1856
-        );
1857
-    }
1756
+	/**
1757
+	 * @param int            $ticket_row
1758
+	 * @param int            $price_row
1759
+	 * @param EE_Price|null  $price
1760
+	 * @param bool           $default
1761
+	 * @param EE_Ticket|null $ticket
1762
+	 * @param bool           $show_trash
1763
+	 * @param bool           $show_create
1764
+	 * @return mixed
1765
+	 * @throws InvalidArgumentException
1766
+	 * @throws InvalidInterfaceException
1767
+	 * @throws InvalidDataTypeException
1768
+	 * @throws DomainException
1769
+	 * @throws EE_Error
1770
+	 * @throws ReflectionException
1771
+	 */
1772
+	protected function _get_ticket_price_row(
1773
+		$ticket_row,
1774
+		$price_row,
1775
+		$price,
1776
+		$default,
1777
+		$ticket,
1778
+		$show_trash = true,
1779
+		$show_create = true
1780
+	) {
1781
+		$send_disabled = ! empty($ticket) && $ticket->get('TKT_deleted');
1782
+		$template_args = array(
1783
+			'tkt_row'               => $default && empty($ticket)
1784
+				? 'TICKETNUM'
1785
+				: $ticket_row,
1786
+			'PRC_order'             => $default && empty($price)
1787
+				? 'PRICENUM'
1788
+				: $price_row,
1789
+			'edit_prices_name'      => $default && empty($price)
1790
+				? 'PRICENAMEATTR'
1791
+				: 'edit_prices',
1792
+			'price_type_selector'   => $default && empty($price)
1793
+				? $this->_get_base_price_template($ticket_row, $price_row, $price, $default)
1794
+				: $this->_get_price_type_selector(
1795
+					$ticket_row,
1796
+					$price_row,
1797
+					$price,
1798
+					$default,
1799
+					$send_disabled
1800
+				),
1801
+			'PRC_ID'                => $default && empty($price)
1802
+				? 0
1803
+				: $price->ID(),
1804
+			'PRC_is_default'        => $default && empty($price)
1805
+				? 0
1806
+				: $price->get('PRC_is_default'),
1807
+			'PRC_name'              => $default && empty($price)
1808
+				? ''
1809
+				: $price->get('PRC_name'),
1810
+			'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign,
1811
+			'show_plus_or_minus'    => $default && empty($price)
1812
+				? ''
1813
+				: ' style="display:none;"',
1814
+			'show_plus'             => ($default && empty($price)) || ($price->is_discount() || $price->is_base_price())
1815
+				? ' style="display:none;"'
1816
+				: '',
1817
+			'show_minus'            => ($default && empty($price)) || ! $price->is_discount()
1818
+				? ' style="display:none;"'
1819
+				: '',
1820
+			'show_currency_symbol'  => ($default && empty($price)) || $price->is_percent()
1821
+				? ' style="display:none"'
1822
+				: '',
1823
+			'PRC_amount'            => $default && empty($price)
1824
+				? 0
1825
+				: $price->get_pretty('PRC_amount', 'localized_float'),
1826
+			'show_percentage'       => ($default && empty($price)) || ! $price->is_percent()
1827
+				? ' style="display:none;"'
1828
+				: '',
1829
+			'show_trash_icon'       => $show_trash
1830
+				? ''
1831
+				: ' style="display:none;"',
1832
+			'show_create_button'    => $show_create
1833
+				? ''
1834
+				: ' style="display:none;"',
1835
+			'PRC_desc'              => $default && empty($price)
1836
+				? ''
1837
+				: $price->get('PRC_desc'),
1838
+			'disabled'              => ! empty($ticket) && $ticket->get('TKT_deleted'),
1839
+		);
1840
+		$template_args = apply_filters(
1841
+			'FHEE__espresso_events_Pricing_Hooks___get_ticket_price_row__template_args',
1842
+			$template_args,
1843
+			$ticket_row,
1844
+			$price_row,
1845
+			$price,
1846
+			$default,
1847
+			$ticket,
1848
+			$show_trash,
1849
+			$show_create,
1850
+			$this->_is_creating_event
1851
+		);
1852
+		return EEH_Template::display_template(
1853
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php',
1854
+			$template_args,
1855
+			true
1856
+		);
1857
+	}
1858 1858
 
1859 1859
 
1860
-    /**
1861
-     * @param int      $ticket_row
1862
-     * @param int      $price_row
1863
-     * @param EE_Price $price
1864
-     * @param bool     $default
1865
-     * @param bool     $disabled
1866
-     * @return mixed
1867
-     * @throws ReflectionException
1868
-     * @throws InvalidArgumentException
1869
-     * @throws InvalidInterfaceException
1870
-     * @throws InvalidDataTypeException
1871
-     * @throws DomainException
1872
-     * @throws EE_Error
1873
-     */
1874
-    protected function _get_price_type_selector($ticket_row, $price_row, $price, $default, $disabled = false)
1875
-    {
1876
-        if ($price->is_base_price()) {
1877
-            return $this->_get_base_price_template(
1878
-                $ticket_row,
1879
-                $price_row,
1880
-                $price,
1881
-                $default
1882
-            );
1883
-        }
1884
-        return $this->_get_price_modifier_template(
1885
-            $ticket_row,
1886
-            $price_row,
1887
-            $price,
1888
-            $default,
1889
-            $disabled
1890
-        );
1891
-    }
1860
+	/**
1861
+	 * @param int      $ticket_row
1862
+	 * @param int      $price_row
1863
+	 * @param EE_Price $price
1864
+	 * @param bool     $default
1865
+	 * @param bool     $disabled
1866
+	 * @return mixed
1867
+	 * @throws ReflectionException
1868
+	 * @throws InvalidArgumentException
1869
+	 * @throws InvalidInterfaceException
1870
+	 * @throws InvalidDataTypeException
1871
+	 * @throws DomainException
1872
+	 * @throws EE_Error
1873
+	 */
1874
+	protected function _get_price_type_selector($ticket_row, $price_row, $price, $default, $disabled = false)
1875
+	{
1876
+		if ($price->is_base_price()) {
1877
+			return $this->_get_base_price_template(
1878
+				$ticket_row,
1879
+				$price_row,
1880
+				$price,
1881
+				$default
1882
+			);
1883
+		}
1884
+		return $this->_get_price_modifier_template(
1885
+			$ticket_row,
1886
+			$price_row,
1887
+			$price,
1888
+			$default,
1889
+			$disabled
1890
+		);
1891
+	}
1892 1892
 
1893 1893
 
1894
-    /**
1895
-     * @param int      $ticket_row
1896
-     * @param int      $price_row
1897
-     * @param EE_Price $price
1898
-     * @param bool     $default
1899
-     * @return mixed
1900
-     * @throws DomainException
1901
-     * @throws EE_Error
1902
-     */
1903
-    protected function _get_base_price_template($ticket_row, $price_row, $price, $default)
1904
-    {
1905
-        $template_args = array(
1906
-            'tkt_row'                   => $default ? 'TICKETNUM' : $ticket_row,
1907
-            'PRC_order'                 => $default && empty($price) ? 'PRICENUM' : $price_row,
1908
-            'PRT_ID'                    => $default && empty($price) ? 1 : $price->get('PRT_ID'),
1909
-            'PRT_name'                  => esc_html__('Price', 'event_espresso'),
1910
-            'price_selected_operator'   => '+',
1911
-            'price_selected_is_percent' => 0,
1912
-        );
1913
-        $template_args = apply_filters(
1914
-            'FHEE__espresso_events_Pricing_Hooks___get_base_price_template__template_args',
1915
-            $template_args,
1916
-            $ticket_row,
1917
-            $price_row,
1918
-            $price,
1919
-            $default,
1920
-            $this->_is_creating_event
1921
-        );
1922
-        return EEH_Template::display_template(
1923
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php',
1924
-            $template_args,
1925
-            true
1926
-        );
1927
-    }
1894
+	/**
1895
+	 * @param int      $ticket_row
1896
+	 * @param int      $price_row
1897
+	 * @param EE_Price $price
1898
+	 * @param bool     $default
1899
+	 * @return mixed
1900
+	 * @throws DomainException
1901
+	 * @throws EE_Error
1902
+	 */
1903
+	protected function _get_base_price_template($ticket_row, $price_row, $price, $default)
1904
+	{
1905
+		$template_args = array(
1906
+			'tkt_row'                   => $default ? 'TICKETNUM' : $ticket_row,
1907
+			'PRC_order'                 => $default && empty($price) ? 'PRICENUM' : $price_row,
1908
+			'PRT_ID'                    => $default && empty($price) ? 1 : $price->get('PRT_ID'),
1909
+			'PRT_name'                  => esc_html__('Price', 'event_espresso'),
1910
+			'price_selected_operator'   => '+',
1911
+			'price_selected_is_percent' => 0,
1912
+		);
1913
+		$template_args = apply_filters(
1914
+			'FHEE__espresso_events_Pricing_Hooks___get_base_price_template__template_args',
1915
+			$template_args,
1916
+			$ticket_row,
1917
+			$price_row,
1918
+			$price,
1919
+			$default,
1920
+			$this->_is_creating_event
1921
+		);
1922
+		return EEH_Template::display_template(
1923
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php',
1924
+			$template_args,
1925
+			true
1926
+		);
1927
+	}
1928 1928
 
1929 1929
 
1930
-    /**
1931
-     * @param int      $ticket_row
1932
-     * @param int      $price_row
1933
-     * @param EE_Price $price
1934
-     * @param bool     $default
1935
-     * @param bool     $disabled
1936
-     * @return mixed
1937
-     * @throws ReflectionException
1938
-     * @throws InvalidArgumentException
1939
-     * @throws InvalidInterfaceException
1940
-     * @throws InvalidDataTypeException
1941
-     * @throws DomainException
1942
-     * @throws EE_Error
1943
-     */
1944
-    protected function _get_price_modifier_template(
1945
-        $ticket_row,
1946
-        $price_row,
1947
-        $price,
1948
-        $default,
1949
-        $disabled = false
1950
-    ) {
1951
-        $select_name = $default && ! $price instanceof EE_Price
1952
-            ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]'
1953
-            : 'edit_prices[' . $ticket_row . '][' . $price_row . '][PRT_ID]';
1954
-        /** @var EEM_Price_Type $price_type_model */
1955
-        $price_type_model = EE_Registry::instance()->load_model('Price_Type');
1956
-        $price_types = $price_type_model->get_all(array(
1957
-            array(
1958
-                'OR' => array(
1959
-                    'PBT_ID'  => '2',
1960
-                    'PBT_ID*' => '3',
1961
-                ),
1962
-            ),
1963
-        ));
1964
-        $all_price_types = $default && ! $price instanceof EE_Price
1965
-            ? array(esc_html__('Select Modifier', 'event_espresso'))
1966
-            : array();
1967
-        $selected_price_type_id = $default && ! $price instanceof EE_Price ? 0 : $price->type();
1968
-        $price_option_spans = '';
1969
-        // setup price types for selector
1970
-        foreach ($price_types as $price_type) {
1971
-            if (! $price_type instanceof EE_Price_Type) {
1972
-                continue;
1973
-            }
1974
-            $all_price_types[ $price_type->ID() ] = $price_type->get('PRT_name');
1975
-            // while we're in the loop let's setup the option spans used by js
1976
-            $span_args = array(
1977
-                'PRT_ID'         => $price_type->ID(),
1978
-                'PRT_operator'   => $price_type->is_discount() ? '-' : '+',
1979
-                'PRT_is_percent' => $price_type->get('PRT_is_percent') ? 1 : 0,
1980
-            );
1981
-            $price_option_spans .= EEH_Template::display_template(
1982
-                PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php',
1983
-                $span_args,
1984
-                true
1985
-            );
1986
-        }
1987
-        $select_name = $disabled ? 'archive_price[' . $ticket_row . '][' . $price_row . '][PRT_ID]'
1988
-            : $select_name;
1989
-        $select_input = new EE_Select_Input(
1990
-            $all_price_types,
1991
-            array(
1992
-                'default'               => $selected_price_type_id,
1993
-                'html_name'             => $select_name,
1994
-                'html_class'            => 'edit-price-PRT_ID',
1995
-                'other_html_attributes' => $disabled ? 'style="width:auto;" disabled' : 'style="width:auto;"',
1996
-            )
1997
-        );
1998
-        $price_selected_operator = $price instanceof EE_Price && $price->is_discount() ? '-' : '+';
1999
-        $price_selected_operator = $default && ! $price instanceof EE_Price ? '' : $price_selected_operator;
2000
-        $price_selected_is_percent = $price instanceof EE_Price && $price->is_percent() ? 1 : 0;
2001
-        $price_selected_is_percent = $default && ! $price instanceof EE_Price ? '' : $price_selected_is_percent;
2002
-        $template_args = array(
2003
-            'tkt_row'                   => $default ? 'TICKETNUM' : $ticket_row,
2004
-            'PRC_order'                 => $default && ! $price instanceof EE_Price ? 'PRICENUM' : $price_row,
2005
-            'price_modifier_selector'   => $select_input->get_html_for_input(),
2006
-            'main_name'                 => $select_name,
2007
-            'selected_price_type_id'    => $selected_price_type_id,
2008
-            'price_option_spans'        => $price_option_spans,
2009
-            'price_selected_operator'   => $price_selected_operator,
2010
-            'price_selected_is_percent' => $price_selected_is_percent,
2011
-            'disabled'                  => $disabled,
2012
-        );
2013
-        $template_args = apply_filters(
2014
-            'FHEE__espresso_events_Pricing_Hooks___get_price_modifier_template__template_args',
2015
-            $template_args,
2016
-            $ticket_row,
2017
-            $price_row,
2018
-            $price,
2019
-            $default,
2020
-            $disabled,
2021
-            $this->_is_creating_event
2022
-        );
2023
-        return EEH_Template::display_template(
2024
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php',
2025
-            $template_args,
2026
-            true
2027
-        );
2028
-    }
1930
+	/**
1931
+	 * @param int      $ticket_row
1932
+	 * @param int      $price_row
1933
+	 * @param EE_Price $price
1934
+	 * @param bool     $default
1935
+	 * @param bool     $disabled
1936
+	 * @return mixed
1937
+	 * @throws ReflectionException
1938
+	 * @throws InvalidArgumentException
1939
+	 * @throws InvalidInterfaceException
1940
+	 * @throws InvalidDataTypeException
1941
+	 * @throws DomainException
1942
+	 * @throws EE_Error
1943
+	 */
1944
+	protected function _get_price_modifier_template(
1945
+		$ticket_row,
1946
+		$price_row,
1947
+		$price,
1948
+		$default,
1949
+		$disabled = false
1950
+	) {
1951
+		$select_name = $default && ! $price instanceof EE_Price
1952
+			? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]'
1953
+			: 'edit_prices[' . $ticket_row . '][' . $price_row . '][PRT_ID]';
1954
+		/** @var EEM_Price_Type $price_type_model */
1955
+		$price_type_model = EE_Registry::instance()->load_model('Price_Type');
1956
+		$price_types = $price_type_model->get_all(array(
1957
+			array(
1958
+				'OR' => array(
1959
+					'PBT_ID'  => '2',
1960
+					'PBT_ID*' => '3',
1961
+				),
1962
+			),
1963
+		));
1964
+		$all_price_types = $default && ! $price instanceof EE_Price
1965
+			? array(esc_html__('Select Modifier', 'event_espresso'))
1966
+			: array();
1967
+		$selected_price_type_id = $default && ! $price instanceof EE_Price ? 0 : $price->type();
1968
+		$price_option_spans = '';
1969
+		// setup price types for selector
1970
+		foreach ($price_types as $price_type) {
1971
+			if (! $price_type instanceof EE_Price_Type) {
1972
+				continue;
1973
+			}
1974
+			$all_price_types[ $price_type->ID() ] = $price_type->get('PRT_name');
1975
+			// while we're in the loop let's setup the option spans used by js
1976
+			$span_args = array(
1977
+				'PRT_ID'         => $price_type->ID(),
1978
+				'PRT_operator'   => $price_type->is_discount() ? '-' : '+',
1979
+				'PRT_is_percent' => $price_type->get('PRT_is_percent') ? 1 : 0,
1980
+			);
1981
+			$price_option_spans .= EEH_Template::display_template(
1982
+				PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php',
1983
+				$span_args,
1984
+				true
1985
+			);
1986
+		}
1987
+		$select_name = $disabled ? 'archive_price[' . $ticket_row . '][' . $price_row . '][PRT_ID]'
1988
+			: $select_name;
1989
+		$select_input = new EE_Select_Input(
1990
+			$all_price_types,
1991
+			array(
1992
+				'default'               => $selected_price_type_id,
1993
+				'html_name'             => $select_name,
1994
+				'html_class'            => 'edit-price-PRT_ID',
1995
+				'other_html_attributes' => $disabled ? 'style="width:auto;" disabled' : 'style="width:auto;"',
1996
+			)
1997
+		);
1998
+		$price_selected_operator = $price instanceof EE_Price && $price->is_discount() ? '-' : '+';
1999
+		$price_selected_operator = $default && ! $price instanceof EE_Price ? '' : $price_selected_operator;
2000
+		$price_selected_is_percent = $price instanceof EE_Price && $price->is_percent() ? 1 : 0;
2001
+		$price_selected_is_percent = $default && ! $price instanceof EE_Price ? '' : $price_selected_is_percent;
2002
+		$template_args = array(
2003
+			'tkt_row'                   => $default ? 'TICKETNUM' : $ticket_row,
2004
+			'PRC_order'                 => $default && ! $price instanceof EE_Price ? 'PRICENUM' : $price_row,
2005
+			'price_modifier_selector'   => $select_input->get_html_for_input(),
2006
+			'main_name'                 => $select_name,
2007
+			'selected_price_type_id'    => $selected_price_type_id,
2008
+			'price_option_spans'        => $price_option_spans,
2009
+			'price_selected_operator'   => $price_selected_operator,
2010
+			'price_selected_is_percent' => $price_selected_is_percent,
2011
+			'disabled'                  => $disabled,
2012
+		);
2013
+		$template_args = apply_filters(
2014
+			'FHEE__espresso_events_Pricing_Hooks___get_price_modifier_template__template_args',
2015
+			$template_args,
2016
+			$ticket_row,
2017
+			$price_row,
2018
+			$price,
2019
+			$default,
2020
+			$disabled,
2021
+			$this->_is_creating_event
2022
+		);
2023
+		return EEH_Template::display_template(
2024
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php',
2025
+			$template_args,
2026
+			true
2027
+		);
2028
+	}
2029 2029
 
2030 2030
 
2031
-    /**
2032
-     * @param int              $datetime_row
2033
-     * @param int              $ticket_row
2034
-     * @param EE_Datetime|null $datetime
2035
-     * @param EE_Ticket|null   $ticket
2036
-     * @param array            $ticket_datetimes
2037
-     * @param bool             $default
2038
-     * @return mixed
2039
-     * @throws DomainException
2040
-     * @throws EE_Error
2041
-     */
2042
-    protected function _get_ticket_datetime_list_item(
2043
-        $datetime_row,
2044
-        $ticket_row,
2045
-        $datetime,
2046
-        $ticket,
2047
-        $ticket_datetimes = array(),
2048
-        $default
2049
-    ) {
2050
-        $tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
2051
-            ? $ticket_datetimes[ $ticket->ID() ]
2052
-            : array();
2053
-        $template_args = array(
2054
-            'dtt_row'                  => $default && ! $datetime instanceof EE_Datetime
2055
-                ? 'DTTNUM'
2056
-                : $datetime_row,
2057
-            'tkt_row'                  => $default
2058
-                ? 'TICKETNUM'
2059
-                : $ticket_row,
2060
-            'ticket_datetime_selected' => in_array($datetime_row, $tkt_datetimes, true)
2061
-                ? ' ticket-selected'
2062
-                : '',
2063
-            'ticket_datetime_checked'  => in_array($datetime_row, $tkt_datetimes, true)
2064
-                ? ' checked="checked"'
2065
-                : '',
2066
-            'DTT_name'                 => $default && empty($datetime)
2067
-                ? 'DTTNAME'
2068
-                : $datetime->get_dtt_display_name(true),
2069
-            'tkt_status_class'         => '',
2070
-        );
2071
-        $template_args = apply_filters(
2072
-            'FHEE__espresso_events_Pricing_Hooks___get_ticket_datetime_list_item__template_args',
2073
-            $template_args,
2074
-            $datetime_row,
2075
-            $ticket_row,
2076
-            $datetime,
2077
-            $ticket,
2078
-            $ticket_datetimes,
2079
-            $default,
2080
-            $this->_is_creating_event
2081
-        );
2082
-        return EEH_Template::display_template(
2083
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php',
2084
-            $template_args,
2085
-            true
2086
-        );
2087
-    }
2031
+	/**
2032
+	 * @param int              $datetime_row
2033
+	 * @param int              $ticket_row
2034
+	 * @param EE_Datetime|null $datetime
2035
+	 * @param EE_Ticket|null   $ticket
2036
+	 * @param array            $ticket_datetimes
2037
+	 * @param bool             $default
2038
+	 * @return mixed
2039
+	 * @throws DomainException
2040
+	 * @throws EE_Error
2041
+	 */
2042
+	protected function _get_ticket_datetime_list_item(
2043
+		$datetime_row,
2044
+		$ticket_row,
2045
+		$datetime,
2046
+		$ticket,
2047
+		$ticket_datetimes = array(),
2048
+		$default
2049
+	) {
2050
+		$tkt_datetimes = $ticket instanceof EE_Ticket && isset($ticket_datetimes[ $ticket->ID() ])
2051
+			? $ticket_datetimes[ $ticket->ID() ]
2052
+			: array();
2053
+		$template_args = array(
2054
+			'dtt_row'                  => $default && ! $datetime instanceof EE_Datetime
2055
+				? 'DTTNUM'
2056
+				: $datetime_row,
2057
+			'tkt_row'                  => $default
2058
+				? 'TICKETNUM'
2059
+				: $ticket_row,
2060
+			'ticket_datetime_selected' => in_array($datetime_row, $tkt_datetimes, true)
2061
+				? ' ticket-selected'
2062
+				: '',
2063
+			'ticket_datetime_checked'  => in_array($datetime_row, $tkt_datetimes, true)
2064
+				? ' checked="checked"'
2065
+				: '',
2066
+			'DTT_name'                 => $default && empty($datetime)
2067
+				? 'DTTNAME'
2068
+				: $datetime->get_dtt_display_name(true),
2069
+			'tkt_status_class'         => '',
2070
+		);
2071
+		$template_args = apply_filters(
2072
+			'FHEE__espresso_events_Pricing_Hooks___get_ticket_datetime_list_item__template_args',
2073
+			$template_args,
2074
+			$datetime_row,
2075
+			$ticket_row,
2076
+			$datetime,
2077
+			$ticket,
2078
+			$ticket_datetimes,
2079
+			$default,
2080
+			$this->_is_creating_event
2081
+		);
2082
+		return EEH_Template::display_template(
2083
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php',
2084
+			$template_args,
2085
+			true
2086
+		);
2087
+	}
2088 2088
 
2089 2089
 
2090
-    /**
2091
-     * @param array $all_datetimes
2092
-     * @param array $all_tickets
2093
-     * @return mixed
2094
-     * @throws ReflectionException
2095
-     * @throws InvalidArgumentException
2096
-     * @throws InvalidInterfaceException
2097
-     * @throws InvalidDataTypeException
2098
-     * @throws DomainException
2099
-     * @throws EE_Error
2100
-     */
2101
-    protected function _get_ticket_js_structure($all_datetimes = array(), $all_tickets = array())
2102
-    {
2103
-        $template_args = array(
2104
-            'default_datetime_edit_row'                => $this->_get_dtt_edit_row(
2105
-                'DTTNUM',
2106
-                null,
2107
-                true,
2108
-                $all_datetimes
2109
-            ),
2110
-            'default_ticket_row'                       => $this->_get_ticket_row(
2111
-                'TICKETNUM',
2112
-                null,
2113
-                array(),
2114
-                array(),
2115
-                true
2116
-            ),
2117
-            'default_price_row'                        => $this->_get_ticket_price_row(
2118
-                'TICKETNUM',
2119
-                'PRICENUM',
2120
-                null,
2121
-                true,
2122
-                null
2123
-            ),
2124
-            'default_price_rows'                       => '',
2125
-            'default_base_price_amount'                => 0,
2126
-            'default_base_price_name'                  => '',
2127
-            'default_base_price_description'           => '',
2128
-            'default_price_modifier_selector_row'      => $this->_get_price_modifier_template(
2129
-                'TICKETNUM',
2130
-                'PRICENUM',
2131
-                null,
2132
-                true
2133
-            ),
2134
-            'default_available_tickets_for_datetime'   => $this->_get_dtt_attached_tickets_row(
2135
-                'DTTNUM',
2136
-                null,
2137
-                array(),
2138
-                array(),
2139
-                true
2140
-            ),
2141
-            'existing_available_datetime_tickets_list' => '',
2142
-            'existing_available_ticket_datetimes_list' => '',
2143
-            'new_available_datetime_ticket_list_item'  => $this->_get_datetime_tickets_list_item(
2144
-                'DTTNUM',
2145
-                'TICKETNUM',
2146
-                null,
2147
-                null,
2148
-                array(),
2149
-                true
2150
-            ),
2151
-            'new_available_ticket_datetime_list_item'  => $this->_get_ticket_datetime_list_item(
2152
-                'DTTNUM',
2153
-                'TICKETNUM',
2154
-                null,
2155
-                null,
2156
-                array(),
2157
-                true
2158
-            ),
2159
-        );
2160
-        $ticket_row = 1;
2161
-        foreach ($all_tickets as $ticket) {
2162
-            $template_args['existing_available_datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item(
2163
-                'DTTNUM',
2164
-                $ticket_row,
2165
-                null,
2166
-                $ticket,
2167
-                array(),
2168
-                true
2169
-            );
2170
-            $ticket_row++;
2171
-        }
2172
-        $datetime_row = 1;
2173
-        foreach ($all_datetimes as $datetime) {
2174
-            $template_args['existing_available_ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item(
2175
-                $datetime_row,
2176
-                'TICKETNUM',
2177
-                $datetime,
2178
-                null,
2179
-                array(),
2180
-                true
2181
-            );
2182
-            $datetime_row++;
2183
-        }
2184
-        /** @var EEM_Price $price_model */
2185
-        $price_model = EE_Registry::instance()->load_model('Price');
2186
-        $default_prices = $price_model->get_all_default_prices();
2187
-        $price_row = 1;
2188
-        foreach ($default_prices as $price) {
2189
-            if (! $price instanceof EE_Price) {
2190
-                continue;
2191
-            }
2192
-            if ($price->is_base_price()) {
2193
-                $template_args['default_base_price_amount'] = $price->get_pretty(
2194
-                    'PRC_amount',
2195
-                    'localized_float'
2196
-                );
2197
-                $template_args['default_base_price_name'] = $price->get('PRC_name');
2198
-                $template_args['default_base_price_description'] = $price->get('PRC_desc');
2199
-                $price_row++;
2200
-                continue;
2201
-            }
2202
-            $show_trash = ! ((count($default_prices) > 1 && $price_row === 1)
2203
-                             || count($default_prices) === 1);
2204
-            $show_create = ! (count($default_prices) > 1
2205
-                              && count($default_prices)
2206
-                                 !== $price_row);
2207
-            $template_args['default_price_rows'] .= $this->_get_ticket_price_row(
2208
-                'TICKETNUM',
2209
-                $price_row,
2210
-                $price,
2211
-                true,
2212
-                null,
2213
-                $show_trash,
2214
-                $show_create
2215
-            );
2216
-            $price_row++;
2217
-        }
2218
-        $template_args = apply_filters(
2219
-            'FHEE__espresso_events_Pricing_Hooks___get_ticket_js_structure__template_args',
2220
-            $template_args,
2221
-            $all_datetimes,
2222
-            $all_tickets,
2223
-            $this->_is_creating_event
2224
-        );
2225
-        return EEH_Template::display_template(
2226
-            PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php',
2227
-            $template_args,
2228
-            true
2229
-        );
2230
-    }
2090
+	/**
2091
+	 * @param array $all_datetimes
2092
+	 * @param array $all_tickets
2093
+	 * @return mixed
2094
+	 * @throws ReflectionException
2095
+	 * @throws InvalidArgumentException
2096
+	 * @throws InvalidInterfaceException
2097
+	 * @throws InvalidDataTypeException
2098
+	 * @throws DomainException
2099
+	 * @throws EE_Error
2100
+	 */
2101
+	protected function _get_ticket_js_structure($all_datetimes = array(), $all_tickets = array())
2102
+	{
2103
+		$template_args = array(
2104
+			'default_datetime_edit_row'                => $this->_get_dtt_edit_row(
2105
+				'DTTNUM',
2106
+				null,
2107
+				true,
2108
+				$all_datetimes
2109
+			),
2110
+			'default_ticket_row'                       => $this->_get_ticket_row(
2111
+				'TICKETNUM',
2112
+				null,
2113
+				array(),
2114
+				array(),
2115
+				true
2116
+			),
2117
+			'default_price_row'                        => $this->_get_ticket_price_row(
2118
+				'TICKETNUM',
2119
+				'PRICENUM',
2120
+				null,
2121
+				true,
2122
+				null
2123
+			),
2124
+			'default_price_rows'                       => '',
2125
+			'default_base_price_amount'                => 0,
2126
+			'default_base_price_name'                  => '',
2127
+			'default_base_price_description'           => '',
2128
+			'default_price_modifier_selector_row'      => $this->_get_price_modifier_template(
2129
+				'TICKETNUM',
2130
+				'PRICENUM',
2131
+				null,
2132
+				true
2133
+			),
2134
+			'default_available_tickets_for_datetime'   => $this->_get_dtt_attached_tickets_row(
2135
+				'DTTNUM',
2136
+				null,
2137
+				array(),
2138
+				array(),
2139
+				true
2140
+			),
2141
+			'existing_available_datetime_tickets_list' => '',
2142
+			'existing_available_ticket_datetimes_list' => '',
2143
+			'new_available_datetime_ticket_list_item'  => $this->_get_datetime_tickets_list_item(
2144
+				'DTTNUM',
2145
+				'TICKETNUM',
2146
+				null,
2147
+				null,
2148
+				array(),
2149
+				true
2150
+			),
2151
+			'new_available_ticket_datetime_list_item'  => $this->_get_ticket_datetime_list_item(
2152
+				'DTTNUM',
2153
+				'TICKETNUM',
2154
+				null,
2155
+				null,
2156
+				array(),
2157
+				true
2158
+			),
2159
+		);
2160
+		$ticket_row = 1;
2161
+		foreach ($all_tickets as $ticket) {
2162
+			$template_args['existing_available_datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item(
2163
+				'DTTNUM',
2164
+				$ticket_row,
2165
+				null,
2166
+				$ticket,
2167
+				array(),
2168
+				true
2169
+			);
2170
+			$ticket_row++;
2171
+		}
2172
+		$datetime_row = 1;
2173
+		foreach ($all_datetimes as $datetime) {
2174
+			$template_args['existing_available_ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item(
2175
+				$datetime_row,
2176
+				'TICKETNUM',
2177
+				$datetime,
2178
+				null,
2179
+				array(),
2180
+				true
2181
+			);
2182
+			$datetime_row++;
2183
+		}
2184
+		/** @var EEM_Price $price_model */
2185
+		$price_model = EE_Registry::instance()->load_model('Price');
2186
+		$default_prices = $price_model->get_all_default_prices();
2187
+		$price_row = 1;
2188
+		foreach ($default_prices as $price) {
2189
+			if (! $price instanceof EE_Price) {
2190
+				continue;
2191
+			}
2192
+			if ($price->is_base_price()) {
2193
+				$template_args['default_base_price_amount'] = $price->get_pretty(
2194
+					'PRC_amount',
2195
+					'localized_float'
2196
+				);
2197
+				$template_args['default_base_price_name'] = $price->get('PRC_name');
2198
+				$template_args['default_base_price_description'] = $price->get('PRC_desc');
2199
+				$price_row++;
2200
+				continue;
2201
+			}
2202
+			$show_trash = ! ((count($default_prices) > 1 && $price_row === 1)
2203
+							 || count($default_prices) === 1);
2204
+			$show_create = ! (count($default_prices) > 1
2205
+							  && count($default_prices)
2206
+								 !== $price_row);
2207
+			$template_args['default_price_rows'] .= $this->_get_ticket_price_row(
2208
+				'TICKETNUM',
2209
+				$price_row,
2210
+				$price,
2211
+				true,
2212
+				null,
2213
+				$show_trash,
2214
+				$show_create
2215
+			);
2216
+			$price_row++;
2217
+		}
2218
+		$template_args = apply_filters(
2219
+			'FHEE__espresso_events_Pricing_Hooks___get_ticket_js_structure__template_args',
2220
+			$template_args,
2221
+			$all_datetimes,
2222
+			$all_tickets,
2223
+			$this->_is_creating_event
2224
+		);
2225
+		return EEH_Template::display_template(
2226
+			PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php',
2227
+			$template_args,
2228
+			true
2229
+		);
2230
+	}
2231 2231
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/base/EE_Form_Section_Proper.form.php 3 patches
Doc Comments   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -459,7 +459,7 @@  discard block
 block discarded – undo
459 459
      *                                                      with construction finalize being called later
460 460
      *                                                      (realizing that the subsections' html names
461 461
      *                                                      might not be set yet, etc.)
462
-     * @return EE_Form_Section_Base
462
+     * @return EE_Form_Section_Validatable|null
463 463
      * @throws EE_Error
464 464
      */
465 465
     public function get_subsection($name, $require_construction_to_be_finalized = true)
@@ -1289,7 +1289,6 @@  discard block
 block discarded – undo
1289 1289
     /**
1290 1290
      * Sets the submission error message (aka validation error message for this form section and all sub-sections)
1291 1291
      * @param string                           $form_submission_error_message
1292
-     * @param EE_Form_Section_Validatable $form_section unused
1293 1292
      * @throws EE_Error
1294 1293
      */
1295 1294
     public function set_submission_error_message(
Please login to merge, or discard this patch.
Spacing   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -111,8 +111,8 @@  discard block
 block discarded – undo
111 111
             // AND we are going to make sure they're in that specified order
112 112
             $reordered_subsections = array();
113 113
             foreach ($options_array['include'] as $input_name) {
114
-                if (isset($this->_subsections[ $input_name ])) {
115
-                    $reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
114
+                if (isset($this->_subsections[$input_name])) {
115
+                    $reordered_subsections[$input_name] = $this->_subsections[$input_name];
116 116
                 }
117 117
             }
118 118
             $this->_subsections = $reordered_subsections;
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
         if (isset($options_array['layout_strategy'])) {
125 125
             $this->_layout_strategy = $options_array['layout_strategy'];
126 126
         }
127
-        if (! $this->_layout_strategy) {
127
+        if ( ! $this->_layout_strategy) {
128 128
             $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129 129
         }
130 130
         $this->_layout_strategy->_construct_finalize($this);
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
         if ($validate) {
314 314
             $this->_validate();
315 315
             // if it's invalid, we're going to want to re-display so remember what they submitted
316
-            if (! $this->is_valid()) {
316
+            if ( ! $this->is_valid()) {
317 317
                 $this->store_submitted_form_data_in_session();
318 318
             }
319 319
         }
@@ -426,11 +426,11 @@  discard block
 block discarded – undo
426 426
     public function populate_defaults($default_data)
427 427
     {
428 428
         foreach ($this->subsections(false) as $subsection_name => $subsection) {
429
-            if (isset($default_data[ $subsection_name ])) {
429
+            if (isset($default_data[$subsection_name])) {
430 430
                 if ($subsection instanceof EE_Form_Input_Base) {
431
-                    $subsection->set_default($default_data[ $subsection_name ]);
431
+                    $subsection->set_default($default_data[$subsection_name]);
432 432
                 } elseif ($subsection instanceof EE_Form_Section_Proper) {
433
-                    $subsection->populate_defaults($default_data[ $subsection_name ]);
433
+                    $subsection->populate_defaults($default_data[$subsection_name]);
434 434
                 }
435 435
             }
436 436
         }
@@ -445,7 +445,7 @@  discard block
 block discarded – undo
445 445
      */
446 446
     public function subsection_exists($name)
447 447
     {
448
-        return isset($this->_subsections[ $name ]) ? true : false;
448
+        return isset($this->_subsections[$name]) ? true : false;
449 449
     }
450 450
 
451 451
 
@@ -467,7 +467,7 @@  discard block
 block discarded – undo
467 467
         if ($require_construction_to_be_finalized) {
468 468
             $this->ensure_construct_finalized_called();
469 469
         }
470
-        return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
470
+        return $this->subsection_exists($name) ? $this->_subsections[$name] : null;
471 471
     }
472 472
 
473 473
 
@@ -482,7 +482,7 @@  discard block
 block discarded – undo
482 482
         $validatable_subsections = array();
483 483
         foreach ($this->subsections() as $name => $obj) {
484 484
             if ($obj instanceof EE_Form_Section_Validatable) {
485
-                $validatable_subsections[ $name ] = $obj;
485
+                $validatable_subsections[$name] = $obj;
486 486
             }
487 487
         }
488 488
         return $validatable_subsections;
@@ -509,7 +509,7 @@  discard block
 block discarded – undo
509 509
             $name,
510 510
             $require_construction_to_be_finalized
511 511
         );
512
-        if (! $subsection instanceof EE_Form_Input_Base) {
512
+        if ( ! $subsection instanceof EE_Form_Input_Base) {
513 513
             throw new EE_Error(
514 514
                 sprintf(
515 515
                     esc_html__(
@@ -546,7 +546,7 @@  discard block
 block discarded – undo
546 546
             $name,
547 547
             $require_construction_to_be_finalized
548 548
         );
549
-        if (! $subsection instanceof EE_Form_Section_Proper) {
549
+        if ( ! $subsection instanceof EE_Form_Section_Proper) {
550 550
             throw new EE_Error(
551 551
                 sprintf(
552 552
                     esc_html__(
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
     public function is_valid()
587 587
     {
588 588
         if ($this->is_valid === null) {
589
-            if (! $this->has_received_submission()) {
589
+            if ( ! $this->has_received_submission()) {
590 590
                 throw new EE_Error(
591 591
                     sprintf(
592 592
                         esc_html__(
@@ -596,14 +596,14 @@  discard block
 block discarded – undo
596 596
                     )
597 597
                 );
598 598
             }
599
-            if (! parent::is_valid()) {
599
+            if ( ! parent::is_valid()) {
600 600
                 $this->is_valid = false;
601 601
             } else {
602 602
                 // ok so no general errors to this entire form section.
603 603
                 // so let's check the subsections, but only set errors if that hasn't been done yet
604 604
                 $this->is_valid = true;
605 605
                 foreach ($this->get_validatable_subsections() as $subsection) {
606
-                    if (! $subsection->is_valid()) {
606
+                    if ( ! $subsection->is_valid()) {
607 607
                         $this->is_valid = false;
608 608
                     }
609 609
                 }
@@ -620,7 +620,7 @@  discard block
 block discarded – undo
620 620
      */
621 621
     protected function _set_default_name_if_empty()
622 622
     {
623
-        if (! $this->_name) {
623
+        if ( ! $this->_name) {
624 624
             $classname    = get_class($this);
625 625
             $default_name = str_replace('EE_', '', $classname);
626 626
             $this->_name  = $default_name;
@@ -710,7 +710,7 @@  discard block
 block discarded – undo
710 710
     {
711 711
         wp_register_script(
712 712
             'ee_form_section_validation',
713
-            EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
713
+            EE_GLOBAL_ASSETS_URL.'scripts'.'/form_section_validation.js',
714 714
             array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
715 715
             EVENT_ESPRESSO_VERSION,
716 716
             true
@@ -754,13 +754,13 @@  discard block
 block discarded – undo
754 754
         // we only want to localize vars ONCE for the entire form,
755 755
         // so if the form section doesn't have a parent, then it must be the top dog
756 756
         if ($return_for_subsection || ! $this->parent_section()) {
757
-            EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
757
+            EE_Form_Section_Proper::$_js_localization['form_data'][$this->html_id()] = array(
758 758
                 'form_section_id'  => $this->html_id(true),
759 759
                 'validation_rules' => $this->get_jquery_validation_rules(),
760 760
                 'other_data'       => $this->get_other_js_data(),
761 761
                 'errors'           => $this->subsection_validation_errors_by_html_name(),
762 762
             );
763
-            EE_Form_Section_Proper::$_scripts_localized                                = true;
763
+            EE_Form_Section_Proper::$_scripts_localized = true;
764 764
         }
765 765
     }
766 766
 
@@ -795,7 +795,7 @@  discard block
 block discarded – undo
795 795
         $inputs = array();
796 796
         foreach ($this->subsections() as $subsection) {
797 797
             if ($subsection instanceof EE_Form_Input_Base) {
798
-                $inputs[ $subsection->html_name() ] = $subsection;
798
+                $inputs[$subsection->html_name()] = $subsection;
799 799
             } elseif ($subsection instanceof EE_Form_Section_Proper) {
800 800
                 $inputs += $subsection->inputs_in_subsections();
801 801
             }
@@ -818,7 +818,7 @@  discard block
 block discarded – undo
818 818
         $errors = array();
819 819
         foreach ($inputs as $form_input) {
820 820
             if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
821
-                $errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
821
+                $errors[$form_input->html_name()] = $form_input->get_validation_error_string();
822 822
             }
823 823
         }
824 824
         return $errors;
@@ -841,7 +841,7 @@  discard block
 block discarded – undo
841 841
         $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
842 842
             ? EE_Registry::instance()->CFG->registration->email_validation_level
843 843
             : 'wp_default';
844
-        EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
844
+        EE_Form_Section_Proper::$_js_localization['email_validation_level'] = $email_validation_level;
845 845
         wp_enqueue_script('ee_form_section_validation');
846 846
         wp_localize_script(
847 847
             'ee_form_section_validation',
@@ -858,7 +858,7 @@  discard block
 block discarded – undo
858 858
      */
859 859
     public function ensure_scripts_localized()
860 860
     {
861
-        if (! EE_Form_Section_Proper::$_scripts_localized) {
861
+        if ( ! EE_Form_Section_Proper::$_scripts_localized) {
862 862
             $this->_enqueue_and_localize_form_js();
863 863
         }
864 864
     }
@@ -954,8 +954,8 @@  discard block
 block discarded – undo
954 954
         // reset the cache of whether this form is valid or not- we're re-validating it now
955 955
         $this->is_valid = null;
956 956
         foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
957
-            if (method_exists($this, '_validate_' . $subsection_name)) {
958
-                call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
957
+            if (method_exists($this, '_validate_'.$subsection_name)) {
958
+                call_user_func_array(array($this, '_validate_'.$subsection_name), array($subsection));
959 959
             }
960 960
             $subsection->_validate();
961 961
         }
@@ -973,9 +973,9 @@  discard block
 block discarded – undo
973 973
         $inputs = array();
974 974
         foreach ($this->subsections() as $subsection_name => $subsection) {
975 975
             if ($subsection instanceof EE_Form_Section_Proper) {
976
-                $inputs[ $subsection_name ] = $subsection->valid_data();
976
+                $inputs[$subsection_name] = $subsection->valid_data();
977 977
             } elseif ($subsection instanceof EE_Form_Input_Base) {
978
-                $inputs[ $subsection_name ] = $subsection->normalized_value();
978
+                $inputs[$subsection_name] = $subsection->normalized_value();
979 979
             }
980 980
         }
981 981
         return $inputs;
@@ -993,7 +993,7 @@  discard block
 block discarded – undo
993 993
         $inputs = array();
994 994
         foreach ($this->subsections() as $subsection_name => $subsection) {
995 995
             if ($subsection instanceof EE_Form_Input_Base) {
996
-                $inputs[ $subsection_name ] = $subsection;
996
+                $inputs[$subsection_name] = $subsection;
997 997
             }
998 998
         }
999 999
         return $inputs;
@@ -1011,7 +1011,7 @@  discard block
 block discarded – undo
1011 1011
         $form_sections = array();
1012 1012
         foreach ($this->subsections() as $name => $obj) {
1013 1013
             if ($obj instanceof EE_Form_Section_Proper) {
1014
-                $form_sections[ $name ] = $obj;
1014
+                $form_sections[$name] = $obj;
1015 1015
             }
1016 1016
         }
1017 1017
         return $form_sections;
@@ -1118,7 +1118,7 @@  discard block
 block discarded – undo
1118 1118
         $input_values = array();
1119 1119
         foreach ($this->subsections() as $subsection_name => $subsection) {
1120 1120
             if ($subsection instanceof EE_Form_Input_Base) {
1121
-                $input_values[ $subsection_name ] = $pretty
1121
+                $input_values[$subsection_name] = $pretty
1122 1122
                     ? $subsection->pretty_value()
1123 1123
                     : $subsection->normalized_value();
1124 1124
             } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
@@ -1130,7 +1130,7 @@  discard block
 block discarded – undo
1130 1130
                 if ($flatten) {
1131 1131
                     $input_values = array_merge($input_values, $subform_input_values);
1132 1132
                 } else {
1133
-                    $input_values[ $subsection_name ] = $subform_input_values;
1133
+                    $input_values[$subsection_name] = $subform_input_values;
1134 1134
                 }
1135 1135
             }
1136 1136
         }
@@ -1158,7 +1158,7 @@  discard block
 block discarded – undo
1158 1158
             if ($subsection instanceof EE_Form_Input_Base) {
1159 1159
                 // is this input part of an array of inputs?
1160 1160
                 if (strpos($subsection->html_name(), '[') !== false) {
1161
-                    $full_input_name  = EEH_Array::convert_array_values_to_keys(
1161
+                    $full_input_name = EEH_Array::convert_array_values_to_keys(
1162 1162
                         explode(
1163 1163
                             '[',
1164 1164
                             str_replace(']', '', $subsection->html_name())
@@ -1167,7 +1167,7 @@  discard block
 block discarded – undo
1167 1167
                     );
1168 1168
                     $submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1169 1169
                 } else {
1170
-                    $submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1170
+                    $submitted_values[$subsection->html_name()] = $subsection->raw_value();
1171 1171
                 }
1172 1172
             } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1173 1173
                 $subform_input_values = $subsection->submitted_values($include_subforms);
@@ -1202,7 +1202,7 @@  discard block
 block discarded – undo
1202 1202
     public function exclude(array $inputs_to_exclude = array())
1203 1203
     {
1204 1204
         foreach ($inputs_to_exclude as $input_to_exclude_name) {
1205
-            unset($this->_subsections[ $input_to_exclude_name ]);
1205
+            unset($this->_subsections[$input_to_exclude_name]);
1206 1206
         }
1207 1207
     }
1208 1208
 
@@ -1245,7 +1245,7 @@  discard block
 block discarded – undo
1245 1245
     public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1246 1246
     {
1247 1247
         foreach ($new_subsections as $subsection_name => $subsection) {
1248
-            if (! $subsection instanceof EE_Form_Section_Base) {
1248
+            if ( ! $subsection instanceof EE_Form_Section_Base) {
1249 1249
                 EE_Error::add_error(
1250 1250
                     sprintf(
1251 1251
                         esc_html__(
@@ -1257,7 +1257,7 @@  discard block
 block discarded – undo
1257 1257
                         $this->name()
1258 1258
                     )
1259 1259
                 );
1260
-                unset($new_subsections[ $subsection_name ]);
1260
+                unset($new_subsections[$subsection_name]);
1261 1261
             }
1262 1262
         }
1263 1263
         $this->_subsections = EEH_Array::insert_into_array(
@@ -1372,7 +1372,7 @@  discard block
 block discarded – undo
1372 1372
     public function html_name_prefix()
1373 1373
     {
1374 1374
         if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1375
-            return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1375
+            return $this->parent_section()->html_name_prefix().'['.$this->name().']';
1376 1376
         }
1377 1377
         return $this->name();
1378 1378
     }
@@ -1412,7 +1412,7 @@  discard block
 block discarded – undo
1412 1412
      */
1413 1413
     public function ensure_construct_finalized_called()
1414 1414
     {
1415
-        if (! $this->_construction_finalized) {
1415
+        if ( ! $this->_construction_finalized) {
1416 1416
             $this->_construct_finalize($this->_parent_section, $this->_name);
1417 1417
         }
1418 1418
     }
Please login to merge, or discard this patch.
Indentation   +1526 added lines, -1526 removed lines patch added patch discarded remove patch
@@ -14,1530 +14,1530 @@
 block discarded – undo
14 14
 class EE_Form_Section_Proper extends EE_Form_Section_Validatable
15 15
 {
16 16
 
17
-    const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data';
18
-
19
-    /**
20
-     * Subsections
21
-     *
22
-     * @var EE_Form_Section_Validatable[]
23
-     */
24
-    protected $_subsections = array();
25
-
26
-    /**
27
-     * Strategy for laying out the form
28
-     *
29
-     * @var EE_Form_Section_Layout_Base
30
-     */
31
-    protected $_layout_strategy;
32
-
33
-    /**
34
-     * Whether or not this form has received and validated a form submission yet
35
-     *
36
-     * @var boolean
37
-     */
38
-    protected $_received_submission = false;
39
-
40
-    /**
41
-     * message displayed to users upon successful form submission
42
-     *
43
-     * @var string
44
-     */
45
-    protected $_form_submission_success_message = '';
46
-
47
-    /**
48
-     * message displayed to users upon unsuccessful form submission
49
-     *
50
-     * @var string
51
-     */
52
-    protected $_form_submission_error_message = '';
53
-
54
-    /**
55
-     * @var array like $_REQUEST
56
-     */
57
-    protected $cached_request_data;
58
-
59
-    /**
60
-     * Stores whether this form (and its sub-sections) were found to be valid or not.
61
-     * Starts off as null, but once the form is validated, it set to either true or false
62
-     * @var boolean|null
63
-     */
64
-    protected $is_valid;
65
-
66
-    /**
67
-     * Stores all the data that will localized for form validation
68
-     *
69
-     * @var array
70
-     */
71
-    protected static $_js_localization = array();
72
-
73
-    /**
74
-     * whether or not the form's localized validation JS vars have been set
75
-     *
76
-     * @type boolean
77
-     */
78
-    protected static $_scripts_localized = false;
79
-
80
-
81
-    /**
82
-     * when constructing a proper form section, calls _construct_finalize on children
83
-     * so that they know who their parent is, and what name they've been given.
84
-     *
85
-     * @param array[] $options_array   {
86
-     * @type          $subsections     EE_Form_Section_Validatable[] where keys are the section's name
87
-     * @type          $include         string[] numerically-indexed where values are section names to be included,
88
-     *                                 and in that order. This is handy if you want
89
-     *                                 the subsections to be ordered differently than the default, and if you override
90
-     *                                 which fields are shown
91
-     * @type          $exclude         string[] values are subsections to be excluded. This is handy if you want
92
-     *                                 to remove certain default subsections (note: if you specify BOTH 'include' AND
93
-     *                                 'exclude', the inclusions will be applied first, and the exclusions will exclude
94
-     *                                 items from that list of inclusions)
95
-     * @type          $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form
96
-     *                                 } @see EE_Form_Section_Validatable::__construct()
97
-     * @throws EE_Error
98
-     */
99
-    public function __construct($options_array = array())
100
-    {
101
-        $options_array = (array) apply_filters(
102
-            'FHEE__EE_Form_Section_Proper___construct__options_array',
103
-            $options_array,
104
-            $this
105
-        );
106
-        // call parent first, as it may be setting the name
107
-        parent::__construct($options_array);
108
-        // if they've included subsections in the constructor, add them now
109
-        if (isset($options_array['include'])) {
110
-            // we are going to make sure we ONLY have those subsections to include
111
-            // AND we are going to make sure they're in that specified order
112
-            $reordered_subsections = array();
113
-            foreach ($options_array['include'] as $input_name) {
114
-                if (isset($this->_subsections[ $input_name ])) {
115
-                    $reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
116
-                }
117
-            }
118
-            $this->_subsections = $reordered_subsections;
119
-        }
120
-        if (isset($options_array['exclude'])) {
121
-            $exclude            = $options_array['exclude'];
122
-            $this->_subsections = array_diff_key($this->_subsections, array_flip($exclude));
123
-        }
124
-        if (isset($options_array['layout_strategy'])) {
125
-            $this->_layout_strategy = $options_array['layout_strategy'];
126
-        }
127
-        if (! $this->_layout_strategy) {
128
-            $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129
-        }
130
-        $this->_layout_strategy->_construct_finalize($this);
131
-        // ok so we are definitely going to want the forms JS,
132
-        // so enqueue it or remember to enqueue it during wp_enqueue_scripts
133
-        if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) {
134
-            // ok so they've constructed this object after when they should have.
135
-            // just enqueue the generic form scripts and initialize the form immediately in the JS
136
-            EE_Form_Section_Proper::wp_enqueue_scripts(true);
137
-        } else {
138
-            add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
139
-            add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
140
-        }
141
-        add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1);
142
-        /**
143
-         * Gives other plugins a chance to hook in before construct finalize is called.
144
-         * The form probably doesn't yet have a parent form section.
145
-         * Since 4.9.32, when this action was introduced, this is the best place to add a subsection onto a form,
146
-         * assuming you don't care what the form section's name, HTML ID, or HTML name etc are.
147
-         * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end
148
-         *
149
-         * @since 4.9.32
150
-         * @param EE_Form_Section_Proper $this          before __construct is done, but all of its logic,
151
-         *                                              except maybe calling _construct_finalize has been done
152
-         * @param array                  $options_array options passed into the constructor
153
-         */
154
-        do_action(
155
-            'AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called',
156
-            $this,
157
-            $options_array
158
-        );
159
-        if (isset($options_array['name'])) {
160
-            $this->_construct_finalize(null, $options_array['name']);
161
-        }
162
-    }
163
-
164
-
165
-    /**
166
-     * Finishes construction given the parent form section and this form section's name
167
-     *
168
-     * @param EE_Form_Section_Proper $parent_form_section
169
-     * @param string                 $name
170
-     * @throws EE_Error
171
-     */
172
-    public function _construct_finalize($parent_form_section, $name)
173
-    {
174
-        parent::_construct_finalize($parent_form_section, $name);
175
-        $this->_set_default_name_if_empty();
176
-        $this->_set_default_html_id_if_empty();
177
-        foreach ($this->_subsections as $subsection_name => $subsection) {
178
-            if ($subsection instanceof EE_Form_Section_Base) {
179
-                $subsection->_construct_finalize($this, $subsection_name);
180
-            } else {
181
-                throw new EE_Error(
182
-                    sprintf(
183
-                        esc_html__(
184
-                            'Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"',
185
-                            'event_espresso'
186
-                        ),
187
-                        $subsection_name,
188
-                        get_class($this),
189
-                        $subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
190
-                    )
191
-                );
192
-            }
193
-        }
194
-        /**
195
-         * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed.
196
-         * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID
197
-         * (or other attributes derived from the name like the HTML label id, etc), this is where it should be done.
198
-         * This might only happen just before displaying the form, or just before it receives form submission data.
199
-         * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've
200
-         * ensured it has a name, HTML IDs, etc
201
-         *
202
-         * @param EE_Form_Section_Proper      $this
203
-         * @param EE_Form_Section_Proper|null $parent_form_section
204
-         * @param string                      $name
205
-         */
206
-        do_action(
207
-            'AHEE__EE_Form_Section_Proper___construct_finalize__end',
208
-            $this,
209
-            $parent_form_section,
210
-            $name
211
-        );
212
-    }
213
-
214
-
215
-    /**
216
-     * Gets the layout strategy for this form section
217
-     *
218
-     * @return EE_Form_Section_Layout_Base
219
-     */
220
-    public function get_layout_strategy()
221
-    {
222
-        return $this->_layout_strategy;
223
-    }
224
-
225
-
226
-    /**
227
-     * Gets the HTML for a single input for this form section according
228
-     * to the layout strategy
229
-     *
230
-     * @param EE_Form_Input_Base $input
231
-     * @return string
232
-     */
233
-    public function get_html_for_input($input)
234
-    {
235
-        return $this->_layout_strategy->layout_input($input);
236
-    }
237
-
238
-
239
-    /**
240
-     * was_submitted - checks if form inputs are present in request data
241
-     * Basically an alias for form_data_present_in() (which is used by both
242
-     * proper form sections and form inputs)
243
-     *
244
-     * @param null $form_data
245
-     * @return boolean
246
-     * @throws EE_Error
247
-     */
248
-    public function was_submitted($form_data = null)
249
-    {
250
-        return $this->form_data_present_in($form_data);
251
-    }
252
-
253
-    /**
254
-     * Gets the cached request data; but if there is none, or $req_data was set with
255
-     * something different, refresh the cache, and then return it
256
-     * @param null $req_data
257
-     * @return array
258
-     */
259
-    protected function getCachedRequest($req_data = null)
260
-    {
261
-        if (
262
-            $this->cached_request_data === null
263
-            || (
264
-                $req_data !== null
265
-                && $req_data !== $this->cached_request_data
266
-            )
267
-        ) {
268
-            $req_data = apply_filters(
269
-                'FHEE__EE_Form_Section_Proper__receive_form_submission__req_data',
270
-                $req_data,
271
-                $this
272
-            );
273
-            if ($req_data === null) {
274
-                $req_data = array_merge($_GET, $_POST);
275
-            }
276
-            $req_data = apply_filters(
277
-                'FHEE__EE_Form_Section_Proper__receive_form_submission__request_data',
278
-                $req_data,
279
-                $this
280
-            );
281
-            $this->cached_request_data = (array) $req_data;
282
-        }
283
-        return $this->cached_request_data;
284
-    }
285
-
286
-
287
-    /**
288
-     * After the form section is initially created, call this to sanitize the data in the submission
289
-     * which relates to this form section, validate it, and set it as properties on the form.
290
-     *
291
-     * @param array|null $req_data should usually be $_POST (the default).
292
-     *                             However, you CAN supply a different array.
293
-     *                             Consider using set_defaults() instead however.
294
-     *                             (If you rendered the form in the page using echo $form_x->get_html()
295
-     *                             the inputs will have the correct name in the request data for this function
296
-     *                             to find them and populate the form with them.
297
-     *                             If you have a flat form (with only input subsections),
298
-     *                             you can supply a flat array where keys
299
-     *                             are the form input names and values are their values)
300
-     * @param boolean    $validate whether or not to perform validation on this data. Default is,
301
-     *                             of course, to validate that data, and set errors on the invalid values.
302
-     *                             But if the data has already been validated
303
-     *                             (eg you validated the data then stored it in the DB)
304
-     *                             you may want to skip this step.
305
-     * @throws InvalidArgumentException
306
-     * @throws InvalidInterfaceException
307
-     * @throws InvalidDataTypeException
308
-     * @throws EE_Error
309
-     */
310
-    public function receive_form_submission($req_data = null, $validate = true)
311
-    {
312
-        $req_data = $this->getCachedRequest($req_data);
313
-        $this->_normalize($req_data);
314
-        if ($validate) {
315
-            $this->_validate();
316
-            // if it's invalid, we're going to want to re-display so remember what they submitted
317
-            if (! $this->is_valid()) {
318
-                $this->store_submitted_form_data_in_session();
319
-            }
320
-        }
321
-        if ($this->submission_error_message() === '' && ! $this->is_valid()) {
322
-            $this->set_submission_error_message();
323
-        }
324
-        do_action(
325
-            'AHEE__EE_Form_Section_Proper__receive_form_submission__end',
326
-            $req_data,
327
-            $this,
328
-            $validate
329
-        );
330
-    }
331
-
332
-
333
-    /**
334
-     * caches the originally submitted input values in the session
335
-     * so that they can be used to repopulate the form if it failed validation
336
-     *
337
-     * @return boolean whether or not the data was successfully stored in the session
338
-     * @throws InvalidArgumentException
339
-     * @throws InvalidInterfaceException
340
-     * @throws InvalidDataTypeException
341
-     * @throws EE_Error
342
-     */
343
-    protected function store_submitted_form_data_in_session()
344
-    {
345
-        return EE_Registry::instance()->SSN->set_session_data(
346
-            array(
347
-                EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true),
348
-            )
349
-        );
350
-    }
351
-
352
-
353
-    /**
354
-     * retrieves the originally submitted input values in the session
355
-     * so that they can be used to repopulate the form if it failed validation
356
-     *
357
-     * @return array
358
-     * @throws InvalidArgumentException
359
-     * @throws InvalidInterfaceException
360
-     * @throws InvalidDataTypeException
361
-     */
362
-    protected function get_submitted_form_data_from_session()
363
-    {
364
-        $session = EE_Registry::instance()->SSN;
365
-        if ($session instanceof EE_Session) {
366
-            return $session->get_session_data(
367
-                EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY
368
-            );
369
-        }
370
-        return array();
371
-    }
372
-
373
-
374
-    /**
375
-     * flushed the originally submitted input values from the session
376
-     *
377
-     * @return boolean whether or not the data was successfully removed from the session
378
-     * @throws InvalidArgumentException
379
-     * @throws InvalidInterfaceException
380
-     * @throws InvalidDataTypeException
381
-     */
382
-    public static function flush_submitted_form_data_from_session()
383
-    {
384
-        return EE_Registry::instance()->SSN->reset_data(
385
-            array(EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY)
386
-        );
387
-    }
388
-
389
-
390
-    /**
391
-     * Populates this form and its subsections with data from the session.
392
-     * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows
393
-     * validation errors when displaying too)
394
-     * Returns true if the form was populated from the session, false otherwise
395
-     *
396
-     * @return boolean
397
-     * @throws InvalidArgumentException
398
-     * @throws InvalidInterfaceException
399
-     * @throws InvalidDataTypeException
400
-     * @throws EE_Error
401
-     */
402
-    public function populate_from_session()
403
-    {
404
-        $form_data_in_session = $this->get_submitted_form_data_from_session();
405
-        if (empty($form_data_in_session)) {
406
-            return false;
407
-        }
408
-        $this->receive_form_submission($form_data_in_session);
409
-        add_action('shutdown', array('EE_Form_Section_Proper', 'flush_submitted_form_data_from_session'));
410
-        if ($this->form_data_present_in($form_data_in_session)) {
411
-            return true;
412
-        }
413
-        return false;
414
-    }
415
-
416
-
417
-    /**
418
-     * Populates the default data for the form, given an array where keys are
419
-     * the input names, and values are their values (preferably normalized to be their
420
-     * proper PHP types, not all strings... although that should be ok too).
421
-     * Proper subsections are sub-arrays, the key being the subsection's name, and
422
-     * the value being an array formatted in teh same way
423
-     *
424
-     * @param array $default_data
425
-     * @throws EE_Error
426
-     */
427
-    public function populate_defaults($default_data)
428
-    {
429
-        foreach ($this->subsections(false) as $subsection_name => $subsection) {
430
-            if (isset($default_data[ $subsection_name ])) {
431
-                if ($subsection instanceof EE_Form_Input_Base) {
432
-                    $subsection->set_default($default_data[ $subsection_name ]);
433
-                } elseif ($subsection instanceof EE_Form_Section_Proper) {
434
-                    $subsection->populate_defaults($default_data[ $subsection_name ]);
435
-                }
436
-            }
437
-        }
438
-    }
439
-
440
-
441
-    /**
442
-     * returns true if subsection exists
443
-     *
444
-     * @param string $name
445
-     * @return boolean
446
-     */
447
-    public function subsection_exists($name)
448
-    {
449
-        return isset($this->_subsections[ $name ]) ? true : false;
450
-    }
451
-
452
-
453
-    /**
454
-     * Gets the subsection specified by its name
455
-     *
456
-     * @param string  $name
457
-     * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE
458
-     *                                                      so that the inputs will be properly configured.
459
-     *                                                      However, some client code may be ok
460
-     *                                                      with construction finalize being called later
461
-     *                                                      (realizing that the subsections' html names
462
-     *                                                      might not be set yet, etc.)
463
-     * @return EE_Form_Section_Base
464
-     * @throws EE_Error
465
-     */
466
-    public function get_subsection($name, $require_construction_to_be_finalized = true)
467
-    {
468
-        if ($require_construction_to_be_finalized) {
469
-            $this->ensure_construct_finalized_called();
470
-        }
471
-        return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
472
-    }
473
-
474
-
475
-    /**
476
-     * Gets all the validatable subsections of this form section
477
-     *
478
-     * @return EE_Form_Section_Validatable[]
479
-     * @throws EE_Error
480
-     */
481
-    public function get_validatable_subsections()
482
-    {
483
-        $validatable_subsections = array();
484
-        foreach ($this->subsections() as $name => $obj) {
485
-            if ($obj instanceof EE_Form_Section_Validatable) {
486
-                $validatable_subsections[ $name ] = $obj;
487
-            }
488
-        }
489
-        return $validatable_subsections;
490
-    }
491
-
492
-
493
-    /**
494
-     * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child,
495
-     * throw an EE_Error.
496
-     *
497
-     * @param string  $name
498
-     * @param boolean $require_construction_to_be_finalized most client code should
499
-     *                                                      leave this as TRUE so that the inputs will be properly
500
-     *                                                      configured. However, some client code may be ok with
501
-     *                                                      construction finalize being called later
502
-     *                                                      (realizing that the subsections' html names might not be
503
-     *                                                      set yet, etc.)
504
-     * @return EE_Form_Input_Base
505
-     * @throws EE_Error
506
-     */
507
-    public function get_input($name, $require_construction_to_be_finalized = true)
508
-    {
509
-        $subsection = $this->get_subsection(
510
-            $name,
511
-            $require_construction_to_be_finalized
512
-        );
513
-        if (! $subsection instanceof EE_Form_Input_Base) {
514
-            throw new EE_Error(
515
-                sprintf(
516
-                    esc_html__(
517
-                        "Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'",
518
-                        'event_espresso'
519
-                    ),
520
-                    $name,
521
-                    get_class($this),
522
-                    $subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
523
-                )
524
-            );
525
-        }
526
-        return $subsection;
527
-    }
528
-
529
-
530
-    /**
531
-     * Like get_input(), gets the proper subsection of the form given the name,
532
-     * otherwise throws an EE_Error
533
-     *
534
-     * @param string  $name
535
-     * @param boolean $require_construction_to_be_finalized most client code should
536
-     *                                                      leave this as TRUE so that the inputs will be properly
537
-     *                                                      configured. However, some client code may be ok with
538
-     *                                                      construction finalize being called later
539
-     *                                                      (realizing that the subsections' html names might not be
540
-     *                                                      set yet, etc.)
541
-     * @return EE_Form_Section_Proper
542
-     * @throws EE_Error
543
-     */
544
-    public function get_proper_subsection($name, $require_construction_to_be_finalized = true)
545
-    {
546
-        $subsection = $this->get_subsection(
547
-            $name,
548
-            $require_construction_to_be_finalized
549
-        );
550
-        if (! $subsection instanceof EE_Form_Section_Proper) {
551
-            throw new EE_Error(
552
-                sprintf(
553
-                    esc_html__(
554
-                        "Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'",
555
-                        'event_espresso'
556
-                    ),
557
-                    $name,
558
-                    get_class($this)
559
-                )
560
-            );
561
-        }
562
-        return $subsection;
563
-    }
564
-
565
-
566
-    /**
567
-     * Gets the value of the specified input. Should be called after receive_form_submission()
568
-     * or populate_defaults() on the form, where the normalized value on the input is set.
569
-     *
570
-     * @param string $name
571
-     * @return mixed depending on the input's type and its normalization strategy
572
-     * @throws EE_Error
573
-     */
574
-    public function get_input_value($name)
575
-    {
576
-        $input = $this->get_input($name);
577
-        return $input->normalized_value();
578
-    }
579
-
580
-
581
-    /**
582
-     * Checks if this form section itself is valid, and then checks its subsections
583
-     *
584
-     * @throws EE_Error
585
-     * @return boolean
586
-     */
587
-    public function is_valid()
588
-    {
589
-        if ($this->is_valid === null) {
590
-            if (! $this->has_received_submission()) {
591
-                throw new EE_Error(
592
-                    sprintf(
593
-                        esc_html__(
594
-                            'You cannot check if a form is valid before receiving the form submission using receive_form_submission',
595
-                            'event_espresso'
596
-                        )
597
-                    )
598
-                );
599
-            }
600
-            if (! parent::is_valid()) {
601
-                $this->is_valid = false;
602
-            } else {
603
-                // ok so no general errors to this entire form section.
604
-                // so let's check the subsections, but only set errors if that hasn't been done yet
605
-                $this->is_valid = true;
606
-                foreach ($this->get_validatable_subsections() as $subsection) {
607
-                    if (! $subsection->is_valid()) {
608
-                        $this->is_valid = false;
609
-                    }
610
-                }
611
-            }
612
-        }
613
-        return $this->is_valid;
614
-    }
615
-
616
-
617
-    /**
618
-     * gets the default name of this form section if none is specified
619
-     *
620
-     * @return void
621
-     */
622
-    protected function _set_default_name_if_empty()
623
-    {
624
-        if (! $this->_name) {
625
-            $classname    = get_class($this);
626
-            $default_name = str_replace('EE_', '', $classname);
627
-            $this->_name  = $default_name;
628
-        }
629
-    }
630
-
631
-
632
-    /**
633
-     * Returns the HTML for the form, except for the form opening and closing tags
634
-     * (as the form section doesn't know where you necessarily want to send the information to),
635
-     * and except for a submit button. Enqueues JS and CSS; if called early enough we will
636
-     * try to enqueue them in the header, otherwise they'll be enqueued in the footer.
637
-     * Not doing_it_wrong because theoretically this CAN be used properly,
638
-     * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue
639
-     * any CSS.
640
-     *
641
-     * @throws InvalidArgumentException
642
-     * @throws InvalidInterfaceException
643
-     * @throws InvalidDataTypeException
644
-     * @throws EE_Error
645
-     */
646
-    public function get_html_and_js()
647
-    {
648
-        $this->enqueue_js();
649
-        return $this->get_html();
650
-    }
651
-
652
-
653
-    /**
654
-     * returns HTML for displaying this form section. recursively calls display_section() on all subsections
655
-     *
656
-     * @param bool $display_previously_submitted_data
657
-     * @return string
658
-     * @throws InvalidArgumentException
659
-     * @throws InvalidInterfaceException
660
-     * @throws InvalidDataTypeException
661
-     * @throws EE_Error
662
-     * @throws EE_Error
663
-     * @throws EE_Error
664
-     */
665
-    public function get_html($display_previously_submitted_data = true)
666
-    {
667
-        $this->ensure_construct_finalized_called();
668
-        if ($display_previously_submitted_data) {
669
-            $this->populate_from_session();
670
-        }
671
-        return $this->_form_html_filter
672
-            ? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this)
673
-            : $this->_layout_strategy->layout_form();
674
-    }
675
-
676
-
677
-    /**
678
-     * enqueues JS and CSS for the form.
679
-     * It is preferred to call this before wp_enqueue_scripts so the
680
-     * scripts and styles can be put in the header, but if called later
681
-     * they will be put in the footer (which is OK for JS, but in HTML4 CSS should
682
-     * only be in the header; but in HTML5 its ok in the body.
683
-     * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag.
684
-     * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.)
685
-     *
686
-     * @return void
687
-     * @throws EE_Error
688
-     */
689
-    public function enqueue_js()
690
-    {
691
-        $this->_enqueue_and_localize_form_js();
692
-        foreach ($this->subsections() as $subsection) {
693
-            $subsection->enqueue_js();
694
-        }
695
-    }
696
-
697
-
698
-    /**
699
-     * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts().
700
-     * This must be done BEFORE wp_enqueue_scripts() gets called, which is on
701
-     * the wp_enqueue_scripts hook.
702
-     * However, registering the form js and localizing it can happen when we
703
-     * actually output the form (which is preferred, seeing how teh form's fields
704
-     * could change until it's actually outputted)
705
-     *
706
-     * @param boolean $init_form_validation_automatically whether or not we want the form validation
707
-     *                                                    to be triggered automatically or not
708
-     * @return void
709
-     */
710
-    public static function wp_enqueue_scripts($init_form_validation_automatically = true)
711
-    {
712
-        wp_register_script(
713
-            'ee_form_section_validation',
714
-            EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
715
-            array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
716
-            EVENT_ESPRESSO_VERSION,
717
-            true
718
-        );
719
-        wp_localize_script(
720
-            'ee_form_section_validation',
721
-            'ee_form_section_validation_init',
722
-            array('init' => $init_form_validation_automatically ? '1' : '0')
723
-        );
724
-    }
725
-
726
-
727
-    /**
728
-     * gets the variables used by form_section_validation.js.
729
-     * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script,
730
-     * but before the wordpress hook wp_loaded
731
-     *
732
-     * @throws EE_Error
733
-     */
734
-    public function _enqueue_and_localize_form_js()
735
-    {
736
-        $this->ensure_construct_finalized_called();
737
-        // actually, we don't want to localize just yet. There may be other forms on the page.
738
-        // so we need to add our form section data to a static variable accessible by all form sections
739
-        // and localize it just before the footer
740
-        $this->localize_validation_rules();
741
-        add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2);
742
-        add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'));
743
-    }
744
-
745
-
746
-    /**
747
-     * add our form section data to a static variable accessible by all form sections
748
-     *
749
-     * @param bool $return_for_subsection
750
-     * @return void
751
-     * @throws EE_Error
752
-     */
753
-    public function localize_validation_rules($return_for_subsection = false)
754
-    {
755
-        // we only want to localize vars ONCE for the entire form,
756
-        // so if the form section doesn't have a parent, then it must be the top dog
757
-        if ($return_for_subsection || ! $this->parent_section()) {
758
-            EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
759
-                'form_section_id'  => $this->html_id(true),
760
-                'validation_rules' => $this->get_jquery_validation_rules(),
761
-                'other_data'       => $this->get_other_js_data(),
762
-                'errors'           => $this->subsection_validation_errors_by_html_name(),
763
-            );
764
-            EE_Form_Section_Proper::$_scripts_localized                                = true;
765
-        }
766
-    }
767
-
768
-
769
-    /**
770
-     * Gets an array of extra data that will be useful for client-side javascript.
771
-     * This is primarily data added by inputs and forms in addition to any
772
-     * scripts they might enqueue
773
-     *
774
-     * @param array $form_other_js_data
775
-     * @return array
776
-     * @throws EE_Error
777
-     */
778
-    public function get_other_js_data($form_other_js_data = array())
779
-    {
780
-        foreach ($this->subsections() as $subsection) {
781
-            $form_other_js_data = $subsection->get_other_js_data($form_other_js_data);
782
-        }
783
-        return $form_other_js_data;
784
-    }
785
-
786
-
787
-    /**
788
-     * Gets a flat array of inputs for this form section and its subsections.
789
-     * Keys are their form names, and values are the inputs themselves
790
-     *
791
-     * @return EE_Form_Input_Base
792
-     * @throws EE_Error
793
-     */
794
-    public function inputs_in_subsections()
795
-    {
796
-        $inputs = array();
797
-        foreach ($this->subsections() as $subsection) {
798
-            if ($subsection instanceof EE_Form_Input_Base) {
799
-                $inputs[ $subsection->html_name() ] = $subsection;
800
-            } elseif ($subsection instanceof EE_Form_Section_Proper) {
801
-                $inputs += $subsection->inputs_in_subsections();
802
-            }
803
-        }
804
-        return $inputs;
805
-    }
806
-
807
-
808
-    /**
809
-     * Gets a flat array of all the validation errors.
810
-     * Keys are html names (because those should be unique)
811
-     * and values are a string of all their validation errors
812
-     *
813
-     * @return string[]
814
-     * @throws EE_Error
815
-     */
816
-    public function subsection_validation_errors_by_html_name()
817
-    {
818
-        $inputs = $this->inputs();
819
-        $errors = array();
820
-        foreach ($inputs as $form_input) {
821
-            if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
822
-                $errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
823
-            }
824
-        }
825
-        return $errors;
826
-    }
827
-
828
-
829
-    /**
830
-     * passes all the form data required by the JS to the JS, and enqueues the few required JS files.
831
-     * Should be setup by each form during the _enqueues_and_localize_form_js
832
-     *
833
-     * @throws InvalidArgumentException
834
-     * @throws InvalidInterfaceException
835
-     * @throws InvalidDataTypeException
836
-     */
837
-    public static function localize_script_for_all_forms()
838
-    {
839
-        // allow inputs and stuff to hook in their JS and stuff here
840
-        do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin');
841
-        EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages();
842
-        $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
843
-            ? EE_Registry::instance()->CFG->registration->email_validation_level
844
-            : 'wp_default';
845
-        EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
846
-        wp_enqueue_script('ee_form_section_validation');
847
-        wp_localize_script(
848
-            'ee_form_section_validation',
849
-            'ee_form_section_vars',
850
-            EE_Form_Section_Proper::$_js_localization
851
-        );
852
-    }
853
-
854
-
855
-    /**
856
-     * ensure_scripts_localized
857
-     *
858
-     * @throws EE_Error
859
-     */
860
-    public function ensure_scripts_localized()
861
-    {
862
-        if (! EE_Form_Section_Proper::$_scripts_localized) {
863
-            $this->_enqueue_and_localize_form_js();
864
-        }
865
-    }
866
-
867
-
868
-    /**
869
-     * Gets the hard-coded validation error messages to be used in the JS. The convention
870
-     * is that the key here should be the same as the custom validation rule put in the JS file
871
-     *
872
-     * @return array keys are custom validation rules, and values are internationalized strings
873
-     */
874
-    private static function _get_localized_error_messages()
875
-    {
876
-        return array(
877
-            'validUrl' => esc_html__('This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg', 'event_espresso'),
878
-            'regex'    => esc_html__('Please check your input', 'event_espresso'),
879
-        );
880
-    }
881
-
882
-
883
-    /**
884
-     * @return array
885
-     */
886
-    public static function js_localization()
887
-    {
888
-        return self::$_js_localization;
889
-    }
890
-
891
-
892
-    /**
893
-     * @return void
894
-     */
895
-    public static function reset_js_localization()
896
-    {
897
-        self::$_js_localization = array();
898
-    }
899
-
900
-
901
-    /**
902
-     * Gets the JS to put inside the jquery validation rules for subsection of this form section.
903
-     * See parent function for more...
904
-     *
905
-     * @return array
906
-     * @throws EE_Error
907
-     */
908
-    public function get_jquery_validation_rules()
909
-    {
910
-        $jquery_validation_rules = array();
911
-        foreach ($this->get_validatable_subsections() as $subsection) {
912
-            $jquery_validation_rules = array_merge(
913
-                $jquery_validation_rules,
914
-                $subsection->get_jquery_validation_rules()
915
-            );
916
-        }
917
-        return $jquery_validation_rules;
918
-    }
919
-
920
-
921
-    /**
922
-     * Sanitizes all the data and sets the sanitized value of each field
923
-     *
924
-     * @param array $req_data like $_POST
925
-     * @return void
926
-     * @throws EE_Error
927
-     */
928
-    protected function _normalize($req_data)
929
-    {
930
-        $this->_received_submission = true;
931
-        $this->_validation_errors   = array();
932
-        foreach ($this->get_validatable_subsections() as $subsection) {
933
-            try {
934
-                $subsection->_normalize($req_data);
935
-            } catch (EE_Validation_Error $e) {
936
-                $subsection->add_validation_error($e);
937
-            }
938
-        }
939
-    }
940
-
941
-
942
-    /**
943
-     * Performs validation on this form section and its subsections.
944
-     * For each subsection,
945
-     * calls _validate_{subsection_name} on THIS form (if the function exists)
946
-     * and passes it the subsection, then calls _validate on that subsection.
947
-     * If you need to perform validation on the form as a whole (considering multiple)
948
-     * you would be best to override this _validate method,
949
-     * calling parent::_validate() first.
950
-     *
951
-     * @throws EE_Error
952
-     */
953
-    protected function _validate()
954
-    {
955
-        // reset the cache of whether this form is valid or not- we're re-validating it now
956
-        $this->is_valid = null;
957
-        foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
958
-            if (method_exists($this, '_validate_' . $subsection_name)) {
959
-                call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
960
-            }
961
-            $subsection->_validate();
962
-        }
963
-    }
964
-
965
-
966
-    /**
967
-     * Gets all the validated inputs for the form section
968
-     *
969
-     * @return array
970
-     * @throws EE_Error
971
-     */
972
-    public function valid_data()
973
-    {
974
-        $inputs = array();
975
-        foreach ($this->subsections() as $subsection_name => $subsection) {
976
-            if ($subsection instanceof EE_Form_Section_Proper) {
977
-                $inputs[ $subsection_name ] = $subsection->valid_data();
978
-            } elseif ($subsection instanceof EE_Form_Input_Base) {
979
-                $inputs[ $subsection_name ] = $subsection->normalized_value();
980
-            }
981
-        }
982
-        return $inputs;
983
-    }
984
-
985
-
986
-    /**
987
-     * Gets all the inputs on this form section
988
-     *
989
-     * @return EE_Form_Input_Base[]
990
-     * @throws EE_Error
991
-     */
992
-    public function inputs()
993
-    {
994
-        $inputs = array();
995
-        foreach ($this->subsections() as $subsection_name => $subsection) {
996
-            if ($subsection instanceof EE_Form_Input_Base) {
997
-                $inputs[ $subsection_name ] = $subsection;
998
-            }
999
-        }
1000
-        return $inputs;
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * Gets all the subsections which are a proper form
1006
-     *
1007
-     * @return EE_Form_Section_Proper[]
1008
-     * @throws EE_Error
1009
-     */
1010
-    public function subforms()
1011
-    {
1012
-        $form_sections = array();
1013
-        foreach ($this->subsections() as $name => $obj) {
1014
-            if ($obj instanceof EE_Form_Section_Proper) {
1015
-                $form_sections[ $name ] = $obj;
1016
-            }
1017
-        }
1018
-        return $form_sections;
1019
-    }
1020
-
1021
-
1022
-    /**
1023
-     * Gets all the subsections (inputs, proper subsections, or html-only sections).
1024
-     * Consider using inputs() or subforms()
1025
-     * if you only want form inputs or proper form sections.
1026
-     *
1027
-     * @param boolean $require_construction_to_be_finalized most client code should
1028
-     *                                                      leave this as TRUE so that the inputs will be properly
1029
-     *                                                      configured. However, some client code may be ok with
1030
-     *                                                      construction finalize being called later
1031
-     *                                                      (realizing that the subsections' html names might not be
1032
-     *                                                      set yet, etc.)
1033
-     * @return EE_Form_Section_Proper[]
1034
-     * @throws EE_Error
1035
-     */
1036
-    public function subsections($require_construction_to_be_finalized = true)
1037
-    {
1038
-        if ($require_construction_to_be_finalized) {
1039
-            $this->ensure_construct_finalized_called();
1040
-        }
1041
-        return $this->_subsections;
1042
-    }
1043
-
1044
-
1045
-    /**
1046
-     * Returns whether this form has any subforms or inputs
1047
-     * @return bool
1048
-     */
1049
-    public function hasSubsections()
1050
-    {
1051
-        return ! empty($this->_subsections);
1052
-    }
1053
-
1054
-
1055
-    /**
1056
-     * Returns a simple array where keys are input names, and values are their normalized
1057
-     * values. (Similar to calling get_input_value on inputs)
1058
-     *
1059
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1060
-     *                                        or just this forms' direct children inputs
1061
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1062
-     *                                        or allow multidimensional array
1063
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array
1064
-     *                                        with array keys being input names
1065
-     *                                        (regardless of whether they are from a subsection or not),
1066
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1067
-     *                                        where keys are always subsection names and values are either
1068
-     *                                        the input's normalized value, or an array like the top-level array
1069
-     * @throws EE_Error
1070
-     */
1071
-    public function input_values($include_subform_inputs = false, $flatten = false)
1072
-    {
1073
-        return $this->_input_values(false, $include_subform_inputs, $flatten);
1074
-    }
1075
-
1076
-
1077
-    /**
1078
-     * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value'
1079
-     * of each input. On some inputs (especially radio boxes or checkboxes), the value stored
1080
-     * is not necessarily the value we want to display to users. This creates an array
1081
-     * where keys are the input names, and values are their display values
1082
-     *
1083
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1084
-     *                                        or just this forms' direct children inputs
1085
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1086
-     *                                        or allow multidimensional array
1087
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array
1088
-     *                                        with array keys being input names
1089
-     *                                        (regardless of whether they are from a subsection or not),
1090
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1091
-     *                                        where keys are always subsection names and values are either
1092
-     *                                        the input's normalized value, or an array like the top-level array
1093
-     * @throws EE_Error
1094
-     */
1095
-    public function input_pretty_values($include_subform_inputs = false, $flatten = false)
1096
-    {
1097
-        return $this->_input_values(true, $include_subform_inputs, $flatten);
1098
-    }
1099
-
1100
-
1101
-    /**
1102
-     * Gets the input values from the form
1103
-     *
1104
-     * @param boolean $pretty                 Whether to retrieve the pretty value,
1105
-     *                                        or just the normalized value
1106
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1107
-     *                                        or just this forms' direct children inputs
1108
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1109
-     *                                        or allow multidimensional array
1110
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being
1111
-     *                                        input names (regardless of whether they are from a subsection or not),
1112
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1113
-     *                                        where keys are always subsection names and values are either
1114
-     *                                        the input's normalized value, or an array like the top-level array
1115
-     * @throws EE_Error
1116
-     */
1117
-    public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false)
1118
-    {
1119
-        $input_values = array();
1120
-        foreach ($this->subsections() as $subsection_name => $subsection) {
1121
-            if ($subsection instanceof EE_Form_Input_Base) {
1122
-                $input_values[ $subsection_name ] = $pretty
1123
-                    ? $subsection->pretty_value()
1124
-                    : $subsection->normalized_value();
1125
-            } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
1126
-                $subform_input_values = $subsection->_input_values(
1127
-                    $pretty,
1128
-                    $include_subform_inputs,
1129
-                    $flatten
1130
-                );
1131
-                if ($flatten) {
1132
-                    $input_values = array_merge($input_values, $subform_input_values);
1133
-                } else {
1134
-                    $input_values[ $subsection_name ] = $subform_input_values;
1135
-                }
1136
-            }
1137
-        }
1138
-        return $input_values;
1139
-    }
1140
-
1141
-
1142
-    /**
1143
-     * Gets the originally submitted input values from the form
1144
-     *
1145
-     * @param boolean $include_subforms  Whether to include inputs from subforms,
1146
-     *                                   or just this forms' direct children inputs
1147
-     * @return array                     if $flatten is TRUE it will always be a 1-dimensional array
1148
-     *                                   with array keys being input names
1149
-     *                                   (regardless of whether they are from a subsection or not),
1150
-     *                                   and if $flatten is FALSE it can be a multidimensional array
1151
-     *                                   where keys are always subsection names and values are either
1152
-     *                                   the input's normalized value, or an array like the top-level array
1153
-     * @throws EE_Error
1154
-     */
1155
-    public function submitted_values($include_subforms = false)
1156
-    {
1157
-        $submitted_values = array();
1158
-        foreach ($this->subsections() as $subsection) {
1159
-            if ($subsection instanceof EE_Form_Input_Base) {
1160
-                // is this input part of an array of inputs?
1161
-                if (strpos($subsection->html_name(), '[') !== false) {
1162
-                    $full_input_name  = EEH_Array::convert_array_values_to_keys(
1163
-                        explode(
1164
-                            '[',
1165
-                            str_replace(']', '', $subsection->html_name())
1166
-                        ),
1167
-                        $subsection->raw_value()
1168
-                    );
1169
-                    $submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1170
-                } else {
1171
-                    $submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1172
-                }
1173
-            } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1174
-                $subform_input_values = $subsection->submitted_values($include_subforms);
1175
-                $submitted_values     = array_replace_recursive($submitted_values, $subform_input_values);
1176
-            }
1177
-        }
1178
-        return $submitted_values;
1179
-    }
1180
-
1181
-
1182
-    /**
1183
-     * Indicates whether or not this form has received a submission yet
1184
-     * (ie, had receive_form_submission called on it yet)
1185
-     *
1186
-     * @return boolean
1187
-     * @throws EE_Error
1188
-     */
1189
-    public function has_received_submission()
1190
-    {
1191
-        $this->ensure_construct_finalized_called();
1192
-        return $this->_received_submission;
1193
-    }
1194
-
1195
-
1196
-    /**
1197
-     * Equivalent to passing 'exclude' in the constructor's options array.
1198
-     * Removes the listed inputs from the form
1199
-     *
1200
-     * @param array $inputs_to_exclude values are the input names
1201
-     * @return void
1202
-     */
1203
-    public function exclude(array $inputs_to_exclude = array())
1204
-    {
1205
-        foreach ($inputs_to_exclude as $input_to_exclude_name) {
1206
-            unset($this->_subsections[ $input_to_exclude_name ]);
1207
-        }
1208
-    }
1209
-
1210
-
1211
-    /**
1212
-     * Changes these inputs' display strategy to be EE_Hidden_Display_Strategy.
1213
-     * @param array $inputs_to_hide
1214
-     * @throws EE_Error
1215
-     */
1216
-    public function hide(array $inputs_to_hide = array())
1217
-    {
1218
-        foreach ($inputs_to_hide as $input_to_hide) {
1219
-            $input = $this->get_input($input_to_hide);
1220
-            $input->set_display_strategy(new EE_Hidden_Display_Strategy());
1221
-        }
1222
-    }
1223
-
1224
-
1225
-    /**
1226
-     * add_subsections
1227
-     * Adds the listed subsections to the form section.
1228
-     * If $subsection_name_to_target is provided,
1229
-     * then new subsections are added before or after that subsection,
1230
-     * otherwise to the start or end of the entire subsections array.
1231
-     *
1232
-     * @param EE_Form_Section_Base[] $new_subsections           array of new form subsections
1233
-     *                                                          where keys are their names
1234
-     * @param string                 $subsection_name_to_target an existing for section that $new_subsections
1235
-     *                                                          should be added before or after
1236
-     *                                                          IF $subsection_name_to_target is null,
1237
-     *                                                          then $new_subsections will be added to
1238
-     *                                                          the beginning or end of the entire subsections array
1239
-     * @param boolean                $add_before                whether to add $new_subsections, before or after
1240
-     *                                                          $subsection_name_to_target,
1241
-     *                                                          or if $subsection_name_to_target is null,
1242
-     *                                                          before or after entire subsections array
1243
-     * @return void
1244
-     * @throws EE_Error
1245
-     */
1246
-    public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1247
-    {
1248
-        foreach ($new_subsections as $subsection_name => $subsection) {
1249
-            if (! $subsection instanceof EE_Form_Section_Base) {
1250
-                EE_Error::add_error(
1251
-                    sprintf(
1252
-                        esc_html__(
1253
-                            "Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.",
1254
-                            'event_espresso'
1255
-                        ),
1256
-                        get_class($subsection),
1257
-                        $subsection_name,
1258
-                        $this->name()
1259
-                    )
1260
-                );
1261
-                unset($new_subsections[ $subsection_name ]);
1262
-            }
1263
-        }
1264
-        $this->_subsections = EEH_Array::insert_into_array(
1265
-            $this->_subsections,
1266
-            $new_subsections,
1267
-            $subsection_name_to_target,
1268
-            $add_before
1269
-        );
1270
-        if ($this->_construction_finalized) {
1271
-            foreach ($this->_subsections as $name => $subsection) {
1272
-                $subsection->_construct_finalize($this, $name);
1273
-            }
1274
-        }
1275
-    }
1276
-
1277
-
1278
-    /**
1279
-     * @param string $subsection_name
1280
-     * @param bool   $recursive
1281
-     * @return bool
1282
-     */
1283
-    public function has_subsection($subsection_name, $recursive = false)
1284
-    {
1285
-        foreach ($this->_subsections as $name => $subsection) {
1286
-            if (
1287
-                $name === $subsection_name
1288
-                || (
1289
-                    $recursive
1290
-                    && $subsection instanceof EE_Form_Section_Proper
1291
-                    && $subsection->has_subsection($subsection_name, $recursive)
1292
-                )
1293
-            ) {
1294
-                return true;
1295
-            }
1296
-        }
1297
-        return false;
1298
-    }
1299
-
1300
-
1301
-
1302
-    /**
1303
-     * Just gets all validatable subsections to clean their sensitive data
1304
-     *
1305
-     * @throws EE_Error
1306
-     */
1307
-    public function clean_sensitive_data()
1308
-    {
1309
-        foreach ($this->get_validatable_subsections() as $subsection) {
1310
-            $subsection->clean_sensitive_data();
1311
-        }
1312
-    }
1313
-
1314
-
1315
-    /**
1316
-     * Sets the submission error message (aka validation error message for this form section and all sub-sections)
1317
-     * @param string                           $form_submission_error_message
1318
-     * @param EE_Form_Section_Validatable $form_section unused
1319
-     * @throws EE_Error
1320
-     */
1321
-    public function set_submission_error_message(
1322
-        $form_submission_error_message = ''
1323
-    ) {
1324
-        $this->_form_submission_error_message = ! empty($form_submission_error_message)
1325
-            ? $form_submission_error_message
1326
-            : $this->getAllValidationErrorsString();
1327
-    }
1328
-
1329
-
1330
-    /**
1331
-     * Returns the cached error message. A default value is set for this during _validate(),
1332
-     * (called during receive_form_submission) but it can be explicitly set using
1333
-     * set_submission_error_message
1334
-     *
1335
-     * @return string
1336
-     */
1337
-    public function submission_error_message()
1338
-    {
1339
-        return $this->_form_submission_error_message;
1340
-    }
1341
-
1342
-
1343
-    /**
1344
-     * Sets a message to display if the data submitted to the form was valid.
1345
-     * @param string $form_submission_success_message
1346
-     */
1347
-    public function set_submission_success_message($form_submission_success_message = '')
1348
-    {
1349
-        $this->_form_submission_success_message = ! empty($form_submission_success_message)
1350
-            ? $form_submission_success_message
1351
-            : esc_html__('Form submitted successfully', 'event_espresso');
1352
-    }
1353
-
1354
-
1355
-    /**
1356
-     * Gets a message appropriate for display when the form is correctly submitted
1357
-     * @return string
1358
-     */
1359
-    public function submission_success_message()
1360
-    {
1361
-        return $this->_form_submission_success_message;
1362
-    }
1363
-
1364
-
1365
-    /**
1366
-     * Returns the prefix that should be used on child of this form section for
1367
-     * their html names. If this form section itself has a parent, prepends ITS
1368
-     * prefix onto this form section's prefix. Used primarily by
1369
-     * EE_Form_Input_Base::_set_default_html_name_if_empty
1370
-     *
1371
-     * @return string
1372
-     * @throws EE_Error
1373
-     */
1374
-    public function html_name_prefix()
1375
-    {
1376
-        if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1377
-            return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1378
-        }
1379
-        return $this->name();
1380
-    }
1381
-
1382
-
1383
-    /**
1384
-     * Gets the name, but first checks _construct_finalize has been called. If not,
1385
-     * calls it (assumes there is no parent and that we want the name to be whatever
1386
-     * was set, which is probably nothing, or the classname)
1387
-     *
1388
-     * @return string
1389
-     * @throws EE_Error
1390
-     */
1391
-    public function name()
1392
-    {
1393
-        $this->ensure_construct_finalized_called();
1394
-        return parent::name();
1395
-    }
1396
-
1397
-
1398
-    /**
1399
-     * @return EE_Form_Section_Proper
1400
-     * @throws EE_Error
1401
-     */
1402
-    public function parent_section()
1403
-    {
1404
-        $this->ensure_construct_finalized_called();
1405
-        return parent::parent_section();
1406
-    }
1407
-
1408
-
1409
-    /**
1410
-     * make sure construction finalized was called, otherwise children might not be ready
1411
-     *
1412
-     * @return void
1413
-     * @throws EE_Error
1414
-     */
1415
-    public function ensure_construct_finalized_called()
1416
-    {
1417
-        if (! $this->_construction_finalized) {
1418
-            $this->_construct_finalize($this->_parent_section, $this->_name);
1419
-        }
1420
-    }
1421
-
1422
-
1423
-    /**
1424
-     * Checks if any of this form section's inputs, or any of its children's inputs,
1425
-     * are in teh form data. If any are found, returns true. Else false
1426
-     *
1427
-     * @param array $req_data
1428
-     * @return boolean
1429
-     * @throws EE_Error
1430
-     */
1431
-    public function form_data_present_in($req_data = null)
1432
-    {
1433
-        $req_data = $this->getCachedRequest($req_data);
1434
-        foreach ($this->subsections() as $subsection) {
1435
-            if ($subsection instanceof EE_Form_Input_Base) {
1436
-                if ($subsection->form_data_present_in($req_data)) {
1437
-                    return true;
1438
-                }
1439
-            } elseif ($subsection instanceof EE_Form_Section_Proper) {
1440
-                if ($subsection->form_data_present_in($req_data)) {
1441
-                    return true;
1442
-                }
1443
-            }
1444
-        }
1445
-        return false;
1446
-    }
1447
-
1448
-
1449
-    /**
1450
-     * Gets validation errors for this form section and subsections
1451
-     * Similar to EE_Form_Section_Validatable::get_validation_errors() except this
1452
-     * gets the validation errors for ALL subsection
1453
-     *
1454
-     * @return EE_Validation_Error[]
1455
-     * @throws EE_Error
1456
-     */
1457
-    public function get_validation_errors_accumulated()
1458
-    {
1459
-        $validation_errors = $this->get_validation_errors();
1460
-        foreach ($this->get_validatable_subsections() as $subsection) {
1461
-            if ($subsection instanceof EE_Form_Section_Proper) {
1462
-                $validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated();
1463
-            } else {
1464
-                $validation_errors_on_this_subsection = $subsection->get_validation_errors();
1465
-            }
1466
-            if ($validation_errors_on_this_subsection) {
1467
-                $validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection);
1468
-            }
1469
-        }
1470
-        return $validation_errors;
1471
-    }
1472
-
1473
-    /**
1474
-     * Fetch validation errors from children and grandchildren and puts them in a single string.
1475
-     * This traverses the form section tree to generate this, but you probably want to instead use
1476
-     * get_form_submission_error_message() which is usually this message cached (or a custom validation error message)
1477
-     *
1478
-     * @return string
1479
-     * @since 4.9.59.p
1480
-     */
1481
-    protected function getAllValidationErrorsString()
1482
-    {
1483
-        $submission_error_messages = array();
1484
-        // bad, bad, bad registrant
1485
-        foreach ($this->get_validation_errors_accumulated() as $validation_error) {
1486
-            if ($validation_error instanceof EE_Validation_Error) {
1487
-                $form_section = $validation_error->get_form_section();
1488
-                if ($form_section instanceof EE_Form_Input_Base) {
1489
-                    $label = $validation_error->get_form_section()->html_label_text();
1490
-                } elseif ($form_section instanceof EE_Form_Section_Validatable) {
1491
-                    $label = $validation_error->get_form_section()->name();
1492
-                } else {
1493
-                    $label = esc_html__('Unknown', 'event_espresso');
1494
-                }
1495
-                $submission_error_messages[] = sprintf(
1496
-                    __('%s : %s', 'event_espresso'),
1497
-                    $label,
1498
-                    $validation_error->getMessage()
1499
-                );
1500
-            }
1501
-        }
1502
-        return implode('<br>', $submission_error_messages);
1503
-    }
1504
-
1505
-
1506
-    /**
1507
-     * This isn't just the name of an input, it's a path pointing to an input. The
1508
-     * path is similar to a folder path: slash (/) means to descend into a subsection,
1509
-     * dot-dot-slash (../) means to ascend into the parent section.
1510
-     * After a series of slashes and dot-dot-slashes, there should be the name of an input,
1511
-     * which will be returned.
1512
-     * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
1513
-     * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
1514
-     * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
1515
-     * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
1516
-     * Etc
1517
-     *
1518
-     * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
1519
-     * @return EE_Form_Section_Base
1520
-     * @throws EE_Error
1521
-     */
1522
-    public function find_section_from_path($form_section_path)
1523
-    {
1524
-        // check if we can find the input from purely going straight up the tree
1525
-        $input = parent::find_section_from_path($form_section_path);
1526
-        if ($input instanceof EE_Form_Section_Base) {
1527
-            return $input;
1528
-        }
1529
-        $next_slash_pos = strpos($form_section_path, '/');
1530
-        if ($next_slash_pos !== false) {
1531
-            $child_section_name = substr($form_section_path, 0, $next_slash_pos);
1532
-            $subpath            = substr($form_section_path, $next_slash_pos + 1);
1533
-        } else {
1534
-            $child_section_name = $form_section_path;
1535
-            $subpath            = '';
1536
-        }
1537
-        $child_section = $this->get_subsection($child_section_name);
1538
-        if ($child_section instanceof EE_Form_Section_Base) {
1539
-            return $child_section->find_section_from_path($subpath);
1540
-        }
1541
-        return null;
1542
-    }
17
+	const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data';
18
+
19
+	/**
20
+	 * Subsections
21
+	 *
22
+	 * @var EE_Form_Section_Validatable[]
23
+	 */
24
+	protected $_subsections = array();
25
+
26
+	/**
27
+	 * Strategy for laying out the form
28
+	 *
29
+	 * @var EE_Form_Section_Layout_Base
30
+	 */
31
+	protected $_layout_strategy;
32
+
33
+	/**
34
+	 * Whether or not this form has received and validated a form submission yet
35
+	 *
36
+	 * @var boolean
37
+	 */
38
+	protected $_received_submission = false;
39
+
40
+	/**
41
+	 * message displayed to users upon successful form submission
42
+	 *
43
+	 * @var string
44
+	 */
45
+	protected $_form_submission_success_message = '';
46
+
47
+	/**
48
+	 * message displayed to users upon unsuccessful form submission
49
+	 *
50
+	 * @var string
51
+	 */
52
+	protected $_form_submission_error_message = '';
53
+
54
+	/**
55
+	 * @var array like $_REQUEST
56
+	 */
57
+	protected $cached_request_data;
58
+
59
+	/**
60
+	 * Stores whether this form (and its sub-sections) were found to be valid or not.
61
+	 * Starts off as null, but once the form is validated, it set to either true or false
62
+	 * @var boolean|null
63
+	 */
64
+	protected $is_valid;
65
+
66
+	/**
67
+	 * Stores all the data that will localized for form validation
68
+	 *
69
+	 * @var array
70
+	 */
71
+	protected static $_js_localization = array();
72
+
73
+	/**
74
+	 * whether or not the form's localized validation JS vars have been set
75
+	 *
76
+	 * @type boolean
77
+	 */
78
+	protected static $_scripts_localized = false;
79
+
80
+
81
+	/**
82
+	 * when constructing a proper form section, calls _construct_finalize on children
83
+	 * so that they know who their parent is, and what name they've been given.
84
+	 *
85
+	 * @param array[] $options_array   {
86
+	 * @type          $subsections     EE_Form_Section_Validatable[] where keys are the section's name
87
+	 * @type          $include         string[] numerically-indexed where values are section names to be included,
88
+	 *                                 and in that order. This is handy if you want
89
+	 *                                 the subsections to be ordered differently than the default, and if you override
90
+	 *                                 which fields are shown
91
+	 * @type          $exclude         string[] values are subsections to be excluded. This is handy if you want
92
+	 *                                 to remove certain default subsections (note: if you specify BOTH 'include' AND
93
+	 *                                 'exclude', the inclusions will be applied first, and the exclusions will exclude
94
+	 *                                 items from that list of inclusions)
95
+	 * @type          $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form
96
+	 *                                 } @see EE_Form_Section_Validatable::__construct()
97
+	 * @throws EE_Error
98
+	 */
99
+	public function __construct($options_array = array())
100
+	{
101
+		$options_array = (array) apply_filters(
102
+			'FHEE__EE_Form_Section_Proper___construct__options_array',
103
+			$options_array,
104
+			$this
105
+		);
106
+		// call parent first, as it may be setting the name
107
+		parent::__construct($options_array);
108
+		// if they've included subsections in the constructor, add them now
109
+		if (isset($options_array['include'])) {
110
+			// we are going to make sure we ONLY have those subsections to include
111
+			// AND we are going to make sure they're in that specified order
112
+			$reordered_subsections = array();
113
+			foreach ($options_array['include'] as $input_name) {
114
+				if (isset($this->_subsections[ $input_name ])) {
115
+					$reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
116
+				}
117
+			}
118
+			$this->_subsections = $reordered_subsections;
119
+		}
120
+		if (isset($options_array['exclude'])) {
121
+			$exclude            = $options_array['exclude'];
122
+			$this->_subsections = array_diff_key($this->_subsections, array_flip($exclude));
123
+		}
124
+		if (isset($options_array['layout_strategy'])) {
125
+			$this->_layout_strategy = $options_array['layout_strategy'];
126
+		}
127
+		if (! $this->_layout_strategy) {
128
+			$this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129
+		}
130
+		$this->_layout_strategy->_construct_finalize($this);
131
+		// ok so we are definitely going to want the forms JS,
132
+		// so enqueue it or remember to enqueue it during wp_enqueue_scripts
133
+		if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) {
134
+			// ok so they've constructed this object after when they should have.
135
+			// just enqueue the generic form scripts and initialize the form immediately in the JS
136
+			EE_Form_Section_Proper::wp_enqueue_scripts(true);
137
+		} else {
138
+			add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
139
+			add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
140
+		}
141
+		add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1);
142
+		/**
143
+		 * Gives other plugins a chance to hook in before construct finalize is called.
144
+		 * The form probably doesn't yet have a parent form section.
145
+		 * Since 4.9.32, when this action was introduced, this is the best place to add a subsection onto a form,
146
+		 * assuming you don't care what the form section's name, HTML ID, or HTML name etc are.
147
+		 * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end
148
+		 *
149
+		 * @since 4.9.32
150
+		 * @param EE_Form_Section_Proper $this          before __construct is done, but all of its logic,
151
+		 *                                              except maybe calling _construct_finalize has been done
152
+		 * @param array                  $options_array options passed into the constructor
153
+		 */
154
+		do_action(
155
+			'AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called',
156
+			$this,
157
+			$options_array
158
+		);
159
+		if (isset($options_array['name'])) {
160
+			$this->_construct_finalize(null, $options_array['name']);
161
+		}
162
+	}
163
+
164
+
165
+	/**
166
+	 * Finishes construction given the parent form section and this form section's name
167
+	 *
168
+	 * @param EE_Form_Section_Proper $parent_form_section
169
+	 * @param string                 $name
170
+	 * @throws EE_Error
171
+	 */
172
+	public function _construct_finalize($parent_form_section, $name)
173
+	{
174
+		parent::_construct_finalize($parent_form_section, $name);
175
+		$this->_set_default_name_if_empty();
176
+		$this->_set_default_html_id_if_empty();
177
+		foreach ($this->_subsections as $subsection_name => $subsection) {
178
+			if ($subsection instanceof EE_Form_Section_Base) {
179
+				$subsection->_construct_finalize($this, $subsection_name);
180
+			} else {
181
+				throw new EE_Error(
182
+					sprintf(
183
+						esc_html__(
184
+							'Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"',
185
+							'event_espresso'
186
+						),
187
+						$subsection_name,
188
+						get_class($this),
189
+						$subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
190
+					)
191
+				);
192
+			}
193
+		}
194
+		/**
195
+		 * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed.
196
+		 * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID
197
+		 * (or other attributes derived from the name like the HTML label id, etc), this is where it should be done.
198
+		 * This might only happen just before displaying the form, or just before it receives form submission data.
199
+		 * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've
200
+		 * ensured it has a name, HTML IDs, etc
201
+		 *
202
+		 * @param EE_Form_Section_Proper      $this
203
+		 * @param EE_Form_Section_Proper|null $parent_form_section
204
+		 * @param string                      $name
205
+		 */
206
+		do_action(
207
+			'AHEE__EE_Form_Section_Proper___construct_finalize__end',
208
+			$this,
209
+			$parent_form_section,
210
+			$name
211
+		);
212
+	}
213
+
214
+
215
+	/**
216
+	 * Gets the layout strategy for this form section
217
+	 *
218
+	 * @return EE_Form_Section_Layout_Base
219
+	 */
220
+	public function get_layout_strategy()
221
+	{
222
+		return $this->_layout_strategy;
223
+	}
224
+
225
+
226
+	/**
227
+	 * Gets the HTML for a single input for this form section according
228
+	 * to the layout strategy
229
+	 *
230
+	 * @param EE_Form_Input_Base $input
231
+	 * @return string
232
+	 */
233
+	public function get_html_for_input($input)
234
+	{
235
+		return $this->_layout_strategy->layout_input($input);
236
+	}
237
+
238
+
239
+	/**
240
+	 * was_submitted - checks if form inputs are present in request data
241
+	 * Basically an alias for form_data_present_in() (which is used by both
242
+	 * proper form sections and form inputs)
243
+	 *
244
+	 * @param null $form_data
245
+	 * @return boolean
246
+	 * @throws EE_Error
247
+	 */
248
+	public function was_submitted($form_data = null)
249
+	{
250
+		return $this->form_data_present_in($form_data);
251
+	}
252
+
253
+	/**
254
+	 * Gets the cached request data; but if there is none, or $req_data was set with
255
+	 * something different, refresh the cache, and then return it
256
+	 * @param null $req_data
257
+	 * @return array
258
+	 */
259
+	protected function getCachedRequest($req_data = null)
260
+	{
261
+		if (
262
+			$this->cached_request_data === null
263
+			|| (
264
+				$req_data !== null
265
+				&& $req_data !== $this->cached_request_data
266
+			)
267
+		) {
268
+			$req_data = apply_filters(
269
+				'FHEE__EE_Form_Section_Proper__receive_form_submission__req_data',
270
+				$req_data,
271
+				$this
272
+			);
273
+			if ($req_data === null) {
274
+				$req_data = array_merge($_GET, $_POST);
275
+			}
276
+			$req_data = apply_filters(
277
+				'FHEE__EE_Form_Section_Proper__receive_form_submission__request_data',
278
+				$req_data,
279
+				$this
280
+			);
281
+			$this->cached_request_data = (array) $req_data;
282
+		}
283
+		return $this->cached_request_data;
284
+	}
285
+
286
+
287
+	/**
288
+	 * After the form section is initially created, call this to sanitize the data in the submission
289
+	 * which relates to this form section, validate it, and set it as properties on the form.
290
+	 *
291
+	 * @param array|null $req_data should usually be $_POST (the default).
292
+	 *                             However, you CAN supply a different array.
293
+	 *                             Consider using set_defaults() instead however.
294
+	 *                             (If you rendered the form in the page using echo $form_x->get_html()
295
+	 *                             the inputs will have the correct name in the request data for this function
296
+	 *                             to find them and populate the form with them.
297
+	 *                             If you have a flat form (with only input subsections),
298
+	 *                             you can supply a flat array where keys
299
+	 *                             are the form input names and values are their values)
300
+	 * @param boolean    $validate whether or not to perform validation on this data. Default is,
301
+	 *                             of course, to validate that data, and set errors on the invalid values.
302
+	 *                             But if the data has already been validated
303
+	 *                             (eg you validated the data then stored it in the DB)
304
+	 *                             you may want to skip this step.
305
+	 * @throws InvalidArgumentException
306
+	 * @throws InvalidInterfaceException
307
+	 * @throws InvalidDataTypeException
308
+	 * @throws EE_Error
309
+	 */
310
+	public function receive_form_submission($req_data = null, $validate = true)
311
+	{
312
+		$req_data = $this->getCachedRequest($req_data);
313
+		$this->_normalize($req_data);
314
+		if ($validate) {
315
+			$this->_validate();
316
+			// if it's invalid, we're going to want to re-display so remember what they submitted
317
+			if (! $this->is_valid()) {
318
+				$this->store_submitted_form_data_in_session();
319
+			}
320
+		}
321
+		if ($this->submission_error_message() === '' && ! $this->is_valid()) {
322
+			$this->set_submission_error_message();
323
+		}
324
+		do_action(
325
+			'AHEE__EE_Form_Section_Proper__receive_form_submission__end',
326
+			$req_data,
327
+			$this,
328
+			$validate
329
+		);
330
+	}
331
+
332
+
333
+	/**
334
+	 * caches the originally submitted input values in the session
335
+	 * so that they can be used to repopulate the form if it failed validation
336
+	 *
337
+	 * @return boolean whether or not the data was successfully stored in the session
338
+	 * @throws InvalidArgumentException
339
+	 * @throws InvalidInterfaceException
340
+	 * @throws InvalidDataTypeException
341
+	 * @throws EE_Error
342
+	 */
343
+	protected function store_submitted_form_data_in_session()
344
+	{
345
+		return EE_Registry::instance()->SSN->set_session_data(
346
+			array(
347
+				EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true),
348
+			)
349
+		);
350
+	}
351
+
352
+
353
+	/**
354
+	 * retrieves the originally submitted input values in the session
355
+	 * so that they can be used to repopulate the form if it failed validation
356
+	 *
357
+	 * @return array
358
+	 * @throws InvalidArgumentException
359
+	 * @throws InvalidInterfaceException
360
+	 * @throws InvalidDataTypeException
361
+	 */
362
+	protected function get_submitted_form_data_from_session()
363
+	{
364
+		$session = EE_Registry::instance()->SSN;
365
+		if ($session instanceof EE_Session) {
366
+			return $session->get_session_data(
367
+				EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY
368
+			);
369
+		}
370
+		return array();
371
+	}
372
+
373
+
374
+	/**
375
+	 * flushed the originally submitted input values from the session
376
+	 *
377
+	 * @return boolean whether or not the data was successfully removed from the session
378
+	 * @throws InvalidArgumentException
379
+	 * @throws InvalidInterfaceException
380
+	 * @throws InvalidDataTypeException
381
+	 */
382
+	public static function flush_submitted_form_data_from_session()
383
+	{
384
+		return EE_Registry::instance()->SSN->reset_data(
385
+			array(EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY)
386
+		);
387
+	}
388
+
389
+
390
+	/**
391
+	 * Populates this form and its subsections with data from the session.
392
+	 * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows
393
+	 * validation errors when displaying too)
394
+	 * Returns true if the form was populated from the session, false otherwise
395
+	 *
396
+	 * @return boolean
397
+	 * @throws InvalidArgumentException
398
+	 * @throws InvalidInterfaceException
399
+	 * @throws InvalidDataTypeException
400
+	 * @throws EE_Error
401
+	 */
402
+	public function populate_from_session()
403
+	{
404
+		$form_data_in_session = $this->get_submitted_form_data_from_session();
405
+		if (empty($form_data_in_session)) {
406
+			return false;
407
+		}
408
+		$this->receive_form_submission($form_data_in_session);
409
+		add_action('shutdown', array('EE_Form_Section_Proper', 'flush_submitted_form_data_from_session'));
410
+		if ($this->form_data_present_in($form_data_in_session)) {
411
+			return true;
412
+		}
413
+		return false;
414
+	}
415
+
416
+
417
+	/**
418
+	 * Populates the default data for the form, given an array where keys are
419
+	 * the input names, and values are their values (preferably normalized to be their
420
+	 * proper PHP types, not all strings... although that should be ok too).
421
+	 * Proper subsections are sub-arrays, the key being the subsection's name, and
422
+	 * the value being an array formatted in teh same way
423
+	 *
424
+	 * @param array $default_data
425
+	 * @throws EE_Error
426
+	 */
427
+	public function populate_defaults($default_data)
428
+	{
429
+		foreach ($this->subsections(false) as $subsection_name => $subsection) {
430
+			if (isset($default_data[ $subsection_name ])) {
431
+				if ($subsection instanceof EE_Form_Input_Base) {
432
+					$subsection->set_default($default_data[ $subsection_name ]);
433
+				} elseif ($subsection instanceof EE_Form_Section_Proper) {
434
+					$subsection->populate_defaults($default_data[ $subsection_name ]);
435
+				}
436
+			}
437
+		}
438
+	}
439
+
440
+
441
+	/**
442
+	 * returns true if subsection exists
443
+	 *
444
+	 * @param string $name
445
+	 * @return boolean
446
+	 */
447
+	public function subsection_exists($name)
448
+	{
449
+		return isset($this->_subsections[ $name ]) ? true : false;
450
+	}
451
+
452
+
453
+	/**
454
+	 * Gets the subsection specified by its name
455
+	 *
456
+	 * @param string  $name
457
+	 * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE
458
+	 *                                                      so that the inputs will be properly configured.
459
+	 *                                                      However, some client code may be ok
460
+	 *                                                      with construction finalize being called later
461
+	 *                                                      (realizing that the subsections' html names
462
+	 *                                                      might not be set yet, etc.)
463
+	 * @return EE_Form_Section_Base
464
+	 * @throws EE_Error
465
+	 */
466
+	public function get_subsection($name, $require_construction_to_be_finalized = true)
467
+	{
468
+		if ($require_construction_to_be_finalized) {
469
+			$this->ensure_construct_finalized_called();
470
+		}
471
+		return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
472
+	}
473
+
474
+
475
+	/**
476
+	 * Gets all the validatable subsections of this form section
477
+	 *
478
+	 * @return EE_Form_Section_Validatable[]
479
+	 * @throws EE_Error
480
+	 */
481
+	public function get_validatable_subsections()
482
+	{
483
+		$validatable_subsections = array();
484
+		foreach ($this->subsections() as $name => $obj) {
485
+			if ($obj instanceof EE_Form_Section_Validatable) {
486
+				$validatable_subsections[ $name ] = $obj;
487
+			}
488
+		}
489
+		return $validatable_subsections;
490
+	}
491
+
492
+
493
+	/**
494
+	 * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child,
495
+	 * throw an EE_Error.
496
+	 *
497
+	 * @param string  $name
498
+	 * @param boolean $require_construction_to_be_finalized most client code should
499
+	 *                                                      leave this as TRUE so that the inputs will be properly
500
+	 *                                                      configured. However, some client code may be ok with
501
+	 *                                                      construction finalize being called later
502
+	 *                                                      (realizing that the subsections' html names might not be
503
+	 *                                                      set yet, etc.)
504
+	 * @return EE_Form_Input_Base
505
+	 * @throws EE_Error
506
+	 */
507
+	public function get_input($name, $require_construction_to_be_finalized = true)
508
+	{
509
+		$subsection = $this->get_subsection(
510
+			$name,
511
+			$require_construction_to_be_finalized
512
+		);
513
+		if (! $subsection instanceof EE_Form_Input_Base) {
514
+			throw new EE_Error(
515
+				sprintf(
516
+					esc_html__(
517
+						"Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'",
518
+						'event_espresso'
519
+					),
520
+					$name,
521
+					get_class($this),
522
+					$subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
523
+				)
524
+			);
525
+		}
526
+		return $subsection;
527
+	}
528
+
529
+
530
+	/**
531
+	 * Like get_input(), gets the proper subsection of the form given the name,
532
+	 * otherwise throws an EE_Error
533
+	 *
534
+	 * @param string  $name
535
+	 * @param boolean $require_construction_to_be_finalized most client code should
536
+	 *                                                      leave this as TRUE so that the inputs will be properly
537
+	 *                                                      configured. However, some client code may be ok with
538
+	 *                                                      construction finalize being called later
539
+	 *                                                      (realizing that the subsections' html names might not be
540
+	 *                                                      set yet, etc.)
541
+	 * @return EE_Form_Section_Proper
542
+	 * @throws EE_Error
543
+	 */
544
+	public function get_proper_subsection($name, $require_construction_to_be_finalized = true)
545
+	{
546
+		$subsection = $this->get_subsection(
547
+			$name,
548
+			$require_construction_to_be_finalized
549
+		);
550
+		if (! $subsection instanceof EE_Form_Section_Proper) {
551
+			throw new EE_Error(
552
+				sprintf(
553
+					esc_html__(
554
+						"Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'",
555
+						'event_espresso'
556
+					),
557
+					$name,
558
+					get_class($this)
559
+				)
560
+			);
561
+		}
562
+		return $subsection;
563
+	}
564
+
565
+
566
+	/**
567
+	 * Gets the value of the specified input. Should be called after receive_form_submission()
568
+	 * or populate_defaults() on the form, where the normalized value on the input is set.
569
+	 *
570
+	 * @param string $name
571
+	 * @return mixed depending on the input's type and its normalization strategy
572
+	 * @throws EE_Error
573
+	 */
574
+	public function get_input_value($name)
575
+	{
576
+		$input = $this->get_input($name);
577
+		return $input->normalized_value();
578
+	}
579
+
580
+
581
+	/**
582
+	 * Checks if this form section itself is valid, and then checks its subsections
583
+	 *
584
+	 * @throws EE_Error
585
+	 * @return boolean
586
+	 */
587
+	public function is_valid()
588
+	{
589
+		if ($this->is_valid === null) {
590
+			if (! $this->has_received_submission()) {
591
+				throw new EE_Error(
592
+					sprintf(
593
+						esc_html__(
594
+							'You cannot check if a form is valid before receiving the form submission using receive_form_submission',
595
+							'event_espresso'
596
+						)
597
+					)
598
+				);
599
+			}
600
+			if (! parent::is_valid()) {
601
+				$this->is_valid = false;
602
+			} else {
603
+				// ok so no general errors to this entire form section.
604
+				// so let's check the subsections, but only set errors if that hasn't been done yet
605
+				$this->is_valid = true;
606
+				foreach ($this->get_validatable_subsections() as $subsection) {
607
+					if (! $subsection->is_valid()) {
608
+						$this->is_valid = false;
609
+					}
610
+				}
611
+			}
612
+		}
613
+		return $this->is_valid;
614
+	}
615
+
616
+
617
+	/**
618
+	 * gets the default name of this form section if none is specified
619
+	 *
620
+	 * @return void
621
+	 */
622
+	protected function _set_default_name_if_empty()
623
+	{
624
+		if (! $this->_name) {
625
+			$classname    = get_class($this);
626
+			$default_name = str_replace('EE_', '', $classname);
627
+			$this->_name  = $default_name;
628
+		}
629
+	}
630
+
631
+
632
+	/**
633
+	 * Returns the HTML for the form, except for the form opening and closing tags
634
+	 * (as the form section doesn't know where you necessarily want to send the information to),
635
+	 * and except for a submit button. Enqueues JS and CSS; if called early enough we will
636
+	 * try to enqueue them in the header, otherwise they'll be enqueued in the footer.
637
+	 * Not doing_it_wrong because theoretically this CAN be used properly,
638
+	 * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue
639
+	 * any CSS.
640
+	 *
641
+	 * @throws InvalidArgumentException
642
+	 * @throws InvalidInterfaceException
643
+	 * @throws InvalidDataTypeException
644
+	 * @throws EE_Error
645
+	 */
646
+	public function get_html_and_js()
647
+	{
648
+		$this->enqueue_js();
649
+		return $this->get_html();
650
+	}
651
+
652
+
653
+	/**
654
+	 * returns HTML for displaying this form section. recursively calls display_section() on all subsections
655
+	 *
656
+	 * @param bool $display_previously_submitted_data
657
+	 * @return string
658
+	 * @throws InvalidArgumentException
659
+	 * @throws InvalidInterfaceException
660
+	 * @throws InvalidDataTypeException
661
+	 * @throws EE_Error
662
+	 * @throws EE_Error
663
+	 * @throws EE_Error
664
+	 */
665
+	public function get_html($display_previously_submitted_data = true)
666
+	{
667
+		$this->ensure_construct_finalized_called();
668
+		if ($display_previously_submitted_data) {
669
+			$this->populate_from_session();
670
+		}
671
+		return $this->_form_html_filter
672
+			? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this)
673
+			: $this->_layout_strategy->layout_form();
674
+	}
675
+
676
+
677
+	/**
678
+	 * enqueues JS and CSS for the form.
679
+	 * It is preferred to call this before wp_enqueue_scripts so the
680
+	 * scripts and styles can be put in the header, but if called later
681
+	 * they will be put in the footer (which is OK for JS, but in HTML4 CSS should
682
+	 * only be in the header; but in HTML5 its ok in the body.
683
+	 * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag.
684
+	 * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.)
685
+	 *
686
+	 * @return void
687
+	 * @throws EE_Error
688
+	 */
689
+	public function enqueue_js()
690
+	{
691
+		$this->_enqueue_and_localize_form_js();
692
+		foreach ($this->subsections() as $subsection) {
693
+			$subsection->enqueue_js();
694
+		}
695
+	}
696
+
697
+
698
+	/**
699
+	 * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts().
700
+	 * This must be done BEFORE wp_enqueue_scripts() gets called, which is on
701
+	 * the wp_enqueue_scripts hook.
702
+	 * However, registering the form js and localizing it can happen when we
703
+	 * actually output the form (which is preferred, seeing how teh form's fields
704
+	 * could change until it's actually outputted)
705
+	 *
706
+	 * @param boolean $init_form_validation_automatically whether or not we want the form validation
707
+	 *                                                    to be triggered automatically or not
708
+	 * @return void
709
+	 */
710
+	public static function wp_enqueue_scripts($init_form_validation_automatically = true)
711
+	{
712
+		wp_register_script(
713
+			'ee_form_section_validation',
714
+			EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
715
+			array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
716
+			EVENT_ESPRESSO_VERSION,
717
+			true
718
+		);
719
+		wp_localize_script(
720
+			'ee_form_section_validation',
721
+			'ee_form_section_validation_init',
722
+			array('init' => $init_form_validation_automatically ? '1' : '0')
723
+		);
724
+	}
725
+
726
+
727
+	/**
728
+	 * gets the variables used by form_section_validation.js.
729
+	 * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script,
730
+	 * but before the wordpress hook wp_loaded
731
+	 *
732
+	 * @throws EE_Error
733
+	 */
734
+	public function _enqueue_and_localize_form_js()
735
+	{
736
+		$this->ensure_construct_finalized_called();
737
+		// actually, we don't want to localize just yet. There may be other forms on the page.
738
+		// so we need to add our form section data to a static variable accessible by all form sections
739
+		// and localize it just before the footer
740
+		$this->localize_validation_rules();
741
+		add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2);
742
+		add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'));
743
+	}
744
+
745
+
746
+	/**
747
+	 * add our form section data to a static variable accessible by all form sections
748
+	 *
749
+	 * @param bool $return_for_subsection
750
+	 * @return void
751
+	 * @throws EE_Error
752
+	 */
753
+	public function localize_validation_rules($return_for_subsection = false)
754
+	{
755
+		// we only want to localize vars ONCE for the entire form,
756
+		// so if the form section doesn't have a parent, then it must be the top dog
757
+		if ($return_for_subsection || ! $this->parent_section()) {
758
+			EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
759
+				'form_section_id'  => $this->html_id(true),
760
+				'validation_rules' => $this->get_jquery_validation_rules(),
761
+				'other_data'       => $this->get_other_js_data(),
762
+				'errors'           => $this->subsection_validation_errors_by_html_name(),
763
+			);
764
+			EE_Form_Section_Proper::$_scripts_localized                                = true;
765
+		}
766
+	}
767
+
768
+
769
+	/**
770
+	 * Gets an array of extra data that will be useful for client-side javascript.
771
+	 * This is primarily data added by inputs and forms in addition to any
772
+	 * scripts they might enqueue
773
+	 *
774
+	 * @param array $form_other_js_data
775
+	 * @return array
776
+	 * @throws EE_Error
777
+	 */
778
+	public function get_other_js_data($form_other_js_data = array())
779
+	{
780
+		foreach ($this->subsections() as $subsection) {
781
+			$form_other_js_data = $subsection->get_other_js_data($form_other_js_data);
782
+		}
783
+		return $form_other_js_data;
784
+	}
785
+
786
+
787
+	/**
788
+	 * Gets a flat array of inputs for this form section and its subsections.
789
+	 * Keys are their form names, and values are the inputs themselves
790
+	 *
791
+	 * @return EE_Form_Input_Base
792
+	 * @throws EE_Error
793
+	 */
794
+	public function inputs_in_subsections()
795
+	{
796
+		$inputs = array();
797
+		foreach ($this->subsections() as $subsection) {
798
+			if ($subsection instanceof EE_Form_Input_Base) {
799
+				$inputs[ $subsection->html_name() ] = $subsection;
800
+			} elseif ($subsection instanceof EE_Form_Section_Proper) {
801
+				$inputs += $subsection->inputs_in_subsections();
802
+			}
803
+		}
804
+		return $inputs;
805
+	}
806
+
807
+
808
+	/**
809
+	 * Gets a flat array of all the validation errors.
810
+	 * Keys are html names (because those should be unique)
811
+	 * and values are a string of all their validation errors
812
+	 *
813
+	 * @return string[]
814
+	 * @throws EE_Error
815
+	 */
816
+	public function subsection_validation_errors_by_html_name()
817
+	{
818
+		$inputs = $this->inputs();
819
+		$errors = array();
820
+		foreach ($inputs as $form_input) {
821
+			if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
822
+				$errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
823
+			}
824
+		}
825
+		return $errors;
826
+	}
827
+
828
+
829
+	/**
830
+	 * passes all the form data required by the JS to the JS, and enqueues the few required JS files.
831
+	 * Should be setup by each form during the _enqueues_and_localize_form_js
832
+	 *
833
+	 * @throws InvalidArgumentException
834
+	 * @throws InvalidInterfaceException
835
+	 * @throws InvalidDataTypeException
836
+	 */
837
+	public static function localize_script_for_all_forms()
838
+	{
839
+		// allow inputs and stuff to hook in their JS and stuff here
840
+		do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin');
841
+		EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages();
842
+		$email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
843
+			? EE_Registry::instance()->CFG->registration->email_validation_level
844
+			: 'wp_default';
845
+		EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
846
+		wp_enqueue_script('ee_form_section_validation');
847
+		wp_localize_script(
848
+			'ee_form_section_validation',
849
+			'ee_form_section_vars',
850
+			EE_Form_Section_Proper::$_js_localization
851
+		);
852
+	}
853
+
854
+
855
+	/**
856
+	 * ensure_scripts_localized
857
+	 *
858
+	 * @throws EE_Error
859
+	 */
860
+	public function ensure_scripts_localized()
861
+	{
862
+		if (! EE_Form_Section_Proper::$_scripts_localized) {
863
+			$this->_enqueue_and_localize_form_js();
864
+		}
865
+	}
866
+
867
+
868
+	/**
869
+	 * Gets the hard-coded validation error messages to be used in the JS. The convention
870
+	 * is that the key here should be the same as the custom validation rule put in the JS file
871
+	 *
872
+	 * @return array keys are custom validation rules, and values are internationalized strings
873
+	 */
874
+	private static function _get_localized_error_messages()
875
+	{
876
+		return array(
877
+			'validUrl' => esc_html__('This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg', 'event_espresso'),
878
+			'regex'    => esc_html__('Please check your input', 'event_espresso'),
879
+		);
880
+	}
881
+
882
+
883
+	/**
884
+	 * @return array
885
+	 */
886
+	public static function js_localization()
887
+	{
888
+		return self::$_js_localization;
889
+	}
890
+
891
+
892
+	/**
893
+	 * @return void
894
+	 */
895
+	public static function reset_js_localization()
896
+	{
897
+		self::$_js_localization = array();
898
+	}
899
+
900
+
901
+	/**
902
+	 * Gets the JS to put inside the jquery validation rules for subsection of this form section.
903
+	 * See parent function for more...
904
+	 *
905
+	 * @return array
906
+	 * @throws EE_Error
907
+	 */
908
+	public function get_jquery_validation_rules()
909
+	{
910
+		$jquery_validation_rules = array();
911
+		foreach ($this->get_validatable_subsections() as $subsection) {
912
+			$jquery_validation_rules = array_merge(
913
+				$jquery_validation_rules,
914
+				$subsection->get_jquery_validation_rules()
915
+			);
916
+		}
917
+		return $jquery_validation_rules;
918
+	}
919
+
920
+
921
+	/**
922
+	 * Sanitizes all the data and sets the sanitized value of each field
923
+	 *
924
+	 * @param array $req_data like $_POST
925
+	 * @return void
926
+	 * @throws EE_Error
927
+	 */
928
+	protected function _normalize($req_data)
929
+	{
930
+		$this->_received_submission = true;
931
+		$this->_validation_errors   = array();
932
+		foreach ($this->get_validatable_subsections() as $subsection) {
933
+			try {
934
+				$subsection->_normalize($req_data);
935
+			} catch (EE_Validation_Error $e) {
936
+				$subsection->add_validation_error($e);
937
+			}
938
+		}
939
+	}
940
+
941
+
942
+	/**
943
+	 * Performs validation on this form section and its subsections.
944
+	 * For each subsection,
945
+	 * calls _validate_{subsection_name} on THIS form (if the function exists)
946
+	 * and passes it the subsection, then calls _validate on that subsection.
947
+	 * If you need to perform validation on the form as a whole (considering multiple)
948
+	 * you would be best to override this _validate method,
949
+	 * calling parent::_validate() first.
950
+	 *
951
+	 * @throws EE_Error
952
+	 */
953
+	protected function _validate()
954
+	{
955
+		// reset the cache of whether this form is valid or not- we're re-validating it now
956
+		$this->is_valid = null;
957
+		foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
958
+			if (method_exists($this, '_validate_' . $subsection_name)) {
959
+				call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
960
+			}
961
+			$subsection->_validate();
962
+		}
963
+	}
964
+
965
+
966
+	/**
967
+	 * Gets all the validated inputs for the form section
968
+	 *
969
+	 * @return array
970
+	 * @throws EE_Error
971
+	 */
972
+	public function valid_data()
973
+	{
974
+		$inputs = array();
975
+		foreach ($this->subsections() as $subsection_name => $subsection) {
976
+			if ($subsection instanceof EE_Form_Section_Proper) {
977
+				$inputs[ $subsection_name ] = $subsection->valid_data();
978
+			} elseif ($subsection instanceof EE_Form_Input_Base) {
979
+				$inputs[ $subsection_name ] = $subsection->normalized_value();
980
+			}
981
+		}
982
+		return $inputs;
983
+	}
984
+
985
+
986
+	/**
987
+	 * Gets all the inputs on this form section
988
+	 *
989
+	 * @return EE_Form_Input_Base[]
990
+	 * @throws EE_Error
991
+	 */
992
+	public function inputs()
993
+	{
994
+		$inputs = array();
995
+		foreach ($this->subsections() as $subsection_name => $subsection) {
996
+			if ($subsection instanceof EE_Form_Input_Base) {
997
+				$inputs[ $subsection_name ] = $subsection;
998
+			}
999
+		}
1000
+		return $inputs;
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * Gets all the subsections which are a proper form
1006
+	 *
1007
+	 * @return EE_Form_Section_Proper[]
1008
+	 * @throws EE_Error
1009
+	 */
1010
+	public function subforms()
1011
+	{
1012
+		$form_sections = array();
1013
+		foreach ($this->subsections() as $name => $obj) {
1014
+			if ($obj instanceof EE_Form_Section_Proper) {
1015
+				$form_sections[ $name ] = $obj;
1016
+			}
1017
+		}
1018
+		return $form_sections;
1019
+	}
1020
+
1021
+
1022
+	/**
1023
+	 * Gets all the subsections (inputs, proper subsections, or html-only sections).
1024
+	 * Consider using inputs() or subforms()
1025
+	 * if you only want form inputs or proper form sections.
1026
+	 *
1027
+	 * @param boolean $require_construction_to_be_finalized most client code should
1028
+	 *                                                      leave this as TRUE so that the inputs will be properly
1029
+	 *                                                      configured. However, some client code may be ok with
1030
+	 *                                                      construction finalize being called later
1031
+	 *                                                      (realizing that the subsections' html names might not be
1032
+	 *                                                      set yet, etc.)
1033
+	 * @return EE_Form_Section_Proper[]
1034
+	 * @throws EE_Error
1035
+	 */
1036
+	public function subsections($require_construction_to_be_finalized = true)
1037
+	{
1038
+		if ($require_construction_to_be_finalized) {
1039
+			$this->ensure_construct_finalized_called();
1040
+		}
1041
+		return $this->_subsections;
1042
+	}
1043
+
1044
+
1045
+	/**
1046
+	 * Returns whether this form has any subforms or inputs
1047
+	 * @return bool
1048
+	 */
1049
+	public function hasSubsections()
1050
+	{
1051
+		return ! empty($this->_subsections);
1052
+	}
1053
+
1054
+
1055
+	/**
1056
+	 * Returns a simple array where keys are input names, and values are their normalized
1057
+	 * values. (Similar to calling get_input_value on inputs)
1058
+	 *
1059
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1060
+	 *                                        or just this forms' direct children inputs
1061
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1062
+	 *                                        or allow multidimensional array
1063
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array
1064
+	 *                                        with array keys being input names
1065
+	 *                                        (regardless of whether they are from a subsection or not),
1066
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1067
+	 *                                        where keys are always subsection names and values are either
1068
+	 *                                        the input's normalized value, or an array like the top-level array
1069
+	 * @throws EE_Error
1070
+	 */
1071
+	public function input_values($include_subform_inputs = false, $flatten = false)
1072
+	{
1073
+		return $this->_input_values(false, $include_subform_inputs, $flatten);
1074
+	}
1075
+
1076
+
1077
+	/**
1078
+	 * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value'
1079
+	 * of each input. On some inputs (especially radio boxes or checkboxes), the value stored
1080
+	 * is not necessarily the value we want to display to users. This creates an array
1081
+	 * where keys are the input names, and values are their display values
1082
+	 *
1083
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1084
+	 *                                        or just this forms' direct children inputs
1085
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1086
+	 *                                        or allow multidimensional array
1087
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array
1088
+	 *                                        with array keys being input names
1089
+	 *                                        (regardless of whether they are from a subsection or not),
1090
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1091
+	 *                                        where keys are always subsection names and values are either
1092
+	 *                                        the input's normalized value, or an array like the top-level array
1093
+	 * @throws EE_Error
1094
+	 */
1095
+	public function input_pretty_values($include_subform_inputs = false, $flatten = false)
1096
+	{
1097
+		return $this->_input_values(true, $include_subform_inputs, $flatten);
1098
+	}
1099
+
1100
+
1101
+	/**
1102
+	 * Gets the input values from the form
1103
+	 *
1104
+	 * @param boolean $pretty                 Whether to retrieve the pretty value,
1105
+	 *                                        or just the normalized value
1106
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1107
+	 *                                        or just this forms' direct children inputs
1108
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1109
+	 *                                        or allow multidimensional array
1110
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being
1111
+	 *                                        input names (regardless of whether they are from a subsection or not),
1112
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1113
+	 *                                        where keys are always subsection names and values are either
1114
+	 *                                        the input's normalized value, or an array like the top-level array
1115
+	 * @throws EE_Error
1116
+	 */
1117
+	public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false)
1118
+	{
1119
+		$input_values = array();
1120
+		foreach ($this->subsections() as $subsection_name => $subsection) {
1121
+			if ($subsection instanceof EE_Form_Input_Base) {
1122
+				$input_values[ $subsection_name ] = $pretty
1123
+					? $subsection->pretty_value()
1124
+					: $subsection->normalized_value();
1125
+			} elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
1126
+				$subform_input_values = $subsection->_input_values(
1127
+					$pretty,
1128
+					$include_subform_inputs,
1129
+					$flatten
1130
+				);
1131
+				if ($flatten) {
1132
+					$input_values = array_merge($input_values, $subform_input_values);
1133
+				} else {
1134
+					$input_values[ $subsection_name ] = $subform_input_values;
1135
+				}
1136
+			}
1137
+		}
1138
+		return $input_values;
1139
+	}
1140
+
1141
+
1142
+	/**
1143
+	 * Gets the originally submitted input values from the form
1144
+	 *
1145
+	 * @param boolean $include_subforms  Whether to include inputs from subforms,
1146
+	 *                                   or just this forms' direct children inputs
1147
+	 * @return array                     if $flatten is TRUE it will always be a 1-dimensional array
1148
+	 *                                   with array keys being input names
1149
+	 *                                   (regardless of whether they are from a subsection or not),
1150
+	 *                                   and if $flatten is FALSE it can be a multidimensional array
1151
+	 *                                   where keys are always subsection names and values are either
1152
+	 *                                   the input's normalized value, or an array like the top-level array
1153
+	 * @throws EE_Error
1154
+	 */
1155
+	public function submitted_values($include_subforms = false)
1156
+	{
1157
+		$submitted_values = array();
1158
+		foreach ($this->subsections() as $subsection) {
1159
+			if ($subsection instanceof EE_Form_Input_Base) {
1160
+				// is this input part of an array of inputs?
1161
+				if (strpos($subsection->html_name(), '[') !== false) {
1162
+					$full_input_name  = EEH_Array::convert_array_values_to_keys(
1163
+						explode(
1164
+							'[',
1165
+							str_replace(']', '', $subsection->html_name())
1166
+						),
1167
+						$subsection->raw_value()
1168
+					);
1169
+					$submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1170
+				} else {
1171
+					$submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1172
+				}
1173
+			} elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1174
+				$subform_input_values = $subsection->submitted_values($include_subforms);
1175
+				$submitted_values     = array_replace_recursive($submitted_values, $subform_input_values);
1176
+			}
1177
+		}
1178
+		return $submitted_values;
1179
+	}
1180
+
1181
+
1182
+	/**
1183
+	 * Indicates whether or not this form has received a submission yet
1184
+	 * (ie, had receive_form_submission called on it yet)
1185
+	 *
1186
+	 * @return boolean
1187
+	 * @throws EE_Error
1188
+	 */
1189
+	public function has_received_submission()
1190
+	{
1191
+		$this->ensure_construct_finalized_called();
1192
+		return $this->_received_submission;
1193
+	}
1194
+
1195
+
1196
+	/**
1197
+	 * Equivalent to passing 'exclude' in the constructor's options array.
1198
+	 * Removes the listed inputs from the form
1199
+	 *
1200
+	 * @param array $inputs_to_exclude values are the input names
1201
+	 * @return void
1202
+	 */
1203
+	public function exclude(array $inputs_to_exclude = array())
1204
+	{
1205
+		foreach ($inputs_to_exclude as $input_to_exclude_name) {
1206
+			unset($this->_subsections[ $input_to_exclude_name ]);
1207
+		}
1208
+	}
1209
+
1210
+
1211
+	/**
1212
+	 * Changes these inputs' display strategy to be EE_Hidden_Display_Strategy.
1213
+	 * @param array $inputs_to_hide
1214
+	 * @throws EE_Error
1215
+	 */
1216
+	public function hide(array $inputs_to_hide = array())
1217
+	{
1218
+		foreach ($inputs_to_hide as $input_to_hide) {
1219
+			$input = $this->get_input($input_to_hide);
1220
+			$input->set_display_strategy(new EE_Hidden_Display_Strategy());
1221
+		}
1222
+	}
1223
+
1224
+
1225
+	/**
1226
+	 * add_subsections
1227
+	 * Adds the listed subsections to the form section.
1228
+	 * If $subsection_name_to_target is provided,
1229
+	 * then new subsections are added before or after that subsection,
1230
+	 * otherwise to the start or end of the entire subsections array.
1231
+	 *
1232
+	 * @param EE_Form_Section_Base[] $new_subsections           array of new form subsections
1233
+	 *                                                          where keys are their names
1234
+	 * @param string                 $subsection_name_to_target an existing for section that $new_subsections
1235
+	 *                                                          should be added before or after
1236
+	 *                                                          IF $subsection_name_to_target is null,
1237
+	 *                                                          then $new_subsections will be added to
1238
+	 *                                                          the beginning or end of the entire subsections array
1239
+	 * @param boolean                $add_before                whether to add $new_subsections, before or after
1240
+	 *                                                          $subsection_name_to_target,
1241
+	 *                                                          or if $subsection_name_to_target is null,
1242
+	 *                                                          before or after entire subsections array
1243
+	 * @return void
1244
+	 * @throws EE_Error
1245
+	 */
1246
+	public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1247
+	{
1248
+		foreach ($new_subsections as $subsection_name => $subsection) {
1249
+			if (! $subsection instanceof EE_Form_Section_Base) {
1250
+				EE_Error::add_error(
1251
+					sprintf(
1252
+						esc_html__(
1253
+							"Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.",
1254
+							'event_espresso'
1255
+						),
1256
+						get_class($subsection),
1257
+						$subsection_name,
1258
+						$this->name()
1259
+					)
1260
+				);
1261
+				unset($new_subsections[ $subsection_name ]);
1262
+			}
1263
+		}
1264
+		$this->_subsections = EEH_Array::insert_into_array(
1265
+			$this->_subsections,
1266
+			$new_subsections,
1267
+			$subsection_name_to_target,
1268
+			$add_before
1269
+		);
1270
+		if ($this->_construction_finalized) {
1271
+			foreach ($this->_subsections as $name => $subsection) {
1272
+				$subsection->_construct_finalize($this, $name);
1273
+			}
1274
+		}
1275
+	}
1276
+
1277
+
1278
+	/**
1279
+	 * @param string $subsection_name
1280
+	 * @param bool   $recursive
1281
+	 * @return bool
1282
+	 */
1283
+	public function has_subsection($subsection_name, $recursive = false)
1284
+	{
1285
+		foreach ($this->_subsections as $name => $subsection) {
1286
+			if (
1287
+				$name === $subsection_name
1288
+				|| (
1289
+					$recursive
1290
+					&& $subsection instanceof EE_Form_Section_Proper
1291
+					&& $subsection->has_subsection($subsection_name, $recursive)
1292
+				)
1293
+			) {
1294
+				return true;
1295
+			}
1296
+		}
1297
+		return false;
1298
+	}
1299
+
1300
+
1301
+
1302
+	/**
1303
+	 * Just gets all validatable subsections to clean their sensitive data
1304
+	 *
1305
+	 * @throws EE_Error
1306
+	 */
1307
+	public function clean_sensitive_data()
1308
+	{
1309
+		foreach ($this->get_validatable_subsections() as $subsection) {
1310
+			$subsection->clean_sensitive_data();
1311
+		}
1312
+	}
1313
+
1314
+
1315
+	/**
1316
+	 * Sets the submission error message (aka validation error message for this form section and all sub-sections)
1317
+	 * @param string                           $form_submission_error_message
1318
+	 * @param EE_Form_Section_Validatable $form_section unused
1319
+	 * @throws EE_Error
1320
+	 */
1321
+	public function set_submission_error_message(
1322
+		$form_submission_error_message = ''
1323
+	) {
1324
+		$this->_form_submission_error_message = ! empty($form_submission_error_message)
1325
+			? $form_submission_error_message
1326
+			: $this->getAllValidationErrorsString();
1327
+	}
1328
+
1329
+
1330
+	/**
1331
+	 * Returns the cached error message. A default value is set for this during _validate(),
1332
+	 * (called during receive_form_submission) but it can be explicitly set using
1333
+	 * set_submission_error_message
1334
+	 *
1335
+	 * @return string
1336
+	 */
1337
+	public function submission_error_message()
1338
+	{
1339
+		return $this->_form_submission_error_message;
1340
+	}
1341
+
1342
+
1343
+	/**
1344
+	 * Sets a message to display if the data submitted to the form was valid.
1345
+	 * @param string $form_submission_success_message
1346
+	 */
1347
+	public function set_submission_success_message($form_submission_success_message = '')
1348
+	{
1349
+		$this->_form_submission_success_message = ! empty($form_submission_success_message)
1350
+			? $form_submission_success_message
1351
+			: esc_html__('Form submitted successfully', 'event_espresso');
1352
+	}
1353
+
1354
+
1355
+	/**
1356
+	 * Gets a message appropriate for display when the form is correctly submitted
1357
+	 * @return string
1358
+	 */
1359
+	public function submission_success_message()
1360
+	{
1361
+		return $this->_form_submission_success_message;
1362
+	}
1363
+
1364
+
1365
+	/**
1366
+	 * Returns the prefix that should be used on child of this form section for
1367
+	 * their html names. If this form section itself has a parent, prepends ITS
1368
+	 * prefix onto this form section's prefix. Used primarily by
1369
+	 * EE_Form_Input_Base::_set_default_html_name_if_empty
1370
+	 *
1371
+	 * @return string
1372
+	 * @throws EE_Error
1373
+	 */
1374
+	public function html_name_prefix()
1375
+	{
1376
+		if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1377
+			return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1378
+		}
1379
+		return $this->name();
1380
+	}
1381
+
1382
+
1383
+	/**
1384
+	 * Gets the name, but first checks _construct_finalize has been called. If not,
1385
+	 * calls it (assumes there is no parent and that we want the name to be whatever
1386
+	 * was set, which is probably nothing, or the classname)
1387
+	 *
1388
+	 * @return string
1389
+	 * @throws EE_Error
1390
+	 */
1391
+	public function name()
1392
+	{
1393
+		$this->ensure_construct_finalized_called();
1394
+		return parent::name();
1395
+	}
1396
+
1397
+
1398
+	/**
1399
+	 * @return EE_Form_Section_Proper
1400
+	 * @throws EE_Error
1401
+	 */
1402
+	public function parent_section()
1403
+	{
1404
+		$this->ensure_construct_finalized_called();
1405
+		return parent::parent_section();
1406
+	}
1407
+
1408
+
1409
+	/**
1410
+	 * make sure construction finalized was called, otherwise children might not be ready
1411
+	 *
1412
+	 * @return void
1413
+	 * @throws EE_Error
1414
+	 */
1415
+	public function ensure_construct_finalized_called()
1416
+	{
1417
+		if (! $this->_construction_finalized) {
1418
+			$this->_construct_finalize($this->_parent_section, $this->_name);
1419
+		}
1420
+	}
1421
+
1422
+
1423
+	/**
1424
+	 * Checks if any of this form section's inputs, or any of its children's inputs,
1425
+	 * are in teh form data. If any are found, returns true. Else false
1426
+	 *
1427
+	 * @param array $req_data
1428
+	 * @return boolean
1429
+	 * @throws EE_Error
1430
+	 */
1431
+	public function form_data_present_in($req_data = null)
1432
+	{
1433
+		$req_data = $this->getCachedRequest($req_data);
1434
+		foreach ($this->subsections() as $subsection) {
1435
+			if ($subsection instanceof EE_Form_Input_Base) {
1436
+				if ($subsection->form_data_present_in($req_data)) {
1437
+					return true;
1438
+				}
1439
+			} elseif ($subsection instanceof EE_Form_Section_Proper) {
1440
+				if ($subsection->form_data_present_in($req_data)) {
1441
+					return true;
1442
+				}
1443
+			}
1444
+		}
1445
+		return false;
1446
+	}
1447
+
1448
+
1449
+	/**
1450
+	 * Gets validation errors for this form section and subsections
1451
+	 * Similar to EE_Form_Section_Validatable::get_validation_errors() except this
1452
+	 * gets the validation errors for ALL subsection
1453
+	 *
1454
+	 * @return EE_Validation_Error[]
1455
+	 * @throws EE_Error
1456
+	 */
1457
+	public function get_validation_errors_accumulated()
1458
+	{
1459
+		$validation_errors = $this->get_validation_errors();
1460
+		foreach ($this->get_validatable_subsections() as $subsection) {
1461
+			if ($subsection instanceof EE_Form_Section_Proper) {
1462
+				$validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated();
1463
+			} else {
1464
+				$validation_errors_on_this_subsection = $subsection->get_validation_errors();
1465
+			}
1466
+			if ($validation_errors_on_this_subsection) {
1467
+				$validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection);
1468
+			}
1469
+		}
1470
+		return $validation_errors;
1471
+	}
1472
+
1473
+	/**
1474
+	 * Fetch validation errors from children and grandchildren and puts them in a single string.
1475
+	 * This traverses the form section tree to generate this, but you probably want to instead use
1476
+	 * get_form_submission_error_message() which is usually this message cached (or a custom validation error message)
1477
+	 *
1478
+	 * @return string
1479
+	 * @since 4.9.59.p
1480
+	 */
1481
+	protected function getAllValidationErrorsString()
1482
+	{
1483
+		$submission_error_messages = array();
1484
+		// bad, bad, bad registrant
1485
+		foreach ($this->get_validation_errors_accumulated() as $validation_error) {
1486
+			if ($validation_error instanceof EE_Validation_Error) {
1487
+				$form_section = $validation_error->get_form_section();
1488
+				if ($form_section instanceof EE_Form_Input_Base) {
1489
+					$label = $validation_error->get_form_section()->html_label_text();
1490
+				} elseif ($form_section instanceof EE_Form_Section_Validatable) {
1491
+					$label = $validation_error->get_form_section()->name();
1492
+				} else {
1493
+					$label = esc_html__('Unknown', 'event_espresso');
1494
+				}
1495
+				$submission_error_messages[] = sprintf(
1496
+					__('%s : %s', 'event_espresso'),
1497
+					$label,
1498
+					$validation_error->getMessage()
1499
+				);
1500
+			}
1501
+		}
1502
+		return implode('<br>', $submission_error_messages);
1503
+	}
1504
+
1505
+
1506
+	/**
1507
+	 * This isn't just the name of an input, it's a path pointing to an input. The
1508
+	 * path is similar to a folder path: slash (/) means to descend into a subsection,
1509
+	 * dot-dot-slash (../) means to ascend into the parent section.
1510
+	 * After a series of slashes and dot-dot-slashes, there should be the name of an input,
1511
+	 * which will be returned.
1512
+	 * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
1513
+	 * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
1514
+	 * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
1515
+	 * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
1516
+	 * Etc
1517
+	 *
1518
+	 * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
1519
+	 * @return EE_Form_Section_Base
1520
+	 * @throws EE_Error
1521
+	 */
1522
+	public function find_section_from_path($form_section_path)
1523
+	{
1524
+		// check if we can find the input from purely going straight up the tree
1525
+		$input = parent::find_section_from_path($form_section_path);
1526
+		if ($input instanceof EE_Form_Section_Base) {
1527
+			return $input;
1528
+		}
1529
+		$next_slash_pos = strpos($form_section_path, '/');
1530
+		if ($next_slash_pos !== false) {
1531
+			$child_section_name = substr($form_section_path, 0, $next_slash_pos);
1532
+			$subpath            = substr($form_section_path, $next_slash_pos + 1);
1533
+		} else {
1534
+			$child_section_name = $form_section_path;
1535
+			$subpath            = '';
1536
+		}
1537
+		$child_section = $this->get_subsection($child_section_name);
1538
+		if ($child_section instanceof EE_Form_Section_Base) {
1539
+			return $child_section->find_section_from_path($subpath);
1540
+		}
1541
+		return null;
1542
+	}
1543 1543
 }
Please login to merge, or discard this patch.
core/EE_Session.core.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
     /**
543 543
      * @initiate session
544 544
      * @access   private
545
-     * @return TRUE on success, FALSE on fail
545
+     * @return boolean on success, FALSE on fail
546 546
      * @throws EE_Error
547 547
      * @throws InvalidArgumentException
548 548
      * @throws InvalidDataTypeException
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
      * @update session data  prior to saving to the db
779 779
      * @access public
780 780
      * @param bool $new_session
781
-     * @return TRUE on success, FALSE on fail
781
+     * @return boolean on success, FALSE on fail
782 782
      * @throws EE_Error
783 783
      * @throws InvalidArgumentException
784 784
      * @throws InvalidDataTypeException
@@ -879,7 +879,7 @@  discard block
 block discarded – undo
879 879
      * _save_session_to_db
880 880
      *
881 881
      * @param bool $clear_session
882
-     * @return string
882
+     * @return boolean
883 883
      * @throws EE_Error
884 884
      * @throws InvalidArgumentException
885 885
      * @throws InvalidDataTypeException
Please login to merge, or discard this patch.
Indentation   +1330 added lines, -1330 removed lines patch added patch discarded remove patch
@@ -24,1328 +24,1328 @@  discard block
 block discarded – undo
24 24
 class EE_Session implements SessionIdentifierInterface
25 25
 {
26 26
 
27
-    const session_id_prefix = 'ee_ssn_';
28
-
29
-    const hash_check_prefix = 'ee_shc_';
30
-
31
-    const OPTION_NAME_SETTINGS = 'ee_session_settings';
32
-
33
-    const STATUS_CLOSED = 0;
34
-
35
-    const STATUS_OPEN = 1;
36
-
37
-    const SAVE_STATE_CLEAN = 'clean';
38
-    const SAVE_STATE_DIRTY = 'dirty';
39
-
40
-
41
-    /**
42
-     * instance of the EE_Session object
43
-     *
44
-     * @var EE_Session
45
-     */
46
-    private static $_instance;
47
-
48
-    /**
49
-     * @var CacheStorageInterface $cache_storage
50
-     */
51
-    protected $cache_storage;
52
-
53
-    /**
54
-     * @var EE_Encryption $encryption
55
-     */
56
-    protected $encryption;
57
-
58
-    /**
59
-     * @var SessionStartHandler $session_start_handler
60
-     */
61
-    protected $session_start_handler;
62
-
63
-    /**
64
-     * the session id
65
-     *
66
-     * @var string
67
-     */
68
-    private $_sid;
69
-
70
-    /**
71
-     * session id salt
72
-     *
73
-     * @var string
74
-     */
75
-    private $_sid_salt;
76
-
77
-    /**
78
-     * session data
79
-     *
80
-     * @var array
81
-     */
82
-    private $_session_data = array();
83
-
84
-    /**
85
-     * how long an EE session lasts
86
-     * default session lifespan of 1 hour (for not so instant IPNs)
87
-     *
88
-     * @var SessionLifespan $session_lifespan
89
-     */
90
-    private $session_lifespan;
91
-
92
-    /**
93
-     * session expiration time as Unix timestamp in GMT
94
-     *
95
-     * @var int
96
-     */
97
-    private $_expiration;
98
-
99
-    /**
100
-     * whether or not session has expired at some point
101
-     *
102
-     * @var boolean
103
-     */
104
-    private $_expired = false;
105
-
106
-    /**
107
-     * current time as Unix timestamp in GMT
108
-     *
109
-     * @var int
110
-     */
111
-    private $_time;
112
-
113
-    /**
114
-     * whether to encrypt session data
115
-     *
116
-     * @var bool
117
-     */
118
-    private $_use_encryption;
119
-
120
-    /**
121
-     * well... according to the server...
122
-     *
123
-     * @var null
124
-     */
125
-    private $_user_agent;
126
-
127
-    /**
128
-     * do you really trust the server ?
129
-     *
130
-     * @var null
131
-     */
132
-    private $_ip_address;
133
-
134
-    /**
135
-     * current WP user_id
136
-     *
137
-     * @var null
138
-     */
139
-    private $_wp_user_id;
140
-
141
-    /**
142
-     * array for defining default session vars
143
-     *
144
-     * @var array
145
-     */
146
-    private $_default_session_vars = array(
147
-        'id'            => null,
148
-        'user_id'       => null,
149
-        'ip_address'    => null,
150
-        'user_agent'    => null,
151
-        'init_access'   => null,
152
-        'last_access'   => null,
153
-        'expiration'    => null,
154
-        'pages_visited' => array(),
155
-    );
156
-
157
-    /**
158
-     * timestamp for when last garbage collection cycle was performed
159
-     *
160
-     * @var int $_last_gc
161
-     */
162
-    private $_last_gc;
163
-
164
-    /**
165
-     * @var RequestInterface $request
166
-     */
167
-    protected $request;
168
-
169
-    /**
170
-     * whether session is active or not
171
-     *
172
-     * @var int $status
173
-     */
174
-    private $status = EE_Session::STATUS_CLOSED;
175
-
176
-    /**
177
-     * whether session data has changed therefore requiring a session save
178
-     *
179
-     * @var string $save_state
180
-     */
181
-    private $save_state = EE_Session::SAVE_STATE_CLEAN;
182
-
183
-
184
-    /**
185
-     * @singleton method used to instantiate class object
186
-     * @param CacheStorageInterface $cache_storage
187
-     * @param SessionLifespan|null  $lifespan
188
-     * @param RequestInterface      $request
189
-     * @param SessionStartHandler   $session_start_handler
190
-     * @param EE_Encryption         $encryption
191
-     * @return EE_Session
192
-     * @throws InvalidArgumentException
193
-     * @throws InvalidDataTypeException
194
-     * @throws InvalidInterfaceException
195
-     */
196
-    public static function instance(
197
-        CacheStorageInterface $cache_storage = null,
198
-        SessionLifespan $lifespan = null,
199
-        RequestInterface $request = null,
200
-        SessionStartHandler $session_start_handler = null,
201
-        EE_Encryption $encryption = null
202
-    ) {
203
-        // check if class object is instantiated
204
-        // session loading is turned ON by default, but prior to the init hook, can be turned back OFF via:
205
-        // add_filter( 'FHEE_load_EE_Session', '__return_false' );
206
-        if (
207
-            ! self::$_instance instanceof EE_Session
208
-            && $cache_storage instanceof CacheStorageInterface
209
-            && $lifespan instanceof SessionLifespan
210
-            && $request instanceof RequestInterface
211
-            && $session_start_handler instanceof SessionStartHandler
212
-            && apply_filters('FHEE_load_EE_Session', true)
213
-        ) {
214
-            self::$_instance = new self(
215
-                $cache_storage,
216
-                $lifespan,
217
-                $request,
218
-                $session_start_handler,
219
-                $encryption
220
-            );
221
-        }
222
-        return self::$_instance;
223
-    }
224
-
225
-
226
-    /**
227
-     * protected constructor to prevent direct creation
228
-     *
229
-     * @param CacheStorageInterface $cache_storage
230
-     * @param SessionLifespan       $lifespan
231
-     * @param RequestInterface      $request
232
-     * @param SessionStartHandler   $session_start_handler
233
-     * @param EE_Encryption         $encryption
234
-     * @throws InvalidArgumentException
235
-     * @throws InvalidDataTypeException
236
-     * @throws InvalidInterfaceException
237
-     */
238
-    protected function __construct(
239
-        CacheStorageInterface $cache_storage,
240
-        SessionLifespan $lifespan,
241
-        RequestInterface $request,
242
-        SessionStartHandler $session_start_handler,
243
-        EE_Encryption $encryption = null
244
-    ) {
245
-        // session loading is turned ON by default,
246
-        // but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
247
-        // (which currently fires on the init hook at priority 9),
248
-        // can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
249
-        if (! apply_filters('FHEE_load_EE_Session', true)) {
250
-            return;
251
-        }
252
-        $this->session_start_handler = $session_start_handler;
253
-        $this->session_lifespan = $lifespan;
254
-        $this->request = $request;
255
-        if (! defined('ESPRESSO_SESSION')) {
256
-            define('ESPRESSO_SESSION', true);
257
-        }
258
-        // retrieve session options from db
259
-        $session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
260
-        if (! empty($session_settings)) {
261
-            // cycle though existing session options
262
-            foreach ($session_settings as $var_name => $session_setting) {
263
-                // set values for class properties
264
-                $var_name = '_' . $var_name;
265
-                $this->{$var_name} = $session_setting;
266
-            }
267
-        }
268
-        $this->cache_storage = $cache_storage;
269
-        // are we using encryption?
270
-        $this->_use_encryption = $encryption instanceof EE_Encryption
271
-                                 && EE_Registry::instance()->CFG->admin->encode_session_data();
272
-        // encrypt data via: $this->encryption->encrypt();
273
-        $this->encryption = $encryption;
274
-        // filter hook allows outside functions/classes/plugins to change default empty cart
275
-        $extra_default_session_vars = apply_filters('FHEE__EE_Session__construct__extra_default_session_vars', array());
276
-        array_merge($this->_default_session_vars, $extra_default_session_vars);
277
-        // apply default session vars
278
-        $this->_set_defaults();
279
-        add_action('AHEE__EE_System__initialize', array($this, 'open_session'));
280
-        // check request for 'clear_session' param
281
-        add_action('AHEE__EE_Request_Handler__construct__complete', array($this, 'wp_loaded'));
282
-        // once everything is all said and done,
283
-        add_action('shutdown', array($this, 'update'), 100);
284
-        add_action('shutdown', array($this, 'garbageCollection'), 1000);
285
-        $this->configure_garbage_collection_filters();
286
-    }
287
-
288
-
289
-    /**
290
-     * @return bool
291
-     * @throws InvalidArgumentException
292
-     * @throws InvalidDataTypeException
293
-     * @throws InvalidInterfaceException
294
-     */
295
-    public static function isLoadedAndActive()
296
-    {
297
-        return did_action('AHEE__EE_System__core_loaded_and_ready')
298
-               && EE_Session::instance() instanceof EE_Session
299
-               && EE_Session::instance()->isActive();
300
-    }
301
-
302
-
303
-    /**
304
-     * @return bool
305
-     */
306
-    public function isActive()
307
-    {
308
-        return $this->status === EE_Session::STATUS_OPEN;
309
-    }
310
-
311
-
312
-    /**
313
-     * @return void
314
-     * @throws EE_Error
315
-     * @throws InvalidArgumentException
316
-     * @throws InvalidDataTypeException
317
-     * @throws InvalidInterfaceException
318
-     * @throws InvalidSessionDataException
319
-     * @throws RuntimeException
320
-     * @throws ReflectionException
321
-     */
322
-    public function open_session()
323
-    {
324
-        // check for existing session and retrieve it from db
325
-        if (! $this->_espresso_session()) {
326
-            // or just start a new one
327
-            $this->_create_espresso_session();
328
-        }
329
-    }
330
-
331
-
332
-    /**
333
-     * @return bool
334
-     */
335
-    public function expired()
336
-    {
337
-        return $this->_expired;
338
-    }
339
-
340
-
341
-    /**
342
-     * @return void
343
-     */
344
-    public function reset_expired()
345
-    {
346
-        $this->_expired = false;
347
-    }
348
-
349
-
350
-    /**
351
-     * @return int
352
-     */
353
-    public function expiration()
354
-    {
355
-        return $this->_expiration;
356
-    }
357
-
358
-
359
-    /**
360
-     * @return int
361
-     */
362
-    public function extension()
363
-    {
364
-        return apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS);
365
-    }
366
-
367
-
368
-    /**
369
-     * @param int $time number of seconds to add to session expiration
370
-     */
371
-    public function extend_expiration($time = 0)
372
-    {
373
-        $time = $time ? $time : $this->extension();
374
-        $this->_expiration += absint($time);
375
-    }
376
-
377
-
378
-    /**
379
-     * @return int
380
-     */
381
-    public function lifespan()
382
-    {
383
-        return $this->session_lifespan->inSeconds();
384
-    }
385
-
386
-
387
-    /**
388
-     * Marks whether the session data has been updated or not.
389
-     * Valid options are:
390
-     *      EE_Session::SAVE_STATE_CLEAN - session data remains unchanged and updating is not necessary
391
-     *      EE_Session::SAVE_STATE_DIRTY - session data has changed since last save and needs to be updated
392
-     * default value is EE_Session::SAVE_STATE_DIRTY
393
-     *
394
-     * @param string $save_state
395
-     */
396
-    public function setSaveState($save_state = EE_Session::SAVE_STATE_DIRTY)
397
-    {
398
-        $valid_save_states = [
399
-            EE_Session::SAVE_STATE_CLEAN,
400
-            EE_Session::SAVE_STATE_DIRTY,
401
-        ];
402
-        if (! in_array($save_state, $valid_save_states, true)) {
403
-            $save_state = EE_Session::SAVE_STATE_DIRTY;
404
-        }
405
-        $this->save_state = $save_state;
406
-    }
407
-
408
-
409
-
410
-    /**
411
-     * This just sets some defaults for the _session data property
412
-     *
413
-     * @access private
414
-     * @return void
415
-     */
416
-    private function _set_defaults()
417
-    {
418
-        // set some defaults
419
-        foreach ($this->_default_session_vars as $key => $default_var) {
420
-            if (is_array($default_var)) {
421
-                $this->_session_data[ $key ] = array();
422
-            } else {
423
-                $this->_session_data[ $key ] = '';
424
-            }
425
-        }
426
-    }
427
-
428
-
429
-    /**
430
-     * @retrieve  session data
431
-     * @access    public
432
-     * @return    string
433
-     */
434
-    public function id()
435
-    {
436
-        return $this->_sid;
437
-    }
438
-
439
-
440
-    /**
441
-     * @param \EE_Cart $cart
442
-     * @return bool
443
-     */
444
-    public function set_cart(EE_Cart $cart)
445
-    {
446
-        $this->_session_data['cart'] = $cart;
447
-        $this->setSaveState();
448
-        return true;
449
-    }
450
-
451
-
452
-    /**
453
-     * reset_cart
454
-     */
455
-    public function reset_cart()
456
-    {
457
-        do_action('AHEE__EE_Session__reset_cart__before_reset', $this);
458
-        $this->_session_data['cart'] = null;
459
-        $this->setSaveState();
460
-    }
461
-
462
-
463
-    /**
464
-     * @return \EE_Cart
465
-     */
466
-    public function cart()
467
-    {
468
-        return isset($this->_session_data['cart']) && $this->_session_data['cart'] instanceof EE_Cart
469
-            ? $this->_session_data['cart']
470
-            : null;
471
-    }
472
-
473
-
474
-    /**
475
-     * @param \EE_Checkout $checkout
476
-     * @return bool
477
-     */
478
-    public function set_checkout(EE_Checkout $checkout)
479
-    {
480
-        $this->_session_data['checkout'] = $checkout;
481
-        $this->setSaveState();
482
-        return true;
483
-    }
484
-
485
-
486
-    /**
487
-     * reset_checkout
488
-     */
489
-    public function reset_checkout()
490
-    {
491
-        do_action('AHEE__EE_Session__reset_checkout__before_reset', $this);
492
-        $this->_session_data['checkout'] = null;
493
-        $this->setSaveState();
494
-    }
495
-
496
-
497
-    /**
498
-     * @return \EE_Checkout
499
-     */
500
-    public function checkout()
501
-    {
502
-        return isset($this->_session_data['checkout']) && $this->_session_data['checkout'] instanceof EE_Checkout
503
-            ? $this->_session_data['checkout']
504
-            : null;
505
-    }
506
-
507
-
508
-    /**
509
-     * @param \EE_Transaction $transaction
510
-     * @return bool
511
-     * @throws EE_Error
512
-     */
513
-    public function set_transaction(EE_Transaction $transaction)
514
-    {
515
-        // first remove the session from the transaction before we save the transaction in the session
516
-        $transaction->set_txn_session_data(null);
517
-        $this->_session_data['transaction'] = $transaction;
518
-        $this->setSaveState();
519
-        return true;
520
-    }
521
-
522
-
523
-    /**
524
-     * reset_transaction
525
-     */
526
-    public function reset_transaction()
527
-    {
528
-        do_action('AHEE__EE_Session__reset_transaction__before_reset', $this);
529
-        $this->_session_data['transaction'] = null;
530
-        $this->setSaveState();
531
-    }
532
-
533
-
534
-    /**
535
-     * @return \EE_Transaction
536
-     */
537
-    public function transaction()
538
-    {
539
-        return isset($this->_session_data['transaction'])
540
-               && $this->_session_data['transaction'] instanceof EE_Transaction
541
-            ? $this->_session_data['transaction']
542
-            : null;
543
-    }
544
-
545
-
546
-    /**
547
-     * retrieve session data
548
-     *
549
-     * @param null $key
550
-     * @param bool $reset_cache
551
-     * @return array
552
-     */
553
-    public function get_session_data($key = null, $reset_cache = false)
554
-    {
555
-        if ($reset_cache) {
556
-            $this->reset_cart();
557
-            $this->reset_checkout();
558
-            $this->reset_transaction();
559
-        }
560
-        if (! empty($key)) {
561
-            return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
562
-        }
563
-        return $this->_session_data;
564
-    }
565
-
566
-
567
-    /**
568
-     * Returns TRUE on success, FALSE on fail
569
-     *
570
-     * @param array $data
571
-     * @return bool
572
-     */
573
-    public function set_session_data($data)
574
-    {
575
-        // nothing ??? bad data ??? go home!
576
-        if (empty($data) || ! is_array($data)) {
577
-            EE_Error::add_error(
578
-                esc_html__(
579
-                    'No session data or invalid session data was provided.',
580
-                    'event_espresso'
581
-                ),
582
-                __FILE__,
583
-                __FUNCTION__,
584
-                __LINE__
585
-            );
586
-            return false;
587
-        }
588
-        foreach ($data as $key => $value) {
589
-            if (isset($this->_default_session_vars[ $key ])) {
590
-                EE_Error::add_error(
591
-                    sprintf(
592
-                        esc_html__(
593
-                            'Sorry! %s is a default session datum and can not be reset.',
594
-                            'event_espresso'
595
-                        ),
596
-                        $key
597
-                    ),
598
-                    __FILE__,
599
-                    __FUNCTION__,
600
-                    __LINE__
601
-                );
602
-                return false;
603
-            }
604
-            $this->_session_data[ $key ] = $value;
605
-            $this->setSaveState();
606
-        }
607
-        return true;
608
-    }
609
-
610
-
611
-    /**
612
-     * @initiate session
613
-     * @access   private
614
-     * @return TRUE on success, FALSE on fail
615
-     * @throws EE_Error
616
-     * @throws InvalidArgumentException
617
-     * @throws InvalidDataTypeException
618
-     * @throws InvalidInterfaceException
619
-     * @throws InvalidSessionDataException
620
-     * @throws RuntimeException
621
-     * @throws ReflectionException
622
-     */
623
-    private function _espresso_session()
624
-    {
625
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
626
-        $this->session_start_handler->startSession();
627
-        $this->status = EE_Session::STATUS_OPEN;
628
-        // get our modified session ID
629
-        $this->_sid = $this->_generate_session_id();
630
-        // and the visitors IP
631
-        $this->_ip_address = $this->request->ipAddress();
632
-        // set the "user agent"
633
-        $this->_user_agent = $this->request->userAgent();
634
-        // now let's retrieve what's in the db
635
-        $session_data = $this->_retrieve_session_data();
636
-        if (! empty($session_data)) {
637
-            // get the current time in UTC
638
-            $this->_time = $this->_time !== null ? $this->_time : time();
639
-            // and reset the session expiration
640
-            $this->_expiration = isset($session_data['expiration'])
641
-                ? $session_data['expiration']
642
-                : $this->_time + $this->session_lifespan->inSeconds();
643
-        } else {
644
-            // set initial site access time and the session expiration
645
-            $this->_set_init_access_and_expiration();
646
-            // set referer
647
-            $this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
648
-                ? esc_attr($_SERVER['HTTP_REFERER'])
649
-                : '';
650
-            // no previous session = go back and create one (on top of the data above)
651
-            return false;
652
-        }
653
-        // now the user agent
654
-        if ($session_data['user_agent'] !== $this->_user_agent) {
655
-            return false;
656
-        }
657
-        // wait a minute... how old are you?
658
-        if ($this->_time > $this->_expiration) {
659
-            // yer too old fer me!
660
-            $this->_expired = true;
661
-            // wipe out everything that isn't a default session datum
662
-            $this->clear_session(__CLASS__, __FUNCTION__);
663
-        }
664
-        // make event espresso session data available to plugin
665
-        $this->_session_data = array_merge($this->_session_data, $session_data);
666
-        return true;
667
-    }
668
-
669
-
670
-    /**
671
-     * _get_session_data
672
-     * Retrieves the session data, and attempts to correct any encoding issues that can occur due to improperly setup
673
-     * databases
674
-     *
675
-     * @return array
676
-     * @throws EE_Error
677
-     * @throws InvalidArgumentException
678
-     * @throws InvalidSessionDataException
679
-     * @throws InvalidDataTypeException
680
-     * @throws InvalidInterfaceException
681
-     * @throws RuntimeException
682
-     */
683
-    protected function _retrieve_session_data()
684
-    {
685
-        $ssn_key = EE_Session::session_id_prefix . $this->_sid;
686
-        try {
687
-            // we're using WP's Transient API to store session data using the PHP session ID as the option name
688
-            $session_data = $this->cache_storage->get($ssn_key, false);
689
-            if (empty($session_data)) {
690
-                return array();
691
-            }
692
-            if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
693
-                $hash_check = $this->cache_storage->get(
694
-                    EE_Session::hash_check_prefix . $this->_sid,
695
-                    false
696
-                );
697
-                if ($hash_check && $hash_check !== md5($session_data)) {
698
-                    EE_Error::add_error(
699
-                        sprintf(
700
-                            __(
701
-                                'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
702
-                                'event_espresso'
703
-                            ),
704
-                            EE_Session::session_id_prefix . $this->_sid
705
-                        ),
706
-                        __FILE__,
707
-                        __FUNCTION__,
708
-                        __LINE__
709
-                    );
710
-                }
711
-            }
712
-        } catch (Exception $e) {
713
-            // let's just eat that error for now and attempt to correct any corrupted data
714
-            global $wpdb;
715
-            $row = $wpdb->get_row(
716
-                $wpdb->prepare(
717
-                    "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
718
-                    '_transient_' . $ssn_key
719
-                )
720
-            );
721
-            $session_data = is_object($row) ? $row->option_value : null;
722
-            if ($session_data) {
723
-                $session_data = preg_replace_callback(
724
-                    '!s:(d+):"(.*?)";!',
725
-                    function ($match) {
726
-                        return $match[1] === strlen($match[2])
727
-                            ? $match[0]
728
-                            : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
729
-                    },
730
-                    $session_data
731
-                );
732
-            }
733
-            $session_data = maybe_unserialize($session_data);
734
-        }
735
-        // in case the data is encoded... try to decode it
736
-        $session_data = $this->encryption instanceof EE_Encryption
737
-            ? $this->encryption->base64_string_decode($session_data)
738
-            : $session_data;
739
-        if (! is_array($session_data)) {
740
-            try {
741
-                $session_data = maybe_unserialize($session_data);
742
-            } catch (Exception $e) {
743
-                $msg = esc_html__(
744
-                    'An error occurred while attempting to unserialize the session data.',
745
-                    'event_espresso'
746
-                );
747
-                $msg .= WP_DEBUG
748
-                    ? '<br><pre>'
749
-                      . print_r($session_data, true)
750
-                      . '</pre><br>'
751
-                      . $this->find_serialize_error($session_data)
752
-                    : '';
753
-                $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
754
-                throw new InvalidSessionDataException($msg, 0, $e);
755
-            }
756
-        }
757
-        // just a check to make sure the session array is indeed an array
758
-        if (! is_array($session_data)) {
759
-            // no?!?! then something is wrong
760
-            $msg = esc_html__(
761
-                'The session data is missing, invalid, or corrupted.',
762
-                'event_espresso'
763
-            );
764
-            $msg .= WP_DEBUG
765
-                ? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
766
-                : '';
767
-            $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
768
-            throw new InvalidSessionDataException($msg);
769
-        }
770
-        if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
771
-            $session_data['transaction'] = EEM_Transaction::instance()->get_one_by_ID(
772
-                $session_data['transaction']
773
-            );
774
-        }
775
-        return $session_data;
776
-    }
777
-
778
-
779
-    /**
780
-     * _generate_session_id
781
-     * Retrieves the PHP session id either directly from the PHP session,
782
-     * or from the $_REQUEST array if it was passed in from an AJAX request.
783
-     * The session id is then salted and hashed (mmm sounds tasty)
784
-     * so that it can be safely used as a $_REQUEST param
785
-     *
786
-     * @return string
787
-     */
788
-    protected function _generate_session_id()
789
-    {
790
-        // check if the SID was passed explicitly, otherwise get from session, then add salt and hash it to reduce length
791
-        if (isset($_REQUEST['EESID'])) {
792
-            $session_id = sanitize_text_field($_REQUEST['EESID']);
793
-        } else {
794
-            $session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
795
-        }
796
-        return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
797
-    }
798
-
799
-
800
-    /**
801
-     * _get_sid_salt
802
-     *
803
-     * @return string
804
-     */
805
-    protected function _get_sid_salt()
806
-    {
807
-        // was session id salt already saved to db ?
808
-        if (empty($this->_sid_salt)) {
809
-            // no?  then maybe use WP defined constant
810
-            if (defined('AUTH_SALT')) {
811
-                $this->_sid_salt = AUTH_SALT;
812
-            }
813
-            // if salt doesn't exist or is too short
814
-            if (strlen($this->_sid_salt) < 32) {
815
-                // create a new one
816
-                $this->_sid_salt = wp_generate_password(64);
817
-            }
818
-            // and save it as a permanent session setting
819
-            $this->updateSessionSettings(array('sid_salt' => $this->_sid_salt));
820
-        }
821
-        return $this->_sid_salt;
822
-    }
823
-
824
-
825
-    /**
826
-     * _set_init_access_and_expiration
827
-     *
828
-     * @return void
829
-     */
830
-    protected function _set_init_access_and_expiration()
831
-    {
832
-        $this->_time = time();
833
-        $this->_expiration = $this->_time + $this->session_lifespan->inSeconds();
834
-        // set initial site access time
835
-        $this->_session_data['init_access'] = $this->_time;
836
-        // and the session expiration
837
-        $this->_session_data['expiration'] = $this->_expiration;
838
-    }
839
-
840
-
841
-    /**
842
-     * @update session data  prior to saving to the db
843
-     * @access public
844
-     * @param bool $new_session
845
-     * @return TRUE on success, FALSE on fail
846
-     * @throws EE_Error
847
-     * @throws InvalidArgumentException
848
-     * @throws InvalidDataTypeException
849
-     * @throws InvalidInterfaceException
850
-     * @throws ReflectionException
851
-     */
852
-    public function update($new_session = false)
853
-    {
854
-        $this->_session_data = $this->_session_data !== null
855
-                               && is_array($this->_session_data)
856
-                               && isset($this->_session_data['id'])
857
-            ? $this->_session_data
858
-            : array();
859
-        if (empty($this->_session_data)) {
860
-            $this->_set_defaults();
861
-        }
862
-        $session_data = array();
863
-        foreach ($this->_session_data as $key => $value) {
864
-            switch ($key) {
865
-                case 'id':
866
-                    // session ID
867
-                    $session_data['id'] = $this->_sid;
868
-                    break;
869
-                case 'ip_address':
870
-                    // visitor ip address
871
-                    $session_data['ip_address'] = $this->request->ipAddress();
872
-                    break;
873
-                case 'user_agent':
874
-                    // visitor user_agent
875
-                    $session_data['user_agent'] = $this->_user_agent;
876
-                    break;
877
-                case 'init_access':
878
-                    $session_data['init_access'] = absint($value);
879
-                    break;
880
-                case 'last_access':
881
-                    // current access time
882
-                    $session_data['last_access'] = $this->_time;
883
-                    break;
884
-                case 'expiration':
885
-                    // when the session expires
886
-                    $session_data['expiration'] = ! empty($this->_expiration)
887
-                        ? $this->_expiration
888
-                        : $session_data['init_access'] + $this->session_lifespan->inSeconds();
889
-                    break;
890
-                case 'user_id':
891
-                    // current user if logged in
892
-                    $session_data['user_id'] = $this->_wp_user_id();
893
-                    break;
894
-                case 'pages_visited':
895
-                    $page_visit = $this->_get_page_visit();
896
-                    if ($page_visit) {
897
-                        // set pages visited where the first will be the http referrer
898
-                        $this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
899
-                        // we'll only save the last 10 page visits.
900
-                        $session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
901
-                    }
902
-                    break;
903
-                default:
904
-                    // carry any other data over
905
-                    $session_data[ $key ] = $this->_session_data[ $key ];
906
-            }
907
-        }
908
-        $this->_session_data = $session_data;
909
-        // creating a new session does not require saving to the db just yet
910
-        if (! $new_session) {
911
-            // ready? let's save
912
-            if ($this->_save_session_to_db()) {
913
-                return true;
914
-            }
915
-            return false;
916
-        }
917
-        // meh, why not?
918
-        return true;
919
-    }
920
-
921
-
922
-    /**
923
-     * @create session data array
924
-     * @access public
925
-     * @return bool
926
-     * @throws EE_Error
927
-     * @throws InvalidArgumentException
928
-     * @throws InvalidDataTypeException
929
-     * @throws InvalidInterfaceException
930
-     * @throws ReflectionException
931
-     */
932
-    private function _create_espresso_session()
933
-    {
934
-        do_action('AHEE_log', __CLASS__, __FUNCTION__, '');
935
-        // use the update function for now with $new_session arg set to TRUE
936
-        return $this->update(true) ? true : false;
937
-    }
938
-
939
-    /**
940
-     * Detects if there is anything worth saving in the session (eg the cart is a good one, notices are pretty good
941
-     * too). This is used when determining if we want to save the session or not.
942
-     * @since 4.9.67.p
943
-     * @return bool
944
-     */
945
-    private function sessionHasStuffWorthSaving()
946
-    {
947
-        return $this->save_state === EE_Session::SAVE_STATE_DIRTY
948
-               // we may want to eventually remove the following
949
-               // on the assumption that the above check is enough
950
-               || $this->cart() instanceof EE_Cart
951
-               || (
952
-                   isset($this->_session_data['ee_notices'])
953
-                   && (
954
-                       ! empty($this->_session_data['ee_notices']['attention'])
955
-                       || ! empty($this->_session_data['ee_notices']['errors'])
956
-                       || ! empty($this->_session_data['ee_notices']['success'])
957
-                   )
958
-               );
959
-    }
960
-
961
-
962
-    /**
963
-     * _save_session_to_db
964
-     *
965
-     * @param bool $clear_session
966
-     * @return string
967
-     * @throws EE_Error
968
-     * @throws InvalidArgumentException
969
-     * @throws InvalidDataTypeException
970
-     * @throws InvalidInterfaceException
971
-     * @throws ReflectionException
972
-     */
973
-    private function _save_session_to_db($clear_session = false)
974
-    {
975
-        // don't save sessions for crawlers
976
-        // and unless we're deleting the session data, don't save anything if there isn't a cart
977
-        if (
978
-            $this->request->isBot()
979
-            || (
980
-                ! $clear_session
981
-                && ! $this->sessionHasStuffWorthSaving()
982
-                && apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
983
-            )
984
-        ) {
985
-            return false;
986
-        }
987
-        $transaction = $this->transaction();
988
-        if ($transaction instanceof EE_Transaction) {
989
-            if (! $transaction->ID()) {
990
-                $transaction->save();
991
-            }
992
-            $this->_session_data['transaction'] = $transaction->ID();
993
-        }
994
-        // then serialize all of our session data
995
-        $session_data = serialize($this->_session_data);
996
-        // do we need to also encode it to avoid corrupted data when saved to the db?
997
-        $session_data = $this->_use_encryption
998
-            ? $this->encryption->base64_string_encode($session_data)
999
-            : $session_data;
1000
-        // maybe save hash check
1001
-        if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
1002
-            $this->cache_storage->add(
1003
-                EE_Session::hash_check_prefix . $this->_sid,
1004
-                md5($session_data),
1005
-                $this->session_lifespan->inSeconds()
1006
-            );
1007
-        }
1008
-        // we're using the Transient API for storing session data,
1009
-        $saved = $this->cache_storage->add(
1010
-            EE_Session::session_id_prefix . $this->_sid,
1011
-            $session_data,
1012
-            $this->session_lifespan->inSeconds()
1013
-        );
1014
-        $this->setSaveState(EE_Session::SAVE_STATE_CLEAN);
1015
-        return $saved;
1016
-    }
1017
-
1018
-
1019
-    /**
1020
-     * @get    the full page request the visitor is accessing
1021
-     * @access public
1022
-     * @return string
1023
-     */
1024
-    public function _get_page_visit()
1025
-    {
1026
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
1027
-        // check for request url
1028
-        if (isset($_SERVER['REQUEST_URI'])) {
1029
-            $http_host = '';
1030
-            $page_id = '?';
1031
-            $e_reg = '';
1032
-            $request_uri = esc_url($_SERVER['REQUEST_URI']);
1033
-            $ru_bits = explode('?', $request_uri);
1034
-            $request_uri = $ru_bits[0];
1035
-            // check for and grab host as well
1036
-            if (isset($_SERVER['HTTP_HOST'])) {
1037
-                $http_host = esc_url($_SERVER['HTTP_HOST']);
1038
-            }
1039
-            // check for page_id in SERVER REQUEST
1040
-            if (isset($_REQUEST['page_id'])) {
1041
-                // rebuild $e_reg without any of the extra parameters
1042
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
1043
-            }
1044
-            // check for $e_reg in SERVER REQUEST
1045
-            if (isset($_REQUEST['ee'])) {
1046
-                // rebuild $e_reg without any of the extra parameters
1047
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
1048
-            }
1049
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
1050
-        }
1051
-        return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
1052
-    }
1053
-
1054
-
1055
-    /**
1056
-     * @the    current wp user id
1057
-     * @access public
1058
-     * @return int
1059
-     */
1060
-    public function _wp_user_id()
1061
-    {
1062
-        // if I need to explain the following lines of code, then you shouldn't be looking at this!
1063
-        $this->_wp_user_id = get_current_user_id();
1064
-        return $this->_wp_user_id;
1065
-    }
1066
-
1067
-
1068
-    /**
1069
-     * Clear EE_Session data
1070
-     *
1071
-     * @access public
1072
-     * @param string $class
1073
-     * @param string $function
1074
-     * @return void
1075
-     * @throws EE_Error
1076
-     * @throws InvalidArgumentException
1077
-     * @throws InvalidDataTypeException
1078
-     * @throws InvalidInterfaceException
1079
-     * @throws ReflectionException
1080
-     */
1081
-    public function clear_session($class = '', $function = '')
1082
-    {
27
+	const session_id_prefix = 'ee_ssn_';
28
+
29
+	const hash_check_prefix = 'ee_shc_';
30
+
31
+	const OPTION_NAME_SETTINGS = 'ee_session_settings';
32
+
33
+	const STATUS_CLOSED = 0;
34
+
35
+	const STATUS_OPEN = 1;
36
+
37
+	const SAVE_STATE_CLEAN = 'clean';
38
+	const SAVE_STATE_DIRTY = 'dirty';
39
+
40
+
41
+	/**
42
+	 * instance of the EE_Session object
43
+	 *
44
+	 * @var EE_Session
45
+	 */
46
+	private static $_instance;
47
+
48
+	/**
49
+	 * @var CacheStorageInterface $cache_storage
50
+	 */
51
+	protected $cache_storage;
52
+
53
+	/**
54
+	 * @var EE_Encryption $encryption
55
+	 */
56
+	protected $encryption;
57
+
58
+	/**
59
+	 * @var SessionStartHandler $session_start_handler
60
+	 */
61
+	protected $session_start_handler;
62
+
63
+	/**
64
+	 * the session id
65
+	 *
66
+	 * @var string
67
+	 */
68
+	private $_sid;
69
+
70
+	/**
71
+	 * session id salt
72
+	 *
73
+	 * @var string
74
+	 */
75
+	private $_sid_salt;
76
+
77
+	/**
78
+	 * session data
79
+	 *
80
+	 * @var array
81
+	 */
82
+	private $_session_data = array();
83
+
84
+	/**
85
+	 * how long an EE session lasts
86
+	 * default session lifespan of 1 hour (for not so instant IPNs)
87
+	 *
88
+	 * @var SessionLifespan $session_lifespan
89
+	 */
90
+	private $session_lifespan;
91
+
92
+	/**
93
+	 * session expiration time as Unix timestamp in GMT
94
+	 *
95
+	 * @var int
96
+	 */
97
+	private $_expiration;
98
+
99
+	/**
100
+	 * whether or not session has expired at some point
101
+	 *
102
+	 * @var boolean
103
+	 */
104
+	private $_expired = false;
105
+
106
+	/**
107
+	 * current time as Unix timestamp in GMT
108
+	 *
109
+	 * @var int
110
+	 */
111
+	private $_time;
112
+
113
+	/**
114
+	 * whether to encrypt session data
115
+	 *
116
+	 * @var bool
117
+	 */
118
+	private $_use_encryption;
119
+
120
+	/**
121
+	 * well... according to the server...
122
+	 *
123
+	 * @var null
124
+	 */
125
+	private $_user_agent;
126
+
127
+	/**
128
+	 * do you really trust the server ?
129
+	 *
130
+	 * @var null
131
+	 */
132
+	private $_ip_address;
133
+
134
+	/**
135
+	 * current WP user_id
136
+	 *
137
+	 * @var null
138
+	 */
139
+	private $_wp_user_id;
140
+
141
+	/**
142
+	 * array for defining default session vars
143
+	 *
144
+	 * @var array
145
+	 */
146
+	private $_default_session_vars = array(
147
+		'id'            => null,
148
+		'user_id'       => null,
149
+		'ip_address'    => null,
150
+		'user_agent'    => null,
151
+		'init_access'   => null,
152
+		'last_access'   => null,
153
+		'expiration'    => null,
154
+		'pages_visited' => array(),
155
+	);
156
+
157
+	/**
158
+	 * timestamp for when last garbage collection cycle was performed
159
+	 *
160
+	 * @var int $_last_gc
161
+	 */
162
+	private $_last_gc;
163
+
164
+	/**
165
+	 * @var RequestInterface $request
166
+	 */
167
+	protected $request;
168
+
169
+	/**
170
+	 * whether session is active or not
171
+	 *
172
+	 * @var int $status
173
+	 */
174
+	private $status = EE_Session::STATUS_CLOSED;
175
+
176
+	/**
177
+	 * whether session data has changed therefore requiring a session save
178
+	 *
179
+	 * @var string $save_state
180
+	 */
181
+	private $save_state = EE_Session::SAVE_STATE_CLEAN;
182
+
183
+
184
+	/**
185
+	 * @singleton method used to instantiate class object
186
+	 * @param CacheStorageInterface $cache_storage
187
+	 * @param SessionLifespan|null  $lifespan
188
+	 * @param RequestInterface      $request
189
+	 * @param SessionStartHandler   $session_start_handler
190
+	 * @param EE_Encryption         $encryption
191
+	 * @return EE_Session
192
+	 * @throws InvalidArgumentException
193
+	 * @throws InvalidDataTypeException
194
+	 * @throws InvalidInterfaceException
195
+	 */
196
+	public static function instance(
197
+		CacheStorageInterface $cache_storage = null,
198
+		SessionLifespan $lifespan = null,
199
+		RequestInterface $request = null,
200
+		SessionStartHandler $session_start_handler = null,
201
+		EE_Encryption $encryption = null
202
+	) {
203
+		// check if class object is instantiated
204
+		// session loading is turned ON by default, but prior to the init hook, can be turned back OFF via:
205
+		// add_filter( 'FHEE_load_EE_Session', '__return_false' );
206
+		if (
207
+			! self::$_instance instanceof EE_Session
208
+			&& $cache_storage instanceof CacheStorageInterface
209
+			&& $lifespan instanceof SessionLifespan
210
+			&& $request instanceof RequestInterface
211
+			&& $session_start_handler instanceof SessionStartHandler
212
+			&& apply_filters('FHEE_load_EE_Session', true)
213
+		) {
214
+			self::$_instance = new self(
215
+				$cache_storage,
216
+				$lifespan,
217
+				$request,
218
+				$session_start_handler,
219
+				$encryption
220
+			);
221
+		}
222
+		return self::$_instance;
223
+	}
224
+
225
+
226
+	/**
227
+	 * protected constructor to prevent direct creation
228
+	 *
229
+	 * @param CacheStorageInterface $cache_storage
230
+	 * @param SessionLifespan       $lifespan
231
+	 * @param RequestInterface      $request
232
+	 * @param SessionStartHandler   $session_start_handler
233
+	 * @param EE_Encryption         $encryption
234
+	 * @throws InvalidArgumentException
235
+	 * @throws InvalidDataTypeException
236
+	 * @throws InvalidInterfaceException
237
+	 */
238
+	protected function __construct(
239
+		CacheStorageInterface $cache_storage,
240
+		SessionLifespan $lifespan,
241
+		RequestInterface $request,
242
+		SessionStartHandler $session_start_handler,
243
+		EE_Encryption $encryption = null
244
+	) {
245
+		// session loading is turned ON by default,
246
+		// but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
247
+		// (which currently fires on the init hook at priority 9),
248
+		// can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
249
+		if (! apply_filters('FHEE_load_EE_Session', true)) {
250
+			return;
251
+		}
252
+		$this->session_start_handler = $session_start_handler;
253
+		$this->session_lifespan = $lifespan;
254
+		$this->request = $request;
255
+		if (! defined('ESPRESSO_SESSION')) {
256
+			define('ESPRESSO_SESSION', true);
257
+		}
258
+		// retrieve session options from db
259
+		$session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
260
+		if (! empty($session_settings)) {
261
+			// cycle though existing session options
262
+			foreach ($session_settings as $var_name => $session_setting) {
263
+				// set values for class properties
264
+				$var_name = '_' . $var_name;
265
+				$this->{$var_name} = $session_setting;
266
+			}
267
+		}
268
+		$this->cache_storage = $cache_storage;
269
+		// are we using encryption?
270
+		$this->_use_encryption = $encryption instanceof EE_Encryption
271
+								 && EE_Registry::instance()->CFG->admin->encode_session_data();
272
+		// encrypt data via: $this->encryption->encrypt();
273
+		$this->encryption = $encryption;
274
+		// filter hook allows outside functions/classes/plugins to change default empty cart
275
+		$extra_default_session_vars = apply_filters('FHEE__EE_Session__construct__extra_default_session_vars', array());
276
+		array_merge($this->_default_session_vars, $extra_default_session_vars);
277
+		// apply default session vars
278
+		$this->_set_defaults();
279
+		add_action('AHEE__EE_System__initialize', array($this, 'open_session'));
280
+		// check request for 'clear_session' param
281
+		add_action('AHEE__EE_Request_Handler__construct__complete', array($this, 'wp_loaded'));
282
+		// once everything is all said and done,
283
+		add_action('shutdown', array($this, 'update'), 100);
284
+		add_action('shutdown', array($this, 'garbageCollection'), 1000);
285
+		$this->configure_garbage_collection_filters();
286
+	}
287
+
288
+
289
+	/**
290
+	 * @return bool
291
+	 * @throws InvalidArgumentException
292
+	 * @throws InvalidDataTypeException
293
+	 * @throws InvalidInterfaceException
294
+	 */
295
+	public static function isLoadedAndActive()
296
+	{
297
+		return did_action('AHEE__EE_System__core_loaded_and_ready')
298
+			   && EE_Session::instance() instanceof EE_Session
299
+			   && EE_Session::instance()->isActive();
300
+	}
301
+
302
+
303
+	/**
304
+	 * @return bool
305
+	 */
306
+	public function isActive()
307
+	{
308
+		return $this->status === EE_Session::STATUS_OPEN;
309
+	}
310
+
311
+
312
+	/**
313
+	 * @return void
314
+	 * @throws EE_Error
315
+	 * @throws InvalidArgumentException
316
+	 * @throws InvalidDataTypeException
317
+	 * @throws InvalidInterfaceException
318
+	 * @throws InvalidSessionDataException
319
+	 * @throws RuntimeException
320
+	 * @throws ReflectionException
321
+	 */
322
+	public function open_session()
323
+	{
324
+		// check for existing session and retrieve it from db
325
+		if (! $this->_espresso_session()) {
326
+			// or just start a new one
327
+			$this->_create_espresso_session();
328
+		}
329
+	}
330
+
331
+
332
+	/**
333
+	 * @return bool
334
+	 */
335
+	public function expired()
336
+	{
337
+		return $this->_expired;
338
+	}
339
+
340
+
341
+	/**
342
+	 * @return void
343
+	 */
344
+	public function reset_expired()
345
+	{
346
+		$this->_expired = false;
347
+	}
348
+
349
+
350
+	/**
351
+	 * @return int
352
+	 */
353
+	public function expiration()
354
+	{
355
+		return $this->_expiration;
356
+	}
357
+
358
+
359
+	/**
360
+	 * @return int
361
+	 */
362
+	public function extension()
363
+	{
364
+		return apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS);
365
+	}
366
+
367
+
368
+	/**
369
+	 * @param int $time number of seconds to add to session expiration
370
+	 */
371
+	public function extend_expiration($time = 0)
372
+	{
373
+		$time = $time ? $time : $this->extension();
374
+		$this->_expiration += absint($time);
375
+	}
376
+
377
+
378
+	/**
379
+	 * @return int
380
+	 */
381
+	public function lifespan()
382
+	{
383
+		return $this->session_lifespan->inSeconds();
384
+	}
385
+
386
+
387
+	/**
388
+	 * Marks whether the session data has been updated or not.
389
+	 * Valid options are:
390
+	 *      EE_Session::SAVE_STATE_CLEAN - session data remains unchanged and updating is not necessary
391
+	 *      EE_Session::SAVE_STATE_DIRTY - session data has changed since last save and needs to be updated
392
+	 * default value is EE_Session::SAVE_STATE_DIRTY
393
+	 *
394
+	 * @param string $save_state
395
+	 */
396
+	public function setSaveState($save_state = EE_Session::SAVE_STATE_DIRTY)
397
+	{
398
+		$valid_save_states = [
399
+			EE_Session::SAVE_STATE_CLEAN,
400
+			EE_Session::SAVE_STATE_DIRTY,
401
+		];
402
+		if (! in_array($save_state, $valid_save_states, true)) {
403
+			$save_state = EE_Session::SAVE_STATE_DIRTY;
404
+		}
405
+		$this->save_state = $save_state;
406
+	}
407
+
408
+
409
+
410
+	/**
411
+	 * This just sets some defaults for the _session data property
412
+	 *
413
+	 * @access private
414
+	 * @return void
415
+	 */
416
+	private function _set_defaults()
417
+	{
418
+		// set some defaults
419
+		foreach ($this->_default_session_vars as $key => $default_var) {
420
+			if (is_array($default_var)) {
421
+				$this->_session_data[ $key ] = array();
422
+			} else {
423
+				$this->_session_data[ $key ] = '';
424
+			}
425
+		}
426
+	}
427
+
428
+
429
+	/**
430
+	 * @retrieve  session data
431
+	 * @access    public
432
+	 * @return    string
433
+	 */
434
+	public function id()
435
+	{
436
+		return $this->_sid;
437
+	}
438
+
439
+
440
+	/**
441
+	 * @param \EE_Cart $cart
442
+	 * @return bool
443
+	 */
444
+	public function set_cart(EE_Cart $cart)
445
+	{
446
+		$this->_session_data['cart'] = $cart;
447
+		$this->setSaveState();
448
+		return true;
449
+	}
450
+
451
+
452
+	/**
453
+	 * reset_cart
454
+	 */
455
+	public function reset_cart()
456
+	{
457
+		do_action('AHEE__EE_Session__reset_cart__before_reset', $this);
458
+		$this->_session_data['cart'] = null;
459
+		$this->setSaveState();
460
+	}
461
+
462
+
463
+	/**
464
+	 * @return \EE_Cart
465
+	 */
466
+	public function cart()
467
+	{
468
+		return isset($this->_session_data['cart']) && $this->_session_data['cart'] instanceof EE_Cart
469
+			? $this->_session_data['cart']
470
+			: null;
471
+	}
472
+
473
+
474
+	/**
475
+	 * @param \EE_Checkout $checkout
476
+	 * @return bool
477
+	 */
478
+	public function set_checkout(EE_Checkout $checkout)
479
+	{
480
+		$this->_session_data['checkout'] = $checkout;
481
+		$this->setSaveState();
482
+		return true;
483
+	}
484
+
485
+
486
+	/**
487
+	 * reset_checkout
488
+	 */
489
+	public function reset_checkout()
490
+	{
491
+		do_action('AHEE__EE_Session__reset_checkout__before_reset', $this);
492
+		$this->_session_data['checkout'] = null;
493
+		$this->setSaveState();
494
+	}
495
+
496
+
497
+	/**
498
+	 * @return \EE_Checkout
499
+	 */
500
+	public function checkout()
501
+	{
502
+		return isset($this->_session_data['checkout']) && $this->_session_data['checkout'] instanceof EE_Checkout
503
+			? $this->_session_data['checkout']
504
+			: null;
505
+	}
506
+
507
+
508
+	/**
509
+	 * @param \EE_Transaction $transaction
510
+	 * @return bool
511
+	 * @throws EE_Error
512
+	 */
513
+	public function set_transaction(EE_Transaction $transaction)
514
+	{
515
+		// first remove the session from the transaction before we save the transaction in the session
516
+		$transaction->set_txn_session_data(null);
517
+		$this->_session_data['transaction'] = $transaction;
518
+		$this->setSaveState();
519
+		return true;
520
+	}
521
+
522
+
523
+	/**
524
+	 * reset_transaction
525
+	 */
526
+	public function reset_transaction()
527
+	{
528
+		do_action('AHEE__EE_Session__reset_transaction__before_reset', $this);
529
+		$this->_session_data['transaction'] = null;
530
+		$this->setSaveState();
531
+	}
532
+
533
+
534
+	/**
535
+	 * @return \EE_Transaction
536
+	 */
537
+	public function transaction()
538
+	{
539
+		return isset($this->_session_data['transaction'])
540
+			   && $this->_session_data['transaction'] instanceof EE_Transaction
541
+			? $this->_session_data['transaction']
542
+			: null;
543
+	}
544
+
545
+
546
+	/**
547
+	 * retrieve session data
548
+	 *
549
+	 * @param null $key
550
+	 * @param bool $reset_cache
551
+	 * @return array
552
+	 */
553
+	public function get_session_data($key = null, $reset_cache = false)
554
+	{
555
+		if ($reset_cache) {
556
+			$this->reset_cart();
557
+			$this->reset_checkout();
558
+			$this->reset_transaction();
559
+		}
560
+		if (! empty($key)) {
561
+			return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
562
+		}
563
+		return $this->_session_data;
564
+	}
565
+
566
+
567
+	/**
568
+	 * Returns TRUE on success, FALSE on fail
569
+	 *
570
+	 * @param array $data
571
+	 * @return bool
572
+	 */
573
+	public function set_session_data($data)
574
+	{
575
+		// nothing ??? bad data ??? go home!
576
+		if (empty($data) || ! is_array($data)) {
577
+			EE_Error::add_error(
578
+				esc_html__(
579
+					'No session data or invalid session data was provided.',
580
+					'event_espresso'
581
+				),
582
+				__FILE__,
583
+				__FUNCTION__,
584
+				__LINE__
585
+			);
586
+			return false;
587
+		}
588
+		foreach ($data as $key => $value) {
589
+			if (isset($this->_default_session_vars[ $key ])) {
590
+				EE_Error::add_error(
591
+					sprintf(
592
+						esc_html__(
593
+							'Sorry! %s is a default session datum and can not be reset.',
594
+							'event_espresso'
595
+						),
596
+						$key
597
+					),
598
+					__FILE__,
599
+					__FUNCTION__,
600
+					__LINE__
601
+				);
602
+				return false;
603
+			}
604
+			$this->_session_data[ $key ] = $value;
605
+			$this->setSaveState();
606
+		}
607
+		return true;
608
+	}
609
+
610
+
611
+	/**
612
+	 * @initiate session
613
+	 * @access   private
614
+	 * @return TRUE on success, FALSE on fail
615
+	 * @throws EE_Error
616
+	 * @throws InvalidArgumentException
617
+	 * @throws InvalidDataTypeException
618
+	 * @throws InvalidInterfaceException
619
+	 * @throws InvalidSessionDataException
620
+	 * @throws RuntimeException
621
+	 * @throws ReflectionException
622
+	 */
623
+	private function _espresso_session()
624
+	{
625
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
626
+		$this->session_start_handler->startSession();
627
+		$this->status = EE_Session::STATUS_OPEN;
628
+		// get our modified session ID
629
+		$this->_sid = $this->_generate_session_id();
630
+		// and the visitors IP
631
+		$this->_ip_address = $this->request->ipAddress();
632
+		// set the "user agent"
633
+		$this->_user_agent = $this->request->userAgent();
634
+		// now let's retrieve what's in the db
635
+		$session_data = $this->_retrieve_session_data();
636
+		if (! empty($session_data)) {
637
+			// get the current time in UTC
638
+			$this->_time = $this->_time !== null ? $this->_time : time();
639
+			// and reset the session expiration
640
+			$this->_expiration = isset($session_data['expiration'])
641
+				? $session_data['expiration']
642
+				: $this->_time + $this->session_lifespan->inSeconds();
643
+		} else {
644
+			// set initial site access time and the session expiration
645
+			$this->_set_init_access_and_expiration();
646
+			// set referer
647
+			$this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
648
+				? esc_attr($_SERVER['HTTP_REFERER'])
649
+				: '';
650
+			// no previous session = go back and create one (on top of the data above)
651
+			return false;
652
+		}
653
+		// now the user agent
654
+		if ($session_data['user_agent'] !== $this->_user_agent) {
655
+			return false;
656
+		}
657
+		// wait a minute... how old are you?
658
+		if ($this->_time > $this->_expiration) {
659
+			// yer too old fer me!
660
+			$this->_expired = true;
661
+			// wipe out everything that isn't a default session datum
662
+			$this->clear_session(__CLASS__, __FUNCTION__);
663
+		}
664
+		// make event espresso session data available to plugin
665
+		$this->_session_data = array_merge($this->_session_data, $session_data);
666
+		return true;
667
+	}
668
+
669
+
670
+	/**
671
+	 * _get_session_data
672
+	 * Retrieves the session data, and attempts to correct any encoding issues that can occur due to improperly setup
673
+	 * databases
674
+	 *
675
+	 * @return array
676
+	 * @throws EE_Error
677
+	 * @throws InvalidArgumentException
678
+	 * @throws InvalidSessionDataException
679
+	 * @throws InvalidDataTypeException
680
+	 * @throws InvalidInterfaceException
681
+	 * @throws RuntimeException
682
+	 */
683
+	protected function _retrieve_session_data()
684
+	{
685
+		$ssn_key = EE_Session::session_id_prefix . $this->_sid;
686
+		try {
687
+			// we're using WP's Transient API to store session data using the PHP session ID as the option name
688
+			$session_data = $this->cache_storage->get($ssn_key, false);
689
+			if (empty($session_data)) {
690
+				return array();
691
+			}
692
+			if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
693
+				$hash_check = $this->cache_storage->get(
694
+					EE_Session::hash_check_prefix . $this->_sid,
695
+					false
696
+				);
697
+				if ($hash_check && $hash_check !== md5($session_data)) {
698
+					EE_Error::add_error(
699
+						sprintf(
700
+							__(
701
+								'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
702
+								'event_espresso'
703
+							),
704
+							EE_Session::session_id_prefix . $this->_sid
705
+						),
706
+						__FILE__,
707
+						__FUNCTION__,
708
+						__LINE__
709
+					);
710
+				}
711
+			}
712
+		} catch (Exception $e) {
713
+			// let's just eat that error for now and attempt to correct any corrupted data
714
+			global $wpdb;
715
+			$row = $wpdb->get_row(
716
+				$wpdb->prepare(
717
+					"SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
718
+					'_transient_' . $ssn_key
719
+				)
720
+			);
721
+			$session_data = is_object($row) ? $row->option_value : null;
722
+			if ($session_data) {
723
+				$session_data = preg_replace_callback(
724
+					'!s:(d+):"(.*?)";!',
725
+					function ($match) {
726
+						return $match[1] === strlen($match[2])
727
+							? $match[0]
728
+							: 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
729
+					},
730
+					$session_data
731
+				);
732
+			}
733
+			$session_data = maybe_unserialize($session_data);
734
+		}
735
+		// in case the data is encoded... try to decode it
736
+		$session_data = $this->encryption instanceof EE_Encryption
737
+			? $this->encryption->base64_string_decode($session_data)
738
+			: $session_data;
739
+		if (! is_array($session_data)) {
740
+			try {
741
+				$session_data = maybe_unserialize($session_data);
742
+			} catch (Exception $e) {
743
+				$msg = esc_html__(
744
+					'An error occurred while attempting to unserialize the session data.',
745
+					'event_espresso'
746
+				);
747
+				$msg .= WP_DEBUG
748
+					? '<br><pre>'
749
+					  . print_r($session_data, true)
750
+					  . '</pre><br>'
751
+					  . $this->find_serialize_error($session_data)
752
+					: '';
753
+				$this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
754
+				throw new InvalidSessionDataException($msg, 0, $e);
755
+			}
756
+		}
757
+		// just a check to make sure the session array is indeed an array
758
+		if (! is_array($session_data)) {
759
+			// no?!?! then something is wrong
760
+			$msg = esc_html__(
761
+				'The session data is missing, invalid, or corrupted.',
762
+				'event_espresso'
763
+			);
764
+			$msg .= WP_DEBUG
765
+				? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
766
+				: '';
767
+			$this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
768
+			throw new InvalidSessionDataException($msg);
769
+		}
770
+		if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
771
+			$session_data['transaction'] = EEM_Transaction::instance()->get_one_by_ID(
772
+				$session_data['transaction']
773
+			);
774
+		}
775
+		return $session_data;
776
+	}
777
+
778
+
779
+	/**
780
+	 * _generate_session_id
781
+	 * Retrieves the PHP session id either directly from the PHP session,
782
+	 * or from the $_REQUEST array if it was passed in from an AJAX request.
783
+	 * The session id is then salted and hashed (mmm sounds tasty)
784
+	 * so that it can be safely used as a $_REQUEST param
785
+	 *
786
+	 * @return string
787
+	 */
788
+	protected function _generate_session_id()
789
+	{
790
+		// check if the SID was passed explicitly, otherwise get from session, then add salt and hash it to reduce length
791
+		if (isset($_REQUEST['EESID'])) {
792
+			$session_id = sanitize_text_field($_REQUEST['EESID']);
793
+		} else {
794
+			$session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
795
+		}
796
+		return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
797
+	}
798
+
799
+
800
+	/**
801
+	 * _get_sid_salt
802
+	 *
803
+	 * @return string
804
+	 */
805
+	protected function _get_sid_salt()
806
+	{
807
+		// was session id salt already saved to db ?
808
+		if (empty($this->_sid_salt)) {
809
+			// no?  then maybe use WP defined constant
810
+			if (defined('AUTH_SALT')) {
811
+				$this->_sid_salt = AUTH_SALT;
812
+			}
813
+			// if salt doesn't exist or is too short
814
+			if (strlen($this->_sid_salt) < 32) {
815
+				// create a new one
816
+				$this->_sid_salt = wp_generate_password(64);
817
+			}
818
+			// and save it as a permanent session setting
819
+			$this->updateSessionSettings(array('sid_salt' => $this->_sid_salt));
820
+		}
821
+		return $this->_sid_salt;
822
+	}
823
+
824
+
825
+	/**
826
+	 * _set_init_access_and_expiration
827
+	 *
828
+	 * @return void
829
+	 */
830
+	protected function _set_init_access_and_expiration()
831
+	{
832
+		$this->_time = time();
833
+		$this->_expiration = $this->_time + $this->session_lifespan->inSeconds();
834
+		// set initial site access time
835
+		$this->_session_data['init_access'] = $this->_time;
836
+		// and the session expiration
837
+		$this->_session_data['expiration'] = $this->_expiration;
838
+	}
839
+
840
+
841
+	/**
842
+	 * @update session data  prior to saving to the db
843
+	 * @access public
844
+	 * @param bool $new_session
845
+	 * @return TRUE on success, FALSE on fail
846
+	 * @throws EE_Error
847
+	 * @throws InvalidArgumentException
848
+	 * @throws InvalidDataTypeException
849
+	 * @throws InvalidInterfaceException
850
+	 * @throws ReflectionException
851
+	 */
852
+	public function update($new_session = false)
853
+	{
854
+		$this->_session_data = $this->_session_data !== null
855
+							   && is_array($this->_session_data)
856
+							   && isset($this->_session_data['id'])
857
+			? $this->_session_data
858
+			: array();
859
+		if (empty($this->_session_data)) {
860
+			$this->_set_defaults();
861
+		}
862
+		$session_data = array();
863
+		foreach ($this->_session_data as $key => $value) {
864
+			switch ($key) {
865
+				case 'id':
866
+					// session ID
867
+					$session_data['id'] = $this->_sid;
868
+					break;
869
+				case 'ip_address':
870
+					// visitor ip address
871
+					$session_data['ip_address'] = $this->request->ipAddress();
872
+					break;
873
+				case 'user_agent':
874
+					// visitor user_agent
875
+					$session_data['user_agent'] = $this->_user_agent;
876
+					break;
877
+				case 'init_access':
878
+					$session_data['init_access'] = absint($value);
879
+					break;
880
+				case 'last_access':
881
+					// current access time
882
+					$session_data['last_access'] = $this->_time;
883
+					break;
884
+				case 'expiration':
885
+					// when the session expires
886
+					$session_data['expiration'] = ! empty($this->_expiration)
887
+						? $this->_expiration
888
+						: $session_data['init_access'] + $this->session_lifespan->inSeconds();
889
+					break;
890
+				case 'user_id':
891
+					// current user if logged in
892
+					$session_data['user_id'] = $this->_wp_user_id();
893
+					break;
894
+				case 'pages_visited':
895
+					$page_visit = $this->_get_page_visit();
896
+					if ($page_visit) {
897
+						// set pages visited where the first will be the http referrer
898
+						$this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
899
+						// we'll only save the last 10 page visits.
900
+						$session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
901
+					}
902
+					break;
903
+				default:
904
+					// carry any other data over
905
+					$session_data[ $key ] = $this->_session_data[ $key ];
906
+			}
907
+		}
908
+		$this->_session_data = $session_data;
909
+		// creating a new session does not require saving to the db just yet
910
+		if (! $new_session) {
911
+			// ready? let's save
912
+			if ($this->_save_session_to_db()) {
913
+				return true;
914
+			}
915
+			return false;
916
+		}
917
+		// meh, why not?
918
+		return true;
919
+	}
920
+
921
+
922
+	/**
923
+	 * @create session data array
924
+	 * @access public
925
+	 * @return bool
926
+	 * @throws EE_Error
927
+	 * @throws InvalidArgumentException
928
+	 * @throws InvalidDataTypeException
929
+	 * @throws InvalidInterfaceException
930
+	 * @throws ReflectionException
931
+	 */
932
+	private function _create_espresso_session()
933
+	{
934
+		do_action('AHEE_log', __CLASS__, __FUNCTION__, '');
935
+		// use the update function for now with $new_session arg set to TRUE
936
+		return $this->update(true) ? true : false;
937
+	}
938
+
939
+	/**
940
+	 * Detects if there is anything worth saving in the session (eg the cart is a good one, notices are pretty good
941
+	 * too). This is used when determining if we want to save the session or not.
942
+	 * @since 4.9.67.p
943
+	 * @return bool
944
+	 */
945
+	private function sessionHasStuffWorthSaving()
946
+	{
947
+		return $this->save_state === EE_Session::SAVE_STATE_DIRTY
948
+			   // we may want to eventually remove the following
949
+			   // on the assumption that the above check is enough
950
+			   || $this->cart() instanceof EE_Cart
951
+			   || (
952
+				   isset($this->_session_data['ee_notices'])
953
+				   && (
954
+					   ! empty($this->_session_data['ee_notices']['attention'])
955
+					   || ! empty($this->_session_data['ee_notices']['errors'])
956
+					   || ! empty($this->_session_data['ee_notices']['success'])
957
+				   )
958
+			   );
959
+	}
960
+
961
+
962
+	/**
963
+	 * _save_session_to_db
964
+	 *
965
+	 * @param bool $clear_session
966
+	 * @return string
967
+	 * @throws EE_Error
968
+	 * @throws InvalidArgumentException
969
+	 * @throws InvalidDataTypeException
970
+	 * @throws InvalidInterfaceException
971
+	 * @throws ReflectionException
972
+	 */
973
+	private function _save_session_to_db($clear_session = false)
974
+	{
975
+		// don't save sessions for crawlers
976
+		// and unless we're deleting the session data, don't save anything if there isn't a cart
977
+		if (
978
+			$this->request->isBot()
979
+			|| (
980
+				! $clear_session
981
+				&& ! $this->sessionHasStuffWorthSaving()
982
+				&& apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
983
+			)
984
+		) {
985
+			return false;
986
+		}
987
+		$transaction = $this->transaction();
988
+		if ($transaction instanceof EE_Transaction) {
989
+			if (! $transaction->ID()) {
990
+				$transaction->save();
991
+			}
992
+			$this->_session_data['transaction'] = $transaction->ID();
993
+		}
994
+		// then serialize all of our session data
995
+		$session_data = serialize($this->_session_data);
996
+		// do we need to also encode it to avoid corrupted data when saved to the db?
997
+		$session_data = $this->_use_encryption
998
+			? $this->encryption->base64_string_encode($session_data)
999
+			: $session_data;
1000
+		// maybe save hash check
1001
+		if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
1002
+			$this->cache_storage->add(
1003
+				EE_Session::hash_check_prefix . $this->_sid,
1004
+				md5($session_data),
1005
+				$this->session_lifespan->inSeconds()
1006
+			);
1007
+		}
1008
+		// we're using the Transient API for storing session data,
1009
+		$saved = $this->cache_storage->add(
1010
+			EE_Session::session_id_prefix . $this->_sid,
1011
+			$session_data,
1012
+			$this->session_lifespan->inSeconds()
1013
+		);
1014
+		$this->setSaveState(EE_Session::SAVE_STATE_CLEAN);
1015
+		return $saved;
1016
+	}
1017
+
1018
+
1019
+	/**
1020
+	 * @get    the full page request the visitor is accessing
1021
+	 * @access public
1022
+	 * @return string
1023
+	 */
1024
+	public function _get_page_visit()
1025
+	{
1026
+		$page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
1027
+		// check for request url
1028
+		if (isset($_SERVER['REQUEST_URI'])) {
1029
+			$http_host = '';
1030
+			$page_id = '?';
1031
+			$e_reg = '';
1032
+			$request_uri = esc_url($_SERVER['REQUEST_URI']);
1033
+			$ru_bits = explode('?', $request_uri);
1034
+			$request_uri = $ru_bits[0];
1035
+			// check for and grab host as well
1036
+			if (isset($_SERVER['HTTP_HOST'])) {
1037
+				$http_host = esc_url($_SERVER['HTTP_HOST']);
1038
+			}
1039
+			// check for page_id in SERVER REQUEST
1040
+			if (isset($_REQUEST['page_id'])) {
1041
+				// rebuild $e_reg without any of the extra parameters
1042
+				$page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
1043
+			}
1044
+			// check for $e_reg in SERVER REQUEST
1045
+			if (isset($_REQUEST['ee'])) {
1046
+				// rebuild $e_reg without any of the extra parameters
1047
+				$e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
1048
+			}
1049
+			$page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
1050
+		}
1051
+		return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
1052
+	}
1053
+
1054
+
1055
+	/**
1056
+	 * @the    current wp user id
1057
+	 * @access public
1058
+	 * @return int
1059
+	 */
1060
+	public function _wp_user_id()
1061
+	{
1062
+		// if I need to explain the following lines of code, then you shouldn't be looking at this!
1063
+		$this->_wp_user_id = get_current_user_id();
1064
+		return $this->_wp_user_id;
1065
+	}
1066
+
1067
+
1068
+	/**
1069
+	 * Clear EE_Session data
1070
+	 *
1071
+	 * @access public
1072
+	 * @param string $class
1073
+	 * @param string $function
1074
+	 * @return void
1075
+	 * @throws EE_Error
1076
+	 * @throws InvalidArgumentException
1077
+	 * @throws InvalidDataTypeException
1078
+	 * @throws InvalidInterfaceException
1079
+	 * @throws ReflectionException
1080
+	 */
1081
+	public function clear_session($class = '', $function = '')
1082
+	{
1083 1083
 //         echo '
1084 1084
 // <h3 style="color:#999;line-height:.9em;">
1085 1085
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
1086 1086
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
1087 1087
 // </h3>';
1088
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1089
-        $this->reset_cart();
1090
-        $this->reset_checkout();
1091
-        $this->reset_transaction();
1092
-        // wipe out everything that isn't a default session datum
1093
-        $this->reset_data(array_keys($this->_session_data));
1094
-        // reset initial site access time and the session expiration
1095
-        $this->_set_init_access_and_expiration();
1096
-        $this->setSaveState();
1097
-        $this->_save_session_to_db(true);
1098
-    }
1099
-
1100
-
1101
-    /**
1102
-     * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1103
-     *
1104
-     * @param array|mixed $data_to_reset
1105
-     * @param bool        $show_all_notices
1106
-     * @return bool
1107
-     */
1108
-    public function reset_data($data_to_reset = array(), $show_all_notices = false)
1109
-    {
1110
-        // if $data_to_reset is not in an array, then put it in one
1111
-        if (! is_array($data_to_reset)) {
1112
-            $data_to_reset = array($data_to_reset);
1113
-        }
1114
-        // nothing ??? go home!
1115
-        if (empty($data_to_reset)) {
1116
-            EE_Error::add_error(
1117
-                __(
1118
-                    'No session data could be reset, because no session var name was provided.',
1119
-                    'event_espresso'
1120
-                ),
1121
-                __FILE__,
1122
-                __FUNCTION__,
1123
-                __LINE__
1124
-            );
1125
-            return false;
1126
-        }
1127
-        $return_value = true;
1128
-        // since $data_to_reset is an array, cycle through the values
1129
-        foreach ($data_to_reset as $reset) {
1130
-            // first check to make sure it is a valid session var
1131
-            if (isset($this->_session_data[ $reset ])) {
1132
-                // then check to make sure it is not a default var
1133
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1134
-                    // remove session var
1135
-                    unset($this->_session_data[ $reset ]);
1136
-                    $this->setSaveState();
1137
-                    if ($show_all_notices) {
1138
-                        EE_Error::add_success(
1139
-                            sprintf(
1140
-                                __('The session variable %s was removed.', 'event_espresso'),
1141
-                                $reset
1142
-                            ),
1143
-                            __FILE__,
1144
-                            __FUNCTION__,
1145
-                            __LINE__
1146
-                        );
1147
-                    }
1148
-                } else {
1149
-                    // yeeeeeeeeerrrrrrrrrrr OUT !!!!
1150
-                    if ($show_all_notices) {
1151
-                        EE_Error::add_error(
1152
-                            sprintf(
1153
-                                __(
1154
-                                    'Sorry! %s is a default session datum and can not be reset.',
1155
-                                    'event_espresso'
1156
-                                ),
1157
-                                $reset
1158
-                            ),
1159
-                            __FILE__,
1160
-                            __FUNCTION__,
1161
-                            __LINE__
1162
-                        );
1163
-                    }
1164
-                    $return_value = false;
1165
-                }
1166
-            } elseif ($show_all_notices) {
1167
-                // oops! that session var does not exist!
1168
-                EE_Error::add_error(
1169
-                    sprintf(
1170
-                        __(
1171
-                            'The session item provided, %s, is invalid or does not exist.',
1172
-                            'event_espresso'
1173
-                        ),
1174
-                        $reset
1175
-                    ),
1176
-                    __FILE__,
1177
-                    __FUNCTION__,
1178
-                    __LINE__
1179
-                );
1180
-                $return_value = false;
1181
-            }
1182
-        } // end of foreach
1183
-        return $return_value;
1184
-    }
1185
-
1186
-
1187
-    /**
1188
-     *   wp_loaded
1189
-     *
1190
-     * @access public
1191
-     * @throws EE_Error
1192
-     * @throws InvalidDataTypeException
1193
-     * @throws InvalidInterfaceException
1194
-     * @throws InvalidArgumentException
1195
-     * @throws ReflectionException
1196
-     */
1197
-    public function wp_loaded()
1198
-    {
1199
-        if ($this->request->requestParamIsSet('clear_session')) {
1200
-            $this->clear_session(__CLASS__, __FUNCTION__);
1201
-        }
1202
-    }
1203
-
1204
-
1205
-    /**
1206
-     * Used to reset the entire object (for tests).
1207
-     *
1208
-     * @since 4.3.0
1209
-     * @throws EE_Error
1210
-     * @throws InvalidDataTypeException
1211
-     * @throws InvalidInterfaceException
1212
-     * @throws InvalidArgumentException
1213
-     * @throws ReflectionException
1214
-     */
1215
-    public function reset_instance()
1216
-    {
1217
-        $this->clear_session();
1218
-        self::$_instance = null;
1219
-    }
1220
-
1221
-
1222
-    public function configure_garbage_collection_filters()
1223
-    {
1224
-        // run old filter we had for controlling session cleanup
1225
-        $expired_session_transient_delete_query_limit = absint(
1226
-            apply_filters(
1227
-                'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1228
-                50
1229
-            )
1230
-        );
1231
-        // is there a value? or one that is different than the default 50 records?
1232
-        if ($expired_session_transient_delete_query_limit === 0) {
1233
-            // hook into TransientCacheStorage in case Session cleanup was turned off
1234
-            add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1235
-        } elseif ($expired_session_transient_delete_query_limit !== 50) {
1236
-            // or use that for the new transient cleanup query limit
1237
-            add_filter(
1238
-                'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1239
-                function () use ($expired_session_transient_delete_query_limit) {
1240
-                    return $expired_session_transient_delete_query_limit;
1241
-                }
1242
-            );
1243
-        }
1244
-    }
1245
-
1246
-
1247
-    /**
1248
-     * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1249
-     * @param $data1
1250
-     * @return string
1251
-     */
1252
-    private function find_serialize_error($data1)
1253
-    {
1254
-        $error = '<pre>';
1255
-        $data2 = preg_replace_callback(
1256
-            '!s:(\d+):"(.*?)";!',
1257
-            function ($match) {
1258
-                return ($match[1] === strlen($match[2]))
1259
-                    ? $match[0]
1260
-                    : 's:'
1261
-                      . strlen($match[2])
1262
-                      . ':"'
1263
-                      . $match[2]
1264
-                      . '";';
1265
-            },
1266
-            $data1
1267
-        );
1268
-        $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1269
-        $error .= $data1 . PHP_EOL;
1270
-        $error .= $data2 . PHP_EOL;
1271
-        for ($i = 0; $i < $max; $i++) {
1272
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1273
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1274
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1275
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1276
-                $start = ($i - 20);
1277
-                $start = ($start < 0) ? 0 : $start;
1278
-                $length = 40;
1279
-                $point = $max - $i;
1280
-                if ($point < 20) {
1281
-                    $rlength = 1;
1282
-                    $rpoint = -$point;
1283
-                } else {
1284
-                    $rpoint = $length - 20;
1285
-                    $rlength = 1;
1286
-                }
1287
-                $error .= "\t-> Section Data1  = ";
1288
-                $error .= substr_replace(
1289
-                    substr($data1, $start, $length),
1290
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1291
-                    $rpoint,
1292
-                    $rlength
1293
-                );
1294
-                $error .= PHP_EOL;
1295
-                $error .= "\t-> Section Data2  = ";
1296
-                $error .= substr_replace(
1297
-                    substr($data2, $start, $length),
1298
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1299
-                    $rpoint,
1300
-                    $rlength
1301
-                );
1302
-                $error .= PHP_EOL;
1303
-            }
1304
-        }
1305
-        $error .= '</pre>';
1306
-        return $error;
1307
-    }
1308
-
1309
-
1310
-    /**
1311
-     * Saves an  array of settings used for configuring aspects of session behaviour
1312
-     *
1313
-     * @param array $updated_settings
1314
-     */
1315
-    private function updateSessionSettings(array $updated_settings = array())
1316
-    {
1317
-        // add existing settings, but only if not included in incoming $updated_settings array
1318
-        $updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1319
-        update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1320
-    }
1321
-
1322
-
1323
-    /**
1324
-     * garbage_collection
1325
-     */
1326
-    public function garbageCollection()
1327
-    {
1328
-        // only perform during regular requests if last garbage collection was over an hour ago
1329
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1330
-            $this->_last_gc = time();
1331
-            $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1332
-            /** @type WPDB $wpdb */
1333
-            global $wpdb;
1334
-            // filter the query limit. Set to 0 to turn off garbage collection
1335
-            $expired_session_transient_delete_query_limit = absint(
1336
-                apply_filters(
1337
-                    'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1338
-                    50
1339
-                )
1340
-            );
1341
-            // non-zero LIMIT means take out the trash
1342
-            if ($expired_session_transient_delete_query_limit) {
1343
-                $session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1344
-                $hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1345
-                // since transient expiration timestamps are set in the future, we can compare against NOW
1346
-                // but we only want to pick up any trash that's been around for more than a day
1347
-                $expiration = time() - DAY_IN_SECONDS;
1348
-                $SQL = "
1088
+		do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1089
+		$this->reset_cart();
1090
+		$this->reset_checkout();
1091
+		$this->reset_transaction();
1092
+		// wipe out everything that isn't a default session datum
1093
+		$this->reset_data(array_keys($this->_session_data));
1094
+		// reset initial site access time and the session expiration
1095
+		$this->_set_init_access_and_expiration();
1096
+		$this->setSaveState();
1097
+		$this->_save_session_to_db(true);
1098
+	}
1099
+
1100
+
1101
+	/**
1102
+	 * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1103
+	 *
1104
+	 * @param array|mixed $data_to_reset
1105
+	 * @param bool        $show_all_notices
1106
+	 * @return bool
1107
+	 */
1108
+	public function reset_data($data_to_reset = array(), $show_all_notices = false)
1109
+	{
1110
+		// if $data_to_reset is not in an array, then put it in one
1111
+		if (! is_array($data_to_reset)) {
1112
+			$data_to_reset = array($data_to_reset);
1113
+		}
1114
+		// nothing ??? go home!
1115
+		if (empty($data_to_reset)) {
1116
+			EE_Error::add_error(
1117
+				__(
1118
+					'No session data could be reset, because no session var name was provided.',
1119
+					'event_espresso'
1120
+				),
1121
+				__FILE__,
1122
+				__FUNCTION__,
1123
+				__LINE__
1124
+			);
1125
+			return false;
1126
+		}
1127
+		$return_value = true;
1128
+		// since $data_to_reset is an array, cycle through the values
1129
+		foreach ($data_to_reset as $reset) {
1130
+			// first check to make sure it is a valid session var
1131
+			if (isset($this->_session_data[ $reset ])) {
1132
+				// then check to make sure it is not a default var
1133
+				if (! array_key_exists($reset, $this->_default_session_vars)) {
1134
+					// remove session var
1135
+					unset($this->_session_data[ $reset ]);
1136
+					$this->setSaveState();
1137
+					if ($show_all_notices) {
1138
+						EE_Error::add_success(
1139
+							sprintf(
1140
+								__('The session variable %s was removed.', 'event_espresso'),
1141
+								$reset
1142
+							),
1143
+							__FILE__,
1144
+							__FUNCTION__,
1145
+							__LINE__
1146
+						);
1147
+					}
1148
+				} else {
1149
+					// yeeeeeeeeerrrrrrrrrrr OUT !!!!
1150
+					if ($show_all_notices) {
1151
+						EE_Error::add_error(
1152
+							sprintf(
1153
+								__(
1154
+									'Sorry! %s is a default session datum and can not be reset.',
1155
+									'event_espresso'
1156
+								),
1157
+								$reset
1158
+							),
1159
+							__FILE__,
1160
+							__FUNCTION__,
1161
+							__LINE__
1162
+						);
1163
+					}
1164
+					$return_value = false;
1165
+				}
1166
+			} elseif ($show_all_notices) {
1167
+				// oops! that session var does not exist!
1168
+				EE_Error::add_error(
1169
+					sprintf(
1170
+						__(
1171
+							'The session item provided, %s, is invalid or does not exist.',
1172
+							'event_espresso'
1173
+						),
1174
+						$reset
1175
+					),
1176
+					__FILE__,
1177
+					__FUNCTION__,
1178
+					__LINE__
1179
+				);
1180
+				$return_value = false;
1181
+			}
1182
+		} // end of foreach
1183
+		return $return_value;
1184
+	}
1185
+
1186
+
1187
+	/**
1188
+	 *   wp_loaded
1189
+	 *
1190
+	 * @access public
1191
+	 * @throws EE_Error
1192
+	 * @throws InvalidDataTypeException
1193
+	 * @throws InvalidInterfaceException
1194
+	 * @throws InvalidArgumentException
1195
+	 * @throws ReflectionException
1196
+	 */
1197
+	public function wp_loaded()
1198
+	{
1199
+		if ($this->request->requestParamIsSet('clear_session')) {
1200
+			$this->clear_session(__CLASS__, __FUNCTION__);
1201
+		}
1202
+	}
1203
+
1204
+
1205
+	/**
1206
+	 * Used to reset the entire object (for tests).
1207
+	 *
1208
+	 * @since 4.3.0
1209
+	 * @throws EE_Error
1210
+	 * @throws InvalidDataTypeException
1211
+	 * @throws InvalidInterfaceException
1212
+	 * @throws InvalidArgumentException
1213
+	 * @throws ReflectionException
1214
+	 */
1215
+	public function reset_instance()
1216
+	{
1217
+		$this->clear_session();
1218
+		self::$_instance = null;
1219
+	}
1220
+
1221
+
1222
+	public function configure_garbage_collection_filters()
1223
+	{
1224
+		// run old filter we had for controlling session cleanup
1225
+		$expired_session_transient_delete_query_limit = absint(
1226
+			apply_filters(
1227
+				'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1228
+				50
1229
+			)
1230
+		);
1231
+		// is there a value? or one that is different than the default 50 records?
1232
+		if ($expired_session_transient_delete_query_limit === 0) {
1233
+			// hook into TransientCacheStorage in case Session cleanup was turned off
1234
+			add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1235
+		} elseif ($expired_session_transient_delete_query_limit !== 50) {
1236
+			// or use that for the new transient cleanup query limit
1237
+			add_filter(
1238
+				'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1239
+				function () use ($expired_session_transient_delete_query_limit) {
1240
+					return $expired_session_transient_delete_query_limit;
1241
+				}
1242
+			);
1243
+		}
1244
+	}
1245
+
1246
+
1247
+	/**
1248
+	 * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1249
+	 * @param $data1
1250
+	 * @return string
1251
+	 */
1252
+	private function find_serialize_error($data1)
1253
+	{
1254
+		$error = '<pre>';
1255
+		$data2 = preg_replace_callback(
1256
+			'!s:(\d+):"(.*?)";!',
1257
+			function ($match) {
1258
+				return ($match[1] === strlen($match[2]))
1259
+					? $match[0]
1260
+					: 's:'
1261
+					  . strlen($match[2])
1262
+					  . ':"'
1263
+					  . $match[2]
1264
+					  . '";';
1265
+			},
1266
+			$data1
1267
+		);
1268
+		$max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1269
+		$error .= $data1 . PHP_EOL;
1270
+		$error .= $data2 . PHP_EOL;
1271
+		for ($i = 0; $i < $max; $i++) {
1272
+			if (@$data1[ $i ] !== @$data2[ $i ]) {
1273
+				$error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1274
+				$error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1275
+				$error .= "\t-> Line Number = $i" . PHP_EOL;
1276
+				$start = ($i - 20);
1277
+				$start = ($start < 0) ? 0 : $start;
1278
+				$length = 40;
1279
+				$point = $max - $i;
1280
+				if ($point < 20) {
1281
+					$rlength = 1;
1282
+					$rpoint = -$point;
1283
+				} else {
1284
+					$rpoint = $length - 20;
1285
+					$rlength = 1;
1286
+				}
1287
+				$error .= "\t-> Section Data1  = ";
1288
+				$error .= substr_replace(
1289
+					substr($data1, $start, $length),
1290
+					"<b style=\"color:green\">{$data1[ $i ]}</b>",
1291
+					$rpoint,
1292
+					$rlength
1293
+				);
1294
+				$error .= PHP_EOL;
1295
+				$error .= "\t-> Section Data2  = ";
1296
+				$error .= substr_replace(
1297
+					substr($data2, $start, $length),
1298
+					"<b style=\"color:red\">{$data2[ $i ]}</b>",
1299
+					$rpoint,
1300
+					$rlength
1301
+				);
1302
+				$error .= PHP_EOL;
1303
+			}
1304
+		}
1305
+		$error .= '</pre>';
1306
+		return $error;
1307
+	}
1308
+
1309
+
1310
+	/**
1311
+	 * Saves an  array of settings used for configuring aspects of session behaviour
1312
+	 *
1313
+	 * @param array $updated_settings
1314
+	 */
1315
+	private function updateSessionSettings(array $updated_settings = array())
1316
+	{
1317
+		// add existing settings, but only if not included in incoming $updated_settings array
1318
+		$updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1319
+		update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1320
+	}
1321
+
1322
+
1323
+	/**
1324
+	 * garbage_collection
1325
+	 */
1326
+	public function garbageCollection()
1327
+	{
1328
+		// only perform during regular requests if last garbage collection was over an hour ago
1329
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1330
+			$this->_last_gc = time();
1331
+			$this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1332
+			/** @type WPDB $wpdb */
1333
+			global $wpdb;
1334
+			// filter the query limit. Set to 0 to turn off garbage collection
1335
+			$expired_session_transient_delete_query_limit = absint(
1336
+				apply_filters(
1337
+					'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1338
+					50
1339
+				)
1340
+			);
1341
+			// non-zero LIMIT means take out the trash
1342
+			if ($expired_session_transient_delete_query_limit) {
1343
+				$session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1344
+				$hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1345
+				// since transient expiration timestamps are set in the future, we can compare against NOW
1346
+				// but we only want to pick up any trash that's been around for more than a day
1347
+				$expiration = time() - DAY_IN_SECONDS;
1348
+				$SQL = "
1349 1349
                     SELECT option_name
1350 1350
                     FROM {$wpdb->options}
1351 1351
                     WHERE
@@ -1354,17 +1354,17 @@  discard block
 block discarded – undo
1354 1354
                     AND option_value < {$expiration}
1355 1355
                     LIMIT {$expired_session_transient_delete_query_limit}
1356 1356
                 ";
1357
-                // produces something like:
1358
-                // SELECT option_name FROM wp_options
1359
-                // WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1360
-                // OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1361
-                // AND option_value < 1508368198 LIMIT 50
1362
-                $expired_sessions = $wpdb->get_col($SQL);
1363
-                // valid results?
1364
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1365
-                    $this->cache_storage->deleteMany($expired_sessions, true);
1366
-                }
1367
-            }
1368
-        }
1369
-    }
1357
+				// produces something like:
1358
+				// SELECT option_name FROM wp_options
1359
+				// WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1360
+				// OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1361
+				// AND option_value < 1508368198 LIMIT 50
1362
+				$expired_sessions = $wpdb->get_col($SQL);
1363
+				// valid results?
1364
+				if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1365
+					$this->cache_storage->deleteMany($expired_sessions, true);
1366
+				}
1367
+			}
1368
+		}
1369
+	}
1370 1370
 }
Please login to merge, or discard this patch.
Spacing   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -246,22 +246,22 @@  discard block
 block discarded – undo
246 246
         // but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
247 247
         // (which currently fires on the init hook at priority 9),
248 248
         // can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
249
-        if (! apply_filters('FHEE_load_EE_Session', true)) {
249
+        if ( ! apply_filters('FHEE_load_EE_Session', true)) {
250 250
             return;
251 251
         }
252 252
         $this->session_start_handler = $session_start_handler;
253 253
         $this->session_lifespan = $lifespan;
254 254
         $this->request = $request;
255
-        if (! defined('ESPRESSO_SESSION')) {
255
+        if ( ! defined('ESPRESSO_SESSION')) {
256 256
             define('ESPRESSO_SESSION', true);
257 257
         }
258 258
         // retrieve session options from db
259 259
         $session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
260
-        if (! empty($session_settings)) {
260
+        if ( ! empty($session_settings)) {
261 261
             // cycle though existing session options
262 262
             foreach ($session_settings as $var_name => $session_setting) {
263 263
                 // set values for class properties
264
-                $var_name = '_' . $var_name;
264
+                $var_name = '_'.$var_name;
265 265
                 $this->{$var_name} = $session_setting;
266 266
             }
267 267
         }
@@ -322,7 +322,7 @@  discard block
 block discarded – undo
322 322
     public function open_session()
323 323
     {
324 324
         // check for existing session and retrieve it from db
325
-        if (! $this->_espresso_session()) {
325
+        if ( ! $this->_espresso_session()) {
326 326
             // or just start a new one
327 327
             $this->_create_espresso_session();
328 328
         }
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
             EE_Session::SAVE_STATE_CLEAN,
400 400
             EE_Session::SAVE_STATE_DIRTY,
401 401
         ];
402
-        if (! in_array($save_state, $valid_save_states, true)) {
402
+        if ( ! in_array($save_state, $valid_save_states, true)) {
403 403
             $save_state = EE_Session::SAVE_STATE_DIRTY;
404 404
         }
405 405
         $this->save_state = $save_state;
@@ -418,9 +418,9 @@  discard block
 block discarded – undo
418 418
         // set some defaults
419 419
         foreach ($this->_default_session_vars as $key => $default_var) {
420 420
             if (is_array($default_var)) {
421
-                $this->_session_data[ $key ] = array();
421
+                $this->_session_data[$key] = array();
422 422
             } else {
423
-                $this->_session_data[ $key ] = '';
423
+                $this->_session_data[$key] = '';
424 424
             }
425 425
         }
426 426
     }
@@ -557,8 +557,8 @@  discard block
 block discarded – undo
557 557
             $this->reset_checkout();
558 558
             $this->reset_transaction();
559 559
         }
560
-        if (! empty($key)) {
561
-            return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
560
+        if ( ! empty($key)) {
561
+            return isset($this->_session_data[$key]) ? $this->_session_data[$key] : null;
562 562
         }
563 563
         return $this->_session_data;
564 564
     }
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
             return false;
587 587
         }
588 588
         foreach ($data as $key => $value) {
589
-            if (isset($this->_default_session_vars[ $key ])) {
589
+            if (isset($this->_default_session_vars[$key])) {
590 590
                 EE_Error::add_error(
591 591
                     sprintf(
592 592
                         esc_html__(
@@ -601,7 +601,7 @@  discard block
 block discarded – undo
601 601
                 );
602 602
                 return false;
603 603
             }
604
-            $this->_session_data[ $key ] = $value;
604
+            $this->_session_data[$key] = $value;
605 605
             $this->setSaveState();
606 606
         }
607 607
         return true;
@@ -633,7 +633,7 @@  discard block
 block discarded – undo
633 633
         $this->_user_agent = $this->request->userAgent();
634 634
         // now let's retrieve what's in the db
635 635
         $session_data = $this->_retrieve_session_data();
636
-        if (! empty($session_data)) {
636
+        if ( ! empty($session_data)) {
637 637
             // get the current time in UTC
638 638
             $this->_time = $this->_time !== null ? $this->_time : time();
639 639
             // and reset the session expiration
@@ -644,7 +644,7 @@  discard block
 block discarded – undo
644 644
             // set initial site access time and the session expiration
645 645
             $this->_set_init_access_and_expiration();
646 646
             // set referer
647
-            $this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
647
+            $this->_session_data['pages_visited'][$this->_session_data['init_access']] = isset($_SERVER['HTTP_REFERER'])
648 648
                 ? esc_attr($_SERVER['HTTP_REFERER'])
649 649
                 : '';
650 650
             // no previous session = go back and create one (on top of the data above)
@@ -682,7 +682,7 @@  discard block
 block discarded – undo
682 682
      */
683 683
     protected function _retrieve_session_data()
684 684
     {
685
-        $ssn_key = EE_Session::session_id_prefix . $this->_sid;
685
+        $ssn_key = EE_Session::session_id_prefix.$this->_sid;
686 686
         try {
687 687
             // we're using WP's Transient API to store session data using the PHP session ID as the option name
688 688
             $session_data = $this->cache_storage->get($ssn_key, false);
@@ -691,7 +691,7 @@  discard block
 block discarded – undo
691 691
             }
692 692
             if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
693 693
                 $hash_check = $this->cache_storage->get(
694
-                    EE_Session::hash_check_prefix . $this->_sid,
694
+                    EE_Session::hash_check_prefix.$this->_sid,
695 695
                     false
696 696
                 );
697 697
                 if ($hash_check && $hash_check !== md5($session_data)) {
@@ -701,7 +701,7 @@  discard block
 block discarded – undo
701 701
                                 'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
702 702
                                 'event_espresso'
703 703
                             ),
704
-                            EE_Session::session_id_prefix . $this->_sid
704
+                            EE_Session::session_id_prefix.$this->_sid
705 705
                         ),
706 706
                         __FILE__,
707 707
                         __FUNCTION__,
@@ -715,17 +715,17 @@  discard block
 block discarded – undo
715 715
             $row = $wpdb->get_row(
716 716
                 $wpdb->prepare(
717 717
                     "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
718
-                    '_transient_' . $ssn_key
718
+                    '_transient_'.$ssn_key
719 719
                 )
720 720
             );
721 721
             $session_data = is_object($row) ? $row->option_value : null;
722 722
             if ($session_data) {
723 723
                 $session_data = preg_replace_callback(
724 724
                     '!s:(d+):"(.*?)";!',
725
-                    function ($match) {
725
+                    function($match) {
726 726
                         return $match[1] === strlen($match[2])
727 727
                             ? $match[0]
728
-                            : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
728
+                            : 's:'.strlen($match[2]).':"'.$match[2].'";';
729 729
                     },
730 730
                     $session_data
731 731
                 );
@@ -736,7 +736,7 @@  discard block
 block discarded – undo
736 736
         $session_data = $this->encryption instanceof EE_Encryption
737 737
             ? $this->encryption->base64_string_decode($session_data)
738 738
             : $session_data;
739
-        if (! is_array($session_data)) {
739
+        if ( ! is_array($session_data)) {
740 740
             try {
741 741
                 $session_data = maybe_unserialize($session_data);
742 742
             } catch (Exception $e) {
@@ -750,21 +750,21 @@  discard block
 block discarded – undo
750 750
                       . '</pre><br>'
751 751
                       . $this->find_serialize_error($session_data)
752 752
                     : '';
753
-                $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
753
+                $this->cache_storage->delete(EE_Session::session_id_prefix.$this->_sid);
754 754
                 throw new InvalidSessionDataException($msg, 0, $e);
755 755
             }
756 756
         }
757 757
         // just a check to make sure the session array is indeed an array
758
-        if (! is_array($session_data)) {
758
+        if ( ! is_array($session_data)) {
759 759
             // no?!?! then something is wrong
760 760
             $msg = esc_html__(
761 761
                 'The session data is missing, invalid, or corrupted.',
762 762
                 'event_espresso'
763 763
             );
764 764
             $msg .= WP_DEBUG
765
-                ? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
765
+                ? '<br><pre>'.print_r($session_data, true).'</pre><br>'.$this->find_serialize_error($session_data)
766 766
                 : '';
767
-            $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
767
+            $this->cache_storage->delete(EE_Session::session_id_prefix.$this->_sid);
768 768
             throw new InvalidSessionDataException($msg);
769 769
         }
770 770
         if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
@@ -791,7 +791,7 @@  discard block
 block discarded – undo
791 791
         if (isset($_REQUEST['EESID'])) {
792 792
             $session_id = sanitize_text_field($_REQUEST['EESID']);
793 793
         } else {
794
-            $session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
794
+            $session_id = md5(session_id().get_current_blog_id().$this->_get_sid_salt());
795 795
         }
796 796
         return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
797 797
     }
@@ -895,19 +895,19 @@  discard block
 block discarded – undo
895 895
                     $page_visit = $this->_get_page_visit();
896 896
                     if ($page_visit) {
897 897
                         // set pages visited where the first will be the http referrer
898
-                        $this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
898
+                        $this->_session_data['pages_visited'][$this->_time] = $page_visit;
899 899
                         // we'll only save the last 10 page visits.
900 900
                         $session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
901 901
                     }
902 902
                     break;
903 903
                 default:
904 904
                     // carry any other data over
905
-                    $session_data[ $key ] = $this->_session_data[ $key ];
905
+                    $session_data[$key] = $this->_session_data[$key];
906 906
             }
907 907
         }
908 908
         $this->_session_data = $session_data;
909 909
         // creating a new session does not require saving to the db just yet
910
-        if (! $new_session) {
910
+        if ( ! $new_session) {
911 911
             // ready? let's save
912 912
             if ($this->_save_session_to_db()) {
913 913
                 return true;
@@ -986,7 +986,7 @@  discard block
 block discarded – undo
986 986
         }
987 987
         $transaction = $this->transaction();
988 988
         if ($transaction instanceof EE_Transaction) {
989
-            if (! $transaction->ID()) {
989
+            if ( ! $transaction->ID()) {
990 990
                 $transaction->save();
991 991
             }
992 992
             $this->_session_data['transaction'] = $transaction->ID();
@@ -1000,14 +1000,14 @@  discard block
 block discarded – undo
1000 1000
         // maybe save hash check
1001 1001
         if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
1002 1002
             $this->cache_storage->add(
1003
-                EE_Session::hash_check_prefix . $this->_sid,
1003
+                EE_Session::hash_check_prefix.$this->_sid,
1004 1004
                 md5($session_data),
1005 1005
                 $this->session_lifespan->inSeconds()
1006 1006
             );
1007 1007
         }
1008 1008
         // we're using the Transient API for storing session data,
1009 1009
         $saved = $this->cache_storage->add(
1010
-            EE_Session::session_id_prefix . $this->_sid,
1010
+            EE_Session::session_id_prefix.$this->_sid,
1011 1011
             $session_data,
1012 1012
             $this->session_lifespan->inSeconds()
1013 1013
         );
@@ -1023,7 +1023,7 @@  discard block
 block discarded – undo
1023 1023
      */
1024 1024
     public function _get_page_visit()
1025 1025
     {
1026
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
1026
+        $page_visit = home_url('/').'wp-admin/admin-ajax.php';
1027 1027
         // check for request url
1028 1028
         if (isset($_SERVER['REQUEST_URI'])) {
1029 1029
             $http_host = '';
@@ -1039,14 +1039,14 @@  discard block
 block discarded – undo
1039 1039
             // check for page_id in SERVER REQUEST
1040 1040
             if (isset($_REQUEST['page_id'])) {
1041 1041
                 // rebuild $e_reg without any of the extra parameters
1042
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
1042
+                $page_id = '?page_id='.esc_attr($_REQUEST['page_id']).'&amp;';
1043 1043
             }
1044 1044
             // check for $e_reg in SERVER REQUEST
1045 1045
             if (isset($_REQUEST['ee'])) {
1046 1046
                 // rebuild $e_reg without any of the extra parameters
1047
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
1047
+                $e_reg = 'ee='.esc_attr($_REQUEST['ee']);
1048 1048
             }
1049
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
1049
+            $page_visit = rtrim($http_host.$request_uri.$page_id.$e_reg, '?');
1050 1050
         }
1051 1051
         return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
1052 1052
     }
@@ -1085,7 +1085,7 @@  discard block
 block discarded – undo
1085 1085
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
1086 1086
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
1087 1087
 // </h3>';
1088
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1088
+        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : '.$class.'::'.$function.'()');
1089 1089
         $this->reset_cart();
1090 1090
         $this->reset_checkout();
1091 1091
         $this->reset_transaction();
@@ -1108,7 +1108,7 @@  discard block
 block discarded – undo
1108 1108
     public function reset_data($data_to_reset = array(), $show_all_notices = false)
1109 1109
     {
1110 1110
         // if $data_to_reset is not in an array, then put it in one
1111
-        if (! is_array($data_to_reset)) {
1111
+        if ( ! is_array($data_to_reset)) {
1112 1112
             $data_to_reset = array($data_to_reset);
1113 1113
         }
1114 1114
         // nothing ??? go home!
@@ -1128,11 +1128,11 @@  discard block
 block discarded – undo
1128 1128
         // since $data_to_reset is an array, cycle through the values
1129 1129
         foreach ($data_to_reset as $reset) {
1130 1130
             // first check to make sure it is a valid session var
1131
-            if (isset($this->_session_data[ $reset ])) {
1131
+            if (isset($this->_session_data[$reset])) {
1132 1132
                 // then check to make sure it is not a default var
1133
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1133
+                if ( ! array_key_exists($reset, $this->_default_session_vars)) {
1134 1134
                     // remove session var
1135
-                    unset($this->_session_data[ $reset ]);
1135
+                    unset($this->_session_data[$reset]);
1136 1136
                     $this->setSaveState();
1137 1137
                     if ($show_all_notices) {
1138 1138
                         EE_Error::add_success(
@@ -1236,7 +1236,7 @@  discard block
 block discarded – undo
1236 1236
             // or use that for the new transient cleanup query limit
1237 1237
             add_filter(
1238 1238
                 'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1239
-                function () use ($expired_session_transient_delete_query_limit) {
1239
+                function() use ($expired_session_transient_delete_query_limit) {
1240 1240
                     return $expired_session_transient_delete_query_limit;
1241 1241
                 }
1242 1242
             );
@@ -1254,7 +1254,7 @@  discard block
 block discarded – undo
1254 1254
         $error = '<pre>';
1255 1255
         $data2 = preg_replace_callback(
1256 1256
             '!s:(\d+):"(.*?)";!',
1257
-            function ($match) {
1257
+            function($match) {
1258 1258
                 return ($match[1] === strlen($match[2]))
1259 1259
                     ? $match[0]
1260 1260
                     : 's:'
@@ -1266,13 +1266,13 @@  discard block
 block discarded – undo
1266 1266
             $data1
1267 1267
         );
1268 1268
         $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1269
-        $error .= $data1 . PHP_EOL;
1270
-        $error .= $data2 . PHP_EOL;
1269
+        $error .= $data1.PHP_EOL;
1270
+        $error .= $data2.PHP_EOL;
1271 1271
         for ($i = 0; $i < $max; $i++) {
1272
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1273
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1274
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1275
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1272
+            if (@$data1[$i] !== @$data2[$i]) {
1273
+                $error .= 'Difference '.@$data1[$i].' != '.@$data2[$i].PHP_EOL;
1274
+                $error .= "\t-> ORD number ".ord(@$data1[$i]).' != '.ord(@$data2[$i]).PHP_EOL;
1275
+                $error .= "\t-> Line Number = $i".PHP_EOL;
1276 1276
                 $start = ($i - 20);
1277 1277
                 $start = ($start < 0) ? 0 : $start;
1278 1278
                 $length = 40;
@@ -1287,7 +1287,7 @@  discard block
 block discarded – undo
1287 1287
                 $error .= "\t-> Section Data1  = ";
1288 1288
                 $error .= substr_replace(
1289 1289
                     substr($data1, $start, $length),
1290
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1290
+                    "<b style=\"color:green\">{$data1[$i]}</b>",
1291 1291
                     $rpoint,
1292 1292
                     $rlength
1293 1293
                 );
@@ -1295,7 +1295,7 @@  discard block
 block discarded – undo
1295 1295
                 $error .= "\t-> Section Data2  = ";
1296 1296
                 $error .= substr_replace(
1297 1297
                     substr($data2, $start, $length),
1298
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1298
+                    "<b style=\"color:red\">{$data2[$i]}</b>",
1299 1299
                     $rpoint,
1300 1300
                     $rlength
1301 1301
                 );
@@ -1326,7 +1326,7 @@  discard block
 block discarded – undo
1326 1326
     public function garbageCollection()
1327 1327
     {
1328 1328
         // only perform during regular requests if last garbage collection was over an hour ago
1329
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1329
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1330 1330
             $this->_last_gc = time();
1331 1331
             $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1332 1332
             /** @type WPDB $wpdb */
@@ -1361,7 +1361,7 @@  discard block
 block discarded – undo
1361 1361
                 // AND option_value < 1508368198 LIMIT 50
1362 1362
                 $expired_sessions = $wpdb->get_col($SQL);
1363 1363
                 // valid results?
1364
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1364
+                if ( ! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1365 1365
                     $this->cache_storage->deleteMany($expired_sessions, true);
1366 1366
                 }
1367 1367
             }
Please login to merge, or discard this patch.
core/middleware/EE_Detect_File_Editor_Request.core.php 1 patch
Indentation   +23 added lines, -23 removed lines patch added patch discarded remove patch
@@ -14,28 +14,28 @@
 block discarded – undo
14 14
 class EE_Detect_File_Editor_Request extends EE_Middleware
15 15
 {
16 16
 
17
-    /**
18
-     * @deprecated
19
-     * @param EE_Request  $request
20
-     * @param EE_Response $response
21
-     * @return EE_Response
22
-     */
23
-    public function handle_request(EE_Request $request, EE_Response $response)
24
-    {
25
-        EE_Error::doing_it_wrong(
26
-            __METHOD__,
27
-            sprintf(
28
-                esc_html__(
29
-                    'This class is deprecated. Please use %1$s instead. All Event Espresso request stack classes have been moved to %2$s and are now under the %3$s namespace',
30
-                    'event_espresso'
31
-                ),
32
-                'EventEspresso\core\services\request\middleware\DetectFileEditorRequest',
33
-                '\core\services\request',
34
-                'EventEspresso\core\services\request'
35
-            ),
36
-            '4.9.52'
37
-        );
38
-        return $response;
39
-    }
17
+	/**
18
+	 * @deprecated
19
+	 * @param EE_Request  $request
20
+	 * @param EE_Response $response
21
+	 * @return EE_Response
22
+	 */
23
+	public function handle_request(EE_Request $request, EE_Response $response)
24
+	{
25
+		EE_Error::doing_it_wrong(
26
+			__METHOD__,
27
+			sprintf(
28
+				esc_html__(
29
+					'This class is deprecated. Please use %1$s instead. All Event Espresso request stack classes have been moved to %2$s and are now under the %3$s namespace',
30
+					'event_espresso'
31
+				),
32
+				'EventEspresso\core\services\request\middleware\DetectFileEditorRequest',
33
+				'\core\services\request',
34
+				'EventEspresso\core\services\request'
35
+			),
36
+			'4.9.52'
37
+		);
38
+		return $response;
39
+	}
40 40
 
41 41
 }
Please login to merge, or discard this patch.
core/services/loaders/Loader.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -101,7 +101,7 @@
 block discarded – undo
101 101
 
102 102
 
103 103
     /**
104
-     * @param FullyQualifiedName|string $fqcn
104
+     * @param string $fqcn
105 105
      * @param array                     $arguments
106 106
      * @return mixed
107 107
      */
Please login to merge, or discard this patch.
Indentation   +112 added lines, -112 removed lines patch added patch discarded remove patch
@@ -15,116 +15,116 @@
 block discarded – undo
15 15
 class Loader implements LoaderInterface
16 16
 {
17 17
 
18
-    /**
19
-     * @var LoaderDecoratorInterface $new_loader
20
-     */
21
-    private $new_loader;
22
-
23
-    /**
24
-     * @var LoaderDecoratorInterface $shared_loader
25
-     */
26
-    private $shared_loader;
27
-
28
-    /**
29
-     * @var ClassInterfaceCache $class_cache
30
-     */
31
-    private $class_cache;
32
-
33
-    /**
34
-     * Loader constructor.
35
-     *
36
-     * @param LoaderDecoratorInterface        $new_loader
37
-     * @param CachingLoaderDecoratorInterface $shared_loader
38
-     * @param ClassInterfaceCache             $class_cache
39
-     */
40
-    public function __construct(
41
-        LoaderDecoratorInterface $new_loader,
42
-        CachingLoaderDecoratorInterface $shared_loader,
43
-        ClassInterfaceCache $class_cache
44
-    ) {
45
-        $this->new_loader    = $new_loader;
46
-        $this->shared_loader = $shared_loader;
47
-        $this->class_cache   = $class_cache;
48
-    }
49
-
50
-
51
-    /**
52
-     * @return LoaderDecoratorInterface
53
-     */
54
-    public function getNewLoader()
55
-    {
56
-        return $this->new_loader;
57
-    }
58
-
59
-
60
-    /**
61
-     * @return CachingLoaderDecoratorInterface
62
-     */
63
-    public function getSharedLoader()
64
-    {
65
-        return $this->shared_loader;
66
-    }
67
-
68
-
69
-    /**
70
-     * @param FullyQualifiedName|string $fqcn
71
-     * @param array                     $arguments
72
-     * @param bool                      $shared
73
-     * @return mixed
74
-     */
75
-    public function load($fqcn, array $arguments = array(), $shared = true)
76
-    {
77
-        $fqcn = $this->class_cache->getFqn($fqcn);
78
-        if ($this->class_cache->hasInterface($fqcn, 'EventEspresso\core\interfaces\ReservedInstanceInterface')) {
79
-            $shared = true;
80
-        }
81
-        return $shared
82
-            ? $this->getSharedLoader()->load($fqcn, $arguments, $shared)
83
-            : $this->getNewLoader()->load($fqcn, $arguments, $shared);
84
-    }
85
-
86
-
87
-    /**
88
-     * @param FullyQualifiedName|string $fqcn
89
-     * @param array                     $arguments
90
-     * @return mixed
91
-     */
92
-    public function getNew($fqcn, array $arguments = array())
93
-    {
94
-        return $this->load($fqcn, $arguments, false);
95
-    }
96
-
97
-
98
-    /**
99
-     * @param FullyQualifiedName|string $fqcn
100
-     * @param array                     $arguments
101
-     * @return mixed
102
-     */
103
-    public function getShared($fqcn, array $arguments = array())
104
-    {
105
-        return $this->load($fqcn, $arguments);
106
-    }
107
-
108
-
109
-    /**
110
-     * @param FullyQualifiedName|string $fqcn
111
-     * @param mixed                     $object
112
-     * @param array                     $arguments
113
-     * @return bool
114
-     * @throws InvalidArgumentException
115
-     */
116
-    public function share($fqcn, $object, array $arguments = [])
117
-    {
118
-        $fqcn = $this->class_cache->getFqn($fqcn);
119
-        return $this->getSharedLoader()->share($fqcn, $object, $arguments);
120
-    }
121
-
122
-
123
-    /**
124
-     * calls reset() on loaders if that method exists
125
-     */
126
-    public function reset()
127
-    {
128
-        $this->shared_loader->reset();
129
-    }
18
+	/**
19
+	 * @var LoaderDecoratorInterface $new_loader
20
+	 */
21
+	private $new_loader;
22
+
23
+	/**
24
+	 * @var LoaderDecoratorInterface $shared_loader
25
+	 */
26
+	private $shared_loader;
27
+
28
+	/**
29
+	 * @var ClassInterfaceCache $class_cache
30
+	 */
31
+	private $class_cache;
32
+
33
+	/**
34
+	 * Loader constructor.
35
+	 *
36
+	 * @param LoaderDecoratorInterface        $new_loader
37
+	 * @param CachingLoaderDecoratorInterface $shared_loader
38
+	 * @param ClassInterfaceCache             $class_cache
39
+	 */
40
+	public function __construct(
41
+		LoaderDecoratorInterface $new_loader,
42
+		CachingLoaderDecoratorInterface $shared_loader,
43
+		ClassInterfaceCache $class_cache
44
+	) {
45
+		$this->new_loader    = $new_loader;
46
+		$this->shared_loader = $shared_loader;
47
+		$this->class_cache   = $class_cache;
48
+	}
49
+
50
+
51
+	/**
52
+	 * @return LoaderDecoratorInterface
53
+	 */
54
+	public function getNewLoader()
55
+	{
56
+		return $this->new_loader;
57
+	}
58
+
59
+
60
+	/**
61
+	 * @return CachingLoaderDecoratorInterface
62
+	 */
63
+	public function getSharedLoader()
64
+	{
65
+		return $this->shared_loader;
66
+	}
67
+
68
+
69
+	/**
70
+	 * @param FullyQualifiedName|string $fqcn
71
+	 * @param array                     $arguments
72
+	 * @param bool                      $shared
73
+	 * @return mixed
74
+	 */
75
+	public function load($fqcn, array $arguments = array(), $shared = true)
76
+	{
77
+		$fqcn = $this->class_cache->getFqn($fqcn);
78
+		if ($this->class_cache->hasInterface($fqcn, 'EventEspresso\core\interfaces\ReservedInstanceInterface')) {
79
+			$shared = true;
80
+		}
81
+		return $shared
82
+			? $this->getSharedLoader()->load($fqcn, $arguments, $shared)
83
+			: $this->getNewLoader()->load($fqcn, $arguments, $shared);
84
+	}
85
+
86
+
87
+	/**
88
+	 * @param FullyQualifiedName|string $fqcn
89
+	 * @param array                     $arguments
90
+	 * @return mixed
91
+	 */
92
+	public function getNew($fqcn, array $arguments = array())
93
+	{
94
+		return $this->load($fqcn, $arguments, false);
95
+	}
96
+
97
+
98
+	/**
99
+	 * @param FullyQualifiedName|string $fqcn
100
+	 * @param array                     $arguments
101
+	 * @return mixed
102
+	 */
103
+	public function getShared($fqcn, array $arguments = array())
104
+	{
105
+		return $this->load($fqcn, $arguments);
106
+	}
107
+
108
+
109
+	/**
110
+	 * @param FullyQualifiedName|string $fqcn
111
+	 * @param mixed                     $object
112
+	 * @param array                     $arguments
113
+	 * @return bool
114
+	 * @throws InvalidArgumentException
115
+	 */
116
+	public function share($fqcn, $object, array $arguments = [])
117
+	{
118
+		$fqcn = $this->class_cache->getFqn($fqcn);
119
+		return $this->getSharedLoader()->share($fqcn, $object, $arguments);
120
+	}
121
+
122
+
123
+	/**
124
+	 * calls reset() on loaders if that method exists
125
+	 */
126
+	public function reset()
127
+	{
128
+		$this->shared_loader->reset();
129
+	}
130 130
 }
Please login to merge, or discard this patch.
core/services/bootstrap/BootstrapDependencyInjectionContainer.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -78,13 +78,13 @@
 block discarded – undo
78 78
         // EE_Dependency_Map: info about how to load classes required by other classes
79 79
         espresso_load_required(
80 80
             'EE_Dependency_Map',
81
-            EE_CORE . 'EE_Dependency_Map.core.php'
81
+            EE_CORE.'EE_Dependency_Map.core.php'
82 82
         );
83 83
         $this->dependency_map = EE_Dependency_Map::instance($this->class_cache);
84 84
         // EE_Registry: central repository for classes (legacy)
85 85
         espresso_load_required(
86 86
             'EE_Registry',
87
-            EE_CORE . 'EE_Registry.core.php'
87
+            EE_CORE.'EE_Registry.core.php'
88 88
         );
89 89
         $this->registry = EE_Registry::instance(
90 90
             $this->dependency_map,
Please login to merge, or discard this patch.
Indentation   +119 added lines, -119 removed lines patch added patch discarded remove patch
@@ -25,123 +25,123 @@
 block discarded – undo
25 25
 class BootstrapDependencyInjectionContainer
26 26
 {
27 27
 
28
-    /**
29
-     * @var EE_Dependency_Map $dependency_map
30
-     */
31
-    protected $dependency_map;
32
-
33
-    /**
34
-     * @type LoaderInterface $loader
35
-     */
36
-    protected $loader;
37
-
38
-    /**
39
-     * @var EE_Registry $registry
40
-     */
41
-    protected $registry;
42
-
43
-    /**
44
-     * @var ClassInterfaceCache $class_cache
45
-     */
46
-    private $class_cache;
47
-
48
-    /**
49
-     * @var Mirror
50
-     */
51
-    private $mirror;
52
-
53
-    /**
54
-     * @var ObjectIdentifier
55
-     */
56
-    private $object_identifier;
57
-
58
-
59
-    /**
60
-     * Can't use this just yet until we exorcise some more of our singleton usage from core
61
-     */
62
-    public function buildDependencyInjectionContainer()
63
-    {
64
-        // build DI container
65
-        // $OpenCoffeeShop = new EventEspresso\core\services\container\OpenCoffeeShop();
66
-        // $OpenCoffeeShop->addRecipes();
67
-        // $CoffeeShop = $OpenCoffeeShop->CoffeeShop();
68
-    }
69
-
70
-
71
-    /**
72
-     * Setups  EE_Registry and EE_Dependency_Map
73
-     *
74
-     * @throws EE_Error
75
-     */
76
-    public function buildLegacyDependencyInjectionContainer()
77
-    {
78
-        $this->class_cache = new ClassInterfaceCache();
79
-        $this->object_identifier = new ObjectIdentifier($this->class_cache);
80
-        $this->mirror = new Mirror();
81
-        // EE_Dependency_Map: info about how to load classes required by other classes
82
-        espresso_load_required(
83
-            'EE_Dependency_Map',
84
-            EE_CORE . 'EE_Dependency_Map.core.php'
85
-        );
86
-        $this->dependency_map = EE_Dependency_Map::instance($this->class_cache);
87
-        // EE_Registry: central repository for classes (legacy)
88
-        espresso_load_required(
89
-            'EE_Registry',
90
-            EE_CORE . 'EE_Registry.core.php'
91
-        );
92
-        $this->registry = EE_Registry::instance(
93
-            $this->dependency_map,
94
-            $this->mirror,
95
-            $this->class_cache,
96
-            $this->object_identifier
97
-        );
98
-    }
99
-
100
-
101
-    /**
102
-     * Performs initial setup for the generic Loader
103
-     *
104
-     * @throws InvalidDataTypeException
105
-     * @throws InvalidInterfaceException
106
-     * @throws InvalidArgumentException
107
-     */
108
-    public function buildLoader()
109
-    {
110
-        $this->loader = LoaderFactory::getLoader(
111
-            $this->registry,
112
-            $this->class_cache,
113
-            $this->object_identifier
114
-        );
115
-        $this->loader->share('EventEspresso\core\services\loaders\ClassInterfaceCache', $this->class_cache);
116
-        $this->loader->share('EventEspresso\core\services\loaders\ObjectIdentifier', $this->object_identifier);
117
-        $this->loader->share('EventEspresso\core\services\container\Mirror', $this->mirror);
118
-        $this->dependency_map->setLoader($this->loader);
119
-    }
120
-
121
-
122
-    /**
123
-     * @return EE_Dependency_Map
124
-     */
125
-    public function getDependencyMap()
126
-    {
127
-        return $this->dependency_map;
128
-    }
129
-
130
-
131
-    /**
132
-     * @return EE_Registry
133
-     */
134
-    public function getRegistry()
135
-    {
136
-        return $this->registry;
137
-    }
138
-
139
-
140
-    /**
141
-     * @return LoaderInterface
142
-     */
143
-    public function getLoader()
144
-    {
145
-        return $this->loader;
146
-    }
28
+	/**
29
+	 * @var EE_Dependency_Map $dependency_map
30
+	 */
31
+	protected $dependency_map;
32
+
33
+	/**
34
+	 * @type LoaderInterface $loader
35
+	 */
36
+	protected $loader;
37
+
38
+	/**
39
+	 * @var EE_Registry $registry
40
+	 */
41
+	protected $registry;
42
+
43
+	/**
44
+	 * @var ClassInterfaceCache $class_cache
45
+	 */
46
+	private $class_cache;
47
+
48
+	/**
49
+	 * @var Mirror
50
+	 */
51
+	private $mirror;
52
+
53
+	/**
54
+	 * @var ObjectIdentifier
55
+	 */
56
+	private $object_identifier;
57
+
58
+
59
+	/**
60
+	 * Can't use this just yet until we exorcise some more of our singleton usage from core
61
+	 */
62
+	public function buildDependencyInjectionContainer()
63
+	{
64
+		// build DI container
65
+		// $OpenCoffeeShop = new EventEspresso\core\services\container\OpenCoffeeShop();
66
+		// $OpenCoffeeShop->addRecipes();
67
+		// $CoffeeShop = $OpenCoffeeShop->CoffeeShop();
68
+	}
69
+
70
+
71
+	/**
72
+	 * Setups  EE_Registry and EE_Dependency_Map
73
+	 *
74
+	 * @throws EE_Error
75
+	 */
76
+	public function buildLegacyDependencyInjectionContainer()
77
+	{
78
+		$this->class_cache = new ClassInterfaceCache();
79
+		$this->object_identifier = new ObjectIdentifier($this->class_cache);
80
+		$this->mirror = new Mirror();
81
+		// EE_Dependency_Map: info about how to load classes required by other classes
82
+		espresso_load_required(
83
+			'EE_Dependency_Map',
84
+			EE_CORE . 'EE_Dependency_Map.core.php'
85
+		);
86
+		$this->dependency_map = EE_Dependency_Map::instance($this->class_cache);
87
+		// EE_Registry: central repository for classes (legacy)
88
+		espresso_load_required(
89
+			'EE_Registry',
90
+			EE_CORE . 'EE_Registry.core.php'
91
+		);
92
+		$this->registry = EE_Registry::instance(
93
+			$this->dependency_map,
94
+			$this->mirror,
95
+			$this->class_cache,
96
+			$this->object_identifier
97
+		);
98
+	}
99
+
100
+
101
+	/**
102
+	 * Performs initial setup for the generic Loader
103
+	 *
104
+	 * @throws InvalidDataTypeException
105
+	 * @throws InvalidInterfaceException
106
+	 * @throws InvalidArgumentException
107
+	 */
108
+	public function buildLoader()
109
+	{
110
+		$this->loader = LoaderFactory::getLoader(
111
+			$this->registry,
112
+			$this->class_cache,
113
+			$this->object_identifier
114
+		);
115
+		$this->loader->share('EventEspresso\core\services\loaders\ClassInterfaceCache', $this->class_cache);
116
+		$this->loader->share('EventEspresso\core\services\loaders\ObjectIdentifier', $this->object_identifier);
117
+		$this->loader->share('EventEspresso\core\services\container\Mirror', $this->mirror);
118
+		$this->dependency_map->setLoader($this->loader);
119
+	}
120
+
121
+
122
+	/**
123
+	 * @return EE_Dependency_Map
124
+	 */
125
+	public function getDependencyMap()
126
+	{
127
+		return $this->dependency_map;
128
+	}
129
+
130
+
131
+	/**
132
+	 * @return EE_Registry
133
+	 */
134
+	public function getRegistry()
135
+	{
136
+		return $this->registry;
137
+	}
138
+
139
+
140
+	/**
141
+	 * @return LoaderInterface
142
+	 */
143
+	public function getLoader()
144
+	{
145
+		return $this->loader;
146
+	}
147 147
 }
Please login to merge, or discard this patch.
core/services/container/Mirror.php 2 patches
Spacing   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -64,13 +64,13 @@  discard block
 block discarded – undo
64 64
      */
65 65
     public function getReflectionClass($class_name)
66 66
     {
67
-        if (! is_string($class_name)) {
67
+        if ( ! is_string($class_name)) {
68 68
             throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
69 69
         }
70
-        if (! isset($this->classes[ $class_name ])) {
71
-            $this->classes[ $class_name ] = new ReflectionClass($class_name);
70
+        if ( ! isset($this->classes[$class_name])) {
71
+            $this->classes[$class_name] = new ReflectionClass($class_name);
72 72
         }
73
-        return $this->classes[ $class_name ];
73
+        return $this->classes[$class_name];
74 74
     }
75 75
 
76 76
 
@@ -82,14 +82,14 @@  discard block
 block discarded – undo
82 82
      */
83 83
     public function getConstructor($class_name)
84 84
     {
85
-        if (! is_string($class_name)) {
85
+        if ( ! is_string($class_name)) {
86 86
             throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
87 87
         }
88
-        if (! isset($this->constructors[ $class_name ])) {
88
+        if ( ! isset($this->constructors[$class_name])) {
89 89
             $reflection_class                  = $this->getReflectionClass($class_name);
90
-            $this->constructors[ $class_name ] = $reflection_class->getConstructor();
90
+            $this->constructors[$class_name] = $reflection_class->getConstructor();
91 91
         }
92
-        return $this->constructors[ $class_name ];
92
+        return $this->constructors[$class_name];
93 93
     }
94 94
 
95 95
 
@@ -113,11 +113,11 @@  discard block
 block discarded – undo
113 113
      */
114 114
     public function getParameters($class_name)
115 115
     {
116
-        if (! isset($this->parameters[ $class_name ])) {
116
+        if ( ! isset($this->parameters[$class_name])) {
117 117
             $constructor                     = $this->getConstructor($class_name);
118
-            $this->parameters[ $class_name ] = $constructor->getParameters();
118
+            $this->parameters[$class_name] = $constructor->getParameters();
119 119
         }
120
-        return $this->parameters[ $class_name ];
120
+        return $this->parameters[$class_name];
121 121
     }
122 122
 
123 123
 
@@ -153,19 +153,19 @@  discard block
 block discarded – undo
153 153
      */
154 154
     public function getParameterClassName(ReflectionParameter $param, $class_name, $index)
155 155
     {
156
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_name'])) {
157
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
156
+        if (isset($this->parameter_classes[$class_name][$index]['param_class_name'])) {
157
+            return $this->parameter_classes[$class_name][$index]['param_class_name'];
158 158
         }
159
-        if (! isset($this->parameter_classes[ $class_name ])) {
160
-            $this->parameter_classes[ $class_name ] = array();
159
+        if ( ! isset($this->parameter_classes[$class_name])) {
160
+            $this->parameter_classes[$class_name] = array();
161 161
         }
162
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
163
-            $this->parameter_classes[ $class_name ][ $index ] = array();
162
+        if ( ! isset($this->parameter_classes[$class_name][$index])) {
163
+            $this->parameter_classes[$class_name][$index] = array();
164 164
         }
165
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_name'] = $param->getClass()
165
+        $this->parameter_classes[$class_name][$index]['param_class_name'] = $param->getClass()
166 166
             ? $param->getClass()->name
167 167
             : null;
168
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
168
+        return $this->parameter_classes[$class_name][$index]['param_class_name'];
169 169
     }
170 170
 
171 171
 
@@ -177,19 +177,19 @@  discard block
 block discarded – undo
177 177
      */
178 178
     public function getParameterDefaultValue(ReflectionParameter $param, $class_name, $index)
179 179
     {
180
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_default'])) {
181
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
180
+        if (isset($this->parameter_classes[$class_name][$index]['param_class_default'])) {
181
+            return $this->parameter_classes[$class_name][$index]['param_class_default'];
182 182
         }
183
-        if (! isset($this->parameter_classes[ $class_name ])) {
184
-            $this->parameter_classes[ $class_name ] = array();
183
+        if ( ! isset($this->parameter_classes[$class_name])) {
184
+            $this->parameter_classes[$class_name] = array();
185 185
         }
186
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
187
-            $this->parameter_classes[ $class_name ][ $index ] = array();
186
+        if ( ! isset($this->parameter_classes[$class_name][$index])) {
187
+            $this->parameter_classes[$class_name][$index] = array();
188 188
         }
189
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_default'] = $param->isDefaultValueAvailable()
189
+        $this->parameter_classes[$class_name][$index]['param_class_default'] = $param->isDefaultValueAvailable()
190 190
             ? $param->getDefaultValue()
191 191
             : null;
192
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
192
+        return $this->parameter_classes[$class_name][$index]['param_class_default'];
193 193
     }
194 194
 
195 195
 
@@ -201,11 +201,11 @@  discard block
 block discarded – undo
201 201
      */
202 202
     public function getProperties($class_name)
203 203
     {
204
-        if (! isset($this->properties[ $class_name ])) {
204
+        if ( ! isset($this->properties[$class_name])) {
205 205
             $reflection_class                = $this->getReflectionClass($class_name);
206
-            $this->properties[ $class_name ] = $reflection_class->getProperties();
206
+            $this->properties[$class_name] = $reflection_class->getProperties();
207 207
         }
208
-        return $this->properties[ $class_name ];
208
+        return $this->properties[$class_name];
209 209
     }
210 210
 
211 211
 
@@ -229,11 +229,11 @@  discard block
 block discarded – undo
229 229
      */
230 230
     public function getMethods($class_name)
231 231
     {
232
-        if (! isset($this->methods[ $class_name ])) {
232
+        if ( ! isset($this->methods[$class_name])) {
233 233
             $reflection_class             = $this->getReflectionClass($class_name);
234
-            $this->methods[ $class_name ] = $reflection_class->getMethods();
234
+            $this->methods[$class_name] = $reflection_class->getMethods();
235 235
         }
236
-        return $this->methods[ $class_name ];
236
+        return $this->methods[$class_name];
237 237
     }
238 238
 
239 239
 
Please login to merge, or discard this patch.
Indentation   +243 added lines, -243 removed lines patch added patch discarded remove patch
@@ -21,247 +21,247 @@
 block discarded – undo
21 21
 class Mirror
22 22
 {
23 23
 
24
-    /**
25
-     * @var ReflectionClass[] $classes
26
-     */
27
-    private $classes = array();
28
-
29
-    /**
30
-     * @var ReflectionMethod[] $constructors
31
-     */
32
-    private $constructors = array();
33
-
34
-    /**
35
-     * @var ReflectionParameter[][] $parameters
36
-     */
37
-    private $parameters = array();
38
-
39
-    /**
40
-     * @var ReflectionParameter[][] $parameters
41
-     */
42
-    private $parameter_classes = array();
43
-
44
-    /**
45
-     * @var ReflectionProperty[][] $properties
46
-     */
47
-    private $properties = array();
48
-
49
-    /**
50
-     * @var ReflectionMethod[][] $methods
51
-     */
52
-    private $methods = array();
53
-
54
-
55
-    /**
56
-     * @param string $class_name
57
-     * @return ReflectionClass
58
-     * @throws ReflectionException
59
-     * @throws InvalidDataTypeException
60
-     */
61
-    public function getReflectionClass($class_name)
62
-    {
63
-        if (! is_string($class_name)) {
64
-            throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
65
-        }
66
-        if (! isset($this->classes[ $class_name ])) {
67
-            $this->classes[ $class_name ] = new ReflectionClass($class_name);
68
-        }
69
-        return $this->classes[ $class_name ];
70
-    }
71
-
72
-
73
-    /**
74
-     * @param string $class_name
75
-     * @return ReflectionMethod
76
-     * @throws InvalidDataTypeException
77
-     * @throws ReflectionException
78
-     */
79
-    public function getConstructor($class_name)
80
-    {
81
-        if (! is_string($class_name)) {
82
-            throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
83
-        }
84
-        if (! isset($this->constructors[ $class_name ])) {
85
-            $reflection_class                  = $this->getReflectionClass($class_name);
86
-            $this->constructors[ $class_name ] = $reflection_class->getConstructor();
87
-        }
88
-        return $this->constructors[ $class_name ];
89
-    }
90
-
91
-
92
-    /**
93
-     * @param ReflectionClass $reflection_class
94
-     * @return ReflectionMethod
95
-     * @throws InvalidDataTypeException
96
-     * @throws ReflectionException
97
-     */
98
-    public function getConstructorFromReflection(ReflectionClass $reflection_class)
99
-    {
100
-        return $this->getConstructor($reflection_class->getName());
101
-    }
102
-
103
-
104
-    /**
105
-     * @param string $class_name
106
-     * @return ReflectionParameter[]
107
-     * @throws InvalidDataTypeException
108
-     * @throws ReflectionException
109
-     */
110
-    public function getParameters($class_name)
111
-    {
112
-        if (! isset($this->parameters[ $class_name ])) {
113
-            $constructor                     = $this->getConstructor($class_name);
114
-            $this->parameters[ $class_name ] = $constructor->getParameters();
115
-        }
116
-        return $this->parameters[ $class_name ];
117
-    }
118
-
119
-
120
-    /**
121
-     * @param ReflectionClass $reflection_class
122
-     * @return ReflectionParameter[]
123
-     * @throws InvalidDataTypeException
124
-     * @throws ReflectionException
125
-     */
126
-    public function getParametersFromReflection(ReflectionClass $reflection_class)
127
-    {
128
-        return $this->getParameters($reflection_class->getName());
129
-    }
130
-
131
-
132
-    /**
133
-     * @param ReflectionMethod $constructor
134
-     * @return ReflectionParameter[]
135
-     * @throws InvalidDataTypeException
136
-     * @throws ReflectionException
137
-     */
138
-    public function getParametersFromReflectionConstructor(ReflectionMethod $constructor)
139
-    {
140
-        return $this->getParameters($constructor->getDeclaringClass());
141
-    }
142
-
143
-
144
-    /**
145
-     * returns array of ReflectionParameter objects for parameters that are NOT optional
146
-     *
147
-     * @param string $class_name
148
-     * @return ReflectionParameter[]
149
-     * @throws InvalidDataTypeException
150
-     * @throws ReflectionException
151
-     */
152
-    public function getRequiredParameters($class_name)
153
-    {
154
-        $required_parameters = [];
155
-        $parameters = $this->getParameters($class_name);
156
-        foreach ($parameters as $parameter) {
157
-            if ($parameter instanceof ReflectionParameter && ! $parameter->isOptional()) {
158
-                $required_parameters[] = $parameter;
159
-            }
160
-        }
161
-        return $required_parameters;
162
-    }
163
-
164
-
165
-    /**
166
-     * @param ReflectionParameter $param
167
-     * @param string              $class_name
168
-     * @param string              $index
169
-     * @return string|null
170
-     */
171
-    public function getParameterClassName(ReflectionParameter $param, $class_name, $index)
172
-    {
173
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_name'])) {
174
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
175
-        }
176
-        if (! isset($this->parameter_classes[ $class_name ])) {
177
-            $this->parameter_classes[ $class_name ] = array();
178
-        }
179
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
180
-            $this->parameter_classes[ $class_name ][ $index ] = array();
181
-        }
182
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_name'] = $param->getClass()
183
-            ? $param->getClass()->name
184
-            : null;
185
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
186
-    }
187
-
188
-
189
-    /**
190
-     * @param ReflectionParameter $param
191
-     * @param string              $class_name
192
-     * @param string              $index
193
-     * @return string|null
194
-     */
195
-    public function getParameterDefaultValue(ReflectionParameter $param, $class_name, $index)
196
-    {
197
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_default'])) {
198
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
199
-        }
200
-        if (! isset($this->parameter_classes[ $class_name ])) {
201
-            $this->parameter_classes[ $class_name ] = array();
202
-        }
203
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
204
-            $this->parameter_classes[ $class_name ][ $index ] = array();
205
-        }
206
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_default'] = $param->isDefaultValueAvailable()
207
-            ? $param->getDefaultValue()
208
-            : null;
209
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
210
-    }
211
-
212
-
213
-    /**
214
-     * @param string $class_name
215
-     * @return ReflectionProperty[]
216
-     * @throws InvalidDataTypeException
217
-     * @throws ReflectionException
218
-     */
219
-    public function getProperties($class_name)
220
-    {
221
-        if (! isset($this->properties[ $class_name ])) {
222
-            $reflection_class                = $this->getReflectionClass($class_name);
223
-            $this->properties[ $class_name ] = $reflection_class->getProperties();
224
-        }
225
-        return $this->properties[ $class_name ];
226
-    }
227
-
228
-
229
-    /**
230
-     * @param ReflectionClass $reflection_class
231
-     * @return ReflectionProperty[]
232
-     * @throws InvalidDataTypeException
233
-     * @throws ReflectionException
234
-     */
235
-    public function getPropertiesFromReflection(ReflectionClass $reflection_class)
236
-    {
237
-        return $this->getProperties($reflection_class->getName());
238
-    }
239
-
240
-
241
-    /**
242
-     * @param string $class_name
243
-     * @return ReflectionMethod[]
244
-     * @throws InvalidDataTypeException
245
-     * @throws ReflectionException
246
-     */
247
-    public function getMethods($class_name)
248
-    {
249
-        if (! isset($this->methods[ $class_name ])) {
250
-            $reflection_class             = $this->getReflectionClass($class_name);
251
-            $this->methods[ $class_name ] = $reflection_class->getMethods();
252
-        }
253
-        return $this->methods[ $class_name ];
254
-    }
255
-
256
-
257
-    /**
258
-     * @param ReflectionClass $reflection_class )
259
-     * @return ReflectionMethod[]
260
-     * @throws InvalidDataTypeException
261
-     * @throws ReflectionException
262
-     */
263
-    public function getMethodsFromReflection(ReflectionClass $reflection_class)
264
-    {
265
-        return $this->getMethods($reflection_class->getName());
266
-    }
24
+	/**
25
+	 * @var ReflectionClass[] $classes
26
+	 */
27
+	private $classes = array();
28
+
29
+	/**
30
+	 * @var ReflectionMethod[] $constructors
31
+	 */
32
+	private $constructors = array();
33
+
34
+	/**
35
+	 * @var ReflectionParameter[][] $parameters
36
+	 */
37
+	private $parameters = array();
38
+
39
+	/**
40
+	 * @var ReflectionParameter[][] $parameters
41
+	 */
42
+	private $parameter_classes = array();
43
+
44
+	/**
45
+	 * @var ReflectionProperty[][] $properties
46
+	 */
47
+	private $properties = array();
48
+
49
+	/**
50
+	 * @var ReflectionMethod[][] $methods
51
+	 */
52
+	private $methods = array();
53
+
54
+
55
+	/**
56
+	 * @param string $class_name
57
+	 * @return ReflectionClass
58
+	 * @throws ReflectionException
59
+	 * @throws InvalidDataTypeException
60
+	 */
61
+	public function getReflectionClass($class_name)
62
+	{
63
+		if (! is_string($class_name)) {
64
+			throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
65
+		}
66
+		if (! isset($this->classes[ $class_name ])) {
67
+			$this->classes[ $class_name ] = new ReflectionClass($class_name);
68
+		}
69
+		return $this->classes[ $class_name ];
70
+	}
71
+
72
+
73
+	/**
74
+	 * @param string $class_name
75
+	 * @return ReflectionMethod
76
+	 * @throws InvalidDataTypeException
77
+	 * @throws ReflectionException
78
+	 */
79
+	public function getConstructor($class_name)
80
+	{
81
+		if (! is_string($class_name)) {
82
+			throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
83
+		}
84
+		if (! isset($this->constructors[ $class_name ])) {
85
+			$reflection_class                  = $this->getReflectionClass($class_name);
86
+			$this->constructors[ $class_name ] = $reflection_class->getConstructor();
87
+		}
88
+		return $this->constructors[ $class_name ];
89
+	}
90
+
91
+
92
+	/**
93
+	 * @param ReflectionClass $reflection_class
94
+	 * @return ReflectionMethod
95
+	 * @throws InvalidDataTypeException
96
+	 * @throws ReflectionException
97
+	 */
98
+	public function getConstructorFromReflection(ReflectionClass $reflection_class)
99
+	{
100
+		return $this->getConstructor($reflection_class->getName());
101
+	}
102
+
103
+
104
+	/**
105
+	 * @param string $class_name
106
+	 * @return ReflectionParameter[]
107
+	 * @throws InvalidDataTypeException
108
+	 * @throws ReflectionException
109
+	 */
110
+	public function getParameters($class_name)
111
+	{
112
+		if (! isset($this->parameters[ $class_name ])) {
113
+			$constructor                     = $this->getConstructor($class_name);
114
+			$this->parameters[ $class_name ] = $constructor->getParameters();
115
+		}
116
+		return $this->parameters[ $class_name ];
117
+	}
118
+
119
+
120
+	/**
121
+	 * @param ReflectionClass $reflection_class
122
+	 * @return ReflectionParameter[]
123
+	 * @throws InvalidDataTypeException
124
+	 * @throws ReflectionException
125
+	 */
126
+	public function getParametersFromReflection(ReflectionClass $reflection_class)
127
+	{
128
+		return $this->getParameters($reflection_class->getName());
129
+	}
130
+
131
+
132
+	/**
133
+	 * @param ReflectionMethod $constructor
134
+	 * @return ReflectionParameter[]
135
+	 * @throws InvalidDataTypeException
136
+	 * @throws ReflectionException
137
+	 */
138
+	public function getParametersFromReflectionConstructor(ReflectionMethod $constructor)
139
+	{
140
+		return $this->getParameters($constructor->getDeclaringClass());
141
+	}
142
+
143
+
144
+	/**
145
+	 * returns array of ReflectionParameter objects for parameters that are NOT optional
146
+	 *
147
+	 * @param string $class_name
148
+	 * @return ReflectionParameter[]
149
+	 * @throws InvalidDataTypeException
150
+	 * @throws ReflectionException
151
+	 */
152
+	public function getRequiredParameters($class_name)
153
+	{
154
+		$required_parameters = [];
155
+		$parameters = $this->getParameters($class_name);
156
+		foreach ($parameters as $parameter) {
157
+			if ($parameter instanceof ReflectionParameter && ! $parameter->isOptional()) {
158
+				$required_parameters[] = $parameter;
159
+			}
160
+		}
161
+		return $required_parameters;
162
+	}
163
+
164
+
165
+	/**
166
+	 * @param ReflectionParameter $param
167
+	 * @param string              $class_name
168
+	 * @param string              $index
169
+	 * @return string|null
170
+	 */
171
+	public function getParameterClassName(ReflectionParameter $param, $class_name, $index)
172
+	{
173
+		if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_name'])) {
174
+			return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
175
+		}
176
+		if (! isset($this->parameter_classes[ $class_name ])) {
177
+			$this->parameter_classes[ $class_name ] = array();
178
+		}
179
+		if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
180
+			$this->parameter_classes[ $class_name ][ $index ] = array();
181
+		}
182
+		$this->parameter_classes[ $class_name ][ $index ]['param_class_name'] = $param->getClass()
183
+			? $param->getClass()->name
184
+			: null;
185
+		return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
186
+	}
187
+
188
+
189
+	/**
190
+	 * @param ReflectionParameter $param
191
+	 * @param string              $class_name
192
+	 * @param string              $index
193
+	 * @return string|null
194
+	 */
195
+	public function getParameterDefaultValue(ReflectionParameter $param, $class_name, $index)
196
+	{
197
+		if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_default'])) {
198
+			return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
199
+		}
200
+		if (! isset($this->parameter_classes[ $class_name ])) {
201
+			$this->parameter_classes[ $class_name ] = array();
202
+		}
203
+		if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
204
+			$this->parameter_classes[ $class_name ][ $index ] = array();
205
+		}
206
+		$this->parameter_classes[ $class_name ][ $index ]['param_class_default'] = $param->isDefaultValueAvailable()
207
+			? $param->getDefaultValue()
208
+			: null;
209
+		return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
210
+	}
211
+
212
+
213
+	/**
214
+	 * @param string $class_name
215
+	 * @return ReflectionProperty[]
216
+	 * @throws InvalidDataTypeException
217
+	 * @throws ReflectionException
218
+	 */
219
+	public function getProperties($class_name)
220
+	{
221
+		if (! isset($this->properties[ $class_name ])) {
222
+			$reflection_class                = $this->getReflectionClass($class_name);
223
+			$this->properties[ $class_name ] = $reflection_class->getProperties();
224
+		}
225
+		return $this->properties[ $class_name ];
226
+	}
227
+
228
+
229
+	/**
230
+	 * @param ReflectionClass $reflection_class
231
+	 * @return ReflectionProperty[]
232
+	 * @throws InvalidDataTypeException
233
+	 * @throws ReflectionException
234
+	 */
235
+	public function getPropertiesFromReflection(ReflectionClass $reflection_class)
236
+	{
237
+		return $this->getProperties($reflection_class->getName());
238
+	}
239
+
240
+
241
+	/**
242
+	 * @param string $class_name
243
+	 * @return ReflectionMethod[]
244
+	 * @throws InvalidDataTypeException
245
+	 * @throws ReflectionException
246
+	 */
247
+	public function getMethods($class_name)
248
+	{
249
+		if (! isset($this->methods[ $class_name ])) {
250
+			$reflection_class             = $this->getReflectionClass($class_name);
251
+			$this->methods[ $class_name ] = $reflection_class->getMethods();
252
+		}
253
+		return $this->methods[ $class_name ];
254
+	}
255
+
256
+
257
+	/**
258
+	 * @param ReflectionClass $reflection_class )
259
+	 * @return ReflectionMethod[]
260
+	 * @throws InvalidDataTypeException
261
+	 * @throws ReflectionException
262
+	 */
263
+	public function getMethodsFromReflection(ReflectionClass $reflection_class)
264
+	{
265
+		return $this->getMethods($reflection_class->getName());
266
+	}
267 267
 }
Please login to merge, or discard this patch.
modules/ticket_selector/EED_Ticket_Selector.module.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -241,7 +241,7 @@
 block discarded – undo
241 241
 
242 242
 
243 243
     /**
244
-     * @return string
244
+     * @return boolean
245 245
      * @throws InvalidArgumentException
246 246
      * @throws InvalidInterfaceException
247 247
      * @throws InvalidDataTypeException
Please login to merge, or discard this patch.
Indentation   +444 added lines, -444 removed lines patch added patch discarded remove patch
@@ -17,448 +17,448 @@
 block discarded – undo
17 17
 class EED_Ticket_Selector extends EED_Module
18 18
 {
19 19
 
20
-    /**
21
-     * @var DisplayTicketSelector $ticket_selector
22
-     */
23
-    private static $ticket_selector;
24
-
25
-    /**
26
-     * @var TicketSelectorIframeEmbedButton $iframe_embed_button
27
-     */
28
-    private static $iframe_embed_button;
29
-
30
-
31
-    /**
32
-     * @return EED_Module|EED_Ticket_Selector
33
-     */
34
-    public static function instance()
35
-    {
36
-        return parent::get_instance(__CLASS__);
37
-    }
38
-
39
-
40
-    /**
41
-     * @return void
42
-     */
43
-    protected function set_config()
44
-    {
45
-        $this->set_config_section('template_settings');
46
-        $this->set_config_class('EE_Ticket_Selector_Config');
47
-        $this->set_config_name('EED_Ticket_Selector');
48
-    }
49
-
50
-
51
-    /**
52
-     *    set_hooks - for hooking into EE Core, other modules, etc
53
-     *
54
-     * @return void
55
-     */
56
-    public static function set_hooks()
57
-    {
58
-        // routing
59
-        EE_Config::register_route(
60
-            'iframe',
61
-            'EED_Ticket_Selector',
62
-            'ticket_selector_iframe',
63
-            'ticket_selector'
64
-        );
65
-        EE_Config::register_route(
66
-            'process_ticket_selections',
67
-            'EED_Ticket_Selector',
68
-            'process_ticket_selections'
69
-        );
70
-        EE_Config::register_route(
71
-            'cancel_ticket_selections',
72
-            'EED_Ticket_Selector',
73
-            'cancel_ticket_selections'
74
-        );
75
-        add_action('wp_loaded', array('EED_Ticket_Selector', 'set_definitions'), 2);
76
-        add_action('AHEE_event_details_header_bottom', array('EED_Ticket_Selector', 'display_ticket_selector'), 10, 1);
77
-        add_action('wp_enqueue_scripts', array('EED_Ticket_Selector', 'translate_js_strings'), 0);
78
-        add_action('wp_enqueue_scripts', array('EED_Ticket_Selector', 'load_tckt_slctr_assets'), 10);
79
-        EED_Ticket_Selector::loadIframeAssets();
80
-    }
81
-
82
-
83
-    /**
84
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
85
-     *
86
-     * @return void
87
-     */
88
-    public static function set_hooks_admin()
89
-    {
90
-        // hook into the end of the \EE_Admin_Page::_load_page_dependencies()
91
-        // to load assets for "espresso_events" page on the "edit" route (action)
92
-        add_action(
93
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__edit',
94
-            array('EED_Ticket_Selector', 'ticket_selector_iframe_embed_button'),
95
-            10
96
-        );
97
-        /**
98
-         * Make sure assets for the ticket selector are loaded on the espresso registrations route so  admin side
99
-         * registrations work.
100
-         */
101
-        add_action(
102
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_registrations__new_registration',
103
-            array('EED_Ticket_Selector', 'set_definitions'),
104
-            10
105
-        );
106
-    }
107
-
108
-
109
-    /**
110
-     *    set_definitions
111
-     *
112
-     * @return void
113
-     * @throws InvalidArgumentException
114
-     * @throws InvalidDataTypeException
115
-     * @throws InvalidInterfaceException
116
-     */
117
-    public static function set_definitions()
118
-    {
119
-        // don't do this twice
120
-        if (defined('TICKET_SELECTOR_ASSETS_URL')) {
121
-            return;
122
-        }
123
-        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
124
-        define(
125
-            'TICKET_SELECTOR_TEMPLATES_PATH',
126
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
127
-        );
128
-        // if config is not set, initialize
129
-        if (
130
-            ! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
131
-        ) {
132
-            EED_Ticket_Selector::instance()->set_config();
133
-            EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector = EED_Ticket_Selector::instance(
134
-            )->config();
135
-        }
136
-    }
137
-
138
-
139
-    /**
140
-     * @return DisplayTicketSelector
141
-     */
142
-    public static function ticketSelector(): DisplayTicketSelector
143
-    {
144
-        if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
145
-            EED_Ticket_Selector::$ticket_selector = LoaderFactory::getLoader()->getShared(
146
-                DisplayTicketSelector::class,
147
-                [null, EED_Events_Archive::is_iframe()]
148
-            );
149
-        }
150
-        return EED_Ticket_Selector::$ticket_selector;
151
-    }
152
-
153
-
154
-    /**
155
-     * gets the ball rolling
156
-     *
157
-     * @param WP $WP
158
-     * @return void
159
-     */
160
-    public function run($WP)
161
-    {
162
-    }
163
-
164
-
165
-    /**
166
-     * @return TicketSelectorIframeEmbedButton
167
-     */
168
-    public static function getIframeEmbedButton()
169
-    {
170
-        if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
171
-            self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
172
-        }
173
-        return self::$iframe_embed_button;
174
-    }
175
-
176
-
177
-    /**
178
-     * ticket_selector_iframe_embed_button
179
-     *
180
-     * @return void
181
-     * @throws EE_Error
182
-     */
183
-    public static function ticket_selector_iframe_embed_button()
184
-    {
185
-        $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
186
-        $iframe_embed_button->addEventEditorIframeEmbedButton();
187
-    }
188
-
189
-
190
-    /**
191
-     * ticket_selector_iframe
192
-     *
193
-     * @return void
194
-     * @throws DomainException
195
-     * @throws EE_Error
196
-     */
197
-    public function ticket_selector_iframe()
198
-    {
199
-        $ticket_selector_iframe = new TicketSelectorIframe();
200
-        $ticket_selector_iframe->display();
201
-    }
202
-
203
-
204
-    /**
205
-     * creates buttons for selecting number of attendees for an event
206
-     *
207
-     * @param  WP_Post|int $event
208
-     * @param  bool        $view_details
209
-     * @return string
210
-     * @throws EE_Error
211
-     */
212
-    public static function display_ticket_selector($event = null, $view_details = false)
213
-    {
214
-        return EED_Ticket_Selector::ticketSelector()->display($event, $view_details);
215
-    }
216
-
217
-
218
-    /**
219
-     * @return array  or FALSE
220
-     * @throws \ReflectionException
221
-     * @throws \EE_Error
222
-     * @throws InvalidArgumentException
223
-     * @throws InvalidInterfaceException
224
-     * @throws InvalidDataTypeException
225
-     */
226
-    public function process_ticket_selections()
227
-    {
228
-        /** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
229
-        $form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
230
-        return $form->processTicketSelections();
231
-    }
232
-
233
-
234
-    /**
235
-     * @return string
236
-     * @throws InvalidArgumentException
237
-     * @throws InvalidInterfaceException
238
-     * @throws InvalidDataTypeException
239
-     * @throws EE_Error
240
-     */
241
-    public static function cancel_ticket_selections()
242
-    {
243
-        /** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
244
-        $form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
245
-        return $form->cancelTicketSelections();
246
-    }
247
-
248
-
249
-    /**
250
-     * @return void
251
-     */
252
-    public static function translate_js_strings()
253
-    {
254
-        EE_Registry::$i18n_js_strings['please_select_date_filter_notice'] = esc_html__(
255
-            'please select a datetime',
256
-            'event_espresso'
257
-        );
258
-    }
259
-
260
-
261
-    /**
262
-     * @return void
263
-     */
264
-    public static function load_tckt_slctr_assets()
265
-    {
266
-        if (apply_filters('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', false)) {
267
-            // add some style
268
-            wp_register_style(
269
-                'ticket_selector',
270
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
271
-                array(),
272
-                EVENT_ESPRESSO_VERSION
273
-            );
274
-            wp_enqueue_style('ticket_selector');
275
-            // make it dance
276
-            wp_register_script(
277
-                'ticket_selector',
278
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
279
-                array('espresso_core'),
280
-                EVENT_ESPRESSO_VERSION,
281
-                true
282
-            );
283
-            wp_enqueue_script('ticket_selector');
284
-            require_once EE_LIBRARIES
285
-                         . 'form_sections/strategies/display/EE_Checkbox_Dropdown_Selector_Display_Strategy.strategy.php';
286
-            \EE_Checkbox_Dropdown_Selector_Display_Strategy::enqueue_styles_and_scripts();
287
-        }
288
-    }
289
-
290
-
291
-    /**
292
-     * @return void
293
-     */
294
-    public static function loadIframeAssets()
295
-    {
296
-        // for event lists
297
-        add_filter(
298
-            'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__css',
299
-            array('EED_Ticket_Selector', 'iframeCss')
300
-        );
301
-        add_filter(
302
-            'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__js',
303
-            array('EED_Ticket_Selector', 'iframeJs')
304
-        );
305
-        // for ticket selectors
306
-        add_filter(
307
-            'FHEE__EED_Ticket_Selector__ticket_selector_iframe__css',
308
-            array('EED_Ticket_Selector', 'iframeCss')
309
-        );
310
-        add_filter(
311
-            'FHEE__EED_Ticket_Selector__ticket_selector_iframe__js',
312
-            array('EED_Ticket_Selector', 'iframeJs')
313
-        );
314
-    }
315
-
316
-
317
-    /**
318
-     * Informs the rest of the forms system what CSS and JS is needed to display the input
319
-     *
320
-     * @param array $iframe_css
321
-     * @return array
322
-     */
323
-    public static function iframeCss(array $iframe_css)
324
-    {
325
-        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
326
-        return $iframe_css;
327
-    }
328
-
329
-
330
-    /**
331
-     * Informs the rest of the forms system what CSS and JS is needed to display the input
332
-     *
333
-     * @param array $iframe_js
334
-     * @return array
335
-     */
336
-    public static function iframeJs(array $iframe_js)
337
-    {
338
-        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
339
-        return $iframe_js;
340
-    }
341
-
342
-
343
-    /****************************** DEPRECATED ******************************/
344
-
345
-
346
-    /**
347
-     * @deprecated
348
-     * @return string
349
-     * @throws EE_Error
350
-     */
351
-    public static function display_view_details_btn()
352
-    {
353
-        // todo add doing_it_wrong() notice during next major version
354
-        return EED_Ticket_Selector::ticketSelector()->displayViewDetailsButton();
355
-    }
356
-
357
-
358
-    /**
359
-     * @deprecated
360
-     * @return string
361
-     * @throws EE_Error
362
-     */
363
-    public static function display_ticket_selector_submit()
364
-    {
365
-        // todo add doing_it_wrong() notice during next major version
366
-        return EED_Ticket_Selector::ticketSelector()->displaySubmitButton();
367
-    }
368
-
369
-
370
-    /**
371
-     * @deprecated
372
-     * @param string $permalink_string
373
-     * @param int    $id
374
-     * @param string $new_title
375
-     * @param string $new_slug
376
-     * @return string
377
-     * @throws InvalidArgumentException
378
-     * @throws InvalidDataTypeException
379
-     * @throws InvalidInterfaceException
380
-     */
381
-    public static function iframe_code_button($permalink_string, $id, $new_title = '', $new_slug = '')
382
-    {
383
-        // todo add doing_it_wrong() notice during next major version
384
-        if (
385
-            EE_Registry::instance()->REQ->get('page') === 'espresso_events'
386
-            && EE_Registry::instance()->REQ->get('action') === 'edit'
387
-        ) {
388
-            $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
389
-            $iframe_embed_button->addEventEditorIframeEmbedButton();
390
-        }
391
-        return '';
392
-    }
393
-
394
-
395
-    /**
396
-     * @deprecated
397
-     * @param int    $ID
398
-     * @param string $external_url
399
-     * @return string
400
-     */
401
-    public static function ticket_selector_form_open($ID = 0, $external_url = '')
402
-    {
403
-        // todo add doing_it_wrong() notice during next major version
404
-        return EED_Ticket_Selector::ticketSelector()->formOpen($ID, $external_url);
405
-    }
406
-
407
-
408
-    /**
409
-     * @deprecated
410
-     * @return string
411
-     */
412
-    public static function ticket_selector_form_close()
413
-    {
414
-        // todo add doing_it_wrong() notice during next major version
415
-        return EED_Ticket_Selector::ticketSelector()->formClose();
416
-    }
417
-
418
-
419
-    /**
420
-     * @deprecated
421
-     * @return string
422
-     */
423
-    public static function no_tkt_slctr_end_dv()
424
-    {
425
-        // todo add doing_it_wrong() notice during next major version
426
-        return EED_Ticket_Selector::ticketSelector()->ticketSelectorEndDiv();
427
-    }
428
-
429
-
430
-    /**
431
-     * @deprecated 4.9.13
432
-     * @return string
433
-     */
434
-    public static function tkt_slctr_end_dv()
435
-    {
436
-        return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
437
-    }
438
-
439
-
440
-    /**
441
-     * @deprecated
442
-     * @return string
443
-     */
444
-    public static function clear_tkt_slctr()
445
-    {
446
-        return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
447
-    }
448
-
449
-
450
-    /**
451
-     * @deprecated
452
-     */
453
-    public static function load_tckt_slctr_assets_admin()
454
-    {
455
-        // todo add doing_it_wrong() notice during next major version
456
-        if (
457
-            EE_Registry::instance()->REQ->get('page') === 'espresso_events'
458
-            && EE_Registry::instance()->REQ->get('action') === 'edit'
459
-        ) {
460
-            $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
461
-            $iframe_embed_button->embedButtonAssets();
462
-        }
463
-    }
20
+	/**
21
+	 * @var DisplayTicketSelector $ticket_selector
22
+	 */
23
+	private static $ticket_selector;
24
+
25
+	/**
26
+	 * @var TicketSelectorIframeEmbedButton $iframe_embed_button
27
+	 */
28
+	private static $iframe_embed_button;
29
+
30
+
31
+	/**
32
+	 * @return EED_Module|EED_Ticket_Selector
33
+	 */
34
+	public static function instance()
35
+	{
36
+		return parent::get_instance(__CLASS__);
37
+	}
38
+
39
+
40
+	/**
41
+	 * @return void
42
+	 */
43
+	protected function set_config()
44
+	{
45
+		$this->set_config_section('template_settings');
46
+		$this->set_config_class('EE_Ticket_Selector_Config');
47
+		$this->set_config_name('EED_Ticket_Selector');
48
+	}
49
+
50
+
51
+	/**
52
+	 *    set_hooks - for hooking into EE Core, other modules, etc
53
+	 *
54
+	 * @return void
55
+	 */
56
+	public static function set_hooks()
57
+	{
58
+		// routing
59
+		EE_Config::register_route(
60
+			'iframe',
61
+			'EED_Ticket_Selector',
62
+			'ticket_selector_iframe',
63
+			'ticket_selector'
64
+		);
65
+		EE_Config::register_route(
66
+			'process_ticket_selections',
67
+			'EED_Ticket_Selector',
68
+			'process_ticket_selections'
69
+		);
70
+		EE_Config::register_route(
71
+			'cancel_ticket_selections',
72
+			'EED_Ticket_Selector',
73
+			'cancel_ticket_selections'
74
+		);
75
+		add_action('wp_loaded', array('EED_Ticket_Selector', 'set_definitions'), 2);
76
+		add_action('AHEE_event_details_header_bottom', array('EED_Ticket_Selector', 'display_ticket_selector'), 10, 1);
77
+		add_action('wp_enqueue_scripts', array('EED_Ticket_Selector', 'translate_js_strings'), 0);
78
+		add_action('wp_enqueue_scripts', array('EED_Ticket_Selector', 'load_tckt_slctr_assets'), 10);
79
+		EED_Ticket_Selector::loadIframeAssets();
80
+	}
81
+
82
+
83
+	/**
84
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
85
+	 *
86
+	 * @return void
87
+	 */
88
+	public static function set_hooks_admin()
89
+	{
90
+		// hook into the end of the \EE_Admin_Page::_load_page_dependencies()
91
+		// to load assets for "espresso_events" page on the "edit" route (action)
92
+		add_action(
93
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__edit',
94
+			array('EED_Ticket_Selector', 'ticket_selector_iframe_embed_button'),
95
+			10
96
+		);
97
+		/**
98
+		 * Make sure assets for the ticket selector are loaded on the espresso registrations route so  admin side
99
+		 * registrations work.
100
+		 */
101
+		add_action(
102
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_registrations__new_registration',
103
+			array('EED_Ticket_Selector', 'set_definitions'),
104
+			10
105
+		);
106
+	}
107
+
108
+
109
+	/**
110
+	 *    set_definitions
111
+	 *
112
+	 * @return void
113
+	 * @throws InvalidArgumentException
114
+	 * @throws InvalidDataTypeException
115
+	 * @throws InvalidInterfaceException
116
+	 */
117
+	public static function set_definitions()
118
+	{
119
+		// don't do this twice
120
+		if (defined('TICKET_SELECTOR_ASSETS_URL')) {
121
+			return;
122
+		}
123
+		define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
124
+		define(
125
+			'TICKET_SELECTOR_TEMPLATES_PATH',
126
+			str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
127
+		);
128
+		// if config is not set, initialize
129
+		if (
130
+			! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
131
+		) {
132
+			EED_Ticket_Selector::instance()->set_config();
133
+			EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector = EED_Ticket_Selector::instance(
134
+			)->config();
135
+		}
136
+	}
137
+
138
+
139
+	/**
140
+	 * @return DisplayTicketSelector
141
+	 */
142
+	public static function ticketSelector(): DisplayTicketSelector
143
+	{
144
+		if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
145
+			EED_Ticket_Selector::$ticket_selector = LoaderFactory::getLoader()->getShared(
146
+				DisplayTicketSelector::class,
147
+				[null, EED_Events_Archive::is_iframe()]
148
+			);
149
+		}
150
+		return EED_Ticket_Selector::$ticket_selector;
151
+	}
152
+
153
+
154
+	/**
155
+	 * gets the ball rolling
156
+	 *
157
+	 * @param WP $WP
158
+	 * @return void
159
+	 */
160
+	public function run($WP)
161
+	{
162
+	}
163
+
164
+
165
+	/**
166
+	 * @return TicketSelectorIframeEmbedButton
167
+	 */
168
+	public static function getIframeEmbedButton()
169
+	{
170
+		if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
171
+			self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
172
+		}
173
+		return self::$iframe_embed_button;
174
+	}
175
+
176
+
177
+	/**
178
+	 * ticket_selector_iframe_embed_button
179
+	 *
180
+	 * @return void
181
+	 * @throws EE_Error
182
+	 */
183
+	public static function ticket_selector_iframe_embed_button()
184
+	{
185
+		$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
186
+		$iframe_embed_button->addEventEditorIframeEmbedButton();
187
+	}
188
+
189
+
190
+	/**
191
+	 * ticket_selector_iframe
192
+	 *
193
+	 * @return void
194
+	 * @throws DomainException
195
+	 * @throws EE_Error
196
+	 */
197
+	public function ticket_selector_iframe()
198
+	{
199
+		$ticket_selector_iframe = new TicketSelectorIframe();
200
+		$ticket_selector_iframe->display();
201
+	}
202
+
203
+
204
+	/**
205
+	 * creates buttons for selecting number of attendees for an event
206
+	 *
207
+	 * @param  WP_Post|int $event
208
+	 * @param  bool        $view_details
209
+	 * @return string
210
+	 * @throws EE_Error
211
+	 */
212
+	public static function display_ticket_selector($event = null, $view_details = false)
213
+	{
214
+		return EED_Ticket_Selector::ticketSelector()->display($event, $view_details);
215
+	}
216
+
217
+
218
+	/**
219
+	 * @return array  or FALSE
220
+	 * @throws \ReflectionException
221
+	 * @throws \EE_Error
222
+	 * @throws InvalidArgumentException
223
+	 * @throws InvalidInterfaceException
224
+	 * @throws InvalidDataTypeException
225
+	 */
226
+	public function process_ticket_selections()
227
+	{
228
+		/** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
229
+		$form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
230
+		return $form->processTicketSelections();
231
+	}
232
+
233
+
234
+	/**
235
+	 * @return string
236
+	 * @throws InvalidArgumentException
237
+	 * @throws InvalidInterfaceException
238
+	 * @throws InvalidDataTypeException
239
+	 * @throws EE_Error
240
+	 */
241
+	public static function cancel_ticket_selections()
242
+	{
243
+		/** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
244
+		$form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
245
+		return $form->cancelTicketSelections();
246
+	}
247
+
248
+
249
+	/**
250
+	 * @return void
251
+	 */
252
+	public static function translate_js_strings()
253
+	{
254
+		EE_Registry::$i18n_js_strings['please_select_date_filter_notice'] = esc_html__(
255
+			'please select a datetime',
256
+			'event_espresso'
257
+		);
258
+	}
259
+
260
+
261
+	/**
262
+	 * @return void
263
+	 */
264
+	public static function load_tckt_slctr_assets()
265
+	{
266
+		if (apply_filters('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', false)) {
267
+			// add some style
268
+			wp_register_style(
269
+				'ticket_selector',
270
+				TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
271
+				array(),
272
+				EVENT_ESPRESSO_VERSION
273
+			);
274
+			wp_enqueue_style('ticket_selector');
275
+			// make it dance
276
+			wp_register_script(
277
+				'ticket_selector',
278
+				TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
279
+				array('espresso_core'),
280
+				EVENT_ESPRESSO_VERSION,
281
+				true
282
+			);
283
+			wp_enqueue_script('ticket_selector');
284
+			require_once EE_LIBRARIES
285
+						 . 'form_sections/strategies/display/EE_Checkbox_Dropdown_Selector_Display_Strategy.strategy.php';
286
+			\EE_Checkbox_Dropdown_Selector_Display_Strategy::enqueue_styles_and_scripts();
287
+		}
288
+	}
289
+
290
+
291
+	/**
292
+	 * @return void
293
+	 */
294
+	public static function loadIframeAssets()
295
+	{
296
+		// for event lists
297
+		add_filter(
298
+			'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__css',
299
+			array('EED_Ticket_Selector', 'iframeCss')
300
+		);
301
+		add_filter(
302
+			'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__js',
303
+			array('EED_Ticket_Selector', 'iframeJs')
304
+		);
305
+		// for ticket selectors
306
+		add_filter(
307
+			'FHEE__EED_Ticket_Selector__ticket_selector_iframe__css',
308
+			array('EED_Ticket_Selector', 'iframeCss')
309
+		);
310
+		add_filter(
311
+			'FHEE__EED_Ticket_Selector__ticket_selector_iframe__js',
312
+			array('EED_Ticket_Selector', 'iframeJs')
313
+		);
314
+	}
315
+
316
+
317
+	/**
318
+	 * Informs the rest of the forms system what CSS and JS is needed to display the input
319
+	 *
320
+	 * @param array $iframe_css
321
+	 * @return array
322
+	 */
323
+	public static function iframeCss(array $iframe_css)
324
+	{
325
+		$iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
326
+		return $iframe_css;
327
+	}
328
+
329
+
330
+	/**
331
+	 * Informs the rest of the forms system what CSS and JS is needed to display the input
332
+	 *
333
+	 * @param array $iframe_js
334
+	 * @return array
335
+	 */
336
+	public static function iframeJs(array $iframe_js)
337
+	{
338
+		$iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
339
+		return $iframe_js;
340
+	}
341
+
342
+
343
+	/****************************** DEPRECATED ******************************/
344
+
345
+
346
+	/**
347
+	 * @deprecated
348
+	 * @return string
349
+	 * @throws EE_Error
350
+	 */
351
+	public static function display_view_details_btn()
352
+	{
353
+		// todo add doing_it_wrong() notice during next major version
354
+		return EED_Ticket_Selector::ticketSelector()->displayViewDetailsButton();
355
+	}
356
+
357
+
358
+	/**
359
+	 * @deprecated
360
+	 * @return string
361
+	 * @throws EE_Error
362
+	 */
363
+	public static function display_ticket_selector_submit()
364
+	{
365
+		// todo add doing_it_wrong() notice during next major version
366
+		return EED_Ticket_Selector::ticketSelector()->displaySubmitButton();
367
+	}
368
+
369
+
370
+	/**
371
+	 * @deprecated
372
+	 * @param string $permalink_string
373
+	 * @param int    $id
374
+	 * @param string $new_title
375
+	 * @param string $new_slug
376
+	 * @return string
377
+	 * @throws InvalidArgumentException
378
+	 * @throws InvalidDataTypeException
379
+	 * @throws InvalidInterfaceException
380
+	 */
381
+	public static function iframe_code_button($permalink_string, $id, $new_title = '', $new_slug = '')
382
+	{
383
+		// todo add doing_it_wrong() notice during next major version
384
+		if (
385
+			EE_Registry::instance()->REQ->get('page') === 'espresso_events'
386
+			&& EE_Registry::instance()->REQ->get('action') === 'edit'
387
+		) {
388
+			$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
389
+			$iframe_embed_button->addEventEditorIframeEmbedButton();
390
+		}
391
+		return '';
392
+	}
393
+
394
+
395
+	/**
396
+	 * @deprecated
397
+	 * @param int    $ID
398
+	 * @param string $external_url
399
+	 * @return string
400
+	 */
401
+	public static function ticket_selector_form_open($ID = 0, $external_url = '')
402
+	{
403
+		// todo add doing_it_wrong() notice during next major version
404
+		return EED_Ticket_Selector::ticketSelector()->formOpen($ID, $external_url);
405
+	}
406
+
407
+
408
+	/**
409
+	 * @deprecated
410
+	 * @return string
411
+	 */
412
+	public static function ticket_selector_form_close()
413
+	{
414
+		// todo add doing_it_wrong() notice during next major version
415
+		return EED_Ticket_Selector::ticketSelector()->formClose();
416
+	}
417
+
418
+
419
+	/**
420
+	 * @deprecated
421
+	 * @return string
422
+	 */
423
+	public static function no_tkt_slctr_end_dv()
424
+	{
425
+		// todo add doing_it_wrong() notice during next major version
426
+		return EED_Ticket_Selector::ticketSelector()->ticketSelectorEndDiv();
427
+	}
428
+
429
+
430
+	/**
431
+	 * @deprecated 4.9.13
432
+	 * @return string
433
+	 */
434
+	public static function tkt_slctr_end_dv()
435
+	{
436
+		return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
437
+	}
438
+
439
+
440
+	/**
441
+	 * @deprecated
442
+	 * @return string
443
+	 */
444
+	public static function clear_tkt_slctr()
445
+	{
446
+		return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
447
+	}
448
+
449
+
450
+	/**
451
+	 * @deprecated
452
+	 */
453
+	public static function load_tckt_slctr_assets_admin()
454
+	{
455
+		// todo add doing_it_wrong() notice during next major version
456
+		if (
457
+			EE_Registry::instance()->REQ->get('page') === 'espresso_events'
458
+			&& EE_Registry::instance()->REQ->get('action') === 'edit'
459
+		) {
460
+			$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
461
+			$iframe_embed_button->embedButtonAssets();
462
+		}
463
+	}
464 464
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -120,10 +120,10 @@  discard block
 block discarded – undo
120 120
         if (defined('TICKET_SELECTOR_ASSETS_URL')) {
121 121
             return;
122 122
         }
123
-        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
123
+        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__).'assets/');
124 124
         define(
125 125
             'TICKET_SELECTOR_TEMPLATES_PATH',
126
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
126
+            str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/'
127 127
         );
128 128
         // if config is not set, initialize
129 129
         if (
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
      */
142 142
     public static function ticketSelector(): DisplayTicketSelector
143 143
     {
144
-        if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
144
+        if ( ! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
145 145
             EED_Ticket_Selector::$ticket_selector = LoaderFactory::getLoader()->getShared(
146 146
                 DisplayTicketSelector::class,
147 147
                 [null, EED_Events_Archive::is_iframe()]
@@ -167,7 +167,7 @@  discard block
 block discarded – undo
167 167
      */
168 168
     public static function getIframeEmbedButton()
169 169
     {
170
-        if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
170
+        if ( ! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
171 171
             self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
172 172
         }
173 173
         return self::$iframe_embed_button;
@@ -267,7 +267,7 @@  discard block
 block discarded – undo
267 267
             // add some style
268 268
             wp_register_style(
269 269
                 'ticket_selector',
270
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
270
+                TICKET_SELECTOR_ASSETS_URL.'ticket_selector.css',
271 271
                 array(),
272 272
                 EVENT_ESPRESSO_VERSION
273 273
             );
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
             // make it dance
276 276
             wp_register_script(
277 277
                 'ticket_selector',
278
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
278
+                TICKET_SELECTOR_ASSETS_URL.'ticket_selector.js',
279 279
                 array('espresso_core'),
280 280
                 EVENT_ESPRESSO_VERSION,
281 281
                 true
@@ -322,7 +322,7 @@  discard block
 block discarded – undo
322 322
      */
323 323
     public static function iframeCss(array $iframe_css)
324 324
     {
325
-        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
325
+        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL.'ticket_selector.css';
326 326
         return $iframe_css;
327 327
     }
328 328
 
@@ -335,7 +335,7 @@  discard block
 block discarded – undo
335 335
      */
336 336
     public static function iframeJs(array $iframe_js)
337 337
     {
338
-        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
338
+        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL.'ticket_selector.js';
339 339
         return $iframe_js;
340 340
     }
341 341
 
Please login to merge, or discard this patch.
core/domain/services/custom_post_types/RegisterCustomTaxonomyTerms.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -65,7 +65,7 @@
 block discarded – undo
65 65
      */
66 66
     public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array())
67 67
     {
68
-        $this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm(
68
+        $this->custom_taxonomy_terms[][$term_slug] = new CustomTaxonomyTerm(
69 69
             $taxonomy,
70 70
             $term_slug,
71 71
             $cpt_slugs
Please login to merge, or discard this patch.
Indentation   +177 added lines, -177 removed lines patch added patch discarded remove patch
@@ -16,181 +16,181 @@
 block discarded – undo
16 16
 class RegisterCustomTaxonomyTerms
17 17
 {
18 18
 
19
-    /**
20
-     * @var array[] $custom_taxonomy_terms
21
-     */
22
-    public $custom_taxonomy_terms = array();
23
-
24
-
25
-    /**
26
-     * RegisterCustomTaxonomyTerms constructor.
27
-     */
28
-    public function __construct()
29
-    {
30
-        // hook into save_post so that we can make sure that the default terms get saved on publish of registered cpts
31
-        // IF they don't have a term for that taxonomy set.
32
-        add_action('save_post', array($this, 'saveDefaultTerm'), 100, 2);
33
-        do_action(
34
-            'AHEE__EventEspresso_core_domain_services_custom_post_types_RegisterCustomTaxonomyTerms__construct_end',
35
-            $this
36
-        );
37
-    }
38
-
39
-
40
-    public function registerCustomTaxonomyTerms()
41
-    {
42
-        // setup default terms in any of our taxonomies (but only if we're in admin).
43
-        // Why not added via register_activation_hook?
44
-        // Because it's possible that in future iterations of EE we may add new defaults for specialized taxonomies
45
-        // (think event_types) and register_activation_hook only reliably runs when a user manually activates the plugin.
46
-        // Keep in mind that this will READ these terms if they are deleted by the user.  Hence MUST use terms.
47
-        // if ( is_admin() ) {
48
-        // $this->set_must_use_event_types();
49
-        // }
50
-        // set default terms
51
-        $this->registerCustomTaxonomyTerm(
52
-            'espresso_event_type',
53
-            'single-event',
54
-            array('espresso_events')
55
-        );
56
-    }
57
-
58
-
59
-    /**
60
-     * Allows us to set what the default will be for terms when a cpt is PUBLISHED.
61
-     *
62
-     * @param string $taxonomy  The taxonomy we're using for the default term
63
-     * @param string $term_slug The slug of the term that will be the default.
64
-     * @param array  $cpt_slugs An array of custom post types we want the default assigned to
65
-     */
66
-    public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array())
67
-    {
68
-        $this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm(
69
-            $taxonomy,
70
-            $term_slug,
71
-            $cpt_slugs
72
-        );
73
-    }
74
-
75
-
76
-    /**
77
-     * hooked into the wp 'save_post' action hook for setting our default terms found in the $_default_terms property
78
-     *
79
-     * @param  int     $post_id ID of CPT being saved
80
-     * @param  WP_Post $post    Post object
81
-     * @return void
82
-     */
83
-    public function saveDefaultTerm($post_id, WP_Post $post)
84
-    {
85
-        if (empty($this->custom_taxonomy_terms)) {
86
-            return;
87
-        }
88
-        // no default terms set so lets just exit.
89
-        foreach ($this->custom_taxonomy_terms as $custom_taxonomy_terms) {
90
-            foreach ($custom_taxonomy_terms as $custom_taxonomy_term) {
91
-                if (
92
-                    $post->post_status === 'publish'
93
-                    && $custom_taxonomy_term instanceof CustomTaxonomyTerm
94
-                    && in_array($post->post_type, $custom_taxonomy_term->customPostTypeSlugs(), true)
95
-                ) {
96
-                    // note some error proofing going on here to save unnecessary db queries
97
-                    $taxonomies = get_object_taxonomies($post->post_type);
98
-                    foreach ($taxonomies as $taxonomy) {
99
-                        $terms = wp_get_post_terms($post_id, $taxonomy);
100
-                        if (empty($terms) && $taxonomy === $custom_taxonomy_term->taxonomySlug()) {
101
-                            wp_set_object_terms(
102
-                                $post_id,
103
-                                array($custom_taxonomy_term->termSlug()),
104
-                                $taxonomy
105
-                            );
106
-                        }
107
-                    }
108
-                }
109
-            }
110
-        }
111
-    }
112
-
113
-
114
-    /**
115
-     * @return void
116
-     */
117
-    public function setMustUseEventTypes()
118
-    {
119
-        $term_details = array(
120
-            // Attendee's register for the first date-time only
121
-            'single-event'    => array(
122
-                'term' => esc_html__('Single Event', 'event_espresso'),
123
-                'desc' => esc_html__(
124
-                    'A single event that spans one or more consecutive days.',
125
-                    'event_espresso'
126
-                ),
127
-            ),
128
-            // example: a party or two-day long workshop
129
-            // Attendee's can register for any of the date-times
130
-            'multi-event'     => array(
131
-                'term' => esc_html__('Multi Event', 'event_espresso'),
132
-                'desc' => esc_html__(
133
-                    'Multiple, separate, but related events that occur on consecutive days.',
134
-                    'event_espresso'
135
-                ),
136
-            ),
137
-            // example: a three day music festival or week long conference
138
-            // Attendee's register for the first date-time only
139
-            'event-series'    => array(
140
-                'term' => esc_html__('Event Series', 'event_espresso'),
141
-                'desc' => esc_html__(
142
-                    ' Multiple events that occur over multiple non-consecutive days.',
143
-                    'event_espresso'
144
-                ),
145
-            ),
146
-            // example: an 8 week introduction to basket weaving course
147
-            // Attendee's can register for any of the date-times.
148
-            'recurring-event' => array(
149
-                'term' => esc_html__('Recurring Event', 'event_espresso'),
150
-                'desc' => esc_html__(
151
-                    'Multiple events that occur over multiple non-consecutive days.',
152
-                    'event_espresso'
153
-                ),
154
-            ),
155
-            // example: a yoga class
156
-            'ongoing'         => array(
157
-                'term' => esc_html__('Ongoing Event', 'event_espresso'),
158
-                'desc' => esc_html__(
159
-                    'An "event" that people can purchase tickets to gain access for anytime for this event regardless of date times on the event',
160
-                    'event_espresso'
161
-                ),
162
-            )
163
-            // example: access to a museum
164
-            // 'walk-in' => array( esc_html__('Walk In', 'event_espresso'), esc_html__('Single datetime and single entry recurring events. Attendees register for one or multiple datetimes individually.', 'event_espresso') ),
165
-            // 'reservation' => array( esc_html__('Reservation', 'event_espresso'), esc_html__('Reservations are created by specifying available datetimes and quantities. Attendees choose from the available datetimes and specify the quantity available (if the maximum is greater than 1)') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1
166
-            // 'multiple-session' => array( esc_html__('Multiple Session', 'event_espresso'), esc_html__('Multiple event, multiple datetime, hierarchically organized, custom entry events. Attendees may be required to register for a parent event before being allowed to register for child events. Attendees can register for any combination of child events as long as the datetimes do not conflict. Parent and child events may have additional fees or registration questions.') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1
167
-            // 'appointment' => array( esc_html__('Appointments', 'event_espresso'), esc_html__('Time slotted events where datetimes are generally in hours or minutes. For example, attendees can register for a single 15 minute or 1 hour time slot and this type of availability frequently reoccurs.', 'event_espresso') )
168
-        );
169
-        $this->setMustUseTerms('espresso_event_type', $term_details);
170
-    }
171
-
172
-
173
-    /**
174
-     * wrapper method for handling the setting up of initial terms in the db (if they don't already exist).
175
-     * Note this should ONLY be used for terms that always must be present.  Be aware that if an initial term is
176
-     * deleted then it WILL be recreated.
177
-     *
178
-     * @param string $taxonomy     The name of the taxonomy
179
-     * @param array  $term_details An array of term details indexed by slug and containing Name of term, and
180
-     *                             description as the elements in the array
181
-     * @return void
182
-     */
183
-    public function setMustUseTerms($taxonomy, $term_details)
184
-    {
185
-        $term_details = (array) $term_details;
186
-        foreach ($term_details as $slug => $details) {
187
-            if (isset($details['term'], $details['desc']) && ! term_exists($slug, $taxonomy)) {
188
-                $insert_arr = array(
189
-                    'slug'        => $slug,
190
-                    'description' => $details['desc'],
191
-                );
192
-                wp_insert_term($details['term'], $taxonomy, $insert_arr);
193
-            }
194
-        }
195
-    }
19
+	/**
20
+	 * @var array[] $custom_taxonomy_terms
21
+	 */
22
+	public $custom_taxonomy_terms = array();
23
+
24
+
25
+	/**
26
+	 * RegisterCustomTaxonomyTerms constructor.
27
+	 */
28
+	public function __construct()
29
+	{
30
+		// hook into save_post so that we can make sure that the default terms get saved on publish of registered cpts
31
+		// IF they don't have a term for that taxonomy set.
32
+		add_action('save_post', array($this, 'saveDefaultTerm'), 100, 2);
33
+		do_action(
34
+			'AHEE__EventEspresso_core_domain_services_custom_post_types_RegisterCustomTaxonomyTerms__construct_end',
35
+			$this
36
+		);
37
+	}
38
+
39
+
40
+	public function registerCustomTaxonomyTerms()
41
+	{
42
+		// setup default terms in any of our taxonomies (but only if we're in admin).
43
+		// Why not added via register_activation_hook?
44
+		// Because it's possible that in future iterations of EE we may add new defaults for specialized taxonomies
45
+		// (think event_types) and register_activation_hook only reliably runs when a user manually activates the plugin.
46
+		// Keep in mind that this will READ these terms if they are deleted by the user.  Hence MUST use terms.
47
+		// if ( is_admin() ) {
48
+		// $this->set_must_use_event_types();
49
+		// }
50
+		// set default terms
51
+		$this->registerCustomTaxonomyTerm(
52
+			'espresso_event_type',
53
+			'single-event',
54
+			array('espresso_events')
55
+		);
56
+	}
57
+
58
+
59
+	/**
60
+	 * Allows us to set what the default will be for terms when a cpt is PUBLISHED.
61
+	 *
62
+	 * @param string $taxonomy  The taxonomy we're using for the default term
63
+	 * @param string $term_slug The slug of the term that will be the default.
64
+	 * @param array  $cpt_slugs An array of custom post types we want the default assigned to
65
+	 */
66
+	public function registerCustomTaxonomyTerm($taxonomy, $term_slug, array $cpt_slugs = array())
67
+	{
68
+		$this->custom_taxonomy_terms[][ $term_slug ] = new CustomTaxonomyTerm(
69
+			$taxonomy,
70
+			$term_slug,
71
+			$cpt_slugs
72
+		);
73
+	}
74
+
75
+
76
+	/**
77
+	 * hooked into the wp 'save_post' action hook for setting our default terms found in the $_default_terms property
78
+	 *
79
+	 * @param  int     $post_id ID of CPT being saved
80
+	 * @param  WP_Post $post    Post object
81
+	 * @return void
82
+	 */
83
+	public function saveDefaultTerm($post_id, WP_Post $post)
84
+	{
85
+		if (empty($this->custom_taxonomy_terms)) {
86
+			return;
87
+		}
88
+		// no default terms set so lets just exit.
89
+		foreach ($this->custom_taxonomy_terms as $custom_taxonomy_terms) {
90
+			foreach ($custom_taxonomy_terms as $custom_taxonomy_term) {
91
+				if (
92
+					$post->post_status === 'publish'
93
+					&& $custom_taxonomy_term instanceof CustomTaxonomyTerm
94
+					&& in_array($post->post_type, $custom_taxonomy_term->customPostTypeSlugs(), true)
95
+				) {
96
+					// note some error proofing going on here to save unnecessary db queries
97
+					$taxonomies = get_object_taxonomies($post->post_type);
98
+					foreach ($taxonomies as $taxonomy) {
99
+						$terms = wp_get_post_terms($post_id, $taxonomy);
100
+						if (empty($terms) && $taxonomy === $custom_taxonomy_term->taxonomySlug()) {
101
+							wp_set_object_terms(
102
+								$post_id,
103
+								array($custom_taxonomy_term->termSlug()),
104
+								$taxonomy
105
+							);
106
+						}
107
+					}
108
+				}
109
+			}
110
+		}
111
+	}
112
+
113
+
114
+	/**
115
+	 * @return void
116
+	 */
117
+	public function setMustUseEventTypes()
118
+	{
119
+		$term_details = array(
120
+			// Attendee's register for the first date-time only
121
+			'single-event'    => array(
122
+				'term' => esc_html__('Single Event', 'event_espresso'),
123
+				'desc' => esc_html__(
124
+					'A single event that spans one or more consecutive days.',
125
+					'event_espresso'
126
+				),
127
+			),
128
+			// example: a party or two-day long workshop
129
+			// Attendee's can register for any of the date-times
130
+			'multi-event'     => array(
131
+				'term' => esc_html__('Multi Event', 'event_espresso'),
132
+				'desc' => esc_html__(
133
+					'Multiple, separate, but related events that occur on consecutive days.',
134
+					'event_espresso'
135
+				),
136
+			),
137
+			// example: a three day music festival or week long conference
138
+			// Attendee's register for the first date-time only
139
+			'event-series'    => array(
140
+				'term' => esc_html__('Event Series', 'event_espresso'),
141
+				'desc' => esc_html__(
142
+					' Multiple events that occur over multiple non-consecutive days.',
143
+					'event_espresso'
144
+				),
145
+			),
146
+			// example: an 8 week introduction to basket weaving course
147
+			// Attendee's can register for any of the date-times.
148
+			'recurring-event' => array(
149
+				'term' => esc_html__('Recurring Event', 'event_espresso'),
150
+				'desc' => esc_html__(
151
+					'Multiple events that occur over multiple non-consecutive days.',
152
+					'event_espresso'
153
+				),
154
+			),
155
+			// example: a yoga class
156
+			'ongoing'         => array(
157
+				'term' => esc_html__('Ongoing Event', 'event_espresso'),
158
+				'desc' => esc_html__(
159
+					'An "event" that people can purchase tickets to gain access for anytime for this event regardless of date times on the event',
160
+					'event_espresso'
161
+				),
162
+			)
163
+			// example: access to a museum
164
+			// 'walk-in' => array( esc_html__('Walk In', 'event_espresso'), esc_html__('Single datetime and single entry recurring events. Attendees register for one or multiple datetimes individually.', 'event_espresso') ),
165
+			// 'reservation' => array( esc_html__('Reservation', 'event_espresso'), esc_html__('Reservations are created by specifying available datetimes and quantities. Attendees choose from the available datetimes and specify the quantity available (if the maximum is greater than 1)') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1
166
+			// 'multiple-session' => array( esc_html__('Multiple Session', 'event_espresso'), esc_html__('Multiple event, multiple datetime, hierarchically organized, custom entry events. Attendees may be required to register for a parent event before being allowed to register for child events. Attendees can register for any combination of child events as long as the datetimes do not conflict. Parent and child events may have additional fees or registration questions.') ), //@TODO to avoid confusion we'll implement this in a later iteration > EE4.1
167
+			// 'appointment' => array( esc_html__('Appointments', 'event_espresso'), esc_html__('Time slotted events where datetimes are generally in hours or minutes. For example, attendees can register for a single 15 minute or 1 hour time slot and this type of availability frequently reoccurs.', 'event_espresso') )
168
+		);
169
+		$this->setMustUseTerms('espresso_event_type', $term_details);
170
+	}
171
+
172
+
173
+	/**
174
+	 * wrapper method for handling the setting up of initial terms in the db (if they don't already exist).
175
+	 * Note this should ONLY be used for terms that always must be present.  Be aware that if an initial term is
176
+	 * deleted then it WILL be recreated.
177
+	 *
178
+	 * @param string $taxonomy     The name of the taxonomy
179
+	 * @param array  $term_details An array of term details indexed by slug and containing Name of term, and
180
+	 *                             description as the elements in the array
181
+	 * @return void
182
+	 */
183
+	public function setMustUseTerms($taxonomy, $term_details)
184
+	{
185
+		$term_details = (array) $term_details;
186
+		foreach ($term_details as $slug => $details) {
187
+			if (isset($details['term'], $details['desc']) && ! term_exists($slug, $taxonomy)) {
188
+				$insert_arr = array(
189
+					'slug'        => $slug,
190
+					'description' => $details['desc'],
191
+				);
192
+				wp_insert_term($details['term'], $taxonomy, $insert_arr);
193
+			}
194
+		}
195
+	}
196 196
 }
Please login to merge, or discard this patch.