Completed
Branch Gutenberg/model-entities (b6a9d7)
by
unknown
309:56 queued 233:20
created
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.
Spacing   +55 added lines, -55 removed lines patch added patch discarded remove patch
@@ -186,7 +186,7 @@  discard block
 block discarded – undo
186 186
         // check if class object is instantiated
187 187
         // session loading is turned ON by default, but prior to the init hook, can be turned back OFF via:
188 188
         // add_filter( 'FHEE_load_EE_Session', '__return_false' );
189
-        if (! self::$_instance instanceof EE_Session && apply_filters('FHEE_load_EE_Session', true)) {
189
+        if ( ! self::$_instance instanceof EE_Session && apply_filters('FHEE_load_EE_Session', true)) {
190 190
             self::$_instance = new self(
191 191
                 $cache_storage,
192 192
                 $lifespan,
@@ -219,21 +219,21 @@  discard block
 block discarded – undo
219 219
         // but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
220 220
         // (which currently fires on the init hook at priority 9),
221 221
         // can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
222
-        if (! apply_filters('FHEE_load_EE_Session', true)) {
222
+        if ( ! apply_filters('FHEE_load_EE_Session', true)) {
223 223
             return;
224 224
         }
225 225
         $this->session_lifespan = $lifespan;
226 226
         $this->request = $request;
227
-        if (! defined('ESPRESSO_SESSION')) {
227
+        if ( ! defined('ESPRESSO_SESSION')) {
228 228
             define('ESPRESSO_SESSION', true);
229 229
         }
230 230
         // retrieve session options from db
231 231
         $session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
232
-        if (! empty($session_settings)) {
232
+        if ( ! empty($session_settings)) {
233 233
             // cycle though existing session options
234 234
             foreach ($session_settings as $var_name => $session_setting) {
235 235
                 // set values for class properties
236
-                $var_name = '_' . $var_name;
236
+                $var_name = '_'.$var_name;
237 237
                 $this->{$var_name} = $session_setting;
238 238
             }
239 239
         }
@@ -292,7 +292,7 @@  discard block
 block discarded – undo
292 292
     public function open_session()
293 293
     {
294 294
         // check for existing session and retrieve it from db
295
-        if (! $this->_espresso_session()) {
295
+        if ( ! $this->_espresso_session()) {
296 296
             // or just start a new one
297 297
             $this->_create_espresso_session();
298 298
         }
@@ -365,9 +365,9 @@  discard block
 block discarded – undo
365 365
         // set some defaults
366 366
         foreach ($this->_default_session_vars as $key => $default_var) {
367 367
             if (is_array($default_var)) {
368
-                $this->_session_data[ $key ] = array();
368
+                $this->_session_data[$key] = array();
369 369
             } else {
370
-                $this->_session_data[ $key ] = '';
370
+                $this->_session_data[$key] = '';
371 371
             }
372 372
         }
373 373
     }
@@ -498,8 +498,8 @@  discard block
 block discarded – undo
498 498
             $this->reset_checkout();
499 499
             $this->reset_transaction();
500 500
         }
501
-        if (! empty($key)) {
502
-            return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
501
+        if ( ! empty($key)) {
502
+            return isset($this->_session_data[$key]) ? $this->_session_data[$key] : null;
503 503
         }
504 504
         return $this->_session_data;
505 505
     }
@@ -527,7 +527,7 @@  discard block
 block discarded – undo
527 527
             return false;
528 528
         }
529 529
         foreach ($data as $key => $value) {
530
-            if (isset($this->_default_session_vars[ $key ])) {
530
+            if (isset($this->_default_session_vars[$key])) {
531 531
                 EE_Error::add_error(
532 532
                     sprintf(
533 533
                         esc_html__(
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
                 );
543 543
                 return false;
544 544
             }
545
-            $this->_session_data[ $key ] = $value;
545
+            $this->_session_data[$key] = $value;
546 546
         }
547 547
         return true;
548 548
     }
@@ -575,7 +575,7 @@  discard block
 block discarded – undo
575 575
         $this->_user_agent = $this->request->userAgent();
576 576
         // now let's retrieve what's in the db
577 577
         $session_data = $this->_retrieve_session_data();
578
-        if (! empty($session_data)) {
578
+        if ( ! empty($session_data)) {
579 579
             // get the current time in UTC
580 580
             $this->_time = $this->_time !== null ? $this->_time : time();
581 581
             // and reset the session expiration
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
             // set initial site access time and the session expiration
587 587
             $this->_set_init_access_and_expiration();
588 588
             // set referer
589
-            $this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
589
+            $this->_session_data['pages_visited'][$this->_session_data['init_access']] = isset($_SERVER['HTTP_REFERER'])
590 590
                 ? esc_attr($_SERVER['HTTP_REFERER'])
591 591
                 : '';
592 592
             // no previous session = go back and create one (on top of the data above)
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
      */
624 624
     protected function _retrieve_session_data()
625 625
     {
626
-        $ssn_key = EE_Session::session_id_prefix . $this->_sid;
626
+        $ssn_key = EE_Session::session_id_prefix.$this->_sid;
627 627
         try {
628 628
             // we're using WP's Transient API to store session data using the PHP session ID as the option name
629 629
             $session_data = $this->cache_storage->get($ssn_key, false);
@@ -632,7 +632,7 @@  discard block
 block discarded – undo
632 632
             }
633 633
             if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
634 634
                 $hash_check = $this->cache_storage->get(
635
-                    EE_Session::hash_check_prefix . $this->_sid,
635
+                    EE_Session::hash_check_prefix.$this->_sid,
636 636
                     false
637 637
                 );
638 638
                 if ($hash_check && $hash_check !== md5($session_data)) {
@@ -642,7 +642,7 @@  discard block
 block discarded – undo
642 642
                                 'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
643 643
                                 'event_espresso'
644 644
                             ),
645
-                            EE_Session::session_id_prefix . $this->_sid
645
+                            EE_Session::session_id_prefix.$this->_sid
646 646
                         ),
647 647
                         __FILE__,
648 648
                         __FUNCTION__,
@@ -656,17 +656,17 @@  discard block
 block discarded – undo
656 656
             $row = $wpdb->get_row(
657 657
                 $wpdb->prepare(
658 658
                     "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
659
-                    '_transient_' . $ssn_key
659
+                    '_transient_'.$ssn_key
660 660
                 )
661 661
             );
662 662
             $session_data = is_object($row) ? $row->option_value : null;
663 663
             if ($session_data) {
664 664
                 $session_data = preg_replace_callback(
665 665
                     '!s:(d+):"(.*?)";!',
666
-                    function ($match) {
666
+                    function($match) {
667 667
                         return $match[1] === strlen($match[2])
668 668
                             ? $match[0]
669
-                            : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
669
+                            : 's:'.strlen($match[2]).':"'.$match[2].'";';
670 670
                     },
671 671
                     $session_data
672 672
                 );
@@ -677,7 +677,7 @@  discard block
 block discarded – undo
677 677
         $session_data = $this->encryption instanceof EE_Encryption
678 678
             ? $this->encryption->base64_string_decode($session_data)
679 679
             : $session_data;
680
-        if (! is_array($session_data)) {
680
+        if ( ! is_array($session_data)) {
681 681
             try {
682 682
                 $session_data = maybe_unserialize($session_data);
683 683
             } catch (Exception $e) {
@@ -691,21 +691,21 @@  discard block
 block discarded – undo
691 691
                       . '</pre><br>'
692 692
                       . $this->find_serialize_error($session_data)
693 693
                     : '';
694
-                $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
694
+                $this->cache_storage->delete(EE_Session::session_id_prefix.$this->_sid);
695 695
                 throw new InvalidSessionDataException($msg, 0, $e);
696 696
             }
697 697
         }
698 698
         // just a check to make sure the session array is indeed an array
699
-        if (! is_array($session_data)) {
699
+        if ( ! is_array($session_data)) {
700 700
             // no?!?! then something is wrong
701 701
             $msg = esc_html__(
702 702
                 'The session data is missing, invalid, or corrupted.',
703 703
                 'event_espresso'
704 704
             );
705 705
             $msg .= WP_DEBUG
706
-                ? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
706
+                ? '<br><pre>'.print_r($session_data, true).'</pre><br>'.$this->find_serialize_error($session_data)
707 707
                 : '';
708
-            $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
708
+            $this->cache_storage->delete(EE_Session::session_id_prefix.$this->_sid);
709 709
             throw new InvalidSessionDataException($msg);
710 710
         }
711 711
         if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
@@ -732,7 +732,7 @@  discard block
 block discarded – undo
732 732
         if (isset($_REQUEST['EESID'])) {
733 733
             $session_id = sanitize_text_field($_REQUEST['EESID']);
734 734
         } else {
735
-            $session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
735
+            $session_id = md5(session_id().get_current_blog_id().$this->_get_sid_salt());
736 736
         }
737 737
         return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
738 738
     }
@@ -835,19 +835,19 @@  discard block
 block discarded – undo
835 835
                     $page_visit = $this->_get_page_visit();
836 836
                     if ($page_visit) {
837 837
                         // set pages visited where the first will be the http referrer
838
-                        $this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
838
+                        $this->_session_data['pages_visited'][$this->_time] = $page_visit;
839 839
                         // we'll only save the last 10 page visits.
840 840
                         $session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
841 841
                     }
842 842
                     break;
843 843
                 default:
844 844
                     // carry any other data over
845
-                    $session_data[ $key ] = $this->_session_data[ $key ];
845
+                    $session_data[$key] = $this->_session_data[$key];
846 846
             }
847 847
         }
848 848
         $this->_session_data = $session_data;
849 849
         // creating a new session does not require saving to the db just yet
850
-        if (! $new_session) {
850
+        if ( ! $new_session) {
851 851
             // ready? let's save
852 852
             if ($this->_save_session_to_db()) {
853 853
                 return true;
@@ -888,8 +888,8 @@  discard block
 block discarded – undo
888 888
                 isset($this->_session_data['ee_notices'])
889 889
                 && (
890 890
                     ! empty($this->_session_data['ee_notices']['attention'])
891
-                    || !empty($this->_session_data['ee_notices']['errors'])
892
-                    || !empty($this->_session_data['ee_notices']['success'])
891
+                    || ! empty($this->_session_data['ee_notices']['errors'])
892
+                    || ! empty($this->_session_data['ee_notices']['success'])
893 893
                 )
894 894
             );
895 895
     }
@@ -918,7 +918,7 @@  discard block
 block discarded – undo
918 918
         }
919 919
         $transaction = $this->transaction();
920 920
         if ($transaction instanceof EE_Transaction) {
921
-            if (! $transaction->ID()) {
921
+            if ( ! $transaction->ID()) {
922 922
                 $transaction->save();
923 923
             }
924 924
             $this->_session_data['transaction'] = $transaction->ID();
@@ -932,14 +932,14 @@  discard block
 block discarded – undo
932 932
         // maybe save hash check
933 933
         if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
934 934
             $this->cache_storage->add(
935
-                EE_Session::hash_check_prefix . $this->_sid,
935
+                EE_Session::hash_check_prefix.$this->_sid,
936 936
                 md5($session_data),
937 937
                 $this->session_lifespan->inSeconds()
938 938
             );
939 939
         }
940 940
         // we're using the Transient API for storing session data,
941 941
         return $this->cache_storage->add(
942
-            EE_Session::session_id_prefix . $this->_sid,
942
+            EE_Session::session_id_prefix.$this->_sid,
943 943
             $session_data,
944 944
             $this->session_lifespan->inSeconds()
945 945
         );
@@ -953,7 +953,7 @@  discard block
 block discarded – undo
953 953
      */
954 954
     public function _get_page_visit()
955 955
     {
956
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
956
+        $page_visit = home_url('/').'wp-admin/admin-ajax.php';
957 957
         // check for request url
958 958
         if (isset($_SERVER['REQUEST_URI'])) {
959 959
             $http_host = '';
@@ -969,14 +969,14 @@  discard block
 block discarded – undo
969 969
             // check for page_id in SERVER REQUEST
970 970
             if (isset($_REQUEST['page_id'])) {
971 971
                 // rebuild $e_reg without any of the extra parameters
972
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
972
+                $page_id = '?page_id='.esc_attr($_REQUEST['page_id']).'&amp;';
973 973
             }
974 974
             // check for $e_reg in SERVER REQUEST
975 975
             if (isset($_REQUEST['ee'])) {
976 976
                 // rebuild $e_reg without any of the extra parameters
977
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
977
+                $e_reg = 'ee='.esc_attr($_REQUEST['ee']);
978 978
             }
979
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
979
+            $page_visit = rtrim($http_host.$request_uri.$page_id.$e_reg, '?');
980 980
         }
981 981
         return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
982 982
     }
@@ -1014,7 +1014,7 @@  discard block
 block discarded – undo
1014 1014
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
1015 1015
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
1016 1016
 // </h3>';
1017
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1017
+        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : '.$class.'::'.$function.'()');
1018 1018
         $this->reset_cart();
1019 1019
         $this->reset_checkout();
1020 1020
         $this->reset_transaction();
@@ -1036,7 +1036,7 @@  discard block
 block discarded – undo
1036 1036
     public function reset_data($data_to_reset = array(), $show_all_notices = false)
1037 1037
     {
1038 1038
         // if $data_to_reset is not in an array, then put it in one
1039
-        if (! is_array($data_to_reset)) {
1039
+        if ( ! is_array($data_to_reset)) {
1040 1040
             $data_to_reset = array($data_to_reset);
1041 1041
         }
1042 1042
         // nothing ??? go home!
@@ -1056,11 +1056,11 @@  discard block
 block discarded – undo
1056 1056
         // since $data_to_reset is an array, cycle through the values
1057 1057
         foreach ($data_to_reset as $reset) {
1058 1058
             // first check to make sure it is a valid session var
1059
-            if (isset($this->_session_data[ $reset ])) {
1059
+            if (isset($this->_session_data[$reset])) {
1060 1060
                 // then check to make sure it is not a default var
1061
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1061
+                if ( ! array_key_exists($reset, $this->_default_session_vars)) {
1062 1062
                     // remove session var
1063
-                    unset($this->_session_data[ $reset ]);
1063
+                    unset($this->_session_data[$reset]);
1064 1064
                     if ($show_all_notices) {
1065 1065
                         EE_Error::add_success(
1066 1066
                             sprintf(
@@ -1161,7 +1161,7 @@  discard block
 block discarded – undo
1161 1161
             // or use that for the new transient cleanup query limit
1162 1162
             add_filter(
1163 1163
                 'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1164
-                function () use ($expired_session_transient_delete_query_limit) {
1164
+                function() use ($expired_session_transient_delete_query_limit) {
1165 1165
                     return $expired_session_transient_delete_query_limit;
1166 1166
                 }
1167 1167
             );
@@ -1179,7 +1179,7 @@  discard block
 block discarded – undo
1179 1179
         $error = '<pre>';
1180 1180
         $data2 = preg_replace_callback(
1181 1181
             '!s:(\d+):"(.*?)";!',
1182
-            function ($match) {
1182
+            function($match) {
1183 1183
                 return ($match[1] === strlen($match[2]))
1184 1184
                     ? $match[0]
1185 1185
                     : 's:'
@@ -1191,13 +1191,13 @@  discard block
 block discarded – undo
1191 1191
             $data1
1192 1192
         );
1193 1193
         $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1194
-        $error .= $data1 . PHP_EOL;
1195
-        $error .= $data2 . PHP_EOL;
1194
+        $error .= $data1.PHP_EOL;
1195
+        $error .= $data2.PHP_EOL;
1196 1196
         for ($i = 0; $i < $max; $i++) {
1197
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1198
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1199
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1200
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1197
+            if (@$data1[$i] !== @$data2[$i]) {
1198
+                $error .= 'Difference '.@$data1[$i].' != '.@$data2[$i].PHP_EOL;
1199
+                $error .= "\t-> ORD number ".ord(@$data1[$i]).' != '.ord(@$data2[$i]).PHP_EOL;
1200
+                $error .= "\t-> Line Number = $i".PHP_EOL;
1201 1201
                 $start = ($i - 20);
1202 1202
                 $start = ($start < 0) ? 0 : $start;
1203 1203
                 $length = 40;
@@ -1212,7 +1212,7 @@  discard block
 block discarded – undo
1212 1212
                 $error .= "\t-> Section Data1  = ";
1213 1213
                 $error .= substr_replace(
1214 1214
                     substr($data1, $start, $length),
1215
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1215
+                    "<b style=\"color:green\">{$data1[$i]}</b>",
1216 1216
                     $rpoint,
1217 1217
                     $rlength
1218 1218
                 );
@@ -1220,7 +1220,7 @@  discard block
 block discarded – undo
1220 1220
                 $error .= "\t-> Section Data2  = ";
1221 1221
                 $error .= substr_replace(
1222 1222
                     substr($data2, $start, $length),
1223
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1223
+                    "<b style=\"color:red\">{$data2[$i]}</b>",
1224 1224
                     $rpoint,
1225 1225
                     $rlength
1226 1226
                 );
@@ -1251,7 +1251,7 @@  discard block
 block discarded – undo
1251 1251
     public function garbageCollection()
1252 1252
     {
1253 1253
         // only perform during regular requests if last garbage collection was over an hour ago
1254
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1254
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1255 1255
             $this->_last_gc = time();
1256 1256
             $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1257 1257
             /** @type WPDB $wpdb */
@@ -1286,7 +1286,7 @@  discard block
 block discarded – undo
1286 1286
                 // AND option_value < 1508368198 LIMIT 50
1287 1287
                 $expired_sessions = $wpdb->get_col($SQL);
1288 1288
                 // valid results?
1289
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1289
+                if ( ! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1290 1290
                     $this->cache_storage->deleteMany($expired_sessions, true);
1291 1291
                 }
1292 1292
             }
Please login to merge, or discard this patch.
Indentation   +1256 added lines, -1256 removed lines patch added patch discarded remove patch
@@ -23,1254 +23,1254 @@  discard block
 block discarded – undo
23 23
 class EE_Session implements SessionIdentifierInterface
24 24
 {
25 25
 
26
-    const session_id_prefix = 'ee_ssn_';
27
-
28
-    const hash_check_prefix = 'ee_shc_';
29
-
30
-    const OPTION_NAME_SETTINGS = 'ee_session_settings';
31
-
32
-    const STATUS_CLOSED = 0;
33
-
34
-    const STATUS_OPEN = 1;
35
-
36
-    /**
37
-     * instance of the EE_Session object
38
-     *
39
-     * @var EE_Session
40
-     */
41
-    private static $_instance;
42
-
43
-    /**
44
-     * @var CacheStorageInterface $cache_storage
45
-     */
46
-    protected $cache_storage;
47
-
48
-    /**
49
-     * EE_Encryption object
50
-     *
51
-     * @var EE_Encryption
52
-     */
53
-    protected $encryption;
54
-
55
-    /**
56
-     * the session id
57
-     *
58
-     * @var string
59
-     */
60
-    private $_sid;
61
-
62
-    /**
63
-     * session id salt
64
-     *
65
-     * @var string
66
-     */
67
-    private $_sid_salt;
68
-
69
-    /**
70
-     * session data
71
-     *
72
-     * @var array
73
-     */
74
-    private $_session_data = array();
75
-
76
-    /**
77
-     * how long an EE session lasts
78
-     * default session lifespan of 1 hour (for not so instant IPNs)
79
-     *
80
-     * @var SessionLifespan $session_lifespan
81
-     */
82
-    private $session_lifespan;
83
-
84
-    /**
85
-     * session expiration time as Unix timestamp in GMT
86
-     *
87
-     * @var int
88
-     */
89
-    private $_expiration;
90
-
91
-    /**
92
-     * whether or not session has expired at some point
93
-     *
94
-     * @var boolean
95
-     */
96
-    private $_expired = false;
97
-
98
-    /**
99
-     * current time as Unix timestamp in GMT
100
-     *
101
-     * @var int
102
-     */
103
-    private $_time;
104
-
105
-    /**
106
-     * whether to encrypt session data
107
-     *
108
-     * @var bool
109
-     */
110
-    private $_use_encryption;
111
-
112
-    /**
113
-     * well... according to the server...
114
-     *
115
-     * @var null
116
-     */
117
-    private $_user_agent;
118
-
119
-    /**
120
-     * do you really trust the server ?
121
-     *
122
-     * @var null
123
-     */
124
-    private $_ip_address;
125
-
126
-    /**
127
-     * current WP user_id
128
-     *
129
-     * @var null
130
-     */
131
-    private $_wp_user_id;
132
-
133
-    /**
134
-     * array for defining default session vars
135
-     *
136
-     * @var array
137
-     */
138
-    private $_default_session_vars = array(
139
-        'id'            => null,
140
-        'user_id'       => null,
141
-        'ip_address'    => null,
142
-        'user_agent'    => null,
143
-        'init_access'   => null,
144
-        'last_access'   => null,
145
-        'expiration'    => null,
146
-        'pages_visited' => array(),
147
-    );
148
-
149
-    /**
150
-     * timestamp for when last garbage collection cycle was performed
151
-     *
152
-     * @var int $_last_gc
153
-     */
154
-    private $_last_gc;
155
-
156
-    /**
157
-     * @var RequestInterface $request
158
-     */
159
-    protected $request;
160
-
161
-    /**
162
-     * whether session is active or not
163
-     *
164
-     * @var int $status
165
-     */
166
-    private $status = EE_Session::STATUS_CLOSED;
167
-
168
-
169
-    /**
170
-     * @singleton method used to instantiate class object
171
-     * @param CacheStorageInterface $cache_storage
172
-     * @param SessionLifespan|null  $lifespan
173
-     * @param RequestInterface      $request
174
-     * @param EE_Encryption         $encryption
175
-     * @return EE_Session
176
-     * @throws InvalidArgumentException
177
-     * @throws InvalidDataTypeException
178
-     * @throws InvalidInterfaceException
179
-     */
180
-    public static function instance(
181
-        CacheStorageInterface $cache_storage = null,
182
-        SessionLifespan $lifespan = null,
183
-        RequestInterface $request = null,
184
-        EE_Encryption $encryption = null
185
-    ) {
186
-        // check if class object is instantiated
187
-        // session loading is turned ON by default, but prior to the init hook, can be turned back OFF via:
188
-        // add_filter( 'FHEE_load_EE_Session', '__return_false' );
189
-        if (! self::$_instance instanceof EE_Session && apply_filters('FHEE_load_EE_Session', true)) {
190
-            self::$_instance = new self(
191
-                $cache_storage,
192
-                $lifespan,
193
-                $request,
194
-                $encryption
195
-            );
196
-        }
197
-        return self::$_instance;
198
-    }
199
-
200
-
201
-    /**
202
-     * protected constructor to prevent direct creation
203
-     *
204
-     * @param CacheStorageInterface $cache_storage
205
-     * @param SessionLifespan       $lifespan
206
-     * @param RequestInterface      $request
207
-     * @param EE_Encryption         $encryption
208
-     * @throws InvalidArgumentException
209
-     * @throws InvalidDataTypeException
210
-     * @throws InvalidInterfaceException
211
-     */
212
-    protected function __construct(
213
-        CacheStorageInterface $cache_storage,
214
-        SessionLifespan $lifespan,
215
-        RequestInterface $request,
216
-        EE_Encryption $encryption = null
217
-    ) {
218
-        // session loading is turned ON by default,
219
-        // but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
220
-        // (which currently fires on the init hook at priority 9),
221
-        // can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
222
-        if (! apply_filters('FHEE_load_EE_Session', true)) {
223
-            return;
224
-        }
225
-        $this->session_lifespan = $lifespan;
226
-        $this->request = $request;
227
-        if (! defined('ESPRESSO_SESSION')) {
228
-            define('ESPRESSO_SESSION', true);
229
-        }
230
-        // retrieve session options from db
231
-        $session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
232
-        if (! empty($session_settings)) {
233
-            // cycle though existing session options
234
-            foreach ($session_settings as $var_name => $session_setting) {
235
-                // set values for class properties
236
-                $var_name = '_' . $var_name;
237
-                $this->{$var_name} = $session_setting;
238
-            }
239
-        }
240
-        $this->cache_storage = $cache_storage;
241
-        // are we using encryption?
242
-        $this->_use_encryption = $encryption instanceof EE_Encryption
243
-                                 && EE_Registry::instance()->CFG->admin->encode_session_data();
244
-        // encrypt data via: $this->encryption->encrypt();
245
-        $this->encryption = $encryption;
246
-        // filter hook allows outside functions/classes/plugins to change default empty cart
247
-        $extra_default_session_vars = apply_filters('FHEE__EE_Session__construct__extra_default_session_vars', array());
248
-        array_merge($this->_default_session_vars, $extra_default_session_vars);
249
-        // apply default session vars
250
-        $this->_set_defaults();
251
-        add_action('AHEE__EE_System__initialize', array($this, 'open_session'));
252
-        // check request for 'clear_session' param
253
-        add_action('AHEE__EE_Request_Handler__construct__complete', array($this, 'wp_loaded'));
254
-        // once everything is all said and done,
255
-        add_action('shutdown', array($this, 'update'), 100);
256
-        add_action('shutdown', array($this, 'garbageCollection'), 1000);
257
-        $this->configure_garbage_collection_filters();
258
-    }
259
-
260
-
261
-    /**
262
-     * @return bool
263
-     * @throws InvalidArgumentException
264
-     * @throws InvalidDataTypeException
265
-     * @throws InvalidInterfaceException
266
-     */
267
-    public static function isLoadedAndActive()
268
-    {
269
-        return did_action('AHEE__EE_System__core_loaded_and_ready')
270
-               && EE_Session::instance() instanceof EE_Session
271
-               && EE_Session::instance()->isActive();
272
-    }
273
-
274
-
275
-    /**
276
-     * @return bool
277
-     */
278
-    public function isActive()
279
-    {
280
-        return $this->status === EE_Session::STATUS_OPEN;
281
-    }
282
-
283
-
284
-    /**
285
-     * @return void
286
-     * @throws EE_Error
287
-     * @throws InvalidArgumentException
288
-     * @throws InvalidDataTypeException
289
-     * @throws InvalidInterfaceException
290
-     * @throws InvalidSessionDataException
291
-     */
292
-    public function open_session()
293
-    {
294
-        // check for existing session and retrieve it from db
295
-        if (! $this->_espresso_session()) {
296
-            // or just start a new one
297
-            $this->_create_espresso_session();
298
-        }
299
-    }
300
-
301
-
302
-    /**
303
-     * @return bool
304
-     */
305
-    public function expired()
306
-    {
307
-        return $this->_expired;
308
-    }
309
-
310
-
311
-    /**
312
-     * @return void
313
-     */
314
-    public function reset_expired()
315
-    {
316
-        $this->_expired = false;
317
-    }
318
-
319
-
320
-    /**
321
-     * @return int
322
-     */
323
-    public function expiration()
324
-    {
325
-        return $this->_expiration;
326
-    }
327
-
328
-
329
-    /**
330
-     * @return int
331
-     */
332
-    public function extension()
333
-    {
334
-        return apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS);
335
-    }
336
-
337
-
338
-    /**
339
-     * @param int $time number of seconds to add to session expiration
340
-     */
341
-    public function extend_expiration($time = 0)
342
-    {
343
-        $time = $time ? $time : $this->extension();
344
-        $this->_expiration += absint($time);
345
-    }
346
-
347
-
348
-    /**
349
-     * @return int
350
-     */
351
-    public function lifespan()
352
-    {
353
-        return $this->session_lifespan->inSeconds();
354
-    }
355
-
356
-
357
-    /**
358
-     * This just sets some defaults for the _session data property
359
-     *
360
-     * @access private
361
-     * @return void
362
-     */
363
-    private function _set_defaults()
364
-    {
365
-        // set some defaults
366
-        foreach ($this->_default_session_vars as $key => $default_var) {
367
-            if (is_array($default_var)) {
368
-                $this->_session_data[ $key ] = array();
369
-            } else {
370
-                $this->_session_data[ $key ] = '';
371
-            }
372
-        }
373
-    }
374
-
375
-
376
-    /**
377
-     * @retrieve  session data
378
-     * @access    public
379
-     * @return    string
380
-     */
381
-    public function id()
382
-    {
383
-        return $this->_sid;
384
-    }
385
-
386
-
387
-    /**
388
-     * @param \EE_Cart $cart
389
-     * @return bool
390
-     */
391
-    public function set_cart(EE_Cart $cart)
392
-    {
393
-        $this->_session_data['cart'] = $cart;
394
-        return true;
395
-    }
396
-
397
-
398
-    /**
399
-     * reset_cart
400
-     */
401
-    public function reset_cart()
402
-    {
403
-        do_action('AHEE__EE_Session__reset_cart__before_reset', $this);
404
-        $this->_session_data['cart'] = null;
405
-    }
406
-
407
-
408
-    /**
409
-     * @return \EE_Cart
410
-     */
411
-    public function cart()
412
-    {
413
-        return isset($this->_session_data['cart']) && $this->_session_data['cart'] instanceof EE_Cart
414
-            ? $this->_session_data['cart']
415
-            : null;
416
-    }
417
-
418
-
419
-    /**
420
-     * @param \EE_Checkout $checkout
421
-     * @return bool
422
-     */
423
-    public function set_checkout(EE_Checkout $checkout)
424
-    {
425
-        $this->_session_data['checkout'] = $checkout;
426
-        return true;
427
-    }
428
-
429
-
430
-    /**
431
-     * reset_checkout
432
-     */
433
-    public function reset_checkout()
434
-    {
435
-        do_action('AHEE__EE_Session__reset_checkout__before_reset', $this);
436
-        $this->_session_data['checkout'] = null;
437
-    }
438
-
439
-
440
-    /**
441
-     * @return \EE_Checkout
442
-     */
443
-    public function checkout()
444
-    {
445
-        return isset($this->_session_data['checkout']) && $this->_session_data['checkout'] instanceof EE_Checkout
446
-            ? $this->_session_data['checkout']
447
-            : null;
448
-    }
449
-
450
-
451
-    /**
452
-     * @param \EE_Transaction $transaction
453
-     * @return bool
454
-     * @throws EE_Error
455
-     */
456
-    public function set_transaction(EE_Transaction $transaction)
457
-    {
458
-        // first remove the session from the transaction before we save the transaction in the session
459
-        $transaction->set_txn_session_data(null);
460
-        $this->_session_data['transaction'] = $transaction;
461
-        return true;
462
-    }
463
-
464
-
465
-    /**
466
-     * reset_transaction
467
-     */
468
-    public function reset_transaction()
469
-    {
470
-        do_action('AHEE__EE_Session__reset_transaction__before_reset', $this);
471
-        $this->_session_data['transaction'] = null;
472
-    }
473
-
474
-
475
-    /**
476
-     * @return \EE_Transaction
477
-     */
478
-    public function transaction()
479
-    {
480
-        return isset($this->_session_data['transaction'])
481
-               && $this->_session_data['transaction'] instanceof EE_Transaction
482
-            ? $this->_session_data['transaction']
483
-            : null;
484
-    }
485
-
486
-
487
-    /**
488
-     * retrieve session data
489
-     *
490
-     * @param null $key
491
-     * @param bool $reset_cache
492
-     * @return array
493
-     */
494
-    public function get_session_data($key = null, $reset_cache = false)
495
-    {
496
-        if ($reset_cache) {
497
-            $this->reset_cart();
498
-            $this->reset_checkout();
499
-            $this->reset_transaction();
500
-        }
501
-        if (! empty($key)) {
502
-            return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
503
-        }
504
-        return $this->_session_data;
505
-    }
506
-
507
-
508
-    /**
509
-     * Returns TRUE on success, FALSE on fail
510
-     *
511
-     * @param array $data
512
-     * @return bool
513
-     */
514
-    public function set_session_data($data)
515
-    {
516
-        // nothing ??? bad data ??? go home!
517
-        if (empty($data) || ! is_array($data)) {
518
-            EE_Error::add_error(
519
-                esc_html__(
520
-                    'No session data or invalid session data was provided.',
521
-                    'event_espresso'
522
-                ),
523
-                __FILE__,
524
-                __FUNCTION__,
525
-                __LINE__
526
-            );
527
-            return false;
528
-        }
529
-        foreach ($data as $key => $value) {
530
-            if (isset($this->_default_session_vars[ $key ])) {
531
-                EE_Error::add_error(
532
-                    sprintf(
533
-                        esc_html__(
534
-                            'Sorry! %s is a default session datum and can not be reset.',
535
-                            'event_espresso'
536
-                        ),
537
-                        $key
538
-                    ),
539
-                    __FILE__,
540
-                    __FUNCTION__,
541
-                    __LINE__
542
-                );
543
-                return false;
544
-            }
545
-            $this->_session_data[ $key ] = $value;
546
-        }
547
-        return true;
548
-    }
549
-
550
-
551
-    /**
552
-     * @initiate session
553
-     * @access   private
554
-     * @return TRUE on success, FALSE on fail
555
-     * @throws EE_Error
556
-     * @throws InvalidArgumentException
557
-     * @throws InvalidDataTypeException
558
-     * @throws InvalidInterfaceException
559
-     * @throws InvalidSessionDataException
560
-     */
561
-    private function _espresso_session()
562
-    {
563
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
564
-        // check that session has started
565
-        if (session_id() === '') {
566
-            // starts a new session if one doesn't already exist, or re-initiates an existing one
567
-            session_start();
568
-        }
569
-        $this->status = EE_Session::STATUS_OPEN;
570
-        // get our modified session ID
571
-        $this->_sid = $this->_generate_session_id();
572
-        // and the visitors IP
573
-        $this->_ip_address = $this->request->ipAddress();
574
-        // set the "user agent"
575
-        $this->_user_agent = $this->request->userAgent();
576
-        // now let's retrieve what's in the db
577
-        $session_data = $this->_retrieve_session_data();
578
-        if (! empty($session_data)) {
579
-            // get the current time in UTC
580
-            $this->_time = $this->_time !== null ? $this->_time : time();
581
-            // and reset the session expiration
582
-            $this->_expiration = isset($session_data['expiration'])
583
-                ? $session_data['expiration']
584
-                : $this->_time + $this->session_lifespan->inSeconds();
585
-        } else {
586
-            // set initial site access time and the session expiration
587
-            $this->_set_init_access_and_expiration();
588
-            // set referer
589
-            $this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
590
-                ? esc_attr($_SERVER['HTTP_REFERER'])
591
-                : '';
592
-            // no previous session = go back and create one (on top of the data above)
593
-            return false;
594
-        }
595
-        // now the user agent
596
-        if ($session_data['user_agent'] !== $this->_user_agent) {
597
-            return false;
598
-        }
599
-        // wait a minute... how old are you?
600
-        if ($this->_time > $this->_expiration) {
601
-            // yer too old fer me!
602
-            $this->_expired = true;
603
-            // wipe out everything that isn't a default session datum
604
-            $this->clear_session(__CLASS__, __FUNCTION__);
605
-        }
606
-        // make event espresso session data available to plugin
607
-        $this->_session_data = array_merge($this->_session_data, $session_data);
608
-        return true;
609
-    }
610
-
611
-
612
-    /**
613
-     * _get_session_data
614
-     * Retrieves the session data, and attempts to correct any encoding issues that can occur due to improperly setup
615
-     * databases
616
-     *
617
-     * @return array
618
-     * @throws EE_Error
619
-     * @throws InvalidArgumentException
620
-     * @throws InvalidSessionDataException
621
-     * @throws InvalidDataTypeException
622
-     * @throws InvalidInterfaceException
623
-     */
624
-    protected function _retrieve_session_data()
625
-    {
626
-        $ssn_key = EE_Session::session_id_prefix . $this->_sid;
627
-        try {
628
-            // we're using WP's Transient API to store session data using the PHP session ID as the option name
629
-            $session_data = $this->cache_storage->get($ssn_key, false);
630
-            if (empty($session_data)) {
631
-                return array();
632
-            }
633
-            if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
634
-                $hash_check = $this->cache_storage->get(
635
-                    EE_Session::hash_check_prefix . $this->_sid,
636
-                    false
637
-                );
638
-                if ($hash_check && $hash_check !== md5($session_data)) {
639
-                    EE_Error::add_error(
640
-                        sprintf(
641
-                            __(
642
-                                'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
643
-                                'event_espresso'
644
-                            ),
645
-                            EE_Session::session_id_prefix . $this->_sid
646
-                        ),
647
-                        __FILE__,
648
-                        __FUNCTION__,
649
-                        __LINE__
650
-                    );
651
-                }
652
-            }
653
-        } catch (Exception $e) {
654
-            // let's just eat that error for now and attempt to correct any corrupted data
655
-            global $wpdb;
656
-            $row = $wpdb->get_row(
657
-                $wpdb->prepare(
658
-                    "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
659
-                    '_transient_' . $ssn_key
660
-                )
661
-            );
662
-            $session_data = is_object($row) ? $row->option_value : null;
663
-            if ($session_data) {
664
-                $session_data = preg_replace_callback(
665
-                    '!s:(d+):"(.*?)";!',
666
-                    function ($match) {
667
-                        return $match[1] === strlen($match[2])
668
-                            ? $match[0]
669
-                            : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
670
-                    },
671
-                    $session_data
672
-                );
673
-            }
674
-            $session_data = maybe_unserialize($session_data);
675
-        }
676
-        // in case the data is encoded... try to decode it
677
-        $session_data = $this->encryption instanceof EE_Encryption
678
-            ? $this->encryption->base64_string_decode($session_data)
679
-            : $session_data;
680
-        if (! is_array($session_data)) {
681
-            try {
682
-                $session_data = maybe_unserialize($session_data);
683
-            } catch (Exception $e) {
684
-                $msg = esc_html__(
685
-                    'An error occurred while attempting to unserialize the session data.',
686
-                    'event_espresso'
687
-                );
688
-                $msg .= WP_DEBUG
689
-                    ? '<br><pre>'
690
-                      . print_r($session_data, true)
691
-                      . '</pre><br>'
692
-                      . $this->find_serialize_error($session_data)
693
-                    : '';
694
-                $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
695
-                throw new InvalidSessionDataException($msg, 0, $e);
696
-            }
697
-        }
698
-        // just a check to make sure the session array is indeed an array
699
-        if (! is_array($session_data)) {
700
-            // no?!?! then something is wrong
701
-            $msg = esc_html__(
702
-                'The session data is missing, invalid, or corrupted.',
703
-                'event_espresso'
704
-            );
705
-            $msg .= WP_DEBUG
706
-                ? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
707
-                : '';
708
-            $this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
709
-            throw new InvalidSessionDataException($msg);
710
-        }
711
-        if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
712
-            $session_data['transaction'] = EEM_Transaction::instance()->get_one_by_ID(
713
-                $session_data['transaction']
714
-            );
715
-        }
716
-        return $session_data;
717
-    }
718
-
719
-
720
-    /**
721
-     * _generate_session_id
722
-     * Retrieves the PHP session id either directly from the PHP session,
723
-     * or from the $_REQUEST array if it was passed in from an AJAX request.
724
-     * The session id is then salted and hashed (mmm sounds tasty)
725
-     * so that it can be safely used as a $_REQUEST param
726
-     *
727
-     * @return string
728
-     */
729
-    protected function _generate_session_id()
730
-    {
731
-        // check if the SID was passed explicitly, otherwise get from session, then add salt and hash it to reduce length
732
-        if (isset($_REQUEST['EESID'])) {
733
-            $session_id = sanitize_text_field($_REQUEST['EESID']);
734
-        } else {
735
-            $session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
736
-        }
737
-        return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
738
-    }
739
-
740
-
741
-    /**
742
-     * _get_sid_salt
743
-     *
744
-     * @return string
745
-     */
746
-    protected function _get_sid_salt()
747
-    {
748
-        // was session id salt already saved to db ?
749
-        if (empty($this->_sid_salt)) {
750
-            // no?  then maybe use WP defined constant
751
-            if (defined('AUTH_SALT')) {
752
-                $this->_sid_salt = AUTH_SALT;
753
-            }
754
-            // if salt doesn't exist or is too short
755
-            if (strlen($this->_sid_salt) < 32) {
756
-                // create a new one
757
-                $this->_sid_salt = wp_generate_password(64);
758
-            }
759
-            // and save it as a permanent session setting
760
-            $this->updateSessionSettings(array('sid_salt' => $this->_sid_salt));
761
-        }
762
-        return $this->_sid_salt;
763
-    }
764
-
765
-
766
-    /**
767
-     * _set_init_access_and_expiration
768
-     *
769
-     * @return void
770
-     */
771
-    protected function _set_init_access_and_expiration()
772
-    {
773
-        $this->_time = time();
774
-        $this->_expiration = $this->_time + $this->session_lifespan->inSeconds();
775
-        // set initial site access time
776
-        $this->_session_data['init_access'] = $this->_time;
777
-        // and the session expiration
778
-        $this->_session_data['expiration'] = $this->_expiration;
779
-    }
780
-
781
-
782
-    /**
783
-     * @update session data  prior to saving to the db
784
-     * @access public
785
-     * @param bool $new_session
786
-     * @return TRUE on success, FALSE on fail
787
-     * @throws EE_Error
788
-     * @throws InvalidArgumentException
789
-     * @throws InvalidDataTypeException
790
-     * @throws InvalidInterfaceException
791
-     */
792
-    public function update($new_session = false)
793
-    {
794
-        $this->_session_data = $this->_session_data !== null
795
-                               && is_array($this->_session_data)
796
-                               && isset($this->_session_data['id'])
797
-            ? $this->_session_data
798
-            : array();
799
-        if (empty($this->_session_data)) {
800
-            $this->_set_defaults();
801
-        }
802
-        $session_data = array();
803
-        foreach ($this->_session_data as $key => $value) {
804
-            switch ($key) {
805
-                case 'id':
806
-                    // session ID
807
-                    $session_data['id'] = $this->_sid;
808
-                    break;
809
-                case 'ip_address':
810
-                    // visitor ip address
811
-                    $session_data['ip_address'] = $this->request->ipAddress();
812
-                    break;
813
-                case 'user_agent':
814
-                    // visitor user_agent
815
-                    $session_data['user_agent'] = $this->_user_agent;
816
-                    break;
817
-                case 'init_access':
818
-                    $session_data['init_access'] = absint($value);
819
-                    break;
820
-                case 'last_access':
821
-                    // current access time
822
-                    $session_data['last_access'] = $this->_time;
823
-                    break;
824
-                case 'expiration':
825
-                    // when the session expires
826
-                    $session_data['expiration'] = ! empty($this->_expiration)
827
-                        ? $this->_expiration
828
-                        : $session_data['init_access'] + $this->session_lifespan->inSeconds();
829
-                    break;
830
-                case 'user_id':
831
-                    // current user if logged in
832
-                    $session_data['user_id'] = $this->_wp_user_id();
833
-                    break;
834
-                case 'pages_visited':
835
-                    $page_visit = $this->_get_page_visit();
836
-                    if ($page_visit) {
837
-                        // set pages visited where the first will be the http referrer
838
-                        $this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
839
-                        // we'll only save the last 10 page visits.
840
-                        $session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
841
-                    }
842
-                    break;
843
-                default:
844
-                    // carry any other data over
845
-                    $session_data[ $key ] = $this->_session_data[ $key ];
846
-            }
847
-        }
848
-        $this->_session_data = $session_data;
849
-        // creating a new session does not require saving to the db just yet
850
-        if (! $new_session) {
851
-            // ready? let's save
852
-            if ($this->_save_session_to_db()) {
853
-                return true;
854
-            }
855
-            return false;
856
-        }
857
-        // meh, why not?
858
-        return true;
859
-    }
860
-
861
-
862
-    /**
863
-     * @create session data array
864
-     * @access public
865
-     * @return bool
866
-     * @throws EE_Error
867
-     * @throws InvalidArgumentException
868
-     * @throws InvalidDataTypeException
869
-     * @throws InvalidInterfaceException
870
-     */
871
-    private function _create_espresso_session()
872
-    {
873
-        do_action('AHEE_log', __CLASS__, __FUNCTION__, '');
874
-        // use the update function for now with $new_session arg set to TRUE
875
-        return $this->update(true) ? true : false;
876
-    }
877
-
878
-    /**
879
-     * Detects if there is anything worth saving in the session (eg the cart is a good one, notices are pretty good
880
-     * too). This is used when determining if we want to save the session or not.
881
-     * @since 4.9.67.p
882
-     * @return bool
883
-     */
884
-    private function sessionHasStuffWorthSaving()
885
-    {
886
-        return $this->cart() instanceof EE_Cart
887
-            || (
888
-                isset($this->_session_data['ee_notices'])
889
-                && (
890
-                    ! empty($this->_session_data['ee_notices']['attention'])
891
-                    || !empty($this->_session_data['ee_notices']['errors'])
892
-                    || !empty($this->_session_data['ee_notices']['success'])
893
-                )
894
-            );
895
-    }
896
-    /**
897
-     * _save_session_to_db
898
-     *
899
-     * @param bool $clear_session
900
-     * @return string
901
-     * @throws EE_Error
902
-     * @throws InvalidArgumentException
903
-     * @throws InvalidDataTypeException
904
-     * @throws InvalidInterfaceException
905
-     */
906
-    private function _save_session_to_db($clear_session = false)
907
-    {
908
-        // don't save sessions for crawlers
909
-        // and unless we're deleting the session data, don't save anything if there isn't a cart
910
-        if ($this->request->isBot()
911
-            || (
912
-                ! $clear_session
913
-                && ! $this->sessionHasStuffWorthSaving()
914
-                && apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
915
-            )
916
-        ) {
917
-            return false;
918
-        }
919
-        $transaction = $this->transaction();
920
-        if ($transaction instanceof EE_Transaction) {
921
-            if (! $transaction->ID()) {
922
-                $transaction->save();
923
-            }
924
-            $this->_session_data['transaction'] = $transaction->ID();
925
-        }
926
-        // then serialize all of our session data
927
-        $session_data = serialize($this->_session_data);
928
-        // do we need to also encode it to avoid corrupted data when saved to the db?
929
-        $session_data = $this->_use_encryption
930
-            ? $this->encryption->base64_string_encode($session_data)
931
-            : $session_data;
932
-        // maybe save hash check
933
-        if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
934
-            $this->cache_storage->add(
935
-                EE_Session::hash_check_prefix . $this->_sid,
936
-                md5($session_data),
937
-                $this->session_lifespan->inSeconds()
938
-            );
939
-        }
940
-        // we're using the Transient API for storing session data,
941
-        return $this->cache_storage->add(
942
-            EE_Session::session_id_prefix . $this->_sid,
943
-            $session_data,
944
-            $this->session_lifespan->inSeconds()
945
-        );
946
-    }
947
-
948
-
949
-    /**
950
-     * @get    the full page request the visitor is accessing
951
-     * @access public
952
-     * @return string
953
-     */
954
-    public function _get_page_visit()
955
-    {
956
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
957
-        // check for request url
958
-        if (isset($_SERVER['REQUEST_URI'])) {
959
-            $http_host = '';
960
-            $page_id = '?';
961
-            $e_reg = '';
962
-            $request_uri = esc_url($_SERVER['REQUEST_URI']);
963
-            $ru_bits = explode('?', $request_uri);
964
-            $request_uri = $ru_bits[0];
965
-            // check for and grab host as well
966
-            if (isset($_SERVER['HTTP_HOST'])) {
967
-                $http_host = esc_url($_SERVER['HTTP_HOST']);
968
-            }
969
-            // check for page_id in SERVER REQUEST
970
-            if (isset($_REQUEST['page_id'])) {
971
-                // rebuild $e_reg without any of the extra parameters
972
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
973
-            }
974
-            // check for $e_reg in SERVER REQUEST
975
-            if (isset($_REQUEST['ee'])) {
976
-                // rebuild $e_reg without any of the extra parameters
977
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
978
-            }
979
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
980
-        }
981
-        return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
982
-    }
983
-
984
-
985
-    /**
986
-     * @the    current wp user id
987
-     * @access public
988
-     * @return int
989
-     */
990
-    public function _wp_user_id()
991
-    {
992
-        // if I need to explain the following lines of code, then you shouldn't be looking at this!
993
-        $this->_wp_user_id = get_current_user_id();
994
-        return $this->_wp_user_id;
995
-    }
996
-
997
-
998
-    /**
999
-     * Clear EE_Session data
1000
-     *
1001
-     * @access public
1002
-     * @param string $class
1003
-     * @param string $function
1004
-     * @return void
1005
-     * @throws EE_Error
1006
-     * @throws InvalidArgumentException
1007
-     * @throws InvalidDataTypeException
1008
-     * @throws InvalidInterfaceException
1009
-     */
1010
-    public function clear_session($class = '', $function = '')
1011
-    {
26
+	const session_id_prefix = 'ee_ssn_';
27
+
28
+	const hash_check_prefix = 'ee_shc_';
29
+
30
+	const OPTION_NAME_SETTINGS = 'ee_session_settings';
31
+
32
+	const STATUS_CLOSED = 0;
33
+
34
+	const STATUS_OPEN = 1;
35
+
36
+	/**
37
+	 * instance of the EE_Session object
38
+	 *
39
+	 * @var EE_Session
40
+	 */
41
+	private static $_instance;
42
+
43
+	/**
44
+	 * @var CacheStorageInterface $cache_storage
45
+	 */
46
+	protected $cache_storage;
47
+
48
+	/**
49
+	 * EE_Encryption object
50
+	 *
51
+	 * @var EE_Encryption
52
+	 */
53
+	protected $encryption;
54
+
55
+	/**
56
+	 * the session id
57
+	 *
58
+	 * @var string
59
+	 */
60
+	private $_sid;
61
+
62
+	/**
63
+	 * session id salt
64
+	 *
65
+	 * @var string
66
+	 */
67
+	private $_sid_salt;
68
+
69
+	/**
70
+	 * session data
71
+	 *
72
+	 * @var array
73
+	 */
74
+	private $_session_data = array();
75
+
76
+	/**
77
+	 * how long an EE session lasts
78
+	 * default session lifespan of 1 hour (for not so instant IPNs)
79
+	 *
80
+	 * @var SessionLifespan $session_lifespan
81
+	 */
82
+	private $session_lifespan;
83
+
84
+	/**
85
+	 * session expiration time as Unix timestamp in GMT
86
+	 *
87
+	 * @var int
88
+	 */
89
+	private $_expiration;
90
+
91
+	/**
92
+	 * whether or not session has expired at some point
93
+	 *
94
+	 * @var boolean
95
+	 */
96
+	private $_expired = false;
97
+
98
+	/**
99
+	 * current time as Unix timestamp in GMT
100
+	 *
101
+	 * @var int
102
+	 */
103
+	private $_time;
104
+
105
+	/**
106
+	 * whether to encrypt session data
107
+	 *
108
+	 * @var bool
109
+	 */
110
+	private $_use_encryption;
111
+
112
+	/**
113
+	 * well... according to the server...
114
+	 *
115
+	 * @var null
116
+	 */
117
+	private $_user_agent;
118
+
119
+	/**
120
+	 * do you really trust the server ?
121
+	 *
122
+	 * @var null
123
+	 */
124
+	private $_ip_address;
125
+
126
+	/**
127
+	 * current WP user_id
128
+	 *
129
+	 * @var null
130
+	 */
131
+	private $_wp_user_id;
132
+
133
+	/**
134
+	 * array for defining default session vars
135
+	 *
136
+	 * @var array
137
+	 */
138
+	private $_default_session_vars = array(
139
+		'id'            => null,
140
+		'user_id'       => null,
141
+		'ip_address'    => null,
142
+		'user_agent'    => null,
143
+		'init_access'   => null,
144
+		'last_access'   => null,
145
+		'expiration'    => null,
146
+		'pages_visited' => array(),
147
+	);
148
+
149
+	/**
150
+	 * timestamp for when last garbage collection cycle was performed
151
+	 *
152
+	 * @var int $_last_gc
153
+	 */
154
+	private $_last_gc;
155
+
156
+	/**
157
+	 * @var RequestInterface $request
158
+	 */
159
+	protected $request;
160
+
161
+	/**
162
+	 * whether session is active or not
163
+	 *
164
+	 * @var int $status
165
+	 */
166
+	private $status = EE_Session::STATUS_CLOSED;
167
+
168
+
169
+	/**
170
+	 * @singleton method used to instantiate class object
171
+	 * @param CacheStorageInterface $cache_storage
172
+	 * @param SessionLifespan|null  $lifespan
173
+	 * @param RequestInterface      $request
174
+	 * @param EE_Encryption         $encryption
175
+	 * @return EE_Session
176
+	 * @throws InvalidArgumentException
177
+	 * @throws InvalidDataTypeException
178
+	 * @throws InvalidInterfaceException
179
+	 */
180
+	public static function instance(
181
+		CacheStorageInterface $cache_storage = null,
182
+		SessionLifespan $lifespan = null,
183
+		RequestInterface $request = null,
184
+		EE_Encryption $encryption = null
185
+	) {
186
+		// check if class object is instantiated
187
+		// session loading is turned ON by default, but prior to the init hook, can be turned back OFF via:
188
+		// add_filter( 'FHEE_load_EE_Session', '__return_false' );
189
+		if (! self::$_instance instanceof EE_Session && apply_filters('FHEE_load_EE_Session', true)) {
190
+			self::$_instance = new self(
191
+				$cache_storage,
192
+				$lifespan,
193
+				$request,
194
+				$encryption
195
+			);
196
+		}
197
+		return self::$_instance;
198
+	}
199
+
200
+
201
+	/**
202
+	 * protected constructor to prevent direct creation
203
+	 *
204
+	 * @param CacheStorageInterface $cache_storage
205
+	 * @param SessionLifespan       $lifespan
206
+	 * @param RequestInterface      $request
207
+	 * @param EE_Encryption         $encryption
208
+	 * @throws InvalidArgumentException
209
+	 * @throws InvalidDataTypeException
210
+	 * @throws InvalidInterfaceException
211
+	 */
212
+	protected function __construct(
213
+		CacheStorageInterface $cache_storage,
214
+		SessionLifespan $lifespan,
215
+		RequestInterface $request,
216
+		EE_Encryption $encryption = null
217
+	) {
218
+		// session loading is turned ON by default,
219
+		// but prior to the 'AHEE__EE_System__core_loaded_and_ready' hook
220
+		// (which currently fires on the init hook at priority 9),
221
+		// can be turned back OFF via: add_filter( 'FHEE_load_EE_Session', '__return_false' );
222
+		if (! apply_filters('FHEE_load_EE_Session', true)) {
223
+			return;
224
+		}
225
+		$this->session_lifespan = $lifespan;
226
+		$this->request = $request;
227
+		if (! defined('ESPRESSO_SESSION')) {
228
+			define('ESPRESSO_SESSION', true);
229
+		}
230
+		// retrieve session options from db
231
+		$session_settings = (array) get_option(EE_Session::OPTION_NAME_SETTINGS, array());
232
+		if (! empty($session_settings)) {
233
+			// cycle though existing session options
234
+			foreach ($session_settings as $var_name => $session_setting) {
235
+				// set values for class properties
236
+				$var_name = '_' . $var_name;
237
+				$this->{$var_name} = $session_setting;
238
+			}
239
+		}
240
+		$this->cache_storage = $cache_storage;
241
+		// are we using encryption?
242
+		$this->_use_encryption = $encryption instanceof EE_Encryption
243
+								 && EE_Registry::instance()->CFG->admin->encode_session_data();
244
+		// encrypt data via: $this->encryption->encrypt();
245
+		$this->encryption = $encryption;
246
+		// filter hook allows outside functions/classes/plugins to change default empty cart
247
+		$extra_default_session_vars = apply_filters('FHEE__EE_Session__construct__extra_default_session_vars', array());
248
+		array_merge($this->_default_session_vars, $extra_default_session_vars);
249
+		// apply default session vars
250
+		$this->_set_defaults();
251
+		add_action('AHEE__EE_System__initialize', array($this, 'open_session'));
252
+		// check request for 'clear_session' param
253
+		add_action('AHEE__EE_Request_Handler__construct__complete', array($this, 'wp_loaded'));
254
+		// once everything is all said and done,
255
+		add_action('shutdown', array($this, 'update'), 100);
256
+		add_action('shutdown', array($this, 'garbageCollection'), 1000);
257
+		$this->configure_garbage_collection_filters();
258
+	}
259
+
260
+
261
+	/**
262
+	 * @return bool
263
+	 * @throws InvalidArgumentException
264
+	 * @throws InvalidDataTypeException
265
+	 * @throws InvalidInterfaceException
266
+	 */
267
+	public static function isLoadedAndActive()
268
+	{
269
+		return did_action('AHEE__EE_System__core_loaded_and_ready')
270
+			   && EE_Session::instance() instanceof EE_Session
271
+			   && EE_Session::instance()->isActive();
272
+	}
273
+
274
+
275
+	/**
276
+	 * @return bool
277
+	 */
278
+	public function isActive()
279
+	{
280
+		return $this->status === EE_Session::STATUS_OPEN;
281
+	}
282
+
283
+
284
+	/**
285
+	 * @return void
286
+	 * @throws EE_Error
287
+	 * @throws InvalidArgumentException
288
+	 * @throws InvalidDataTypeException
289
+	 * @throws InvalidInterfaceException
290
+	 * @throws InvalidSessionDataException
291
+	 */
292
+	public function open_session()
293
+	{
294
+		// check for existing session and retrieve it from db
295
+		if (! $this->_espresso_session()) {
296
+			// or just start a new one
297
+			$this->_create_espresso_session();
298
+		}
299
+	}
300
+
301
+
302
+	/**
303
+	 * @return bool
304
+	 */
305
+	public function expired()
306
+	{
307
+		return $this->_expired;
308
+	}
309
+
310
+
311
+	/**
312
+	 * @return void
313
+	 */
314
+	public function reset_expired()
315
+	{
316
+		$this->_expired = false;
317
+	}
318
+
319
+
320
+	/**
321
+	 * @return int
322
+	 */
323
+	public function expiration()
324
+	{
325
+		return $this->_expiration;
326
+	}
327
+
328
+
329
+	/**
330
+	 * @return int
331
+	 */
332
+	public function extension()
333
+	{
334
+		return apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS);
335
+	}
336
+
337
+
338
+	/**
339
+	 * @param int $time number of seconds to add to session expiration
340
+	 */
341
+	public function extend_expiration($time = 0)
342
+	{
343
+		$time = $time ? $time : $this->extension();
344
+		$this->_expiration += absint($time);
345
+	}
346
+
347
+
348
+	/**
349
+	 * @return int
350
+	 */
351
+	public function lifespan()
352
+	{
353
+		return $this->session_lifespan->inSeconds();
354
+	}
355
+
356
+
357
+	/**
358
+	 * This just sets some defaults for the _session data property
359
+	 *
360
+	 * @access private
361
+	 * @return void
362
+	 */
363
+	private function _set_defaults()
364
+	{
365
+		// set some defaults
366
+		foreach ($this->_default_session_vars as $key => $default_var) {
367
+			if (is_array($default_var)) {
368
+				$this->_session_data[ $key ] = array();
369
+			} else {
370
+				$this->_session_data[ $key ] = '';
371
+			}
372
+		}
373
+	}
374
+
375
+
376
+	/**
377
+	 * @retrieve  session data
378
+	 * @access    public
379
+	 * @return    string
380
+	 */
381
+	public function id()
382
+	{
383
+		return $this->_sid;
384
+	}
385
+
386
+
387
+	/**
388
+	 * @param \EE_Cart $cart
389
+	 * @return bool
390
+	 */
391
+	public function set_cart(EE_Cart $cart)
392
+	{
393
+		$this->_session_data['cart'] = $cart;
394
+		return true;
395
+	}
396
+
397
+
398
+	/**
399
+	 * reset_cart
400
+	 */
401
+	public function reset_cart()
402
+	{
403
+		do_action('AHEE__EE_Session__reset_cart__before_reset', $this);
404
+		$this->_session_data['cart'] = null;
405
+	}
406
+
407
+
408
+	/**
409
+	 * @return \EE_Cart
410
+	 */
411
+	public function cart()
412
+	{
413
+		return isset($this->_session_data['cart']) && $this->_session_data['cart'] instanceof EE_Cart
414
+			? $this->_session_data['cart']
415
+			: null;
416
+	}
417
+
418
+
419
+	/**
420
+	 * @param \EE_Checkout $checkout
421
+	 * @return bool
422
+	 */
423
+	public function set_checkout(EE_Checkout $checkout)
424
+	{
425
+		$this->_session_data['checkout'] = $checkout;
426
+		return true;
427
+	}
428
+
429
+
430
+	/**
431
+	 * reset_checkout
432
+	 */
433
+	public function reset_checkout()
434
+	{
435
+		do_action('AHEE__EE_Session__reset_checkout__before_reset', $this);
436
+		$this->_session_data['checkout'] = null;
437
+	}
438
+
439
+
440
+	/**
441
+	 * @return \EE_Checkout
442
+	 */
443
+	public function checkout()
444
+	{
445
+		return isset($this->_session_data['checkout']) && $this->_session_data['checkout'] instanceof EE_Checkout
446
+			? $this->_session_data['checkout']
447
+			: null;
448
+	}
449
+
450
+
451
+	/**
452
+	 * @param \EE_Transaction $transaction
453
+	 * @return bool
454
+	 * @throws EE_Error
455
+	 */
456
+	public function set_transaction(EE_Transaction $transaction)
457
+	{
458
+		// first remove the session from the transaction before we save the transaction in the session
459
+		$transaction->set_txn_session_data(null);
460
+		$this->_session_data['transaction'] = $transaction;
461
+		return true;
462
+	}
463
+
464
+
465
+	/**
466
+	 * reset_transaction
467
+	 */
468
+	public function reset_transaction()
469
+	{
470
+		do_action('AHEE__EE_Session__reset_transaction__before_reset', $this);
471
+		$this->_session_data['transaction'] = null;
472
+	}
473
+
474
+
475
+	/**
476
+	 * @return \EE_Transaction
477
+	 */
478
+	public function transaction()
479
+	{
480
+		return isset($this->_session_data['transaction'])
481
+			   && $this->_session_data['transaction'] instanceof EE_Transaction
482
+			? $this->_session_data['transaction']
483
+			: null;
484
+	}
485
+
486
+
487
+	/**
488
+	 * retrieve session data
489
+	 *
490
+	 * @param null $key
491
+	 * @param bool $reset_cache
492
+	 * @return array
493
+	 */
494
+	public function get_session_data($key = null, $reset_cache = false)
495
+	{
496
+		if ($reset_cache) {
497
+			$this->reset_cart();
498
+			$this->reset_checkout();
499
+			$this->reset_transaction();
500
+		}
501
+		if (! empty($key)) {
502
+			return isset($this->_session_data[ $key ]) ? $this->_session_data[ $key ] : null;
503
+		}
504
+		return $this->_session_data;
505
+	}
506
+
507
+
508
+	/**
509
+	 * Returns TRUE on success, FALSE on fail
510
+	 *
511
+	 * @param array $data
512
+	 * @return bool
513
+	 */
514
+	public function set_session_data($data)
515
+	{
516
+		// nothing ??? bad data ??? go home!
517
+		if (empty($data) || ! is_array($data)) {
518
+			EE_Error::add_error(
519
+				esc_html__(
520
+					'No session data or invalid session data was provided.',
521
+					'event_espresso'
522
+				),
523
+				__FILE__,
524
+				__FUNCTION__,
525
+				__LINE__
526
+			);
527
+			return false;
528
+		}
529
+		foreach ($data as $key => $value) {
530
+			if (isset($this->_default_session_vars[ $key ])) {
531
+				EE_Error::add_error(
532
+					sprintf(
533
+						esc_html__(
534
+							'Sorry! %s is a default session datum and can not be reset.',
535
+							'event_espresso'
536
+						),
537
+						$key
538
+					),
539
+					__FILE__,
540
+					__FUNCTION__,
541
+					__LINE__
542
+				);
543
+				return false;
544
+			}
545
+			$this->_session_data[ $key ] = $value;
546
+		}
547
+		return true;
548
+	}
549
+
550
+
551
+	/**
552
+	 * @initiate session
553
+	 * @access   private
554
+	 * @return TRUE on success, FALSE on fail
555
+	 * @throws EE_Error
556
+	 * @throws InvalidArgumentException
557
+	 * @throws InvalidDataTypeException
558
+	 * @throws InvalidInterfaceException
559
+	 * @throws InvalidSessionDataException
560
+	 */
561
+	private function _espresso_session()
562
+	{
563
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
564
+		// check that session has started
565
+		if (session_id() === '') {
566
+			// starts a new session if one doesn't already exist, or re-initiates an existing one
567
+			session_start();
568
+		}
569
+		$this->status = EE_Session::STATUS_OPEN;
570
+		// get our modified session ID
571
+		$this->_sid = $this->_generate_session_id();
572
+		// and the visitors IP
573
+		$this->_ip_address = $this->request->ipAddress();
574
+		// set the "user agent"
575
+		$this->_user_agent = $this->request->userAgent();
576
+		// now let's retrieve what's in the db
577
+		$session_data = $this->_retrieve_session_data();
578
+		if (! empty($session_data)) {
579
+			// get the current time in UTC
580
+			$this->_time = $this->_time !== null ? $this->_time : time();
581
+			// and reset the session expiration
582
+			$this->_expiration = isset($session_data['expiration'])
583
+				? $session_data['expiration']
584
+				: $this->_time + $this->session_lifespan->inSeconds();
585
+		} else {
586
+			// set initial site access time and the session expiration
587
+			$this->_set_init_access_and_expiration();
588
+			// set referer
589
+			$this->_session_data['pages_visited'][ $this->_session_data['init_access'] ] = isset($_SERVER['HTTP_REFERER'])
590
+				? esc_attr($_SERVER['HTTP_REFERER'])
591
+				: '';
592
+			// no previous session = go back and create one (on top of the data above)
593
+			return false;
594
+		}
595
+		// now the user agent
596
+		if ($session_data['user_agent'] !== $this->_user_agent) {
597
+			return false;
598
+		}
599
+		// wait a minute... how old are you?
600
+		if ($this->_time > $this->_expiration) {
601
+			// yer too old fer me!
602
+			$this->_expired = true;
603
+			// wipe out everything that isn't a default session datum
604
+			$this->clear_session(__CLASS__, __FUNCTION__);
605
+		}
606
+		// make event espresso session data available to plugin
607
+		$this->_session_data = array_merge($this->_session_data, $session_data);
608
+		return true;
609
+	}
610
+
611
+
612
+	/**
613
+	 * _get_session_data
614
+	 * Retrieves the session data, and attempts to correct any encoding issues that can occur due to improperly setup
615
+	 * databases
616
+	 *
617
+	 * @return array
618
+	 * @throws EE_Error
619
+	 * @throws InvalidArgumentException
620
+	 * @throws InvalidSessionDataException
621
+	 * @throws InvalidDataTypeException
622
+	 * @throws InvalidInterfaceException
623
+	 */
624
+	protected function _retrieve_session_data()
625
+	{
626
+		$ssn_key = EE_Session::session_id_prefix . $this->_sid;
627
+		try {
628
+			// we're using WP's Transient API to store session data using the PHP session ID as the option name
629
+			$session_data = $this->cache_storage->get($ssn_key, false);
630
+			if (empty($session_data)) {
631
+				return array();
632
+			}
633
+			if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
634
+				$hash_check = $this->cache_storage->get(
635
+					EE_Session::hash_check_prefix . $this->_sid,
636
+					false
637
+				);
638
+				if ($hash_check && $hash_check !== md5($session_data)) {
639
+					EE_Error::add_error(
640
+						sprintf(
641
+							__(
642
+								'The stored data for session %1$s failed to pass a hash check and therefore appears to be invalid.',
643
+								'event_espresso'
644
+							),
645
+							EE_Session::session_id_prefix . $this->_sid
646
+						),
647
+						__FILE__,
648
+						__FUNCTION__,
649
+						__LINE__
650
+					);
651
+				}
652
+			}
653
+		} catch (Exception $e) {
654
+			// let's just eat that error for now and attempt to correct any corrupted data
655
+			global $wpdb;
656
+			$row = $wpdb->get_row(
657
+				$wpdb->prepare(
658
+					"SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1",
659
+					'_transient_' . $ssn_key
660
+				)
661
+			);
662
+			$session_data = is_object($row) ? $row->option_value : null;
663
+			if ($session_data) {
664
+				$session_data = preg_replace_callback(
665
+					'!s:(d+):"(.*?)";!',
666
+					function ($match) {
667
+						return $match[1] === strlen($match[2])
668
+							? $match[0]
669
+							: 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
670
+					},
671
+					$session_data
672
+				);
673
+			}
674
+			$session_data = maybe_unserialize($session_data);
675
+		}
676
+		// in case the data is encoded... try to decode it
677
+		$session_data = $this->encryption instanceof EE_Encryption
678
+			? $this->encryption->base64_string_decode($session_data)
679
+			: $session_data;
680
+		if (! is_array($session_data)) {
681
+			try {
682
+				$session_data = maybe_unserialize($session_data);
683
+			} catch (Exception $e) {
684
+				$msg = esc_html__(
685
+					'An error occurred while attempting to unserialize the session data.',
686
+					'event_espresso'
687
+				);
688
+				$msg .= WP_DEBUG
689
+					? '<br><pre>'
690
+					  . print_r($session_data, true)
691
+					  . '</pre><br>'
692
+					  . $this->find_serialize_error($session_data)
693
+					: '';
694
+				$this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
695
+				throw new InvalidSessionDataException($msg, 0, $e);
696
+			}
697
+		}
698
+		// just a check to make sure the session array is indeed an array
699
+		if (! is_array($session_data)) {
700
+			// no?!?! then something is wrong
701
+			$msg = esc_html__(
702
+				'The session data is missing, invalid, or corrupted.',
703
+				'event_espresso'
704
+			);
705
+			$msg .= WP_DEBUG
706
+				? '<br><pre>' . print_r($session_data, true) . '</pre><br>' . $this->find_serialize_error($session_data)
707
+				: '';
708
+			$this->cache_storage->delete(EE_Session::session_id_prefix . $this->_sid);
709
+			throw new InvalidSessionDataException($msg);
710
+		}
711
+		if (isset($session_data['transaction']) && absint($session_data['transaction']) !== 0) {
712
+			$session_data['transaction'] = EEM_Transaction::instance()->get_one_by_ID(
713
+				$session_data['transaction']
714
+			);
715
+		}
716
+		return $session_data;
717
+	}
718
+
719
+
720
+	/**
721
+	 * _generate_session_id
722
+	 * Retrieves the PHP session id either directly from the PHP session,
723
+	 * or from the $_REQUEST array if it was passed in from an AJAX request.
724
+	 * The session id is then salted and hashed (mmm sounds tasty)
725
+	 * so that it can be safely used as a $_REQUEST param
726
+	 *
727
+	 * @return string
728
+	 */
729
+	protected function _generate_session_id()
730
+	{
731
+		// check if the SID was passed explicitly, otherwise get from session, then add salt and hash it to reduce length
732
+		if (isset($_REQUEST['EESID'])) {
733
+			$session_id = sanitize_text_field($_REQUEST['EESID']);
734
+		} else {
735
+			$session_id = md5(session_id() . get_current_blog_id() . $this->_get_sid_salt());
736
+		}
737
+		return apply_filters('FHEE__EE_Session___generate_session_id__session_id', $session_id);
738
+	}
739
+
740
+
741
+	/**
742
+	 * _get_sid_salt
743
+	 *
744
+	 * @return string
745
+	 */
746
+	protected function _get_sid_salt()
747
+	{
748
+		// was session id salt already saved to db ?
749
+		if (empty($this->_sid_salt)) {
750
+			// no?  then maybe use WP defined constant
751
+			if (defined('AUTH_SALT')) {
752
+				$this->_sid_salt = AUTH_SALT;
753
+			}
754
+			// if salt doesn't exist or is too short
755
+			if (strlen($this->_sid_salt) < 32) {
756
+				// create a new one
757
+				$this->_sid_salt = wp_generate_password(64);
758
+			}
759
+			// and save it as a permanent session setting
760
+			$this->updateSessionSettings(array('sid_salt' => $this->_sid_salt));
761
+		}
762
+		return $this->_sid_salt;
763
+	}
764
+
765
+
766
+	/**
767
+	 * _set_init_access_and_expiration
768
+	 *
769
+	 * @return void
770
+	 */
771
+	protected function _set_init_access_and_expiration()
772
+	{
773
+		$this->_time = time();
774
+		$this->_expiration = $this->_time + $this->session_lifespan->inSeconds();
775
+		// set initial site access time
776
+		$this->_session_data['init_access'] = $this->_time;
777
+		// and the session expiration
778
+		$this->_session_data['expiration'] = $this->_expiration;
779
+	}
780
+
781
+
782
+	/**
783
+	 * @update session data  prior to saving to the db
784
+	 * @access public
785
+	 * @param bool $new_session
786
+	 * @return TRUE on success, FALSE on fail
787
+	 * @throws EE_Error
788
+	 * @throws InvalidArgumentException
789
+	 * @throws InvalidDataTypeException
790
+	 * @throws InvalidInterfaceException
791
+	 */
792
+	public function update($new_session = false)
793
+	{
794
+		$this->_session_data = $this->_session_data !== null
795
+							   && is_array($this->_session_data)
796
+							   && isset($this->_session_data['id'])
797
+			? $this->_session_data
798
+			: array();
799
+		if (empty($this->_session_data)) {
800
+			$this->_set_defaults();
801
+		}
802
+		$session_data = array();
803
+		foreach ($this->_session_data as $key => $value) {
804
+			switch ($key) {
805
+				case 'id':
806
+					// session ID
807
+					$session_data['id'] = $this->_sid;
808
+					break;
809
+				case 'ip_address':
810
+					// visitor ip address
811
+					$session_data['ip_address'] = $this->request->ipAddress();
812
+					break;
813
+				case 'user_agent':
814
+					// visitor user_agent
815
+					$session_data['user_agent'] = $this->_user_agent;
816
+					break;
817
+				case 'init_access':
818
+					$session_data['init_access'] = absint($value);
819
+					break;
820
+				case 'last_access':
821
+					// current access time
822
+					$session_data['last_access'] = $this->_time;
823
+					break;
824
+				case 'expiration':
825
+					// when the session expires
826
+					$session_data['expiration'] = ! empty($this->_expiration)
827
+						? $this->_expiration
828
+						: $session_data['init_access'] + $this->session_lifespan->inSeconds();
829
+					break;
830
+				case 'user_id':
831
+					// current user if logged in
832
+					$session_data['user_id'] = $this->_wp_user_id();
833
+					break;
834
+				case 'pages_visited':
835
+					$page_visit = $this->_get_page_visit();
836
+					if ($page_visit) {
837
+						// set pages visited where the first will be the http referrer
838
+						$this->_session_data['pages_visited'][ $this->_time ] = $page_visit;
839
+						// we'll only save the last 10 page visits.
840
+						$session_data['pages_visited'] = array_slice($this->_session_data['pages_visited'], -10);
841
+					}
842
+					break;
843
+				default:
844
+					// carry any other data over
845
+					$session_data[ $key ] = $this->_session_data[ $key ];
846
+			}
847
+		}
848
+		$this->_session_data = $session_data;
849
+		// creating a new session does not require saving to the db just yet
850
+		if (! $new_session) {
851
+			// ready? let's save
852
+			if ($this->_save_session_to_db()) {
853
+				return true;
854
+			}
855
+			return false;
856
+		}
857
+		// meh, why not?
858
+		return true;
859
+	}
860
+
861
+
862
+	/**
863
+	 * @create session data array
864
+	 * @access public
865
+	 * @return bool
866
+	 * @throws EE_Error
867
+	 * @throws InvalidArgumentException
868
+	 * @throws InvalidDataTypeException
869
+	 * @throws InvalidInterfaceException
870
+	 */
871
+	private function _create_espresso_session()
872
+	{
873
+		do_action('AHEE_log', __CLASS__, __FUNCTION__, '');
874
+		// use the update function for now with $new_session arg set to TRUE
875
+		return $this->update(true) ? true : false;
876
+	}
877
+
878
+	/**
879
+	 * Detects if there is anything worth saving in the session (eg the cart is a good one, notices are pretty good
880
+	 * too). This is used when determining if we want to save the session or not.
881
+	 * @since 4.9.67.p
882
+	 * @return bool
883
+	 */
884
+	private function sessionHasStuffWorthSaving()
885
+	{
886
+		return $this->cart() instanceof EE_Cart
887
+			|| (
888
+				isset($this->_session_data['ee_notices'])
889
+				&& (
890
+					! empty($this->_session_data['ee_notices']['attention'])
891
+					|| !empty($this->_session_data['ee_notices']['errors'])
892
+					|| !empty($this->_session_data['ee_notices']['success'])
893
+				)
894
+			);
895
+	}
896
+	/**
897
+	 * _save_session_to_db
898
+	 *
899
+	 * @param bool $clear_session
900
+	 * @return string
901
+	 * @throws EE_Error
902
+	 * @throws InvalidArgumentException
903
+	 * @throws InvalidDataTypeException
904
+	 * @throws InvalidInterfaceException
905
+	 */
906
+	private function _save_session_to_db($clear_session = false)
907
+	{
908
+		// don't save sessions for crawlers
909
+		// and unless we're deleting the session data, don't save anything if there isn't a cart
910
+		if ($this->request->isBot()
911
+			|| (
912
+				! $clear_session
913
+				&& ! $this->sessionHasStuffWorthSaving()
914
+				&& apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
915
+			)
916
+		) {
917
+			return false;
918
+		}
919
+		$transaction = $this->transaction();
920
+		if ($transaction instanceof EE_Transaction) {
921
+			if (! $transaction->ID()) {
922
+				$transaction->save();
923
+			}
924
+			$this->_session_data['transaction'] = $transaction->ID();
925
+		}
926
+		// then serialize all of our session data
927
+		$session_data = serialize($this->_session_data);
928
+		// do we need to also encode it to avoid corrupted data when saved to the db?
929
+		$session_data = $this->_use_encryption
930
+			? $this->encryption->base64_string_encode($session_data)
931
+			: $session_data;
932
+		// maybe save hash check
933
+		if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
934
+			$this->cache_storage->add(
935
+				EE_Session::hash_check_prefix . $this->_sid,
936
+				md5($session_data),
937
+				$this->session_lifespan->inSeconds()
938
+			);
939
+		}
940
+		// we're using the Transient API for storing session data,
941
+		return $this->cache_storage->add(
942
+			EE_Session::session_id_prefix . $this->_sid,
943
+			$session_data,
944
+			$this->session_lifespan->inSeconds()
945
+		);
946
+	}
947
+
948
+
949
+	/**
950
+	 * @get    the full page request the visitor is accessing
951
+	 * @access public
952
+	 * @return string
953
+	 */
954
+	public function _get_page_visit()
955
+	{
956
+		$page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
957
+		// check for request url
958
+		if (isset($_SERVER['REQUEST_URI'])) {
959
+			$http_host = '';
960
+			$page_id = '?';
961
+			$e_reg = '';
962
+			$request_uri = esc_url($_SERVER['REQUEST_URI']);
963
+			$ru_bits = explode('?', $request_uri);
964
+			$request_uri = $ru_bits[0];
965
+			// check for and grab host as well
966
+			if (isset($_SERVER['HTTP_HOST'])) {
967
+				$http_host = esc_url($_SERVER['HTTP_HOST']);
968
+			}
969
+			// check for page_id in SERVER REQUEST
970
+			if (isset($_REQUEST['page_id'])) {
971
+				// rebuild $e_reg without any of the extra parameters
972
+				$page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
973
+			}
974
+			// check for $e_reg in SERVER REQUEST
975
+			if (isset($_REQUEST['ee'])) {
976
+				// rebuild $e_reg without any of the extra parameters
977
+				$e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
978
+			}
979
+			$page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
980
+		}
981
+		return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
982
+	}
983
+
984
+
985
+	/**
986
+	 * @the    current wp user id
987
+	 * @access public
988
+	 * @return int
989
+	 */
990
+	public function _wp_user_id()
991
+	{
992
+		// if I need to explain the following lines of code, then you shouldn't be looking at this!
993
+		$this->_wp_user_id = get_current_user_id();
994
+		return $this->_wp_user_id;
995
+	}
996
+
997
+
998
+	/**
999
+	 * Clear EE_Session data
1000
+	 *
1001
+	 * @access public
1002
+	 * @param string $class
1003
+	 * @param string $function
1004
+	 * @return void
1005
+	 * @throws EE_Error
1006
+	 * @throws InvalidArgumentException
1007
+	 * @throws InvalidDataTypeException
1008
+	 * @throws InvalidInterfaceException
1009
+	 */
1010
+	public function clear_session($class = '', $function = '')
1011
+	{
1012 1012
 //         echo '
1013 1013
 // <h3 style="color:#999;line-height:.9em;">
1014 1014
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
1015 1015
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
1016 1016
 // </h3>';
1017
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1018
-        $this->reset_cart();
1019
-        $this->reset_checkout();
1020
-        $this->reset_transaction();
1021
-        // wipe out everything that isn't a default session datum
1022
-        $this->reset_data(array_keys($this->_session_data));
1023
-        // reset initial site access time and the session expiration
1024
-        $this->_set_init_access_and_expiration();
1025
-        $this->_save_session_to_db(true);
1026
-    }
1027
-
1028
-
1029
-    /**
1030
-     * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1031
-     *
1032
-     * @param array|mixed $data_to_reset
1033
-     * @param bool        $show_all_notices
1034
-     * @return bool
1035
-     */
1036
-    public function reset_data($data_to_reset = array(), $show_all_notices = false)
1037
-    {
1038
-        // if $data_to_reset is not in an array, then put it in one
1039
-        if (! is_array($data_to_reset)) {
1040
-            $data_to_reset = array($data_to_reset);
1041
-        }
1042
-        // nothing ??? go home!
1043
-        if (empty($data_to_reset)) {
1044
-            EE_Error::add_error(
1045
-                __(
1046
-                    'No session data could be reset, because no session var name was provided.',
1047
-                    'event_espresso'
1048
-                ),
1049
-                __FILE__,
1050
-                __FUNCTION__,
1051
-                __LINE__
1052
-            );
1053
-            return false;
1054
-        }
1055
-        $return_value = true;
1056
-        // since $data_to_reset is an array, cycle through the values
1057
-        foreach ($data_to_reset as $reset) {
1058
-            // first check to make sure it is a valid session var
1059
-            if (isset($this->_session_data[ $reset ])) {
1060
-                // then check to make sure it is not a default var
1061
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1062
-                    // remove session var
1063
-                    unset($this->_session_data[ $reset ]);
1064
-                    if ($show_all_notices) {
1065
-                        EE_Error::add_success(
1066
-                            sprintf(
1067
-                                __('The session variable %s was removed.', 'event_espresso'),
1068
-                                $reset
1069
-                            ),
1070
-                            __FILE__,
1071
-                            __FUNCTION__,
1072
-                            __LINE__
1073
-                        );
1074
-                    }
1075
-                } else {
1076
-                    // yeeeeeeeeerrrrrrrrrrr OUT !!!!
1077
-                    if ($show_all_notices) {
1078
-                        EE_Error::add_error(
1079
-                            sprintf(
1080
-                                __(
1081
-                                    'Sorry! %s is a default session datum and can not be reset.',
1082
-                                    'event_espresso'
1083
-                                ),
1084
-                                $reset
1085
-                            ),
1086
-                            __FILE__,
1087
-                            __FUNCTION__,
1088
-                            __LINE__
1089
-                        );
1090
-                    }
1091
-                    $return_value = false;
1092
-                }
1093
-            } elseif ($show_all_notices) {
1094
-                // oops! that session var does not exist!
1095
-                EE_Error::add_error(
1096
-                    sprintf(
1097
-                        __(
1098
-                            'The session item provided, %s, is invalid or does not exist.',
1099
-                            'event_espresso'
1100
-                        ),
1101
-                        $reset
1102
-                    ),
1103
-                    __FILE__,
1104
-                    __FUNCTION__,
1105
-                    __LINE__
1106
-                );
1107
-                $return_value = false;
1108
-            }
1109
-        } // end of foreach
1110
-        return $return_value;
1111
-    }
1112
-
1113
-
1114
-    /**
1115
-     *   wp_loaded
1116
-     *
1117
-     * @access public
1118
-     * @throws EE_Error
1119
-     * @throws InvalidDataTypeException
1120
-     * @throws InvalidInterfaceException
1121
-     * @throws InvalidArgumentException
1122
-     */
1123
-    public function wp_loaded()
1124
-    {
1125
-        if ($this->request->requestParamIsSet('clear_session')) {
1126
-            $this->clear_session(__CLASS__, __FUNCTION__);
1127
-        }
1128
-    }
1129
-
1130
-
1131
-    /**
1132
-     * Used to reset the entire object (for tests).
1133
-     *
1134
-     * @since 4.3.0
1135
-     * @throws EE_Error
1136
-     * @throws InvalidDataTypeException
1137
-     * @throws InvalidInterfaceException
1138
-     * @throws InvalidArgumentException
1139
-     */
1140
-    public function reset_instance()
1141
-    {
1142
-        $this->clear_session();
1143
-        self::$_instance = null;
1144
-    }
1145
-
1146
-
1147
-    public function configure_garbage_collection_filters()
1148
-    {
1149
-        // run old filter we had for controlling session cleanup
1150
-        $expired_session_transient_delete_query_limit = absint(
1151
-            apply_filters(
1152
-                'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1153
-                50
1154
-            )
1155
-        );
1156
-        // is there a value? or one that is different than the default 50 records?
1157
-        if ($expired_session_transient_delete_query_limit === 0) {
1158
-            // hook into TransientCacheStorage in case Session cleanup was turned off
1159
-            add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1160
-        } elseif ($expired_session_transient_delete_query_limit !== 50) {
1161
-            // or use that for the new transient cleanup query limit
1162
-            add_filter(
1163
-                'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1164
-                function () use ($expired_session_transient_delete_query_limit) {
1165
-                    return $expired_session_transient_delete_query_limit;
1166
-                }
1167
-            );
1168
-        }
1169
-    }
1170
-
1171
-
1172
-    /**
1173
-     * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1174
-     * @param $data1
1175
-     * @return string
1176
-     */
1177
-    private function find_serialize_error($data1)
1178
-    {
1179
-        $error = '<pre>';
1180
-        $data2 = preg_replace_callback(
1181
-            '!s:(\d+):"(.*?)";!',
1182
-            function ($match) {
1183
-                return ($match[1] === strlen($match[2]))
1184
-                    ? $match[0]
1185
-                    : 's:'
1186
-                      . strlen($match[2])
1187
-                      . ':"'
1188
-                      . $match[2]
1189
-                      . '";';
1190
-            },
1191
-            $data1
1192
-        );
1193
-        $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1194
-        $error .= $data1 . PHP_EOL;
1195
-        $error .= $data2 . PHP_EOL;
1196
-        for ($i = 0; $i < $max; $i++) {
1197
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1198
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1199
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1200
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1201
-                $start = ($i - 20);
1202
-                $start = ($start < 0) ? 0 : $start;
1203
-                $length = 40;
1204
-                $point = $max - $i;
1205
-                if ($point < 20) {
1206
-                    $rlength = 1;
1207
-                    $rpoint = -$point;
1208
-                } else {
1209
-                    $rpoint = $length - 20;
1210
-                    $rlength = 1;
1211
-                }
1212
-                $error .= "\t-> Section Data1  = ";
1213
-                $error .= substr_replace(
1214
-                    substr($data1, $start, $length),
1215
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1216
-                    $rpoint,
1217
-                    $rlength
1218
-                );
1219
-                $error .= PHP_EOL;
1220
-                $error .= "\t-> Section Data2  = ";
1221
-                $error .= substr_replace(
1222
-                    substr($data2, $start, $length),
1223
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1224
-                    $rpoint,
1225
-                    $rlength
1226
-                );
1227
-                $error .= PHP_EOL;
1228
-            }
1229
-        }
1230
-        $error .= '</pre>';
1231
-        return $error;
1232
-    }
1233
-
1234
-
1235
-    /**
1236
-     * Saves an  array of settings used for configuring aspects of session behaviour
1237
-     *
1238
-     * @param array $updated_settings
1239
-     */
1240
-    private function updateSessionSettings(array $updated_settings = array())
1241
-    {
1242
-        // add existing settings, but only if not included in incoming $updated_settings array
1243
-        $updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1244
-        update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1245
-    }
1246
-
1247
-
1248
-    /**
1249
-     * garbage_collection
1250
-     */
1251
-    public function garbageCollection()
1252
-    {
1253
-        // only perform during regular requests if last garbage collection was over an hour ago
1254
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1255
-            $this->_last_gc = time();
1256
-            $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1257
-            /** @type WPDB $wpdb */
1258
-            global $wpdb;
1259
-            // filter the query limit. Set to 0 to turn off garbage collection
1260
-            $expired_session_transient_delete_query_limit = absint(
1261
-                apply_filters(
1262
-                    'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1263
-                    50
1264
-                )
1265
-            );
1266
-            // non-zero LIMIT means take out the trash
1267
-            if ($expired_session_transient_delete_query_limit) {
1268
-                $session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1269
-                $hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1270
-                // since transient expiration timestamps are set in the future, we can compare against NOW
1271
-                // but we only want to pick up any trash that's been around for more than a day
1272
-                $expiration = time() - DAY_IN_SECONDS;
1273
-                $SQL = "
1017
+		do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1018
+		$this->reset_cart();
1019
+		$this->reset_checkout();
1020
+		$this->reset_transaction();
1021
+		// wipe out everything that isn't a default session datum
1022
+		$this->reset_data(array_keys($this->_session_data));
1023
+		// reset initial site access time and the session expiration
1024
+		$this->_set_init_access_and_expiration();
1025
+		$this->_save_session_to_db(true);
1026
+	}
1027
+
1028
+
1029
+	/**
1030
+	 * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1031
+	 *
1032
+	 * @param array|mixed $data_to_reset
1033
+	 * @param bool        $show_all_notices
1034
+	 * @return bool
1035
+	 */
1036
+	public function reset_data($data_to_reset = array(), $show_all_notices = false)
1037
+	{
1038
+		// if $data_to_reset is not in an array, then put it in one
1039
+		if (! is_array($data_to_reset)) {
1040
+			$data_to_reset = array($data_to_reset);
1041
+		}
1042
+		// nothing ??? go home!
1043
+		if (empty($data_to_reset)) {
1044
+			EE_Error::add_error(
1045
+				__(
1046
+					'No session data could be reset, because no session var name was provided.',
1047
+					'event_espresso'
1048
+				),
1049
+				__FILE__,
1050
+				__FUNCTION__,
1051
+				__LINE__
1052
+			);
1053
+			return false;
1054
+		}
1055
+		$return_value = true;
1056
+		// since $data_to_reset is an array, cycle through the values
1057
+		foreach ($data_to_reset as $reset) {
1058
+			// first check to make sure it is a valid session var
1059
+			if (isset($this->_session_data[ $reset ])) {
1060
+				// then check to make sure it is not a default var
1061
+				if (! array_key_exists($reset, $this->_default_session_vars)) {
1062
+					// remove session var
1063
+					unset($this->_session_data[ $reset ]);
1064
+					if ($show_all_notices) {
1065
+						EE_Error::add_success(
1066
+							sprintf(
1067
+								__('The session variable %s was removed.', 'event_espresso'),
1068
+								$reset
1069
+							),
1070
+							__FILE__,
1071
+							__FUNCTION__,
1072
+							__LINE__
1073
+						);
1074
+					}
1075
+				} else {
1076
+					// yeeeeeeeeerrrrrrrrrrr OUT !!!!
1077
+					if ($show_all_notices) {
1078
+						EE_Error::add_error(
1079
+							sprintf(
1080
+								__(
1081
+									'Sorry! %s is a default session datum and can not be reset.',
1082
+									'event_espresso'
1083
+								),
1084
+								$reset
1085
+							),
1086
+							__FILE__,
1087
+							__FUNCTION__,
1088
+							__LINE__
1089
+						);
1090
+					}
1091
+					$return_value = false;
1092
+				}
1093
+			} elseif ($show_all_notices) {
1094
+				// oops! that session var does not exist!
1095
+				EE_Error::add_error(
1096
+					sprintf(
1097
+						__(
1098
+							'The session item provided, %s, is invalid or does not exist.',
1099
+							'event_espresso'
1100
+						),
1101
+						$reset
1102
+					),
1103
+					__FILE__,
1104
+					__FUNCTION__,
1105
+					__LINE__
1106
+				);
1107
+				$return_value = false;
1108
+			}
1109
+		} // end of foreach
1110
+		return $return_value;
1111
+	}
1112
+
1113
+
1114
+	/**
1115
+	 *   wp_loaded
1116
+	 *
1117
+	 * @access public
1118
+	 * @throws EE_Error
1119
+	 * @throws InvalidDataTypeException
1120
+	 * @throws InvalidInterfaceException
1121
+	 * @throws InvalidArgumentException
1122
+	 */
1123
+	public function wp_loaded()
1124
+	{
1125
+		if ($this->request->requestParamIsSet('clear_session')) {
1126
+			$this->clear_session(__CLASS__, __FUNCTION__);
1127
+		}
1128
+	}
1129
+
1130
+
1131
+	/**
1132
+	 * Used to reset the entire object (for tests).
1133
+	 *
1134
+	 * @since 4.3.0
1135
+	 * @throws EE_Error
1136
+	 * @throws InvalidDataTypeException
1137
+	 * @throws InvalidInterfaceException
1138
+	 * @throws InvalidArgumentException
1139
+	 */
1140
+	public function reset_instance()
1141
+	{
1142
+		$this->clear_session();
1143
+		self::$_instance = null;
1144
+	}
1145
+
1146
+
1147
+	public function configure_garbage_collection_filters()
1148
+	{
1149
+		// run old filter we had for controlling session cleanup
1150
+		$expired_session_transient_delete_query_limit = absint(
1151
+			apply_filters(
1152
+				'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1153
+				50
1154
+			)
1155
+		);
1156
+		// is there a value? or one that is different than the default 50 records?
1157
+		if ($expired_session_transient_delete_query_limit === 0) {
1158
+			// hook into TransientCacheStorage in case Session cleanup was turned off
1159
+			add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1160
+		} elseif ($expired_session_transient_delete_query_limit !== 50) {
1161
+			// or use that for the new transient cleanup query limit
1162
+			add_filter(
1163
+				'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1164
+				function () use ($expired_session_transient_delete_query_limit) {
1165
+					return $expired_session_transient_delete_query_limit;
1166
+				}
1167
+			);
1168
+		}
1169
+	}
1170
+
1171
+
1172
+	/**
1173
+	 * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1174
+	 * @param $data1
1175
+	 * @return string
1176
+	 */
1177
+	private function find_serialize_error($data1)
1178
+	{
1179
+		$error = '<pre>';
1180
+		$data2 = preg_replace_callback(
1181
+			'!s:(\d+):"(.*?)";!',
1182
+			function ($match) {
1183
+				return ($match[1] === strlen($match[2]))
1184
+					? $match[0]
1185
+					: 's:'
1186
+					  . strlen($match[2])
1187
+					  . ':"'
1188
+					  . $match[2]
1189
+					  . '";';
1190
+			},
1191
+			$data1
1192
+		);
1193
+		$max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1194
+		$error .= $data1 . PHP_EOL;
1195
+		$error .= $data2 . PHP_EOL;
1196
+		for ($i = 0; $i < $max; $i++) {
1197
+			if (@$data1[ $i ] !== @$data2[ $i ]) {
1198
+				$error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1199
+				$error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1200
+				$error .= "\t-> Line Number = $i" . PHP_EOL;
1201
+				$start = ($i - 20);
1202
+				$start = ($start < 0) ? 0 : $start;
1203
+				$length = 40;
1204
+				$point = $max - $i;
1205
+				if ($point < 20) {
1206
+					$rlength = 1;
1207
+					$rpoint = -$point;
1208
+				} else {
1209
+					$rpoint = $length - 20;
1210
+					$rlength = 1;
1211
+				}
1212
+				$error .= "\t-> Section Data1  = ";
1213
+				$error .= substr_replace(
1214
+					substr($data1, $start, $length),
1215
+					"<b style=\"color:green\">{$data1[ $i ]}</b>",
1216
+					$rpoint,
1217
+					$rlength
1218
+				);
1219
+				$error .= PHP_EOL;
1220
+				$error .= "\t-> Section Data2  = ";
1221
+				$error .= substr_replace(
1222
+					substr($data2, $start, $length),
1223
+					"<b style=\"color:red\">{$data2[ $i ]}</b>",
1224
+					$rpoint,
1225
+					$rlength
1226
+				);
1227
+				$error .= PHP_EOL;
1228
+			}
1229
+		}
1230
+		$error .= '</pre>';
1231
+		return $error;
1232
+	}
1233
+
1234
+
1235
+	/**
1236
+	 * Saves an  array of settings used for configuring aspects of session behaviour
1237
+	 *
1238
+	 * @param array $updated_settings
1239
+	 */
1240
+	private function updateSessionSettings(array $updated_settings = array())
1241
+	{
1242
+		// add existing settings, but only if not included in incoming $updated_settings array
1243
+		$updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1244
+		update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1245
+	}
1246
+
1247
+
1248
+	/**
1249
+	 * garbage_collection
1250
+	 */
1251
+	public function garbageCollection()
1252
+	{
1253
+		// only perform during regular requests if last garbage collection was over an hour ago
1254
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1255
+			$this->_last_gc = time();
1256
+			$this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1257
+			/** @type WPDB $wpdb */
1258
+			global $wpdb;
1259
+			// filter the query limit. Set to 0 to turn off garbage collection
1260
+			$expired_session_transient_delete_query_limit = absint(
1261
+				apply_filters(
1262
+					'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1263
+					50
1264
+				)
1265
+			);
1266
+			// non-zero LIMIT means take out the trash
1267
+			if ($expired_session_transient_delete_query_limit) {
1268
+				$session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1269
+				$hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1270
+				// since transient expiration timestamps are set in the future, we can compare against NOW
1271
+				// but we only want to pick up any trash that's been around for more than a day
1272
+				$expiration = time() - DAY_IN_SECONDS;
1273
+				$SQL = "
1274 1274
                     SELECT option_name
1275 1275
                     FROM {$wpdb->options}
1276 1276
                     WHERE
@@ -1279,17 +1279,17 @@  discard block
 block discarded – undo
1279 1279
                     AND option_value < {$expiration}
1280 1280
                     LIMIT {$expired_session_transient_delete_query_limit}
1281 1281
                 ";
1282
-                // produces something like:
1283
-                // SELECT option_name FROM wp_options
1284
-                // WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1285
-                // OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1286
-                // AND option_value < 1508368198 LIMIT 50
1287
-                $expired_sessions = $wpdb->get_col($SQL);
1288
-                // valid results?
1289
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1290
-                    $this->cache_storage->deleteMany($expired_sessions, true);
1291
-                }
1292
-            }
1293
-        }
1294
-    }
1282
+				// produces something like:
1283
+				// SELECT option_name FROM wp_options
1284
+				// WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1285
+				// OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1286
+				// AND option_value < 1508368198 LIMIT 50
1287
+				$expired_sessions = $wpdb->get_col($SQL);
1288
+				// valid results?
1289
+				if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1290
+					$this->cache_storage->deleteMany($expired_sessions, true);
1291
+				}
1292
+			}
1293
+		}
1294
+	}
1295 1295
 }
Please login to merge, or discard this patch.
core/services/request/RequestInterface.php 1 patch
Indentation   +118 added lines, -118 removed lines patch added patch discarded remove patch
@@ -20,139 +20,139 @@
 block discarded – undo
20 20
 interface RequestInterface extends RequestTypeContextCheckerInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @param RequestTypeContextCheckerInterface $type
25
-     */
26
-    public function setRequestTypeContextChecker(RequestTypeContextCheckerInterface $type);
27
-
28
-    /**
29
-     * @return array
30
-     */
31
-    public function getParams();
32
-
33
-
34
-    /**
35
-     * @return array
36
-     */
37
-    public function postParams();
38
-
39
-
40
-    /**
41
-     * @return array
42
-     */
43
-    public function cookieParams();
44
-
45
-
46
-    /**
47
-     * @return array
48
-     */
49
-    public function serverParams();
50
-
51
-
52
-    /**
53
-     * returns contents of $_REQUEST
54
-     *
55
-     * @return array
56
-     */
57
-    public function requestParams();
23
+	/**
24
+	 * @param RequestTypeContextCheckerInterface $type
25
+	 */
26
+	public function setRequestTypeContextChecker(RequestTypeContextCheckerInterface $type);
27
+
28
+	/**
29
+	 * @return array
30
+	 */
31
+	public function getParams();
32
+
33
+
34
+	/**
35
+	 * @return array
36
+	 */
37
+	public function postParams();
38
+
39
+
40
+	/**
41
+	 * @return array
42
+	 */
43
+	public function cookieParams();
44
+
45
+
46
+	/**
47
+	 * @return array
48
+	 */
49
+	public function serverParams();
50
+
51
+
52
+	/**
53
+	 * returns contents of $_REQUEST
54
+	 *
55
+	 * @return array
56
+	 */
57
+	public function requestParams();
58 58
 
59 59
 
60
-    /**
61
-     * @param string $key
62
-     * @param string $value
63
-     * @param bool   $override_ee
64
-     * @return    void
65
-     */
66
-    public function setRequestParam($key, $value, $override_ee = false);
60
+	/**
61
+	 * @param string $key
62
+	 * @param string $value
63
+	 * @param bool   $override_ee
64
+	 * @return    void
65
+	 */
66
+	public function setRequestParam($key, $value, $override_ee = false);
67 67
 
68 68
 
69
-    /**
70
-     * returns the value for a request param if the given key exists
71
-     *
72
-     * @param string $key
73
-     * @param null   $default
74
-     * @return mixed
75
-     */
76
-    public function getRequestParam($key, $default = null);
69
+	/**
70
+	 * returns the value for a request param if the given key exists
71
+	 *
72
+	 * @param string $key
73
+	 * @param null   $default
74
+	 * @return mixed
75
+	 */
76
+	public function getRequestParam($key, $default = null);
77 77
 
78 78
 
79
-    /**
80
-     * check if param exists
81
-     *
82
-     * @param string $key
83
-     * @return bool
84
-     */
85
-    public function requestParamIsSet($key);
79
+	/**
80
+	 * check if param exists
81
+	 *
82
+	 * @param string $key
83
+	 * @return bool
84
+	 */
85
+	public function requestParamIsSet($key);
86 86
 
87 87
 
88
-    /**
89
-     * check if a request parameter exists whose key that matches the supplied wildcard pattern
90
-     * and return the value for the first match found
91
-     * wildcards can be either of the following:
92
-     *      ? to represent a single character of any type
93
-     *      * to represent one or more characters of any type
94
-     *
95
-     * @param string     $pattern
96
-     * @param null|mixed $default
97
-     * @return false|int
98
-     */
99
-    public function getMatch($pattern, $default = null);
88
+	/**
89
+	 * check if a request parameter exists whose key that matches the supplied wildcard pattern
90
+	 * and return the value for the first match found
91
+	 * wildcards can be either of the following:
92
+	 *      ? to represent a single character of any type
93
+	 *      * to represent one or more characters of any type
94
+	 *
95
+	 * @param string     $pattern
96
+	 * @param null|mixed $default
97
+	 * @return false|int
98
+	 */
99
+	public function getMatch($pattern, $default = null);
100 100
 
101 101
 
102
-    /**
103
-     * check if a request parameter exists whose key matches the supplied wildcard pattern
104
-     * wildcards can be either of the following:
105
-     *      ? to represent a single character of any type
106
-     *      * to represent one or more characters of any type
107
-     * returns true if a match is found or false if not
108
-     *
109
-     * @param string $pattern
110
-     * @return false|int
111
-     */
112
-    public function matches($pattern);
102
+	/**
103
+	 * check if a request parameter exists whose key matches the supplied wildcard pattern
104
+	 * wildcards can be either of the following:
105
+	 *      ? to represent a single character of any type
106
+	 *      * to represent one or more characters of any type
107
+	 * returns true if a match is found or false if not
108
+	 *
109
+	 * @param string $pattern
110
+	 * @return false|int
111
+	 */
112
+	public function matches($pattern);
113 113
 
114 114
 
115
-    /**
116
-     * remove param
117
-     *
118
-     * @param string $key
119
-     * @param bool   $unset_from_global_too
120
-     */
121
-    public function unSetRequestParam($key, $unset_from_global_too = false);
115
+	/**
116
+	 * remove param
117
+	 *
118
+	 * @param string $key
119
+	 * @param bool   $unset_from_global_too
120
+	 */
121
+	public function unSetRequestParam($key, $unset_from_global_too = false);
122 122
 
123 123
 
124
-    /**
125
-     * @return string
126
-     */
127
-    public function ipAddress();
124
+	/**
125
+	 * @return string
126
+	 */
127
+	public function ipAddress();
128 128
 
129 129
 
130
-    /**
131
-     * @return string
132
-     */
133
-    public function requestUri();
134
-
130
+	/**
131
+	 * @return string
132
+	 */
133
+	public function requestUri();
134
+
135 135
 
136
-    /**
137
-     * @return string
138
-     */
139
-    public function userAgent();
140
-
141
-
142
-    /**
143
-     * @param string $user_agent
144
-     */
145
-    public function setUserAgent($user_agent = '');
146
-
147
-
148
-    /**
149
-     * @return bool
150
-     */
151
-    public function isBot();
152
-
153
-
154
-    /**
155
-     * @param bool $is_bot
156
-     */
157
-    public function setIsBot($is_bot);
136
+	/**
137
+	 * @return string
138
+	 */
139
+	public function userAgent();
140
+
141
+
142
+	/**
143
+	 * @param string $user_agent
144
+	 */
145
+	public function setUserAgent($user_agent = '');
146
+
147
+
148
+	/**
149
+	 * @return bool
150
+	 */
151
+	public function isBot();
152
+
153
+
154
+	/**
155
+	 * @param bool $is_bot
156
+	 */
157
+	public function setIsBot($is_bot);
158 158
 }
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/domain/services/admin/PluginUpsells.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -83,12 +83,12 @@
 block discarded – undo
83 83
                     <div class="notice inline notice-alt">
84 84
                         <div class="ee-upsell-container">
85 85
                             <div class="ee-upsell-inner-container">
86
-                                <a href="' . $button_url . '">
87
-                                    ' . $button_text . '
86
+                                <a href="' . $button_url.'">
87
+                                    ' . $button_text.'
88 88
                                 </a>
89 89
                             </div>
90 90
                             <div class="ee-upsell-inner-container">
91
-                                <p>' . $upsell_text . '</p>
91
+                                <p>' . $upsell_text.'</p>
92 92
                             </div>
93 93
                             <div style="clear:both"></div>
94 94
                         </div>
Please login to merge, or discard this patch.
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -17,47 +17,47 @@  discard block
 block discarded – undo
17 17
 class PluginUpsells
18 18
 {
19 19
 
20
-    /**
21
-     * @var DomainInterface
22
-     */
23
-    private $domain;
20
+	/**
21
+	 * @var DomainInterface
22
+	 */
23
+	private $domain;
24 24
 
25 25
 
26
-    /**
27
-     * PluginUpsells constructor.
28
-     *
29
-     * @param DomainInterface $domain
30
-     */
31
-    public function __construct(DomainInterface $domain)
32
-    {
33
-        $this->domain = $domain;
34
-    }
26
+	/**
27
+	 * PluginUpsells constructor.
28
+	 *
29
+	 * @param DomainInterface $domain
30
+	 */
31
+	public function __construct(DomainInterface $domain)
32
+	{
33
+		$this->domain = $domain;
34
+	}
35 35
 
36 36
 
37
-    /**
38
-     * Hook in various upsells for the decaf version of EE.
39
-     */
40
-    public function decafUpsells()
41
-    {
42
-        if ($this->domain instanceof CaffeinatedInterface && ! $this->domain->isCaffeinated()) {
43
-            add_action('after_plugin_row', array($this, 'doPremiumUpsell'), 10, 3);
44
-        }
45
-    }
37
+	/**
38
+	 * Hook in various upsells for the decaf version of EE.
39
+	 */
40
+	public function decafUpsells()
41
+	{
42
+		if ($this->domain instanceof CaffeinatedInterface && ! $this->domain->isCaffeinated()) {
43
+			add_action('after_plugin_row', array($this, 'doPremiumUpsell'), 10, 3);
44
+		}
45
+	}
46 46
 
47 47
 
48
-    /**
49
-     * Callback for `after_plugin_row` to add upsell info
50
-     *
51
-     * @param string $plugin_file
52
-     * @param array  $plugin_data
53
-     * @param string $status
54
-     * @throws DomainException
55
-     */
56
-    public function doPremiumUpsell($plugin_file, $plugin_data, $status)
57
-    {
58
-        if ($plugin_file === $this->domain->pluginBasename()) {
59
-            list($button_text, $button_url, $upsell_text) = $this->getAfterPluginRowDetails();
60
-            echo '<tr class="plugin-update-tr ee-upsell-plugin-list-table active">
48
+	/**
49
+	 * Callback for `after_plugin_row` to add upsell info
50
+	 *
51
+	 * @param string $plugin_file
52
+	 * @param array  $plugin_data
53
+	 * @param string $status
54
+	 * @throws DomainException
55
+	 */
56
+	public function doPremiumUpsell($plugin_file, $plugin_data, $status)
57
+	{
58
+		if ($plugin_file === $this->domain->pluginBasename()) {
59
+			list($button_text, $button_url, $upsell_text) = $this->getAfterPluginRowDetails();
60
+			echo '<tr class="plugin-update-tr ee-upsell-plugin-list-table active">
61 61
                 <td colspan="3" class="plugin-update colspanchange">
62 62
                     <div class="notice inline notice-alt">
63 63
                         <div class="ee-upsell-container">
@@ -74,27 +74,27 @@  discard block
 block discarded – undo
74 74
                     </div>
75 75
                 </td>
76 76
               </tr>';
77
-        }
78
-    }
77
+		}
78
+	}
79 79
 
80
-    /**
81
-     * Provide the details used for the upsell container.
82
-     *
83
-     * @return array
84
-     */
85
-    protected function getAfterPluginRowDetails()
86
-    {
87
-        return array(
88
-            esc_html__('Upgrade for Support', 'event_espresso'),
89
-            'https://eventespresso.com/purchase/?slug=ee4-license-personal&utm_source=wp_admin_plugins_screen&utm_medium=link&utm_campaign=plugins_screen_upgrade_link" class="button button-primary',
90
-            sprintf(
91
-                esc_html__(
92
-                    'You\'re missing out on %1$sexpert support%2$s and %1$sone-click updates%2$s! Don\'t have an Event Espresso support license key? Support the project and buy one today!',
93
-                    'event_espresso'
94
-                ),
95
-                '<strong>',
96
-                '</strong>'
97
-            ),
98
-        );
99
-    }
80
+	/**
81
+	 * Provide the details used for the upsell container.
82
+	 *
83
+	 * @return array
84
+	 */
85
+	protected function getAfterPluginRowDetails()
86
+	{
87
+		return array(
88
+			esc_html__('Upgrade for Support', 'event_espresso'),
89
+			'https://eventespresso.com/purchase/?slug=ee4-license-personal&utm_source=wp_admin_plugins_screen&utm_medium=link&utm_campaign=plugins_screen_upgrade_link" class="button button-primary',
90
+			sprintf(
91
+				esc_html__(
92
+					'You\'re missing out on %1$sexpert support%2$s and %1$sone-click updates%2$s! Don\'t have an Event Espresso support license key? Support the project and buy one today!',
93
+					'event_espresso'
94
+				),
95
+				'<strong>',
96
+				'</strong>'
97
+			),
98
+		);
99
+	}
100 100
 }
Please login to merge, or discard this patch.
core/domain/Domain.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -66,7 +66,7 @@
 block discarded – undo
66 66
      */
67 67
     private function setCaffeinated()
68 68
     {
69
-        $this->caffeinated = (! defined('EE_DECAF') || EE_DECAF !== true)
70
-            && is_readable($this->pluginPath() . 'caffeinated/brewing_regular.php');
69
+        $this->caffeinated = ( ! defined('EE_DECAF') || EE_DECAF !== true)
70
+            && is_readable($this->pluginPath().'caffeinated/brewing_regular.php');
71 71
     }
72 72
 }
Please login to merge, or discard this patch.
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -19,54 +19,54 @@
 block discarded – undo
19 19
 class Domain extends DomainBase implements CaffeinatedInterface
20 20
 {
21 21
 
22
-    /**
23
-     * URL path component used to denote an API request
24
-     */
25
-    const API_NAMESPACE = 'ee/v';
22
+	/**
23
+	 * URL path component used to denote an API request
24
+	 */
25
+	const API_NAMESPACE = 'ee/v';
26 26
 
27
-    /**
28
-     * Slug used for the context where a registration status is changed from a manual trigger in the Registration Admin
29
-     * Page ui.
30
-     */
31
-    const CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN
32
-        = 'manual_registration_status_change_from_registration_admin';
27
+	/**
28
+	 * Slug used for the context where a registration status is changed from a manual trigger in the Registration Admin
29
+	 * Page ui.
30
+	 */
31
+	const CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN
32
+		= 'manual_registration_status_change_from_registration_admin';
33 33
 
34
-    const CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
35
-        = 'manual_registration_status_change_from_registration_admin_and_notify';
34
+	const CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY
35
+		= 'manual_registration_status_change_from_registration_admin_and_notify';
36 36
 
37 37
 
38
-    /**
39
-     * Whether or not EE core is the full premium version.
40
-     * @since 4.9.59.p
41
-     * @var bool
42
-     */
43
-    private $caffeinated;
38
+	/**
39
+	 * Whether or not EE core is the full premium version.
40
+	 * @since 4.9.59.p
41
+	 * @var bool
42
+	 */
43
+	private $caffeinated;
44 44
 
45 45
 
46
-    public function __construct(FilePath $plugin_file, Version $version)
47
-    {
48
-        parent::__construct($plugin_file, $version);
49
-        $this->setCaffeinated();
50
-    }
46
+	public function __construct(FilePath $plugin_file, Version $version)
47
+	{
48
+		parent::__construct($plugin_file, $version);
49
+		$this->setCaffeinated();
50
+	}
51 51
 
52
-    /**
53
-     * Whether or not EE core is the full premium version.
54
-     * @since 4.9.59.p
55
-     * @return bool
56
-     */
57
-    public function isCaffeinated()
58
-    {
59
-        return $this->caffeinated;
60
-    }
52
+	/**
53
+	 * Whether or not EE core is the full premium version.
54
+	 * @since 4.9.59.p
55
+	 * @return bool
56
+	 */
57
+	public function isCaffeinated()
58
+	{
59
+		return $this->caffeinated;
60
+	}
61 61
 
62 62
 
63
-    /**
64
-     * Setter for $is_caffeinated property.
65
-     * @since 4.9.59.p
66
-     */
67
-    private function setCaffeinated()
68
-    {
69
-        $this->caffeinated = (! defined('EE_DECAF') || EE_DECAF !== true)
70
-            && is_readable($this->pluginPath() . 'caffeinated/brewing_regular.php');
71
-    }
63
+	/**
64
+	 * Setter for $is_caffeinated property.
65
+	 * @since 4.9.59.p
66
+	 */
67
+	private function setCaffeinated()
68
+	{
69
+		$this->caffeinated = (! defined('EE_DECAF') || EE_DECAF !== true)
70
+			&& is_readable($this->pluginPath() . 'caffeinated/brewing_regular.php');
71
+	}
72 72
 }
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   +111 added lines, -111 removed lines patch added patch discarded remove patch
@@ -15,115 +15,115 @@
 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
-     * @return bool
113
-     * @throws InvalidArgumentException
114
-     */
115
-    public function share($fqcn, $object)
116
-    {
117
-        $fqcn = $this->class_cache->getFqn($fqcn);
118
-        return $this->getSharedLoader()->share($fqcn, $object);
119
-    }
120
-
121
-
122
-    /**
123
-     * calls reset() on loaders if that method exists
124
-     */
125
-    public function reset()
126
-    {
127
-        $this->shared_loader->reset();
128
-    }
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
+	 * @return bool
113
+	 * @throws InvalidArgumentException
114
+	 */
115
+	public function share($fqcn, $object)
116
+	{
117
+		$fqcn = $this->class_cache->getFqn($fqcn);
118
+		return $this->getSharedLoader()->share($fqcn, $object);
119
+	}
120
+
121
+
122
+	/**
123
+	 * calls reset() on loaders if that method exists
124
+	 */
125
+	public function reset()
126
+	{
127
+		$this->shared_loader->reset();
128
+	}
129 129
 }
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
Indentation   +222 added lines, -222 removed lines patch added patch discarded remove patch
@@ -25,226 +25,226 @@
 block discarded – undo
25 25
 class Mirror
26 26
 {
27 27
 
28
-    /**
29
-     * @var ReflectionClass[] $classes
30
-     */
31
-    private $classes = array();
32
-
33
-    /**
34
-     * @var ReflectionMethod[] $constructors
35
-     */
36
-    private $constructors = array();
37
-
38
-    /**
39
-     * @var ReflectionParameter[][] $parameters
40
-     */
41
-    private $parameters = array();
42
-
43
-    /**
44
-     * @var ReflectionParameter[][] $parameters
45
-     */
46
-    private $parameter_classes = array();
47
-
48
-    /**
49
-     * @var ReflectionProperty[][] $properties
50
-     */
51
-    private $properties = array();
52
-
53
-    /**
54
-     * @var ReflectionMethod[][] $methods
55
-     */
56
-    private $methods = array();
57
-
58
-
59
-    /**
60
-     * @param string $class_name
61
-     * @return ReflectionClass
62
-     * @throws ReflectionException
63
-     * @throws InvalidDataTypeException
64
-     */
65
-    public function getReflectionClass($class_name)
66
-    {
67
-        if (! is_string($class_name)) {
68
-            throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
69
-        }
70
-        if (! isset($this->classes[ $class_name ])) {
71
-            $this->classes[ $class_name ] = new ReflectionClass($class_name);
72
-        }
73
-        return $this->classes[ $class_name ];
74
-    }
75
-
76
-
77
-    /**
78
-     * @param string $class_name
79
-     * @return ReflectionMethod
80
-     * @throws InvalidDataTypeException
81
-     * @throws ReflectionException
82
-     */
83
-    public function getConstructor($class_name)
84
-    {
85
-        if (! is_string($class_name)) {
86
-            throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
87
-        }
88
-        if (! isset($this->constructors[ $class_name ])) {
89
-            $reflection_class                  = $this->getReflectionClass($class_name);
90
-            $this->constructors[ $class_name ] = $reflection_class->getConstructor();
91
-        }
92
-        return $this->constructors[ $class_name ];
93
-    }
94
-
95
-
96
-    /**
97
-     * @param ReflectionClass $reflection_class
98
-     * @return ReflectionMethod
99
-     * @throws InvalidDataTypeException
100
-     * @throws ReflectionException
101
-     */
102
-    public function getConstructorFromReflection(ReflectionClass $reflection_class)
103
-    {
104
-        return $this->getConstructor($reflection_class->getName());
105
-    }
106
-
107
-
108
-    /**
109
-     * @param string $class_name
110
-     * @return ReflectionParameter[]
111
-     * @throws InvalidDataTypeException
112
-     * @throws ReflectionException
113
-     */
114
-    public function getParameters($class_name)
115
-    {
116
-        if (! isset($this->parameters[ $class_name ])) {
117
-            $constructor                     = $this->getConstructor($class_name);
118
-            $this->parameters[ $class_name ] = $constructor->getParameters();
119
-        }
120
-        return $this->parameters[ $class_name ];
121
-    }
122
-
123
-
124
-    /**
125
-     * @param ReflectionClass $reflection_class
126
-     * @return ReflectionParameter[]
127
-     * @throws InvalidDataTypeException
128
-     * @throws ReflectionException
129
-     */
130
-    public function getParametersFromReflection(ReflectionClass $reflection_class)
131
-    {
132
-        return $this->getParameters($reflection_class->getName());
133
-    }
134
-
135
-
136
-    /**
137
-     * @param ReflectionMethod $constructor
138
-     * @return ReflectionParameter[]
139
-     * @throws InvalidDataTypeException
140
-     * @throws ReflectionException
141
-     */
142
-    public function getParametersFromReflectionConstructor(ReflectionMethod $constructor)
143
-    {
144
-        return $this->getParameters($constructor->getDeclaringClass());
145
-    }
146
-
147
-
148
-    /**
149
-     * @param ReflectionParameter $param
150
-     * @param string              $class_name
151
-     * @param string              $index
152
-     * @return string|null
153
-     */
154
-    public function getParameterClassName(ReflectionParameter $param, $class_name, $index)
155
-    {
156
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_name'])) {
157
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
158
-        }
159
-        if (! isset($this->parameter_classes[ $class_name ])) {
160
-            $this->parameter_classes[ $class_name ] = array();
161
-        }
162
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
163
-            $this->parameter_classes[ $class_name ][ $index ] = array();
164
-        }
165
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_name'] = $param->getClass()
166
-            ? $param->getClass()->name
167
-            : null;
168
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
169
-    }
170
-
171
-
172
-    /**
173
-     * @param ReflectionParameter $param
174
-     * @param string              $class_name
175
-     * @param string              $index
176
-     * @return string|null
177
-     */
178
-    public function getParameterDefaultValue(ReflectionParameter $param, $class_name, $index)
179
-    {
180
-        if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_default'])) {
181
-            return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
182
-        }
183
-        if (! isset($this->parameter_classes[ $class_name ])) {
184
-            $this->parameter_classes[ $class_name ] = array();
185
-        }
186
-        if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
187
-            $this->parameter_classes[ $class_name ][ $index ] = array();
188
-        }
189
-        $this->parameter_classes[ $class_name ][ $index ]['param_class_default'] = $param->isDefaultValueAvailable()
190
-            ? $param->getDefaultValue()
191
-            : null;
192
-        return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
193
-    }
194
-
195
-
196
-    /**
197
-     * @param string $class_name
198
-     * @return ReflectionProperty[]
199
-     * @throws InvalidDataTypeException
200
-     * @throws ReflectionException
201
-     */
202
-    public function getProperties($class_name)
203
-    {
204
-        if (! isset($this->properties[ $class_name ])) {
205
-            $reflection_class                = $this->getReflectionClass($class_name);
206
-            $this->properties[ $class_name ] = $reflection_class->getProperties();
207
-        }
208
-        return $this->properties[ $class_name ];
209
-    }
210
-
211
-
212
-    /**
213
-     * @param ReflectionClass $reflection_class
214
-     * @return ReflectionProperty[]
215
-     * @throws InvalidDataTypeException
216
-     * @throws ReflectionException
217
-     */
218
-    public function getPropertiesFromReflection(ReflectionClass $reflection_class)
219
-    {
220
-        return $this->getProperties($reflection_class->getName());
221
-    }
222
-
223
-
224
-    /**
225
-     * @param string $class_name
226
-     * @return ReflectionMethod[]
227
-     * @throws InvalidDataTypeException
228
-     * @throws ReflectionException
229
-     */
230
-    public function getMethods($class_name)
231
-    {
232
-        if (! isset($this->methods[ $class_name ])) {
233
-            $reflection_class             = $this->getReflectionClass($class_name);
234
-            $this->methods[ $class_name ] = $reflection_class->getMethods();
235
-        }
236
-        return $this->methods[ $class_name ];
237
-    }
238
-
239
-
240
-    /**
241
-     * @param ReflectionClass $reflection_class )
242
-     * @return ReflectionMethod[]
243
-     * @throws InvalidDataTypeException
244
-     * @throws ReflectionException
245
-     */
246
-    public function getMethodsFromReflection(ReflectionClass $reflection_class)
247
-    {
248
-        return $this->getMethods($reflection_class->getName());
249
-    }
28
+	/**
29
+	 * @var ReflectionClass[] $classes
30
+	 */
31
+	private $classes = array();
32
+
33
+	/**
34
+	 * @var ReflectionMethod[] $constructors
35
+	 */
36
+	private $constructors = array();
37
+
38
+	/**
39
+	 * @var ReflectionParameter[][] $parameters
40
+	 */
41
+	private $parameters = array();
42
+
43
+	/**
44
+	 * @var ReflectionParameter[][] $parameters
45
+	 */
46
+	private $parameter_classes = array();
47
+
48
+	/**
49
+	 * @var ReflectionProperty[][] $properties
50
+	 */
51
+	private $properties = array();
52
+
53
+	/**
54
+	 * @var ReflectionMethod[][] $methods
55
+	 */
56
+	private $methods = array();
57
+
58
+
59
+	/**
60
+	 * @param string $class_name
61
+	 * @return ReflectionClass
62
+	 * @throws ReflectionException
63
+	 * @throws InvalidDataTypeException
64
+	 */
65
+	public function getReflectionClass($class_name)
66
+	{
67
+		if (! is_string($class_name)) {
68
+			throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
69
+		}
70
+		if (! isset($this->classes[ $class_name ])) {
71
+			$this->classes[ $class_name ] = new ReflectionClass($class_name);
72
+		}
73
+		return $this->classes[ $class_name ];
74
+	}
75
+
76
+
77
+	/**
78
+	 * @param string $class_name
79
+	 * @return ReflectionMethod
80
+	 * @throws InvalidDataTypeException
81
+	 * @throws ReflectionException
82
+	 */
83
+	public function getConstructor($class_name)
84
+	{
85
+		if (! is_string($class_name)) {
86
+			throw new InvalidDataTypeException($class_name, '$class_name', 'string (fully qualified class name)');
87
+		}
88
+		if (! isset($this->constructors[ $class_name ])) {
89
+			$reflection_class                  = $this->getReflectionClass($class_name);
90
+			$this->constructors[ $class_name ] = $reflection_class->getConstructor();
91
+		}
92
+		return $this->constructors[ $class_name ];
93
+	}
94
+
95
+
96
+	/**
97
+	 * @param ReflectionClass $reflection_class
98
+	 * @return ReflectionMethod
99
+	 * @throws InvalidDataTypeException
100
+	 * @throws ReflectionException
101
+	 */
102
+	public function getConstructorFromReflection(ReflectionClass $reflection_class)
103
+	{
104
+		return $this->getConstructor($reflection_class->getName());
105
+	}
106
+
107
+
108
+	/**
109
+	 * @param string $class_name
110
+	 * @return ReflectionParameter[]
111
+	 * @throws InvalidDataTypeException
112
+	 * @throws ReflectionException
113
+	 */
114
+	public function getParameters($class_name)
115
+	{
116
+		if (! isset($this->parameters[ $class_name ])) {
117
+			$constructor                     = $this->getConstructor($class_name);
118
+			$this->parameters[ $class_name ] = $constructor->getParameters();
119
+		}
120
+		return $this->parameters[ $class_name ];
121
+	}
122
+
123
+
124
+	/**
125
+	 * @param ReflectionClass $reflection_class
126
+	 * @return ReflectionParameter[]
127
+	 * @throws InvalidDataTypeException
128
+	 * @throws ReflectionException
129
+	 */
130
+	public function getParametersFromReflection(ReflectionClass $reflection_class)
131
+	{
132
+		return $this->getParameters($reflection_class->getName());
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param ReflectionMethod $constructor
138
+	 * @return ReflectionParameter[]
139
+	 * @throws InvalidDataTypeException
140
+	 * @throws ReflectionException
141
+	 */
142
+	public function getParametersFromReflectionConstructor(ReflectionMethod $constructor)
143
+	{
144
+		return $this->getParameters($constructor->getDeclaringClass());
145
+	}
146
+
147
+
148
+	/**
149
+	 * @param ReflectionParameter $param
150
+	 * @param string              $class_name
151
+	 * @param string              $index
152
+	 * @return string|null
153
+	 */
154
+	public function getParameterClassName(ReflectionParameter $param, $class_name, $index)
155
+	{
156
+		if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_name'])) {
157
+			return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
158
+		}
159
+		if (! isset($this->parameter_classes[ $class_name ])) {
160
+			$this->parameter_classes[ $class_name ] = array();
161
+		}
162
+		if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
163
+			$this->parameter_classes[ $class_name ][ $index ] = array();
164
+		}
165
+		$this->parameter_classes[ $class_name ][ $index ]['param_class_name'] = $param->getClass()
166
+			? $param->getClass()->name
167
+			: null;
168
+		return $this->parameter_classes[ $class_name ][ $index ]['param_class_name'];
169
+	}
170
+
171
+
172
+	/**
173
+	 * @param ReflectionParameter $param
174
+	 * @param string              $class_name
175
+	 * @param string              $index
176
+	 * @return string|null
177
+	 */
178
+	public function getParameterDefaultValue(ReflectionParameter $param, $class_name, $index)
179
+	{
180
+		if (isset($this->parameter_classes[ $class_name ][ $index ]['param_class_default'])) {
181
+			return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
182
+		}
183
+		if (! isset($this->parameter_classes[ $class_name ])) {
184
+			$this->parameter_classes[ $class_name ] = array();
185
+		}
186
+		if (! isset($this->parameter_classes[ $class_name ][ $index ])) {
187
+			$this->parameter_classes[ $class_name ][ $index ] = array();
188
+		}
189
+		$this->parameter_classes[ $class_name ][ $index ]['param_class_default'] = $param->isDefaultValueAvailable()
190
+			? $param->getDefaultValue()
191
+			: null;
192
+		return $this->parameter_classes[ $class_name ][ $index ]['param_class_default'];
193
+	}
194
+
195
+
196
+	/**
197
+	 * @param string $class_name
198
+	 * @return ReflectionProperty[]
199
+	 * @throws InvalidDataTypeException
200
+	 * @throws ReflectionException
201
+	 */
202
+	public function getProperties($class_name)
203
+	{
204
+		if (! isset($this->properties[ $class_name ])) {
205
+			$reflection_class                = $this->getReflectionClass($class_name);
206
+			$this->properties[ $class_name ] = $reflection_class->getProperties();
207
+		}
208
+		return $this->properties[ $class_name ];
209
+	}
210
+
211
+
212
+	/**
213
+	 * @param ReflectionClass $reflection_class
214
+	 * @return ReflectionProperty[]
215
+	 * @throws InvalidDataTypeException
216
+	 * @throws ReflectionException
217
+	 */
218
+	public function getPropertiesFromReflection(ReflectionClass $reflection_class)
219
+	{
220
+		return $this->getProperties($reflection_class->getName());
221
+	}
222
+
223
+
224
+	/**
225
+	 * @param string $class_name
226
+	 * @return ReflectionMethod[]
227
+	 * @throws InvalidDataTypeException
228
+	 * @throws ReflectionException
229
+	 */
230
+	public function getMethods($class_name)
231
+	{
232
+		if (! isset($this->methods[ $class_name ])) {
233
+			$reflection_class             = $this->getReflectionClass($class_name);
234
+			$this->methods[ $class_name ] = $reflection_class->getMethods();
235
+		}
236
+		return $this->methods[ $class_name ];
237
+	}
238
+
239
+
240
+	/**
241
+	 * @param ReflectionClass $reflection_class )
242
+	 * @return ReflectionMethod[]
243
+	 * @throws InvalidDataTypeException
244
+	 * @throws ReflectionException
245
+	 */
246
+	public function getMethodsFromReflection(ReflectionClass $reflection_class)
247
+	{
248
+		return $this->getMethods($reflection_class->getName());
249
+	}
250 250
 }
Please login to merge, or discard this patch.
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.
core/db_models/EEM_Line_Item.model.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -416,7 +416,7 @@
 block discarded – undo
416 416
      * If $expired is set to true, then only line items for expired sessions will be returned.
417 417
      * If $expired is set to false, then only line items for active sessions will be returned.
418 418
      *
419
-     * @param null $expired
419
+     * @param boolean $expired
420 420
      * @return EE_Base_Class[]|EE_Line_Item[]
421 421
      * @throws EE_Error
422 422
      * @throws InvalidArgumentException
Please login to merge, or discard this patch.
Indentation   +436 added lines, -436 removed lines patch added patch discarded remove patch
@@ -32,443 +32,443 @@
 block discarded – undo
32 32
 class EEM_Line_Item extends EEM_Base
33 33
 {
34 34
 
35
-    /**
36
-     * Tax sub-total is just the total of all the taxes, which should be children
37
-     * of this line item. There should only ever be one tax sub-total, and it should
38
-     * be a direct child of. Its quantity and LIN_unit_price = 1.
39
-     */
40
-    const type_tax_sub_total = 'tax-sub-total';
41
-
42
-    /**
43
-     * Tax line items indicate a tax applied to all the taxable line items.
44
-     * Should not have any children line items. Its LIN_unit_price = 0. Its LIN_percent is a percent, not a decimal
45
-     * (eg 10% tax = 10, not 0.1). Its LIN_total = LIN_unit_price * pre-tax-total. Quantity = 1.
46
-     */
47
-    const type_tax = 'tax';
48
-
49
-    /**
50
-     * Indicating individual items purchased, or discounts or surcharges.
51
-     * The sum of all the regular line items  plus the tax items should equal
52
-     * the grand total.
53
-     * Possible children are sub-line-items and cancellations.
54
-     * For flat items, LIN_unit_price * LIN_quantity = LIN_total. Its LIN_total is the sum of all the children
55
-     * LIN_totals. Its LIN_percent = 0.
56
-     * For percent items, its LIN_unit_price = 0. Its LIN_percent is a percent, not a decimal (eg 10% = 10, not 0.1).
57
-     * Its LIN_total is LIN_percent / 100 * sum of lower-priority sibling line items. Quantity = 1.
58
-     */
59
-    const type_line_item = 'line-item';
60
-
61
-    /**
62
-     * Line item indicating all the factors that make a single line item.
63
-     * Sub-line items should have NO children line items.
64
-     * For flat sub-items, their quantity should match their parent item, their LIN_unit_price should be this sub-item's
65
-     * contribution towards the price of ONE of their parent items, and its LIN_total should be
66
-     *  = LIN_quantity * LIN_unit_price. Its LIN_percent = 0.
67
-     * For percent sub-items, the quantity should be 1, LIN_unit_price should be 0, and its LIN_total should
68
-     * = LIN_percent / 100 * sum of lower-priority sibling line items..
69
-     */
70
-    const type_sub_line_item = 'sub-item';
71
-
72
-    /**
73
-     * Line item indicating a sub-total (eg total for an event, or pre-tax subtotal).
74
-     * Direct children should be event subtotals.
75
-     * Should have quantity of 1, and a LIN_total and LIN_unit_price of the sum of all its sub-items' LIN_totals.
76
-     *
77
-     */
78
-    const type_sub_total = 'sub-total';
79
-
80
-    /**
81
-     * Line item for the grand total of an order. Its direct children
82
-     * should be tax subtotals and (pre-tax) subtotals, and possibly a regular line item
83
-     * indicating a transaction-wide discount/surcharge. Should have a quantity of 1, a LIN_total and LIN_unit_price of
84
-     * the entire order's mount.
85
-     */
86
-    const type_total = 'total';
87
-
88
-    /**
89
-     * When a line item is cancelled, a sub-line-item of type 'cancellation'
90
-     * should be created, indicating the quantity that were cancelled
91
-     * (because a line item could have a quantity of 1, and its cancellation item
92
-     * could be for 3, indicating that originally 4 were purchased, but 3 have been
93
-     * cancelled, and only one remains).
94
-     * When items are refunded, a cancellation line item should be made, which points
95
-     * to teh payment model object which actually refunded the payment.
96
-     * Cancellations should NOT have any children line items; the should NOT affect
97
-     * any calculations, and are only meant as a record that cancellations have occurred.
98
-     * Their LIN_percent should be 0.
99
-     */
100
-    const type_cancellation = 'cancellation';
101
-
102
-    // private instance of the EEM_Line_Item object
103
-    protected static $_instance = null;
104
-
105
-
106
-    /**
107
-     *        private constructor to prevent direct creation
108
-     * @Constructor
109
-     * @access protected
110
-     * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved).  Note this just sends the timezone info to the date time model field objects.  Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option)
111
-     * @return \EEM_Line_Item
112
-     */
113
-    protected function __construct($timezone)
114
-    {
115
-        $this->singular_item = __('Line Item', 'event_espresso');
116
-        $this->plural_item = __('Line Items', 'event_espresso');
117
-
118
-        $this->_tables = array(
119
-            'Line_Item' => new EE_Primary_Table('esp_line_item', 'LIN_ID')
120
-        );
121
-        $line_items_can_be_for = apply_filters('FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket', 'Price', 'Event'));
122
-        $this->_fields = array(
123
-            'Line_Item' => array(
124
-                'LIN_ID' => new EE_Primary_Key_Int_Field('LIN_ID', __("ID", "event_espresso")),
125
-                'LIN_code' => new EE_Slug_Field('LIN_code', __("Code for index into Cart", "event_espresso"), true),
126
-                'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', __("Transaction ID", "event_espresso"), true, null, 'Transaction'),
127
-                'LIN_name' => new EE_Full_HTML_Field('LIN_name', __("Line Item Name", "event_espresso"), false, ''),
128
-                'LIN_desc' => new EE_Full_HTML_Field('LIN_desc', __("Line Item Description", "event_espresso"), true),
129
-                'LIN_unit_price' => new EE_Money_Field('LIN_unit_price', __("Unit Price", "event_espresso"), false, 0),
130
-                'LIN_percent' => new EE_Float_Field('LIN_percent', __("Percent", "event_espresso"), false, 0),
131
-                'LIN_is_taxable' => new EE_Boolean_Field('LIN_is_taxable', __("Taxable", "event_espresso"), false, false),
132
-                'LIN_order' => new EE_Integer_Field('LIN_order', __("Order of Application towards total of parent", "event_espresso"), false, 1),
133
-                'LIN_total' => new EE_Money_Field('LIN_total', __("Total (unit price x quantity)", "event_espresso"), false, 0),
134
-                'LIN_quantity' => new EE_Integer_Field('LIN_quantity', __("Quantity", "event_espresso"), true, 1),
135
-                'LIN_parent' => new EE_Integer_Field('LIN_parent', __("Parent ID (this item goes towards that Line Item's total)", "event_espresso"), true, null),
136
-                'LIN_type' => new EE_Enum_Text_Field('LIN_type', __("Type", "event_espresso"), false, 'line-item', array(
137
-                        self::type_line_item => __("Line Item", "event_espresso"),
138
-                        self::type_sub_line_item => __("Sub-Item", "event_espresso"),
139
-                        self::type_sub_total => __("Subtotal", "event_espresso"),
140
-                        self::type_tax_sub_total => __("Tax Subtotal", "event_espresso"),
141
-                        self::type_tax => __("Tax", "event_espresso"),
142
-                        self::type_total => __("Total", "event_espresso"),
143
-                        self::type_cancellation => __('Cancellation', 'event_espresso')
144
-                    )),
145
-                'OBJ_ID' => new EE_Foreign_Key_Int_Field('OBJ_ID', __('ID of Item purchased.', 'event_espresso'), true, null, $line_items_can_be_for),
146
-                'OBJ_type' => new EE_Any_Foreign_Model_Name_Field('OBJ_type', __("Model Name this Line Item is for", "event_espresso"), true, null, $line_items_can_be_for),
147
-                'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
148
-            )
149
-        );
150
-        $this->_model_relations = array(
151
-            'Transaction' => new EE_Belongs_To_Relation(),
152
-            'Ticket' => new EE_Belongs_To_Any_Relation(),
153
-            'Price' => new EE_Belongs_To_Any_Relation(),
154
-            'Event' => new EE_Belongs_To_Any_Relation()
155
-        );
156
-        $this->_model_chain_to_wp_user = 'Transaction.Registration.Event';
157
-        $this->_caps_slug = 'transactions';
158
-        parent::__construct($timezone);
159
-    }
160
-
161
-
162
-    /**
163
-     * Gets all the line items for this transaction of the given type
164
-     * @param string $line_item_type like one of EEM_Line_Item::type_*
165
-     * @param EE_Transaction|int $transaction
166
-     * @return EE_Line_Item[]
167
-     */
168
-    public function get_all_of_type_for_transaction($line_item_type, $transaction)
169
-    {
170
-        $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
171
-        return $this->get_all(array(array(
172
-            'LIN_type' => $line_item_type,
173
-            'TXN_ID' => $transaction
174
-        )));
175
-    }
176
-
177
-
178
-    /**
179
-     * Gets all line items unrelated to tickets that are normal line items
180
-     * (eg shipping, promotions, and miscellaneous other stuff should probably fit in this category)
181
-     * @param EE_Transaction|int $transaction
182
-     * @return EE_Line_Item[]
183
-     */
184
-    public function get_all_non_ticket_line_items_for_transaction($transaction)
185
-    {
186
-        $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
187
-        return $this->get_all(array(array(
188
-            'LIN_type' => self::type_line_item,
189
-            'TXN_ID' => $transaction,
190
-            'OR' => array(
191
-                'OBJ_type*notticket' => array('!=', 'Ticket'),
192
-                'OBJ_type*null' => array('IS_NULL'))
193
-        )));
194
-    }
195
-
196
-    /**
197
-     * Deletes line items with no transaction who have passed the transaction cutoff time.
198
-     * This needs to be very efficient
199
-     * because if there are spam bots afoot there will be LOTS of line items
200
-     * @return int count of how many deleted
201
-     */
202
-    public function delete_line_items_with_no_transaction()
203
-    {
204
-        /** @type WPDB $wpdb */
205
-        global $wpdb;
206
-        $time_to_leave_alone = apply_filters(
207
-            'FHEE__EEM_Line_Item__delete_line_items_with_no_transaction__time_to_leave_alone',
208
-            WEEK_IN_SECONDS
209
-        );
210
-        $query = $wpdb->prepare(
211
-            'DELETE li
35
+	/**
36
+	 * Tax sub-total is just the total of all the taxes, which should be children
37
+	 * of this line item. There should only ever be one tax sub-total, and it should
38
+	 * be a direct child of. Its quantity and LIN_unit_price = 1.
39
+	 */
40
+	const type_tax_sub_total = 'tax-sub-total';
41
+
42
+	/**
43
+	 * Tax line items indicate a tax applied to all the taxable line items.
44
+	 * Should not have any children line items. Its LIN_unit_price = 0. Its LIN_percent is a percent, not a decimal
45
+	 * (eg 10% tax = 10, not 0.1). Its LIN_total = LIN_unit_price * pre-tax-total. Quantity = 1.
46
+	 */
47
+	const type_tax = 'tax';
48
+
49
+	/**
50
+	 * Indicating individual items purchased, or discounts or surcharges.
51
+	 * The sum of all the regular line items  plus the tax items should equal
52
+	 * the grand total.
53
+	 * Possible children are sub-line-items and cancellations.
54
+	 * For flat items, LIN_unit_price * LIN_quantity = LIN_total. Its LIN_total is the sum of all the children
55
+	 * LIN_totals. Its LIN_percent = 0.
56
+	 * For percent items, its LIN_unit_price = 0. Its LIN_percent is a percent, not a decimal (eg 10% = 10, not 0.1).
57
+	 * Its LIN_total is LIN_percent / 100 * sum of lower-priority sibling line items. Quantity = 1.
58
+	 */
59
+	const type_line_item = 'line-item';
60
+
61
+	/**
62
+	 * Line item indicating all the factors that make a single line item.
63
+	 * Sub-line items should have NO children line items.
64
+	 * For flat sub-items, their quantity should match their parent item, their LIN_unit_price should be this sub-item's
65
+	 * contribution towards the price of ONE of their parent items, and its LIN_total should be
66
+	 *  = LIN_quantity * LIN_unit_price. Its LIN_percent = 0.
67
+	 * For percent sub-items, the quantity should be 1, LIN_unit_price should be 0, and its LIN_total should
68
+	 * = LIN_percent / 100 * sum of lower-priority sibling line items..
69
+	 */
70
+	const type_sub_line_item = 'sub-item';
71
+
72
+	/**
73
+	 * Line item indicating a sub-total (eg total for an event, or pre-tax subtotal).
74
+	 * Direct children should be event subtotals.
75
+	 * Should have quantity of 1, and a LIN_total and LIN_unit_price of the sum of all its sub-items' LIN_totals.
76
+	 *
77
+	 */
78
+	const type_sub_total = 'sub-total';
79
+
80
+	/**
81
+	 * Line item for the grand total of an order. Its direct children
82
+	 * should be tax subtotals and (pre-tax) subtotals, and possibly a regular line item
83
+	 * indicating a transaction-wide discount/surcharge. Should have a quantity of 1, a LIN_total and LIN_unit_price of
84
+	 * the entire order's mount.
85
+	 */
86
+	const type_total = 'total';
87
+
88
+	/**
89
+	 * When a line item is cancelled, a sub-line-item of type 'cancellation'
90
+	 * should be created, indicating the quantity that were cancelled
91
+	 * (because a line item could have a quantity of 1, and its cancellation item
92
+	 * could be for 3, indicating that originally 4 were purchased, but 3 have been
93
+	 * cancelled, and only one remains).
94
+	 * When items are refunded, a cancellation line item should be made, which points
95
+	 * to teh payment model object which actually refunded the payment.
96
+	 * Cancellations should NOT have any children line items; the should NOT affect
97
+	 * any calculations, and are only meant as a record that cancellations have occurred.
98
+	 * Their LIN_percent should be 0.
99
+	 */
100
+	const type_cancellation = 'cancellation';
101
+
102
+	// private instance of the EEM_Line_Item object
103
+	protected static $_instance = null;
104
+
105
+
106
+	/**
107
+	 *        private constructor to prevent direct creation
108
+	 * @Constructor
109
+	 * @access protected
110
+	 * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved).  Note this just sends the timezone info to the date time model field objects.  Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option)
111
+	 * @return \EEM_Line_Item
112
+	 */
113
+	protected function __construct($timezone)
114
+	{
115
+		$this->singular_item = __('Line Item', 'event_espresso');
116
+		$this->plural_item = __('Line Items', 'event_espresso');
117
+
118
+		$this->_tables = array(
119
+			'Line_Item' => new EE_Primary_Table('esp_line_item', 'LIN_ID')
120
+		);
121
+		$line_items_can_be_for = apply_filters('FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket', 'Price', 'Event'));
122
+		$this->_fields = array(
123
+			'Line_Item' => array(
124
+				'LIN_ID' => new EE_Primary_Key_Int_Field('LIN_ID', __("ID", "event_espresso")),
125
+				'LIN_code' => new EE_Slug_Field('LIN_code', __("Code for index into Cart", "event_espresso"), true),
126
+				'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', __("Transaction ID", "event_espresso"), true, null, 'Transaction'),
127
+				'LIN_name' => new EE_Full_HTML_Field('LIN_name', __("Line Item Name", "event_espresso"), false, ''),
128
+				'LIN_desc' => new EE_Full_HTML_Field('LIN_desc', __("Line Item Description", "event_espresso"), true),
129
+				'LIN_unit_price' => new EE_Money_Field('LIN_unit_price', __("Unit Price", "event_espresso"), false, 0),
130
+				'LIN_percent' => new EE_Float_Field('LIN_percent', __("Percent", "event_espresso"), false, 0),
131
+				'LIN_is_taxable' => new EE_Boolean_Field('LIN_is_taxable', __("Taxable", "event_espresso"), false, false),
132
+				'LIN_order' => new EE_Integer_Field('LIN_order', __("Order of Application towards total of parent", "event_espresso"), false, 1),
133
+				'LIN_total' => new EE_Money_Field('LIN_total', __("Total (unit price x quantity)", "event_espresso"), false, 0),
134
+				'LIN_quantity' => new EE_Integer_Field('LIN_quantity', __("Quantity", "event_espresso"), true, 1),
135
+				'LIN_parent' => new EE_Integer_Field('LIN_parent', __("Parent ID (this item goes towards that Line Item's total)", "event_espresso"), true, null),
136
+				'LIN_type' => new EE_Enum_Text_Field('LIN_type', __("Type", "event_espresso"), false, 'line-item', array(
137
+						self::type_line_item => __("Line Item", "event_espresso"),
138
+						self::type_sub_line_item => __("Sub-Item", "event_espresso"),
139
+						self::type_sub_total => __("Subtotal", "event_espresso"),
140
+						self::type_tax_sub_total => __("Tax Subtotal", "event_espresso"),
141
+						self::type_tax => __("Tax", "event_espresso"),
142
+						self::type_total => __("Total", "event_espresso"),
143
+						self::type_cancellation => __('Cancellation', 'event_espresso')
144
+					)),
145
+				'OBJ_ID' => new EE_Foreign_Key_Int_Field('OBJ_ID', __('ID of Item purchased.', 'event_espresso'), true, null, $line_items_can_be_for),
146
+				'OBJ_type' => new EE_Any_Foreign_Model_Name_Field('OBJ_type', __("Model Name this Line Item is for", "event_espresso"), true, null, $line_items_can_be_for),
147
+				'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
148
+			)
149
+		);
150
+		$this->_model_relations = array(
151
+			'Transaction' => new EE_Belongs_To_Relation(),
152
+			'Ticket' => new EE_Belongs_To_Any_Relation(),
153
+			'Price' => new EE_Belongs_To_Any_Relation(),
154
+			'Event' => new EE_Belongs_To_Any_Relation()
155
+		);
156
+		$this->_model_chain_to_wp_user = 'Transaction.Registration.Event';
157
+		$this->_caps_slug = 'transactions';
158
+		parent::__construct($timezone);
159
+	}
160
+
161
+
162
+	/**
163
+	 * Gets all the line items for this transaction of the given type
164
+	 * @param string $line_item_type like one of EEM_Line_Item::type_*
165
+	 * @param EE_Transaction|int $transaction
166
+	 * @return EE_Line_Item[]
167
+	 */
168
+	public function get_all_of_type_for_transaction($line_item_type, $transaction)
169
+	{
170
+		$transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
171
+		return $this->get_all(array(array(
172
+			'LIN_type' => $line_item_type,
173
+			'TXN_ID' => $transaction
174
+		)));
175
+	}
176
+
177
+
178
+	/**
179
+	 * Gets all line items unrelated to tickets that are normal line items
180
+	 * (eg shipping, promotions, and miscellaneous other stuff should probably fit in this category)
181
+	 * @param EE_Transaction|int $transaction
182
+	 * @return EE_Line_Item[]
183
+	 */
184
+	public function get_all_non_ticket_line_items_for_transaction($transaction)
185
+	{
186
+		$transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
187
+		return $this->get_all(array(array(
188
+			'LIN_type' => self::type_line_item,
189
+			'TXN_ID' => $transaction,
190
+			'OR' => array(
191
+				'OBJ_type*notticket' => array('!=', 'Ticket'),
192
+				'OBJ_type*null' => array('IS_NULL'))
193
+		)));
194
+	}
195
+
196
+	/**
197
+	 * Deletes line items with no transaction who have passed the transaction cutoff time.
198
+	 * This needs to be very efficient
199
+	 * because if there are spam bots afoot there will be LOTS of line items
200
+	 * @return int count of how many deleted
201
+	 */
202
+	public function delete_line_items_with_no_transaction()
203
+	{
204
+		/** @type WPDB $wpdb */
205
+		global $wpdb;
206
+		$time_to_leave_alone = apply_filters(
207
+			'FHEE__EEM_Line_Item__delete_line_items_with_no_transaction__time_to_leave_alone',
208
+			WEEK_IN_SECONDS
209
+		);
210
+		$query = $wpdb->prepare(
211
+			'DELETE li
212 212
 				FROM ' . $this->table() . ' li
213 213
 				LEFT JOIN ' . EEM_Transaction::instance()->table() . ' t ON li.TXN_ID = t.TXN_ID
214 214
 				WHERE t.TXN_ID IS NULL AND li.LIN_timestamp < %s',
215
-            // use GMT time because that's what TXN_timestamps are in
216
-            date('Y-m-d H:i:s', time() - $time_to_leave_alone)
217
-        );
218
-        return $wpdb->query($query);
219
-    }
220
-
221
-
222
-    /**
223
-     * get_line_item_for_transaction_object
224
-     * Gets a transaction's line item record for a specific object such as a EE_Event or EE_Ticket
225
-     *
226
-     * @param int $TXN_ID
227
-     * @param \EE_Base_Class $object
228
-     * @return EE_Line_Item[]
229
-     */
230
-    public function get_line_item_for_transaction_object($TXN_ID, EE_Base_Class $object)
231
-    {
232
-        return $this->get_all(array(array(
233
-            'TXN_ID' => $TXN_ID,
234
-            'OBJ_type' => str_replace('EE_', '', get_class($object)),
235
-            'OBJ_ID' => $object->ID()
236
-        )));
237
-    }
238
-
239
-
240
-    /**
241
-     * get_object_line_items_for_transaction
242
-     * Gets all of the the object line items for a transaction, based on an object type plus an array of object IDs
243
-     *
244
-     * @param int $TXN_ID
245
-     * @param string $OBJ_type
246
-     * @param array $OBJ_IDs
247
-     * @return EE_Line_Item[]
248
-     */
249
-    public function get_object_line_items_for_transaction($TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array())
250
-    {
251
-        $query_params = array(
252
-            'OBJ_type' => $OBJ_type,
253
-            // if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
254
-            'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
255
-        );
256
-        if ($TXN_ID) {
257
-            $query_params['TXN_ID'] = $TXN_ID;
258
-        }
259
-        return $this->get_all(array($query_params));
260
-    }
261
-
262
-
263
-    /**
264
-     * get_all_ticket_line_items_for_transaction
265
-     *
266
-     * @param EE_Transaction $transaction
267
-     * @return EE_Line_Item[]
268
-     */
269
-    public function get_all_ticket_line_items_for_transaction(EE_Transaction $transaction)
270
-    {
271
-        return $this->get_all(array(
272
-            array(
273
-                'TXN_ID' => $transaction->ID(),
274
-                'OBJ_type' => 'Ticket',
275
-            )
276
-        ));
277
-    }
278
-
279
-
280
-    /**
281
-     * get_ticket_line_item_for_transaction
282
-     *
283
-     * @param int $TXN_ID
284
-     * @param int $TKT_ID
285
-     * @return \EE_Line_Item
286
-     */
287
-    public function get_ticket_line_item_for_transaction($TXN_ID, $TKT_ID)
288
-    {
289
-        return $this->get_one(array(
290
-            array(
291
-                'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID($TXN_ID),
292
-                'OBJ_ID' => $TKT_ID,
293
-                'OBJ_type' => 'Ticket',
294
-            )
295
-        ));
296
-    }
297
-
298
-
299
-    /**
300
-     * get_existing_promotion_line_item
301
-     * searches the cart for existing line items for the specified promotion
302
-     *
303
-     * @since   1.0.0
304
-     *
305
-     * @param EE_Line_Item $parent_line_item
306
-     * @param EE_Promotion $promotion
307
-     * @return EE_Line_Item
308
-     */
309
-    public function get_existing_promotion_line_item(EE_Line_Item $parent_line_item, EE_Promotion $promotion)
310
-    {
311
-        return $this->get_one(array(
312
-            array(
313
-                'TXN_ID' => $parent_line_item->TXN_ID(),
314
-                'LIN_parent' => $parent_line_item->ID(),
315
-                'OBJ_type' => 'Promotion',
316
-                'OBJ_ID' => $promotion->ID()
317
-            )
318
-        ));
319
-    }
320
-
321
-
322
-    /**
323
-     * get_all_promotion_line_items
324
-     * searches the cart for any and all existing promotion line items
325
-     *
326
-     * @since   1.0.0
327
-     *
328
-     * @param EE_Line_Item $parent_line_item
329
-     * @return EE_Line_Item[]
330
-     */
331
-    public function get_all_promotion_line_items(EE_Line_Item $parent_line_item)
332
-    {
333
-        return $this->get_all(array(
334
-            array(
335
-                'TXN_ID' => $parent_line_item->TXN_ID(),
336
-                'LIN_parent' => $parent_line_item->ID(),
337
-                'OBJ_type' => 'Promotion'
338
-            )
339
-        ));
340
-    }
341
-
342
-    /**
343
-     * Gets the registration's corresponding line item.
344
-     * Note: basically does NOT support having multiple line items for a single ticket,
345
-     * which would happen if some of the registrations had a price modifier while others didn't.
346
-     * In order to support that, we'd probably need a LIN_ID on registrations or something.
347
-     * @param EE_Registration $registration
348
-     * @return EE_Line_ITem
349
-     */
350
-    public function get_line_item_for_registration(EE_Registration $registration)
351
-    {
352
-        return $this->get_one($this->line_item_for_registration_query_params($registration));
353
-    }
354
-
355
-    /**
356
-     * Gets the query params used to retrieve a specific line item for the given registration
357
-     * @param EE_Registration $registration
358
-     * @param array $original_query_params any extra query params you'd like to be merged with
359
-     * @return array like EEM_Base::get_all()'s $query_params
360
-     */
361
-    public function line_item_for_registration_query_params(EE_Registration $registration, $original_query_params = array())
362
-    {
363
-        return array_replace_recursive($original_query_params, array(
364
-            array(
365
-                'OBJ_ID' => $registration->ticket_ID(),
366
-                'OBJ_type' => 'Ticket',
367
-                'TXN_ID' => $registration->transaction_ID()
368
-            )
369
-        ));
370
-    }
371
-
372
-
373
-    /**
374
-     * @return EE_Base_Class[]|EE_Line_Item[]
375
-     * @throws InvalidInterfaceException
376
-     * @throws InvalidDataTypeException
377
-     * @throws EE_Error
378
-     * @throws InvalidArgumentException
379
-     */
380
-    public function get_total_line_items_with_no_transaction()
381
-    {
382
-        return $this->get_total_line_items_for_carts();
383
-    }
384
-
385
-
386
-    /**
387
-     * @return EE_Base_Class[]|EE_Line_Item[]
388
-     * @throws InvalidInterfaceException
389
-     * @throws InvalidDataTypeException
390
-     * @throws EE_Error
391
-     * @throws InvalidArgumentException
392
-     */
393
-    public function get_total_line_items_for_active_carts()
394
-    {
395
-        return $this->get_total_line_items_for_carts(false);
396
-    }
397
-
398
-
399
-    /**
400
-     * @return EE_Base_Class[]|EE_Line_Item[]
401
-     * @throws InvalidInterfaceException
402
-     * @throws InvalidDataTypeException
403
-     * @throws EE_Error
404
-     * @throws InvalidArgumentException
405
-     */
406
-    public function get_total_line_items_for_expired_carts()
407
-    {
408
-        return $this->get_total_line_items_for_carts(true);
409
-    }
410
-
411
-
412
-    /**
413
-     * Returns an array of grand total line items where the TXN_ID is 0.
414
-     * If $expired is set to true, then only line items for expired sessions will be returned.
415
-     * If $expired is set to false, then only line items for active sessions will be returned.
416
-     *
417
-     * @param null $expired
418
-     * @return EE_Base_Class[]|EE_Line_Item[]
419
-     * @throws EE_Error
420
-     * @throws InvalidArgumentException
421
-     * @throws InvalidDataTypeException
422
-     * @throws InvalidInterfaceException
423
-     */
424
-    private function get_total_line_items_for_carts($expired = null)
425
-    {
426
-        $where_params = array(
427
-            'TXN_ID' => 0,
428
-            'LIN_type' => 'total',
429
-        );
430
-        if ($expired !== null) {
431
-            /** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */
432
-            $session_lifespan = LoaderFactory::getLoader()->getShared(
433
-                'EventEspresso\core\domain\values\session\SessionLifespan'
434
-            );
435
-            $where_params['LIN_timestamp'] = array(
436
-                $expired ? '<=' : '>',
437
-                $session_lifespan->expiration(),
438
-            );
439
-        }
440
-        return $this->get_all(array($where_params));
441
-    }
442
-
443
-
444
-    /**
445
-     * Returns an array of ticket total line items where the TXN_ID is 0
446
-     * AND the timestamp is older than the session lifespan.
447
-     *
448
-     * @param int $timestamp
449
-     * @return EE_Base_Class[]|EE_Line_Item[]
450
-     * @throws EE_Error
451
-     * @throws InvalidArgumentException
452
-     * @throws InvalidDataTypeException
453
-     * @throws InvalidInterfaceException
454
-     */
455
-    public function getTicketLineItemsForExpiredCarts($timestamp = 0)
456
-    {
457
-        if (! absint($timestamp)) {
458
-            /** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */
459
-            $session_lifespan = LoaderFactory::getLoader()->getShared(
460
-                'EventEspresso\core\domain\values\session\SessionLifespan'
461
-            );
462
-            $timestamp = $session_lifespan->expiration();
463
-        }
464
-        return $this->get_all(
465
-            array(
466
-                array(
467
-                    'TXN_ID'        => 0,
468
-                    'OBJ_type'      => 'Ticket',
469
-                    'LIN_timestamp' => array('<=', $timestamp),
470
-                )
471
-            )
472
-        );
473
-    }
215
+			// use GMT time because that's what TXN_timestamps are in
216
+			date('Y-m-d H:i:s', time() - $time_to_leave_alone)
217
+		);
218
+		return $wpdb->query($query);
219
+	}
220
+
221
+
222
+	/**
223
+	 * get_line_item_for_transaction_object
224
+	 * Gets a transaction's line item record for a specific object such as a EE_Event or EE_Ticket
225
+	 *
226
+	 * @param int $TXN_ID
227
+	 * @param \EE_Base_Class $object
228
+	 * @return EE_Line_Item[]
229
+	 */
230
+	public function get_line_item_for_transaction_object($TXN_ID, EE_Base_Class $object)
231
+	{
232
+		return $this->get_all(array(array(
233
+			'TXN_ID' => $TXN_ID,
234
+			'OBJ_type' => str_replace('EE_', '', get_class($object)),
235
+			'OBJ_ID' => $object->ID()
236
+		)));
237
+	}
238
+
239
+
240
+	/**
241
+	 * get_object_line_items_for_transaction
242
+	 * Gets all of the the object line items for a transaction, based on an object type plus an array of object IDs
243
+	 *
244
+	 * @param int $TXN_ID
245
+	 * @param string $OBJ_type
246
+	 * @param array $OBJ_IDs
247
+	 * @return EE_Line_Item[]
248
+	 */
249
+	public function get_object_line_items_for_transaction($TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array())
250
+	{
251
+		$query_params = array(
252
+			'OBJ_type' => $OBJ_type,
253
+			// if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
254
+			'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
255
+		);
256
+		if ($TXN_ID) {
257
+			$query_params['TXN_ID'] = $TXN_ID;
258
+		}
259
+		return $this->get_all(array($query_params));
260
+	}
261
+
262
+
263
+	/**
264
+	 * get_all_ticket_line_items_for_transaction
265
+	 *
266
+	 * @param EE_Transaction $transaction
267
+	 * @return EE_Line_Item[]
268
+	 */
269
+	public function get_all_ticket_line_items_for_transaction(EE_Transaction $transaction)
270
+	{
271
+		return $this->get_all(array(
272
+			array(
273
+				'TXN_ID' => $transaction->ID(),
274
+				'OBJ_type' => 'Ticket',
275
+			)
276
+		));
277
+	}
278
+
279
+
280
+	/**
281
+	 * get_ticket_line_item_for_transaction
282
+	 *
283
+	 * @param int $TXN_ID
284
+	 * @param int $TKT_ID
285
+	 * @return \EE_Line_Item
286
+	 */
287
+	public function get_ticket_line_item_for_transaction($TXN_ID, $TKT_ID)
288
+	{
289
+		return $this->get_one(array(
290
+			array(
291
+				'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID($TXN_ID),
292
+				'OBJ_ID' => $TKT_ID,
293
+				'OBJ_type' => 'Ticket',
294
+			)
295
+		));
296
+	}
297
+
298
+
299
+	/**
300
+	 * get_existing_promotion_line_item
301
+	 * searches the cart for existing line items for the specified promotion
302
+	 *
303
+	 * @since   1.0.0
304
+	 *
305
+	 * @param EE_Line_Item $parent_line_item
306
+	 * @param EE_Promotion $promotion
307
+	 * @return EE_Line_Item
308
+	 */
309
+	public function get_existing_promotion_line_item(EE_Line_Item $parent_line_item, EE_Promotion $promotion)
310
+	{
311
+		return $this->get_one(array(
312
+			array(
313
+				'TXN_ID' => $parent_line_item->TXN_ID(),
314
+				'LIN_parent' => $parent_line_item->ID(),
315
+				'OBJ_type' => 'Promotion',
316
+				'OBJ_ID' => $promotion->ID()
317
+			)
318
+		));
319
+	}
320
+
321
+
322
+	/**
323
+	 * get_all_promotion_line_items
324
+	 * searches the cart for any and all existing promotion line items
325
+	 *
326
+	 * @since   1.0.0
327
+	 *
328
+	 * @param EE_Line_Item $parent_line_item
329
+	 * @return EE_Line_Item[]
330
+	 */
331
+	public function get_all_promotion_line_items(EE_Line_Item $parent_line_item)
332
+	{
333
+		return $this->get_all(array(
334
+			array(
335
+				'TXN_ID' => $parent_line_item->TXN_ID(),
336
+				'LIN_parent' => $parent_line_item->ID(),
337
+				'OBJ_type' => 'Promotion'
338
+			)
339
+		));
340
+	}
341
+
342
+	/**
343
+	 * Gets the registration's corresponding line item.
344
+	 * Note: basically does NOT support having multiple line items for a single ticket,
345
+	 * which would happen if some of the registrations had a price modifier while others didn't.
346
+	 * In order to support that, we'd probably need a LIN_ID on registrations or something.
347
+	 * @param EE_Registration $registration
348
+	 * @return EE_Line_ITem
349
+	 */
350
+	public function get_line_item_for_registration(EE_Registration $registration)
351
+	{
352
+		return $this->get_one($this->line_item_for_registration_query_params($registration));
353
+	}
354
+
355
+	/**
356
+	 * Gets the query params used to retrieve a specific line item for the given registration
357
+	 * @param EE_Registration $registration
358
+	 * @param array $original_query_params any extra query params you'd like to be merged with
359
+	 * @return array like EEM_Base::get_all()'s $query_params
360
+	 */
361
+	public function line_item_for_registration_query_params(EE_Registration $registration, $original_query_params = array())
362
+	{
363
+		return array_replace_recursive($original_query_params, array(
364
+			array(
365
+				'OBJ_ID' => $registration->ticket_ID(),
366
+				'OBJ_type' => 'Ticket',
367
+				'TXN_ID' => $registration->transaction_ID()
368
+			)
369
+		));
370
+	}
371
+
372
+
373
+	/**
374
+	 * @return EE_Base_Class[]|EE_Line_Item[]
375
+	 * @throws InvalidInterfaceException
376
+	 * @throws InvalidDataTypeException
377
+	 * @throws EE_Error
378
+	 * @throws InvalidArgumentException
379
+	 */
380
+	public function get_total_line_items_with_no_transaction()
381
+	{
382
+		return $this->get_total_line_items_for_carts();
383
+	}
384
+
385
+
386
+	/**
387
+	 * @return EE_Base_Class[]|EE_Line_Item[]
388
+	 * @throws InvalidInterfaceException
389
+	 * @throws InvalidDataTypeException
390
+	 * @throws EE_Error
391
+	 * @throws InvalidArgumentException
392
+	 */
393
+	public function get_total_line_items_for_active_carts()
394
+	{
395
+		return $this->get_total_line_items_for_carts(false);
396
+	}
397
+
398
+
399
+	/**
400
+	 * @return EE_Base_Class[]|EE_Line_Item[]
401
+	 * @throws InvalidInterfaceException
402
+	 * @throws InvalidDataTypeException
403
+	 * @throws EE_Error
404
+	 * @throws InvalidArgumentException
405
+	 */
406
+	public function get_total_line_items_for_expired_carts()
407
+	{
408
+		return $this->get_total_line_items_for_carts(true);
409
+	}
410
+
411
+
412
+	/**
413
+	 * Returns an array of grand total line items where the TXN_ID is 0.
414
+	 * If $expired is set to true, then only line items for expired sessions will be returned.
415
+	 * If $expired is set to false, then only line items for active sessions will be returned.
416
+	 *
417
+	 * @param null $expired
418
+	 * @return EE_Base_Class[]|EE_Line_Item[]
419
+	 * @throws EE_Error
420
+	 * @throws InvalidArgumentException
421
+	 * @throws InvalidDataTypeException
422
+	 * @throws InvalidInterfaceException
423
+	 */
424
+	private function get_total_line_items_for_carts($expired = null)
425
+	{
426
+		$where_params = array(
427
+			'TXN_ID' => 0,
428
+			'LIN_type' => 'total',
429
+		);
430
+		if ($expired !== null) {
431
+			/** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */
432
+			$session_lifespan = LoaderFactory::getLoader()->getShared(
433
+				'EventEspresso\core\domain\values\session\SessionLifespan'
434
+			);
435
+			$where_params['LIN_timestamp'] = array(
436
+				$expired ? '<=' : '>',
437
+				$session_lifespan->expiration(),
438
+			);
439
+		}
440
+		return $this->get_all(array($where_params));
441
+	}
442
+
443
+
444
+	/**
445
+	 * Returns an array of ticket total line items where the TXN_ID is 0
446
+	 * AND the timestamp is older than the session lifespan.
447
+	 *
448
+	 * @param int $timestamp
449
+	 * @return EE_Base_Class[]|EE_Line_Item[]
450
+	 * @throws EE_Error
451
+	 * @throws InvalidArgumentException
452
+	 * @throws InvalidDataTypeException
453
+	 * @throws InvalidInterfaceException
454
+	 */
455
+	public function getTicketLineItemsForExpiredCarts($timestamp = 0)
456
+	{
457
+		if (! absint($timestamp)) {
458
+			/** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */
459
+			$session_lifespan = LoaderFactory::getLoader()->getShared(
460
+				'EventEspresso\core\domain\values\session\SessionLifespan'
461
+			);
462
+			$timestamp = $session_lifespan->expiration();
463
+		}
464
+		return $this->get_all(
465
+			array(
466
+				array(
467
+					'TXN_ID'        => 0,
468
+					'OBJ_type'      => 'Ticket',
469
+					'LIN_timestamp' => array('<=', $timestamp),
470
+				)
471
+			)
472
+		);
473
+	}
474 474
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -209,8 +209,8 @@  discard block
 block discarded – undo
209 209
         );
