Completed
Branch Gutenberg/event-attendees-bloc... (e27df5)
by
unknown
56:20 queued 41:53
created
core/services/privacy/policy/PrivacyPolicyManager.php 1 patch
Indentation   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -24,70 +24,70 @@
 block discarded – undo
24 24
 class PrivacyPolicyManager
25 25
 {
26 26
 
27
-    public function __construct()
28
-    {
29
-        add_action('current_screen', array($this, 'addPrivacyPolicy'), 9);
30
-    }
27
+	public function __construct()
28
+	{
29
+		add_action('current_screen', array($this, 'addPrivacyPolicy'), 9);
30
+	}
31 31
 
32 32
 
33
-    /**
34
-     * For all the registered `PrivacyPolicyInterface`s, add their privacy policy content
35
-     *
36
-     * @param WP_Screen $screen
37
-     * @throws InvalidClassException
38
-     * @throws InvalidDataTypeException
39
-     * @throws InvalidEntityException
40
-     * @throws InvalidFilePathException
41
-     * @throws InvalidIdentifierException
42
-     * @throws InvalidInterfaceException
43
-     */
44
-    public function addPrivacyPolicy(WP_Screen $screen)
45
-    {
46
-        if ($screen instanceof WP_Screen
47
-            && $screen->id === 'tools'
48
-            && isset($_GET['wp-privacy-policy-guide'])) {
49
-            // load all the privacy policy stuff
50
-            // add post policy text
51
-            foreach ($this->loadPrivacyPolicyCollection() as $privacy_policy) {
52
-                wp_add_privacy_policy_content($privacy_policy->getName(), $privacy_policy->getContent());
53
-            }
54
-        }
55
-    }
33
+	/**
34
+	 * For all the registered `PrivacyPolicyInterface`s, add their privacy policy content
35
+	 *
36
+	 * @param WP_Screen $screen
37
+	 * @throws InvalidClassException
38
+	 * @throws InvalidDataTypeException
39
+	 * @throws InvalidEntityException
40
+	 * @throws InvalidFilePathException
41
+	 * @throws InvalidIdentifierException
42
+	 * @throws InvalidInterfaceException
43
+	 */
44
+	public function addPrivacyPolicy(WP_Screen $screen)
45
+	{
46
+		if ($screen instanceof WP_Screen
47
+			&& $screen->id === 'tools'
48
+			&& isset($_GET['wp-privacy-policy-guide'])) {
49
+			// load all the privacy policy stuff
50
+			// add post policy text
51
+			foreach ($this->loadPrivacyPolicyCollection() as $privacy_policy) {
52
+				wp_add_privacy_policy_content($privacy_policy->getName(), $privacy_policy->getContent());
53
+			}
54
+		}
55
+	}
56 56
 
57 57
 
58
-    /**
59
-     * @return CollectionInterface|PrivacyPolicyInterface[]
60
-     * @throws InvalidIdentifierException
61
-     * @throws InvalidInterfaceException
62
-     * @throws InvalidFilePathException
63
-     * @throws InvalidEntityException
64
-     * @throws InvalidDataTypeException
65
-     * @throws InvalidClassException
66
-     */
67
-    protected function loadPrivacyPolicyCollection()
68
-    {
69
-        $loader = new CollectionLoader(
70
-            new CollectionDetails(
71
-                // collection name
72
-                'privacy_policies',
73
-                // collection interface
74
-                'EventEspresso\core\services\privacy\policy\PrivacyPolicyInterface',
75
-                // FQCNs for classes to add (all classes within that namespace will be loaded)
76
-                apply_filters(
77
-                    'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
78
-                    array('EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy')
79
-                ),
80
-                // filepaths to classes to add
81
-                array(),
82
-                // file mask to use if parsing folder for files to add
83
-                '',
84
-                // what to use as identifier for collection entities
85
-                // using CLASS NAME prevents duplicates (works like a singleton)
86
-                CollectionDetails::ID_CLASS_NAME
87
-            )
88
-        );
89
-        return $loader->getCollection();
90
-    }
58
+	/**
59
+	 * @return CollectionInterface|PrivacyPolicyInterface[]
60
+	 * @throws InvalidIdentifierException
61
+	 * @throws InvalidInterfaceException
62
+	 * @throws InvalidFilePathException
63
+	 * @throws InvalidEntityException
64
+	 * @throws InvalidDataTypeException
65
+	 * @throws InvalidClassException
66
+	 */
67
+	protected function loadPrivacyPolicyCollection()
68
+	{
69
+		$loader = new CollectionLoader(
70
+			new CollectionDetails(
71
+				// collection name
72
+				'privacy_policies',
73
+				// collection interface
74
+				'EventEspresso\core\services\privacy\policy\PrivacyPolicyInterface',
75
+				// FQCNs for classes to add (all classes within that namespace will be loaded)
76
+				apply_filters(
77
+					'FHEE__EventEspresso_core_services_privacy_policy_PrivacyPolicyManager__privacy_policies',
78
+					array('EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy')
79
+				),
80
+				// filepaths to classes to add
81
+				array(),
82
+				// file mask to use if parsing folder for files to add
83
+				'',
84
+				// what to use as identifier for collection entities
85
+				// using CLASS NAME prevents duplicates (works like a singleton)
86
+				CollectionDetails::ID_CLASS_NAME
87
+			)
88
+		);
89
+		return $loader->getCollection();
90
+	}
91 91
 }
92 92
 // End of file PrivacyPolicyManager.php
93 93
 // Location: EventEspresso\core\domain\services\admin/PrivacyPolicyManager.php
Please login to merge, or discard this patch.
core/admin/EE_Admin.core.php 2 patches
Indentation   +958 added lines, -958 removed lines patch added patch discarded remove patch
@@ -20,487 +20,487 @@  discard block
 block discarded – undo
20 20
 final class EE_Admin implements InterminableInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @var EE_Admin $_instance
25
-     */
26
-    private static $_instance;
27
-
28
-    /**
29
-     * @var PersistentAdminNoticeManager $persistent_admin_notice_manager
30
-     */
31
-    private $persistent_admin_notice_manager;
32
-
33
-    /**
34
-     * @var LoaderInterface
35
-     */
36
-    protected $loader;
37
-
38
-    /**
39
-     * @singleton method used to instantiate class object
40
-     * @return EE_Admin
41
-     * @throws EE_Error
42
-     */
43
-    public static function instance()
44
-    {
45
-        // check if class object is instantiated
46
-        if (! self::$_instance instanceof EE_Admin) {
47
-            self::$_instance = new self();
48
-        }
49
-        return self::$_instance;
50
-    }
51
-
52
-
53
-    /**
54
-     * @return EE_Admin
55
-     * @throws EE_Error
56
-     */
57
-    public static function reset()
58
-    {
59
-        self::$_instance = null;
60
-        return self::instance();
61
-    }
62
-
63
-
64
-    /**
65
-     * class constructor
66
-     *
67
-     * @throws EE_Error
68
-     * @throws InvalidDataTypeException
69
-     * @throws InvalidInterfaceException
70
-     * @throws InvalidArgumentException
71
-     */
72
-    protected function __construct()
73
-    {
74
-        // define global EE_Admin constants
75
-        $this->_define_all_constants();
76
-        // set autoloaders for our admin page classes based on included path information
77
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_ADMIN);
78
-        // admin hooks
79
-        add_filter('plugin_action_links', array($this, 'filter_plugin_actions'), 10, 2);
80
-        // load EE_Request_Handler early
81
-        add_action('AHEE__EE_System__core_loaded_and_ready', array($this, 'get_request'));
82
-        add_action('AHEE__EE_System__initialize_last', array($this, 'init'));
83
-        add_action('AHEE__EE_Admin_Page__route_admin_request', array($this, 'route_admin_request'), 100, 2);
84
-        add_action('wp_loaded', array($this, 'wp_loaded'), 100);
85
-        add_action('admin_init', array($this, 'admin_init'), 100);
86
-        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'), 20);
87
-        add_action('admin_notices', array($this, 'display_admin_notices'), 10);
88
-        add_action('network_admin_notices', array($this, 'display_admin_notices'), 10);
89
-        add_filter('pre_update_option', array($this, 'check_for_invalid_datetime_formats'), 100, 2);
90
-        add_filter('admin_footer_text', array($this, 'espresso_admin_footer'));
91
-        add_action('load-plugins.php', array($this, 'hookIntoWpPluginsPage'));
92
-        // reset Environment config (we only do this on admin page loads);
93
-        EE_Registry::instance()->CFG->environment->recheck_values();
94
-        do_action('AHEE__EE_Admin__loaded');
95
-    }
96
-
97
-
98
-    /**
99
-     * _define_all_constants
100
-     * define constants that are set globally for all admin pages
101
-     *
102
-     * @return void
103
-     */
104
-    private function _define_all_constants()
105
-    {
106
-        if (! defined('EE_ADMIN_URL')) {
107
-            define('EE_ADMIN_URL', EE_PLUGIN_DIR_URL . 'core/admin/');
108
-            define('EE_ADMIN_PAGES_URL', EE_PLUGIN_DIR_URL . 'admin_pages/');
109
-            define('EE_ADMIN_TEMPLATE', EE_ADMIN . 'templates' . DS);
110
-            define('WP_ADMIN_PATH', ABSPATH . 'wp-admin/');
111
-            define('WP_AJAX_URL', admin_url('admin-ajax.php'));
112
-        }
113
-    }
114
-
115
-
116
-    /**
117
-     * filter_plugin_actions - adds links to the Plugins page listing
118
-     *
119
-     * @param    array  $links
120
-     * @param    string $plugin
121
-     * @return    array
122
-     */
123
-    public function filter_plugin_actions($links, $plugin)
124
-    {
125
-        // set $main_file in stone
126
-        static $main_file;
127
-        // if $main_file is not set yet
128
-        if (! $main_file) {
129
-            $main_file = plugin_basename(EVENT_ESPRESSO_MAIN_FILE);
130
-        }
131
-        if ($plugin === $main_file) {
132
-            // compare current plugin to this one
133
-            if (EE_Maintenance_Mode::instance()->level() === EE_Maintenance_Mode::level_2_complete_maintenance) {
134
-                $maintenance_link = '<a href="admin.php?page=espresso_maintenance_settings"'
135
-                                    . ' title="Event Espresso is in maintenance mode.  Click this link to learn why.">'
136
-                                    . esc_html__('Maintenance Mode Active', 'event_espresso')
137
-                                    . '</a>';
138
-                array_unshift($links, $maintenance_link);
139
-            } else {
140
-                $org_settings_link = '<a href="admin.php?page=espresso_general_settings">'
141
-                                     . esc_html__('Settings', 'event_espresso')
142
-                                     . '</a>';
143
-                $events_link = '<a href="admin.php?page=espresso_events">'
144
-                               . esc_html__('Events', 'event_espresso')
145
-                               . '</a>';
146
-                // add before other links
147
-                array_unshift($links, $org_settings_link, $events_link);
148
-            }
149
-        }
150
-        return $links;
151
-    }
152
-
153
-
154
-    /**
155
-     * _get_request
156
-     *
157
-     * @return void
158
-     * @throws EE_Error
159
-     * @throws InvalidArgumentException
160
-     * @throws InvalidDataTypeException
161
-     * @throws InvalidInterfaceException
162
-     * @throws ReflectionException
163
-     */
164
-    public function get_request()
165
-    {
166
-        EE_Registry::instance()->load_core('Request_Handler');
167
-        EE_Registry::instance()->load_core('CPT_Strategy');
168
-    }
169
-
170
-
171
-    /**
172
-     * hide_admin_pages_except_maintenance_mode
173
-     *
174
-     * @param array $admin_page_folder_names
175
-     * @return array
176
-     */
177
-    public function hide_admin_pages_except_maintenance_mode($admin_page_folder_names = array())
178
-    {
179
-        return array(
180
-            'maintenance' => EE_ADMIN_PAGES . 'maintenance' . DS,
181
-            'about'       => EE_ADMIN_PAGES . 'about' . DS,
182
-            'support'     => EE_ADMIN_PAGES . 'support' . DS,
183
-        );
184
-    }
185
-
186
-
187
-    /**
188
-     * init- should fire after shortcode, module,  addon, other plugin (default priority), and even
189
-     * EE_Front_Controller's init phases have run
190
-     *
191
-     * @return void
192
-     * @throws EE_Error
193
-     * @throws InvalidArgumentException
194
-     * @throws InvalidDataTypeException
195
-     * @throws InvalidInterfaceException
196
-     * @throws ReflectionException
197
-     * @throws ServiceNotFoundException
198
-     */
199
-    public function init()
200
-    {
201
-        // only enable most of the EE_Admin IF we're not in full maintenance mode
202
-        if (EE_Maintenance_Mode::instance()->models_can_query()) {
203
-            $this->initModelsReady();
204
-        }
205
-        // run the admin page factory but ONLY if we are doing an ee admin ajax request
206
-        if (! defined('DOING_AJAX') || EE_ADMIN_AJAX) {
207
-            try {
208
-                // this loads the controller for the admin pages which will setup routing etc
209
-                EE_Registry::instance()->load_core('Admin_Page_Loader');
210
-            } catch (EE_Error $e) {
211
-                $e->get_error();
212
-            }
213
-        }
214
-        add_filter('content_save_pre', array($this, 'its_eSpresso'), 10, 1);
215
-        // make sure our CPTs and custom taxonomy metaboxes get shown for first time users
216
-        add_action('admin_head', array($this, 'enable_hidden_ee_nav_menu_metaboxes'), 10);
217
-        add_action('admin_head', array($this, 'register_custom_nav_menu_boxes'), 10);
218
-        // exclude EE critical pages from all nav menus and wp_list_pages
219
-        add_filter('nav_menu_meta_box_object', array($this, 'remove_pages_from_nav_menu'), 10);
220
-    }
221
-
222
-
223
-    /**
224
-     * Gets the loader (and if it wasn't previously set, sets it)
225
-     * @return LoaderInterface
226
-     * @throws InvalidArgumentException
227
-     * @throws InvalidDataTypeException
228
-     * @throws InvalidInterfaceException
229
-     */
230
-    protected function getLoader()
231
-    {
232
-        if (! $this->loader instanceof LoaderInterface) {
233
-            $this->loader = LoaderFactory::getLoader();
234
-        }
235
-        return $this->loader;
236
-    }
237
-
238
-
239
-    /**
240
-     * Method that's fired on admin requests (including admin ajax) but only when the models are usable
241
-     * (ie, the site isn't in maintenance mode)
242
-     * @since $VID:$
243
-     * @return void
244
-     */
245
-    protected function initModelsReady()
246
-    {
247
-        // ok so we want to enable the entire admin
248
-        $this->persistent_admin_notice_manager = $this->getLoader()->getShared(
249
-            'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
250
-        );
251
-        $this->persistent_admin_notice_manager->setReturnUrl(
252
-            EE_Admin_Page::add_query_args_and_nonce(
253
-                array(
254
-                    'page'   => EE_Registry::instance()->REQ->get('page', ''),
255
-                    'action' => EE_Registry::instance()->REQ->get('action', ''),
256
-                ),
257
-                EE_ADMIN_URL
258
-            )
259
-        );
260
-        $this->maybeSetDatetimeWarningNotice();
261
-        // at a glance dashboard widget
262
-        add_filter('dashboard_glance_items', array($this, 'dashboard_glance_items'), 10);
263
-        // filter for get_edit_post_link used on comments for custom post types
264
-        add_filter('get_edit_post_link', array($this, 'modify_edit_post_link'), 10, 2);
265
-    }
266
-
267
-
268
-    /**
269
-     *    get_persistent_admin_notices
270
-     *
271
-     * @access    public
272
-     * @return void
273
-     * @throws EE_Error
274
-     * @throws InvalidArgumentException
275
-     * @throws InvalidDataTypeException
276
-     * @throws InvalidInterfaceException
277
-     */
278
-    public function maybeSetDatetimeWarningNotice()
279
-    {
280
-        // add dismissable notice for datetime changes.  Only valid if site does not have a timezone_string set.
281
-        // @todo This needs to stay in core for a bit to catch anyone upgrading from a version without this to a version
282
-        // with this.  But after enough time (indeterminate at this point) we can just remove this notice.
283
-        // this was added with https://events.codebasehq.com/projects/event-espresso/tickets/10626
284
-        if (apply_filters('FHEE__EE_Admin__maybeSetDatetimeWarningNotice', true)
285
-            && ! get_option('timezone_string')
286
-            && EEM_Event::instance()->count() > 0
287
-        ) {
288
-            new PersistentAdminNotice(
289
-                'datetime_fix_notice',
290
-                sprintf(
291
-                    esc_html__(
292
-                        '%1$sImportant announcement related to your install of Event Espresso%2$s: There are some changes made to your site that could affect how dates display for your events and other related items with dates and times.  Read more about it %3$shere%4$s. If your dates and times are displaying incorrectly (incorrect offset), you can fix it using the tool on %5$sthis page%4$s.',
293
-                        'event_espresso'
294
-                    ),
295
-                    '<strong>',
296
-                    '</strong>',
297
-                    '<a href="https://eventespresso.com/2017/08/important-upcoming-changes-dates-times">',
298
-                    '</a>',
299
-                    '<a href="' . EE_Admin_Page::add_query_args_and_nonce(
300
-                        array(
301
-                            'page'   => 'espresso_maintenance_settings',
302
-                            'action' => 'datetime_tools',
303
-                        ),
304
-                        admin_url('admin.php')
305
-                    ) . '">'
306
-                ),
307
-                false,
308
-                'manage_options',
309
-                'datetime_fix_persistent_notice'
310
-            );
311
-        }
312
-    }
313
-
314
-
315
-    /**
316
-     * this simply hooks into the nav menu setup of pages metabox and makes sure that we remove EE critical pages from
317
-     * the list of options. the wp function "wp_nav_menu_item_post_type_meta_box" found in
318
-     * wp-admin/includes/nav-menu.php looks for the "_default_query" property on the post_type object and it uses that
319
-     * to override any queries found in the existing query for the given post type.  Note that _default_query is not a
320
-     * normal property on the post_type object.  It's found ONLY in this particular context.
321
-     *
322
-     * @param WP_Post $post_type WP post type object
323
-     * @return WP_Post
324
-     * @throws InvalidArgumentException
325
-     * @throws InvalidDataTypeException
326
-     * @throws InvalidInterfaceException
327
-     */
328
-    public function remove_pages_from_nav_menu($post_type)
329
-    {
330
-        // if this isn't the "pages" post type let's get out
331
-        if ($post_type->name !== 'page') {
332
-            return $post_type;
333
-        }
334
-        $critical_pages = EE_Registry::instance()->CFG->core->get_critical_pages_array();
335
-        $post_type->_default_query = array(
336
-            'post__not_in' => $critical_pages,
337
-        );
338
-        return $post_type;
339
-    }
340
-
341
-
342
-    /**
343
-     * WP by default only shows three metaboxes in "nav-menus.php" for first times users.  We want to make sure our
344
-     * metaboxes get shown as well
345
-     *
346
-     * @return void
347
-     */
348
-    public function enable_hidden_ee_nav_menu_metaboxes()
349
-    {
350
-        global $wp_meta_boxes, $pagenow;
351
-        if (! is_array($wp_meta_boxes) || $pagenow !== 'nav-menus.php') {
352
-            return;
353
-        }
354
-        $user = wp_get_current_user();
355
-        // has this been done yet?
356
-        if (get_user_option('ee_nav_menu_initialized', $user->ID)) {
357
-            return;
358
-        }
359
-
360
-        $hidden_meta_boxes = get_user_option('metaboxhidden_nav-menus', $user->ID);
361
-        $initial_meta_boxes = apply_filters(
362
-            'FHEE__EE_Admin__enable_hidden_ee_nav_menu_boxes__initial_meta_boxes',
363
-            array(
364
-                'nav-menu-theme-locations',
365
-                'add-page',
366
-                'add-custom-links',
367
-                'add-category',
368
-                'add-espresso_events',
369
-                'add-espresso_venues',
370
-                'add-espresso_event_categories',
371
-                'add-espresso_venue_categories',
372
-                'add-post-type-post',
373
-                'add-post-type-page',
374
-            )
375
-        );
376
-
377
-        if (is_array($hidden_meta_boxes)) {
378
-            foreach ($hidden_meta_boxes as $key => $meta_box_id) {
379
-                if (in_array($meta_box_id, $initial_meta_boxes, true)) {
380
-                    unset($hidden_meta_boxes[ $key ]);
381
-                }
382
-            }
383
-        }
384
-        update_user_option($user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true);
385
-        update_user_option($user->ID, 'ee_nav_menu_initialized', 1, true);
386
-    }
387
-
388
-
389
-    /**
390
-     * This method simply registers custom nav menu boxes for "nav_menus.php route"
391
-     * Currently EE is using this to make sure there are menu options for our CPT archive page routes.
392
-     *
393
-     * @todo   modify this so its more dynamic and automatic for all ee CPTs and setups and can also be hooked into by
394
-     *         addons etc.
395
-     * @return void
396
-     */
397
-    public function register_custom_nav_menu_boxes()
398
-    {
399
-        add_meta_box(
400
-            'add-extra-nav-menu-pages',
401
-            esc_html__('Event Espresso Pages', 'event_espresso'),
402
-            array($this, 'ee_cpt_archive_pages'),
403
-            'nav-menus',
404
-            'side',
405
-            'core'
406
-        );
407
-    }
408
-
409
-
410
-    /**
411
-     * Use this to edit the post link for our cpts so that the edit link points to the correct page.
412
-     *
413
-     * @since   4.3.0
414
-     * @param string $link the original link generated by wp
415
-     * @param int    $id   post id
416
-     * @return string  the (maybe) modified link
417
-     */
418
-    public function modify_edit_post_link($link, $id)
419
-    {
420
-        if (! $post = get_post($id)) {
421
-            return $link;
422
-        }
423
-        if ($post->post_type === 'espresso_attendees') {
424
-            $query_args = array(
425
-                'action' => 'edit_attendee',
426
-                'post'   => $id,
427
-            );
428
-            return EEH_URL::add_query_args_and_nonce(
429
-                $query_args,
430
-                admin_url('admin.php?page=espresso_registrations')
431
-            );
432
-        }
433
-        return $link;
434
-    }
435
-
436
-
437
-    public function ee_cpt_archive_pages()
438
-    {
439
-        global $nav_menu_selected_id;
440
-        $db_fields = false;
441
-        $walker = new Walker_Nav_Menu_Checklist($db_fields);
442
-        $current_tab = 'event-archives';
443
-        $removed_args = array(
444
-            'action',
445
-            'customlink-tab',
446
-            'edit-menu-item',
447
-            'menu-item',
448
-            'page-tab',
449
-            '_wpnonce',
450
-        );
451
-        ?>
23
+	/**
24
+	 * @var EE_Admin $_instance
25
+	 */
26
+	private static $_instance;
27
+
28
+	/**
29
+	 * @var PersistentAdminNoticeManager $persistent_admin_notice_manager
30
+	 */
31
+	private $persistent_admin_notice_manager;
32
+
33
+	/**
34
+	 * @var LoaderInterface
35
+	 */
36
+	protected $loader;
37
+
38
+	/**
39
+	 * @singleton method used to instantiate class object
40
+	 * @return EE_Admin
41
+	 * @throws EE_Error
42
+	 */
43
+	public static function instance()
44
+	{
45
+		// check if class object is instantiated
46
+		if (! self::$_instance instanceof EE_Admin) {
47
+			self::$_instance = new self();
48
+		}
49
+		return self::$_instance;
50
+	}
51
+
52
+
53
+	/**
54
+	 * @return EE_Admin
55
+	 * @throws EE_Error
56
+	 */
57
+	public static function reset()
58
+	{
59
+		self::$_instance = null;
60
+		return self::instance();
61
+	}
62
+
63
+
64
+	/**
65
+	 * class constructor
66
+	 *
67
+	 * @throws EE_Error
68
+	 * @throws InvalidDataTypeException
69
+	 * @throws InvalidInterfaceException
70
+	 * @throws InvalidArgumentException
71
+	 */
72
+	protected function __construct()
73
+	{
74
+		// define global EE_Admin constants
75
+		$this->_define_all_constants();
76
+		// set autoloaders for our admin page classes based on included path information
77
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_ADMIN);
78
+		// admin hooks
79
+		add_filter('plugin_action_links', array($this, 'filter_plugin_actions'), 10, 2);
80
+		// load EE_Request_Handler early
81
+		add_action('AHEE__EE_System__core_loaded_and_ready', array($this, 'get_request'));
82
+		add_action('AHEE__EE_System__initialize_last', array($this, 'init'));
83
+		add_action('AHEE__EE_Admin_Page__route_admin_request', array($this, 'route_admin_request'), 100, 2);
84
+		add_action('wp_loaded', array($this, 'wp_loaded'), 100);
85
+		add_action('admin_init', array($this, 'admin_init'), 100);
86
+		add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'), 20);
87
+		add_action('admin_notices', array($this, 'display_admin_notices'), 10);
88
+		add_action('network_admin_notices', array($this, 'display_admin_notices'), 10);
89
+		add_filter('pre_update_option', array($this, 'check_for_invalid_datetime_formats'), 100, 2);
90
+		add_filter('admin_footer_text', array($this, 'espresso_admin_footer'));
91
+		add_action('load-plugins.php', array($this, 'hookIntoWpPluginsPage'));
92
+		// reset Environment config (we only do this on admin page loads);
93
+		EE_Registry::instance()->CFG->environment->recheck_values();
94
+		do_action('AHEE__EE_Admin__loaded');
95
+	}
96
+
97
+
98
+	/**
99
+	 * _define_all_constants
100
+	 * define constants that are set globally for all admin pages
101
+	 *
102
+	 * @return void
103
+	 */
104
+	private function _define_all_constants()
105
+	{
106
+		if (! defined('EE_ADMIN_URL')) {
107
+			define('EE_ADMIN_URL', EE_PLUGIN_DIR_URL . 'core/admin/');
108
+			define('EE_ADMIN_PAGES_URL', EE_PLUGIN_DIR_URL . 'admin_pages/');
109
+			define('EE_ADMIN_TEMPLATE', EE_ADMIN . 'templates' . DS);
110
+			define('WP_ADMIN_PATH', ABSPATH . 'wp-admin/');
111
+			define('WP_AJAX_URL', admin_url('admin-ajax.php'));
112
+		}
113
+	}
114
+
115
+
116
+	/**
117
+	 * filter_plugin_actions - adds links to the Plugins page listing
118
+	 *
119
+	 * @param    array  $links
120
+	 * @param    string $plugin
121
+	 * @return    array
122
+	 */
123
+	public function filter_plugin_actions($links, $plugin)
124
+	{
125
+		// set $main_file in stone
126
+		static $main_file;
127
+		// if $main_file is not set yet
128
+		if (! $main_file) {
129
+			$main_file = plugin_basename(EVENT_ESPRESSO_MAIN_FILE);
130
+		}
131
+		if ($plugin === $main_file) {
132
+			// compare current plugin to this one
133
+			if (EE_Maintenance_Mode::instance()->level() === EE_Maintenance_Mode::level_2_complete_maintenance) {
134
+				$maintenance_link = '<a href="admin.php?page=espresso_maintenance_settings"'
135
+									. ' title="Event Espresso is in maintenance mode.  Click this link to learn why.">'
136
+									. esc_html__('Maintenance Mode Active', 'event_espresso')
137
+									. '</a>';
138
+				array_unshift($links, $maintenance_link);
139
+			} else {
140
+				$org_settings_link = '<a href="admin.php?page=espresso_general_settings">'
141
+									 . esc_html__('Settings', 'event_espresso')
142
+									 . '</a>';
143
+				$events_link = '<a href="admin.php?page=espresso_events">'
144
+							   . esc_html__('Events', 'event_espresso')
145
+							   . '</a>';
146
+				// add before other links
147
+				array_unshift($links, $org_settings_link, $events_link);
148
+			}
149
+		}
150
+		return $links;
151
+	}
152
+
153
+
154
+	/**
155
+	 * _get_request
156
+	 *
157
+	 * @return void
158
+	 * @throws EE_Error
159
+	 * @throws InvalidArgumentException
160
+	 * @throws InvalidDataTypeException
161
+	 * @throws InvalidInterfaceException
162
+	 * @throws ReflectionException
163
+	 */
164
+	public function get_request()
165
+	{
166
+		EE_Registry::instance()->load_core('Request_Handler');
167
+		EE_Registry::instance()->load_core('CPT_Strategy');
168
+	}
169
+
170
+
171
+	/**
172
+	 * hide_admin_pages_except_maintenance_mode
173
+	 *
174
+	 * @param array $admin_page_folder_names
175
+	 * @return array
176
+	 */
177
+	public function hide_admin_pages_except_maintenance_mode($admin_page_folder_names = array())
178
+	{
179
+		return array(
180
+			'maintenance' => EE_ADMIN_PAGES . 'maintenance' . DS,
181
+			'about'       => EE_ADMIN_PAGES . 'about' . DS,
182
+			'support'     => EE_ADMIN_PAGES . 'support' . DS,
183
+		);
184
+	}
185
+
186
+
187
+	/**
188
+	 * init- should fire after shortcode, module,  addon, other plugin (default priority), and even
189
+	 * EE_Front_Controller's init phases have run
190
+	 *
191
+	 * @return void
192
+	 * @throws EE_Error
193
+	 * @throws InvalidArgumentException
194
+	 * @throws InvalidDataTypeException
195
+	 * @throws InvalidInterfaceException
196
+	 * @throws ReflectionException
197
+	 * @throws ServiceNotFoundException
198
+	 */
199
+	public function init()
200
+	{
201
+		// only enable most of the EE_Admin IF we're not in full maintenance mode
202
+		if (EE_Maintenance_Mode::instance()->models_can_query()) {
203
+			$this->initModelsReady();
204
+		}
205
+		// run the admin page factory but ONLY if we are doing an ee admin ajax request
206
+		if (! defined('DOING_AJAX') || EE_ADMIN_AJAX) {
207
+			try {
208
+				// this loads the controller for the admin pages which will setup routing etc
209
+				EE_Registry::instance()->load_core('Admin_Page_Loader');
210
+			} catch (EE_Error $e) {
211
+				$e->get_error();
212
+			}
213
+		}
214
+		add_filter('content_save_pre', array($this, 'its_eSpresso'), 10, 1);
215
+		// make sure our CPTs and custom taxonomy metaboxes get shown for first time users
216
+		add_action('admin_head', array($this, 'enable_hidden_ee_nav_menu_metaboxes'), 10);
217
+		add_action('admin_head', array($this, 'register_custom_nav_menu_boxes'), 10);
218
+		// exclude EE critical pages from all nav menus and wp_list_pages
219
+		add_filter('nav_menu_meta_box_object', array($this, 'remove_pages_from_nav_menu'), 10);
220
+	}
221
+
222
+
223
+	/**
224
+	 * Gets the loader (and if it wasn't previously set, sets it)
225
+	 * @return LoaderInterface
226
+	 * @throws InvalidArgumentException
227
+	 * @throws InvalidDataTypeException
228
+	 * @throws InvalidInterfaceException
229
+	 */
230
+	protected function getLoader()
231
+	{
232
+		if (! $this->loader instanceof LoaderInterface) {
233
+			$this->loader = LoaderFactory::getLoader();
234
+		}
235
+		return $this->loader;
236
+	}
237
+
238
+
239
+	/**
240
+	 * Method that's fired on admin requests (including admin ajax) but only when the models are usable
241
+	 * (ie, the site isn't in maintenance mode)
242
+	 * @since $VID:$
243
+	 * @return void
244
+	 */
245
+	protected function initModelsReady()
246
+	{
247
+		// ok so we want to enable the entire admin
248
+		$this->persistent_admin_notice_manager = $this->getLoader()->getShared(
249
+			'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
250
+		);
251
+		$this->persistent_admin_notice_manager->setReturnUrl(
252
+			EE_Admin_Page::add_query_args_and_nonce(
253
+				array(
254
+					'page'   => EE_Registry::instance()->REQ->get('page', ''),
255
+					'action' => EE_Registry::instance()->REQ->get('action', ''),
256
+				),
257
+				EE_ADMIN_URL
258
+			)
259
+		);
260
+		$this->maybeSetDatetimeWarningNotice();
261
+		// at a glance dashboard widget
262
+		add_filter('dashboard_glance_items', array($this, 'dashboard_glance_items'), 10);
263
+		// filter for get_edit_post_link used on comments for custom post types
264
+		add_filter('get_edit_post_link', array($this, 'modify_edit_post_link'), 10, 2);
265
+	}
266
+
267
+
268
+	/**
269
+	 *    get_persistent_admin_notices
270
+	 *
271
+	 * @access    public
272
+	 * @return void
273
+	 * @throws EE_Error
274
+	 * @throws InvalidArgumentException
275
+	 * @throws InvalidDataTypeException
276
+	 * @throws InvalidInterfaceException
277
+	 */
278
+	public function maybeSetDatetimeWarningNotice()
279
+	{
280
+		// add dismissable notice for datetime changes.  Only valid if site does not have a timezone_string set.
281
+		// @todo This needs to stay in core for a bit to catch anyone upgrading from a version without this to a version
282
+		// with this.  But after enough time (indeterminate at this point) we can just remove this notice.
283
+		// this was added with https://events.codebasehq.com/projects/event-espresso/tickets/10626
284
+		if (apply_filters('FHEE__EE_Admin__maybeSetDatetimeWarningNotice', true)
285
+			&& ! get_option('timezone_string')
286
+			&& EEM_Event::instance()->count() > 0
287
+		) {
288
+			new PersistentAdminNotice(
289
+				'datetime_fix_notice',
290
+				sprintf(
291
+					esc_html__(
292
+						'%1$sImportant announcement related to your install of Event Espresso%2$s: There are some changes made to your site that could affect how dates display for your events and other related items with dates and times.  Read more about it %3$shere%4$s. If your dates and times are displaying incorrectly (incorrect offset), you can fix it using the tool on %5$sthis page%4$s.',
293
+						'event_espresso'
294
+					),
295
+					'<strong>',
296
+					'</strong>',
297
+					'<a href="https://eventespresso.com/2017/08/important-upcoming-changes-dates-times">',
298
+					'</a>',
299
+					'<a href="' . EE_Admin_Page::add_query_args_and_nonce(
300
+						array(
301
+							'page'   => 'espresso_maintenance_settings',
302
+							'action' => 'datetime_tools',
303
+						),
304
+						admin_url('admin.php')
305
+					) . '">'
306
+				),
307
+				false,
308
+				'manage_options',
309
+				'datetime_fix_persistent_notice'
310
+			);
311
+		}
312
+	}
313
+
314
+
315
+	/**
316
+	 * this simply hooks into the nav menu setup of pages metabox and makes sure that we remove EE critical pages from
317
+	 * the list of options. the wp function "wp_nav_menu_item_post_type_meta_box" found in
318
+	 * wp-admin/includes/nav-menu.php looks for the "_default_query" property on the post_type object and it uses that
319
+	 * to override any queries found in the existing query for the given post type.  Note that _default_query is not a
320
+	 * normal property on the post_type object.  It's found ONLY in this particular context.
321
+	 *
322
+	 * @param WP_Post $post_type WP post type object
323
+	 * @return WP_Post
324
+	 * @throws InvalidArgumentException
325
+	 * @throws InvalidDataTypeException
326
+	 * @throws InvalidInterfaceException
327
+	 */
328
+	public function remove_pages_from_nav_menu($post_type)
329
+	{
330
+		// if this isn't the "pages" post type let's get out
331
+		if ($post_type->name !== 'page') {
332
+			return $post_type;
333
+		}
334
+		$critical_pages = EE_Registry::instance()->CFG->core->get_critical_pages_array();
335
+		$post_type->_default_query = array(
336
+			'post__not_in' => $critical_pages,
337
+		);
338
+		return $post_type;
339
+	}
340
+
341
+
342
+	/**
343
+	 * WP by default only shows three metaboxes in "nav-menus.php" for first times users.  We want to make sure our
344
+	 * metaboxes get shown as well
345
+	 *
346
+	 * @return void
347
+	 */
348
+	public function enable_hidden_ee_nav_menu_metaboxes()
349
+	{
350
+		global $wp_meta_boxes, $pagenow;
351
+		if (! is_array($wp_meta_boxes) || $pagenow !== 'nav-menus.php') {
352
+			return;
353
+		}
354
+		$user = wp_get_current_user();
355
+		// has this been done yet?
356
+		if (get_user_option('ee_nav_menu_initialized', $user->ID)) {
357
+			return;
358
+		}
359
+
360
+		$hidden_meta_boxes = get_user_option('metaboxhidden_nav-menus', $user->ID);
361
+		$initial_meta_boxes = apply_filters(
362
+			'FHEE__EE_Admin__enable_hidden_ee_nav_menu_boxes__initial_meta_boxes',
363
+			array(
364
+				'nav-menu-theme-locations',
365
+				'add-page',
366
+				'add-custom-links',
367
+				'add-category',
368
+				'add-espresso_events',
369
+				'add-espresso_venues',
370
+				'add-espresso_event_categories',
371
+				'add-espresso_venue_categories',
372
+				'add-post-type-post',
373
+				'add-post-type-page',
374
+			)
375
+		);
376
+
377
+		if (is_array($hidden_meta_boxes)) {
378
+			foreach ($hidden_meta_boxes as $key => $meta_box_id) {
379
+				if (in_array($meta_box_id, $initial_meta_boxes, true)) {
380
+					unset($hidden_meta_boxes[ $key ]);
381
+				}
382
+			}
383
+		}
384
+		update_user_option($user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true);
385
+		update_user_option($user->ID, 'ee_nav_menu_initialized', 1, true);
386
+	}
387
+
388
+
389
+	/**
390
+	 * This method simply registers custom nav menu boxes for "nav_menus.php route"
391
+	 * Currently EE is using this to make sure there are menu options for our CPT archive page routes.
392
+	 *
393
+	 * @todo   modify this so its more dynamic and automatic for all ee CPTs and setups and can also be hooked into by
394
+	 *         addons etc.
395
+	 * @return void
396
+	 */
397
+	public function register_custom_nav_menu_boxes()
398
+	{
399
+		add_meta_box(
400
+			'add-extra-nav-menu-pages',
401
+			esc_html__('Event Espresso Pages', 'event_espresso'),
402
+			array($this, 'ee_cpt_archive_pages'),
403
+			'nav-menus',
404
+			'side',
405
+			'core'
406
+		);
407
+	}
408
+
409
+
410
+	/**
411
+	 * Use this to edit the post link for our cpts so that the edit link points to the correct page.
412
+	 *
413
+	 * @since   4.3.0
414
+	 * @param string $link the original link generated by wp
415
+	 * @param int    $id   post id
416
+	 * @return string  the (maybe) modified link
417
+	 */
418
+	public function modify_edit_post_link($link, $id)
419
+	{
420
+		if (! $post = get_post($id)) {
421
+			return $link;
422
+		}
423
+		if ($post->post_type === 'espresso_attendees') {
424
+			$query_args = array(
425
+				'action' => 'edit_attendee',
426
+				'post'   => $id,
427
+			);
428
+			return EEH_URL::add_query_args_and_nonce(
429
+				$query_args,
430
+				admin_url('admin.php?page=espresso_registrations')
431
+			);
432
+		}
433
+		return $link;
434
+	}
435
+
436
+
437
+	public function ee_cpt_archive_pages()
438
+	{
439
+		global $nav_menu_selected_id;
440
+		$db_fields = false;
441
+		$walker = new Walker_Nav_Menu_Checklist($db_fields);
442
+		$current_tab = 'event-archives';
443
+		$removed_args = array(
444
+			'action',
445
+			'customlink-tab',
446
+			'edit-menu-item',
447
+			'menu-item',
448
+			'page-tab',
449
+			'_wpnonce',
450
+		);
451
+		?>
452 452
         <div id="posttype-extra-nav-menu-pages" class="posttypediv">
453 453
             <ul id="posttype-extra-nav-menu-pages-tabs" class="posttype-tabs add-menu-item-tabs">
454 454
                 <li <?php echo('event-archives' === $current_tab ? ' class="tabs"' : ''); ?>>
455 455
                     <a class="nav-tab-link" data-type="tabs-panel-posttype-extra-nav-menu-pages-event-archives"
456 456
                        href="<?php
457
-                        if ($nav_menu_selected_id) {
458
-                            echo esc_url(
459
-                                add_query_arg(
460
-                                    'extra-nav-menu-pages-tab',
461
-                                    'event-archives',
462
-                                    remove_query_arg($removed_args)
463
-                                )
464
-                            );
465
-                        }
466
-                        ?>#tabs-panel-posttype-extra-nav-menu-pages-event-archives">
457
+						if ($nav_menu_selected_id) {
458
+							echo esc_url(
459
+								add_query_arg(
460
+									'extra-nav-menu-pages-tab',
461
+									'event-archives',
462
+									remove_query_arg($removed_args)
463
+								)
464
+							);
465
+						}
466
+						?>#tabs-panel-posttype-extra-nav-menu-pages-event-archives">
467 467
                         <?php _e('Event Archive Pages', 'event_espresso'); ?>
468 468
                     </a>
469 469
                 </li>
470 470
             </ul><!-- .posttype-tabs -->
471 471
 
472 472
             <div id="tabs-panel-posttype-extra-nav-menu-pages-event-archives" class="tabs-panel <?php
473
-            echo('event-archives' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive');
474
-            ?>">
473
+			echo('event-archives' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive');
474
+			?>">
475 475
                 <ul id="extra-nav-menu-pageschecklist-event-archives" class="categorychecklist form-no-clear">
476 476
                     <?php
477
-                    $pages = $this->_get_extra_nav_menu_pages_items();
478
-                    $args['walker'] = $walker;
479
-                    echo walk_nav_menu_tree(
480
-                        array_map(
481
-                            array($this, '_setup_extra_nav_menu_pages_items'),
482
-                            $pages
483
-                        ),
484
-                        0,
485
-                        (object) $args
486
-                    );
487
-                    ?>
477
+					$pages = $this->_get_extra_nav_menu_pages_items();
478
+					$args['walker'] = $walker;
479
+					echo walk_nav_menu_tree(
480
+						array_map(
481
+							array($this, '_setup_extra_nav_menu_pages_items'),
482
+							$pages
483
+						),
484
+						0,
485
+						(object) $args
486
+					);
487
+					?>
488 488
                 </ul>
489 489
             </div><!-- /.tabs-panel -->
490 490
 
491 491
             <p class="button-controls">
492 492
                 <span class="list-controls">
493 493
                     <a href="<?php
494
-                             echo esc_url(
495
-                                 add_query_arg(
496
-                                     array(
497
-                                         'extra-nav-menu-pages-tab' => 'event-archives',
498
-                                         'selectall'                => 1,
499
-                                     ),
500
-                                     remove_query_arg($removed_args)
501
-                                 )
502
-                             );
503
-                        ?>#posttype-extra-nav-menu-pages>" class="select-all"><?php _e('Select All', 'event_espresso'); ?></a>
494
+							 echo esc_url(
495
+								 add_query_arg(
496
+									 array(
497
+										 'extra-nav-menu-pages-tab' => 'event-archives',
498
+										 'selectall'                => 1,
499
+									 ),
500
+									 remove_query_arg($removed_args)
501
+								 )
502
+							 );
503
+						?>#posttype-extra-nav-menu-pages>" class="select-all"><?php _e('Select All', 'event_espresso'); ?></a>
504 504
                 </span>
505 505
                 <span class="add-to-menu">
506 506
                     <input type="submit"<?php wp_nav_menu_disabled_check($nav_menu_selected_id); ?>
@@ -513,500 +513,500 @@  discard block
 block discarded – undo
513 513
 
514 514
         </div><!-- /.posttypediv -->
515 515
         <?php
516
-    }
517
-
518
-
519
-    /**
520
-     * Returns an array of event archive nav items.
521
-     *
522
-     * @todo  for now this method is just in place so when it gets abstracted further we can substitute in whatever
523
-     *        method we use for getting the extra nav menu items
524
-     * @return array
525
-     */
526
-    private function _get_extra_nav_menu_pages_items()
527
-    {
528
-        $menuitems[] = array(
529
-            'title'       => esc_html__('Event List', 'event_espresso'),
530
-            'url'         => get_post_type_archive_link('espresso_events'),
531
-            'description' => esc_html__('Archive page for all events.', 'event_espresso'),
532
-        );
533
-        return apply_filters('FHEE__EE_Admin__get_extra_nav_menu_pages_items', $menuitems);
534
-    }
535
-
536
-
537
-    /**
538
-     * Setup nav menu walker item for usage in the event archive nav menu metabox.  It receives a menu_item array with
539
-     * the properties and converts it to the menu item object.
540
-     *
541
-     * @see wp_setup_nav_menu_item() in wp-includes/nav-menu.php
542
-     * @param $menu_item_values
543
-     * @return stdClass
544
-     */
545
-    private function _setup_extra_nav_menu_pages_items($menu_item_values)
546
-    {
547
-        $menu_item = new stdClass();
548
-        $keys = array(
549
-            'ID'               => 0,
550
-            'db_id'            => 0,
551
-            'menu_item_parent' => 0,
552
-            'object_id'        => -1,
553
-            'post_parent'      => 0,
554
-            'type'             => 'custom',
555
-            'object'           => '',
556
-            'type_label'       => esc_html__('Extra Nav Menu Item', 'event_espresso'),
557
-            'title'            => '',
558
-            'url'              => '',
559
-            'target'           => '',
560
-            'attr_title'       => '',
561
-            'description'      => '',
562
-            'classes'          => array(),
563
-            'xfn'              => '',
564
-        );
565
-
566
-        foreach ($keys as $key => $value) {
567
-            $menu_item->{$key} = isset($menu_item_values[ $key ]) ? $menu_item_values[ $key ] : $value;
568
-        }
569
-        return $menu_item;
570
-    }
571
-
572
-
573
-    /**
574
-     * This is the action hook for the AHEE__EE_Admin_Page__route_admin_request hook that fires off right before an
575
-     * EE_Admin_Page route is called.
576
-     *
577
-     * @return void
578
-     */
579
-    public function route_admin_request()
580
-    {
581
-    }
582
-
583
-
584
-    /**
585
-     * wp_loaded should fire on the WordPress wp_loaded hook.  This fires on a VERY late priority.
586
-     *
587
-     * @return void
588
-     */
589
-    public function wp_loaded()
590
-    {
591
-    }
592
-
593
-
594
-    /**
595
-     * admin_init
596
-     *
597
-     * @return void
598
-     * @throws EE_Error
599
-     * @throws InvalidArgumentException
600
-     * @throws InvalidDataTypeException
601
-     * @throws InvalidInterfaceException
602
-     * @throws ReflectionException
603
-     */
604
-    public function admin_init()
605
-    {
606
-        /**
607
-         * our cpt models must be instantiated on WordPress post processing routes (wp-admin/post.php),
608
-         * so any hooking into core WP routes is taken care of.  So in this next few lines of code:
609
-         * - check if doing post processing.
610
-         * - check if doing post processing of one of EE CPTs
611
-         * - instantiate the corresponding EE CPT model for the post_type being processed.
612
-         */
613
-        if (isset($_POST['action'], $_POST['post_type']) && $_POST['action'] === 'editpost') {
614
-            /** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_types */
615
-            $custom_post_types = $this->getLoader()->getShared(
616
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
617
-            );
618
-            $custom_post_types->getCustomPostTypeModels($_POST['post_type']);
619
-        }
620
-
621
-
622
-        /**
623
-         * This code excludes EE critical pages anywhere `wp_dropdown_pages` is used to create a dropdown for selecting
624
-         * critical pages.  The only place critical pages need included in a generated dropdown is on the "Critical
625
-         * Pages" tab in the EE General Settings Admin page.
626
-         * This is for user-proofing.
627
-         */
628
-        add_filter('wp_dropdown_pages', array($this, 'modify_dropdown_pages'));
629
-        if (EE_Maintenance_Mode::instance()->models_can_query()) {
630
-            $this->adminInitModelsReady();
631
-        }
632
-    }
633
-
634
-
635
-    /**
636
-     * Runs on admin_init but only if models are usable (ie, we're not in maintenanc emode)
637
-     */
638
-    protected function adminInitModelsReady()
639
-    {
640
-        if (function_exists('wp_add_privacy_policy_content')) {
641
-            $this->getLoader()->getShared('EventEspresso\core\services\privacy\policy\PrivacyPolicyManager');
642
-        }
643
-    }
644
-
645
-
646
-    /**
647
-     * Callback for wp_dropdown_pages hook to remove ee critical pages from the dropdown selection.
648
-     *
649
-     * @param string $output Current output.
650
-     * @return string
651
-     * @throws InvalidArgumentException
652
-     * @throws InvalidDataTypeException
653
-     * @throws InvalidInterfaceException
654
-     */
655
-    public function modify_dropdown_pages($output)
656
-    {
657
-        // get critical pages
658
-        $critical_pages = EE_Registry::instance()->CFG->core->get_critical_pages_array();
659
-
660
-        // split current output by line break for easier parsing.
661
-        $split_output = explode("\n", $output);
662
-
663
-        // loop through to remove any critical pages from the array.
664
-        foreach ($critical_pages as $page_id) {
665
-            $needle = 'value="' . $page_id . '"';
666
-            foreach ($split_output as $key => $haystack) {
667
-                if (strpos($haystack, $needle) !== false) {
668
-                    unset($split_output[ $key ]);
669
-                }
670
-            }
671
-        }
672
-        // replace output with the new contents
673
-        return implode("\n", $split_output);
674
-    }
675
-
676
-
677
-    /**
678
-     * enqueue all admin scripts that need loaded for admin pages
679
-     *
680
-     * @return void
681
-     */
682
-    public function enqueue_admin_scripts()
683
-    {
684
-        // this javascript is loaded on every admin page to catch any injections ee needs to add to wp run js.
685
-        // Note: the intention of this script is to only do TARGETED injections.  I.E, only injecting on certain script
686
-        // calls.
687
-        wp_enqueue_script(
688
-            'ee-inject-wp',
689
-            EE_ADMIN_URL . 'assets/ee-cpt-wp-injects.js',
690
-            array('jquery'),
691
-            EVENT_ESPRESSO_VERSION,
692
-            true
693
-        );
694
-        // register cookie script for future dependencies
695
-        wp_register_script(
696
-            'jquery-cookie',
697
-            EE_THIRD_PARTY_URL . 'joyride/jquery.cookie.js',
698
-            array('jquery'),
699
-            '2.1',
700
-            true
701
-        );
702
-        // joyride is turned OFF by default, but prior to the admin_enqueue_scripts hook, can be turned back on again
703
-        // via: add_filter('FHEE_load_joyride', '__return_true' );
704
-        if (apply_filters('FHEE_load_joyride', false)) {
705
-            // joyride style
706
-            wp_register_style('joyride-css', EE_THIRD_PARTY_URL . 'joyride/joyride-2.1.css', array(), '2.1');
707
-            wp_register_style(
708
-                'ee-joyride-css',
709
-                EE_GLOBAL_ASSETS_URL . 'css/ee-joyride-styles.css',
710
-                array('joyride-css'),
711
-                EVENT_ESPRESSO_VERSION
712
-            );
713
-            wp_register_script(
714
-                'joyride-modernizr',
715
-                EE_THIRD_PARTY_URL . 'joyride/modernizr.mq.js',
716
-                array(),
717
-                '2.1',
718
-                true
719
-            );
720
-            // joyride JS
721
-            wp_register_script(
722
-                'jquery-joyride',
723
-                EE_THIRD_PARTY_URL . 'joyride/jquery.joyride-2.1.js',
724
-                array('jquery-cookie', 'joyride-modernizr'),
725
-                '2.1',
726
-                true
727
-            );
728
-            // wanna go for a joyride?
729
-            wp_enqueue_style('ee-joyride-css');
730
-            wp_enqueue_script('jquery-joyride');
731
-        }
732
-    }
733
-
734
-
735
-    /**
736
-     * display_admin_notices
737
-     *
738
-     * @return void
739
-     */
740
-    public function display_admin_notices()
741
-    {
742
-        echo EE_Error::get_notices();
743
-    }
744
-
745
-
746
-    /**
747
-     * @param array $elements
748
-     * @return array
749
-     * @throws EE_Error
750
-     * @throws InvalidArgumentException
751
-     * @throws InvalidDataTypeException
752
-     * @throws InvalidInterfaceException
753
-     */
754
-    public function dashboard_glance_items($elements)
755
-    {
756
-        $elements = is_array($elements) ? $elements : array($elements);
757
-        $events = EEM_Event::instance()->count();
758
-        $items['events']['url'] = EE_Admin_Page::add_query_args_and_nonce(
759
-            array('page' => 'espresso_events'),
760
-            admin_url('admin.php')
761
-        );
762
-        $items['events']['text'] = sprintf(_n('%s Event', '%s Events', $events, 'event_espresso'), number_format_i18n($events));
763
-        $items['events']['title'] = esc_html__('Click to view all Events', 'event_espresso');
764
-        $registrations = EEM_Registration::instance()->count(
765
-            array(
766
-                array(
767
-                    'STS_ID' => array('!=', EEM_Registration::status_id_incomplete),
768
-                ),
769
-            )
770
-        );
771
-        $items['registrations']['url'] = EE_Admin_Page::add_query_args_and_nonce(
772
-            array('page' => 'espresso_registrations'),
773
-            admin_url('admin.php')
774
-        );
775
-        $items['registrations']['text'] = sprintf(
776
-            _n('%s Registration', '%s Registrations', $registrations, 'event_espresso'),
777
-            number_format_i18n($registrations)
778
-        );
779
-        $items['registrations']['title'] = esc_html__('Click to view all registrations', 'event_espresso');
780
-
781
-        $items = (array) apply_filters('FHEE__EE_Admin__dashboard_glance_items__items', $items);
782
-
783
-        foreach ($items as $type => $item_properties) {
784
-            $elements[] = sprintf(
785
-                '<a class="ee-dashboard-link-' . $type . '" href="%s" title="%s">%s</a>',
786
-                $item_properties['url'],
787
-                $item_properties['title'],
788
-                $item_properties['text']
789
-            );
790
-        }
791
-        return $elements;
792
-    }
793
-
794
-
795
-    /**
796
-     * check_for_invalid_datetime_formats
797
-     * if an admin changes their date or time format settings on the WP General Settings admin page, verify that
798
-     * their selected format can be parsed by PHP
799
-     *
800
-     * @param    $value
801
-     * @param    $option
802
-     * @throws EE_Error
803
-     * @return    string
804
-     */
805
-    public function check_for_invalid_datetime_formats($value, $option)
806
-    {
807
-        // check for date_format or time_format
808
-        switch ($option) {
809
-            case 'date_format':
810
-                $date_time_format = $value . ' ' . get_option('time_format');
811
-                break;
812
-            case 'time_format':
813
-                $date_time_format = get_option('date_format') . ' ' . $value;
814
-                break;
815
-            default:
816
-                $date_time_format = false;
817
-        }
818
-        // do we have a date_time format to check ?
819
-        if ($date_time_format) {
820
-            $error_msg = EEH_DTT_Helper::validate_format_string($date_time_format);
821
-
822
-            if (is_array($error_msg)) {
823
-                $msg = '<p>'
824
-                       . sprintf(
825
-                           esc_html__(
826
-                               'The following date time "%s" ( %s ) is difficult to be properly parsed by PHP for the following reasons:',
827
-                               'event_espresso'
828
-                           ),
829
-                           date($date_time_format),
830
-                           $date_time_format
831
-                       )
832
-                       . '</p><p><ul>';
833
-
834
-
835
-                foreach ($error_msg as $error) {
836
-                    $msg .= '<li>' . $error . '</li>';
837
-                }
838
-
839
-                $msg .= '</ul></p><p>'
840
-                        . sprintf(
841
-                            esc_html__(
842
-                                '%sPlease note that your date and time formats have been reset to "F j, Y" and "g:i a" respectively.%s',
843
-                                'event_espresso'
844
-                            ),
845
-                            '<span style="color:#D54E21;">',
846
-                            '</span>'
847
-                        )
848
-                        . '</p>';
849
-
850
-                // trigger WP settings error
851
-                add_settings_error(
852
-                    'date_format',
853
-                    'date_format',
854
-                    $msg
855
-                );
856
-
857
-                // set format to something valid
858
-                switch ($option) {
859
-                    case 'date_format':
860
-                        $value = 'F j, Y';
861
-                        break;
862
-                    case 'time_format':
863
-                        $value = 'g:i a';
864
-                        break;
865
-                }
866
-            }
867
-        }
868
-        return $value;
869
-    }
870
-
871
-
872
-    /**
873
-     * its_eSpresso - converts the less commonly used spelling of "Expresso" to "Espresso"
874
-     *
875
-     * @param $content
876
-     * @return    string
877
-     */
878
-    public function its_eSpresso($content)
879
-    {
880
-        return str_replace('[EXPRESSO_', '[ESPRESSO_', $content);
881
-    }
882
-
883
-
884
-    /**
885
-     * espresso_admin_footer
886
-     *
887
-     * @return    string
888
-     */
889
-    public function espresso_admin_footer()
890
-    {
891
-        return \EEH_Template::powered_by_event_espresso('aln-cntr', '', array('utm_content' => 'admin_footer'));
892
-    }
893
-
894
-
895
-    /**
896
-     * static method for registering ee admin page.
897
-     * This method is deprecated in favor of the new location in EE_Register_Admin_Page::register.
898
-     *
899
-     * @since      4.3.0
900
-     * @deprecated 4.3.0    Use EE_Register_Admin_Page::register() instead
901
-     * @see        EE_Register_Admin_Page::register()
902
-     * @param       $page_basename
903
-     * @param       $page_path
904
-     * @param array $config
905
-     * @return void
906
-     * @throws EE_Error
907
-     */
908
-    public static function register_ee_admin_page($page_basename, $page_path, $config = array())
909
-    {
910
-        EE_Error::doing_it_wrong(
911
-            __METHOD__,
912
-            sprintf(
913
-                esc_html__(
914
-                    'Usage is deprecated.  Use EE_Register_Admin_Page::register() for registering the %s admin page.',
915
-                    'event_espresso'
916
-                ),
917
-                $page_basename
918
-            ),
919
-            '4.3'
920
-        );
921
-        if (class_exists('EE_Register_Admin_Page')) {
922
-            $config['page_path'] = $page_path;
923
-        }
924
-        EE_Register_Admin_Page::register($page_basename, $config);
925
-    }
926
-
927
-
928
-    /**
929
-     * @deprecated 4.8.41
930
-     * @param  int      $post_ID
931
-     * @param  \WP_Post $post
932
-     * @return void
933
-     */
934
-    public static function parse_post_content_on_save($post_ID, $post)
935
-    {
936
-        EE_Error::doing_it_wrong(
937
-            __METHOD__,
938
-            esc_html__('Usage is deprecated', 'event_espresso'),
939
-            '4.8.41'
940
-        );
941
-    }
942
-
943
-
944
-    /**
945
-     * @deprecated 4.8.41
946
-     * @param  $option
947
-     * @param  $old_value
948
-     * @param  $value
949
-     * @return void
950
-     */
951
-    public function reset_page_for_posts_on_change($option, $old_value, $value)
952
-    {
953
-        EE_Error::doing_it_wrong(
954
-            __METHOD__,
955
-            esc_html__('Usage is deprecated', 'event_espresso'),
956
-            '4.8.41'
957
-        );
958
-    }
959
-
960
-
961
-    /**
962
-     * @deprecated 4.9.27
963
-     * @return void
964
-     */
965
-    public function get_persistent_admin_notices()
966
-    {
967
-        EE_Error::doing_it_wrong(
968
-            __METHOD__,
969
-            sprintf(
970
-                __('Usage is deprecated. Use "%1$s" instead.', 'event_espresso'),
971
-                '\EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
972
-            ),
973
-            '4.9.27'
974
-        );
975
-    }
976
-
977
-
978
-    /**
979
-     * @deprecated 4.9.27
980
-     * @throws InvalidInterfaceException
981
-     * @throws InvalidDataTypeException
982
-     * @throws DomainException
983
-     */
984
-    public function dismiss_ee_nag_notice_callback()
985
-    {
986
-        EE_Error::doing_it_wrong(
987
-            __METHOD__,
988
-            sprintf(
989
-                __('Usage is deprecated. Use "%1$s" instead.', 'event_espresso'),
990
-                '\EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
991
-            ),
992
-            '4.9.27'
993
-        );
994
-        $this->persistent_admin_notice_manager->dismissNotice();
995
-    }
996
-
997
-
998
-    /**
999
-     * Callback on load-plugins.php hook for setting up anything hooking into the wp plugins page.
1000
-     *
1001
-     * @throws InvalidArgumentException
1002
-     * @throws InvalidDataTypeException
1003
-     * @throws InvalidInterfaceException
1004
-     */
1005
-    public function hookIntoWpPluginsPage()
1006
-    {
1007
-        $this->getLoader()->getShared('EventEspresso\core\domain\services\admin\ExitModal');
1008
-        $this->getLoader()
1009
-                     ->getShared('EventEspresso\core\domain\services\admin\PluginUpsells')
1010
-                     ->decafUpsells();
1011
-    }
516
+	}
517
+
518
+
519
+	/**
520
+	 * Returns an array of event archive nav items.
521
+	 *
522
+	 * @todo  for now this method is just in place so when it gets abstracted further we can substitute in whatever
523
+	 *        method we use for getting the extra nav menu items
524
+	 * @return array
525
+	 */
526
+	private function _get_extra_nav_menu_pages_items()
527
+	{
528
+		$menuitems[] = array(
529
+			'title'       => esc_html__('Event List', 'event_espresso'),
530
+			'url'         => get_post_type_archive_link('espresso_events'),
531
+			'description' => esc_html__('Archive page for all events.', 'event_espresso'),
532
+		);
533
+		return apply_filters('FHEE__EE_Admin__get_extra_nav_menu_pages_items', $menuitems);
534
+	}
535
+
536
+
537
+	/**
538
+	 * Setup nav menu walker item for usage in the event archive nav menu metabox.  It receives a menu_item array with
539
+	 * the properties and converts it to the menu item object.
540
+	 *
541
+	 * @see wp_setup_nav_menu_item() in wp-includes/nav-menu.php
542
+	 * @param $menu_item_values
543
+	 * @return stdClass
544
+	 */
545
+	private function _setup_extra_nav_menu_pages_items($menu_item_values)
546
+	{
547
+		$menu_item = new stdClass();
548
+		$keys = array(
549
+			'ID'               => 0,
550
+			'db_id'            => 0,
551
+			'menu_item_parent' => 0,
552
+			'object_id'        => -1,
553
+			'post_parent'      => 0,
554
+			'type'             => 'custom',
555
+			'object'           => '',
556
+			'type_label'       => esc_html__('Extra Nav Menu Item', 'event_espresso'),
557
+			'title'            => '',
558
+			'url'              => '',
559
+			'target'           => '',
560
+			'attr_title'       => '',
561
+			'description'      => '',
562
+			'classes'          => array(),
563
+			'xfn'              => '',
564
+		);
565
+
566
+		foreach ($keys as $key => $value) {
567
+			$menu_item->{$key} = isset($menu_item_values[ $key ]) ? $menu_item_values[ $key ] : $value;
568
+		}
569
+		return $menu_item;
570
+	}
571
+
572
+
573
+	/**
574
+	 * This is the action hook for the AHEE__EE_Admin_Page__route_admin_request hook that fires off right before an
575
+	 * EE_Admin_Page route is called.
576
+	 *
577
+	 * @return void
578
+	 */
579
+	public function route_admin_request()
580
+	{
581
+	}
582
+
583
+
584
+	/**
585
+	 * wp_loaded should fire on the WordPress wp_loaded hook.  This fires on a VERY late priority.
586
+	 *
587
+	 * @return void
588
+	 */
589
+	public function wp_loaded()
590
+	{
591
+	}
592
+
593
+
594
+	/**
595
+	 * admin_init
596
+	 *
597
+	 * @return void
598
+	 * @throws EE_Error
599
+	 * @throws InvalidArgumentException
600
+	 * @throws InvalidDataTypeException
601
+	 * @throws InvalidInterfaceException
602
+	 * @throws ReflectionException
603
+	 */
604
+	public function admin_init()
605
+	{
606
+		/**
607
+		 * our cpt models must be instantiated on WordPress post processing routes (wp-admin/post.php),
608
+		 * so any hooking into core WP routes is taken care of.  So in this next few lines of code:
609
+		 * - check if doing post processing.
610
+		 * - check if doing post processing of one of EE CPTs
611
+		 * - instantiate the corresponding EE CPT model for the post_type being processed.
612
+		 */
613
+		if (isset($_POST['action'], $_POST['post_type']) && $_POST['action'] === 'editpost') {
614
+			/** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_types */
615
+			$custom_post_types = $this->getLoader()->getShared(
616
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
617
+			);
618
+			$custom_post_types->getCustomPostTypeModels($_POST['post_type']);
619
+		}
620
+
621
+
622
+		/**
623
+		 * This code excludes EE critical pages anywhere `wp_dropdown_pages` is used to create a dropdown for selecting
624
+		 * critical pages.  The only place critical pages need included in a generated dropdown is on the "Critical
625
+		 * Pages" tab in the EE General Settings Admin page.
626
+		 * This is for user-proofing.
627
+		 */
628
+		add_filter('wp_dropdown_pages', array($this, 'modify_dropdown_pages'));
629
+		if (EE_Maintenance_Mode::instance()->models_can_query()) {
630
+			$this->adminInitModelsReady();
631
+		}
632
+	}
633
+
634
+
635
+	/**
636
+	 * Runs on admin_init but only if models are usable (ie, we're not in maintenanc emode)
637
+	 */
638
+	protected function adminInitModelsReady()
639
+	{
640
+		if (function_exists('wp_add_privacy_policy_content')) {
641
+			$this->getLoader()->getShared('EventEspresso\core\services\privacy\policy\PrivacyPolicyManager');
642
+		}
643
+	}
644
+
645
+
646
+	/**
647
+	 * Callback for wp_dropdown_pages hook to remove ee critical pages from the dropdown selection.
648
+	 *
649
+	 * @param string $output Current output.
650
+	 * @return string
651
+	 * @throws InvalidArgumentException
652
+	 * @throws InvalidDataTypeException
653
+	 * @throws InvalidInterfaceException
654
+	 */
655
+	public function modify_dropdown_pages($output)
656
+	{
657
+		// get critical pages
658
+		$critical_pages = EE_Registry::instance()->CFG->core->get_critical_pages_array();
659
+
660
+		// split current output by line break for easier parsing.
661
+		$split_output = explode("\n", $output);
662
+
663
+		// loop through to remove any critical pages from the array.
664
+		foreach ($critical_pages as $page_id) {
665
+			$needle = 'value="' . $page_id . '"';
666
+			foreach ($split_output as $key => $haystack) {
667
+				if (strpos($haystack, $needle) !== false) {
668
+					unset($split_output[ $key ]);
669
+				}
670
+			}
671
+		}
672
+		// replace output with the new contents
673
+		return implode("\n", $split_output);
674
+	}
675
+
676
+
677
+	/**
678
+	 * enqueue all admin scripts that need loaded for admin pages
679
+	 *
680
+	 * @return void
681
+	 */
682
+	public function enqueue_admin_scripts()
683
+	{
684
+		// this javascript is loaded on every admin page to catch any injections ee needs to add to wp run js.
685
+		// Note: the intention of this script is to only do TARGETED injections.  I.E, only injecting on certain script
686
+		// calls.
687
+		wp_enqueue_script(
688
+			'ee-inject-wp',
689
+			EE_ADMIN_URL . 'assets/ee-cpt-wp-injects.js',
690
+			array('jquery'),
691
+			EVENT_ESPRESSO_VERSION,
692
+			true
693
+		);
694
+		// register cookie script for future dependencies
695
+		wp_register_script(
696
+			'jquery-cookie',
697
+			EE_THIRD_PARTY_URL . 'joyride/jquery.cookie.js',
698
+			array('jquery'),
699
+			'2.1',
700
+			true
701
+		);
702
+		// joyride is turned OFF by default, but prior to the admin_enqueue_scripts hook, can be turned back on again
703
+		// via: add_filter('FHEE_load_joyride', '__return_true' );
704
+		if (apply_filters('FHEE_load_joyride', false)) {
705
+			// joyride style
706
+			wp_register_style('joyride-css', EE_THIRD_PARTY_URL . 'joyride/joyride-2.1.css', array(), '2.1');
707
+			wp_register_style(
708
+				'ee-joyride-css',
709
+				EE_GLOBAL_ASSETS_URL . 'css/ee-joyride-styles.css',
710
+				array('joyride-css'),
711
+				EVENT_ESPRESSO_VERSION
712
+			);
713
+			wp_register_script(
714
+				'joyride-modernizr',
715
+				EE_THIRD_PARTY_URL . 'joyride/modernizr.mq.js',
716
+				array(),
717
+				'2.1',
718
+				true
719
+			);
720
+			// joyride JS
721
+			wp_register_script(
722
+				'jquery-joyride',
723
+				EE_THIRD_PARTY_URL . 'joyride/jquery.joyride-2.1.js',
724
+				array('jquery-cookie', 'joyride-modernizr'),
725
+				'2.1',
726
+				true
727
+			);
728
+			// wanna go for a joyride?
729
+			wp_enqueue_style('ee-joyride-css');
730
+			wp_enqueue_script('jquery-joyride');
731
+		}
732
+	}
733
+
734
+
735
+	/**
736
+	 * display_admin_notices
737
+	 *
738
+	 * @return void
739
+	 */
740
+	public function display_admin_notices()
741
+	{
742
+		echo EE_Error::get_notices();
743
+	}
744
+
745
+
746
+	/**
747
+	 * @param array $elements
748
+	 * @return array
749
+	 * @throws EE_Error
750
+	 * @throws InvalidArgumentException
751
+	 * @throws InvalidDataTypeException
752
+	 * @throws InvalidInterfaceException
753
+	 */
754
+	public function dashboard_glance_items($elements)
755
+	{
756
+		$elements = is_array($elements) ? $elements : array($elements);
757
+		$events = EEM_Event::instance()->count();
758
+		$items['events']['url'] = EE_Admin_Page::add_query_args_and_nonce(
759
+			array('page' => 'espresso_events'),
760
+			admin_url('admin.php')
761
+		);
762
+		$items['events']['text'] = sprintf(_n('%s Event', '%s Events', $events, 'event_espresso'), number_format_i18n($events));
763
+		$items['events']['title'] = esc_html__('Click to view all Events', 'event_espresso');
764
+		$registrations = EEM_Registration::instance()->count(
765
+			array(
766
+				array(
767
+					'STS_ID' => array('!=', EEM_Registration::status_id_incomplete),
768
+				),
769
+			)
770
+		);
771
+		$items['registrations']['url'] = EE_Admin_Page::add_query_args_and_nonce(
772
+			array('page' => 'espresso_registrations'),
773
+			admin_url('admin.php')
774
+		);
775
+		$items['registrations']['text'] = sprintf(
776
+			_n('%s Registration', '%s Registrations', $registrations, 'event_espresso'),
777
+			number_format_i18n($registrations)
778
+		);
779
+		$items['registrations']['title'] = esc_html__('Click to view all registrations', 'event_espresso');
780
+
781
+		$items = (array) apply_filters('FHEE__EE_Admin__dashboard_glance_items__items', $items);
782
+
783
+		foreach ($items as $type => $item_properties) {
784
+			$elements[] = sprintf(
785
+				'<a class="ee-dashboard-link-' . $type . '" href="%s" title="%s">%s</a>',
786
+				$item_properties['url'],
787
+				$item_properties['title'],
788
+				$item_properties['text']
789
+			);
790
+		}
791
+		return $elements;
792
+	}
793
+
794
+
795
+	/**
796
+	 * check_for_invalid_datetime_formats
797
+	 * if an admin changes their date or time format settings on the WP General Settings admin page, verify that
798
+	 * their selected format can be parsed by PHP
799
+	 *
800
+	 * @param    $value
801
+	 * @param    $option
802
+	 * @throws EE_Error
803
+	 * @return    string
804
+	 */
805
+	public function check_for_invalid_datetime_formats($value, $option)
806
+	{
807
+		// check for date_format or time_format
808
+		switch ($option) {
809
+			case 'date_format':
810
+				$date_time_format = $value . ' ' . get_option('time_format');
811
+				break;
812
+			case 'time_format':
813
+				$date_time_format = get_option('date_format') . ' ' . $value;
814
+				break;
815
+			default:
816
+				$date_time_format = false;
817
+		}
818
+		// do we have a date_time format to check ?
819
+		if ($date_time_format) {
820
+			$error_msg = EEH_DTT_Helper::validate_format_string($date_time_format);
821
+
822
+			if (is_array($error_msg)) {
823
+				$msg = '<p>'
824
+					   . sprintf(
825
+						   esc_html__(
826
+							   'The following date time "%s" ( %s ) is difficult to be properly parsed by PHP for the following reasons:',
827
+							   'event_espresso'
828
+						   ),
829
+						   date($date_time_format),
830
+						   $date_time_format
831
+					   )
832
+					   . '</p><p><ul>';
833
+
834
+
835
+				foreach ($error_msg as $error) {
836
+					$msg .= '<li>' . $error . '</li>';
837
+				}
838
+
839
+				$msg .= '</ul></p><p>'
840
+						. sprintf(
841
+							esc_html__(
842
+								'%sPlease note that your date and time formats have been reset to "F j, Y" and "g:i a" respectively.%s',
843
+								'event_espresso'
844
+							),
845
+							'<span style="color:#D54E21;">',
846
+							'</span>'
847
+						)
848
+						. '</p>';
849
+
850
+				// trigger WP settings error
851
+				add_settings_error(
852
+					'date_format',
853
+					'date_format',
854
+					$msg
855
+				);
856
+
857
+				// set format to something valid
858
+				switch ($option) {
859
+					case 'date_format':
860
+						$value = 'F j, Y';
861
+						break;
862
+					case 'time_format':
863
+						$value = 'g:i a';
864
+						break;
865
+				}
866
+			}
867
+		}
868
+		return $value;
869
+	}
870
+
871
+
872
+	/**
873
+	 * its_eSpresso - converts the less commonly used spelling of "Expresso" to "Espresso"
874
+	 *
875
+	 * @param $content
876
+	 * @return    string
877
+	 */
878
+	public function its_eSpresso($content)
879
+	{
880
+		return str_replace('[EXPRESSO_', '[ESPRESSO_', $content);
881
+	}
882
+
883
+
884
+	/**
885
+	 * espresso_admin_footer
886
+	 *
887
+	 * @return    string
888
+	 */
889
+	public function espresso_admin_footer()
890
+	{
891
+		return \EEH_Template::powered_by_event_espresso('aln-cntr', '', array('utm_content' => 'admin_footer'));
892
+	}
893
+
894
+
895
+	/**
896
+	 * static method for registering ee admin page.
897
+	 * This method is deprecated in favor of the new location in EE_Register_Admin_Page::register.
898
+	 *
899
+	 * @since      4.3.0
900
+	 * @deprecated 4.3.0    Use EE_Register_Admin_Page::register() instead
901
+	 * @see        EE_Register_Admin_Page::register()
902
+	 * @param       $page_basename
903
+	 * @param       $page_path
904
+	 * @param array $config
905
+	 * @return void
906
+	 * @throws EE_Error
907
+	 */
908
+	public static function register_ee_admin_page($page_basename, $page_path, $config = array())
909
+	{
910
+		EE_Error::doing_it_wrong(
911
+			__METHOD__,
912
+			sprintf(
913
+				esc_html__(
914
+					'Usage is deprecated.  Use EE_Register_Admin_Page::register() for registering the %s admin page.',
915
+					'event_espresso'
916
+				),
917
+				$page_basename
918
+			),
919
+			'4.3'
920
+		);
921
+		if (class_exists('EE_Register_Admin_Page')) {
922
+			$config['page_path'] = $page_path;
923
+		}
924
+		EE_Register_Admin_Page::register($page_basename, $config);
925
+	}
926
+
927
+
928
+	/**
929
+	 * @deprecated 4.8.41
930
+	 * @param  int      $post_ID
931
+	 * @param  \WP_Post $post
932
+	 * @return void
933
+	 */
934
+	public static function parse_post_content_on_save($post_ID, $post)
935
+	{
936
+		EE_Error::doing_it_wrong(
937
+			__METHOD__,
938
+			esc_html__('Usage is deprecated', 'event_espresso'),
939
+			'4.8.41'
940
+		);
941
+	}
942
+
943
+
944
+	/**
945
+	 * @deprecated 4.8.41
946
+	 * @param  $option
947
+	 * @param  $old_value
948
+	 * @param  $value
949
+	 * @return void
950
+	 */
951
+	public function reset_page_for_posts_on_change($option, $old_value, $value)
952
+	{
953
+		EE_Error::doing_it_wrong(
954
+			__METHOD__,
955
+			esc_html__('Usage is deprecated', 'event_espresso'),
956
+			'4.8.41'
957
+		);
958
+	}
959
+
960
+
961
+	/**
962
+	 * @deprecated 4.9.27
963
+	 * @return void
964
+	 */
965
+	public function get_persistent_admin_notices()
966
+	{
967
+		EE_Error::doing_it_wrong(
968
+			__METHOD__,
969
+			sprintf(
970
+				__('Usage is deprecated. Use "%1$s" instead.', 'event_espresso'),
971
+				'\EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
972
+			),
973
+			'4.9.27'
974
+		);
975
+	}
976
+
977
+
978
+	/**
979
+	 * @deprecated 4.9.27
980
+	 * @throws InvalidInterfaceException
981
+	 * @throws InvalidDataTypeException
982
+	 * @throws DomainException
983
+	 */
984
+	public function dismiss_ee_nag_notice_callback()
985
+	{
986
+		EE_Error::doing_it_wrong(
987
+			__METHOD__,
988
+			sprintf(
989
+				__('Usage is deprecated. Use "%1$s" instead.', 'event_espresso'),
990
+				'\EventEspresso\core\services\notifications\PersistentAdminNoticeManager'
991
+			),
992
+			'4.9.27'
993
+		);
994
+		$this->persistent_admin_notice_manager->dismissNotice();
995
+	}
996
+
997
+
998
+	/**
999
+	 * Callback on load-plugins.php hook for setting up anything hooking into the wp plugins page.
1000
+	 *
1001
+	 * @throws InvalidArgumentException
1002
+	 * @throws InvalidDataTypeException
1003
+	 * @throws InvalidInterfaceException
1004
+	 */
1005
+	public function hookIntoWpPluginsPage()
1006
+	{
1007
+		$this->getLoader()->getShared('EventEspresso\core\domain\services\admin\ExitModal');
1008
+		$this->getLoader()
1009
+					 ->getShared('EventEspresso\core\domain\services\admin\PluginUpsells')
1010
+					 ->decafUpsells();
1011
+	}
1012 1012
 }
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
     public static function instance()