210 210
         $query = $wpdb->prepare(
211 211
             'DELETE li
212
-				FROM ' . $this->table() . ' li
213
-				LEFT JOIN ' . EEM_Transaction::instance()->table() . ' t ON li.TXN_ID = t.TXN_ID
212
+				FROM ' . $this->table().' li
213
+				LEFT JOIN ' . EEM_Transaction::instance()->table().' t ON li.TXN_ID = t.TXN_ID
214 214
 				WHERE t.TXN_ID IS NULL AND li.LIN_timestamp < %s',
215 215
             // use GMT time because that's what TXN_timestamps are in
216 216
             date('Y-m-d H:i:s', time() - $time_to_leave_alone)
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
         $query_params = array(
252 252
             'OBJ_type' => $OBJ_type,
253 253
             // if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
254
-            'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
254
+            'OBJ_ID' => is_array($OBJ_IDs) && ! isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
255 255
         );
256 256
         if ($TXN_ID) {
257 257
             $query_params['TXN_ID'] = $TXN_ID;
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
      */
455 455
     public function getTicketLineItemsForExpiredCarts($timestamp = 0)
456 456
     {
457
-        if (! absint($timestamp)) {
457
+        if ( ! absint($timestamp)) {
458 458
             /** @var EventEspresso\core\domain\values\session\SessionLifespan $session_lifespan */
459 459
             $session_lifespan = LoaderFactory::getLoader()->getShared(
460 460
                 'EventEspresso\core\domain\values\session\SessionLifespan'
Please login to merge, or discard this patch.