44 44
     {
45 45
         // check if class object is instantiated
46
-        if (! self::$_instance instanceof EE_Admin) {
46
+        if ( ! self::$_instance instanceof EE_Admin) {
47 47
             self::$_instance = new self();
48 48
         }
49 49
         return self::$_instance;
@@ -103,11 +103,11 @@  discard block
 block discarded – undo
103 103
      */
104 104
     private function _define_all_constants()
105 105
     {
106
-        if (! defined('EE_ADMIN_URL')) {
107
-            define('EE_ADMIN_URL', EE_PLUGIN_DIR_URL . 'core/admin/');
108
-            define('EE_ADMIN_PAGES_URL', EE_PLUGIN_DIR_URL . 'admin_pages/');
109
-            define('EE_ADMIN_TEMPLATE', EE_ADMIN . 'templates' . DS);
110
-            define('WP_ADMIN_PATH', ABSPATH . 'wp-admin/');
106
+        if ( ! defined('EE_ADMIN_URL')) {
107
+            define('EE_ADMIN_URL', EE_PLUGIN_DIR_URL.'core/admin/');
108
+            define('EE_ADMIN_PAGES_URL', EE_PLUGIN_DIR_URL.'admin_pages/');
109
+            define('EE_ADMIN_TEMPLATE', EE_ADMIN.'templates'.DS);
110
+            define('WP_ADMIN_PATH', ABSPATH.'wp-admin/');
111 111
             define('WP_AJAX_URL', admin_url('admin-ajax.php'));
112 112
         }
113 113
     }
@@ -125,7 +125,7 @@  discard block
 block discarded – undo
125 125
         // set $main_file in stone
126 126
         static $main_file;
127 127
         // if $main_file is not set yet
128
-        if (! $main_file) {
128
+        if ( ! $main_file) {
129 129
             $main_file = plugin_basename(EVENT_ESPRESSO_MAIN_FILE);
130 130
         }
131 131
         if ($plugin === $main_file) {
@@ -177,9 +177,9 @@  discard block
 block discarded – undo
177 177
     public function hide_admin_pages_except_maintenance_mode($admin_page_folder_names = array())
178 178
     {
179 179
         return array(
180
-            'maintenance' => EE_ADMIN_PAGES . 'maintenance' . DS,
181
-            'about'       => EE_ADMIN_PAGES . 'about' . DS,
182
-            'support'     => EE_ADMIN_PAGES . 'support' . DS,
180
+            'maintenance' => EE_ADMIN_PAGES.'maintenance'.DS,
181
+            'about'       => EE_ADMIN_PAGES.'about'.DS,
182
+            'support'     => EE_ADMIN_PAGES.'support'.DS,
183 183
         );
184 184
     }
185 185
 
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
             $this->initModelsReady();
204 204
         }
205 205
         // run the admin page factory but ONLY if we are doing an ee admin ajax request
206
-        if (! defined('DOING_AJAX') || EE_ADMIN_AJAX) {
206
+        if ( ! defined('DOING_AJAX') || EE_ADMIN_AJAX) {
207 207
             try {
208 208
                 // this loads the controller for the admin pages which will setup routing etc
209 209
                 EE_Registry::instance()->load_core('Admin_Page_Loader');
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
      */
230 230
     protected function getLoader()
231 231
     {
232
-        if (! $this->loader instanceof LoaderInterface) {
232
+        if ( ! $this->loader instanceof LoaderInterface) {
233 233
             $this->loader = LoaderFactory::getLoader();
234 234
         }
235 235
         return $this->loader;
@@ -296,13 +296,13 @@  discard block
 block discarded – undo
296 296
                     '</strong>',
297 297
                     '<a href="https://eventespresso.com/2017/08/important-upcoming-changes-dates-times">',
298 298
                     '</a>',
299
-                    '<a href="' . EE_Admin_Page::add_query_args_and_nonce(
299
+                    '<a href="'.EE_Admin_Page::add_query_args_and_nonce(
300 300
                         array(
301 301
                             'page'   => 'espresso_maintenance_settings',
302 302
                             'action' => 'datetime_tools',
303 303
                         ),
304 304
                         admin_url('admin.php')
305
-                    ) . '">'
305
+                    ).'">'
306 306
                 ),
307 307
                 false,
308 308
                 'manage_options',
@@ -348,7 +348,7 @@  discard block
 block discarded – undo
348 348
     public function enable_hidden_ee_nav_menu_metaboxes()
349 349
     {
350 350
         global $wp_meta_boxes, $pagenow;
351
-        if (! is_array($wp_meta_boxes) || $pagenow !== 'nav-menus.php') {
351
+        if ( ! is_array($wp_meta_boxes) || $pagenow !== 'nav-menus.php') {
352 352
             return;
353 353
         }
354 354
         $user = wp_get_current_user();
@@ -377,7 +377,7 @@  discard block
 block discarded – undo
377 377
         if (is_array($hidden_meta_boxes)) {
378 378
             foreach ($hidden_meta_boxes as $key => $meta_box_id) {
379 379
                 if (in_array($meta_box_id, $initial_meta_boxes, true)) {
380
-                    unset($hidden_meta_boxes[ $key ]);
380
+                    unset($hidden_meta_boxes[$key]);
381 381
                 }
382 382
             }
383 383
         }
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
      */
418 418
     public function modify_edit_post_link($link, $id)
419 419
     {
420
-        if (! $post = get_post($id)) {
420
+        if ( ! $post = get_post($id)) {
421 421
             return $link;
422 422
         }
423 423
         if ($post->post_type === 'espresso_attendees') {
@@ -564,7 +564,7 @@  discard block
 block discarded – undo
564 564
         );
565 565
 
566 566
         foreach ($keys as $key => $value) {
567
-            $menu_item->{$key} = isset($menu_item_values[ $key ]) ? $menu_item_values[ $key ] : $value;
567
+            $menu_item->{$key} = isset($menu_item_values[$key]) ? $menu_item_values[$key] : $value;
568 568
         }
569 569
         return $menu_item;
570 570
     }
@@ -662,10 +662,10 @@  discard block
 block discarded – undo
662 662
 
663 663
         // loop through to remove any critical pages from the array.
664 664
         foreach ($critical_pages as $page_id) {
665
-            $needle = 'value="' . $page_id . '"';
665
+            $needle = 'value="'.$page_id.'"';
666 666
             foreach ($split_output as $key => $haystack) {
667 667
                 if (strpos($haystack, $needle) !== false) {
668
-                    unset($split_output[ $key ]);
668
+                    unset($split_output[$key]);
669 669
                 }
670 670
             }
671 671
         }
@@ -686,7 +686,7 @@  discard block
 block discarded – undo
686 686
         // calls.
687 687
         wp_enqueue_script(
688 688
             'ee-inject-wp',
689
-            EE_ADMIN_URL . 'assets/ee-cpt-wp-injects.js',
689
+            EE_ADMIN_URL.'assets/ee-cpt-wp-injects.js',
690 690
             array('jquery'),
691 691
             EVENT_ESPRESSO_VERSION,
692 692
             true
@@ -694,7 +694,7 @@  discard block
 block discarded – undo
694 694
         // register cookie script for future dependencies
695 695
         wp_register_script(
696 696
             'jquery-cookie',
697
-            EE_THIRD_PARTY_URL . 'joyride/jquery.cookie.js',
697
+            EE_THIRD_PARTY_URL.'joyride/jquery.cookie.js',
698 698
             array('jquery'),
699 699
             '2.1',
700 700
             true
@@ -703,16 +703,16 @@  discard block
 block discarded – undo
703 703
         // via: add_filter('FHEE_load_joyride', '__return_true' );
704 704
         if (apply_filters('FHEE_load_joyride', false)) {
705 705
             // joyride style
706
-            wp_register_style('joyride-css', EE_THIRD_PARTY_URL . 'joyride/joyride-2.1.css', array(), '2.1');
706
+            wp_register_style('joyride-css', EE_THIRD_PARTY_URL.'joyride/joyride-2.1.css', array(), '2.1');
707 707
             wp_register_style(
708 708
                 'ee-joyride-css',
709
-                EE_GLOBAL_ASSETS_URL . 'css/ee-joyride-styles.css',
709
+                EE_GLOBAL_ASSETS_URL.'css/ee-joyride-styles.css',
710 710
                 array('joyride-css'),
711 711
                 EVENT_ESPRESSO_VERSION
712 712
             );
713 713
             wp_register_script(
714 714
                 'joyride-modernizr',
715
-                EE_THIRD_PARTY_URL . 'joyride/modernizr.mq.js',
715
+                EE_THIRD_PARTY_URL.'joyride/modernizr.mq.js',
716 716
                 array(),
717 717
                 '2.1',
718 718
                 true
@@ -720,7 +720,7 @@  discard block
 block discarded – undo
720 720
             // joyride JS
721 721
             wp_register_script(
722 722
                 'jquery-joyride',
723
-                EE_THIRD_PARTY_URL . 'joyride/jquery.joyride-2.1.js',
723
+                EE_THIRD_PARTY_URL.'joyride/jquery.joyride-2.1.js',
724 724
                 array('jquery-cookie', 'joyride-modernizr'),
725 725
                 '2.1',
726 726
                 true
@@ -782,7 +782,7 @@  discard block
 block discarded – undo
782 782
 
783 783
         foreach ($items as $type => $item_properties) {
784 784
             $elements[] = sprintf(
785
-                '<a class="ee-dashboard-link-' . $type . '" href="%s" title="%s">%s</a>',
785
+                '<a class="ee-dashboard-link-'.$type.'" href="%s" title="%s">%s</a>',
786 786
                 $item_properties['url'],
787 787
                 $item_properties['title'],
788 788
                 $item_properties['text']
@@ -807,10 +807,10 @@  discard block
 block discarded – undo
807 807
         // check for date_format or time_format
808 808
         switch ($option) {
809 809
             case 'date_format':
810
-                $date_time_format = $value . ' ' . get_option('time_format');
810
+                $date_time_format = $value.' '.get_option('time_format');
811 811
                 break;
812 812
             case 'time_format':
813
-                $date_time_format = get_option('date_format') . ' ' . $value;
813
+                $date_time_format = get_option('date_format').' '.$value;
814 814
                 break;
815 815
             default:
816 816
                 $date_time_format = false;
@@ -833,7 +833,7 @@  discard block
 block discarded – undo
833 833
 
834 834
 
835 835
                 foreach ($error_msg as $error) {
836
-                    $msg .= '<li>' . $error . '</li>';
836
+                    $msg .= '<li>'.$error.'</li>';
837 837
                 }
838 838
 
839 839
                 $msg .= '</ul></p><p>'
Please login to merge, or discard this patch.
core/EE_Session.core.php 2 patches
Indentation   +1239 added lines, -1239 removed lines patch added patch discarded remove patch
@@ -23,1237 +23,1237 @@  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
-    /**
880
-     * _save_session_to_db
881
-     *
882
-     * @param bool $clear_session
883
-     * @return string
884
-     * @throws EE_Error
885
-     * @throws InvalidArgumentException
886
-     * @throws InvalidDataTypeException
887
-     * @throws InvalidInterfaceException
888
-     */
889
-    private function _save_session_to_db($clear_session = false)
890
-    {
891
-        // don't save sessions for crawlers
892
-        // and unless we're deleting the session data, don't save anything if there isn't a cart
893
-        if ($this->request->isBot()
894
-            || (
895
-                ! $clear_session
896
-                && ! $this->cart() instanceof EE_Cart
897
-                && apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
898
-            )
899
-        ) {
900
-            return false;
901
-        }
902
-        $transaction = $this->transaction();
903
-        if ($transaction instanceof EE_Transaction) {
904
-            if (! $transaction->ID()) {
905
-                $transaction->save();
906
-            }
907
-            $this->_session_data['transaction'] = $transaction->ID();
908
-        }
909
-        // then serialize all of our session data
910
-        $session_data = serialize($this->_session_data);
911
-        // do we need to also encode it to avoid corrupted data when saved to the db?
912
-        $session_data = $this->_use_encryption
913
-            ? $this->encryption->base64_string_encode($session_data)
914
-            : $session_data;
915
-        // maybe save hash check
916
-        if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
917
-            $this->cache_storage->add(
918
-                EE_Session::hash_check_prefix . $this->_sid,
919
-                md5($session_data),
920
-                $this->session_lifespan->inSeconds()
921
-            );
922
-        }
923
-        // we're using the Transient API for storing session data,
924
-        return $this->cache_storage->add(
925
-            EE_Session::session_id_prefix . $this->_sid,
926
-            $session_data,
927
-            $this->session_lifespan->inSeconds()
928
-        );
929
-    }
930
-
931
-
932
-    /**
933
-     * @get    the full page request the visitor is accessing
934
-     * @access public
935
-     * @return string
936
-     */
937
-    public function _get_page_visit()
938
-    {
939
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
940
-        // check for request url
941
-        if (isset($_SERVER['REQUEST_URI'])) {
942
-            $http_host = '';
943
-            $page_id = '?';
944
-            $e_reg = '';
945
-            $request_uri = esc_url($_SERVER['REQUEST_URI']);
946
-            $ru_bits = explode('?', $request_uri);
947
-            $request_uri = $ru_bits[0];
948
-            // check for and grab host as well
949
-            if (isset($_SERVER['HTTP_HOST'])) {
950
-                $http_host = esc_url($_SERVER['HTTP_HOST']);
951
-            }
952
-            // check for page_id in SERVER REQUEST
953
-            if (isset($_REQUEST['page_id'])) {
954
-                // rebuild $e_reg without any of the extra parameters
955
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
956
-            }
957
-            // check for $e_reg in SERVER REQUEST
958
-            if (isset($_REQUEST['ee'])) {
959
-                // rebuild $e_reg without any of the extra parameters
960
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
961
-            }
962
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
963
-        }
964
-        return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
965
-    }
966
-
967
-
968
-    /**
969
-     * @the    current wp user id
970
-     * @access public
971
-     * @return int
972
-     */
973
-    public function _wp_user_id()
974
-    {
975
-        // if I need to explain the following lines of code, then you shouldn't be looking at this!
976
-        $this->_wp_user_id = get_current_user_id();
977
-        return $this->_wp_user_id;
978
-    }
979
-
980
-
981
-    /**
982
-     * Clear EE_Session data
983
-     *
984
-     * @access public
985
-     * @param string $class
986
-     * @param string $function
987
-     * @return void
988
-     * @throws EE_Error
989
-     * @throws InvalidArgumentException
990
-     * @throws InvalidDataTypeException
991
-     * @throws InvalidInterfaceException
992
-     */
993
-    public function clear_session($class = '', $function = '')
994
-    {
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
+	/**
880
+	 * _save_session_to_db
881
+	 *
882
+	 * @param bool $clear_session
883
+	 * @return string
884
+	 * @throws EE_Error
885
+	 * @throws InvalidArgumentException
886
+	 * @throws InvalidDataTypeException
887
+	 * @throws InvalidInterfaceException
888
+	 */
889
+	private function _save_session_to_db($clear_session = false)
890
+	{
891
+		// don't save sessions for crawlers
892
+		// and unless we're deleting the session data, don't save anything if there isn't a cart
893
+		if ($this->request->isBot()
894
+			|| (
895
+				! $clear_session
896
+				&& ! $this->cart() instanceof EE_Cart
897
+				&& apply_filters('FHEE__EE_Session___save_session_to_db__abort_session_save', true)
898
+			)
899
+		) {
900
+			return false;
901
+		}
902
+		$transaction = $this->transaction();
903
+		if ($transaction instanceof EE_Transaction) {
904
+			if (! $transaction->ID()) {
905
+				$transaction->save();
906
+			}
907
+			$this->_session_data['transaction'] = $transaction->ID();
908
+		}
909
+		// then serialize all of our session data
910
+		$session_data = serialize($this->_session_data);
911
+		// do we need to also encode it to avoid corrupted data when saved to the db?
912
+		$session_data = $this->_use_encryption
913
+			? $this->encryption->base64_string_encode($session_data)
914
+			: $session_data;
915
+		// maybe save hash check
916
+		if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
917
+			$this->cache_storage->add(
918
+				EE_Session::hash_check_prefix . $this->_sid,
919
+				md5($session_data),
920
+				$this->session_lifespan->inSeconds()
921
+			);
922
+		}
923
+		// we're using the Transient API for storing session data,
924
+		return $this->cache_storage->add(
925
+			EE_Session::session_id_prefix . $this->_sid,
926
+			$session_data,
927
+			$this->session_lifespan->inSeconds()
928
+		);
929
+	}
930
+
931
+
932
+	/**
933
+	 * @get    the full page request the visitor is accessing
934
+	 * @access public
935
+	 * @return string
936
+	 */
937
+	public function _get_page_visit()
938
+	{
939
+		$page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
940
+		// check for request url
941
+		if (isset($_SERVER['REQUEST_URI'])) {
942
+			$http_host = '';
943
+			$page_id = '?';
944
+			$e_reg = '';
945
+			$request_uri = esc_url($_SERVER['REQUEST_URI']);
946
+			$ru_bits = explode('?', $request_uri);
947
+			$request_uri = $ru_bits[0];
948
+			// check for and grab host as well
949
+			if (isset($_SERVER['HTTP_HOST'])) {
950
+				$http_host = esc_url($_SERVER['HTTP_HOST']);
951
+			}
952
+			// check for page_id in SERVER REQUEST
953
+			if (isset($_REQUEST['page_id'])) {
954
+				// rebuild $e_reg without any of the extra parameters
955
+				$page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
956
+			}
957
+			// check for $e_reg in SERVER REQUEST
958
+			if (isset($_REQUEST['ee'])) {
959
+				// rebuild $e_reg without any of the extra parameters
960
+				$e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
961
+			}
962
+			$page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
963
+		}
964
+		return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
965
+	}
966
+
967
+
968
+	/**
969
+	 * @the    current wp user id
970
+	 * @access public
971
+	 * @return int
972
+	 */
973
+	public function _wp_user_id()
974
+	{
975
+		// if I need to explain the following lines of code, then you shouldn't be looking at this!
976
+		$this->_wp_user_id = get_current_user_id();
977
+		return $this->_wp_user_id;
978
+	}
979
+
980
+
981
+	/**
982
+	 * Clear EE_Session data
983
+	 *
984
+	 * @access public
985
+	 * @param string $class
986
+	 * @param string $function
987
+	 * @return void
988
+	 * @throws EE_Error
989
+	 * @throws InvalidArgumentException
990
+	 * @throws InvalidDataTypeException
991
+	 * @throws InvalidInterfaceException
992
+	 */
993
+	public function clear_session($class = '', $function = '')
994
+	{
995 995
 //         echo '
996 996
 // <h3 style="color:#999;line-height:.9em;">
997 997
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
998 998
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
999 999
 // </h3>';
1000
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1001
-        $this->reset_cart();
1002
-        $this->reset_checkout();
1003
-        $this->reset_transaction();
1004
-        // wipe out everything that isn't a default session datum
1005
-        $this->reset_data(array_keys($this->_session_data));
1006
-        // reset initial site access time and the session expiration
1007
-        $this->_set_init_access_and_expiration();
1008
-        $this->_save_session_to_db(true);
1009
-    }
1010
-
1011
-
1012
-    /**
1013
-     * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1014
-     *
1015
-     * @param array|mixed $data_to_reset
1016
-     * @param bool        $show_all_notices
1017
-     * @return bool
1018
-     */
1019
-    public function reset_data($data_to_reset = array(), $show_all_notices = false)
1020
-    {
1021
-        // if $data_to_reset is not in an array, then put it in one
1022
-        if (! is_array($data_to_reset)) {
1023
-            $data_to_reset = array($data_to_reset);
1024
-        }
1025
-        // nothing ??? go home!
1026
-        if (empty($data_to_reset)) {
1027
-            EE_Error::add_error(
1028
-                __(
1029
-                    'No session data could be reset, because no session var name was provided.',
1030
-                    'event_espresso'
1031
-                ),
1032
-                __FILE__,
1033
-                __FUNCTION__,
1034
-                __LINE__
1035
-            );
1036
-            return false;
1037
-        }
1038
-        $return_value = true;
1039
-        // since $data_to_reset is an array, cycle through the values
1040
-        foreach ($data_to_reset as $reset) {
1041
-            // first check to make sure it is a valid session var
1042
-            if (isset($this->_session_data[ $reset ])) {
1043
-                // then check to make sure it is not a default var
1044
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1045
-                    // remove session var
1046
-                    unset($this->_session_data[ $reset ]);
1047
-                    if ($show_all_notices) {
1048
-                        EE_Error::add_success(
1049
-                            sprintf(
1050
-                                __('The session variable %s was removed.', 'event_espresso'),
1051
-                                $reset
1052
-                            ),
1053
-                            __FILE__,
1054
-                            __FUNCTION__,
1055
-                            __LINE__
1056
-                        );
1057
-                    }
1058
-                } else {
1059
-                    // yeeeeeeeeerrrrrrrrrrr OUT !!!!
1060
-                    if ($show_all_notices) {
1061
-                        EE_Error::add_error(
1062
-                            sprintf(
1063
-                                __(
1064
-                                    'Sorry! %s is a default session datum and can not be reset.',
1065
-                                    'event_espresso'
1066
-                                ),
1067
-                                $reset
1068
-                            ),
1069
-                            __FILE__,
1070
-                            __FUNCTION__,
1071
-                            __LINE__
1072
-                        );
1073
-                    }
1074
-                    $return_value = false;
1075
-                }
1076
-            } elseif ($show_all_notices) {
1077
-                // oops! that session var does not exist!
1078
-                EE_Error::add_error(
1079
-                    sprintf(
1080
-                        __(
1081
-                            'The session item provided, %s, is invalid or does not exist.',
1082
-                            'event_espresso'
1083
-                        ),
1084
-                        $reset
1085
-                    ),
1086
-                    __FILE__,
1087
-                    __FUNCTION__,
1088
-                    __LINE__
1089
-                );
1090
-                $return_value = false;
1091
-            }
1092
-        } // end of foreach
1093
-        return $return_value;
1094
-    }
1095
-
1096
-
1097
-    /**
1098
-     *   wp_loaded
1099
-     *
1100
-     * @access public
1101
-     * @throws EE_Error
1102
-     * @throws InvalidDataTypeException
1103
-     * @throws InvalidInterfaceException
1104
-     * @throws InvalidArgumentException
1105
-     */
1106
-    public function wp_loaded()
1107
-    {
1108
-        if ($this->request->requestParamIsSet('clear_session')) {
1109
-            $this->clear_session(__CLASS__, __FUNCTION__);
1110
-        }
1111
-    }
1112
-
1113
-
1114
-    /**
1115
-     * Used to reset the entire object (for tests).
1116
-     *
1117
-     * @since 4.3.0
1118
-     * @throws EE_Error
1119
-     * @throws InvalidDataTypeException
1120
-     * @throws InvalidInterfaceException
1121
-     * @throws InvalidArgumentException
1122
-     */
1123
-    public function reset_instance()
1124
-    {
1125
-        $this->clear_session();
1126
-        self::$_instance = null;
1127
-    }
1128
-
1129
-
1130
-    public function configure_garbage_collection_filters()
1131
-    {
1132
-        // run old filter we had for controlling session cleanup
1133
-        $expired_session_transient_delete_query_limit = absint(
1134
-            apply_filters(
1135
-                'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1136
-                50
1137
-            )
1138
-        );
1139
-        // is there a value? or one that is different than the default 50 records?
1140
-        if ($expired_session_transient_delete_query_limit === 0) {
1141
-            // hook into TransientCacheStorage in case Session cleanup was turned off
1142
-            add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1143
-        } elseif ($expired_session_transient_delete_query_limit !== 50) {
1144
-            // or use that for the new transient cleanup query limit
1145
-            add_filter(
1146
-                'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1147
-                function () use ($expired_session_transient_delete_query_limit) {
1148
-                    return $expired_session_transient_delete_query_limit;
1149
-                }
1150
-            );
1151
-        }
1152
-    }
1153
-
1154
-
1155
-    /**
1156
-     * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1157
-     * @param $data1
1158
-     * @return string
1159
-     */
1160
-    private function find_serialize_error($data1)
1161
-    {
1162
-        $error = '<pre>';
1163
-        $data2 = preg_replace_callback(
1164
-            '!s:(\d+):"(.*?)";!',
1165
-            function ($match) {
1166
-                return ($match[1] === strlen($match[2]))
1167
-                    ? $match[0]
1168
-                    : 's:'
1169
-                      . strlen($match[2])
1170
-                      . ':"'
1171
-                      . $match[2]
1172
-                      . '";';
1173
-            },
1174
-            $data1
1175
-        );
1176
-        $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1177
-        $error .= $data1 . PHP_EOL;
1178
-        $error .= $data2 . PHP_EOL;
1179
-        for ($i = 0; $i < $max; $i++) {
1180
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1181
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1182
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1183
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1184
-                $start = ($i - 20);
1185
-                $start = ($start < 0) ? 0 : $start;
1186
-                $length = 40;
1187
-                $point = $max - $i;
1188
-                if ($point < 20) {
1189
-                    $rlength = 1;
1190
-                    $rpoint = -$point;
1191
-                } else {
1192
-                    $rpoint = $length - 20;
1193
-                    $rlength = 1;
1194
-                }
1195
-                $error .= "\t-> Section Data1  = ";
1196
-                $error .= substr_replace(
1197
-                    substr($data1, $start, $length),
1198
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1199
-                    $rpoint,
1200
-                    $rlength
1201
-                );
1202
-                $error .= PHP_EOL;
1203
-                $error .= "\t-> Section Data2  = ";
1204
-                $error .= substr_replace(
1205
-                    substr($data2, $start, $length),
1206
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1207
-                    $rpoint,
1208
-                    $rlength
1209
-                );
1210
-                $error .= PHP_EOL;
1211
-            }
1212
-        }
1213
-        $error .= '</pre>';
1214
-        return $error;
1215
-    }
1216
-
1217
-
1218
-    /**
1219
-     * Saves an  array of settings used for configuring aspects of session behaviour
1220
-     *
1221
-     * @param array $updated_settings
1222
-     */
1223
-    private function updateSessionSettings(array $updated_settings = array())
1224
-    {
1225
-        // add existing settings, but only if not included in incoming $updated_settings array
1226
-        $updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1227
-        update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1228
-    }
1229
-
1230
-
1231
-    /**
1232
-     * garbage_collection
1233
-     */
1234
-    public function garbageCollection()
1235
-    {
1236
-        // only perform during regular requests if last garbage collection was over an hour ago
1237
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1238
-            $this->_last_gc = time();
1239
-            $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1240
-            /** @type WPDB $wpdb */
1241
-            global $wpdb;
1242
-            // filter the query limit. Set to 0 to turn off garbage collection
1243
-            $expired_session_transient_delete_query_limit = absint(
1244
-                apply_filters(
1245
-                    'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1246
-                    50
1247
-                )
1248
-            );
1249
-            // non-zero LIMIT means take out the trash
1250
-            if ($expired_session_transient_delete_query_limit) {
1251
-                $session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1252
-                $hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1253
-                // since transient expiration timestamps are set in the future, we can compare against NOW
1254
-                // but we only want to pick up any trash that's been around for more than a day
1255
-                $expiration = time() - DAY_IN_SECONDS;
1256
-                $SQL = "
1000
+		do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1001
+		$this->reset_cart();
1002
+		$this->reset_checkout();
1003
+		$this->reset_transaction();
1004
+		// wipe out everything that isn't a default session datum
1005
+		$this->reset_data(array_keys($this->_session_data));
1006
+		// reset initial site access time and the session expiration
1007
+		$this->_set_init_access_and_expiration();
1008
+		$this->_save_session_to_db(true);
1009
+	}
1010
+
1011
+
1012
+	/**
1013
+	 * resets all non-default session vars. Returns TRUE on success, FALSE on fail
1014
+	 *
1015
+	 * @param array|mixed $data_to_reset
1016
+	 * @param bool        $show_all_notices
1017
+	 * @return bool
1018
+	 */
1019
+	public function reset_data($data_to_reset = array(), $show_all_notices = false)
1020
+	{
1021
+		// if $data_to_reset is not in an array, then put it in one
1022
+		if (! is_array($data_to_reset)) {
1023
+			$data_to_reset = array($data_to_reset);
1024
+		}
1025
+		// nothing ??? go home!
1026
+		if (empty($data_to_reset)) {
1027
+			EE_Error::add_error(
1028
+				__(
1029
+					'No session data could be reset, because no session var name was provided.',
1030
+					'event_espresso'
1031
+				),
1032
+				__FILE__,
1033
+				__FUNCTION__,
1034
+				__LINE__
1035
+			);
1036
+			return false;
1037
+		}
1038
+		$return_value = true;
1039
+		// since $data_to_reset is an array, cycle through the values
1040
+		foreach ($data_to_reset as $reset) {
1041
+			// first check to make sure it is a valid session var
1042
+			if (isset($this->_session_data[ $reset ])) {
1043
+				// then check to make sure it is not a default var
1044
+				if (! array_key_exists($reset, $this->_default_session_vars)) {
1045
+					// remove session var
1046
+					unset($this->_session_data[ $reset ]);
1047
+					if ($show_all_notices) {
1048
+						EE_Error::add_success(
1049
+							sprintf(
1050
+								__('The session variable %s was removed.', 'event_espresso'),
1051
+								$reset
1052
+							),
1053
+							__FILE__,
1054
+							__FUNCTION__,
1055
+							__LINE__
1056
+						);
1057
+					}
1058
+				} else {
1059
+					// yeeeeeeeeerrrrrrrrrrr OUT !!!!
1060
+					if ($show_all_notices) {
1061
+						EE_Error::add_error(
1062
+							sprintf(
1063
+								__(
1064
+									'Sorry! %s is a default session datum and can not be reset.',
1065
+									'event_espresso'
1066
+								),
1067
+								$reset
1068
+							),
1069
+							__FILE__,
1070
+							__FUNCTION__,
1071
+							__LINE__
1072
+						);
1073
+					}
1074
+					$return_value = false;
1075
+				}
1076
+			} elseif ($show_all_notices) {
1077
+				// oops! that session var does not exist!
1078
+				EE_Error::add_error(
1079
+					sprintf(
1080
+						__(
1081
+							'The session item provided, %s, is invalid or does not exist.',
1082
+							'event_espresso'
1083
+						),
1084
+						$reset
1085
+					),
1086
+					__FILE__,
1087
+					__FUNCTION__,
1088
+					__LINE__
1089
+				);
1090
+				$return_value = false;
1091
+			}
1092
+		} // end of foreach
1093
+		return $return_value;
1094
+	}
1095
+
1096
+
1097
+	/**
1098
+	 *   wp_loaded
1099
+	 *
1100
+	 * @access public
1101
+	 * @throws EE_Error
1102
+	 * @throws InvalidDataTypeException
1103
+	 * @throws InvalidInterfaceException
1104
+	 * @throws InvalidArgumentException
1105
+	 */
1106
+	public function wp_loaded()
1107
+	{
1108
+		if ($this->request->requestParamIsSet('clear_session')) {
1109
+			$this->clear_session(__CLASS__, __FUNCTION__);
1110
+		}
1111
+	}
1112
+
1113
+
1114
+	/**
1115
+	 * Used to reset the entire object (for tests).
1116
+	 *
1117
+	 * @since 4.3.0
1118
+	 * @throws EE_Error
1119
+	 * @throws InvalidDataTypeException
1120
+	 * @throws InvalidInterfaceException
1121
+	 * @throws InvalidArgumentException
1122
+	 */
1123
+	public function reset_instance()
1124
+	{
1125
+		$this->clear_session();
1126
+		self::$_instance = null;
1127
+	}
1128
+
1129
+
1130
+	public function configure_garbage_collection_filters()
1131
+	{
1132
+		// run old filter we had for controlling session cleanup
1133
+		$expired_session_transient_delete_query_limit = absint(
1134
+			apply_filters(
1135
+				'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1136
+				50
1137
+			)
1138
+		);
1139
+		// is there a value? or one that is different than the default 50 records?
1140
+		if ($expired_session_transient_delete_query_limit === 0) {
1141
+			// hook into TransientCacheStorage in case Session cleanup was turned off
1142
+			add_filter('FHEE__TransientCacheStorage__transient_cleanup_schedule', '__return_zero');
1143
+		} elseif ($expired_session_transient_delete_query_limit !== 50) {
1144
+			// or use that for the new transient cleanup query limit
1145
+			add_filter(
1146
+				'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1147
+				function () use ($expired_session_transient_delete_query_limit) {
1148
+					return $expired_session_transient_delete_query_limit;
1149
+				}
1150
+			);
1151
+		}
1152
+	}
1153
+
1154
+
1155
+	/**
1156
+	 * @see http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset/21389439#10152996
1157
+	 * @param $data1
1158
+	 * @return string
1159
+	 */
1160
+	private function find_serialize_error($data1)
1161
+	{
1162
+		$error = '<pre>';
1163
+		$data2 = preg_replace_callback(
1164
+			'!s:(\d+):"(.*?)";!',
1165
+			function ($match) {
1166
+				return ($match[1] === strlen($match[2]))
1167
+					? $match[0]
1168
+					: 's:'
1169
+					  . strlen($match[2])
1170
+					  . ':"'
1171
+					  . $match[2]
1172
+					  . '";';
1173
+			},
1174
+			$data1
1175
+		);
1176
+		$max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1177
+		$error .= $data1 . PHP_EOL;
1178
+		$error .= $data2 . PHP_EOL;
1179
+		for ($i = 0; $i < $max; $i++) {
1180
+			if (@$data1[ $i ] !== @$data2[ $i ]) {
1181
+				$error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1182
+				$error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1183
+				$error .= "\t-> Line Number = $i" . PHP_EOL;
1184
+				$start = ($i - 20);
1185
+				$start = ($start < 0) ? 0 : $start;
1186
+				$length = 40;
1187
+				$point = $max - $i;
1188
+				if ($point < 20) {
1189
+					$rlength = 1;
1190
+					$rpoint = -$point;
1191
+				} else {
1192
+					$rpoint = $length - 20;
1193
+					$rlength = 1;
1194
+				}
1195
+				$error .= "\t-> Section Data1  = ";
1196
+				$error .= substr_replace(
1197
+					substr($data1, $start, $length),
1198
+					"<b style=\"color:green\">{$data1[ $i ]}</b>",
1199
+					$rpoint,
1200
+					$rlength
1201
+				);
1202
+				$error .= PHP_EOL;
1203
+				$error .= "\t-> Section Data2  = ";
1204
+				$error .= substr_replace(
1205
+					substr($data2, $start, $length),
1206
+					"<b style=\"color:red\">{$data2[ $i ]}</b>",
1207
+					$rpoint,
1208
+					$rlength
1209
+				);
1210
+				$error .= PHP_EOL;
1211
+			}
1212
+		}
1213
+		$error .= '</pre>';
1214
+		return $error;
1215
+	}
1216
+
1217
+
1218
+	/**
1219
+	 * Saves an  array of settings used for configuring aspects of session behaviour
1220
+	 *
1221
+	 * @param array $updated_settings
1222
+	 */
1223
+	private function updateSessionSettings(array $updated_settings = array())
1224
+	{
1225
+		// add existing settings, but only if not included in incoming $updated_settings array
1226
+		$updated_settings += get_option(EE_Session::OPTION_NAME_SETTINGS, array());
1227
+		update_option(EE_Session::OPTION_NAME_SETTINGS, $updated_settings);
1228
+	}
1229
+
1230
+
1231
+	/**
1232
+	 * garbage_collection
1233
+	 */
1234
+	public function garbageCollection()
1235
+	{
1236
+		// only perform during regular requests if last garbage collection was over an hour ago
1237
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1238
+			$this->_last_gc = time();
1239
+			$this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1240
+			/** @type WPDB $wpdb */
1241
+			global $wpdb;
1242
+			// filter the query limit. Set to 0 to turn off garbage collection
1243
+			$expired_session_transient_delete_query_limit = absint(
1244
+				apply_filters(
1245
+					'FHEE__EE_Session__garbage_collection___expired_session_transient_delete_query_limit',
1246
+					50
1247
+				)
1248
+			);
1249
+			// non-zero LIMIT means take out the trash
1250
+			if ($expired_session_transient_delete_query_limit) {
1251
+				$session_key = str_replace('_', '\_', EE_Session::session_id_prefix);
1252
+				$hash_check_key = str_replace('_', '\_', EE_Session::hash_check_prefix);
1253
+				// since transient expiration timestamps are set in the future, we can compare against NOW
1254
+				// but we only want to pick up any trash that's been around for more than a day
1255
+				$expiration = time() - DAY_IN_SECONDS;
1256
+				$SQL = "
1257 1257
                     SELECT option_name
1258 1258
                     FROM {$wpdb->options}
1259 1259
                     WHERE
@@ -1262,17 +1262,17 @@  discard block
 block discarded – undo
1262 1262
                     AND option_value < {$expiration}
1263 1263
                     LIMIT {$expired_session_transient_delete_query_limit}
1264 1264
                 ";
1265
-                // produces something like:
1266
-                // SELECT option_name FROM wp_options
1267
-                // WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1268
-                // OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1269
-                // AND option_value < 1508368198 LIMIT 50
1270
-                $expired_sessions = $wpdb->get_col($SQL);
1271
-                // valid results?
1272
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1273
-                    $this->cache_storage->deleteMany($expired_sessions, true);
1274
-                }
1275
-            }
1276
-        }
1277
-    }
1265
+				// produces something like:
1266
+				// SELECT option_name FROM wp_options
1267
+				// WHERE ( option_name LIKE '\_transient\_timeout\_ee\_ssn\_%'
1268
+				// OR option_name LIKE '\_transient\_timeout\_ee\_shc\_%' )
1269
+				// AND option_value < 1508368198 LIMIT 50
1270
+				$expired_sessions = $wpdb->get_col($SQL);
1271
+				// valid results?
1272
+				if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1273
+					$this->cache_storage->deleteMany($expired_sessions, true);
1274
+				}
1275
+			}
1276
+		}
1277
+	}
1278 1278
 }
Please login to merge, or discard this patch.
Spacing   +53 added lines, -53 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;
@@ -901,7 +901,7 @@  discard block
 block discarded – undo
901 901
         }
902 902
         $transaction = $this->transaction();
903 903
         if ($transaction instanceof EE_Transaction) {
904
-            if (! $transaction->ID()) {
904
+            if ( ! $transaction->ID()) {
905 905
                 $transaction->save();
906 906
             }
907 907
             $this->_session_data['transaction'] = $transaction->ID();
@@ -915,14 +915,14 @@  discard block
 block discarded – undo
915 915
         // maybe save hash check
916 916
         if (apply_filters('FHEE__EE_Session___perform_session_id_hash_check', WP_DEBUG)) {
917 917
             $this->cache_storage->add(
918
-                EE_Session::hash_check_prefix . $this->_sid,
918
+                EE_Session::hash_check_prefix.$this->_sid,
919 919
                 md5($session_data),
920 920
                 $this->session_lifespan->inSeconds()
921 921
             );
922 922
         }
923 923
         // we're using the Transient API for storing session data,
924 924
         return $this->cache_storage->add(
925
-            EE_Session::session_id_prefix . $this->_sid,
925
+            EE_Session::session_id_prefix.$this->_sid,
926 926
             $session_data,
927 927
             $this->session_lifespan->inSeconds()
928 928
         );
@@ -936,7 +936,7 @@  discard block
 block discarded – undo
936 936
      */
937 937
     public function _get_page_visit()
938 938
     {
939
-        $page_visit = home_url('/') . 'wp-admin/admin-ajax.php';
939
+        $page_visit = home_url('/').'wp-admin/admin-ajax.php';
940 940
         // check for request url
941 941
         if (isset($_SERVER['REQUEST_URI'])) {
942 942
             $http_host = '';
@@ -952,14 +952,14 @@  discard block
 block discarded – undo
952 952
             // check for page_id in SERVER REQUEST
953 953
             if (isset($_REQUEST['page_id'])) {
954 954
                 // rebuild $e_reg without any of the extra parameters
955
-                $page_id = '?page_id=' . esc_attr($_REQUEST['page_id']) . '&amp;';
955
+                $page_id = '?page_id='.esc_attr($_REQUEST['page_id']).'&amp;';
956 956
             }
957 957
             // check for $e_reg in SERVER REQUEST
958 958
             if (isset($_REQUEST['ee'])) {
959 959
                 // rebuild $e_reg without any of the extra parameters
960
-                $e_reg = 'ee=' . esc_attr($_REQUEST['ee']);
960
+                $e_reg = 'ee='.esc_attr($_REQUEST['ee']);
961 961
             }
962
-            $page_visit = rtrim($http_host . $request_uri . $page_id . $e_reg, '?');
962
+            $page_visit = rtrim($http_host.$request_uri.$page_id.$e_reg, '?');
963 963
         }
964 964
         return $page_visit !== home_url('/wp-admin/admin-ajax.php') ? $page_visit : '';
965 965
     }
@@ -997,7 +997,7 @@  discard block
 block discarded – undo
997 997
 // <span style="color:#2EA2CC">' . __CLASS__ . '</span>::<span style="color:#E76700">' . __FUNCTION__ . '( ' . $class . '::' . $function . '() )</span><br/>
998 998
 // <span style="font-size:9px;font-weight:normal;">' . __FILE__ . '</span>    <b style="font-size:10px;">  ' . __LINE__ . ' </b>
999 999
 // </h3>';
1000
-        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : ' . $class . '::' . $function . '()');
1000
+        do_action('AHEE_log', __FILE__, __FUNCTION__, 'session cleared by : '.$class.'::'.$function.'()');
1001 1001
         $this->reset_cart();
1002 1002
         $this->reset_checkout();
1003 1003
         $this->reset_transaction();
@@ -1019,7 +1019,7 @@  discard block
 block discarded – undo
1019 1019
     public function reset_data($data_to_reset = array(), $show_all_notices = false)
1020 1020
     {
1021 1021
         // if $data_to_reset is not in an array, then put it in one
1022
-        if (! is_array($data_to_reset)) {
1022
+        if ( ! is_array($data_to_reset)) {
1023 1023
             $data_to_reset = array($data_to_reset);
1024 1024
         }
1025 1025
         // nothing ??? go home!
@@ -1039,11 +1039,11 @@  discard block
 block discarded – undo
1039 1039
         // since $data_to_reset is an array, cycle through the values
1040 1040
         foreach ($data_to_reset as $reset) {
1041 1041
             // first check to make sure it is a valid session var
1042
-            if (isset($this->_session_data[ $reset ])) {
1042
+            if (isset($this->_session_data[$reset])) {
1043 1043
                 // then check to make sure it is not a default var
1044
-                if (! array_key_exists($reset, $this->_default_session_vars)) {
1044
+                if ( ! array_key_exists($reset, $this->_default_session_vars)) {
1045 1045
                     // remove session var
1046
-                    unset($this->_session_data[ $reset ]);
1046
+                    unset($this->_session_data[$reset]);
1047 1047
                     if ($show_all_notices) {
1048 1048
                         EE_Error::add_success(
1049 1049
                             sprintf(
@@ -1144,7 +1144,7 @@  discard block
 block discarded – undo
1144 1144
             // or use that for the new transient cleanup query limit
1145 1145
             add_filter(
1146 1146
                 'FHEE__TransientCacheStorage__clearExpiredTransients__limit',
1147
-                function () use ($expired_session_transient_delete_query_limit) {
1147
+                function() use ($expired_session_transient_delete_query_limit) {
1148 1148
                     return $expired_session_transient_delete_query_limit;
1149 1149
                 }
1150 1150
             );
@@ -1162,7 +1162,7 @@  discard block
 block discarded – undo
1162 1162
         $error = '<pre>';
1163 1163
         $data2 = preg_replace_callback(
1164 1164
             '!s:(\d+):"(.*?)";!',
1165
-            function ($match) {
1165
+            function($match) {
1166 1166
                 return ($match[1] === strlen($match[2]))
1167 1167
                     ? $match[0]
1168 1168
                     : 's:'
@@ -1174,13 +1174,13 @@  discard block
 block discarded – undo
1174 1174
             $data1
1175 1175
         );
1176 1176
         $max = (strlen($data1) > strlen($data2)) ? strlen($data1) : strlen($data2);
1177
-        $error .= $data1 . PHP_EOL;
1178
-        $error .= $data2 . PHP_EOL;
1177
+        $error .= $data1.PHP_EOL;
1178
+        $error .= $data2.PHP_EOL;
1179 1179
         for ($i = 0; $i < $max; $i++) {
1180
-            if (@$data1[ $i ] !== @$data2[ $i ]) {
1181
-                $error .= 'Difference ' . @$data1[ $i ] . ' != ' . @$data2[ $i ] . PHP_EOL;
1182
-                $error .= "\t-> ORD number " . ord(@$data1[ $i ]) . ' != ' . ord(@$data2[ $i ]) . PHP_EOL;
1183
-                $error .= "\t-> Line Number = $i" . PHP_EOL;
1180
+            if (@$data1[$i] !== @$data2[$i]) {
1181
+                $error .= 'Difference '.@$data1[$i].' != '.@$data2[$i].PHP_EOL;
1182
+                $error .= "\t-> ORD number ".ord(@$data1[$i]).' != '.ord(@$data2[$i]).PHP_EOL;
1183
+                $error .= "\t-> Line Number = $i".PHP_EOL;
1184 1184
                 $start = ($i - 20);
1185 1185
                 $start = ($start < 0) ? 0 : $start;
1186 1186
                 $length = 40;
@@ -1195,7 +1195,7 @@  discard block
 block discarded – undo
1195 1195
                 $error .= "\t-> Section Data1  = ";
1196 1196
                 $error .= substr_replace(
1197 1197
                     substr($data1, $start, $length),
1198
-                    "<b style=\"color:green\">{$data1[ $i ]}</b>",
1198
+                    "<b style=\"color:green\">{$data1[$i]}</b>",
1199 1199
                     $rpoint,
1200 1200
                     $rlength
1201 1201
                 );
@@ -1203,7 +1203,7 @@  discard block
 block discarded – undo
1203 1203
                 $error .= "\t-> Section Data2  = ";
1204 1204
                 $error .= substr_replace(
1205 1205
                     substr($data2, $start, $length),
1206
-                    "<b style=\"color:red\">{$data2[ $i ]}</b>",
1206
+                    "<b style=\"color:red\">{$data2[$i]}</b>",
1207 1207
                     $rpoint,
1208 1208
                     $rlength
1209 1209
                 );
@@ -1234,7 +1234,7 @@  discard block
 block discarded – undo
1234 1234
     public function garbageCollection()
1235 1235
     {
1236 1236
         // only perform during regular requests if last garbage collection was over an hour ago
1237
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1237
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && (time() - HOUR_IN_SECONDS) >= $this->_last_gc) {
1238 1238
             $this->_last_gc = time();
1239 1239
             $this->updateSessionSettings(array('last_gc' => $this->_last_gc));
1240 1240
             /** @type WPDB $wpdb */
@@ -1269,7 +1269,7 @@  discard block
 block discarded – undo
1269 1269
                 // AND option_value < 1508368198 LIMIT 50
1270 1270
                 $expired_sessions = $wpdb->get_col($SQL);
1271 1271
                 // valid results?
1272
-                if (! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1272
+                if ( ! $expired_sessions instanceof WP_Error && ! empty($expired_sessions)) {
1273 1273
                     $this->cache_storage->deleteMany($expired_sessions, true);
1274 1274
                 }
1275 1275
             }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.63.rc.021');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.63.rc.021');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.
core/EE_System.core.php 1 patch
Indentation   +1270 added lines, -1270 removed lines patch added patch discarded remove patch
@@ -27,1274 +27,1274 @@
 block discarded – undo
27 27
 final class EE_System implements ResettableInterface
28 28
 {
29 29
 
30
-    /**
31
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
-     */
34
-    const req_type_normal = 0;
35
-
36
-    /**
37
-     * Indicates this is a brand new installation of EE so we should install
38
-     * tables and default data etc
39
-     */
40
-    const req_type_new_activation = 1;
41
-
42
-    /**
43
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
-     * and we just exited maintenance mode). We MUST check the database is setup properly
45
-     * and that default data is setup too
46
-     */
47
-    const req_type_reactivation = 2;
48
-
49
-    /**
50
-     * indicates that EE has been upgraded since its previous request.
51
-     * We may have data migration scripts to call and will want to trigger maintenance mode
52
-     */
53
-    const req_type_upgrade = 3;
54
-
55
-    /**
56
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
-     */
58
-    const req_type_downgrade = 4;
59
-
60
-    /**
61
-     * @deprecated since version 4.6.0.dev.006
62
-     * Now whenever a new_activation is detected the request type is still just
63
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
-     * (Specifically, when the migration manager indicates migrations are finished
67
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
-     */
69
-    const req_type_activation_but_not_installed = 5;
70
-
71
-    /**
72
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
-     */
74
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
-
76
-    /**
77
-     * @var EE_System $_instance
78
-     */
79
-    private static $_instance;
80
-
81
-    /**
82
-     * @var EE_Registry $registry
83
-     */
84
-    private $registry;
85
-
86
-    /**
87
-     * @var LoaderInterface $loader
88
-     */
89
-    private $loader;
90
-
91
-    /**
92
-     * @var EE_Capabilities $capabilities
93
-     */
94
-    private $capabilities;
95
-
96
-    /**
97
-     * @var RequestInterface $request
98
-     */
99
-    private $request;
100
-
101
-    /**
102
-     * @var EE_Maintenance_Mode $maintenance_mode
103
-     */
104
-    private $maintenance_mode;
105
-
106
-    /**
107
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
-     *
110
-     * @var int $_req_type
111
-     */
112
-    private $_req_type;
113
-
114
-    /**
115
-     * Whether or not there was a non-micro version change in EE core version during this request
116
-     *
117
-     * @var boolean $_major_version_change
118
-     */
119
-    private $_major_version_change = false;
120
-
121
-    /**
122
-     * A Context DTO dedicated solely to identifying the current request type.
123
-     *
124
-     * @var RequestTypeContextCheckerInterface $request_type
125
-     */
126
-    private $request_type;
127
-
128
-
129
-    /**
130
-     * @singleton method used to instantiate class object
131
-     * @param EE_Registry|null         $registry
132
-     * @param LoaderInterface|null     $loader
133
-     * @param RequestInterface|null    $request
134
-     * @param EE_Maintenance_Mode|null $maintenance_mode
135
-     * @return EE_System
136
-     */
137
-    public static function instance(
138
-        EE_Registry $registry = null,
139
-        LoaderInterface $loader = null,
140
-        RequestInterface $request = null,
141
-        EE_Maintenance_Mode $maintenance_mode = null
142
-    ) {
143
-        // check if class object is instantiated
144
-        if (! self::$_instance instanceof EE_System) {
145
-            self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
-        }
147
-        return self::$_instance;
148
-    }
149
-
150
-
151
-    /**
152
-     * resets the instance and returns it
153
-     *
154
-     * @return EE_System
155
-     */
156
-    public static function reset()
157
-    {
158
-        self::$_instance->_req_type = null;
159
-        // make sure none of the old hooks are left hanging around
160
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
-        // we need to reset the migration manager in order for it to detect DMSs properly
162
-        EE_Data_Migration_Manager::reset();
163
-        self::instance()->detect_activations_or_upgrades();
164
-        self::instance()->perform_activations_upgrades_and_migrations();
165
-        return self::instance();
166
-    }
167
-
168
-
169
-    /**
170
-     * sets hooks for running rest of system
171
-     * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
-     * starting EE Addons from any other point may lead to problems
173
-     *
174
-     * @param EE_Registry         $registry
175
-     * @param LoaderInterface     $loader
176
-     * @param RequestInterface    $request
177
-     * @param EE_Maintenance_Mode $maintenance_mode
178
-     */
179
-    private function __construct(
180
-        EE_Registry $registry,
181
-        LoaderInterface $loader,
182
-        RequestInterface $request,
183
-        EE_Maintenance_Mode $maintenance_mode
184
-    ) {
185
-        $this->registry = $registry;
186
-        $this->loader = $loader;
187
-        $this->request = $request;
188
-        $this->maintenance_mode = $maintenance_mode;
189
-        do_action('AHEE__EE_System__construct__begin', $this);
190
-        add_action(
191
-            'AHEE__EE_Bootstrap__load_espresso_addons',
192
-            array($this, 'loadCapabilities'),
193
-            5
194
-        );
195
-        add_action(
196
-            'AHEE__EE_Bootstrap__load_espresso_addons',
197
-            array($this, 'loadCommandBus'),
198
-            7
199
-        );
200
-        add_action(
201
-            'AHEE__EE_Bootstrap__load_espresso_addons',
202
-            array($this, 'loadPluginApi'),
203
-            9
204
-        );
205
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
-        add_action(
207
-            'AHEE__EE_Bootstrap__load_espresso_addons',
208
-            array($this, 'load_espresso_addons')
209
-        );
210
-        // when an ee addon is activated, we want to call the core hook(s) again
211
-        // because the newly-activated addon didn't get a chance to run at all
212
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
-        // detect whether install or upgrade
214
-        add_action(
215
-            'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
-            array($this, 'detect_activations_or_upgrades'),
217
-            3
218
-        );
219
-        // load EE_Config, EE_Textdomain, etc
220
-        add_action(
221
-            'AHEE__EE_Bootstrap__load_core_configuration',
222
-            array($this, 'load_core_configuration'),
223
-            5
224
-        );
225
-        // load EE_Config, EE_Textdomain, etc
226
-        add_action(
227
-            'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
228
-            array($this, 'register_shortcodes_modules_and_widgets'),
229
-            7
230
-        );
231
-        // you wanna get going? I wanna get going... let's get going!
232
-        add_action(
233
-            'AHEE__EE_Bootstrap__brew_espresso',
234
-            array($this, 'brew_espresso'),
235
-            9
236
-        );
237
-        // other housekeeping
238
-        // exclude EE critical pages from wp_list_pages
239
-        add_filter(
240
-            'wp_list_pages_excludes',
241
-            array($this, 'remove_pages_from_wp_list_pages'),
242
-            10
243
-        );
244
-        // ALL EE Addons should use the following hook point to attach their initial setup too
245
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
246
-        do_action('AHEE__EE_System__construct__complete', $this);
247
-    }
248
-
249
-
250
-    /**
251
-     * load and setup EE_Capabilities
252
-     *
253
-     * @return void
254
-     * @throws EE_Error
255
-     */
256
-    public function loadCapabilities()
257
-    {
258
-        $this->capabilities = $this->loader->getShared('EE_Capabilities');
259
-        add_action(
260
-            'AHEE__EE_Capabilities__init_caps__before_initialization',
261
-            function () {
262
-                LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
263
-            }
264
-        );
265
-    }
266
-
267
-
268
-    /**
269
-     * create and cache the CommandBus, and also add middleware
270
-     * The CapChecker middleware requires the use of EE_Capabilities
271
-     * which is why we need to load the CommandBus after Caps are set up
272
-     *
273
-     * @return void
274
-     * @throws EE_Error
275
-     */
276
-    public function loadCommandBus()
277
-    {
278
-        $this->loader->getShared(
279
-            'CommandBusInterface',
280
-            array(
281
-                null,
282
-                apply_filters(
283
-                    'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
284
-                    array(
285
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
286
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
287
-                    )
288
-                ),
289
-            )
290
-        );
291
-    }
292
-
293
-
294
-    /**
295
-     * @return void
296
-     * @throws EE_Error
297
-     */
298
-    public function loadPluginApi()
299
-    {
300
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
301
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
302
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
303
-        $this->loader->getShared('EE_Request_Handler');
304
-    }
305
-
306
-
307
-    /**
308
-     * @param string $addon_name
309
-     * @param string $version_constant
310
-     * @param string $min_version_required
311
-     * @param string $load_callback
312
-     * @param string $plugin_file_constant
313
-     * @return void
314
-     */
315
-    private function deactivateIncompatibleAddon(
316
-        $addon_name,
317
-        $version_constant,
318
-        $min_version_required,
319
-        $load_callback,
320
-        $plugin_file_constant
321
-    ) {
322
-        if (! defined($version_constant)) {
323
-            return;
324
-        }
325
-        $addon_version = constant($version_constant);
326
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
327
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
328
-            if (! function_exists('deactivate_plugins')) {
329
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
330
-            }
331
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
332
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
333
-            EE_Error::add_error(
334
-                sprintf(
335
-                    esc_html__(
336
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
337
-                        'event_espresso'
338
-                    ),
339
-                    $addon_name,
340
-                    $min_version_required
341
-                ),
342
-                __FILE__,
343
-                __FUNCTION__ . "({$addon_name})",
344
-                __LINE__
345
-            );
346
-            EE_Error::get_notices(false, true);
347
-        }
348
-    }
349
-
350
-
351
-    /**
352
-     * load_espresso_addons
353
-     * allow addons to load first so that they can set hooks for running DMS's, etc
354
-     * this is hooked into both:
355
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
356
-     *        which runs during the WP 'plugins_loaded' action at priority 5
357
-     *    and the WP 'activate_plugin' hook point
358
-     *
359
-     * @access public
360
-     * @return void
361
-     */
362
-    public function load_espresso_addons()
363
-    {
364
-        $this->deactivateIncompatibleAddon(
365
-            'Wait Lists',
366
-            'EE_WAIT_LISTS_VERSION',
367
-            '1.0.0.beta.074',
368
-            'load_espresso_wait_lists',
369
-            'EE_WAIT_LISTS_PLUGIN_FILE'
370
-        );
371
-        $this->deactivateIncompatibleAddon(
372
-            'Automated Upcoming Event Notifications',
373
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
374
-            '1.0.0.beta.091',
375
-            'load_espresso_automated_upcoming_event_notification',
376
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
377
-        );
378
-        do_action('AHEE__EE_System__load_espresso_addons');
379
-        // if the WP API basic auth plugin isn't already loaded, load it now.
380
-        // We want it for mobile apps. Just include the entire plugin
381
-        // also, don't load the basic auth when a plugin is getting activated, because
382
-        // it could be the basic auth plugin, and it doesn't check if its methods are already defined
383
-        // and causes a fatal error
384
-        if ($this->request->getRequestParam('activate') !== 'true'
385
-            && ! function_exists('json_basic_auth_handler')
386
-            && ! function_exists('json_basic_auth_error')
387
-            && ! in_array(
388
-                $this->request->getRequestParam('action'),
389
-                array('activate', 'activate-selected'),
390
-                true
391
-            )
392
-        ) {
393
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
394
-        }
395
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
396
-    }
397
-
398
-
399
-    /**
400
-     * detect_activations_or_upgrades
401
-     * Checks for activation or upgrade of core first;
402
-     * then also checks if any registered addons have been activated or upgraded
403
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
404
-     * which runs during the WP 'plugins_loaded' action at priority 3
405
-     *
406
-     * @access public
407
-     * @return void
408
-     */
409
-    public function detect_activations_or_upgrades()
410
-    {
411
-        // first off: let's make sure to handle core
412
-        $this->detect_if_activation_or_upgrade();
413
-        foreach ($this->registry->addons as $addon) {
414
-            if ($addon instanceof EE_Addon) {
415
-                // detect teh request type for that addon
416
-                $addon->detect_activation_or_upgrade();
417
-            }
418
-        }
419
-    }
420
-
421
-
422
-    /**
423
-     * detect_if_activation_or_upgrade
424
-     * Takes care of detecting whether this is a brand new install or code upgrade,
425
-     * and either setting up the DB or setting up maintenance mode etc.
426
-     *
427
-     * @access public
428
-     * @return void
429
-     */
430
-    public function detect_if_activation_or_upgrade()
431
-    {
432
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
433
-        // check if db has been updated, or if its a brand-new installation
434
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
435
-        $request_type = $this->detect_req_type($espresso_db_update);
436
-        // EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
437
-        switch ($request_type) {
438
-            case EE_System::req_type_new_activation:
439
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
440
-                $this->_handle_core_version_change($espresso_db_update);
441
-                break;
442
-            case EE_System::req_type_reactivation:
443
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
444
-                $this->_handle_core_version_change($espresso_db_update);
445
-                break;
446
-            case EE_System::req_type_upgrade:
447
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
448
-                // migrations may be required now that we've upgraded
449
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
450
-                $this->_handle_core_version_change($espresso_db_update);
451
-                break;
452
-            case EE_System::req_type_downgrade:
453
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
454
-                // its possible migrations are no longer required
455
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
456
-                $this->_handle_core_version_change($espresso_db_update);
457
-                break;
458
-            case EE_System::req_type_normal:
459
-            default:
460
-                break;
461
-        }
462
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
463
-    }
464
-
465
-
466
-    /**
467
-     * Updates the list of installed versions and sets hooks for
468
-     * initializing the database later during the request
469
-     *
470
-     * @param array $espresso_db_update
471
-     */
472
-    private function _handle_core_version_change($espresso_db_update)
473
-    {
474
-        $this->update_list_of_installed_versions($espresso_db_update);
475
-        // get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
476
-        add_action(
477
-            'AHEE__EE_System__perform_activations_upgrades_and_migrations',
478
-            array($this, 'initialize_db_if_no_migrations_required')
479
-        );
480
-    }
481
-
482
-
483
-    /**
484
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
485
-     * information about what versions of EE have been installed and activated,
486
-     * NOT necessarily the state of the database
487
-     *
488
-     * @param mixed $espresso_db_update           the value of the WordPress option.
489
-     *                                            If not supplied, fetches it from the options table
490
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
491
-     */
492
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
493
-    {
494
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
495
-        if (! $espresso_db_update) {
496
-            $espresso_db_update = get_option('espresso_db_update');
497
-        }
498
-        // check that option is an array
499
-        if (! is_array($espresso_db_update)) {
500
-            // if option is FALSE, then it never existed
501
-            if ($espresso_db_update === false) {
502
-                // make $espresso_db_update an array and save option with autoload OFF
503
-                $espresso_db_update = array();
504
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
505
-            } else {
506
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
507
-                $espresso_db_update = array($espresso_db_update => array());
508
-                update_option('espresso_db_update', $espresso_db_update);
509
-            }
510
-        } else {
511
-            $corrected_db_update = array();
512
-            // if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
513
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
514
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
515
-                    // the key is an int, and the value IS NOT an array
516
-                    // so it must be numerically-indexed, where values are versions installed...
517
-                    // fix it!
518
-                    $version_string = $should_be_array;
519
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
520
-                } else {
521
-                    // ok it checks out
522
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
523
-                }
524
-            }
525
-            $espresso_db_update = $corrected_db_update;
526
-            update_option('espresso_db_update', $espresso_db_update);
527
-        }
528
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
529
-        return $espresso_db_update;
530
-    }
531
-
532
-
533
-    /**
534
-     * Does the traditional work of setting up the plugin's database and adding default data.
535
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
536
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
537
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
538
-     * so that it will be done when migrations are finished
539
-     *
540
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
541
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
542
-     *                                       This is a resource-intensive job
543
-     *                                       so we prefer to only do it when necessary
544
-     * @return void
545
-     * @throws EE_Error
546
-     */
547
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
548
-    {
549
-        $request_type = $this->detect_req_type();
550
-        // only initialize system if we're not in maintenance mode.
551
-        if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
552
-            /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
553
-            $rewrite_rules = $this->loader->getShared(
554
-                'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
555
-            );
556
-            $rewrite_rules->flush();
557
-            if ($verify_schema) {
558
-                EEH_Activation::initialize_db_and_folders();
559
-            }
560
-            EEH_Activation::initialize_db_content();
561
-            EEH_Activation::system_initialization();
562
-            if ($initialize_addons_too) {
563
-                $this->initialize_addons();
564
-            }
565
-        } else {
566
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
567
-        }
568
-        if ($request_type === EE_System::req_type_new_activation
569
-            || $request_type === EE_System::req_type_reactivation
570
-            || (
571
-                $request_type === EE_System::req_type_upgrade
572
-                && $this->is_major_version_change()
573
-            )
574
-        ) {
575
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
576
-        }
577
-    }
578
-
579
-
580
-    /**
581
-     * Initializes the db for all registered addons
582
-     *
583
-     * @throws EE_Error
584
-     */
585
-    public function initialize_addons()
586
-    {
587
-        // foreach registered addon, make sure its db is up-to-date too
588
-        foreach ($this->registry->addons as $addon) {
589
-            if ($addon instanceof EE_Addon) {
590
-                $addon->initialize_db_if_no_migrations_required();
591
-            }
592
-        }
593
-    }
594
-
595
-
596
-    /**
597
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
598
-     *
599
-     * @param    array  $version_history
600
-     * @param    string $current_version_to_add version to be added to the version history
601
-     * @return    boolean success as to whether or not this option was changed
602
-     */
603
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
604
-    {
605
-        if (! $version_history) {
606
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
607
-        }
608
-        if ($current_version_to_add === null) {
609
-            $current_version_to_add = espresso_version();
610
-        }
611
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
612
-        // re-save
613
-        return update_option('espresso_db_update', $version_history);
614
-    }
615
-
616
-
617
-    /**
618
-     * Detects if the current version indicated in the has existed in the list of
619
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
620
-     *
621
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
622
-     *                                  If not supplied, fetches it from the options table.
623
-     *                                  Also, caches its result so later parts of the code can also know whether
624
-     *                                  there's been an update or not. This way we can add the current version to
625
-     *                                  espresso_db_update, but still know if this is a new install or not
626
-     * @return int one of the constants on EE_System::req_type_
627
-     */
628
-    public function detect_req_type($espresso_db_update = null)
629
-    {
630
-        if ($this->_req_type === null) {
631
-            $espresso_db_update = ! empty($espresso_db_update)
632
-                ? $espresso_db_update
633
-                : $this->fix_espresso_db_upgrade_option();
634
-            $this->_req_type = EE_System::detect_req_type_given_activation_history(
635
-                $espresso_db_update,
636
-                'ee_espresso_activation',
637
-                espresso_version()
638
-            );
639
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
640
-            $this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
641
-        }
642
-        return $this->_req_type;
643
-    }
644
-
645
-
646
-    /**
647
-     * Returns whether or not there was a non-micro version change (ie, change in either
648
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
649
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
650
-     *
651
-     * @param $activation_history
652
-     * @return bool
653
-     */
654
-    private function _detect_major_version_change($activation_history)
655
-    {
656
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
657
-        $previous_version_parts = explode('.', $previous_version);
658
-        $current_version_parts = explode('.', espresso_version());
659
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
660
-               && ($previous_version_parts[0] !== $current_version_parts[0]
661
-                   || $previous_version_parts[1] !== $current_version_parts[1]
662
-               );
663
-    }
664
-
665
-
666
-    /**
667
-     * Returns true if either the major or minor version of EE changed during this request.
668
-     * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
669
-     *
670
-     * @return bool
671
-     */
672
-    public function is_major_version_change()
673
-    {
674
-        return $this->_major_version_change;
675
-    }
676
-
677
-
678
-    /**
679
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
680
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
681
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
682
-     * just activated to (for core that will always be espresso_version())
683
-     *
684
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
685
-     *                                                 ee plugin. for core that's 'espresso_db_update'
686
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
687
-     *                                                 indicate that this plugin was just activated
688
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
689
-     *                                                 espresso_version())
690
-     * @return int one of the constants on EE_System::req_type_*
691
-     */
692
-    public static function detect_req_type_given_activation_history(
693
-        $activation_history_for_addon,
694
-        $activation_indicator_option_name,
695
-        $version_to_upgrade_to
696
-    ) {
697
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
698
-        if ($activation_history_for_addon) {
699
-            // it exists, so this isn't a completely new install
700
-            // check if this version already in that list of previously installed versions
701
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
702
-                // it a version we haven't seen before
703
-                if ($version_is_higher === 1) {
704
-                    $req_type = EE_System::req_type_upgrade;
705
-                } else {
706
-                    $req_type = EE_System::req_type_downgrade;
707
-                }
708
-                delete_option($activation_indicator_option_name);
709
-            } else {
710
-                // its not an update. maybe a reactivation?
711
-                if (get_option($activation_indicator_option_name, false)) {
712
-                    if ($version_is_higher === -1) {
713
-                        $req_type = EE_System::req_type_downgrade;
714
-                    } elseif ($version_is_higher === 0) {
715
-                        // we've seen this version before, but it's an activation. must be a reactivation
716
-                        $req_type = EE_System::req_type_reactivation;
717
-                    } else {// $version_is_higher === 1
718
-                        $req_type = EE_System::req_type_upgrade;
719
-                    }
720
-                    delete_option($activation_indicator_option_name);
721
-                } else {
722
-                    // we've seen this version before and the activation indicate doesn't show it was just activated
723
-                    if ($version_is_higher === -1) {
724
-                        $req_type = EE_System::req_type_downgrade;
725
-                    } elseif ($version_is_higher === 0) {
726
-                        // we've seen this version before and it's not an activation. its normal request
727
-                        $req_type = EE_System::req_type_normal;
728
-                    } else {// $version_is_higher === 1
729
-                        $req_type = EE_System::req_type_upgrade;
730
-                    }
731
-                }
732
-            }
733
-        } else {
734
-            // brand new install
735
-            $req_type = EE_System::req_type_new_activation;
736
-            delete_option($activation_indicator_option_name);
737
-        }
738
-        return $req_type;
739
-    }
740
-
741
-
742
-    /**
743
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
744
-     * the $activation_history_for_addon
745
-     *
746
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
747
-     *                                             sometimes containing 'unknown-date'
748
-     * @param string $version_to_upgrade_to        (current version)
749
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
750
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
751
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
752
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
753
-     */
754
-    private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
755
-    {
756
-        // find the most recently-activated version
757
-        $most_recently_active_version =
758
-            EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
759
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
760
-    }
761
-
762
-
763
-    /**
764
-     * Gets the most recently active version listed in the activation history,
765
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
766
-     *
767
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
768
-     *                                   sometimes containing 'unknown-date'
769
-     * @return string
770
-     */
771
-    private static function _get_most_recently_active_version_from_activation_history($activation_history)
772
-    {
773
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
774
-        $most_recently_active_version = '0.0.0.dev.000';
775
-        if (is_array($activation_history)) {
776
-            foreach ($activation_history as $version => $times_activated) {
777
-                // check there is a record of when this version was activated. Otherwise,
778
-                // mark it as unknown
779
-                if (! $times_activated) {
780
-                    $times_activated = array('unknown-date');
781
-                }
782
-                if (is_string($times_activated)) {
783
-                    $times_activated = array($times_activated);
784
-                }
785
-                foreach ($times_activated as $an_activation) {
786
-                    if ($an_activation !== 'unknown-date'
787
-                        && $an_activation
788
-                           > $most_recently_active_version_activation) {
789
-                        $most_recently_active_version = $version;
790
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
791
-                            ? '1970-01-01 00:00:00'
792
-                            : $an_activation;
793
-                    }
794
-                }
795
-            }
796
-        }
797
-        return $most_recently_active_version;
798
-    }
799
-
800
-
801
-    /**
802
-     * This redirects to the about EE page after activation
803
-     *
804
-     * @return void
805
-     */
806
-    public function redirect_to_about_ee()
807
-    {
808
-        $notices = EE_Error::get_notices(false);
809
-        // if current user is an admin and it's not an ajax or rest request
810
-        if (! isset($notices['errors'])
811
-            && $this->request->isAdmin()
812
-            && apply_filters(
813
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
814
-                $this->capabilities->current_user_can('manage_options', 'espresso_about_default')
815
-            )
816
-        ) {
817
-            $query_params = array('page' => 'espresso_about');
818
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
819
-                $query_params['new_activation'] = true;
820
-            }
821
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
822
-                $query_params['reactivation'] = true;
823
-            }
824
-            $url = add_query_arg($query_params, admin_url('admin.php'));
825
-            wp_safe_redirect($url);
826
-            exit();
827
-        }
828
-    }
829
-
830
-
831
-    /**
832
-     * load_core_configuration
833
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
834
-     * which runs during the WP 'plugins_loaded' action at priority 5
835
-     *
836
-     * @return void
837
-     * @throws ReflectionException
838
-     */
839
-    public function load_core_configuration()
840
-    {
841
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
842
-        $this->loader->getShared('EE_Load_Textdomain');
843
-        // load textdomain
844
-        EE_Load_Textdomain::load_textdomain();
845
-        // load and setup EE_Config and EE_Network_Config
846
-        $config = $this->loader->getShared('EE_Config');
847
-        $this->loader->getShared('EE_Network_Config');
848
-        // setup autoloaders
849
-        // enable logging?
850
-        if ($config->admin->use_full_logging) {
851
-            $this->loader->getShared('EE_Log');
852
-        }
853
-        // check for activation errors
854
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
855
-        if ($activation_errors) {
856
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
857
-            update_option('ee_plugin_activation_errors', false);
858
-        }
859
-        // get model names
860
-        $this->_parse_model_names();
861
-        // load caf stuff a chance to play during the activation process too.
862
-        $this->_maybe_brew_regular();
863
-        // configure custom post type definitions
864
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
865
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
866
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
867
-    }
868
-
869
-
870
-    /**
871
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
872
-     *
873
-     * @return void
874
-     * @throws ReflectionException
875
-     */
876
-    private function _parse_model_names()
877
-    {
878
-        // get all the files in the EE_MODELS folder that end in .model.php
879
-        $models = glob(EE_MODELS . '*.model.php');
880
-        $model_names = array();
881
-        $non_abstract_db_models = array();
882
-        foreach ($models as $model) {
883
-            // get model classname
884
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
885
-            $short_name = str_replace('EEM_', '', $classname);
886
-            $reflectionClass = new ReflectionClass($classname);
887
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
888
-                $non_abstract_db_models[ $short_name ] = $classname;
889
-            }
890
-            $model_names[ $short_name ] = $classname;
891
-        }
892
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
893
-        $this->registry->non_abstract_db_models = apply_filters(
894
-            'FHEE__EE_System__parse_implemented_model_names',
895
-            $non_abstract_db_models
896
-        );
897
-    }
898
-
899
-
900
-    /**
901
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
902
-     * that need to be setup before our EE_System launches.
903
-     *
904
-     * @return void
905
-     * @throws DomainException
906
-     * @throws InvalidArgumentException
907
-     * @throws InvalidDataTypeException
908
-     * @throws InvalidInterfaceException
909
-     * @throws InvalidClassException
910
-     * @throws InvalidFilePathException
911
-     */
912
-    private function _maybe_brew_regular()
913
-    {
914
-        /** @var Domain $domain */
915
-        $domain = DomainFactory::getShared(
916
-            new FullyQualifiedName(
917
-                'EventEspresso\core\domain\Domain'
918
-            ),
919
-            array(
920
-                new FilePath(EVENT_ESPRESSO_MAIN_FILE),
921
-                Version::fromString(espresso_version()),
922
-            )
923
-        );
924
-        if ($domain->isCaffeinated()) {
925
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
926
-        }
927
-    }
928
-
929
-
930
-    /**
931
-     * register_shortcodes_modules_and_widgets
932
-     * generate lists of shortcodes and modules, then verify paths and classes
933
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
934
-     * which runs during the WP 'plugins_loaded' action at priority 7
935
-     *
936
-     * @access public
937
-     * @return void
938
-     * @throws Exception
939
-     */
940
-    public function register_shortcodes_modules_and_widgets()
941
-    {
942
-        try {
943
-            // load, register, and add shortcodes the new way
944
-            if ($this->request->isFrontend() || $this->request->isIframe()) {
945
-                $this->loader->getShared(
946
-                    'EventEspresso\core\services\shortcodes\ShortcodesManager',
947
-                    array(
948
-                        // and the old way, but we'll put it under control of the new system
949
-                        EE_Config::getLegacyShortcodesManager(),
950
-                    )
951
-                );
952
-            }
953
-        } catch (Exception $exception) {
954
-            new ExceptionStackTraceDisplay($exception);
955
-        }
956
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
957
-        // check for addons using old hook point
958
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
959
-            $this->_incompatible_addon_error();
960
-        }
961
-    }
962
-
963
-
964
-    /**
965
-     * _incompatible_addon_error
966
-     *
967
-     * @access public
968
-     * @return void
969
-     */
970
-    private function _incompatible_addon_error()
971
-    {
972
-        // get array of classes hooking into here
973
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
974
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
975
-        );
976
-        if (! empty($class_names)) {
977
-            $msg = __(
978
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
979
-                'event_espresso'
980
-            );
981
-            $msg .= '<ul>';
982
-            foreach ($class_names as $class_name) {
983
-                $msg .= '<li><b>Event Espresso - '
984
-                        . str_replace(
985
-                            array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
986
-                            '',
987
-                            $class_name
988
-                        ) . '</b></li>';
989
-            }
990
-            $msg .= '</ul>';
991
-            $msg .= __(
992
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
993
-                'event_espresso'
994
-            );
995
-            // save list of incompatible addons to wp-options for later use
996
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
997
-            if (is_admin()) {
998
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
999
-            }
1000
-        }
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * brew_espresso
1006
-     * begins the process of setting hooks for initializing EE in the correct order
1007
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1008
-     * which runs during the WP 'plugins_loaded' action at priority 9
1009
-     *
1010
-     * @return void
1011
-     */
1012
-    public function brew_espresso()
1013
-    {
1014
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
1015
-        // load some final core systems
1016
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
1017
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1018
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
1019
-        add_action('init', array($this, 'load_controllers'), 7);
1020
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
1021
-        add_action('init', array($this, 'initialize'), 10);
1022
-        add_action('init', array($this, 'initialize_last'), 100);
1023
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1024
-            // pew pew pew
1025
-            $this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1026
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1027
-        }
1028
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
1029
-    }
1030
-
1031
-
1032
-    /**
1033
-     *    set_hooks_for_core
1034
-     *
1035
-     * @access public
1036
-     * @return    void
1037
-     * @throws EE_Error
1038
-     */
1039
-    public function set_hooks_for_core()
1040
-    {
1041
-        $this->_deactivate_incompatible_addons();
1042
-        do_action('AHEE__EE_System__set_hooks_for_core');
1043
-        $this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1044
-        // caps need to be initialized on every request so that capability maps are set.
1045
-        // @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1046
-        $this->registry->CAP->init_caps();
1047
-    }
1048
-
1049
-
1050
-    /**
1051
-     * Using the information gathered in EE_System::_incompatible_addon_error,
1052
-     * deactivates any addons considered incompatible with the current version of EE
1053
-     */
1054
-    private function _deactivate_incompatible_addons()
1055
-    {
1056
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
1057
-        if (! empty($incompatible_addons)) {
1058
-            $active_plugins = get_option('active_plugins', array());
1059
-            foreach ($active_plugins as $active_plugin) {
1060
-                foreach ($incompatible_addons as $incompatible_addon) {
1061
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
1062
-                        unset($_GET['activate']);
1063
-                        espresso_deactivate_plugin($active_plugin);
1064
-                    }
1065
-                }
1066
-            }
1067
-        }
1068
-    }
1069
-
1070
-
1071
-    /**
1072
-     *    perform_activations_upgrades_and_migrations
1073
-     *
1074
-     * @access public
1075
-     * @return    void
1076
-     */
1077
-    public function perform_activations_upgrades_and_migrations()
1078
-    {
1079
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1080
-    }
1081
-
1082
-
1083
-    /**
1084
-     * @return void
1085
-     * @throws DomainException
1086
-     */
1087
-    public function load_CPTs_and_session()
1088
-    {
1089
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
1090
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1091
-        $register_custom_taxonomies = $this->loader->getShared(
1092
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1093
-        );
1094
-        $register_custom_taxonomies->registerCustomTaxonomies();
1095
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1096
-        $register_custom_post_types = $this->loader->getShared(
1097
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1098
-        );
1099
-        $register_custom_post_types->registerCustomPostTypes();
1100
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1101
-        $register_custom_taxonomy_terms = $this->loader->getShared(
1102
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1103
-        );
1104
-        $register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1105
-        // load legacy Custom Post Types and Taxonomies
1106
-        $this->loader->getShared('EE_Register_CPTs');
1107
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1108
-    }
1109
-
1110
-
1111
-    /**
1112
-     * load_controllers
1113
-     * this is the best place to load any additional controllers that needs access to EE core.
1114
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1115
-     * time
1116
-     *
1117
-     * @access public
1118
-     * @return void
1119
-     */
1120
-    public function load_controllers()
1121
-    {
1122
-        do_action('AHEE__EE_System__load_controllers__start');
1123
-        // let's get it started
1124
-        if (! $this->maintenance_mode->level()
1125
-            && ($this->request->isFrontend() || $this->request->isFrontAjax())
1126
-        ) {
1127
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1128
-            $this->loader->getShared('EE_Front_Controller');
1129
-        } elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1130
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1131
-            $this->loader->getShared('EE_Admin');
1132
-        }
1133
-        do_action('AHEE__EE_System__load_controllers__complete');
1134
-    }
1135
-
1136
-
1137
-    /**
1138
-     * core_loaded_and_ready
1139
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1140
-     *
1141
-     * @access public
1142
-     * @return void
1143
-     * @throws Exception
1144
-     */
1145
-    public function core_loaded_and_ready()
1146
-    {
1147
-        if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1148
-            try {
1149
-                $this->loader->getShared('EventEspresso\core\services\assets\Registry');
1150
-                $this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1151
-                if (function_exists('register_block_type')) {
1152
-                    $this->loader->getShared(
1153
-                        'EventEspresso\core\services\editor\BlockRegistrationManager'
1154
-                    );
1155
-                }
1156
-            } catch (Exception $exception) {
1157
-                new ExceptionStackTraceDisplay($exception);
1158
-            }
1159
-        }
1160
-        if ($this->request->isAdmin()
1161
-            || $this->request->isEeAjax()
1162
-            || $this->request->isFrontend()
1163
-        ) {
1164
-            $this->loader->getShared('EE_Session');
1165
-        }
1166
-        do_action('AHEE__EE_System__core_loaded_and_ready');
1167
-        // load_espresso_template_tags
1168
-        if (is_readable(EE_PUBLIC . 'template_tags.php')
1169
-            && ($this->request->isFrontend()
1170
-                || $this->request->isAdmin()
1171
-                || $this->request->isIframe()
1172
-                || $this->request->isFeed()
1173
-            )
1174
-        ) {
1175
-            require_once EE_PUBLIC . 'template_tags.php';
1176
-        }
1177
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1178
-    }
1179
-
1180
-
1181
-    /**
1182
-     * initialize
1183
-     * this is the best place to begin initializing client code
1184
-     *
1185
-     * @access public
1186
-     * @return void
1187
-     */
1188
-    public function initialize()
1189
-    {
1190
-        do_action('AHEE__EE_System__initialize');
1191
-    }
1192
-
1193
-
1194
-    /**
1195
-     * initialize_last
1196
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1197
-     * initialize has done so
1198
-     *
1199
-     * @access public
1200
-     * @return void
1201
-     */
1202
-    public function initialize_last()
1203
-    {
1204
-        do_action('AHEE__EE_System__initialize_last');
1205
-        /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1206
-        $rewrite_rules = $this->loader->getShared(
1207
-            'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1208
-        );
1209
-        $rewrite_rules->flushRewriteRules();
1210
-        add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1211
-        if (($this->request->isAjax() || $this->request->isAdmin())
1212
-            && $this->maintenance_mode->models_can_query()) {
1213
-            $this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1214
-            $this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1215
-        }
1216
-    }
1217
-
1218
-
1219
-    /**
1220
-     * @return void
1221
-     * @throws EE_Error
1222
-     */
1223
-    public function addEspressoToolbar()
1224
-    {
1225
-        $this->loader->getShared(
1226
-            'EventEspresso\core\domain\services\admin\AdminToolBar',
1227
-            array($this->registry->CAP)
1228
-        );
1229
-    }
1230
-
1231
-
1232
-    /**
1233
-     * do_not_cache
1234
-     * sets no cache headers and defines no cache constants for WP plugins
1235
-     *
1236
-     * @access public
1237
-     * @return void
1238
-     */
1239
-    public static function do_not_cache()
1240
-    {
1241
-        // set no cache constants
1242
-        if (! defined('DONOTCACHEPAGE')) {
1243
-            define('DONOTCACHEPAGE', true);
1244
-        }
1245
-        if (! defined('DONOTCACHCEOBJECT')) {
1246
-            define('DONOTCACHCEOBJECT', true);
1247
-        }
1248
-        if (! defined('DONOTCACHEDB')) {
1249
-            define('DONOTCACHEDB', true);
1250
-        }
1251
-        // add no cache headers
1252
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1253
-        // plus a little extra for nginx and Google Chrome
1254
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1255
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1256
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1257
-    }
1258
-
1259
-
1260
-    /**
1261
-     *    extra_nocache_headers
1262
-     *
1263
-     * @access    public
1264
-     * @param $headers
1265
-     * @return    array
1266
-     */
1267
-    public static function extra_nocache_headers($headers)
1268
-    {
1269
-        // for NGINX
1270
-        $headers['X-Accel-Expires'] = 0;
1271
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1272
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1273
-        return $headers;
1274
-    }
1275
-
1276
-
1277
-    /**
1278
-     *    nocache_headers
1279
-     *
1280
-     * @access    public
1281
-     * @return    void
1282
-     */
1283
-    public static function nocache_headers()
1284
-    {
1285
-        nocache_headers();
1286
-    }
1287
-
1288
-
1289
-    /**
1290
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1291
-     * never returned with the function.
1292
-     *
1293
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1294
-     * @return array
1295
-     */
1296
-    public function remove_pages_from_wp_list_pages($exclude_array)
1297
-    {
1298
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1299
-    }
30
+	/**
31
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
+	 */
34
+	const req_type_normal = 0;
35
+
36
+	/**
37
+	 * Indicates this is a brand new installation of EE so we should install
38
+	 * tables and default data etc
39
+	 */
40
+	const req_type_new_activation = 1;
41
+
42
+	/**
43
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
45
+	 * and that default data is setup too
46
+	 */
47
+	const req_type_reactivation = 2;
48
+
49
+	/**
50
+	 * indicates that EE has been upgraded since its previous request.
51
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
52
+	 */
53
+	const req_type_upgrade = 3;
54
+
55
+	/**
56
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
+	 */
58
+	const req_type_downgrade = 4;
59
+
60
+	/**
61
+	 * @deprecated since version 4.6.0.dev.006
62
+	 * Now whenever a new_activation is detected the request type is still just
63
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
+	 * (Specifically, when the migration manager indicates migrations are finished
67
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
+	 */
69
+	const req_type_activation_but_not_installed = 5;
70
+
71
+	/**
72
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
+	 */
74
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
+
76
+	/**
77
+	 * @var EE_System $_instance
78
+	 */
79
+	private static $_instance;
80
+
81
+	/**
82
+	 * @var EE_Registry $registry
83
+	 */
84
+	private $registry;
85
+
86
+	/**
87
+	 * @var LoaderInterface $loader
88
+	 */
89
+	private $loader;
90
+
91
+	/**
92
+	 * @var EE_Capabilities $capabilities
93
+	 */
94
+	private $capabilities;
95
+
96
+	/**
97
+	 * @var RequestInterface $request
98
+	 */
99
+	private $request;
100
+
101
+	/**
102
+	 * @var EE_Maintenance_Mode $maintenance_mode
103
+	 */
104
+	private $maintenance_mode;
105
+
106
+	/**
107
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
+	 *
110
+	 * @var int $_req_type
111
+	 */
112
+	private $_req_type;
113
+
114
+	/**
115
+	 * Whether or not there was a non-micro version change in EE core version during this request
116
+	 *
117
+	 * @var boolean $_major_version_change
118
+	 */
119
+	private $_major_version_change = false;
120
+
121
+	/**
122
+	 * A Context DTO dedicated solely to identifying the current request type.
123
+	 *
124
+	 * @var RequestTypeContextCheckerInterface $request_type
125
+	 */
126
+	private $request_type;
127
+
128
+
129
+	/**
130
+	 * @singleton method used to instantiate class object
131
+	 * @param EE_Registry|null         $registry
132
+	 * @param LoaderInterface|null     $loader
133
+	 * @param RequestInterface|null    $request
134
+	 * @param EE_Maintenance_Mode|null $maintenance_mode
135
+	 * @return EE_System
136
+	 */
137
+	public static function instance(
138
+		EE_Registry $registry = null,
139
+		LoaderInterface $loader = null,
140
+		RequestInterface $request = null,
141
+		EE_Maintenance_Mode $maintenance_mode = null
142
+	) {
143
+		// check if class object is instantiated
144
+		if (! self::$_instance instanceof EE_System) {
145
+			self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
+		}
147
+		return self::$_instance;
148
+	}
149
+
150
+
151
+	/**
152
+	 * resets the instance and returns it
153
+	 *
154
+	 * @return EE_System
155
+	 */
156
+	public static function reset()
157
+	{
158
+		self::$_instance->_req_type = null;
159
+		// make sure none of the old hooks are left hanging around
160
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
+		// we need to reset the migration manager in order for it to detect DMSs properly
162
+		EE_Data_Migration_Manager::reset();
163
+		self::instance()->detect_activations_or_upgrades();
164
+		self::instance()->perform_activations_upgrades_and_migrations();
165
+		return self::instance();
166
+	}
167
+
168
+
169
+	/**
170
+	 * sets hooks for running rest of system
171
+	 * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
+	 * starting EE Addons from any other point may lead to problems
173
+	 *
174
+	 * @param EE_Registry         $registry
175
+	 * @param LoaderInterface     $loader
176
+	 * @param RequestInterface    $request
177
+	 * @param EE_Maintenance_Mode $maintenance_mode
178
+	 */
179
+	private function __construct(
180
+		EE_Registry $registry,
181
+		LoaderInterface $loader,
182
+		RequestInterface $request,
183
+		EE_Maintenance_Mode $maintenance_mode
184
+	) {
185
+		$this->registry = $registry;
186
+		$this->loader = $loader;
187
+		$this->request = $request;
188
+		$this->maintenance_mode = $maintenance_mode;
189
+		do_action('AHEE__EE_System__construct__begin', $this);
190
+		add_action(
191
+			'AHEE__EE_Bootstrap__load_espresso_addons',
192
+			array($this, 'loadCapabilities'),
193
+			5
194
+		);
195
+		add_action(
196
+			'AHEE__EE_Bootstrap__load_espresso_addons',
197
+			array($this, 'loadCommandBus'),
198
+			7
199
+		);
200
+		add_action(
201
+			'AHEE__EE_Bootstrap__load_espresso_addons',
202
+			array($this, 'loadPluginApi'),
203
+			9
204
+		);
205
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
+		add_action(
207
+			'AHEE__EE_Bootstrap__load_espresso_addons',
208
+			array($this, 'load_espresso_addons')
209
+		);
210
+		// when an ee addon is activated, we want to call the core hook(s) again
211
+		// because the newly-activated addon didn't get a chance to run at all
212
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
+		// detect whether install or upgrade
214
+		add_action(
215
+			'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
+			array($this, 'detect_activations_or_upgrades'),
217
+			3
218
+		);
219
+		// load EE_Config, EE_Textdomain, etc
220
+		add_action(
221
+			'AHEE__EE_Bootstrap__load_core_configuration',
222
+			array($this, 'load_core_configuration'),
223
+			5
224
+		);
225
+		// load EE_Config, EE_Textdomain, etc
226
+		add_action(
227
+			'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
228
+			array($this, 'register_shortcodes_modules_and_widgets'),
229
+			7
230
+		);
231
+		// you wanna get going? I wanna get going... let's get going!
232
+		add_action(
233
+			'AHEE__EE_Bootstrap__brew_espresso',
234
+			array($this, 'brew_espresso'),
235
+			9
236
+		);
237
+		// other housekeeping
238
+		// exclude EE critical pages from wp_list_pages
239
+		add_filter(
240
+			'wp_list_pages_excludes',
241
+			array($this, 'remove_pages_from_wp_list_pages'),
242
+			10
243
+		);
244
+		// ALL EE Addons should use the following hook point to attach their initial setup too
245
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
246
+		do_action('AHEE__EE_System__construct__complete', $this);
247
+	}
248
+
249
+
250
+	/**
251
+	 * load and setup EE_Capabilities
252
+	 *
253
+	 * @return void
254
+	 * @throws EE_Error
255
+	 */
256
+	public function loadCapabilities()
257
+	{
258
+		$this->capabilities = $this->loader->getShared('EE_Capabilities');
259
+		add_action(
260
+			'AHEE__EE_Capabilities__init_caps__before_initialization',
261
+			function () {
262
+				LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
263
+			}
264
+		);
265
+	}
266
+
267
+
268
+	/**
269
+	 * create and cache the CommandBus, and also add middleware
270
+	 * The CapChecker middleware requires the use of EE_Capabilities
271
+	 * which is why we need to load the CommandBus after Caps are set up
272
+	 *
273
+	 * @return void
274
+	 * @throws EE_Error
275
+	 */
276
+	public function loadCommandBus()
277
+	{
278
+		$this->loader->getShared(
279
+			'CommandBusInterface',
280
+			array(
281
+				null,
282
+				apply_filters(
283
+					'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
284
+					array(
285
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
286
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
287
+					)
288
+				),
289
+			)
290
+		);
291
+	}
292
+
293
+
294
+	/**
295
+	 * @return void
296
+	 * @throws EE_Error
297
+	 */
298
+	public function loadPluginApi()
299
+	{
300
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
301
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
302
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
303
+		$this->loader->getShared('EE_Request_Handler');
304
+	}
305
+
306
+
307
+	/**
308
+	 * @param string $addon_name
309
+	 * @param string $version_constant
310
+	 * @param string $min_version_required
311
+	 * @param string $load_callback
312
+	 * @param string $plugin_file_constant
313
+	 * @return void
314
+	 */
315
+	private function deactivateIncompatibleAddon(
316
+		$addon_name,
317
+		$version_constant,
318
+		$min_version_required,
319
+		$load_callback,
320
+		$plugin_file_constant
321
+	) {
322
+		if (! defined($version_constant)) {
323
+			return;
324
+		}
325
+		$addon_version = constant($version_constant);
326
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
327
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
328
+			if (! function_exists('deactivate_plugins')) {
329
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
330
+			}
331
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
332
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
333
+			EE_Error::add_error(
334
+				sprintf(
335
+					esc_html__(
336
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
337
+						'event_espresso'
338
+					),
339
+					$addon_name,
340
+					$min_version_required
341
+				),
342
+				__FILE__,
343
+				__FUNCTION__ . "({$addon_name})",
344
+				__LINE__
345
+			);
346
+			EE_Error::get_notices(false, true);
347
+		}
348
+	}
349
+
350
+
351
+	/**
352
+	 * load_espresso_addons
353
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
354
+	 * this is hooked into both:
355
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
356
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
357
+	 *    and the WP 'activate_plugin' hook point
358
+	 *
359
+	 * @access public
360
+	 * @return void
361
+	 */
362
+	public function load_espresso_addons()
363
+	{
364
+		$this->deactivateIncompatibleAddon(
365
+			'Wait Lists',
366
+			'EE_WAIT_LISTS_VERSION',
367
+			'1.0.0.beta.074',
368
+			'load_espresso_wait_lists',
369
+			'EE_WAIT_LISTS_PLUGIN_FILE'
370
+		);
371
+		$this->deactivateIncompatibleAddon(
372
+			'Automated Upcoming Event Notifications',
373
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
374
+			'1.0.0.beta.091',
375
+			'load_espresso_automated_upcoming_event_notification',
376
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
377
+		);
378
+		do_action('AHEE__EE_System__load_espresso_addons');
379
+		// if the WP API basic auth plugin isn't already loaded, load it now.
380
+		// We want it for mobile apps. Just include the entire plugin
381
+		// also, don't load the basic auth when a plugin is getting activated, because
382
+		// it could be the basic auth plugin, and it doesn't check if its methods are already defined
383
+		// and causes a fatal error
384
+		if ($this->request->getRequestParam('activate') !== 'true'
385
+			&& ! function_exists('json_basic_auth_handler')
386
+			&& ! function_exists('json_basic_auth_error')
387
+			&& ! in_array(
388
+				$this->request->getRequestParam('action'),
389
+				array('activate', 'activate-selected'),
390
+				true
391
+			)
392
+		) {
393
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
394
+		}
395
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
396
+	}
397
+
398
+
399
+	/**
400
+	 * detect_activations_or_upgrades
401
+	 * Checks for activation or upgrade of core first;
402
+	 * then also checks if any registered addons have been activated or upgraded
403
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
404
+	 * which runs during the WP 'plugins_loaded' action at priority 3
405
+	 *
406
+	 * @access public
407
+	 * @return void
408
+	 */
409
+	public function detect_activations_or_upgrades()
410
+	{
411
+		// first off: let's make sure to handle core
412
+		$this->detect_if_activation_or_upgrade();
413
+		foreach ($this->registry->addons as $addon) {
414
+			if ($addon instanceof EE_Addon) {
415
+				// detect teh request type for that addon
416
+				$addon->detect_activation_or_upgrade();
417
+			}
418
+		}
419
+	}
420
+
421
+
422
+	/**
423
+	 * detect_if_activation_or_upgrade
424
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
425
+	 * and either setting up the DB or setting up maintenance mode etc.
426
+	 *
427
+	 * @access public
428
+	 * @return void
429
+	 */
430
+	public function detect_if_activation_or_upgrade()
431
+	{
432
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
433
+		// check if db has been updated, or if its a brand-new installation
434
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
435
+		$request_type = $this->detect_req_type($espresso_db_update);
436
+		// EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
437
+		switch ($request_type) {
438
+			case EE_System::req_type_new_activation:
439
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
440
+				$this->_handle_core_version_change($espresso_db_update);
441
+				break;
442
+			case EE_System::req_type_reactivation:
443
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
444
+				$this->_handle_core_version_change($espresso_db_update);
445
+				break;
446
+			case EE_System::req_type_upgrade:
447
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
448
+				// migrations may be required now that we've upgraded
449
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
450
+				$this->_handle_core_version_change($espresso_db_update);
451
+				break;
452
+			case EE_System::req_type_downgrade:
453
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
454
+				// its possible migrations are no longer required
455
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
456
+				$this->_handle_core_version_change($espresso_db_update);
457
+				break;
458
+			case EE_System::req_type_normal:
459
+			default:
460
+				break;
461
+		}
462
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
463
+	}
464
+
465
+
466
+	/**
467
+	 * Updates the list of installed versions and sets hooks for
468
+	 * initializing the database later during the request
469
+	 *
470
+	 * @param array $espresso_db_update
471
+	 */
472
+	private function _handle_core_version_change($espresso_db_update)
473
+	{
474
+		$this->update_list_of_installed_versions($espresso_db_update);
475
+		// get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
476
+		add_action(
477
+			'AHEE__EE_System__perform_activations_upgrades_and_migrations',
478
+			array($this, 'initialize_db_if_no_migrations_required')
479
+		);
480
+	}
481
+
482
+
483
+	/**
484
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
485
+	 * information about what versions of EE have been installed and activated,
486
+	 * NOT necessarily the state of the database
487
+	 *
488
+	 * @param mixed $espresso_db_update           the value of the WordPress option.
489
+	 *                                            If not supplied, fetches it from the options table
490
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
491
+	 */
492
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
493
+	{
494
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
495
+		if (! $espresso_db_update) {
496
+			$espresso_db_update = get_option('espresso_db_update');
497
+		}
498
+		// check that option is an array
499
+		if (! is_array($espresso_db_update)) {
500
+			// if option is FALSE, then it never existed
501
+			if ($espresso_db_update === false) {
502
+				// make $espresso_db_update an array and save option with autoload OFF
503
+				$espresso_db_update = array();
504
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
505
+			} else {
506
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
507
+				$espresso_db_update = array($espresso_db_update => array());
508
+				update_option('espresso_db_update', $espresso_db_update);
509
+			}
510
+		} else {
511
+			$corrected_db_update = array();
512
+			// if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
513
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
514
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
515
+					// the key is an int, and the value IS NOT an array
516
+					// so it must be numerically-indexed, where values are versions installed...
517
+					// fix it!
518
+					$version_string = $should_be_array;
519
+					$corrected_db_update[ $version_string ] = array('unknown-date');
520
+				} else {
521
+					// ok it checks out
522
+					$corrected_db_update[ $should_be_version_string ] = $should_be_array;
523
+				}
524
+			}
525
+			$espresso_db_update = $corrected_db_update;
526
+			update_option('espresso_db_update', $espresso_db_update);
527
+		}
528
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
529
+		return $espresso_db_update;
530
+	}
531
+
532
+
533
+	/**
534
+	 * Does the traditional work of setting up the plugin's database and adding default data.
535
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
536
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
537
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
538
+	 * so that it will be done when migrations are finished
539
+	 *
540
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
541
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
542
+	 *                                       This is a resource-intensive job
543
+	 *                                       so we prefer to only do it when necessary
544
+	 * @return void
545
+	 * @throws EE_Error
546
+	 */
547
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
548
+	{
549
+		$request_type = $this->detect_req_type();
550
+		// only initialize system if we're not in maintenance mode.
551
+		if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
552
+			/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
553
+			$rewrite_rules = $this->loader->getShared(
554
+				'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
555
+			);
556
+			$rewrite_rules->flush();
557
+			if ($verify_schema) {
558
+				EEH_Activation::initialize_db_and_folders();
559
+			}
560
+			EEH_Activation::initialize_db_content();
561
+			EEH_Activation::system_initialization();
562
+			if ($initialize_addons_too) {
563
+				$this->initialize_addons();
564
+			}
565
+		} else {
566
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
567
+		}
568
+		if ($request_type === EE_System::req_type_new_activation
569
+			|| $request_type === EE_System::req_type_reactivation
570
+			|| (
571
+				$request_type === EE_System::req_type_upgrade
572
+				&& $this->is_major_version_change()
573
+			)
574
+		) {
575
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
576
+		}
577
+	}
578
+
579
+
580
+	/**
581
+	 * Initializes the db for all registered addons
582
+	 *
583
+	 * @throws EE_Error
584
+	 */
585
+	public function initialize_addons()
586
+	{
587
+		// foreach registered addon, make sure its db is up-to-date too
588
+		foreach ($this->registry->addons as $addon) {
589
+			if ($addon instanceof EE_Addon) {
590
+				$addon->initialize_db_if_no_migrations_required();
591
+			}
592
+		}
593
+	}
594
+
595
+
596
+	/**
597
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
598
+	 *
599
+	 * @param    array  $version_history
600
+	 * @param    string $current_version_to_add version to be added to the version history
601
+	 * @return    boolean success as to whether or not this option was changed
602
+	 */
603
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
604
+	{
605
+		if (! $version_history) {
606
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
607
+		}
608
+		if ($current_version_to_add === null) {
609
+			$current_version_to_add = espresso_version();
610
+		}
611
+		$version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
612
+		// re-save
613
+		return update_option('espresso_db_update', $version_history);
614
+	}
615
+
616
+
617
+	/**
618
+	 * Detects if the current version indicated in the has existed in the list of
619
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
620
+	 *
621
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
622
+	 *                                  If not supplied, fetches it from the options table.
623
+	 *                                  Also, caches its result so later parts of the code can also know whether
624
+	 *                                  there's been an update or not. This way we can add the current version to
625
+	 *                                  espresso_db_update, but still know if this is a new install or not
626
+	 * @return int one of the constants on EE_System::req_type_
627
+	 */
628
+	public function detect_req_type($espresso_db_update = null)
629
+	{
630
+		if ($this->_req_type === null) {
631
+			$espresso_db_update = ! empty($espresso_db_update)
632
+				? $espresso_db_update
633
+				: $this->fix_espresso_db_upgrade_option();
634
+			$this->_req_type = EE_System::detect_req_type_given_activation_history(
635
+				$espresso_db_update,
636
+				'ee_espresso_activation',
637
+				espresso_version()
638
+			);
639
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
640
+			$this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
641
+		}
642
+		return $this->_req_type;
643
+	}
644
+
645
+
646
+	/**
647
+	 * Returns whether or not there was a non-micro version change (ie, change in either
648
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
649
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
650
+	 *
651
+	 * @param $activation_history
652
+	 * @return bool
653
+	 */
654
+	private function _detect_major_version_change($activation_history)
655
+	{
656
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
657
+		$previous_version_parts = explode('.', $previous_version);
658
+		$current_version_parts = explode('.', espresso_version());
659
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
660
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
661
+				   || $previous_version_parts[1] !== $current_version_parts[1]
662
+			   );
663
+	}
664
+
665
+
666
+	/**
667
+	 * Returns true if either the major or minor version of EE changed during this request.
668
+	 * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
669
+	 *
670
+	 * @return bool
671
+	 */
672
+	public function is_major_version_change()
673
+	{
674
+		return $this->_major_version_change;
675
+	}
676
+
677
+
678
+	/**
679
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
680
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
681
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
682
+	 * just activated to (for core that will always be espresso_version())
683
+	 *
684
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
685
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
686
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
687
+	 *                                                 indicate that this plugin was just activated
688
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
689
+	 *                                                 espresso_version())
690
+	 * @return int one of the constants on EE_System::req_type_*
691
+	 */
692
+	public static function detect_req_type_given_activation_history(
693
+		$activation_history_for_addon,
694
+		$activation_indicator_option_name,
695
+		$version_to_upgrade_to
696
+	) {
697
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
698
+		if ($activation_history_for_addon) {
699
+			// it exists, so this isn't a completely new install
700
+			// check if this version already in that list of previously installed versions
701
+			if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
702
+				// it a version we haven't seen before
703
+				if ($version_is_higher === 1) {
704
+					$req_type = EE_System::req_type_upgrade;
705
+				} else {
706
+					$req_type = EE_System::req_type_downgrade;
707
+				}
708
+				delete_option($activation_indicator_option_name);
709
+			} else {
710
+				// its not an update. maybe a reactivation?
711
+				if (get_option($activation_indicator_option_name, false)) {
712
+					if ($version_is_higher === -1) {
713
+						$req_type = EE_System::req_type_downgrade;
714
+					} elseif ($version_is_higher === 0) {
715
+						// we've seen this version before, but it's an activation. must be a reactivation
716
+						$req_type = EE_System::req_type_reactivation;
717
+					} else {// $version_is_higher === 1
718
+						$req_type = EE_System::req_type_upgrade;
719
+					}
720
+					delete_option($activation_indicator_option_name);
721
+				} else {
722
+					// we've seen this version before and the activation indicate doesn't show it was just activated
723
+					if ($version_is_higher === -1) {
724
+						$req_type = EE_System::req_type_downgrade;
725
+					} elseif ($version_is_higher === 0) {
726
+						// we've seen this version before and it's not an activation. its normal request
727
+						$req_type = EE_System::req_type_normal;
728
+					} else {// $version_is_higher === 1
729
+						$req_type = EE_System::req_type_upgrade;
730
+					}
731
+				}
732
+			}
733
+		} else {
734
+			// brand new install
735
+			$req_type = EE_System::req_type_new_activation;
736
+			delete_option($activation_indicator_option_name);
737
+		}
738
+		return $req_type;
739
+	}
740
+
741
+
742
+	/**
743
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
744
+	 * the $activation_history_for_addon
745
+	 *
746
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
747
+	 *                                             sometimes containing 'unknown-date'
748
+	 * @param string $version_to_upgrade_to        (current version)
749
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
750
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
751
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
752
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
753
+	 */
754
+	private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
755
+	{
756
+		// find the most recently-activated version
757
+		$most_recently_active_version =
758
+			EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
759
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
760
+	}
761
+
762
+
763
+	/**
764
+	 * Gets the most recently active version listed in the activation history,
765
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
766
+	 *
767
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
768
+	 *                                   sometimes containing 'unknown-date'
769
+	 * @return string
770
+	 */
771
+	private static function _get_most_recently_active_version_from_activation_history($activation_history)
772
+	{
773
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
774
+		$most_recently_active_version = '0.0.0.dev.000';
775
+		if (is_array($activation_history)) {
776
+			foreach ($activation_history as $version => $times_activated) {
777
+				// check there is a record of when this version was activated. Otherwise,
778
+				// mark it as unknown
779
+				if (! $times_activated) {
780
+					$times_activated = array('unknown-date');
781
+				}
782
+				if (is_string($times_activated)) {
783
+					$times_activated = array($times_activated);
784
+				}
785
+				foreach ($times_activated as $an_activation) {
786
+					if ($an_activation !== 'unknown-date'
787
+						&& $an_activation
788
+						   > $most_recently_active_version_activation) {
789
+						$most_recently_active_version = $version;
790
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
791
+							? '1970-01-01 00:00:00'
792
+							: $an_activation;
793
+					}
794
+				}
795
+			}
796
+		}
797
+		return $most_recently_active_version;
798
+	}
799
+
800
+
801
+	/**
802
+	 * This redirects to the about EE page after activation
803
+	 *
804
+	 * @return void
805
+	 */
806
+	public function redirect_to_about_ee()
807
+	{
808
+		$notices = EE_Error::get_notices(false);
809
+		// if current user is an admin and it's not an ajax or rest request
810
+		if (! isset($notices['errors'])
811
+			&& $this->request->isAdmin()
812
+			&& apply_filters(
813
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
814
+				$this->capabilities->current_user_can('manage_options', 'espresso_about_default')
815
+			)
816
+		) {
817
+			$query_params = array('page' => 'espresso_about');
818
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
819
+				$query_params['new_activation'] = true;
820
+			}
821
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
822
+				$query_params['reactivation'] = true;
823
+			}
824
+			$url = add_query_arg($query_params, admin_url('admin.php'));
825
+			wp_safe_redirect($url);
826
+			exit();
827
+		}
828
+	}
829
+
830
+
831
+	/**
832
+	 * load_core_configuration
833
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
834
+	 * which runs during the WP 'plugins_loaded' action at priority 5
835
+	 *
836
+	 * @return void
837
+	 * @throws ReflectionException
838
+	 */
839
+	public function load_core_configuration()
840
+	{
841
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
842
+		$this->loader->getShared('EE_Load_Textdomain');
843
+		// load textdomain
844
+		EE_Load_Textdomain::load_textdomain();
845
+		// load and setup EE_Config and EE_Network_Config
846
+		$config = $this->loader->getShared('EE_Config');
847
+		$this->loader->getShared('EE_Network_Config');
848
+		// setup autoloaders
849
+		// enable logging?
850
+		if ($config->admin->use_full_logging) {
851
+			$this->loader->getShared('EE_Log');
852
+		}
853
+		// check for activation errors
854
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
855
+		if ($activation_errors) {
856
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
857
+			update_option('ee_plugin_activation_errors', false);
858
+		}
859
+		// get model names
860
+		$this->_parse_model_names();
861
+		// load caf stuff a chance to play during the activation process too.
862
+		$this->_maybe_brew_regular();
863
+		// configure custom post type definitions
864
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
865
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
866
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
867
+	}
868
+
869
+
870
+	/**
871
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
872
+	 *
873
+	 * @return void
874
+	 * @throws ReflectionException
875
+	 */
876
+	private function _parse_model_names()
877
+	{
878
+		// get all the files in the EE_MODELS folder that end in .model.php
879
+		$models = glob(EE_MODELS . '*.model.php');
880
+		$model_names = array();
881
+		$non_abstract_db_models = array();
882
+		foreach ($models as $model) {
883
+			// get model classname
884
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
885
+			$short_name = str_replace('EEM_', '', $classname);
886
+			$reflectionClass = new ReflectionClass($classname);
887
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
888
+				$non_abstract_db_models[ $short_name ] = $classname;
889
+			}
890
+			$model_names[ $short_name ] = $classname;
891
+		}
892
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
893
+		$this->registry->non_abstract_db_models = apply_filters(
894
+			'FHEE__EE_System__parse_implemented_model_names',
895
+			$non_abstract_db_models
896
+		);
897
+	}
898
+
899
+
900
+	/**
901
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
902
+	 * that need to be setup before our EE_System launches.
903
+	 *
904
+	 * @return void
905
+	 * @throws DomainException
906
+	 * @throws InvalidArgumentException
907
+	 * @throws InvalidDataTypeException
908
+	 * @throws InvalidInterfaceException
909
+	 * @throws InvalidClassException
910
+	 * @throws InvalidFilePathException
911
+	 */
912
+	private function _maybe_brew_regular()
913
+	{
914
+		/** @var Domain $domain */
915
+		$domain = DomainFactory::getShared(
916
+			new FullyQualifiedName(
917
+				'EventEspresso\core\domain\Domain'
918
+			),
919
+			array(
920
+				new FilePath(EVENT_ESPRESSO_MAIN_FILE),
921
+				Version::fromString(espresso_version()),
922
+			)
923
+		);
924
+		if ($domain->isCaffeinated()) {
925
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
926
+		}
927
+	}
928
+
929
+
930
+	/**
931
+	 * register_shortcodes_modules_and_widgets
932
+	 * generate lists of shortcodes and modules, then verify paths and classes
933
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
934
+	 * which runs during the WP 'plugins_loaded' action at priority 7
935
+	 *
936
+	 * @access public
937
+	 * @return void
938
+	 * @throws Exception
939
+	 */
940
+	public function register_shortcodes_modules_and_widgets()
941
+	{
942
+		try {
943
+			// load, register, and add shortcodes the new way
944
+			if ($this->request->isFrontend() || $this->request->isIframe()) {
945
+				$this->loader->getShared(
946
+					'EventEspresso\core\services\shortcodes\ShortcodesManager',
947
+					array(
948
+						// and the old way, but we'll put it under control of the new system
949
+						EE_Config::getLegacyShortcodesManager(),
950
+					)
951
+				);
952
+			}
953
+		} catch (Exception $exception) {
954
+			new ExceptionStackTraceDisplay($exception);
955
+		}
956
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
957
+		// check for addons using old hook point
958
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
959
+			$this->_incompatible_addon_error();
960
+		}
961
+	}
962
+
963
+
964
+	/**
965
+	 * _incompatible_addon_error
966
+	 *
967
+	 * @access public
968
+	 * @return void
969
+	 */
970
+	private function _incompatible_addon_error()
971
+	{
972
+		// get array of classes hooking into here
973
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
974
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
975
+		);
976
+		if (! empty($class_names)) {
977
+			$msg = __(
978
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
979
+				'event_espresso'
980
+			);
981
+			$msg .= '<ul>';
982
+			foreach ($class_names as $class_name) {
983
+				$msg .= '<li><b>Event Espresso - '
984
+						. str_replace(
985
+							array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
986
+							'',
987
+							$class_name
988
+						) . '</b></li>';
989
+			}
990
+			$msg .= '</ul>';
991
+			$msg .= __(
992
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
993
+				'event_espresso'
994
+			);
995
+			// save list of incompatible addons to wp-options for later use
996
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
997
+			if (is_admin()) {
998
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
999
+			}
1000
+		}
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * brew_espresso
1006
+	 * begins the process of setting hooks for initializing EE in the correct order
1007
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1008
+	 * which runs during the WP 'plugins_loaded' action at priority 9
1009
+	 *
1010
+	 * @return void
1011
+	 */
1012
+	public function brew_espresso()
1013
+	{
1014
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
1015
+		// load some final core systems
1016
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
1017
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1018
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
1019
+		add_action('init', array($this, 'load_controllers'), 7);
1020
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
1021
+		add_action('init', array($this, 'initialize'), 10);
1022
+		add_action('init', array($this, 'initialize_last'), 100);
1023
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1024
+			// pew pew pew
1025
+			$this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1026
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1027
+		}
1028
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
1029
+	}
1030
+
1031
+
1032
+	/**
1033
+	 *    set_hooks_for_core
1034
+	 *
1035
+	 * @access public
1036
+	 * @return    void
1037
+	 * @throws EE_Error
1038
+	 */
1039
+	public function set_hooks_for_core()
1040
+	{
1041
+		$this->_deactivate_incompatible_addons();
1042
+		do_action('AHEE__EE_System__set_hooks_for_core');
1043
+		$this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1044
+		// caps need to be initialized on every request so that capability maps are set.
1045
+		// @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1046
+		$this->registry->CAP->init_caps();
1047
+	}
1048
+
1049
+
1050
+	/**
1051
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
1052
+	 * deactivates any addons considered incompatible with the current version of EE
1053
+	 */
1054
+	private function _deactivate_incompatible_addons()
1055
+	{
1056
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
1057
+		if (! empty($incompatible_addons)) {
1058
+			$active_plugins = get_option('active_plugins', array());
1059
+			foreach ($active_plugins as $active_plugin) {
1060
+				foreach ($incompatible_addons as $incompatible_addon) {
1061
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
1062
+						unset($_GET['activate']);
1063
+						espresso_deactivate_plugin($active_plugin);
1064
+					}
1065
+				}
1066
+			}
1067
+		}
1068
+	}
1069
+
1070
+
1071
+	/**
1072
+	 *    perform_activations_upgrades_and_migrations
1073
+	 *
1074
+	 * @access public
1075
+	 * @return    void
1076
+	 */
1077
+	public function perform_activations_upgrades_and_migrations()
1078
+	{
1079
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1080
+	}
1081
+
1082
+
1083
+	/**
1084
+	 * @return void
1085
+	 * @throws DomainException
1086
+	 */
1087
+	public function load_CPTs_and_session()
1088
+	{
1089
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
1090
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1091
+		$register_custom_taxonomies = $this->loader->getShared(
1092
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1093
+		);
1094
+		$register_custom_taxonomies->registerCustomTaxonomies();
1095
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1096
+		$register_custom_post_types = $this->loader->getShared(
1097
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1098
+		);
1099
+		$register_custom_post_types->registerCustomPostTypes();
1100
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1101
+		$register_custom_taxonomy_terms = $this->loader->getShared(
1102
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1103
+		);
1104
+		$register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1105
+		// load legacy Custom Post Types and Taxonomies
1106
+		$this->loader->getShared('EE_Register_CPTs');
1107
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1108
+	}
1109
+
1110
+
1111
+	/**
1112
+	 * load_controllers
1113
+	 * this is the best place to load any additional controllers that needs access to EE core.
1114
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1115
+	 * time
1116
+	 *
1117
+	 * @access public
1118
+	 * @return void
1119
+	 */
1120
+	public function load_controllers()
1121
+	{
1122
+		do_action('AHEE__EE_System__load_controllers__start');
1123
+		// let's get it started
1124
+		if (! $this->maintenance_mode->level()
1125
+			&& ($this->request->isFrontend() || $this->request->isFrontAjax())
1126
+		) {
1127
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1128
+			$this->loader->getShared('EE_Front_Controller');
1129
+		} elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1130
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1131
+			$this->loader->getShared('EE_Admin');
1132
+		}
1133
+		do_action('AHEE__EE_System__load_controllers__complete');
1134
+	}
1135
+
1136
+
1137
+	/**
1138
+	 * core_loaded_and_ready
1139
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1140
+	 *
1141
+	 * @access public
1142
+	 * @return void
1143
+	 * @throws Exception
1144
+	 */
1145
+	public function core_loaded_and_ready()
1146
+	{
1147
+		if ($this->request->isAdmin() || $this->request->isFrontend() || $this->request->isIframe()) {
1148
+			try {
1149
+				$this->loader->getShared('EventEspresso\core\services\assets\Registry');
1150
+				$this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1151
+				if (function_exists('register_block_type')) {
1152
+					$this->loader->getShared(
1153
+						'EventEspresso\core\services\editor\BlockRegistrationManager'
1154
+					);
1155
+				}
1156
+			} catch (Exception $exception) {
1157
+				new ExceptionStackTraceDisplay($exception);
1158
+			}
1159
+		}
1160
+		if ($this->request->isAdmin()
1161
+			|| $this->request->isEeAjax()
1162
+			|| $this->request->isFrontend()
1163
+		) {
1164
+			$this->loader->getShared('EE_Session');
1165
+		}
1166
+		do_action('AHEE__EE_System__core_loaded_and_ready');
1167
+		// load_espresso_template_tags
1168
+		if (is_readable(EE_PUBLIC . 'template_tags.php')
1169
+			&& ($this->request->isFrontend()
1170
+				|| $this->request->isAdmin()
1171
+				|| $this->request->isIframe()
1172
+				|| $this->request->isFeed()
1173
+			)
1174
+		) {
1175
+			require_once EE_PUBLIC . 'template_tags.php';
1176
+		}
1177
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1178
+	}
1179
+
1180
+
1181
+	/**
1182
+	 * initialize
1183
+	 * this is the best place to begin initializing client code
1184
+	 *
1185
+	 * @access public
1186
+	 * @return void
1187
+	 */
1188
+	public function initialize()
1189
+	{
1190
+		do_action('AHEE__EE_System__initialize');
1191
+	}
1192
+
1193
+
1194
+	/**
1195
+	 * initialize_last
1196
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1197
+	 * initialize has done so
1198
+	 *
1199
+	 * @access public
1200
+	 * @return void
1201
+	 */
1202
+	public function initialize_last()
1203
+	{
1204
+		do_action('AHEE__EE_System__initialize_last');
1205
+		/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1206
+		$rewrite_rules = $this->loader->getShared(
1207
+			'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1208
+		);
1209
+		$rewrite_rules->flushRewriteRules();
1210
+		add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1211
+		if (($this->request->isAjax() || $this->request->isAdmin())
1212
+			&& $this->maintenance_mode->models_can_query()) {
1213
+			$this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1214
+			$this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1215
+		}
1216
+	}
1217
+
1218
+
1219
+	/**
1220
+	 * @return void
1221
+	 * @throws EE_Error
1222
+	 */
1223
+	public function addEspressoToolbar()
1224
+	{
1225
+		$this->loader->getShared(
1226
+			'EventEspresso\core\domain\services\admin\AdminToolBar',
1227
+			array($this->registry->CAP)
1228
+		);
1229
+	}
1230
+
1231
+
1232
+	/**
1233
+	 * do_not_cache
1234
+	 * sets no cache headers and defines no cache constants for WP plugins
1235
+	 *
1236
+	 * @access public
1237
+	 * @return void
1238
+	 */
1239
+	public static function do_not_cache()
1240
+	{
1241
+		// set no cache constants
1242
+		if (! defined('DONOTCACHEPAGE')) {
1243
+			define('DONOTCACHEPAGE', true);
1244
+		}
1245
+		if (! defined('DONOTCACHCEOBJECT')) {
1246
+			define('DONOTCACHCEOBJECT', true);
1247
+		}
1248
+		if (! defined('DONOTCACHEDB')) {
1249
+			define('DONOTCACHEDB', true);
1250
+		}
1251
+		// add no cache headers
1252
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1253
+		// plus a little extra for nginx and Google Chrome
1254
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1255
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1256
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1257
+	}
1258
+
1259
+
1260
+	/**
1261
+	 *    extra_nocache_headers
1262
+	 *
1263
+	 * @access    public
1264
+	 * @param $headers
1265
+	 * @return    array
1266
+	 */
1267
+	public static function extra_nocache_headers($headers)
1268
+	{
1269
+		// for NGINX
1270
+		$headers['X-Accel-Expires'] = 0;
1271
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1272
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1273
+		return $headers;
1274
+	}
1275
+
1276
+
1277
+	/**
1278
+	 *    nocache_headers
1279
+	 *
1280
+	 * @access    public
1281
+	 * @return    void
1282
+	 */
1283
+	public static function nocache_headers()
1284
+	{
1285
+		nocache_headers();
1286
+	}
1287
+
1288
+
1289
+	/**
1290
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1291
+	 * never returned with the function.
1292
+	 *
1293
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1294
+	 * @return array
1295
+	 */
1296
+	public function remove_pages_from_wp_list_pages($exclude_array)
1297
+	{
1298
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1299
+	}
1300 1300
 }
Please login to merge, or discard this patch.
core/domain/entities/editor/blocks/widgets/EventAttendees.php 2 patches
Indentation   +112 added lines, -112 removed lines patch added patch discarded remove patch
@@ -18,127 +18,127 @@
 block discarded – undo
18 18
 class EventAttendees extends Block
19 19
 {
20 20
 
21
-    const BLOCK_TYPE = 'widgets-event-attendees';
21
+	const BLOCK_TYPE = 'widgets-event-attendees';
22 22
 
23
-    /**
24
-     * @var EspressoEventAttendees $shortcode
25
-     */
26
-    protected $shortcode;
23
+	/**
24
+	 * @var EspressoEventAttendees $shortcode
25
+	 */
26
+	protected $shortcode;
27 27
 
28 28
 
29
-    /**
30
-     * EventAttendees constructor.
31
-     *
32
-     * @param CoreBlocksAssetManager $block_asset_manager
33
-     * @param EspressoEventAttendees $shortcode
34
-     */
35
-    public function __construct(CoreBlocksAssetManager $block_asset_manager, EspressoEventAttendees $shortcode)
36
-    {
37
-        parent::__construct($block_asset_manager);
38
-        $this->shortcode = $shortcode;
39
-    }
29
+	/**
30
+	 * EventAttendees constructor.
31
+	 *
32
+	 * @param CoreBlocksAssetManager $block_asset_manager
33
+	 * @param EspressoEventAttendees $shortcode
34
+	 */
35
+	public function __construct(CoreBlocksAssetManager $block_asset_manager, EspressoEventAttendees $shortcode)
36
+	{
37
+		parent::__construct($block_asset_manager);
38
+		$this->shortcode = $shortcode;
39
+	}
40 40
 
41 41
 
42
-    /**
43
-     * Perform any early setup required by the block
44
-     * including setting the block type and supported post types
45
-     *
46
-     * @return void
47
-     */
48
-    public function initialize()
49
-    {
50
-        $this->setBlockType(self::BLOCK_TYPE);
51
-        $this->setSupportedPostTypes(array('espresso_events', 'post', 'page'));
52
-        $this->setAttributes(
53
-            array(
54
-                'eventId'            => array(
55
-                    'type'    => 'number',
56
-                    'default' => 0,
57
-                ),
58
-                'datetimeId'         => array(
59
-                    'type'    => 'number',
60
-                    'default' => 0,
61
-                ),
62
-                'ticketId'           => array(
63
-                    'type'    => 'number',
64
-                    'default' => 0,
65
-                ),
66
-                'status'              => array(
67
-                    'type'    => 'string',
68
-                    'default' => EEM_Registration::status_id_approved,
69
-                ),
70
-                'showGravatar'       => array(
71
-                    'type'    => 'boolean',
72
-                    'default' => false,
73
-                ),
74
-                'displayOnArchives' => array(
75
-                    'type'    => 'boolean',
76
-                    'default' => false,
77
-                ),
78
-            )
79
-        );
80
-        $this->setDynamic();
81
-    }
42
+	/**
43
+	 * Perform any early setup required by the block
44
+	 * including setting the block type and supported post types
45
+	 *
46
+	 * @return void
47
+	 */
48
+	public function initialize()
49
+	{
50
+		$this->setBlockType(self::BLOCK_TYPE);
51
+		$this->setSupportedPostTypes(array('espresso_events', 'post', 'page'));
52
+		$this->setAttributes(
53
+			array(
54
+				'eventId'            => array(
55
+					'type'    => 'number',
56
+					'default' => 0,
57
+				),
58
+				'datetimeId'         => array(
59
+					'type'    => 'number',
60
+					'default' => 0,
61
+				),
62
+				'ticketId'           => array(
63
+					'type'    => 'number',
64
+					'default' => 0,
65
+				),
66
+				'status'              => array(
67
+					'type'    => 'string',
68
+					'default' => EEM_Registration::status_id_approved,
69
+				),
70
+				'showGravatar'       => array(
71
+					'type'    => 'boolean',
72
+					'default' => false,
73
+				),
74
+				'displayOnArchives' => array(
75
+					'type'    => 'boolean',
76
+					'default' => false,
77
+				),
78
+			)
79
+		);
80
+		$this->setDynamic();
81
+	}
82 82
 
83 83
 
84
-    /**
85
-     * returns an array where the key corresponds to the incoming attribute name from the WP block
86
-     * and the value corresponds to the attribute name for the existing EspressoEventAttendees shortcode
87
-     *
88
-     * @since $VID:$
89
-     * @return array
90
-     */
91
-    private function getAttributesMap()
92
-    {
93
-        return array(
94
-            'eventId'           => array('attribute' => 'event_id', 'sanitize' => 'absint'),
95
-            'datetimeId'        => array('attribute' => 'datetime_id', 'sanitize' => 'absint'),
96
-            'ticketId'          => array('attribute' => 'ticket_id', 'sanitize' => 'absint'),
97
-            'status'            => array('attribute' => 'status', 'sanitize' => 'sanitize_text_field'),
98
-            'showGravatar'      => array('attribute' => 'show_gravatar', 'sanitize' => 'bool'),
99
-            'displayOnArchives' => array('attribute' => 'display_on_archives', 'sanitize' => 'bool'),
100
-        );
101
-    }
84
+	/**
85
+	 * returns an array where the key corresponds to the incoming attribute name from the WP block
86
+	 * and the value corresponds to the attribute name for the existing EspressoEventAttendees shortcode
87
+	 *
88
+	 * @since $VID:$
89
+	 * @return array
90
+	 */
91
+	private function getAttributesMap()
92
+	{
93
+		return array(
94
+			'eventId'           => array('attribute' => 'event_id', 'sanitize' => 'absint'),
95
+			'datetimeId'        => array('attribute' => 'datetime_id', 'sanitize' => 'absint'),
96
+			'ticketId'          => array('attribute' => 'ticket_id', 'sanitize' => 'absint'),
97
+			'status'            => array('attribute' => 'status', 'sanitize' => 'sanitize_text_field'),
98
+			'showGravatar'      => array('attribute' => 'show_gravatar', 'sanitize' => 'bool'),
99
+			'displayOnArchives' => array('attribute' => 'display_on_archives', 'sanitize' => 'bool'),
100
+		);
101
+	}
102 102
 
103 103
 
104
-    /**
105
-     * @param array $attributes
106
-     * @since $VID:$
107
-     * @return array
108
-     */
109
-    private function parseAttributes(array $attributes)
110
-    {
111
-        foreach ($attributes as $attribute => $value) {
112
-            $convert = $this->getAttributesMap();
113
-            if (isset($convert[ $attribute ])) {
114
-                $sanitize = $convert[ $attribute ]['sanitize'];
115
-                if ($sanitize === 'bool') {
116
-                    $attributes[ $convert[ $attribute ]['attribute'] ] = filter_var(
117
-                        $value,
118
-                        FILTER_VALIDATE_BOOLEAN
119
-                    );
120
-                } else {
121
-                    $attributes[ $convert[ $attribute ]['attribute'] ] = $sanitize($value);
122
-                }
123
-                unset($attributes[ $attribute ]);
124
-            }
125
-        }
126
-        return $attributes;
127
-    }
104
+	/**
105
+	 * @param array $attributes
106
+	 * @since $VID:$
107
+	 * @return array
108
+	 */
109
+	private function parseAttributes(array $attributes)
110
+	{
111
+		foreach ($attributes as $attribute => $value) {
112
+			$convert = $this->getAttributesMap();
113
+			if (isset($convert[ $attribute ])) {
114
+				$sanitize = $convert[ $attribute ]['sanitize'];
115
+				if ($sanitize === 'bool') {
116
+					$attributes[ $convert[ $attribute ]['attribute'] ] = filter_var(
117
+						$value,
118
+						FILTER_VALIDATE_BOOLEAN
119
+					);
120
+				} else {
121
+					$attributes[ $convert[ $attribute ]['attribute'] ] = $sanitize($value);
122
+				}
123
+				unset($attributes[ $attribute ]);
124
+			}
125
+		}
126
+		return $attributes;
127
+	}
128 128
 
129 129
 
130
-    /**
131
-     * returns the rendered HTML for the block
132
-     *
133
-     * @param array $attributes
134
-     * @return string
135
-     * @throws \EE_Error
136
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
137
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
138
-     * @throws \InvalidArgumentException
139
-     */
140
-    public function renderBlock(array $attributes = array())
141
-    {
142
-        return $this->shortcode->processShortcode($this->parseAttributes($attributes));
143
-    }
130
+	/**
131
+	 * returns the rendered HTML for the block
132
+	 *
133
+	 * @param array $attributes
134
+	 * @return string
135
+	 * @throws \EE_Error
136
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
137
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
138
+	 * @throws \InvalidArgumentException
139
+	 */
140
+	public function renderBlock(array $attributes = array())
141
+	{
142
+		return $this->shortcode->processShortcode($this->parseAttributes($attributes));
143
+	}
144 144
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -110,17 +110,17 @@
 block discarded – undo
110 110
     {
111 111
         foreach ($attributes as $attribute => $value) {
112 112
             $convert = $this->getAttributesMap();
113
-            if (isset($convert[ $attribute ])) {
114
-                $sanitize = $convert[ $attribute ]['sanitize'];
113
+            if (isset($convert[$attribute])) {
114
+                $sanitize = $convert[$attribute]['sanitize'];
115 115
                 if ($sanitize === 'bool') {
116
-                    $attributes[ $convert[ $attribute ]['attribute'] ] = filter_var(
116
+                    $attributes[$convert[$attribute]['attribute']] = filter_var(
117 117
                         $value,
118 118
                         FILTER_VALIDATE_BOOLEAN
119 119
                     );
120 120
                 } else {
121
-                    $attributes[ $convert[ $attribute ]['attribute'] ] = $sanitize($value);
121
+                    $attributes[$convert[$attribute]['attribute']] = $sanitize($value);
122 122
                 }
123
-                unset($attributes[ $attribute ]);
123
+                unset($attributes[$attribute]);
124 124
             }
125 125
         }
126 126
         return $attributes;
Please login to merge, or discard this patch.
core/EE_Dependency_Map.core.php 1 patch
Indentation   +1008 added lines, -1008 removed lines patch added patch discarded remove patch
@@ -20,1012 +20,1012 @@
 block discarded – undo
20 20
 class EE_Dependency_Map
21 21
 {
22 22
 
23
-    /**
24
-     * This means that the requested class dependency is not present in the dependency map
25
-     */
26
-    const not_registered = 0;
27
-
28
-    /**
29
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
-     */
31
-    const load_new_object = 1;
32
-
33
-    /**
34
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
-     */
37
-    const load_from_cache = 2;
38
-
39
-    /**
40
-     * When registering a dependency,
41
-     * this indicates to keep any existing dependencies that already exist,
42
-     * and simply discard any new dependencies declared in the incoming data
43
-     */
44
-    const KEEP_EXISTING_DEPENDENCIES = 0;
45
-
46
-    /**
47
-     * When registering a dependency,
48
-     * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
-     */
50
-    const OVERWRITE_DEPENDENCIES = 1;
51
-
52
-
53
-    /**
54
-     * @type EE_Dependency_Map $_instance
55
-     */
56
-    protected static $_instance;
57
-
58
-    /**
59
-     * @var ClassInterfaceCache $class_cache
60
-     */
61
-    private $class_cache;
62
-
63
-    /**
64
-     * @type RequestInterface $request
65
-     */
66
-    protected $request;
67
-
68
-    /**
69
-     * @type LegacyRequestInterface $legacy_request
70
-     */
71
-    protected $legacy_request;
72
-
73
-    /**
74
-     * @type ResponseInterface $response
75
-     */
76
-    protected $response;
77
-
78
-    /**
79
-     * @type LoaderInterface $loader
80
-     */
81
-    protected $loader;
82
-
83
-    /**
84
-     * @type array $_dependency_map
85
-     */
86
-    protected $_dependency_map = array();
87
-
88
-    /**
89
-     * @type array $_class_loaders
90
-     */
91
-    protected $_class_loaders = array();
92
-
93
-
94
-    /**
95
-     * EE_Dependency_Map constructor.
96
-     *
97
-     * @param ClassInterfaceCache $class_cache
98
-     */
99
-    protected function __construct(ClassInterfaceCache $class_cache)
100
-    {
101
-        $this->class_cache = $class_cache;
102
-        do_action('EE_Dependency_Map____construct', $this);
103
-    }
104
-
105
-
106
-    /**
107
-     * @return void
108
-     */
109
-    public function initialize()
110
-    {
111
-        $this->_register_core_dependencies();
112
-        $this->_register_core_class_loaders();
113
-        $this->_register_core_aliases();
114
-    }
115
-
116
-
117
-    /**
118
-     * @singleton method used to instantiate class object
119
-     * @param ClassInterfaceCache|null $class_cache
120
-     * @return EE_Dependency_Map
121
-     */
122
-    public static function instance(ClassInterfaceCache $class_cache = null)
123
-    {
124
-        // check if class object is instantiated, and instantiated properly
125
-        if (! self::$_instance instanceof EE_Dependency_Map
126
-            && $class_cache instanceof ClassInterfaceCache
127
-        ) {
128
-            self::$_instance = new EE_Dependency_Map($class_cache);
129
-        }
130
-        return self::$_instance;
131
-    }
132
-
133
-
134
-    /**
135
-     * @param RequestInterface $request
136
-     */
137
-    public function setRequest(RequestInterface $request)
138
-    {
139
-        $this->request = $request;
140
-    }
141
-
142
-
143
-    /**
144
-     * @param LegacyRequestInterface $legacy_request
145
-     */
146
-    public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
-    {
148
-        $this->legacy_request = $legacy_request;
149
-    }
150
-
151
-
152
-    /**
153
-     * @param ResponseInterface $response
154
-     */
155
-    public function setResponse(ResponseInterface $response)
156
-    {
157
-        $this->response = $response;
158
-    }
159
-
160
-
161
-    /**
162
-     * @param LoaderInterface $loader
163
-     */
164
-    public function setLoader(LoaderInterface $loader)
165
-    {
166
-        $this->loader = $loader;
167
-    }
168
-
169
-
170
-    /**
171
-     * @param string $class
172
-     * @param array  $dependencies
173
-     * @param int    $overwrite
174
-     * @return bool
175
-     */
176
-    public static function register_dependencies(
177
-        $class,
178
-        array $dependencies,
179
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
-    ) {
181
-        return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
-    }
183
-
184
-
185
-    /**
186
-     * Assigns an array of class names and corresponding load sources (new or cached)
187
-     * to the class specified by the first parameter.
188
-     * IMPORTANT !!!
189
-     * The order of elements in the incoming $dependencies array MUST match
190
-     * the order of the constructor parameters for the class in question.
191
-     * This is especially important when overriding any existing dependencies that are registered.
192
-     * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
-     *
194
-     * @param string $class
195
-     * @param array  $dependencies
196
-     * @param int    $overwrite
197
-     * @return bool
198
-     */
199
-    public function registerDependencies(
200
-        $class,
201
-        array $dependencies,
202
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
-    ) {
204
-        $class = trim($class, '\\');
205
-        $registered = false;
206
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
207
-            self::$_instance->_dependency_map[ $class ] = array();
208
-        }
209
-        // we need to make sure that any aliases used when registering a dependency
210
-        // get resolved to the correct class name
211
-        foreach ($dependencies as $dependency => $load_source) {
212
-            $alias = self::$_instance->getFqnForAlias($dependency);
213
-            if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
-            ) {
216
-                unset($dependencies[ $dependency ]);
217
-                $dependencies[ $alias ] = $load_source;
218
-                $registered = true;
219
-            }
220
-        }
221
-        // now add our two lists of dependencies together.
222
-        // using Union (+=) favours the arrays in precedence from left to right,
223
-        // so $dependencies is NOT overwritten because it is listed first
224
-        // ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
-        // Union is way faster than array_merge() but should be used with caution...
226
-        // especially with numerically indexed arrays
227
-        $dependencies += self::$_instance->_dependency_map[ $class ];
228
-        // now we need to ensure that the resulting dependencies
229
-        // array only has the entries that are required for the class
230
-        // so first count how many dependencies were originally registered for the class
231
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
-        // if that count is non-zero (meaning dependencies were already registered)
233
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
234
-            // then truncate the  final array to match that count
235
-            ? array_slice($dependencies, 0, $dependency_count)
236
-            // otherwise just take the incoming array because nothing previously existed
237
-            : $dependencies;
238
-        return $registered;
239
-    }
240
-
241
-
242
-    /**
243
-     * @param string $class_name
244
-     * @param string $loader
245
-     * @return bool
246
-     * @throws DomainException
247
-     */
248
-    public static function register_class_loader($class_name, $loader = 'load_core')
249
-    {
250
-        if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
-            throw new DomainException(
252
-                esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
-            );
254
-        }
255
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
256
-        if (! is_callable($loader)
257
-            && (
258
-                strpos($loader, 'load_') !== 0
259
-                || ! method_exists('EE_Registry', $loader)
260
-            )
261
-        ) {
262
-            throw new DomainException(
263
-                sprintf(
264
-                    esc_html__(
265
-                        '"%1$s" is not a valid loader method on EE_Registry.',
266
-                        'event_espresso'
267
-                    ),
268
-                    $loader
269
-                )
270
-            );
271
-        }
272
-        $class_name = self::$_instance->getFqnForAlias($class_name);
273
-        if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
-            self::$_instance->_class_loaders[ $class_name ] = $loader;
275
-            return true;
276
-        }
277
-        return false;
278
-    }
279
-
280
-
281
-    /**
282
-     * @return array
283
-     */
284
-    public function dependency_map()
285
-    {
286
-        return $this->_dependency_map;
287
-    }
288
-
289
-
290
-    /**
291
-     * returns TRUE if dependency map contains a listing for the provided class name
292
-     *
293
-     * @param string $class_name
294
-     * @return boolean
295
-     */
296
-    public function has($class_name = '')
297
-    {
298
-        // all legacy models have the same dependencies
299
-        if (strpos($class_name, 'EEM_') === 0) {
300
-            $class_name = 'LEGACY_MODELS';
301
-        }
302
-        return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
-    }
304
-
305
-
306
-    /**
307
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
-     *
309
-     * @param string $class_name
310
-     * @param string $dependency
311
-     * @return bool
312
-     */
313
-    public function has_dependency_for_class($class_name = '', $dependency = '')
314
-    {
315
-        // all legacy models have the same dependencies
316
-        if (strpos($class_name, 'EEM_') === 0) {
317
-            $class_name = 'LEGACY_MODELS';
318
-        }
319
-        $dependency = $this->getFqnForAlias($dependency, $class_name);
320
-        return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
-            ? true
322
-            : false;
323
-    }
324
-
325
-
326
-    /**
327
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
-     *
329
-     * @param string $class_name
330
-     * @param string $dependency
331
-     * @return int
332
-     */
333
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
-    {
335
-        // all legacy models have the same dependencies
336
-        if (strpos($class_name, 'EEM_') === 0) {
337
-            $class_name = 'LEGACY_MODELS';
338
-        }
339
-        $dependency = $this->getFqnForAlias($dependency);
340
-        return $this->has_dependency_for_class($class_name, $dependency)
341
-            ? $this->_dependency_map[ $class_name ][ $dependency ]
342
-            : EE_Dependency_Map::not_registered;
343
-    }
344
-
345
-
346
-    /**
347
-     * @param string $class_name
348
-     * @return string | Closure
349
-     */
350
-    public function class_loader($class_name)
351
-    {
352
-        // all legacy models use load_model()
353
-        if (strpos($class_name, 'EEM_') === 0) {
354
-            return 'load_model';
355
-        }
356
-        // EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc
357
-        // perform strpos() first to avoid loading regex every time we load a class
358
-        if (strpos($class_name, 'EE_CPT_') === 0
359
-            && preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name)
360
-        ) {
361
-            return 'load_core';
362
-        }
363
-        $class_name = $this->getFqnForAlias($class_name);
364
-        return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
365
-    }
366
-
367
-
368
-    /**
369
-     * @return array
370
-     */
371
-    public function class_loaders()
372
-    {
373
-        return $this->_class_loaders;
374
-    }
375
-
376
-
377
-    /**
378
-     * adds an alias for a classname
379
-     *
380
-     * @param string $fqcn      the class name that should be used (concrete class to replace interface)
381
-     * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
382
-     * @param string $for_class the class that has the dependency (is type hinting for the interface)
383
-     */
384
-    public function add_alias($fqcn, $alias, $for_class = '')
385
-    {
386
-        $this->class_cache->addAlias($fqcn, $alias, $for_class);
387
-    }
388
-
389
-
390
-    /**
391
-     * Returns TRUE if the provided fully qualified name IS an alias
392
-     * WHY?
393
-     * Because if a class is type hinting for a concretion,
394
-     * then why would we need to find another class to supply it?
395
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
396
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
397
-     * Don't go looking for some substitute.
398
-     * Whereas if a class is type hinting for an interface...
399
-     * then we need to find an actual class to use.
400
-     * So the interface IS the alias for some other FQN,
401
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
402
-     * represents some other class.
403
-     *
404
-     * @param string $fqn
405
-     * @param string $for_class
406
-     * @return bool
407
-     */
408
-    public function isAlias($fqn = '', $for_class = '')
409
-    {
410
-        return $this->class_cache->isAlias($fqn, $for_class);
411
-    }
412
-
413
-
414
-    /**
415
-     * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
416
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
417
-     *  for example:
418
-     *      if the following two entries were added to the _aliases array:
419
-     *          array(
420
-     *              'interface_alias'           => 'some\namespace\interface'
421
-     *              'some\namespace\interface'  => 'some\namespace\classname'
422
-     *          )
423
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
424
-     *      to load an instance of 'some\namespace\classname'
425
-     *
426
-     * @param string $alias
427
-     * @param string $for_class
428
-     * @return string
429
-     */
430
-    public function getFqnForAlias($alias = '', $for_class = '')
431
-    {
432
-        return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
433
-    }
434
-
435
-
436
-    /**
437
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
438
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
439
-     * This is done by using the following class constants:
440
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
441
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
442
-     */
443
-    protected function _register_core_dependencies()
444
-    {
445
-        $this->_dependency_map = array(
446
-            'EE_Request_Handler'                                                                                          => array(
447
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
448
-            ),
449
-            'EE_System'                                                                                                   => array(
450
-                'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
451
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
452
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
453
-                'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
454
-            ),
455
-            'EE_Session'                                                                                                  => array(
456
-                'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
457
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
458
-                'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
459
-                'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
460
-            ),
461
-            'EE_Cart'                                                                                                     => array(
462
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
463
-            ),
464
-            'EE_Front_Controller'                                                                                         => array(
465
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
466
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
467
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
468
-            ),
469
-            'EE_Messenger_Collection_Loader'                                                                              => array(
470
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
471
-            ),
472
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
473
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
474
-            ),
475
-            'EE_Message_Resource_Manager'                                                                                 => array(
476
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
477
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
478
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
479
-            ),
480
-            'EE_Message_Factory'                                                                                          => array(
481
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
482
-            ),
483
-            'EE_messages'                                                                                                 => array(
484
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
485
-            ),
486
-            'EE_Messages_Generator'                                                                                       => array(
487
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
488
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
489
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
490
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
491
-            ),
492
-            'EE_Messages_Processor'                                                                                       => array(
493
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
494
-            ),
495
-            'EE_Messages_Queue'                                                                                           => array(
496
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
497
-            ),
498
-            'EE_Messages_Template_Defaults'                                                                               => array(
499
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
500
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
501
-            ),
502
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
503
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
504
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
505
-            ),
506
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
507
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
508
-            ),
509
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
510
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
511
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
512
-            ),
513
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
514
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
-            ),
516
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
517
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
518
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
519
-            ),
520
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
521
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
522
-            ),
523
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
524
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
525
-            ),
526
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
527
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
528
-            ),
529
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
530
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
531
-            ),
532
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
533
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
534
-            ),
535
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
536
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
537
-            ),
538
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
539
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
540
-            ),
541
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
542
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
543
-            ),
544
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
545
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
546
-            ),
547
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
548
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
549
-            ),
550
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
551
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
552
-            ),
553
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
554
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
555
-            ),
556
-            'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
557
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
558
-            ),
559
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
560
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
-            ),
562
-            'EE_Data_Migration_Class_Base'                                                                                => array(
563
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
564
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
565
-            ),
566
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
567
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
568
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
569
-            ),
570
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
571
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
572
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
573
-            ),
574
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
575
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
576
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
577
-            ),
578
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
579
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
580
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
581
-            ),
582
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
583
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
584
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
585
-            ),
586
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
587
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
588
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
589
-            ),
590
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
591
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
592
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
593
-            ),
594
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
595
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
596
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
597
-            ),
598
-            'EE_DMS_Core_4_9_0'                                                                                           => array(
599
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
600
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
601
-            ),
602
-            'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
603
-                array(),
604
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
605
-            ),
606
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
607
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
608
-                'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
609
-            ),
610
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
611
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
612
-            ),
613
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
614
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
615
-            ),
616
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
617
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
618
-            ),
619
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
620
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
621
-            ),
622
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
623
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
624
-            ),
625
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
626
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
627
-            ),
628
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
629
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
630
-            ),
631
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
632
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
633
-            ),
634
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
635
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
636
-            ),
637
-            'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
638
-                'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
639
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
640
-            ),
641
-            'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
642
-                null,
643
-                'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
644
-            ),
645
-            'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
646
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
647
-            ),
648
-            'LEGACY_MODELS'                                                                                               => array(
649
-                null,
650
-                'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
651
-            ),
652
-            'EE_Module_Request_Router'                                                                                    => array(
653
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
654
-            ),
655
-            'EE_Registration_Processor'                                                                                   => array(
656
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
657
-            ),
658
-            'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
659
-                null,
660
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
661
-                'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
662
-            ),
663
-            'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
664
-                'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
665
-                'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
666
-            ),
667
-            'EE_Admin_Transactions_List_Table'                                                                            => array(
668
-                null,
669
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
670
-            ),
671
-            'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
672
-                'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
673
-                'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
674
-                'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
675
-            ),
676
-            'EventEspresso\core\domain\services\pue\Config'                                                               => array(
677
-                'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
678
-                'EE_Config'         => EE_Dependency_Map::load_from_cache,
679
-            ),
680
-            'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
681
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
682
-                'EEM_Event'          => EE_Dependency_Map::load_from_cache,
683
-                'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
684
-                'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
685
-                'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
686
-                'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
687
-                'EE_Config'          => EE_Dependency_Map::load_from_cache,
688
-            ),
689
-            'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
690
-                'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
691
-            ),
692
-            'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
693
-                'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
694
-            ),
695
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
696
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
697
-                'EE_Session'             => EE_Dependency_Map::load_from_cache,
698
-            ),
699
-            'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
700
-                'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
701
-            ),
702
-            'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
703
-                'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
704
-                'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
705
-                'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
706
-                'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
707
-                'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
708
-            ),
709
-            'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
710
-                'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
711
-            ),
712
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
713
-                'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
714
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
715
-            ),
716
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
717
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
718
-            ),
719
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
720
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
721
-            ),
722
-            'EE_CPT_Strategy'                                                                                             => array(
723
-                'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
724
-                'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
725
-            ),
726
-            'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
727
-                'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
728
-            ),
729
-            'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
730
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
731
-                'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
732
-                'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
733
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
734
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
735
-            ),
736
-            'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
737
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
738
-                'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
739
-            ),
740
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array(
741
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
742
-            ),
743
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array(
744
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
745
-                'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache
746
-            ),
747
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array(
748
-                'EEM_Checkin' => EE_Dependency_Map::load_from_cache,
749
-            ),
750
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array(
751
-                'EEM_Registration' => EE_Dependency_Map::load_from_cache,
752
-            ),
753
-            'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array(
754
-                'EEM_Transaction' => EE_Dependency_Map::load_from_cache,
755
-            ),
756
-            'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array(
757
-                'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
758
-            ),
759
-            'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array(
760
-                'EEM_Answer' => EE_Dependency_Map::load_from_cache,
761
-                'EEM_Question' => EE_Dependency_Map::load_from_cache,
762
-            ),
763
-            'EventEspresso\core\CPTs\CptQueryModifier' => array(
764
-                null,
765
-                null,
766
-                null,
767
-                'EE_Request_Handler'                          => EE_Dependency_Map::load_from_cache,
768
-                'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
769
-                'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
770
-            ),
771
-            'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array(
772
-                'EE_Registry' => EE_Dependency_Map::load_from_cache,
773
-                'EE_Config' => EE_Dependency_Map::load_from_cache
774
-            ),
775
-            'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
776
-                'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
777
-                'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
778
-                'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
779
-            ),
780
-            'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager' => array(
781
-                'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
782
-                'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
783
-                'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
784
-            ),
785
-            'EventEspresso\core\domain\entities\editor\blocks\widgets\EventAttendees' => array(
786
-                'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager' => self::load_from_cache,
787
-                'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees' => self::load_from_cache,
788
-            ),
789
-        );
790
-    }
791
-
792
-
793
-    /**
794
-     * Registers how core classes are loaded.
795
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
796
-     *        'EE_Request_Handler' => 'load_core'
797
-     *        'EE_Messages_Queue'  => 'load_lib'
798
-     *        'EEH_Debug_Tools'    => 'load_helper'
799
-     * or, if greater control is required, by providing a custom closure. For example:
800
-     *        'Some_Class' => function () {
801
-     *            return new Some_Class();
802
-     *        },
803
-     * This is required for instantiating dependencies
804
-     * where an interface has been type hinted in a class constructor. For example:
805
-     *        'Required_Interface' => function () {
806
-     *            return new A_Class_That_Implements_Required_Interface();
807
-     *        },
808
-     */
809
-    protected function _register_core_class_loaders()
810
-    {
811
-        // for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
812
-        // be used in a closure.
813
-        $request = &$this->request;
814
-        $response = &$this->response;
815
-        $legacy_request = &$this->legacy_request;
816
-        // $loader = &$this->loader;
817
-        $this->_class_loaders = array(
818
-            // load_core
819
-            'EE_Capabilities'                              => 'load_core',
820
-            'EE_Encryption'                                => 'load_core',
821
-            'EE_Front_Controller'                          => 'load_core',
822
-            'EE_Module_Request_Router'                     => 'load_core',
823
-            'EE_Registry'                                  => 'load_core',
824
-            'EE_Request'                                   => function () use (&$legacy_request) {
825
-                return $legacy_request;
826
-            },
827
-            'EventEspresso\core\services\request\Request'  => function () use (&$request) {
828
-                return $request;
829
-            },
830
-            'EventEspresso\core\services\request\Response' => function () use (&$response) {
831
-                return $response;
832
-            },
833
-            'EE_Base'                                      => 'load_core',
834
-            'EE_Request_Handler'                           => 'load_core',
835
-            'EE_Session'                                   => 'load_core',
836
-            'EE_Cron_Tasks'                                => 'load_core',
837
-            'EE_System'                                    => 'load_core',
838
-            'EE_Maintenance_Mode'                          => 'load_core',
839
-            'EE_Register_CPTs'                             => 'load_core',
840
-            'EE_Admin'                                     => 'load_core',
841
-            'EE_CPT_Strategy'                              => 'load_core',
842
-            // load_lib
843
-            'EE_Message_Resource_Manager'                  => 'load_lib',
844
-            'EE_Message_Type_Collection'                   => 'load_lib',
845
-            'EE_Message_Type_Collection_Loader'            => 'load_lib',
846
-            'EE_Messenger_Collection'                      => 'load_lib',
847
-            'EE_Messenger_Collection_Loader'               => 'load_lib',
848
-            'EE_Messages_Processor'                        => 'load_lib',
849
-            'EE_Message_Repository'                        => 'load_lib',
850
-            'EE_Messages_Queue'                            => 'load_lib',
851
-            'EE_Messages_Data_Handler_Collection'          => 'load_lib',
852
-            'EE_Message_Template_Group_Collection'         => 'load_lib',
853
-            'EE_Payment_Method_Manager'                    => 'load_lib',
854
-            'EE_Messages_Generator'                        => function () {
855
-                return EE_Registry::instance()->load_lib(
856
-                    'Messages_Generator',
857
-                    array(),
858
-                    false,
859
-                    false
860
-                );
861
-            },
862
-            'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
863
-                return EE_Registry::instance()->load_lib(
864
-                    'Messages_Template_Defaults',
865
-                    $arguments,
866
-                    false,
867
-                    false
868
-                );
869
-            },
870
-            // load_helper
871
-            'EEH_Parse_Shortcodes'                         => function () {
872
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
873
-                    return new EEH_Parse_Shortcodes();
874
-                }
875
-                return null;
876
-            },
877
-            'EE_Template_Config'                           => function () {
878
-                return EE_Config::instance()->template_settings;
879
-            },
880
-            'EE_Currency_Config'                           => function () {
881
-                return EE_Config::instance()->currency;
882
-            },
883
-            'EE_Registration_Config'                       => function () {
884
-                return EE_Config::instance()->registration;
885
-            },
886
-            'EE_Core_Config'                               => function () {
887
-                return EE_Config::instance()->core;
888
-            },
889
-            'EventEspresso\core\services\loaders\Loader'   => function () {
890
-                return LoaderFactory::getLoader();
891
-            },
892
-            'EE_Network_Config'                            => function () {
893
-                return EE_Network_Config::instance();
894
-            },
895
-            'EE_Config'                                    => function () {
896
-                return EE_Config::instance();
897
-            },
898
-            'EventEspresso\core\domain\Domain'             => function () {
899
-                return DomainFactory::getEventEspressoCoreDomain();
900
-            },
901
-            'EE_Admin_Config'                              => function () {
902
-                return EE_Config::instance()->admin;
903
-            },
904
-        );
905
-    }
906
-
907
-
908
-    /**
909
-     * can be used for supplying alternate names for classes,
910
-     * or for connecting interface names to instantiable classes
911
-     */
912
-    protected function _register_core_aliases()
913
-    {
914
-        $aliases = array(
915
-            'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
916
-            'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
917
-            'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
918
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
919
-            'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
920
-            'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
921
-            'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
922
-            'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
923
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
924
-            'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
925
-            'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
926
-            'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
927
-            'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
928
-            'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
929
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
930
-            'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
931
-            'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
932
-            'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
933
-            'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
934
-            'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
935
-            'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
936
-            'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
937
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
938
-            'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
939
-            'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
940
-            'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
941
-            'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
942
-            'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
943
-            'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
944
-            'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
945
-            'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
946
-            'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
947
-            'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
948
-            'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
949
-            'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
950
-            'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
951
-            'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
952
-            'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
953
-        );
954
-        foreach ($aliases as $alias => $fqn) {
955
-            if (is_array($fqn)) {
956
-                foreach ($fqn as $class => $for_class) {
957
-                    $this->class_cache->addAlias($class, $alias, $for_class);
958
-                }
959
-                continue;
960
-            }
961
-            $this->class_cache->addAlias($fqn, $alias);
962
-        }
963
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
964
-            $this->class_cache->addAlias(
965
-                'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
966
-                'EventEspresso\core\services\notices\NoticeConverterInterface'
967
-            );
968
-        }
969
-    }
970
-
971
-
972
-    /**
973
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
974
-     * request Primarily used by unit tests.
975
-     */
976
-    public function reset()
977
-    {
978
-        $this->_register_core_class_loaders();
979
-        $this->_register_core_dependencies();
980
-    }
981
-
982
-
983
-    /**
984
-     * PLZ NOTE: a better name for this method would be is_alias()
985
-     * because it returns TRUE if the provided fully qualified name IS an alias
986
-     * WHY?
987
-     * Because if a class is type hinting for a concretion,
988
-     * then why would we need to find another class to supply it?
989
-     * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
990
-     * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
991
-     * Don't go looking for some substitute.
992
-     * Whereas if a class is type hinting for an interface...
993
-     * then we need to find an actual class to use.
994
-     * So the interface IS the alias for some other FQN,
995
-     * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
996
-     * represents some other class.
997
-     *
998
-     * @deprecated 4.9.62.p
999
-     * @param string $fqn
1000
-     * @param string $for_class
1001
-     * @return bool
1002
-     */
1003
-    public function has_alias($fqn = '', $for_class = '')
1004
-    {
1005
-        return $this->isAlias($fqn, $for_class);
1006
-    }
1007
-
1008
-
1009
-    /**
1010
-     * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
1011
-     * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
1012
-     * functions recursively, so that multiple aliases can be used to drill down to a FQN
1013
-     *  for example:
1014
-     *      if the following two entries were added to the _aliases array:
1015
-     *          array(
1016
-     *              'interface_alias'           => 'some\namespace\interface'
1017
-     *              'some\namespace\interface'  => 'some\namespace\classname'
1018
-     *          )
1019
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
1020
-     *      to load an instance of 'some\namespace\classname'
1021
-     *
1022
-     * @deprecated 4.9.62.p
1023
-     * @param string $alias
1024
-     * @param string $for_class
1025
-     * @return string
1026
-     */
1027
-    public function get_alias($alias = '', $for_class = '')
1028
-    {
1029
-        return $this->getFqnForAlias($alias, $for_class);
1030
-    }
23
+	/**
24
+	 * This means that the requested class dependency is not present in the dependency map
25
+	 */
26
+	const not_registered = 0;
27
+
28
+	/**
29
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
30
+	 */
31
+	const load_new_object = 1;
32
+
33
+	/**
34
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
35
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
36
+	 */
37
+	const load_from_cache = 2;
38
+
39
+	/**
40
+	 * When registering a dependency,
41
+	 * this indicates to keep any existing dependencies that already exist,
42
+	 * and simply discard any new dependencies declared in the incoming data
43
+	 */
44
+	const KEEP_EXISTING_DEPENDENCIES = 0;
45
+
46
+	/**
47
+	 * When registering a dependency,
48
+	 * this indicates to overwrite any existing dependencies that already exist using the incoming data
49
+	 */
50
+	const OVERWRITE_DEPENDENCIES = 1;
51
+
52
+
53
+	/**
54
+	 * @type EE_Dependency_Map $_instance
55
+	 */
56
+	protected static $_instance;
57
+
58
+	/**
59
+	 * @var ClassInterfaceCache $class_cache
60
+	 */
61
+	private $class_cache;
62
+
63
+	/**
64
+	 * @type RequestInterface $request
65
+	 */
66
+	protected $request;
67
+
68
+	/**
69
+	 * @type LegacyRequestInterface $legacy_request
70
+	 */
71
+	protected $legacy_request;
72
+
73
+	/**
74
+	 * @type ResponseInterface $response
75
+	 */
76
+	protected $response;
77
+
78
+	/**
79
+	 * @type LoaderInterface $loader
80
+	 */
81
+	protected $loader;
82
+
83
+	/**
84
+	 * @type array $_dependency_map
85
+	 */
86
+	protected $_dependency_map = array();
87
+
88
+	/**
89
+	 * @type array $_class_loaders
90
+	 */
91
+	protected $_class_loaders = array();
92
+
93
+
94
+	/**
95
+	 * EE_Dependency_Map constructor.
96
+	 *
97
+	 * @param ClassInterfaceCache $class_cache
98
+	 */
99
+	protected function __construct(ClassInterfaceCache $class_cache)
100
+	{
101
+		$this->class_cache = $class_cache;
102
+		do_action('EE_Dependency_Map____construct', $this);
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return void
108
+	 */
109
+	public function initialize()
110
+	{
111
+		$this->_register_core_dependencies();
112
+		$this->_register_core_class_loaders();
113
+		$this->_register_core_aliases();
114
+	}
115
+
116
+
117
+	/**
118
+	 * @singleton method used to instantiate class object
119
+	 * @param ClassInterfaceCache|null $class_cache
120
+	 * @return EE_Dependency_Map
121
+	 */
122
+	public static function instance(ClassInterfaceCache $class_cache = null)
123
+	{
124
+		// check if class object is instantiated, and instantiated properly
125
+		if (! self::$_instance instanceof EE_Dependency_Map
126
+			&& $class_cache instanceof ClassInterfaceCache
127
+		) {
128
+			self::$_instance = new EE_Dependency_Map($class_cache);
129
+		}
130
+		return self::$_instance;
131
+	}
132
+
133
+
134
+	/**
135
+	 * @param RequestInterface $request
136
+	 */
137
+	public function setRequest(RequestInterface $request)
138
+	{
139
+		$this->request = $request;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @param LegacyRequestInterface $legacy_request
145
+	 */
146
+	public function setLegacyRequest(LegacyRequestInterface $legacy_request)
147
+	{
148
+		$this->legacy_request = $legacy_request;
149
+	}
150
+
151
+
152
+	/**
153
+	 * @param ResponseInterface $response
154
+	 */
155
+	public function setResponse(ResponseInterface $response)
156
+	{
157
+		$this->response = $response;
158
+	}
159
+
160
+
161
+	/**
162
+	 * @param LoaderInterface $loader
163
+	 */
164
+	public function setLoader(LoaderInterface $loader)
165
+	{
166
+		$this->loader = $loader;
167
+	}
168
+
169
+
170
+	/**
171
+	 * @param string $class
172
+	 * @param array  $dependencies
173
+	 * @param int    $overwrite
174
+	 * @return bool
175
+	 */
176
+	public static function register_dependencies(
177
+		$class,
178
+		array $dependencies,
179
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
180
+	) {
181
+		return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
182
+	}
183
+
184
+
185
+	/**
186
+	 * Assigns an array of class names and corresponding load sources (new or cached)
187
+	 * to the class specified by the first parameter.
188
+	 * IMPORTANT !!!
189
+	 * The order of elements in the incoming $dependencies array MUST match
190
+	 * the order of the constructor parameters for the class in question.
191
+	 * This is especially important when overriding any existing dependencies that are registered.
192
+	 * the third parameter controls whether any duplicate dependencies are overwritten or not.
193
+	 *
194
+	 * @param string $class
195
+	 * @param array  $dependencies
196
+	 * @param int    $overwrite
197
+	 * @return bool
198
+	 */
199
+	public function registerDependencies(
200
+		$class,
201
+		array $dependencies,
202
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
203
+	) {
204
+		$class = trim($class, '\\');
205
+		$registered = false;
206
+		if (empty(self::$_instance->_dependency_map[ $class ])) {
207
+			self::$_instance->_dependency_map[ $class ] = array();
208
+		}
209
+		// we need to make sure that any aliases used when registering a dependency
210
+		// get resolved to the correct class name
211
+		foreach ($dependencies as $dependency => $load_source) {
212
+			$alias = self::$_instance->getFqnForAlias($dependency);
213
+			if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
214
+				|| ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
215
+			) {
216
+				unset($dependencies[ $dependency ]);
217
+				$dependencies[ $alias ] = $load_source;
218
+				$registered = true;
219
+			}
220
+		}
221
+		// now add our two lists of dependencies together.
222
+		// using Union (+=) favours the arrays in precedence from left to right,
223
+		// so $dependencies is NOT overwritten because it is listed first
224
+		// ie: with A = B + C, entries in B take precedence over duplicate entries in C
225
+		// Union is way faster than array_merge() but should be used with caution...
226
+		// especially with numerically indexed arrays
227
+		$dependencies += self::$_instance->_dependency_map[ $class ];
228
+		// now we need to ensure that the resulting dependencies
229
+		// array only has the entries that are required for the class
230
+		// so first count how many dependencies were originally registered for the class
231
+		$dependency_count = count(self::$_instance->_dependency_map[ $class ]);
232
+		// if that count is non-zero (meaning dependencies were already registered)
233
+		self::$_instance->_dependency_map[ $class ] = $dependency_count
234
+			// then truncate the  final array to match that count
235
+			? array_slice($dependencies, 0, $dependency_count)
236
+			// otherwise just take the incoming array because nothing previously existed
237
+			: $dependencies;
238
+		return $registered;
239
+	}
240
+
241
+
242
+	/**
243
+	 * @param string $class_name
244
+	 * @param string $loader
245
+	 * @return bool
246
+	 * @throws DomainException
247
+	 */
248
+	public static function register_class_loader($class_name, $loader = 'load_core')
249
+	{
250
+		if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) {
251
+			throw new DomainException(
252
+				esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
253
+			);
254
+		}
255
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
256
+		if (! is_callable($loader)
257
+			&& (
258
+				strpos($loader, 'load_') !== 0
259
+				|| ! method_exists('EE_Registry', $loader)
260
+			)
261
+		) {
262
+			throw new DomainException(
263
+				sprintf(
264
+					esc_html__(
265
+						'"%1$s" is not a valid loader method on EE_Registry.',
266
+						'event_espresso'
267
+					),
268
+					$loader
269
+				)
270
+			);
271
+		}
272
+		$class_name = self::$_instance->getFqnForAlias($class_name);
273
+		if (! isset(self::$_instance->_class_loaders[ $class_name ])) {
274
+			self::$_instance->_class_loaders[ $class_name ] = $loader;
275
+			return true;
276
+		}
277
+		return false;
278
+	}
279
+
280
+
281
+	/**
282
+	 * @return array
283
+	 */
284
+	public function dependency_map()
285
+	{
286
+		return $this->_dependency_map;
287
+	}
288
+
289
+
290
+	/**
291
+	 * returns TRUE if dependency map contains a listing for the provided class name
292
+	 *
293
+	 * @param string $class_name
294
+	 * @return boolean
295
+	 */
296
+	public function has($class_name = '')
297
+	{
298
+		// all legacy models have the same dependencies
299
+		if (strpos($class_name, 'EEM_') === 0) {
300
+			$class_name = 'LEGACY_MODELS';
301
+		}
302
+		return isset($this->_dependency_map[ $class_name ]) ? true : false;
303
+	}
304
+
305
+
306
+	/**
307
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
308
+	 *
309
+	 * @param string $class_name
310
+	 * @param string $dependency
311
+	 * @return bool
312
+	 */
313
+	public function has_dependency_for_class($class_name = '', $dependency = '')
314
+	{
315
+		// all legacy models have the same dependencies
316
+		if (strpos($class_name, 'EEM_') === 0) {
317
+			$class_name = 'LEGACY_MODELS';
318
+		}
319
+		$dependency = $this->getFqnForAlias($dependency, $class_name);
320
+		return isset($this->_dependency_map[ $class_name ][ $dependency ])
321
+			? true
322
+			: false;
323
+	}
324
+
325
+
326
+	/**
327
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
328
+	 *
329
+	 * @param string $class_name
330
+	 * @param string $dependency
331
+	 * @return int
332
+	 */
333
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
334
+	{
335
+		// all legacy models have the same dependencies
336
+		if (strpos($class_name, 'EEM_') === 0) {
337
+			$class_name = 'LEGACY_MODELS';
338
+		}
339
+		$dependency = $this->getFqnForAlias($dependency);
340
+		return $this->has_dependency_for_class($class_name, $dependency)
341
+			? $this->_dependency_map[ $class_name ][ $dependency ]
342
+			: EE_Dependency_Map::not_registered;
343
+	}
344
+
345
+
346
+	/**
347
+	 * @param string $class_name
348
+	 * @return string | Closure
349
+	 */
350
+	public function class_loader($class_name)
351
+	{
352
+		// all legacy models use load_model()
353
+		if (strpos($class_name, 'EEM_') === 0) {
354
+			return 'load_model';
355
+		}
356
+		// EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc
357
+		// perform strpos() first to avoid loading regex every time we load a class
358
+		if (strpos($class_name, 'EE_CPT_') === 0
359
+			&& preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name)
360
+		) {
361
+			return 'load_core';
362
+		}
363
+		$class_name = $this->getFqnForAlias($class_name);
364
+		return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : '';
365
+	}
366
+
367
+
368
+	/**
369
+	 * @return array
370
+	 */
371
+	public function class_loaders()
372
+	{
373
+		return $this->_class_loaders;
374
+	}
375
+
376
+
377
+	/**
378
+	 * adds an alias for a classname
379
+	 *
380
+	 * @param string $fqcn      the class name that should be used (concrete class to replace interface)
381
+	 * @param string $alias     the class name that would be type hinted for (abstract parent or interface)
382
+	 * @param string $for_class the class that has the dependency (is type hinting for the interface)
383
+	 */
384
+	public function add_alias($fqcn, $alias, $for_class = '')
385
+	{
386
+		$this->class_cache->addAlias($fqcn, $alias, $for_class);
387
+	}
388
+
389
+
390
+	/**
391
+	 * Returns TRUE if the provided fully qualified name IS an alias
392
+	 * WHY?
393
+	 * Because if a class is type hinting for a concretion,
394
+	 * then why would we need to find another class to supply it?
395
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
396
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
397
+	 * Don't go looking for some substitute.
398
+	 * Whereas if a class is type hinting for an interface...
399
+	 * then we need to find an actual class to use.
400
+	 * So the interface IS the alias for some other FQN,
401
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
402
+	 * represents some other class.
403
+	 *
404
+	 * @param string $fqn
405
+	 * @param string $for_class
406
+	 * @return bool
407
+	 */
408
+	public function isAlias($fqn = '', $for_class = '')
409
+	{
410
+		return $this->class_cache->isAlias($fqn, $for_class);
411
+	}
412
+
413
+
414
+	/**
415
+	 * Returns a FQN for provided alias if one exists, otherwise returns the original $alias
416
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
417
+	 *  for example:
418
+	 *      if the following two entries were added to the _aliases array:
419
+	 *          array(
420
+	 *              'interface_alias'           => 'some\namespace\interface'
421
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
422
+	 *          )
423
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
424
+	 *      to load an instance of 'some\namespace\classname'
425
+	 *
426
+	 * @param string $alias
427
+	 * @param string $for_class
428
+	 * @return string
429
+	 */
430
+	public function getFqnForAlias($alias = '', $for_class = '')
431
+	{
432
+		return (string) $this->class_cache->getFqnForAlias($alias, $for_class);
433
+	}
434
+
435
+
436
+	/**
437
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
438
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
439
+	 * This is done by using the following class constants:
440
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
441
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
442
+	 */
443
+	protected function _register_core_dependencies()
444
+	{
445
+		$this->_dependency_map = array(
446
+			'EE_Request_Handler'                                                                                          => array(
447
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
448
+			),
449
+			'EE_System'                                                                                                   => array(
450
+				'EE_Registry'                                 => EE_Dependency_Map::load_from_cache,
451
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
452
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
453
+				'EE_Maintenance_Mode'                         => EE_Dependency_Map::load_from_cache,
454
+			),
455
+			'EE_Session'                                                                                                  => array(
456
+				'EventEspresso\core\services\cache\TransientCacheStorage'  => EE_Dependency_Map::load_from_cache,
457
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
458
+				'EventEspresso\core\services\request\Request'              => EE_Dependency_Map::load_from_cache,
459
+				'EE_Encryption'                                            => EE_Dependency_Map::load_from_cache,
460
+			),
461
+			'EE_Cart'                                                                                                     => array(
462
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
463
+			),
464
+			'EE_Front_Controller'                                                                                         => array(
465
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
466
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
467
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
468
+			),
469
+			'EE_Messenger_Collection_Loader'                                                                              => array(
470
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
471
+			),
472
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
473
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
474
+			),
475
+			'EE_Message_Resource_Manager'                                                                                 => array(
476
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
477
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
478
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
479
+			),
480
+			'EE_Message_Factory'                                                                                          => array(
481
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
482
+			),
483
+			'EE_messages'                                                                                                 => array(
484
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
485
+			),
486
+			'EE_Messages_Generator'                                                                                       => array(
487
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
488
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
489
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
490
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
491
+			),
492
+			'EE_Messages_Processor'                                                                                       => array(
493
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
494
+			),
495
+			'EE_Messages_Queue'                                                                                           => array(
496
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
497
+			),
498
+			'EE_Messages_Template_Defaults'                                                                               => array(
499
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
500
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
501
+			),
502
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
503
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
504
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
505
+			),
506
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
507
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
508
+			),
509
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
510
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
511
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
512
+			),
513
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
514
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
515
+			),
516
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
517
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
518
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
519
+			),
520
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
521
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
522
+			),
523
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
524
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
525
+			),
526
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
527
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
528
+			),
529
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
530
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
531
+			),
532
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
533
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
534
+			),
535
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
536
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
537
+			),
538
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
539
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
540
+			),
541
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
542
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
543
+			),
544
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
545
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
546
+			),
547
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
548
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
549
+			),
550
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
551
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
552
+			),
553
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
554
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
555
+			),
556
+			'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler'                                  => array(
557
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
558
+			),
559
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
560
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
561
+			),
562
+			'EE_Data_Migration_Class_Base'                                                                                => array(
563
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
564
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
565
+			),
566
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
567
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
568
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
569
+			),
570
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
571
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
572
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
573
+			),
574
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
575
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
576
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
577
+			),
578
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
579
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
580
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
581
+			),
582
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
583
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
584
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
585
+			),
586
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
587
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
588
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
589
+			),
590
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
591
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
592
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
593
+			),
594
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
595
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
596
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
597
+			),
598
+			'EE_DMS_Core_4_9_0'                                                                                           => array(
599
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
600
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
601
+			),
602
+			'EventEspresso\core\services\assets\I18nRegistry'                                                             => array(
603
+				array(),
604
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
605
+			),
606
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
607
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
608
+				'EventEspresso\core\services\assets\I18nRegistry'    => EE_Dependency_Map::load_from_cache,
609
+			),
610
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
611
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
612
+			),
613
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
614
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
615
+			),
616
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
617
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
618
+			),
619
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
620
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
621
+			),
622
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
623
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
624
+			),
625
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
626
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
627
+			),
628
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
629
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
630
+			),
631
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
632
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
633
+			),
634
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
635
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
636
+			),
637
+			'EventEspresso\core\domain\services\validation\email\EmailValidationService'                                  => array(
638
+				'EE_Registration_Config'                     => EE_Dependency_Map::load_from_cache,
639
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
640
+			),
641
+			'EventEspresso\core\domain\values\EmailAddress'                                                               => array(
642
+				null,
643
+				'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache,
644
+			),
645
+			'EventEspresso\core\services\orm\ModelFieldFactory'                                                           => array(
646
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
647
+			),
648
+			'LEGACY_MODELS'                                                                                               => array(
649
+				null,
650
+				'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache,
651
+			),
652
+			'EE_Module_Request_Router'                                                                                    => array(
653
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
654
+			),
655
+			'EE_Registration_Processor'                                                                                   => array(
656
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
657
+			),
658
+			'EventEspresso\core\services\notifications\PersistentAdminNoticeManager'                                      => array(
659
+				null,
660
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
661
+				'EE_Request'                                                          => EE_Dependency_Map::load_from_cache,
662
+			),
663
+			'EventEspresso\core\services\licensing\LicenseService'                                                        => array(
664
+				'EventEspresso\core\domain\services\pue\Stats'  => EE_Dependency_Map::load_from_cache,
665
+				'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache,
666
+			),
667
+			'EE_Admin_Transactions_List_Table'                                                                            => array(
668
+				null,
669
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache,
670
+			),
671
+			'EventEspresso\core\domain\services\pue\Stats'                                                                => array(
672
+				'EventEspresso\core\domain\services\pue\Config'        => EE_Dependency_Map::load_from_cache,
673
+				'EE_Maintenance_Mode'                                  => EE_Dependency_Map::load_from_cache,
674
+				'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache,
675
+			),
676
+			'EventEspresso\core\domain\services\pue\Config'                                                               => array(
677
+				'EE_Network_Config' => EE_Dependency_Map::load_from_cache,
678
+				'EE_Config'         => EE_Dependency_Map::load_from_cache,
679
+			),
680
+			'EventEspresso\core\domain\services\pue\StatsGatherer'                                                        => array(
681
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
682
+				'EEM_Event'          => EE_Dependency_Map::load_from_cache,
683
+				'EEM_Datetime'       => EE_Dependency_Map::load_from_cache,
684
+				'EEM_Ticket'         => EE_Dependency_Map::load_from_cache,
685
+				'EEM_Registration'   => EE_Dependency_Map::load_from_cache,
686
+				'EEM_Transaction'    => EE_Dependency_Map::load_from_cache,
687
+				'EE_Config'          => EE_Dependency_Map::load_from_cache,
688
+			),
689
+			'EventEspresso\core\domain\services\admin\ExitModal'                                                          => array(
690
+				'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache,
691
+			),
692
+			'EventEspresso\core\domain\services\admin\PluginUpsells'                                                      => array(
693
+				'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache,
694
+			),
695
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha'                                    => array(
696
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
697
+				'EE_Session'             => EE_Dependency_Map::load_from_cache,
698
+			),
699
+			'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings'                                => array(
700
+				'EE_Registration_Config' => EE_Dependency_Map::load_from_cache,
701
+			),
702
+			'EventEspresso\modules\ticket_selector\ProcessTicketSelector'                                                 => array(
703
+				'EE_Core_Config'                                                          => EE_Dependency_Map::load_from_cache,
704
+				'EventEspresso\core\services\request\Request'                             => EE_Dependency_Map::load_from_cache,
705
+				'EE_Session'                                                              => EE_Dependency_Map::load_from_cache,
706
+				'EEM_Ticket'                                                              => EE_Dependency_Map::load_from_cache,
707
+				'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache,
708
+			),
709
+			'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'                                     => array(
710
+				'EEM_Datetime' => EE_Dependency_Map::load_from_cache,
711
+			),
712
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'                              => array(
713
+				'EE_Core_Config'                             => EE_Dependency_Map::load_from_cache,
714
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
715
+			),
716
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'                                => array(
717
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
718
+			),
719
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'                               => array(
720
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
721
+			),
722
+			'EE_CPT_Strategy'                                                                                             => array(
723
+				'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache,
724
+				'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache,
725
+			),
726
+			'EventEspresso\core\services\loaders\ObjectIdentifier'                                                        => array(
727
+				'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache,
728
+			),
729
+			'EventEspresso\core\domain\services\assets\CoreAssetManager'                                                  => array(
730
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
731
+				'EE_Currency_Config'                                 => EE_Dependency_Map::load_from_cache,
732
+				'EE_Template_Config'                                 => EE_Dependency_Map::load_from_cache,
733
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
734
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
735
+			),
736
+			'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array(
737
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache,
738
+				'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache
739
+			),
740
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array(
741
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
742
+			),
743
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array(
744
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
745
+				'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache
746
+			),
747
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array(
748
+				'EEM_Checkin' => EE_Dependency_Map::load_from_cache,
749
+			),
750
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array(
751
+				'EEM_Registration' => EE_Dependency_Map::load_from_cache,
752
+			),
753
+			'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array(
754
+				'EEM_Transaction' => EE_Dependency_Map::load_from_cache,
755
+			),
756
+			'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array(
757
+				'EEM_Attendee' => EE_Dependency_Map::load_from_cache,
758
+			),
759
+			'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array(
760
+				'EEM_Answer' => EE_Dependency_Map::load_from_cache,
761
+				'EEM_Question' => EE_Dependency_Map::load_from_cache,
762
+			),
763
+			'EventEspresso\core\CPTs\CptQueryModifier' => array(
764
+				null,
765
+				null,
766
+				null,
767
+				'EE_Request_Handler'                          => EE_Dependency_Map::load_from_cache,
768
+				'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
769
+				'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
770
+			),
771
+			'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array(
772
+				'EE_Registry' => EE_Dependency_Map::load_from_cache,
773
+				'EE_Config' => EE_Dependency_Map::load_from_cache
774
+			),
775
+			'EventEspresso\core\services\editor\BlockRegistrationManager'                                                 => array(
776
+				'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache,
777
+				'EventEspresso\core\domain\entities\editor\BlockCollection'      => EE_Dependency_Map::load_from_cache,
778
+				'EventEspresso\core\services\request\Request'                    => EE_Dependency_Map::load_from_cache,
779
+			),
780
+			'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager' => array(
781
+				'EventEspresso\core\domain\Domain'                   => EE_Dependency_Map::load_from_cache,
782
+				'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache,
783
+				'EventEspresso\core\services\assets\Registry'        => EE_Dependency_Map::load_from_cache,
784
+			),
785
+			'EventEspresso\core\domain\entities\editor\blocks\widgets\EventAttendees' => array(
786
+				'EventEspresso\core\domain\entities\editor\blocks\CoreBlocksAssetManager' => self::load_from_cache,
787
+				'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees' => self::load_from_cache,
788
+			),
789
+		);
790
+	}
791
+
792
+
793
+	/**
794
+	 * Registers how core classes are loaded.
795
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
796
+	 *        'EE_Request_Handler' => 'load_core'
797
+	 *        'EE_Messages_Queue'  => 'load_lib'
798
+	 *        'EEH_Debug_Tools'    => 'load_helper'
799
+	 * or, if greater control is required, by providing a custom closure. For example:
800
+	 *        'Some_Class' => function () {
801
+	 *            return new Some_Class();
802
+	 *        },
803
+	 * This is required for instantiating dependencies
804
+	 * where an interface has been type hinted in a class constructor. For example:
805
+	 *        'Required_Interface' => function () {
806
+	 *            return new A_Class_That_Implements_Required_Interface();
807
+	 *        },
808
+	 */
809
+	protected function _register_core_class_loaders()
810
+	{
811
+		// for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
812
+		// be used in a closure.
813
+		$request = &$this->request;
814
+		$response = &$this->response;
815
+		$legacy_request = &$this->legacy_request;
816
+		// $loader = &$this->loader;
817
+		$this->_class_loaders = array(
818
+			// load_core
819
+			'EE_Capabilities'                              => 'load_core',
820
+			'EE_Encryption'                                => 'load_core',
821
+			'EE_Front_Controller'                          => 'load_core',
822
+			'EE_Module_Request_Router'                     => 'load_core',
823
+			'EE_Registry'                                  => 'load_core',
824
+			'EE_Request'                                   => function () use (&$legacy_request) {
825
+				return $legacy_request;
826
+			},
827
+			'EventEspresso\core\services\request\Request'  => function () use (&$request) {
828
+				return $request;
829
+			},
830
+			'EventEspresso\core\services\request\Response' => function () use (&$response) {
831
+				return $response;
832
+			},
833
+			'EE_Base'                                      => 'load_core',
834
+			'EE_Request_Handler'                           => 'load_core',
835
+			'EE_Session'                                   => 'load_core',
836
+			'EE_Cron_Tasks'                                => 'load_core',
837
+			'EE_System'                                    => 'load_core',
838
+			'EE_Maintenance_Mode'                          => 'load_core',
839
+			'EE_Register_CPTs'                             => 'load_core',
840
+			'EE_Admin'                                     => 'load_core',
841
+			'EE_CPT_Strategy'                              => 'load_core',
842
+			// load_lib
843
+			'EE_Message_Resource_Manager'                  => 'load_lib',
844
+			'EE_Message_Type_Collection'                   => 'load_lib',
845
+			'EE_Message_Type_Collection_Loader'            => 'load_lib',
846
+			'EE_Messenger_Collection'                      => 'load_lib',
847
+			'EE_Messenger_Collection_Loader'               => 'load_lib',
848
+			'EE_Messages_Processor'                        => 'load_lib',
849
+			'EE_Message_Repository'                        => 'load_lib',
850
+			'EE_Messages_Queue'                            => 'load_lib',
851
+			'EE_Messages_Data_Handler_Collection'          => 'load_lib',
852
+			'EE_Message_Template_Group_Collection'         => 'load_lib',
853
+			'EE_Payment_Method_Manager'                    => 'load_lib',
854
+			'EE_Messages_Generator'                        => function () {
855
+				return EE_Registry::instance()->load_lib(
856
+					'Messages_Generator',
857
+					array(),
858
+					false,
859
+					false
860
+				);
861
+			},
862
+			'EE_Messages_Template_Defaults'                => function ($arguments = array()) {
863
+				return EE_Registry::instance()->load_lib(
864
+					'Messages_Template_Defaults',
865
+					$arguments,
866
+					false,
867
+					false
868
+				);
869
+			},
870
+			// load_helper
871
+			'EEH_Parse_Shortcodes'                         => function () {
872
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
873
+					return new EEH_Parse_Shortcodes();
874
+				}
875
+				return null;
876
+			},
877
+			'EE_Template_Config'                           => function () {
878
+				return EE_Config::instance()->template_settings;
879
+			},
880
+			'EE_Currency_Config'                           => function () {
881
+				return EE_Config::instance()->currency;
882
+			},
883
+			'EE_Registration_Config'                       => function () {
884
+				return EE_Config::instance()->registration;
885
+			},
886
+			'EE_Core_Config'                               => function () {
887
+				return EE_Config::instance()->core;
888
+			},
889
+			'EventEspresso\core\services\loaders\Loader'   => function () {
890
+				return LoaderFactory::getLoader();
891
+			},
892
+			'EE_Network_Config'                            => function () {
893
+				return EE_Network_Config::instance();
894
+			},
895
+			'EE_Config'                                    => function () {
896
+				return EE_Config::instance();
897
+			},
898
+			'EventEspresso\core\domain\Domain'             => function () {
899
+				return DomainFactory::getEventEspressoCoreDomain();
900
+			},
901
+			'EE_Admin_Config'                              => function () {
902
+				return EE_Config::instance()->admin;
903
+			},
904
+		);
905
+	}
906
+
907
+
908
+	/**
909
+	 * can be used for supplying alternate names for classes,
910
+	 * or for connecting interface names to instantiable classes
911
+	 */
912
+	protected function _register_core_aliases()
913
+	{
914
+		$aliases = array(
915
+			'CommandBusInterface'                                                          => 'EventEspresso\core\services\commands\CommandBusInterface',
916
+			'EventEspresso\core\services\commands\CommandBusInterface'                     => 'EventEspresso\core\services\commands\CommandBus',
917
+			'CommandHandlerManagerInterface'                                               => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
918
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface'          => 'EventEspresso\core\services\commands\CommandHandlerManager',
919
+			'CapChecker'                                                                   => 'EventEspresso\core\services\commands\middleware\CapChecker',
920
+			'AddActionHook'                                                                => 'EventEspresso\core\services\commands\middleware\AddActionHook',
921
+			'CapabilitiesChecker'                                                          => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
922
+			'CapabilitiesCheckerInterface'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
923
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
924
+			'CreateRegistrationService'                                                    => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
925
+			'CreateRegistrationCommandHandler'                                             => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
926
+			'CopyRegistrationDetailsCommandHandler'                                        => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
927
+			'CopyRegistrationPaymentsCommandHandler'                                       => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
928
+			'CancelRegistrationAndTicketLineItemCommandHandler'                            => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
929
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'                    => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
930
+			'CreateTicketLineItemCommandHandler'                                           => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
931
+			'CreateTransactionCommandHandler'                                              => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler',
932
+			'CreateAttendeeCommandHandler'                                                 => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler',
933
+			'TableManager'                                                                 => 'EventEspresso\core\services\database\TableManager',
934
+			'TableAnalysis'                                                                => 'EventEspresso\core\services\database\TableAnalysis',
935
+			'EspressoShortcode'                                                            => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
936
+			'ShortcodeInterface'                                                           => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
937
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'                    => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
938
+			'EventEspresso\core\services\cache\CacheStorageInterface'                      => 'EventEspresso\core\services\cache\TransientCacheStorage',
939
+			'LoaderInterface'                                                              => 'EventEspresso\core\services\loaders\LoaderInterface',
940
+			'EventEspresso\core\services\loaders\LoaderInterface'                          => 'EventEspresso\core\services\loaders\Loader',
941
+			'CommandFactoryInterface'                                                      => 'EventEspresso\core\services\commands\CommandFactoryInterface',
942
+			'EventEspresso\core\services\commands\CommandFactoryInterface'                 => 'EventEspresso\core\services\commands\CommandFactory',
943
+			'EventEspresso\core\domain\services\session\SessionIdentifierInterface'        => 'EE_Session',
944
+			'EmailValidatorInterface'                                                      => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface',
945
+			'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface'  => 'EventEspresso\core\domain\services\validation\email\EmailValidationService',
946
+			'NoticeConverterInterface'                                                     => 'EventEspresso\core\services\notices\NoticeConverterInterface',
947
+			'EventEspresso\core\services\notices\NoticeConverterInterface'                 => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors',
948
+			'NoticesContainerInterface'                                                    => 'EventEspresso\core\services\notices\NoticesContainerInterface',
949
+			'EventEspresso\core\services\notices\NoticesContainerInterface'                => 'EventEspresso\core\services\notices\NoticesContainer',
950
+			'EventEspresso\core\services\request\RequestInterface'                         => 'EventEspresso\core\services\request\Request',
951
+			'EventEspresso\core\services\request\ResponseInterface'                        => 'EventEspresso\core\services\request\Response',
952
+			'EventEspresso\core\domain\DomainInterface'                                    => 'EventEspresso\core\domain\Domain',
953
+		);
954
+		foreach ($aliases as $alias => $fqn) {
955
+			if (is_array($fqn)) {
956
+				foreach ($fqn as $class => $for_class) {
957
+					$this->class_cache->addAlias($class, $alias, $for_class);
958
+				}
959
+				continue;
960
+			}
961
+			$this->class_cache->addAlias($fqn, $alias);
962
+		}
963
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
964
+			$this->class_cache->addAlias(
965
+				'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices',
966
+				'EventEspresso\core\services\notices\NoticeConverterInterface'
967
+			);
968
+		}
969
+	}
970
+
971
+
972
+	/**
973
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
974
+	 * request Primarily used by unit tests.
975
+	 */
976
+	public function reset()
977
+	{
978
+		$this->_register_core_class_loaders();
979
+		$this->_register_core_dependencies();
980
+	}
981
+
982
+
983
+	/**
984
+	 * PLZ NOTE: a better name for this method would be is_alias()
985
+	 * because it returns TRUE if the provided fully qualified name IS an alias
986
+	 * WHY?
987
+	 * Because if a class is type hinting for a concretion,
988
+	 * then why would we need to find another class to supply it?
989
+	 * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`,
990
+	 * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`.
991
+	 * Don't go looking for some substitute.
992
+	 * Whereas if a class is type hinting for an interface...
993
+	 * then we need to find an actual class to use.
994
+	 * So the interface IS the alias for some other FQN,
995
+	 * and we need to find out if `Fully/Qualified/Namespace/SomeInterface`
996
+	 * represents some other class.
997
+	 *
998
+	 * @deprecated 4.9.62.p
999
+	 * @param string $fqn
1000
+	 * @param string $for_class
1001
+	 * @return bool
1002
+	 */
1003
+	public function has_alias($fqn = '', $for_class = '')
1004
+	{
1005
+		return $this->isAlias($fqn, $for_class);
1006
+	}
1007
+
1008
+
1009
+	/**
1010
+	 * PLZ NOTE: a better name for this method would be get_fqn_for_alias()
1011
+	 * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias
1012
+	 * functions recursively, so that multiple aliases can be used to drill down to a FQN
1013
+	 *  for example:
1014
+	 *      if the following two entries were added to the _aliases array:
1015
+	 *          array(
1016
+	 *              'interface_alias'           => 'some\namespace\interface'
1017
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
1018
+	 *          )
1019
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
1020
+	 *      to load an instance of 'some\namespace\classname'
1021
+	 *
1022
+	 * @deprecated 4.9.62.p
1023
+	 * @param string $alias
1024
+	 * @param string $for_class
1025
+	 * @return string
1026
+	 */
1027
+	public function get_alias($alias = '', $for_class = '')
1028
+	{
1029
+		return $this->getFqnForAlias($alias, $for_class);
1030
+	}
1031 1031
 }
Please login to merge, or discard this patch.