Completed
Branch TASK-10784-decaf-about-page (e72a32)
by
unknown
143:01 queued 126:18
created
core/libraries/plugin_api/EE_Register_Payment_Method.lib.php 2 patches
Indentation   +107 added lines, -107 removed lines patch added patch discarded remove patch
@@ -18,122 +18,122 @@
 block discarded – undo
18 18
 class EE_Register_Payment_Method implements EEI_Plugin_API
19 19
 {
20 20
 
21
-    /**
22
-     * Holds values for registered payment methods
23
-     *
24
-     * @var array
25
-     */
26
-    protected static $_settings = array();
21
+	/**
22
+	 * Holds values for registered payment methods
23
+	 *
24
+	 * @var array
25
+	 */
26
+	protected static $_settings = array();
27 27
 
28 28
 
29 29
 
30
-    /**
31
-     * Method for registering new EE_PMT_Base children
32
-     *
33
-     * @since    4.5.0
34
-     * @param string  $payment_method_id    a unique identifier for this set of modules Required.
35
-     * @param  array  $setup_args           an array of arguments provided for registering modules Required.{
36
-     * @type string[] $payment_method_paths each element is the folder containing the EE_PMT_Base child class
37
-     *                                      (eg, 'public_html/wp-content/plugins/my_plugin/Payomatic/' which contains
38
-     *                                      the files EE_PMT_Payomatic.pm.php)
39
-     *                                      }
40
-     * @throws EE_Error
41
-     * @type array payment_method_paths    an array of full server paths to folders containing any EE_PMT_Base
42
-     *       children, or to the EED_Module files themselves
43
-     * @return void
44
-     */
45
-    public static function register($payment_method_id = null, $setup_args = array())
46
-    {
47
-        //required fields MUST be present, so let's make sure they are.
48
-        if (empty($payment_method_id) || ! is_array($setup_args) || empty($setup_args['payment_method_paths'])) {
49
-            throw new EE_Error(
50
-                esc_html__(
51
-                    'In order to register Payment Methods with EE_Register_Payment_Method::register(), you must include a "payment_method_id" (a unique identifier for this set of modules), and an array containing the following keys: "payment_method_paths" (an array of full server paths to folders that contain modules, or to the module files themselves)',
52
-                    'event_espresso'
53
-                )
54
-            );
55
-        }
56
-        //make sure we don't register twice
57
-        if (isset(self::$_settings[$payment_method_id])) {
58
-            return;
59
-        }
60
-        //make sure this was called in the right place!
61
-        if (
62
-            ! did_action('AHEE__EE_System__load_espresso_addons')
63
-            || did_action('AHEE__EE_System__register_shortcodes_modules_and_widgets')
64
-        ) {
65
-            EE_Error::doing_it_wrong(
66
-                __METHOD__,
67
-                esc_html__(
68
-                    'An attempt to register modules has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__register_shortcodes_modules_and_widgets" hook to register modules.',
69
-                    'event_espresso'
70
-                ),
71
-                '4.3.0'
72
-            );
73
-        }
74
-        //setup $_settings array from incoming values.
75
-        self::$_settings[$payment_method_id] = array(
76
-            // array of full server paths to any EE_PMT_Base children used
77
-            'payment_method_paths' => isset($setup_args['payment_method_paths'])
78
-                ? (array)$setup_args['payment_method_paths']
79
-                : array(),
80
-        );
81
-        // add to list of modules to be registered
82
-        add_filter(
83
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
84
-            array('EE_Register_Payment_Method', 'add_payment_methods')
85
-        );
86
-        /**
87
-         * If EE_Payment_Method_Manager::register_payment_methods has already been called,
88
-         * we need it to be called again (because it's missing the payment method we JUST registered here).
89
-         * We are assuming EE_Register_payment_method::register() will be called only once
90
-         * per payment method from an addon, so going with that assumption we should always do this.
91
-         * If that assumption is false, we should verify this newly-registered payment method
92
-         * isn't on the EE_Payment_Method_Manager::_payment_method_types array before calling this
93
-         * (this code should be changed to improve performance)
94
-         */
95
-        if (did_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods')) {
96
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
97
-            EE_Payment_Method_Manager::instance()->maybe_register_payment_methods(true);
98
-        }
99
-    }
30
+	/**
31
+	 * Method for registering new EE_PMT_Base children
32
+	 *
33
+	 * @since    4.5.0
34
+	 * @param string  $payment_method_id    a unique identifier for this set of modules Required.
35
+	 * @param  array  $setup_args           an array of arguments provided for registering modules Required.{
36
+	 * @type string[] $payment_method_paths each element is the folder containing the EE_PMT_Base child class
37
+	 *                                      (eg, 'public_html/wp-content/plugins/my_plugin/Payomatic/' which contains
38
+	 *                                      the files EE_PMT_Payomatic.pm.php)
39
+	 *                                      }
40
+	 * @throws EE_Error
41
+	 * @type array payment_method_paths    an array of full server paths to folders containing any EE_PMT_Base
42
+	 *       children, or to the EED_Module files themselves
43
+	 * @return void
44
+	 */
45
+	public static function register($payment_method_id = null, $setup_args = array())
46
+	{
47
+		//required fields MUST be present, so let's make sure they are.
48
+		if (empty($payment_method_id) || ! is_array($setup_args) || empty($setup_args['payment_method_paths'])) {
49
+			throw new EE_Error(
50
+				esc_html__(
51
+					'In order to register Payment Methods with EE_Register_Payment_Method::register(), you must include a "payment_method_id" (a unique identifier for this set of modules), and an array containing the following keys: "payment_method_paths" (an array of full server paths to folders that contain modules, or to the module files themselves)',
52
+					'event_espresso'
53
+				)
54
+			);
55
+		}
56
+		//make sure we don't register twice
57
+		if (isset(self::$_settings[$payment_method_id])) {
58
+			return;
59
+		}
60
+		//make sure this was called in the right place!
61
+		if (
62
+			! did_action('AHEE__EE_System__load_espresso_addons')
63
+			|| did_action('AHEE__EE_System__register_shortcodes_modules_and_widgets')
64
+		) {
65
+			EE_Error::doing_it_wrong(
66
+				__METHOD__,
67
+				esc_html__(
68
+					'An attempt to register modules has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__register_shortcodes_modules_and_widgets" hook to register modules.',
69
+					'event_espresso'
70
+				),
71
+				'4.3.0'
72
+			);
73
+		}
74
+		//setup $_settings array from incoming values.
75
+		self::$_settings[$payment_method_id] = array(
76
+			// array of full server paths to any EE_PMT_Base children used
77
+			'payment_method_paths' => isset($setup_args['payment_method_paths'])
78
+				? (array)$setup_args['payment_method_paths']
79
+				: array(),
80
+		);
81
+		// add to list of modules to be registered
82
+		add_filter(
83
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
84
+			array('EE_Register_Payment_Method', 'add_payment_methods')
85
+		);
86
+		/**
87
+		 * If EE_Payment_Method_Manager::register_payment_methods has already been called,
88
+		 * we need it to be called again (because it's missing the payment method we JUST registered here).
89
+		 * We are assuming EE_Register_payment_method::register() will be called only once
90
+		 * per payment method from an addon, so going with that assumption we should always do this.
91
+		 * If that assumption is false, we should verify this newly-registered payment method
92
+		 * isn't on the EE_Payment_Method_Manager::_payment_method_types array before calling this
93
+		 * (this code should be changed to improve performance)
94
+		 */
95
+		if (did_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods')) {
96
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
97
+			EE_Payment_Method_Manager::instance()->maybe_register_payment_methods(true);
98
+		}
99
+	}
100 100
 
101 101
 
102 102
 
103
-    /**
104
-     * Filters the list of payment methods to add ours.
105
-     * and they're just full filepaths to FOLDERS containing a payment method class file. Eg.
106
-     *
107
-     * @param array $payment_method_folders array of paths to all payment methods that require registering
108
-     * @return array
109
-     */
110
-    public static function add_payment_methods($payment_method_folders)
111
-    {
112
-        foreach (self::$_settings as $settings) {
113
-            $payment_method_folders = array_merge(
114
-                $payment_method_folders,
115
-                $settings['payment_method_paths']
116
-            );
117
-        }
118
-        return $payment_method_folders;
119
-    }
103
+	/**
104
+	 * Filters the list of payment methods to add ours.
105
+	 * and they're just full filepaths to FOLDERS containing a payment method class file. Eg.
106
+	 *
107
+	 * @param array $payment_method_folders array of paths to all payment methods that require registering
108
+	 * @return array
109
+	 */
110
+	public static function add_payment_methods($payment_method_folders)
111
+	{
112
+		foreach (self::$_settings as $settings) {
113
+			$payment_method_folders = array_merge(
114
+				$payment_method_folders,
115
+				$settings['payment_method_paths']
116
+			);
117
+		}
118
+		return $payment_method_folders;
119
+	}
120 120
 
121 121
 
122 122
 
123
-    /**
124
-     * This deregisters a module that was previously registered with a specific $module_id.
125
-     *
126
-     * @since    4.3.0
127
-     *
128
-     * @param string $module_id the name for the module that was previously registered
129
-     * @return void
130
-     */
131
-    public static function deregister($module_id = null)
132
-    {
133
-        if (isset(self::$_settings[$module_id])) {
134
-            unset(self::$_settings[$module_id]);
135
-        }
136
-    }
123
+	/**
124
+	 * This deregisters a module that was previously registered with a specific $module_id.
125
+	 *
126
+	 * @since    4.3.0
127
+	 *
128
+	 * @param string $module_id the name for the module that was previously registered
129
+	 * @return void
130
+	 */
131
+	public static function deregister($module_id = null)
132
+	{
133
+		if (isset(self::$_settings[$module_id])) {
134
+			unset(self::$_settings[$module_id]);
135
+		}
136
+	}
137 137
 
138 138
 }
139 139
 // End of file EE_Register_Payment_Method.lib.php
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -75,7 +75,7 @@
 block discarded – undo
75 75
         self::$_settings[$payment_method_id] = array(
76 76
             // array of full server paths to any EE_PMT_Base children used
77 77
             'payment_method_paths' => isset($setup_args['payment_method_paths'])
78
-                ? (array)$setup_args['payment_method_paths']
78
+                ? (array) $setup_args['payment_method_paths']
79 79
                 : array(),
80 80
         );
81 81
         // add to list of modules to be registered
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_Payment_Method_Manager.lib.php 2 patches
Indentation   +419 added lines, -419 removed lines patch added patch discarded remove patch
@@ -17,420 +17,420 @@  discard block
 block discarded – undo
17 17
 class EE_Payment_Method_Manager
18 18
 {
19 19
 
20
-    /**
21
-     * @var EE_Payment_Method_Manager $_instance
22
-     */
23
-    private static $_instance;
24
-
25
-    /**
26
-     * @var array keys are class names without 'EE_PMT_', values are their filepaths
27
-     */
28
-    protected $_payment_method_types = array();
29
-
30
-
31
-
32
-    /**
33
-     * @singleton method used to instantiate class object
34
-     * @return EE_Payment_Method_Manager instance
35
-     */
36
-    public static function instance()
37
-    {
38
-        // check if class object is instantiated, and instantiated properly
39
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
40
-            self::$_instance = new self();
41
-        }
42
-        EE_Registry::instance()->load_lib('PMT_Base');
43
-        return self::$_instance;
44
-    }
45
-
46
-
47
-
48
-    /**
49
-     * Resets the instance and returns a new one
50
-     *
51
-     * @return EE_Payment_Method_Manager
52
-     */
53
-    public static function reset()
54
-    {
55
-        self::$_instance = null;
56
-        return self::instance();
57
-    }
58
-
59
-
60
-
61
-    /**
62
-     * If necessary, re-register payment methods
63
-     *
64
-     * @param boolean $force_recheck whether to recheck for payment method types,
65
-     *                               or just re-use the PMTs we found last time we checked during this request (if
66
-     *                               we have not yet checked during this request, then we need to check anyways)
67
-     */
68
-    public function maybe_register_payment_methods($force_recheck = false)
69
-    {
70
-        if (! $this->_payment_method_types || $force_recheck) {
71
-            $this->_register_payment_methods();
72
-            //if in admin lets ensure caps are set.
73
-            if (is_admin()) {
74
-                add_filter('FHEE__EE_Capabilities__init_caps_map__caps', array($this, 'add_payment_method_caps'));
75
-                EE_Registry::instance()->CAP->init_caps();
76
-            }
77
-        }
78
-    }
79
-
80
-
81
-
82
-    /**
83
-     * register_payment_methods
84
-     *
85
-     * @return array
86
-     */
87
-    protected function _register_payment_methods()
88
-    {
89
-        // grab list of installed modules
90
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
91
-        // filter list of modules to register
92
-        $pm_to_register = apply_filters(
93
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
94
-            $pm_to_register
95
-        );
96
-        // loop through folders
97
-        foreach ($pm_to_register as $pm_path) {
98
-            $this->register_payment_method($pm_path);
99
-        }
100
-        do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
101
-        // filter list of installed modules
102
-        //keep them organized alphabetically by the payment method type's name
103
-        ksort($this->_payment_method_types);
104
-        return apply_filters(
105
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
106
-            $this->_payment_method_types
107
-        );
108
-    }
109
-
110
-
111
-
112
-    /**
113
-     * register_payment_method- makes core aware of this payment method
114
-     *
115
-     * @param string $payment_method_path - full path up to and including payment method folder
116
-     * @return boolean
117
-     */
118
-    public function register_payment_method($payment_method_path = '')
119
-    {
120
-        do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
121
-        $module_ext = '.pm.php';
122
-        // make all separators match
123
-        $payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
124
-        // grab and sanitize module name
125
-        $module_dir = basename($payment_method_path);
126
-        // create classname from module directory name
127
-        $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
128
-        // add class prefix
129
-        $module_class = 'EE_PMT_' . $module;
130
-        // does the module exist ?
131
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
132
-            $msg = sprintf(
133
-                esc_html__(
134
-                    'The requested %s payment method file could not be found or is not readable due to file permissions.',
135
-                    'event_espresso'
136
-                ), $module
137
-            );
138
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
139
-            return false;
140
-        }
141
-        // load the module class file
142
-        require_once($payment_method_path . DS . $module_class . $module_ext);
143
-        // verify that class exists
144
-        if (! class_exists($module_class)) {
145
-            $msg = sprintf(
146
-                esc_html__('The requested %s module class does not exist.', 'event_espresso'),
147
-                $module_class
148
-            );
149
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
150
-            return false;
151
-        }
152
-        // add to array of registered modules
153
-        $this->_payment_method_types[$module] = $payment_method_path . DS . $module_class . $module_ext;
154
-        return true;
155
-    }
156
-
157
-
158
-
159
-    /**
160
-     * Checks if a payment method has been registered, and if so includes it
161
-     *
162
-     * @param string  $payment_method_name like 'PayPal_Pro', (ie classname without the prefix 'EEPM_')
163
-     * @param boolean $force_recheck       whether to force re-checking for new payment method types
164
-     * @return boolean
165
-     */
166
-    public function payment_method_type_exists($payment_method_name, $force_recheck = false)
167
-    {
168
-        if (
169
-            $force_recheck
170
-            || ! is_array($this->_payment_method_types)
171
-            || ! isset($this->_payment_method_types[$payment_method_name])
172
-        ) {
173
-            $this->maybe_register_payment_methods($force_recheck);
174
-        }
175
-        if (isset($this->_payment_method_types[$payment_method_name])) {
176
-            require_once($this->_payment_method_types[$payment_method_name]);
177
-            return true;
178
-        }
179
-        return false;
180
-    }
181
-
182
-
183
-
184
-    /**
185
-     * Returns all the class names of the various payment method types
186
-     *
187
-     * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
188
-     *                               (what you'd find in wp_esp_payment_method.PMD_type)
189
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
190
-     * @return array
191
-     */
192
-    public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
193
-    {
194
-        $this->maybe_register_payment_methods($force_recheck);
195
-        if ($with_prefixes) {
196
-            $classnames = array_keys($this->_payment_method_types);
197
-            $payment_methods = array();
198
-            foreach ($classnames as $classname) {
199
-                $payment_methods[] = $this->payment_method_class_from_type($classname);
200
-            }
201
-            return $payment_methods;
202
-        }
203
-        return array_keys($this->_payment_method_types);
204
-    }
205
-
206
-
207
-
208
-    /**
209
-     * Gets an object of each payment method type, none of which are bound to a
210
-     * payment method instance
211
-     *
212
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
213
-     * @return EE_PMT_Base[]
214
-     */
215
-    public function payment_method_types($force_recheck = false)
216
-    {
217
-        $this->maybe_register_payment_methods($force_recheck);
218
-        $payment_method_objects = array();
219
-        foreach ($this->payment_method_type_names(true) as $classname) {
220
-            $payment_method_objects[] = new $classname;
221
-        }
222
-        return $payment_method_objects;
223
-    }
224
-
225
-
226
-
227
-    /**
228
-     * Changes the payment method's classname into the payment method type's name
229
-     * (as used on the payment method's table's PMD_type field)
230
-     *
231
-     * @param string $classname
232
-     * @return string
233
-     */
234
-    public function payment_method_type_sans_class_prefix($classname)
235
-    {
236
-        return str_replace('EE_PMT_', '', $classname);
237
-    }
238
-
239
-
240
-
241
-    /**
242
-     * Does the opposite of payment-method_type_sans_prefix
243
-     *
244
-     * @param string $type
245
-     * @return string
246
-     */
247
-    public function payment_method_class_from_type($type)
248
-    {
249
-        $this->maybe_register_payment_methods();
250
-        return 'EE_PMT_' . $type;
251
-    }
252
-
253
-
254
-
255
-    /**
256
-     * Activates a payment method of the given type.
257
-     *
258
-     * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
259
-     * @return EE_Payment_Method
260
-     * @throws EE_Error
261
-     */
262
-    public function activate_a_payment_method_of_type($payment_method_type)
263
-    {
264
-        $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
265
-        if (! $payment_method instanceof EE_Payment_Method) {
266
-            $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
267
-            if (class_exists($pm_type_class)) {
268
-                /** @var $pm_type_obj EE_PMT_Base */
269
-                $pm_type_obj = new $pm_type_class;
270
-                $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
271
-                if (! $payment_method) {
272
-                    $payment_method = $this->create_payment_method_of_type($pm_type_obj);
273
-                }
274
-                $payment_method->set_type($payment_method_type);
275
-                $this->initialize_payment_method($payment_method);
276
-            } else {
277
-                throw new EE_Error(
278
-                    sprintf(
279
-                        esc_html__(
280
-                            'There is no payment method of type %1$s, so it could not be activated',
281
-                            'event_espresso'
282
-                        ),
283
-                        $pm_type_class
284
-                    )
285
-                );
286
-            }
287
-        }
288
-        $payment_method->set_active();
289
-        $payment_method->save();
290
-        if ($payment_method->type() === 'Invoice') {
291
-            /** @type EE_Message_Resource_Manager $message_resource_manager */
292
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
293
-            $message_resource_manager->ensure_message_type_is_active('invoice', 'html');
294
-            $message_resource_manager->ensure_messenger_is_active('pdf');
295
-            EE_Error::add_persistent_admin_notice(
296
-                'invoice_pm_requirements_notice',
297
-                sprintf(
298
-                    esc_html__(
299
-                        'The Invoice payment method has been activated. It requires the invoice message type, html messenger, and pdf messenger be activated as well for the %1$smessages system%2$s, so it has been automatically verified that they are also active.',
300
-                        'event_espresso'
301
-                    ),
302
-                    '<a href="' . admin_url('admin.php?page=espresso_messages') . '">',
303
-                    '</a>'
304
-                ),
305
-                true
306
-            );
307
-        }
308
-        return $payment_method;
309
-    }
310
-
311
-
312
-
313
-    /**
314
-     * Creates a payment method of the specified type. Does not save it.
315
-     *
316
-     * @global WP_User    $current_user
317
-     * @param EE_PMT_Base $pm_type_obj
318
-     * @return EE_Payment_Method
319
-     * @throws EE_Error
320
-     */
321
-    public function create_payment_method_of_type($pm_type_obj)
322
-    {
323
-        global $current_user;
324
-        $payment_method = EE_Payment_Method::new_instance(
325
-            array(
326
-                'PMD_type'       => $pm_type_obj->system_name(),
327
-                'PMD_name'       => $pm_type_obj->pretty_name(),
328
-                'PMD_admin_name' => $pm_type_obj->pretty_name(),
329
-                'PMD_slug'       => $pm_type_obj->system_name(),//automatically converted to slug
330
-                'PMD_wp_user'    => $current_user->ID,
331
-                'PMD_order'      => EEM_Payment_Method::instance()->count(
332
-                        array(array('PMD_type' => array('!=', 'Admin_Only')))
333
-                    ) * 10,
334
-            )
335
-        );
336
-        return $payment_method;
337
-    }
338
-
339
-
340
-
341
-    /**
342
-     * Sets the initial payment method properties (including extra meta)
343
-     *
344
-     * @param EE_Payment_Method $payment_method
345
-     * @return EE_Payment_Method
346
-     * @throws EE_Error
347
-     */
348
-    public function initialize_payment_method($payment_method)
349
-    {
350
-        $pm_type_obj = $payment_method->type_obj();
351
-        $payment_method->set_description($pm_type_obj->default_description());
352
-        if (! $payment_method->button_url()) {
353
-            $payment_method->set_button_url($pm_type_obj->default_button_url());
354
-        }
355
-        //now add setup its default extra meta properties
356
-        $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
357
-        if (! empty($extra_metas)) {
358
-            //verify the payment method has an ID before adding extra meta
359
-            if (! $payment_method->ID()) {
360
-                $payment_method->save();
361
-            }
362
-            foreach ($extra_metas as $meta_name => $input) {
363
-                $payment_method->update_extra_meta($meta_name, $input->raw_value());
364
-            }
365
-        }
366
-        return $payment_method;
367
-    }
368
-
369
-
370
-
371
-    /**
372
-     * Makes sure the payment method is related to the specified payment method
373
-     *
374
-     * @deprecated in 4.9.40 because the currency payment method table is being deprecated
375
-     * @param EE_Payment_Method $payment_method
376
-     * @return EE_Payment_Method
377
-     * @throws EE_Error
378
-     */
379
-    public function set_usable_currencies_on_payment_method($payment_method)
380
-    {
381
-        EE_Error::doing_it_wrong(
382
-            'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
383
-            esc_html__(
384
-                'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
385
-                'event_espresso'
386
-            ),
387
-            '4.9.40'
388
-        );
389
-        return $payment_method;
390
-    }
391
-
392
-
393
-
394
-    /**
395
-     * Deactivates a payment method of the given payment method slug.
396
-     *
397
-     * @param string $payment_method_slug The slug for the payment method to deactivate.
398
-     * @return int count of rows updated.
399
-     * @throws EE_Error
400
-     */
401
-    public function deactivate_payment_method($payment_method_slug)
402
-    {
403
-        EE_Log::instance()->log(
404
-            __FILE__,
405
-            __FUNCTION__,
406
-            sprintf(
407
-                esc_html__(
408
-                    'Payment method with slug %1$s is being deactivated by site admin',
409
-                    'event_espresso'
410
-                ),
411
-                $payment_method_slug
412
-            ),
413
-            'payment_method_change'
414
-        );
415
-        $count_updated = EEM_Payment_Method::instance()->update(
416
-            array('PMD_scope' => array()),
417
-            array(array('PMD_slug' => $payment_method_slug))
418
-        );
419
-        return $count_updated;
420
-    }
421
-
422
-
423
-
424
-    /**
425
-     * callback for FHEE__EE_Capabilities__init_caps_map__caps filter to add dynamic payment method
426
-     * access caps.
427
-     *
428
-     * @param array $caps capabilities being filtered
429
-     * @return array
430
-     */
431
-    public function add_payment_method_caps($caps)
432
-    {
433
-        /* add dynamic caps from payment methods
20
+	/**
21
+	 * @var EE_Payment_Method_Manager $_instance
22
+	 */
23
+	private static $_instance;
24
+
25
+	/**
26
+	 * @var array keys are class names without 'EE_PMT_', values are their filepaths
27
+	 */
28
+	protected $_payment_method_types = array();
29
+
30
+
31
+
32
+	/**
33
+	 * @singleton method used to instantiate class object
34
+	 * @return EE_Payment_Method_Manager instance
35
+	 */
36
+	public static function instance()
37
+	{
38
+		// check if class object is instantiated, and instantiated properly
39
+		if (! self::$_instance instanceof EE_Payment_Method_Manager) {
40
+			self::$_instance = new self();
41
+		}
42
+		EE_Registry::instance()->load_lib('PMT_Base');
43
+		return self::$_instance;
44
+	}
45
+
46
+
47
+
48
+	/**
49
+	 * Resets the instance and returns a new one
50
+	 *
51
+	 * @return EE_Payment_Method_Manager
52
+	 */
53
+	public static function reset()
54
+	{
55
+		self::$_instance = null;
56
+		return self::instance();
57
+	}
58
+
59
+
60
+
61
+	/**
62
+	 * If necessary, re-register payment methods
63
+	 *
64
+	 * @param boolean $force_recheck whether to recheck for payment method types,
65
+	 *                               or just re-use the PMTs we found last time we checked during this request (if
66
+	 *                               we have not yet checked during this request, then we need to check anyways)
67
+	 */
68
+	public function maybe_register_payment_methods($force_recheck = false)
69
+	{
70
+		if (! $this->_payment_method_types || $force_recheck) {
71
+			$this->_register_payment_methods();
72
+			//if in admin lets ensure caps are set.
73
+			if (is_admin()) {
74
+				add_filter('FHEE__EE_Capabilities__init_caps_map__caps', array($this, 'add_payment_method_caps'));
75
+				EE_Registry::instance()->CAP->init_caps();
76
+			}
77
+		}
78
+	}
79
+
80
+
81
+
82
+	/**
83
+	 * register_payment_methods
84
+	 *
85
+	 * @return array
86
+	 */
87
+	protected function _register_payment_methods()
88
+	{
89
+		// grab list of installed modules
90
+		$pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
91
+		// filter list of modules to register
92
+		$pm_to_register = apply_filters(
93
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
94
+			$pm_to_register
95
+		);
96
+		// loop through folders
97
+		foreach ($pm_to_register as $pm_path) {
98
+			$this->register_payment_method($pm_path);
99
+		}
100
+		do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
101
+		// filter list of installed modules
102
+		//keep them organized alphabetically by the payment method type's name
103
+		ksort($this->_payment_method_types);
104
+		return apply_filters(
105
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
106
+			$this->_payment_method_types
107
+		);
108
+	}
109
+
110
+
111
+
112
+	/**
113
+	 * register_payment_method- makes core aware of this payment method
114
+	 *
115
+	 * @param string $payment_method_path - full path up to and including payment method folder
116
+	 * @return boolean
117
+	 */
118
+	public function register_payment_method($payment_method_path = '')
119
+	{
120
+		do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
121
+		$module_ext = '.pm.php';
122
+		// make all separators match
123
+		$payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
124
+		// grab and sanitize module name
125
+		$module_dir = basename($payment_method_path);
126
+		// create classname from module directory name
127
+		$module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
128
+		// add class prefix
129
+		$module_class = 'EE_PMT_' . $module;
130
+		// does the module exist ?
131
+		if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
132
+			$msg = sprintf(
133
+				esc_html__(
134
+					'The requested %s payment method file could not be found or is not readable due to file permissions.',
135
+					'event_espresso'
136
+				), $module
137
+			);
138
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
139
+			return false;
140
+		}
141
+		// load the module class file
142
+		require_once($payment_method_path . DS . $module_class . $module_ext);
143
+		// verify that class exists
144
+		if (! class_exists($module_class)) {
145
+			$msg = sprintf(
146
+				esc_html__('The requested %s module class does not exist.', 'event_espresso'),
147
+				$module_class
148
+			);
149
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
150
+			return false;
151
+		}
152
+		// add to array of registered modules
153
+		$this->_payment_method_types[$module] = $payment_method_path . DS . $module_class . $module_ext;
154
+		return true;
155
+	}
156
+
157
+
158
+
159
+	/**
160
+	 * Checks if a payment method has been registered, and if so includes it
161
+	 *
162
+	 * @param string  $payment_method_name like 'PayPal_Pro', (ie classname without the prefix 'EEPM_')
163
+	 * @param boolean $force_recheck       whether to force re-checking for new payment method types
164
+	 * @return boolean
165
+	 */
166
+	public function payment_method_type_exists($payment_method_name, $force_recheck = false)
167
+	{
168
+		if (
169
+			$force_recheck
170
+			|| ! is_array($this->_payment_method_types)
171
+			|| ! isset($this->_payment_method_types[$payment_method_name])
172
+		) {
173
+			$this->maybe_register_payment_methods($force_recheck);
174
+		}
175
+		if (isset($this->_payment_method_types[$payment_method_name])) {
176
+			require_once($this->_payment_method_types[$payment_method_name]);
177
+			return true;
178
+		}
179
+		return false;
180
+	}
181
+
182
+
183
+
184
+	/**
185
+	 * Returns all the class names of the various payment method types
186
+	 *
187
+	 * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
188
+	 *                               (what you'd find in wp_esp_payment_method.PMD_type)
189
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
190
+	 * @return array
191
+	 */
192
+	public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
193
+	{
194
+		$this->maybe_register_payment_methods($force_recheck);
195
+		if ($with_prefixes) {
196
+			$classnames = array_keys($this->_payment_method_types);
197
+			$payment_methods = array();
198
+			foreach ($classnames as $classname) {
199
+				$payment_methods[] = $this->payment_method_class_from_type($classname);
200
+			}
201
+			return $payment_methods;
202
+		}
203
+		return array_keys($this->_payment_method_types);
204
+	}
205
+
206
+
207
+
208
+	/**
209
+	 * Gets an object of each payment method type, none of which are bound to a
210
+	 * payment method instance
211
+	 *
212
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
213
+	 * @return EE_PMT_Base[]
214
+	 */
215
+	public function payment_method_types($force_recheck = false)
216
+	{
217
+		$this->maybe_register_payment_methods($force_recheck);
218
+		$payment_method_objects = array();
219
+		foreach ($this->payment_method_type_names(true) as $classname) {
220
+			$payment_method_objects[] = new $classname;
221
+		}
222
+		return $payment_method_objects;
223
+	}
224
+
225
+
226
+
227
+	/**
228
+	 * Changes the payment method's classname into the payment method type's name
229
+	 * (as used on the payment method's table's PMD_type field)
230
+	 *
231
+	 * @param string $classname
232
+	 * @return string
233
+	 */
234
+	public function payment_method_type_sans_class_prefix($classname)
235
+	{
236
+		return str_replace('EE_PMT_', '', $classname);
237
+	}
238
+
239
+
240
+
241
+	/**
242
+	 * Does the opposite of payment-method_type_sans_prefix
243
+	 *
244
+	 * @param string $type
245
+	 * @return string
246
+	 */
247
+	public function payment_method_class_from_type($type)
248
+	{
249
+		$this->maybe_register_payment_methods();
250
+		return 'EE_PMT_' . $type;
251
+	}
252
+
253
+
254
+
255
+	/**
256
+	 * Activates a payment method of the given type.
257
+	 *
258
+	 * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
259
+	 * @return EE_Payment_Method
260
+	 * @throws EE_Error
261
+	 */
262
+	public function activate_a_payment_method_of_type($payment_method_type)
263
+	{
264
+		$payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
265
+		if (! $payment_method instanceof EE_Payment_Method) {
266
+			$pm_type_class = $this->payment_method_class_from_type($payment_method_type);
267
+			if (class_exists($pm_type_class)) {
268
+				/** @var $pm_type_obj EE_PMT_Base */
269
+				$pm_type_obj = new $pm_type_class;
270
+				$payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
271
+				if (! $payment_method) {
272
+					$payment_method = $this->create_payment_method_of_type($pm_type_obj);
273
+				}
274
+				$payment_method->set_type($payment_method_type);
275
+				$this->initialize_payment_method($payment_method);
276
+			} else {
277
+				throw new EE_Error(
278
+					sprintf(
279
+						esc_html__(
280
+							'There is no payment method of type %1$s, so it could not be activated',
281
+							'event_espresso'
282
+						),
283
+						$pm_type_class
284
+					)
285
+				);
286
+			}
287
+		}
288
+		$payment_method->set_active();
289
+		$payment_method->save();
290
+		if ($payment_method->type() === 'Invoice') {
291
+			/** @type EE_Message_Resource_Manager $message_resource_manager */
292
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
293
+			$message_resource_manager->ensure_message_type_is_active('invoice', 'html');
294
+			$message_resource_manager->ensure_messenger_is_active('pdf');
295
+			EE_Error::add_persistent_admin_notice(
296
+				'invoice_pm_requirements_notice',
297
+				sprintf(
298
+					esc_html__(
299
+						'The Invoice payment method has been activated. It requires the invoice message type, html messenger, and pdf messenger be activated as well for the %1$smessages system%2$s, so it has been automatically verified that they are also active.',
300
+						'event_espresso'
301
+					),
302
+					'<a href="' . admin_url('admin.php?page=espresso_messages') . '">',
303
+					'</a>'
304
+				),
305
+				true
306
+			);
307
+		}
308
+		return $payment_method;
309
+	}
310
+
311
+
312
+
313
+	/**
314
+	 * Creates a payment method of the specified type. Does not save it.
315
+	 *
316
+	 * @global WP_User    $current_user
317
+	 * @param EE_PMT_Base $pm_type_obj
318
+	 * @return EE_Payment_Method
319
+	 * @throws EE_Error
320
+	 */
321
+	public function create_payment_method_of_type($pm_type_obj)
322
+	{
323
+		global $current_user;
324
+		$payment_method = EE_Payment_Method::new_instance(
325
+			array(
326
+				'PMD_type'       => $pm_type_obj->system_name(),
327
+				'PMD_name'       => $pm_type_obj->pretty_name(),
328
+				'PMD_admin_name' => $pm_type_obj->pretty_name(),
329
+				'PMD_slug'       => $pm_type_obj->system_name(),//automatically converted to slug
330
+				'PMD_wp_user'    => $current_user->ID,
331
+				'PMD_order'      => EEM_Payment_Method::instance()->count(
332
+						array(array('PMD_type' => array('!=', 'Admin_Only')))
333
+					) * 10,
334
+			)
335
+		);
336
+		return $payment_method;
337
+	}
338
+
339
+
340
+
341
+	/**
342
+	 * Sets the initial payment method properties (including extra meta)
343
+	 *
344
+	 * @param EE_Payment_Method $payment_method
345
+	 * @return EE_Payment_Method
346
+	 * @throws EE_Error
347
+	 */
348
+	public function initialize_payment_method($payment_method)
349
+	{
350
+		$pm_type_obj = $payment_method->type_obj();
351
+		$payment_method->set_description($pm_type_obj->default_description());
352
+		if (! $payment_method->button_url()) {
353
+			$payment_method->set_button_url($pm_type_obj->default_button_url());
354
+		}
355
+		//now add setup its default extra meta properties
356
+		$extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
357
+		if (! empty($extra_metas)) {
358
+			//verify the payment method has an ID before adding extra meta
359
+			if (! $payment_method->ID()) {
360
+				$payment_method->save();
361
+			}
362
+			foreach ($extra_metas as $meta_name => $input) {
363
+				$payment_method->update_extra_meta($meta_name, $input->raw_value());
364
+			}
365
+		}
366
+		return $payment_method;
367
+	}
368
+
369
+
370
+
371
+	/**
372
+	 * Makes sure the payment method is related to the specified payment method
373
+	 *
374
+	 * @deprecated in 4.9.40 because the currency payment method table is being deprecated
375
+	 * @param EE_Payment_Method $payment_method
376
+	 * @return EE_Payment_Method
377
+	 * @throws EE_Error
378
+	 */
379
+	public function set_usable_currencies_on_payment_method($payment_method)
380
+	{
381
+		EE_Error::doing_it_wrong(
382
+			'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
383
+			esc_html__(
384
+				'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
385
+				'event_espresso'
386
+			),
387
+			'4.9.40'
388
+		);
389
+		return $payment_method;
390
+	}
391
+
392
+
393
+
394
+	/**
395
+	 * Deactivates a payment method of the given payment method slug.
396
+	 *
397
+	 * @param string $payment_method_slug The slug for the payment method to deactivate.
398
+	 * @return int count of rows updated.
399
+	 * @throws EE_Error
400
+	 */
401
+	public function deactivate_payment_method($payment_method_slug)
402
+	{
403
+		EE_Log::instance()->log(
404
+			__FILE__,
405
+			__FUNCTION__,
406
+			sprintf(
407
+				esc_html__(
408
+					'Payment method with slug %1$s is being deactivated by site admin',
409
+					'event_espresso'
410
+				),
411
+				$payment_method_slug
412
+			),
413
+			'payment_method_change'
414
+		);
415
+		$count_updated = EEM_Payment_Method::instance()->update(
416
+			array('PMD_scope' => array()),
417
+			array(array('PMD_slug' => $payment_method_slug))
418
+		);
419
+		return $count_updated;
420
+	}
421
+
422
+
423
+
424
+	/**
425
+	 * callback for FHEE__EE_Capabilities__init_caps_map__caps filter to add dynamic payment method
426
+	 * access caps.
427
+	 *
428
+	 * @param array $caps capabilities being filtered
429
+	 * @return array
430
+	 */
431
+	public function add_payment_method_caps($caps)
432
+	{
433
+		/* add dynamic caps from payment methods
434 434
          * at the time of writing, october 20 2014, these are the caps added:
435 435
          * ee_payment_method_admin_only
436 436
          * ee_payment_method_aim
@@ -444,10 +444,10 @@  discard block
 block discarded – undo
444 444
          * their related capability automatically added too, so long as they are
445 445
          * registered properly using EE_Register_Payment_Method::register()
446 446
          */
447
-        foreach ($this->payment_method_types() as $payment_method_type_obj) {
448
-            $caps['administrator'][] = $payment_method_type_obj->cap_name();
449
-        }
450
-        return $caps;
451
-    }
447
+		foreach ($this->payment_method_types() as $payment_method_type_obj) {
448
+			$caps['administrator'][] = $payment_method_type_obj->cap_name();
449
+		}
450
+		return $caps;
451
+	}
452 452
 
453 453
 }
Please login to merge, or discard this patch.
Spacing   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -36,7 +36,7 @@  discard block
 block discarded – undo
36 36
     public static function instance()
37 37
     {
38 38
         // check if class object is instantiated, and instantiated properly
39
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
39
+        if ( ! self::$_instance instanceof EE_Payment_Method_Manager) {
40 40
             self::$_instance = new self();
41 41
         }
42 42
         EE_Registry::instance()->load_lib('PMT_Base');
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
      */
68 68
     public function maybe_register_payment_methods($force_recheck = false)
69 69
     {
70
-        if (! $this->_payment_method_types || $force_recheck) {
70
+        if ( ! $this->_payment_method_types || $force_recheck) {
71 71
             $this->_register_payment_methods();
72 72
             //if in admin lets ensure caps are set.
73 73
             if (is_admin()) {
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
     protected function _register_payment_methods()
88 88
     {
89 89
         // grab list of installed modules
90
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
90
+        $pm_to_register = glob(EE_PAYMENT_METHODS.'*', GLOB_ONLYDIR);
91 91
         // filter list of modules to register
92 92
         $pm_to_register = apply_filters(
93 93
             'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
@@ -126,31 +126,31 @@  discard block
 block discarded – undo
126 126
         // create classname from module directory name
127 127
         $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
128 128
         // add class prefix
129
-        $module_class = 'EE_PMT_' . $module;
129
+        $module_class = 'EE_PMT_'.$module;
130 130
         // does the module exist ?
131
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
131
+        if ( ! is_readable($payment_method_path.DS.$module_class.$module_ext)) {
132 132
             $msg = sprintf(
133 133
                 esc_html__(
134 134
                     'The requested %s payment method file could not be found or is not readable due to file permissions.',
135 135
                     'event_espresso'
136 136
                 ), $module
137 137
             );
138
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
138
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
139 139
             return false;
140 140
         }
141 141
         // load the module class file
142
-        require_once($payment_method_path . DS . $module_class . $module_ext);
142
+        require_once($payment_method_path.DS.$module_class.$module_ext);
143 143
         // verify that class exists
144
-        if (! class_exists($module_class)) {
144
+        if ( ! class_exists($module_class)) {
145 145
             $msg = sprintf(
146 146
                 esc_html__('The requested %s module class does not exist.', 'event_espresso'),
147 147
                 $module_class
148 148
             );
149
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
149
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
150 150
             return false;
151 151
         }
152 152
         // add to array of registered modules
153
-        $this->_payment_method_types[$module] = $payment_method_path . DS . $module_class . $module_ext;
153
+        $this->_payment_method_types[$module] = $payment_method_path.DS.$module_class.$module_ext;
154 154
         return true;
155 155
     }
156 156
 
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
     public function payment_method_class_from_type($type)
248 248
     {
249 249
         $this->maybe_register_payment_methods();
250
-        return 'EE_PMT_' . $type;
250
+        return 'EE_PMT_'.$type;
251 251
     }
252 252
 
253 253
 
@@ -262,13 +262,13 @@  discard block
 block discarded – undo
262 262
     public function activate_a_payment_method_of_type($payment_method_type)
263 263
     {
264 264
         $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
265
-        if (! $payment_method instanceof EE_Payment_Method) {
265
+        if ( ! $payment_method instanceof EE_Payment_Method) {
266 266
             $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
267 267
             if (class_exists($pm_type_class)) {
268 268
                 /** @var $pm_type_obj EE_PMT_Base */
269 269
                 $pm_type_obj = new $pm_type_class;
270 270
                 $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
271
-                if (! $payment_method) {
271
+                if ( ! $payment_method) {
272 272
                     $payment_method = $this->create_payment_method_of_type($pm_type_obj);
273 273
                 }
274 274
                 $payment_method->set_type($payment_method_type);
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
                         'The Invoice payment method has been activated. It requires the invoice message type, html messenger, and pdf messenger be activated as well for the %1$smessages system%2$s, so it has been automatically verified that they are also active.',
300 300
                         'event_espresso'
301 301
                     ),
302
-                    '<a href="' . admin_url('admin.php?page=espresso_messages') . '">',
302
+                    '<a href="'.admin_url('admin.php?page=espresso_messages').'">',
303 303
                     '</a>'
304 304
                 ),
305 305
                 true
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
                 'PMD_type'       => $pm_type_obj->system_name(),
327 327
                 'PMD_name'       => $pm_type_obj->pretty_name(),
328 328
                 'PMD_admin_name' => $pm_type_obj->pretty_name(),
329
-                'PMD_slug'       => $pm_type_obj->system_name(),//automatically converted to slug
329
+                'PMD_slug'       => $pm_type_obj->system_name(), //automatically converted to slug
330 330
                 'PMD_wp_user'    => $current_user->ID,
331 331
                 'PMD_order'      => EEM_Payment_Method::instance()->count(
332 332
                         array(array('PMD_type' => array('!=', 'Admin_Only')))
@@ -349,14 +349,14 @@  discard block
 block discarded – undo
349 349
     {
350 350
         $pm_type_obj = $payment_method->type_obj();
351 351
         $payment_method->set_description($pm_type_obj->default_description());
352
-        if (! $payment_method->button_url()) {
352
+        if ( ! $payment_method->button_url()) {
353 353
             $payment_method->set_button_url($pm_type_obj->default_button_url());
354 354
         }
355 355
         //now add setup its default extra meta properties
356 356
         $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
357
-        if (! empty($extra_metas)) {
357
+        if ( ! empty($extra_metas)) {
358 358
             //verify the payment method has an ID before adding extra meta
359
-            if (! $payment_method->ID()) {
359
+            if ( ! $payment_method->ID()) {
360 360
                 $payment_method->save();
361 361
             }
362 362
             foreach ($extra_metas as $meta_name => $input) {
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +219 added lines, -219 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('ABSPATH')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /*
5 5
   Plugin Name:		Event Espresso
@@ -40,243 +40,243 @@  discard block
 block discarded – undo
40 40
  * @since            4.0
41 41
  */
42 42
 if (function_exists('espresso_version')) {
43
-    /**
44
-     *    espresso_duplicate_plugin_error
45
-     *    displays if more than one version of EE is activated at the same time
46
-     */
47
-    function espresso_duplicate_plugin_error()
48
-    {
49
-        ?>
43
+	/**
44
+	 *    espresso_duplicate_plugin_error
45
+	 *    displays if more than one version of EE is activated at the same time
46
+	 */
47
+	function espresso_duplicate_plugin_error()
48
+	{
49
+		?>
50 50
         <div class="error">
51 51
             <p>
52 52
                 <?php echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                ); ?>
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+				); ?>
56 56
             </p>
57 57
         </div>
58 58
         <?php
59
-        espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-    }
59
+		espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+	}
61 61
 
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
-    if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
+	if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                            esc_html__(
79
-                                    'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                                    'event_espresso'
81
-                            ),
82
-                            EE_MIN_PHP_VER_REQUIRED,
83
-                            PHP_VERSION,
84
-                            '<br/>',
85
-                            '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+							esc_html__(
79
+									'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+									'event_espresso'
81
+							),
82
+							EE_MIN_PHP_VER_REQUIRED,
83
+							PHP_VERSION,
84
+							'<br/>',
85
+							'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        /**
97
-         * espresso_version
98
-         * Returns the plugin version
99
-         *
100
-         * @return string
101
-         */
102
-        function espresso_version()
103
-        {
104
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.43.rc.020');
105
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		/**
97
+		 * espresso_version
98
+		 * Returns the plugin version
99
+		 *
100
+		 * @return string
101
+		 */
102
+		function espresso_version()
103
+		{
104
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.43.rc.020');
105
+		}
106 106
 
107
-        // define versions
108
-        define('EVENT_ESPRESSO_VERSION', espresso_version());
109
-        define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
-        define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
-        define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
-        //used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
-        if ( ! defined('DS')) {
115
-            define('DS', '/');
116
-        }
117
-        if ( ! defined('PS')) {
118
-            define('PS', PATH_SEPARATOR);
119
-        }
120
-        if ( ! defined('SP')) {
121
-            define('SP', ' ');
122
-        }
123
-        if ( ! defined('EENL')) {
124
-            define('EENL', "\n");
125
-        }
126
-        define('EE_SUPPORT_EMAIL', '[email protected]');
127
-        // define the plugin directory and URL
128
-        define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
-        define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
-        define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
-        // main root folder paths
132
-        define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
-        define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
-        define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
-        define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
-        define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
-        define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
-        define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
-        define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
-        // core system paths
141
-        define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
-        define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
-        define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
-        define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
-        define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
-        define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
-        define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
-        define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
-        define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
-        define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
-        define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
-        define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
-        // gateways
154
-        define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
-        define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
-        // asset URL paths
157
-        define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
-        define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
-        define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
-        define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
-        define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
-        define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
-        // define upload paths
164
-        $uploads = wp_upload_dir();
165
-        // define the uploads directory and URL
166
-        define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
-        define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
-        // define the templates directory and URL
169
-        define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
-        define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
-        // define the gateway directory and URL
172
-        define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
-        define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
-        // languages folder/path
175
-        define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
-        define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
-        //check for dompdf fonts in uploads
178
-        if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
-            define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
-        }
181
-        //ajax constants
182
-        define(
183
-                'EE_FRONT_AJAX',
184
-                isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
-        );
186
-        define(
187
-                'EE_ADMIN_AJAX',
188
-                isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
-        );
190
-        //just a handy constant occasionally needed for finding values representing infinity in the DB
191
-        //you're better to use this than its straight value (currently -1) in case you ever
192
-        //want to change its default value! or find when -1 means infinity
193
-        define('EE_INF_IN_DB', -1);
194
-        define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
-        define('EE_DEBUG', false);
196
-        // for older WP versions
197
-        if ( ! defined('MONTH_IN_SECONDS')) {
198
-            define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
-        }
200
-        /**
201
-         *    espresso_plugin_activation
202
-         *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
-         */
204
-        function espresso_plugin_activation()
205
-        {
206
-            update_option('ee_espresso_activation', true);
207
-        }
107
+		// define versions
108
+		define('EVENT_ESPRESSO_VERSION', espresso_version());
109
+		define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
+		define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
+		define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
+		//used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
+		if ( ! defined('DS')) {
115
+			define('DS', '/');
116
+		}
117
+		if ( ! defined('PS')) {
118
+			define('PS', PATH_SEPARATOR);
119
+		}
120
+		if ( ! defined('SP')) {
121
+			define('SP', ' ');
122
+		}
123
+		if ( ! defined('EENL')) {
124
+			define('EENL', "\n");
125
+		}
126
+		define('EE_SUPPORT_EMAIL', '[email protected]');
127
+		// define the plugin directory and URL
128
+		define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
+		define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
+		define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
+		// main root folder paths
132
+		define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
+		define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
+		define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
+		define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
+		define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
+		define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
+		define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
+		define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
+		// core system paths
141
+		define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
+		define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
+		define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
+		define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
+		define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
+		define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
+		define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
+		define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
+		define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
+		define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
+		define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
+		define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
+		// gateways
154
+		define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
+		define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
+		// asset URL paths
157
+		define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
+		define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
+		define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
+		define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
+		define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
+		define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
+		// define upload paths
164
+		$uploads = wp_upload_dir();
165
+		// define the uploads directory and URL
166
+		define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
+		define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
+		// define the templates directory and URL
169
+		define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
+		define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
+		// define the gateway directory and URL
172
+		define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
+		define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
+		// languages folder/path
175
+		define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
+		define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
+		//check for dompdf fonts in uploads
178
+		if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
+			define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
+		}
181
+		//ajax constants
182
+		define(
183
+				'EE_FRONT_AJAX',
184
+				isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
+		);
186
+		define(
187
+				'EE_ADMIN_AJAX',
188
+				isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
+		);
190
+		//just a handy constant occasionally needed for finding values representing infinity in the DB
191
+		//you're better to use this than its straight value (currently -1) in case you ever
192
+		//want to change its default value! or find when -1 means infinity
193
+		define('EE_INF_IN_DB', -1);
194
+		define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
+		define('EE_DEBUG', false);
196
+		// for older WP versions
197
+		if ( ! defined('MONTH_IN_SECONDS')) {
198
+			define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
+		}
200
+		/**
201
+		 *    espresso_plugin_activation
202
+		 *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
+		 */
204
+		function espresso_plugin_activation()
205
+		{
206
+			update_option('ee_espresso_activation', true);
207
+		}
208 208
 
209
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
-        /**
211
-         *    espresso_load_error_handling
212
-         *    this function loads EE's class for handling exceptions and errors
213
-         */
214
-        function espresso_load_error_handling()
215
-        {
216
-            // load debugging tools
217
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
-                require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
-                EEH_Debug_Tools::instance();
220
-            }
221
-            // load error handling
222
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
-                require_once(EE_CORE . 'EE_Error.core.php');
224
-            } else {
225
-                wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
-            }
227
-        }
209
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
+		/**
211
+		 *    espresso_load_error_handling
212
+		 *    this function loads EE's class for handling exceptions and errors
213
+		 */
214
+		function espresso_load_error_handling()
215
+		{
216
+			// load debugging tools
217
+			if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
+				require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
+				EEH_Debug_Tools::instance();
220
+			}
221
+			// load error handling
222
+			if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
+				require_once(EE_CORE . 'EE_Error.core.php');
224
+			} else {
225
+				wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
+			}
227
+		}
228 228
 
229
-        /**
230
-         *    espresso_load_required
231
-         *    given a class name and path, this function will load that file or throw an exception
232
-         *
233
-         * @param    string $classname
234
-         * @param    string $full_path_to_file
235
-         * @throws    EE_Error
236
-         */
237
-        function espresso_load_required($classname, $full_path_to_file)
238
-        {
239
-            static $error_handling_loaded = false;
240
-            if ( ! $error_handling_loaded) {
241
-                espresso_load_error_handling();
242
-                $error_handling_loaded = true;
243
-            }
244
-            if (is_readable($full_path_to_file)) {
245
-                require_once($full_path_to_file);
246
-            } else {
247
-                throw new EE_Error (
248
-                        sprintf(
249
-                                esc_html__(
250
-                                        'The %s class file could not be located or is not readable due to file permissions.',
251
-                                        'event_espresso'
252
-                                ),
253
-                                $classname
254
-                        )
255
-                );
256
-            }
257
-        }
229
+		/**
230
+		 *    espresso_load_required
231
+		 *    given a class name and path, this function will load that file or throw an exception
232
+		 *
233
+		 * @param    string $classname
234
+		 * @param    string $full_path_to_file
235
+		 * @throws    EE_Error
236
+		 */
237
+		function espresso_load_required($classname, $full_path_to_file)
238
+		{
239
+			static $error_handling_loaded = false;
240
+			if ( ! $error_handling_loaded) {
241
+				espresso_load_error_handling();
242
+				$error_handling_loaded = true;
243
+			}
244
+			if (is_readable($full_path_to_file)) {
245
+				require_once($full_path_to_file);
246
+			} else {
247
+				throw new EE_Error (
248
+						sprintf(
249
+								esc_html__(
250
+										'The %s class file could not be located or is not readable due to file permissions.',
251
+										'event_espresso'
252
+								),
253
+								$classname
254
+						)
255
+				);
256
+			}
257
+		}
258 258
 
259
-        espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
-        espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
-        espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
-        new EE_Bootstrap();
263
-    }
259
+		espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
+		espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
+		espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
+		new EE_Bootstrap();
263
+	}
264 264
 }
265 265
 if ( ! function_exists('espresso_deactivate_plugin')) {
266
-    /**
267
-     *    deactivate_plugin
268
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
-     *
270
-     * @access public
271
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
-     * @return    void
273
-     */
274
-    function espresso_deactivate_plugin($plugin_basename = '')
275
-    {
276
-        if ( ! function_exists('deactivate_plugins')) {
277
-            require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
-        }
279
-        unset($_GET['activate'], $_REQUEST['activate']);
280
-        deactivate_plugins($plugin_basename);
281
-    }
266
+	/**
267
+	 *    deactivate_plugin
268
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
+	 *
270
+	 * @access public
271
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
+	 * @return    void
273
+	 */
274
+	function espresso_deactivate_plugin($plugin_basename = '')
275
+	{
276
+		if ( ! function_exists('deactivate_plugins')) {
277
+			require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
+		}
279
+		unset($_GET['activate'], $_REQUEST['activate']);
280
+		deactivate_plugins($plugin_basename);
281
+	}
282 282
 }
283 283
\ No newline at end of file
Please login to merge, or discard this patch.
core/EE_System.core.php 2 patches
Indentation   +1407 added lines, -1407 removed lines patch added patch discarded remove patch
@@ -2,7 +2,7 @@  discard block
 block discarded – undo
2 2
 use EventEspresso\core\services\shortcodes\ShortcodesManager;
3 3
 
4 4
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
5
-    exit('No direct script access allowed');
5
+	exit('No direct script access allowed');
6 6
 }
7 7
 
8 8
 
@@ -19,1412 +19,1412 @@  discard block
 block discarded – undo
19 19
 {
20 20
 
21 21
 
22
-    /**
23
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
24
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
25
-     */
26
-    const req_type_normal = 0;
27
-
28
-    /**
29
-     * Indicates this is a brand new installation of EE so we should install
30
-     * tables and default data etc
31
-     */
32
-    const req_type_new_activation = 1;
33
-
34
-    /**
35
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
36
-     * and we just exited maintenance mode). We MUST check the database is setup properly
37
-     * and that default data is setup too
38
-     */
39
-    const req_type_reactivation = 2;
40
-
41
-    /**
42
-     * indicates that EE has been upgraded since its previous request.
43
-     * We may have data migration scripts to call and will want to trigger maintenance mode
44
-     */
45
-    const req_type_upgrade = 3;
46
-
47
-    /**
48
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
49
-     */
50
-    const req_type_downgrade = 4;
51
-
52
-    /**
53
-     * @deprecated since version 4.6.0.dev.006
54
-     * Now whenever a new_activation is detected the request type is still just
55
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
56
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
57
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
58
-     * (Specifically, when the migration manager indicates migrations are finished
59
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
60
-     */
61
-    const req_type_activation_but_not_installed = 5;
62
-
63
-    /**
64
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
65
-     */
66
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
67
-
68
-
69
-    /**
70
-     *    instance of the EE_System object
71
-     *
72
-     * @var    $_instance
73
-     * @access    private
74
-     */
75
-    private static $_instance = null;
76
-
77
-    /**
78
-     * @type  EE_Registry $Registry
79
-     * @access    protected
80
-     */
81
-    protected $registry;
82
-
83
-    /**
84
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
85
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
86
-     *
87
-     * @var int
88
-     */
89
-    private $_req_type;
90
-
91
-    /**
92
-     * Whether or not there was a non-micro version change in EE core version during this request
93
-     *
94
-     * @var boolean
95
-     */
96
-    private $_major_version_change = false;
97
-
98
-
99
-
100
-    /**
101
-     * @singleton method used to instantiate class object
102
-     * @access    public
103
-     * @param  \EE_Registry $Registry
104
-     * @return \EE_System
105
-     */
106
-    public static function instance(EE_Registry $Registry = null)
107
-    {
108
-        // check if class object is instantiated
109
-        if ( ! self::$_instance instanceof EE_System) {
110
-            self::$_instance = new self($Registry);
111
-        }
112
-        return self::$_instance;
113
-    }
114
-
115
-
116
-
117
-    /**
118
-     * resets the instance and returns it
119
-     *
120
-     * @return EE_System
121
-     */
122
-    public static function reset()
123
-    {
124
-        self::$_instance->_req_type = null;
125
-        //make sure none of the old hooks are left hanging around
126
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
127
-        //we need to reset the migration manager in order for it to detect DMSs properly
128
-        EE_Data_Migration_Manager::reset();
129
-        self::instance()->detect_activations_or_upgrades();
130
-        self::instance()->perform_activations_upgrades_and_migrations();
131
-        return self::instance();
132
-    }
133
-
134
-
135
-
136
-    /**
137
-     *    sets hooks for running rest of system
138
-     *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
139
-     *    starting EE Addons from any other point may lead to problems
140
-     *
141
-     * @access private
142
-     * @param  \EE_Registry $Registry
143
-     */
144
-    private function __construct(EE_Registry $Registry)
145
-    {
146
-        $this->registry = $Registry;
147
-        do_action('AHEE__EE_System__construct__begin', $this);
148
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
149
-        add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
150
-        // when an ee addon is activated, we want to call the core hook(s) again
151
-        // because the newly-activated addon didn't get a chance to run at all
152
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
153
-        // detect whether install or upgrade
154
-        add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
155
-            3);
156
-        // load EE_Config, EE_Textdomain, etc
157
-        add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
158
-        // load EE_Config, EE_Textdomain, etc
159
-        add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
160
-            array($this, 'register_shortcodes_modules_and_widgets'), 7);
161
-        // you wanna get going? I wanna get going... let's get going!
162
-        add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
163
-        //other housekeeping
164
-        //exclude EE critical pages from wp_list_pages
165
-        add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
166
-        // ALL EE Addons should use the following hook point to attach their initial setup too
167
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
168
-        do_action('AHEE__EE_System__construct__complete', $this);
169
-    }
170
-
171
-
172
-
173
-    /**
174
-     * load_espresso_addons
175
-     * allow addons to load first so that they can set hooks for running DMS's, etc
176
-     * this is hooked into both:
177
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
178
-     *        which runs during the WP 'plugins_loaded' action at priority 5
179
-     *    and the WP 'activate_plugin' hookpoint
180
-     *
181
-     * @access public
182
-     * @return void
183
-     */
184
-    public function load_espresso_addons()
185
-    {
186
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
187
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
188
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
189
-        //load and setup EE_Capabilities
190
-        $this->registry->load_core('Capabilities');
191
-        //caps need to be initialized on every request so that capability maps are set.
192
-        //@see https://events.codebasehq.com/projects/event-espresso/tickets/8674
193
-        $this->registry->CAP->init_caps();
194
-        do_action('AHEE__EE_System__load_espresso_addons');
195
-        //if the WP API basic auth plugin isn't already loaded, load it now.
196
-        //We want it for mobile apps. Just include the entire plugin
197
-        //also, don't load the basic auth when a plugin is getting activated, because
198
-        //it could be the basic auth plugin, and it doesn't check if its methods are already defined
199
-        //and causes a fatal error
200
-        if ( ! function_exists('json_basic_auth_handler')
201
-             && ! function_exists('json_basic_auth_error')
202
-             && ! (
203
-                isset($_GET['action'])
204
-                && in_array($_GET['action'], array('activate', 'activate-selected'))
205
-            )
206
-             && ! (
207
-                isset($_GET['activate'])
208
-                && $_GET['activate'] === 'true'
209
-            )
210
-        ) {
211
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
212
-        }
213
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
214
-    }
215
-
216
-
217
-
218
-    /**
219
-     * detect_activations_or_upgrades
220
-     * Checks for activation or upgrade of core first;
221
-     * then also checks if any registered addons have been activated or upgraded
222
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
223
-     * which runs during the WP 'plugins_loaded' action at priority 3
224
-     *
225
-     * @access public
226
-     * @return void
227
-     */
228
-    public function detect_activations_or_upgrades()
229
-    {
230
-        //first off: let's make sure to handle core
231
-        $this->detect_if_activation_or_upgrade();
232
-        foreach ($this->registry->addons as $addon) {
233
-            //detect teh request type for that addon
234
-            $addon->detect_activation_or_upgrade();
235
-        }
236
-    }
237
-
238
-
239
-
240
-    /**
241
-     * detect_if_activation_or_upgrade
242
-     * Takes care of detecting whether this is a brand new install or code upgrade,
243
-     * and either setting up the DB or setting up maintenance mode etc.
244
-     *
245
-     * @access public
246
-     * @return void
247
-     */
248
-    public function detect_if_activation_or_upgrade()
249
-    {
250
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
251
-        // load M-Mode class
252
-        $this->registry->load_core('Maintenance_Mode');
253
-        // check if db has been updated, or if its a brand-new installation
254
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
255
-        $request_type = $this->detect_req_type($espresso_db_update);
256
-        //EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
257
-        switch ($request_type) {
258
-            case EE_System::req_type_new_activation:
259
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
260
-                $this->_handle_core_version_change($espresso_db_update);
261
-                break;
262
-            case EE_System::req_type_reactivation:
263
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
264
-                $this->_handle_core_version_change($espresso_db_update);
265
-                break;
266
-            case EE_System::req_type_upgrade:
267
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
268
-                //migrations may be required now that we've upgraded
269
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
270
-                $this->_handle_core_version_change($espresso_db_update);
271
-                //				echo "done upgrade";die;
272
-                break;
273
-            case EE_System::req_type_downgrade:
274
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
275
-                //its possible migrations are no longer required
276
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
277
-                $this->_handle_core_version_change($espresso_db_update);
278
-                break;
279
-            case EE_System::req_type_normal:
280
-            default:
281
-                //				$this->_maybe_redirect_to_ee_about();
282
-                break;
283
-        }
284
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
285
-    }
286
-
287
-
288
-
289
-    /**
290
-     * Updates the list of installed versions and sets hooks for
291
-     * initializing the database later during the request
292
-     *
293
-     * @param array $espresso_db_update
294
-     */
295
-    protected function _handle_core_version_change($espresso_db_update)
296
-    {
297
-        $this->update_list_of_installed_versions($espresso_db_update);
298
-        //get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
299
-        add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
300
-            array($this, 'initialize_db_if_no_migrations_required'));
301
-    }
302
-
303
-
304
-
305
-    /**
306
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
307
-     * information about what versions of EE have been installed and activated,
308
-     * NOT necessarily the state of the database
309
-     *
310
-     * @param null $espresso_db_update
311
-     * @internal param array $espresso_db_update_value the value of the WordPress option. If not supplied, fetches it
312
-     *           from the options table
313
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
314
-     */
315
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
316
-    {
317
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
318
-        if ( ! $espresso_db_update) {
319
-            $espresso_db_update = get_option('espresso_db_update');
320
-        }
321
-        // check that option is an array
322
-        if ( ! is_array($espresso_db_update)) {
323
-            // if option is FALSE, then it never existed
324
-            if ($espresso_db_update === false) {
325
-                // make $espresso_db_update an array and save option with autoload OFF
326
-                $espresso_db_update = array();
327
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
328
-            } else {
329
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
330
-                $espresso_db_update = array($espresso_db_update => array());
331
-                update_option('espresso_db_update', $espresso_db_update);
332
-            }
333
-        } else {
334
-            $corrected_db_update = array();
335
-            //if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
336
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
337
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
338
-                    //the key is an int, and the value IS NOT an array
339
-                    //so it must be numerically-indexed, where values are versions installed...
340
-                    //fix it!
341
-                    $version_string = $should_be_array;
342
-                    $corrected_db_update[$version_string] = array('unknown-date');
343
-                } else {
344
-                    //ok it checks out
345
-                    $corrected_db_update[$should_be_version_string] = $should_be_array;
346
-                }
347
-            }
348
-            $espresso_db_update = $corrected_db_update;
349
-            update_option('espresso_db_update', $espresso_db_update);
350
-        }
351
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
352
-        return $espresso_db_update;
353
-    }
354
-
355
-
356
-
357
-    /**
358
-     * Does the traditional work of setting up the plugin's database and adding default data.
359
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
360
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
361
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
362
-     * so that it will be done when migrations are finished
363
-     *
364
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
365
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
366
-     *                                       This is a resource-intensive job
367
-     *                                       so we prefer to only do it when necessary
368
-     * @return void
369
-     */
370
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
371
-    {
372
-        $request_type = $this->detect_req_type();
373
-        //only initialize system if we're not in maintenance mode.
374
-        if (EE_Maintenance_Mode::instance()->level() != EE_Maintenance_Mode::level_2_complete_maintenance) {
375
-            update_option('ee_flush_rewrite_rules', true);
376
-            if ($verify_schema) {
377
-                EEH_Activation::initialize_db_and_folders();
378
-            }
379
-            EEH_Activation::initialize_db_content();
380
-            EEH_Activation::system_initialization();
381
-            if ($initialize_addons_too) {
382
-                $this->initialize_addons();
383
-            }
384
-        } else {
385
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
386
-        }
387
-        if ($request_type === EE_System::req_type_new_activation
388
-            || $request_type === EE_System::req_type_reactivation
389
-            || (
390
-                $request_type === EE_System::req_type_upgrade
391
-                && $this->is_major_version_change()
392
-            )
393
-        ) {
394
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
395
-        }
396
-    }
397
-
398
-
399
-
400
-    /**
401
-     * Initializes the db for all registered addons
402
-     */
403
-    public function initialize_addons()
404
-    {
405
-        //foreach registered addon, make sure its db is up-to-date too
406
-        foreach ($this->registry->addons as $addon) {
407
-            $addon->initialize_db_if_no_migrations_required();
408
-        }
409
-    }
410
-
411
-
412
-
413
-    /**
414
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
415
-     *
416
-     * @param    array  $version_history
417
-     * @param    string $current_version_to_add version to be added to the version history
418
-     * @return    boolean success as to whether or not this option was changed
419
-     */
420
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
421
-    {
422
-        if ( ! $version_history) {
423
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
424
-        }
425
-        if ($current_version_to_add == null) {
426
-            $current_version_to_add = espresso_version();
427
-        }
428
-        $version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
429
-        // re-save
430
-        return update_option('espresso_db_update', $version_history);
431
-    }
432
-
433
-
434
-
435
-    /**
436
-     * Detects if the current version indicated in the has existed in the list of
437
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
438
-     *
439
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
440
-     *                                  If not supplied, fetches it from the options table.
441
-     *                                  Also, caches its result so later parts of the code can also know whether
442
-     *                                  there's been an update or not. This way we can add the current version to
443
-     *                                  espresso_db_update, but still know if this is a new install or not
444
-     * @return int one of the constants on EE_System::req_type_
445
-     */
446
-    public function detect_req_type($espresso_db_update = null)
447
-    {
448
-        if ($this->_req_type === null) {
449
-            $espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
450
-                : $this->fix_espresso_db_upgrade_option();
451
-            $this->_req_type = $this->detect_req_type_given_activation_history($espresso_db_update,
452
-                'ee_espresso_activation', espresso_version());
453
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
454
-        }
455
-        return $this->_req_type;
456
-    }
457
-
458
-
459
-
460
-    /**
461
-     * Returns whether or not there was a non-micro version change (ie, change in either
462
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
463
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
464
-     *
465
-     * @param $activation_history
466
-     * @return bool
467
-     */
468
-    protected function _detect_major_version_change($activation_history)
469
-    {
470
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
471
-        $previous_version_parts = explode('.', $previous_version);
472
-        $current_version_parts = explode('.', espresso_version());
473
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
474
-               && ($previous_version_parts[0] !== $current_version_parts[0]
475
-                   || $previous_version_parts[1] !== $current_version_parts[1]
476
-               );
477
-    }
478
-
479
-
480
-
481
-    /**
482
-     * Returns true if either the major or minor version of EE changed during this request.
483
-     * 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
484
-     *
485
-     * @return bool
486
-     */
487
-    public function is_major_version_change()
488
-    {
489
-        return $this->_major_version_change;
490
-    }
491
-
492
-
493
-
494
-    /**
495
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
496
-     * histories (for core that' 'espresso_db_update' wp option); the name of the wordpress option which is temporarily
497
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
498
-     * just activated to (for core that will always be espresso_version())
499
-     *
500
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
501
-     *                                                 ee plugin. for core that's 'espresso_db_update'
502
-     * @param string $activation_indicator_option_name the name of the wordpress option that is temporarily set to
503
-     *                                                 indicate that this plugin was just activated
504
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
505
-     *                                                 espresso_version())
506
-     * @return int one of the constants on EE_System::req_type_*
507
-     */
508
-    public static function detect_req_type_given_activation_history(
509
-        $activation_history_for_addon,
510
-        $activation_indicator_option_name,
511
-        $version_to_upgrade_to
512
-    ) {
513
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
514
-        if ($activation_history_for_addon) {
515
-            //it exists, so this isn't a completely new install
516
-            //check if this version already in that list of previously installed versions
517
-            if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
518
-                //it a version we haven't seen before
519
-                if ($version_is_higher === 1) {
520
-                    $req_type = EE_System::req_type_upgrade;
521
-                } else {
522
-                    $req_type = EE_System::req_type_downgrade;
523
-                }
524
-                delete_option($activation_indicator_option_name);
525
-            } else {
526
-                // its not an update. maybe a reactivation?
527
-                if (get_option($activation_indicator_option_name, false)) {
528
-                    if ($version_is_higher === -1) {
529
-                        $req_type = EE_System::req_type_downgrade;
530
-                    } elseif ($version_is_higher === 0) {
531
-                        //we've seen this version before, but it's an activation. must be a reactivation
532
-                        $req_type = EE_System::req_type_reactivation;
533
-                    } else {//$version_is_higher === 1
534
-                        $req_type = EE_System::req_type_upgrade;
535
-                    }
536
-                    delete_option($activation_indicator_option_name);
537
-                } else {
538
-                    //we've seen this version before and the activation indicate doesn't show it was just activated
539
-                    if ($version_is_higher === -1) {
540
-                        $req_type = EE_System::req_type_downgrade;
541
-                    } elseif ($version_is_higher === 0) {
542
-                        //we've seen this version before and it's not an activation. its normal request
543
-                        $req_type = EE_System::req_type_normal;
544
-                    } else {//$version_is_higher === 1
545
-                        $req_type = EE_System::req_type_upgrade;
546
-                    }
547
-                }
548
-            }
549
-        } else {
550
-            //brand new install
551
-            $req_type = EE_System::req_type_new_activation;
552
-            delete_option($activation_indicator_option_name);
553
-        }
554
-        return $req_type;
555
-    }
556
-
557
-
558
-
559
-    /**
560
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
561
-     * the $activation_history_for_addon
562
-     *
563
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
564
-     *                                             sometimes containing 'unknown-date'
565
-     * @param string $version_to_upgrade_to        (current version)
566
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
567
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
568
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
569
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
570
-     */
571
-    protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
572
-    {
573
-        //find the most recently-activated version
574
-        $most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
575
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
576
-    }
577
-
578
-
579
-
580
-    /**
581
-     * Gets the most recently active version listed in the activation history,
582
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
583
-     *
584
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
585
-     *                                   sometimes containing 'unknown-date'
586
-     * @return string
587
-     */
588
-    protected static function _get_most_recently_active_version_from_activation_history($activation_history)
589
-    {
590
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
591
-        $most_recently_active_version = '0.0.0.dev.000';
592
-        if (is_array($activation_history)) {
593
-            foreach ($activation_history as $version => $times_activated) {
594
-                //check there is a record of when this version was activated. Otherwise,
595
-                //mark it as unknown
596
-                if ( ! $times_activated) {
597
-                    $times_activated = array('unknown-date');
598
-                }
599
-                if (is_string($times_activated)) {
600
-                    $times_activated = array($times_activated);
601
-                }
602
-                foreach ($times_activated as $an_activation) {
603
-                    if ($an_activation != 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
604
-                        $most_recently_active_version = $version;
605
-                        $most_recently_active_version_activation = $an_activation == 'unknown-date'
606
-                            ? '1970-01-01 00:00:00' : $an_activation;
607
-                    }
608
-                }
609
-            }
610
-        }
611
-        return $most_recently_active_version;
612
-    }
613
-
614
-
615
-
616
-    /**
617
-     * This redirects to the about EE page after activation
618
-     *
619
-     * @return void
620
-     */
621
-    public function redirect_to_about_ee()
622
-    {
623
-        $notices = EE_Error::get_notices(false);
624
-        //if current user is an admin and it's not an ajax or rest request
625
-        if (
626
-            ! (defined('DOING_AJAX') && DOING_AJAX)
627
-            && ! (defined('REST_REQUEST') && REST_REQUEST)
628
-            && ! isset($notices['errors'])
629
-            && apply_filters(
630
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
631
-                $this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
632
-            )
633
-        ) {
634
-            $query_params = array('page' => 'espresso_about');
635
-            if (EE_System::instance()->detect_req_type() == EE_System::req_type_new_activation) {
636
-                $query_params['new_activation'] = true;
637
-            }
638
-            if (EE_System::instance()->detect_req_type() == EE_System::req_type_reactivation) {
639
-                $query_params['reactivation'] = true;
640
-            }
641
-            $url = add_query_arg($query_params, admin_url('admin.php'));
642
-            wp_safe_redirect($url);
643
-            exit();
644
-        }
645
-    }
646
-
647
-
648
-
649
-    /**
650
-     * load_core_configuration
651
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
652
-     * which runs during the WP 'plugins_loaded' action at priority 5
653
-     *
654
-     * @return void
655
-     */
656
-    public function load_core_configuration()
657
-    {
658
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
659
-        $this->registry->load_core('EE_Load_Textdomain');
660
-        //load textdomain
661
-        EE_Load_Textdomain::load_textdomain();
662
-        // load and setup EE_Config and EE_Network_Config
663
-        $this->registry->load_core('Config');
664
-        $this->registry->load_core('Network_Config');
665
-        // setup autoloaders
666
-        // enable logging?
667
-        if ($this->registry->CFG->admin->use_full_logging) {
668
-            $this->registry->load_core('Log');
669
-        }
670
-        // check for activation errors
671
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
672
-        if ($activation_errors) {
673
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
674
-            update_option('ee_plugin_activation_errors', false);
675
-        }
676
-        // get model names
677
-        $this->_parse_model_names();
678
-        //load caf stuff a chance to play during the activation process too.
679
-        $this->_maybe_brew_regular();
680
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
681
-    }
682
-
683
-
684
-
685
-    /**
686
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
687
-     *
688
-     * @return void
689
-     */
690
-    private function _parse_model_names()
691
-    {
692
-        //get all the files in the EE_MODELS folder that end in .model.php
693
-        $models = glob(EE_MODELS . '*.model.php');
694
-        $model_names = array();
695
-        $non_abstract_db_models = array();
696
-        foreach ($models as $model) {
697
-            // get model classname
698
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
699
-            $short_name = str_replace('EEM_', '', $classname);
700
-            $reflectionClass = new ReflectionClass($classname);
701
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
702
-                $non_abstract_db_models[$short_name] = $classname;
703
-            }
704
-            $model_names[$short_name] = $classname;
705
-        }
706
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
707
-        $this->registry->non_abstract_db_models = apply_filters('FHEE__EE_System__parse_implemented_model_names',
708
-            $non_abstract_db_models);
709
-    }
710
-
711
-
712
-
713
-    /**
714
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
715
-     * that need to be setup before our EE_System launches.
716
-     *
717
-     * @return void
718
-     */
719
-    private function _maybe_brew_regular()
720
-    {
721
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
722
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
723
-        }
724
-    }
725
-
726
-
727
-
728
-    /**
729
-     * register_shortcodes_modules_and_widgets
730
-     * generate lists of shortcodes and modules, then verify paths and classes
731
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
732
-     * which runs during the WP 'plugins_loaded' action at priority 7
733
-     *
734
-     * @access public
735
-     * @return void
736
-     */
737
-    public function register_shortcodes_modules_and_widgets()
738
-    {
739
-        try {
740
-            // load, register, and add shortcodes the new way
741
-            new ShortcodesManager(
742
-            // and the old way, but we'll put it under control of the new system
743
-                EE_Config::getLegacyShortcodesManager()
744
-            );
745
-        } catch (Exception $exception) {
746
-            new ExceptionStackTraceDisplay($exception);
747
-        }
748
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
749
-        // check for addons using old hookpoint
750
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
751
-            $this->_incompatible_addon_error();
752
-        }
753
-    }
754
-
755
-
756
-
757
-    /**
758
-     * _incompatible_addon_error
759
-     *
760
-     * @access public
761
-     * @return void
762
-     */
763
-    private function _incompatible_addon_error()
764
-    {
765
-        // get array of classes hooking into here
766
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook('AHEE__EE_System__register_shortcodes_modules_and_addons');
767
-        if ( ! empty($class_names)) {
768
-            $msg = __('The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
769
-                'event_espresso');
770
-            $msg .= '<ul>';
771
-            foreach ($class_names as $class_name) {
772
-                $msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
773
-                        $class_name) . '</b></li>';
774
-            }
775
-            $msg .= '</ul>';
776
-            $msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
777
-                'event_espresso');
778
-            // save list of incompatible addons to wp-options for later use
779
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
780
-            if (is_admin()) {
781
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
782
-            }
783
-        }
784
-    }
785
-
786
-
787
-
788
-    /**
789
-     * brew_espresso
790
-     * begins the process of setting hooks for initializing EE in the correct order
791
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hookpoint
792
-     * which runs during the WP 'plugins_loaded' action at priority 9
793
-     *
794
-     * @return void
795
-     */
796
-    public function brew_espresso()
797
-    {
798
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
799
-        // load some final core systems
800
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
801
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
802
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
803
-        add_action('init', array($this, 'load_controllers'), 7);
804
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
805
-        add_action('init', array($this, 'initialize'), 10);
806
-        add_action('init', array($this, 'initialize_last'), 100);
807
-        add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
808
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
809
-            // pew pew pew
810
-            $this->registry->load_core('PUE');
811
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
812
-        }
813
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
814
-    }
815
-
816
-
817
-
818
-    /**
819
-     *    set_hooks_for_core
820
-     *
821
-     * @access public
822
-     * @return    void
823
-     */
824
-    public function set_hooks_for_core()
825
-    {
826
-        $this->_deactivate_incompatible_addons();
827
-        do_action('AHEE__EE_System__set_hooks_for_core');
828
-    }
829
-
830
-
831
-
832
-    /**
833
-     * Using the information gathered in EE_System::_incompatible_addon_error,
834
-     * deactivates any addons considered incompatible with the current version of EE
835
-     */
836
-    private function _deactivate_incompatible_addons()
837
-    {
838
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
839
-        if ( ! empty($incompatible_addons)) {
840
-            $active_plugins = get_option('active_plugins', array());
841
-            foreach ($active_plugins as $active_plugin) {
842
-                foreach ($incompatible_addons as $incompatible_addon) {
843
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
844
-                        unset($_GET['activate']);
845
-                        espresso_deactivate_plugin($active_plugin);
846
-                    }
847
-                }
848
-            }
849
-        }
850
-    }
851
-
852
-
853
-
854
-    /**
855
-     *    perform_activations_upgrades_and_migrations
856
-     *
857
-     * @access public
858
-     * @return    void
859
-     */
860
-    public function perform_activations_upgrades_and_migrations()
861
-    {
862
-        //first check if we had previously attempted to setup EE's directories but failed
863
-        if (EEH_Activation::upload_directories_incomplete()) {
864
-            EEH_Activation::create_upload_directories();
865
-        }
866
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
867
-    }
868
-
869
-
870
-
871
-    /**
872
-     *    load_CPTs_and_session
873
-     *
874
-     * @access public
875
-     * @return    void
876
-     */
877
-    public function load_CPTs_and_session()
878
-    {
879
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
880
-        // register Custom Post Types
881
-        $this->registry->load_core('Register_CPTs');
882
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
883
-    }
884
-
885
-
886
-
887
-    /**
888
-     * load_controllers
889
-     * this is the best place to load any additional controllers that needs access to EE core.
890
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
891
-     * time
892
-     *
893
-     * @access public
894
-     * @return void
895
-     */
896
-    public function load_controllers()
897
-    {
898
-        do_action('AHEE__EE_System__load_controllers__start');
899
-        // let's get it started
900
-        if ( ! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
901
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
902
-            $this->registry->load_core('Front_Controller');
903
-        } else if ( ! EE_FRONT_AJAX) {
904
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
905
-            EE_Registry::instance()->load_core('Admin');
906
-        }
907
-        do_action('AHEE__EE_System__load_controllers__complete');
908
-    }
909
-
910
-
911
-
912
-    /**
913
-     * core_loaded_and_ready
914
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
915
-     *
916
-     * @access public
917
-     * @return void
918
-     */
919
-    public function core_loaded_and_ready()
920
-    {
921
-        $this->registry->load_core('Session');
922
-        do_action('AHEE__EE_System__core_loaded_and_ready');
923
-        // load_espresso_template_tags
924
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
925
-            require_once(EE_PUBLIC . 'template_tags.php');
926
-        }
927
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
928
-        $this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
929
-        wp_enqueue_script('espresso_core');
930
-    }
931
-
932
-
933
-
934
-    /**
935
-     * initialize
936
-     * this is the best place to begin initializing client code
937
-     *
938
-     * @access public
939
-     * @return void
940
-     */
941
-    public function initialize()
942
-    {
943
-        do_action('AHEE__EE_System__initialize');
944
-    }
945
-
946
-
947
-
948
-    /**
949
-     * initialize_last
950
-     * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
951
-     * initialize has done so
952
-     *
953
-     * @access public
954
-     * @return void
955
-     */
956
-    public function initialize_last()
957
-    {
958
-        do_action('AHEE__EE_System__initialize_last');
959
-    }
960
-
961
-
962
-
963
-    /**
964
-     * set_hooks_for_shortcodes_modules_and_addons
965
-     * this is the best place for other systems to set callbacks for hooking into other parts of EE
966
-     * this happens at the very beginning of the wp_loaded hookpoint
967
-     *
968
-     * @access public
969
-     * @return void
970
-     */
971
-    public function set_hooks_for_shortcodes_modules_and_addons()
972
-    {
973
-        //		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
974
-    }
975
-
976
-
977
-
978
-    /**
979
-     * do_not_cache
980
-     * sets no cache headers and defines no cache constants for WP plugins
981
-     *
982
-     * @access public
983
-     * @return void
984
-     */
985
-    public static function do_not_cache()
986
-    {
987
-        // set no cache constants
988
-        if ( ! defined('DONOTCACHEPAGE')) {
989
-            define('DONOTCACHEPAGE', true);
990
-        }
991
-        if ( ! defined('DONOTCACHCEOBJECT')) {
992
-            define('DONOTCACHCEOBJECT', true);
993
-        }
994
-        if ( ! defined('DONOTCACHEDB')) {
995
-            define('DONOTCACHEDB', true);
996
-        }
997
-        // add no cache headers
998
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
999
-        // plus a little extra for nginx and Google Chrome
1000
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1001
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1002
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1003
-    }
1004
-
1005
-
1006
-
1007
-    /**
1008
-     *    extra_nocache_headers
1009
-     *
1010
-     * @access    public
1011
-     * @param $headers
1012
-     * @return    array
1013
-     */
1014
-    public static function extra_nocache_headers($headers)
1015
-    {
1016
-        // for NGINX
1017
-        $headers['X-Accel-Expires'] = 0;
1018
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1019
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1020
-        return $headers;
1021
-    }
1022
-
1023
-
1024
-
1025
-    /**
1026
-     *    nocache_headers
1027
-     *
1028
-     * @access    public
1029
-     * @return    void
1030
-     */
1031
-    public static function nocache_headers()
1032
-    {
1033
-        nocache_headers();
1034
-    }
1035
-
1036
-
1037
-
1038
-    /**
1039
-     *    espresso_toolbar_items
1040
-     *
1041
-     * @access public
1042
-     * @param  WP_Admin_Bar $admin_bar
1043
-     * @return void
1044
-     */
1045
-    public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1046
-    {
1047
-        // if in full M-Mode, or its an AJAX request, or user is NOT an admin
1048
-        if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1049
-            || defined('DOING_AJAX')
1050
-            || ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1051
-        ) {
1052
-            return;
1053
-        }
1054
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1055
-        $menu_class = 'espresso_menu_item_class';
1056
-        //we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1057
-        //because they're only defined in each of their respective constructors
1058
-        //and this might be a frontend request, in which case they aren't available
1059
-        $events_admin_url = admin_url("admin.php?page=espresso_events");
1060
-        $reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1061
-        $extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1062
-        //Top Level
1063
-        $admin_bar->add_menu(array(
1064
-            'id'    => 'espresso-toolbar',
1065
-            'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1066
-                       . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1067
-                       . '</span>',
1068
-            'href'  => $events_admin_url,
1069
-            'meta'  => array(
1070
-                'title' => __('Event Espresso', 'event_espresso'),
1071
-                'class' => $menu_class . 'first',
1072
-            ),
1073
-        ));
1074
-        //Events
1075
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1076
-            $admin_bar->add_menu(array(
1077
-                'id'     => 'espresso-toolbar-events',
1078
-                'parent' => 'espresso-toolbar',
1079
-                'title'  => __('Events', 'event_espresso'),
1080
-                'href'   => $events_admin_url,
1081
-                'meta'   => array(
1082
-                    'title'  => __('Events', 'event_espresso'),
1083
-                    'target' => '',
1084
-                    'class'  => $menu_class,
1085
-                ),
1086
-            ));
1087
-        }
1088
-        if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1089
-            //Events Add New
1090
-            $admin_bar->add_menu(array(
1091
-                'id'     => 'espresso-toolbar-events-new',
1092
-                'parent' => 'espresso-toolbar-events',
1093
-                'title'  => __('Add New', 'event_espresso'),
1094
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1095
-                'meta'   => array(
1096
-                    'title'  => __('Add New', 'event_espresso'),
1097
-                    'target' => '',
1098
-                    'class'  => $menu_class,
1099
-                ),
1100
-            ));
1101
-        }
1102
-        if (is_single() && (get_post_type() == 'espresso_events')) {
1103
-            //Current post
1104
-            global $post;
1105
-            if ($this->registry->CAP->current_user_can('ee_edit_event',
1106
-                'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1107
-            ) {
1108
-                //Events Edit Current Event
1109
-                $admin_bar->add_menu(array(
1110
-                    'id'     => 'espresso-toolbar-events-edit',
1111
-                    'parent' => 'espresso-toolbar-events',
1112
-                    'title'  => __('Edit Event', 'event_espresso'),
1113
-                    'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1114
-                        $events_admin_url),
1115
-                    'meta'   => array(
1116
-                        'title'  => __('Edit Event', 'event_espresso'),
1117
-                        'target' => '',
1118
-                        'class'  => $menu_class,
1119
-                    ),
1120
-                ));
1121
-            }
1122
-        }
1123
-        //Events View
1124
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1125
-            'ee_admin_bar_menu_espresso-toolbar-events-view')
1126
-        ) {
1127
-            $admin_bar->add_menu(array(
1128
-                'id'     => 'espresso-toolbar-events-view',
1129
-                'parent' => 'espresso-toolbar-events',
1130
-                'title'  => __('View', 'event_espresso'),
1131
-                'href'   => $events_admin_url,
1132
-                'meta'   => array(
1133
-                    'title'  => __('View', 'event_espresso'),
1134
-                    'target' => '',
1135
-                    'class'  => $menu_class,
1136
-                ),
1137
-            ));
1138
-        }
1139
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1140
-            //Events View All
1141
-            $admin_bar->add_menu(array(
1142
-                'id'     => 'espresso-toolbar-events-all',
1143
-                'parent' => 'espresso-toolbar-events-view',
1144
-                'title'  => __('All', 'event_espresso'),
1145
-                'href'   => $events_admin_url,
1146
-                'meta'   => array(
1147
-                    'title'  => __('All', 'event_espresso'),
1148
-                    'target' => '',
1149
-                    'class'  => $menu_class,
1150
-                ),
1151
-            ));
1152
-        }
1153
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1154
-            'ee_admin_bar_menu_espresso-toolbar-events-today')
1155
-        ) {
1156
-            //Events View Today
1157
-            $admin_bar->add_menu(array(
1158
-                'id'     => 'espresso-toolbar-events-today',
1159
-                'parent' => 'espresso-toolbar-events-view',
1160
-                'title'  => __('Today', 'event_espresso'),
1161
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1162
-                    $events_admin_url),
1163
-                'meta'   => array(
1164
-                    'title'  => __('Today', 'event_espresso'),
1165
-                    'target' => '',
1166
-                    'class'  => $menu_class,
1167
-                ),
1168
-            ));
1169
-        }
1170
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1171
-            'ee_admin_bar_menu_espresso-toolbar-events-month')
1172
-        ) {
1173
-            //Events View This Month
1174
-            $admin_bar->add_menu(array(
1175
-                'id'     => 'espresso-toolbar-events-month',
1176
-                'parent' => 'espresso-toolbar-events-view',
1177
-                'title'  => __('This Month', 'event_espresso'),
1178
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1179
-                    $events_admin_url),
1180
-                'meta'   => array(
1181
-                    'title'  => __('This Month', 'event_espresso'),
1182
-                    'target' => '',
1183
-                    'class'  => $menu_class,
1184
-                ),
1185
-            ));
1186
-        }
1187
-        //Registration Overview
1188
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1189
-            'ee_admin_bar_menu_espresso-toolbar-registrations')
1190
-        ) {
1191
-            $admin_bar->add_menu(array(
1192
-                'id'     => 'espresso-toolbar-registrations',
1193
-                'parent' => 'espresso-toolbar',
1194
-                'title'  => __('Registrations', 'event_espresso'),
1195
-                'href'   => $reg_admin_url,
1196
-                'meta'   => array(
1197
-                    'title'  => __('Registrations', 'event_espresso'),
1198
-                    'target' => '',
1199
-                    'class'  => $menu_class,
1200
-                ),
1201
-            ));
1202
-        }
1203
-        //Registration Overview Today
1204
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1205
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1206
-        ) {
1207
-            $admin_bar->add_menu(array(
1208
-                'id'     => 'espresso-toolbar-registrations-today',
1209
-                'parent' => 'espresso-toolbar-registrations',
1210
-                'title'  => __('Today', 'event_espresso'),
1211
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1212
-                    $reg_admin_url),
1213
-                'meta'   => array(
1214
-                    'title'  => __('Today', 'event_espresso'),
1215
-                    'target' => '',
1216
-                    'class'  => $menu_class,
1217
-                ),
1218
-            ));
1219
-        }
1220
-        //Registration Overview Today Completed
1221
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1222
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1223
-        ) {
1224
-            $admin_bar->add_menu(array(
1225
-                'id'     => 'espresso-toolbar-registrations-today-approved',
1226
-                'parent' => 'espresso-toolbar-registrations-today',
1227
-                'title'  => __('Approved', 'event_espresso'),
1228
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1229
-                    'action'      => 'default',
1230
-                    'status'      => 'today',
1231
-                    '_reg_status' => EEM_Registration::status_id_approved,
1232
-                ), $reg_admin_url),
1233
-                'meta'   => array(
1234
-                    'title'  => __('Approved', 'event_espresso'),
1235
-                    'target' => '',
1236
-                    'class'  => $menu_class,
1237
-                ),
1238
-            ));
1239
-        }
1240
-        //Registration Overview Today Pending\
1241
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1242
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1243
-        ) {
1244
-            $admin_bar->add_menu(array(
1245
-                'id'     => 'espresso-toolbar-registrations-today-pending',
1246
-                'parent' => 'espresso-toolbar-registrations-today',
1247
-                'title'  => __('Pending', 'event_espresso'),
1248
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1249
-                    'action'     => 'default',
1250
-                    'status'     => 'today',
1251
-                    'reg_status' => EEM_Registration::status_id_pending_payment,
1252
-                ), $reg_admin_url),
1253
-                'meta'   => array(
1254
-                    'title'  => __('Pending Payment', 'event_espresso'),
1255
-                    'target' => '',
1256
-                    'class'  => $menu_class,
1257
-                ),
1258
-            ));
1259
-        }
1260
-        //Registration Overview Today Incomplete
1261
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1262
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1263
-        ) {
1264
-            $admin_bar->add_menu(array(
1265
-                'id'     => 'espresso-toolbar-registrations-today-not-approved',
1266
-                'parent' => 'espresso-toolbar-registrations-today',
1267
-                'title'  => __('Not Approved', 'event_espresso'),
1268
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1269
-                    'action'      => 'default',
1270
-                    'status'      => 'today',
1271
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1272
-                ), $reg_admin_url),
1273
-                'meta'   => array(
1274
-                    'title'  => __('Not Approved', 'event_espresso'),
1275
-                    'target' => '',
1276
-                    'class'  => $menu_class,
1277
-                ),
1278
-            ));
1279
-        }
1280
-        //Registration Overview Today Incomplete
1281
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1282
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1283
-        ) {
1284
-            $admin_bar->add_menu(array(
1285
-                'id'     => 'espresso-toolbar-registrations-today-cancelled',
1286
-                'parent' => 'espresso-toolbar-registrations-today',
1287
-                'title'  => __('Cancelled', 'event_espresso'),
1288
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1289
-                    'action'      => 'default',
1290
-                    'status'      => 'today',
1291
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1292
-                ), $reg_admin_url),
1293
-                'meta'   => array(
1294
-                    'title'  => __('Cancelled', 'event_espresso'),
1295
-                    'target' => '',
1296
-                    'class'  => $menu_class,
1297
-                ),
1298
-            ));
1299
-        }
1300
-        //Registration Overview This Month
1301
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1302
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1303
-        ) {
1304
-            $admin_bar->add_menu(array(
1305
-                'id'     => 'espresso-toolbar-registrations-month',
1306
-                'parent' => 'espresso-toolbar-registrations',
1307
-                'title'  => __('This Month', 'event_espresso'),
1308
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1309
-                    $reg_admin_url),
1310
-                'meta'   => array(
1311
-                    'title'  => __('This Month', 'event_espresso'),
1312
-                    'target' => '',
1313
-                    'class'  => $menu_class,
1314
-                ),
1315
-            ));
1316
-        }
1317
-        //Registration Overview This Month Approved
1318
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1319
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1320
-        ) {
1321
-            $admin_bar->add_menu(array(
1322
-                'id'     => 'espresso-toolbar-registrations-month-approved',
1323
-                'parent' => 'espresso-toolbar-registrations-month',
1324
-                'title'  => __('Approved', 'event_espresso'),
1325
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1326
-                    'action'      => 'default',
1327
-                    'status'      => 'month',
1328
-                    '_reg_status' => EEM_Registration::status_id_approved,
1329
-                ), $reg_admin_url),
1330
-                'meta'   => array(
1331
-                    'title'  => __('Approved', 'event_espresso'),
1332
-                    'target' => '',
1333
-                    'class'  => $menu_class,
1334
-                ),
1335
-            ));
1336
-        }
1337
-        //Registration Overview This Month Pending
1338
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1339
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1340
-        ) {
1341
-            $admin_bar->add_menu(array(
1342
-                'id'     => 'espresso-toolbar-registrations-month-pending',
1343
-                'parent' => 'espresso-toolbar-registrations-month',
1344
-                'title'  => __('Pending', 'event_espresso'),
1345
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1346
-                    'action'      => 'default',
1347
-                    'status'      => 'month',
1348
-                    '_reg_status' => EEM_Registration::status_id_pending_payment,
1349
-                ), $reg_admin_url),
1350
-                'meta'   => array(
1351
-                    'title'  => __('Pending', 'event_espresso'),
1352
-                    'target' => '',
1353
-                    'class'  => $menu_class,
1354
-                ),
1355
-            ));
1356
-        }
1357
-        //Registration Overview This Month Not Approved
1358
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1359
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1360
-        ) {
1361
-            $admin_bar->add_menu(array(
1362
-                'id'     => 'espresso-toolbar-registrations-month-not-approved',
1363
-                'parent' => 'espresso-toolbar-registrations-month',
1364
-                'title'  => __('Not Approved', 'event_espresso'),
1365
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1366
-                    'action'      => 'default',
1367
-                    'status'      => 'month',
1368
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1369
-                ), $reg_admin_url),
1370
-                'meta'   => array(
1371
-                    'title'  => __('Not Approved', 'event_espresso'),
1372
-                    'target' => '',
1373
-                    'class'  => $menu_class,
1374
-                ),
1375
-            ));
1376
-        }
1377
-        //Registration Overview This Month Cancelled
1378
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1379
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1380
-        ) {
1381
-            $admin_bar->add_menu(array(
1382
-                'id'     => 'espresso-toolbar-registrations-month-cancelled',
1383
-                'parent' => 'espresso-toolbar-registrations-month',
1384
-                'title'  => __('Cancelled', 'event_espresso'),
1385
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1386
-                    'action'      => 'default',
1387
-                    'status'      => 'month',
1388
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1389
-                ), $reg_admin_url),
1390
-                'meta'   => array(
1391
-                    'title'  => __('Cancelled', 'event_espresso'),
1392
-                    'target' => '',
1393
-                    'class'  => $menu_class,
1394
-                ),
1395
-            ));
1396
-        }
1397
-        //Extensions & Services
1398
-        if ($this->registry->CAP->current_user_can('ee_read_ee',
1399
-            'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1400
-        ) {
1401
-            $admin_bar->add_menu(array(
1402
-                'id'     => 'espresso-toolbar-extensions-and-services',
1403
-                'parent' => 'espresso-toolbar',
1404
-                'title'  => __('Extensions & Services', 'event_espresso'),
1405
-                'href'   => $extensions_admin_url,
1406
-                'meta'   => array(
1407
-                    'title'  => __('Extensions & Services', 'event_espresso'),
1408
-                    'target' => '',
1409
-                    'class'  => $menu_class,
1410
-                ),
1411
-            ));
1412
-        }
1413
-    }
1414
-
1415
-
1416
-
1417
-    /**
1418
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1419
-     * never returned with the function.
1420
-     *
1421
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1422
-     * @return array
1423
-     */
1424
-    public function remove_pages_from_wp_list_pages($exclude_array)
1425
-    {
1426
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1427
-    }
22
+	/**
23
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
24
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
25
+	 */
26
+	const req_type_normal = 0;
27
+
28
+	/**
29
+	 * Indicates this is a brand new installation of EE so we should install
30
+	 * tables and default data etc
31
+	 */
32
+	const req_type_new_activation = 1;
33
+
34
+	/**
35
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
36
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
37
+	 * and that default data is setup too
38
+	 */
39
+	const req_type_reactivation = 2;
40
+
41
+	/**
42
+	 * indicates that EE has been upgraded since its previous request.
43
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
44
+	 */
45
+	const req_type_upgrade = 3;
46
+
47
+	/**
48
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
49
+	 */
50
+	const req_type_downgrade = 4;
51
+
52
+	/**
53
+	 * @deprecated since version 4.6.0.dev.006
54
+	 * Now whenever a new_activation is detected the request type is still just
55
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
56
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
57
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
58
+	 * (Specifically, when the migration manager indicates migrations are finished
59
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
60
+	 */
61
+	const req_type_activation_but_not_installed = 5;
62
+
63
+	/**
64
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
65
+	 */
66
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
67
+
68
+
69
+	/**
70
+	 *    instance of the EE_System object
71
+	 *
72
+	 * @var    $_instance
73
+	 * @access    private
74
+	 */
75
+	private static $_instance = null;
76
+
77
+	/**
78
+	 * @type  EE_Registry $Registry
79
+	 * @access    protected
80
+	 */
81
+	protected $registry;
82
+
83
+	/**
84
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
85
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
86
+	 *
87
+	 * @var int
88
+	 */
89
+	private $_req_type;
90
+
91
+	/**
92
+	 * Whether or not there was a non-micro version change in EE core version during this request
93
+	 *
94
+	 * @var boolean
95
+	 */
96
+	private $_major_version_change = false;
97
+
98
+
99
+
100
+	/**
101
+	 * @singleton method used to instantiate class object
102
+	 * @access    public
103
+	 * @param  \EE_Registry $Registry
104
+	 * @return \EE_System
105
+	 */
106
+	public static function instance(EE_Registry $Registry = null)
107
+	{
108
+		// check if class object is instantiated
109
+		if ( ! self::$_instance instanceof EE_System) {
110
+			self::$_instance = new self($Registry);
111
+		}
112
+		return self::$_instance;
113
+	}
114
+
115
+
116
+
117
+	/**
118
+	 * resets the instance and returns it
119
+	 *
120
+	 * @return EE_System
121
+	 */
122
+	public static function reset()
123
+	{
124
+		self::$_instance->_req_type = null;
125
+		//make sure none of the old hooks are left hanging around
126
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
127
+		//we need to reset the migration manager in order for it to detect DMSs properly
128
+		EE_Data_Migration_Manager::reset();
129
+		self::instance()->detect_activations_or_upgrades();
130
+		self::instance()->perform_activations_upgrades_and_migrations();
131
+		return self::instance();
132
+	}
133
+
134
+
135
+
136
+	/**
137
+	 *    sets hooks for running rest of system
138
+	 *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
139
+	 *    starting EE Addons from any other point may lead to problems
140
+	 *
141
+	 * @access private
142
+	 * @param  \EE_Registry $Registry
143
+	 */
144
+	private function __construct(EE_Registry $Registry)
145
+	{
146
+		$this->registry = $Registry;
147
+		do_action('AHEE__EE_System__construct__begin', $this);
148
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
149
+		add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
150
+		// when an ee addon is activated, we want to call the core hook(s) again
151
+		// because the newly-activated addon didn't get a chance to run at all
152
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
153
+		// detect whether install or upgrade
154
+		add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
155
+			3);
156
+		// load EE_Config, EE_Textdomain, etc
157
+		add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
158
+		// load EE_Config, EE_Textdomain, etc
159
+		add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
160
+			array($this, 'register_shortcodes_modules_and_widgets'), 7);
161
+		// you wanna get going? I wanna get going... let's get going!
162
+		add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
163
+		//other housekeeping
164
+		//exclude EE critical pages from wp_list_pages
165
+		add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
166
+		// ALL EE Addons should use the following hook point to attach their initial setup too
167
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
168
+		do_action('AHEE__EE_System__construct__complete', $this);
169
+	}
170
+
171
+
172
+
173
+	/**
174
+	 * load_espresso_addons
175
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
176
+	 * this is hooked into both:
177
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
178
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
179
+	 *    and the WP 'activate_plugin' hookpoint
180
+	 *
181
+	 * @access public
182
+	 * @return void
183
+	 */
184
+	public function load_espresso_addons()
185
+	{
186
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
187
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
188
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
189
+		//load and setup EE_Capabilities
190
+		$this->registry->load_core('Capabilities');
191
+		//caps need to be initialized on every request so that capability maps are set.
192
+		//@see https://events.codebasehq.com/projects/event-espresso/tickets/8674
193
+		$this->registry->CAP->init_caps();
194
+		do_action('AHEE__EE_System__load_espresso_addons');
195
+		//if the WP API basic auth plugin isn't already loaded, load it now.
196
+		//We want it for mobile apps. Just include the entire plugin
197
+		//also, don't load the basic auth when a plugin is getting activated, because
198
+		//it could be the basic auth plugin, and it doesn't check if its methods are already defined
199
+		//and causes a fatal error
200
+		if ( ! function_exists('json_basic_auth_handler')
201
+			 && ! function_exists('json_basic_auth_error')
202
+			 && ! (
203
+				isset($_GET['action'])
204
+				&& in_array($_GET['action'], array('activate', 'activate-selected'))
205
+			)
206
+			 && ! (
207
+				isset($_GET['activate'])
208
+				&& $_GET['activate'] === 'true'
209
+			)
210
+		) {
211
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
212
+		}
213
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
214
+	}
215
+
216
+
217
+
218
+	/**
219
+	 * detect_activations_or_upgrades
220
+	 * Checks for activation or upgrade of core first;
221
+	 * then also checks if any registered addons have been activated or upgraded
222
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
223
+	 * which runs during the WP 'plugins_loaded' action at priority 3
224
+	 *
225
+	 * @access public
226
+	 * @return void
227
+	 */
228
+	public function detect_activations_or_upgrades()
229
+	{
230
+		//first off: let's make sure to handle core
231
+		$this->detect_if_activation_or_upgrade();
232
+		foreach ($this->registry->addons as $addon) {
233
+			//detect teh request type for that addon
234
+			$addon->detect_activation_or_upgrade();
235
+		}
236
+	}
237
+
238
+
239
+
240
+	/**
241
+	 * detect_if_activation_or_upgrade
242
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
243
+	 * and either setting up the DB or setting up maintenance mode etc.
244
+	 *
245
+	 * @access public
246
+	 * @return void
247
+	 */
248
+	public function detect_if_activation_or_upgrade()
249
+	{
250
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
251
+		// load M-Mode class
252
+		$this->registry->load_core('Maintenance_Mode');
253
+		// check if db has been updated, or if its a brand-new installation
254
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
255
+		$request_type = $this->detect_req_type($espresso_db_update);
256
+		//EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
257
+		switch ($request_type) {
258
+			case EE_System::req_type_new_activation:
259
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
260
+				$this->_handle_core_version_change($espresso_db_update);
261
+				break;
262
+			case EE_System::req_type_reactivation:
263
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
264
+				$this->_handle_core_version_change($espresso_db_update);
265
+				break;
266
+			case EE_System::req_type_upgrade:
267
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
268
+				//migrations may be required now that we've upgraded
269
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
270
+				$this->_handle_core_version_change($espresso_db_update);
271
+				//				echo "done upgrade";die;
272
+				break;
273
+			case EE_System::req_type_downgrade:
274
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
275
+				//its possible migrations are no longer required
276
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
277
+				$this->_handle_core_version_change($espresso_db_update);
278
+				break;
279
+			case EE_System::req_type_normal:
280
+			default:
281
+				//				$this->_maybe_redirect_to_ee_about();
282
+				break;
283
+		}
284
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
285
+	}
286
+
287
+
288
+
289
+	/**
290
+	 * Updates the list of installed versions and sets hooks for
291
+	 * initializing the database later during the request
292
+	 *
293
+	 * @param array $espresso_db_update
294
+	 */
295
+	protected function _handle_core_version_change($espresso_db_update)
296
+	{
297
+		$this->update_list_of_installed_versions($espresso_db_update);
298
+		//get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
299
+		add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
300
+			array($this, 'initialize_db_if_no_migrations_required'));
301
+	}
302
+
303
+
304
+
305
+	/**
306
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
307
+	 * information about what versions of EE have been installed and activated,
308
+	 * NOT necessarily the state of the database
309
+	 *
310
+	 * @param null $espresso_db_update
311
+	 * @internal param array $espresso_db_update_value the value of the WordPress option. If not supplied, fetches it
312
+	 *           from the options table
313
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
314
+	 */
315
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
316
+	{
317
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
318
+		if ( ! $espresso_db_update) {
319
+			$espresso_db_update = get_option('espresso_db_update');
320
+		}
321
+		// check that option is an array
322
+		if ( ! is_array($espresso_db_update)) {
323
+			// if option is FALSE, then it never existed
324
+			if ($espresso_db_update === false) {
325
+				// make $espresso_db_update an array and save option with autoload OFF
326
+				$espresso_db_update = array();
327
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
328
+			} else {
329
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
330
+				$espresso_db_update = array($espresso_db_update => array());
331
+				update_option('espresso_db_update', $espresso_db_update);
332
+			}
333
+		} else {
334
+			$corrected_db_update = array();
335
+			//if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
336
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
337
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
338
+					//the key is an int, and the value IS NOT an array
339
+					//so it must be numerically-indexed, where values are versions installed...
340
+					//fix it!
341
+					$version_string = $should_be_array;
342
+					$corrected_db_update[$version_string] = array('unknown-date');
343
+				} else {
344
+					//ok it checks out
345
+					$corrected_db_update[$should_be_version_string] = $should_be_array;
346
+				}
347
+			}
348
+			$espresso_db_update = $corrected_db_update;
349
+			update_option('espresso_db_update', $espresso_db_update);
350
+		}
351
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
352
+		return $espresso_db_update;
353
+	}
354
+
355
+
356
+
357
+	/**
358
+	 * Does the traditional work of setting up the plugin's database and adding default data.
359
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
360
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
361
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
362
+	 * so that it will be done when migrations are finished
363
+	 *
364
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
365
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
366
+	 *                                       This is a resource-intensive job
367
+	 *                                       so we prefer to only do it when necessary
368
+	 * @return void
369
+	 */
370
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
371
+	{
372
+		$request_type = $this->detect_req_type();
373
+		//only initialize system if we're not in maintenance mode.
374
+		if (EE_Maintenance_Mode::instance()->level() != EE_Maintenance_Mode::level_2_complete_maintenance) {
375
+			update_option('ee_flush_rewrite_rules', true);
376
+			if ($verify_schema) {
377
+				EEH_Activation::initialize_db_and_folders();
378
+			}
379
+			EEH_Activation::initialize_db_content();
380
+			EEH_Activation::system_initialization();
381
+			if ($initialize_addons_too) {
382
+				$this->initialize_addons();
383
+			}
384
+		} else {
385
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
386
+		}
387
+		if ($request_type === EE_System::req_type_new_activation
388
+			|| $request_type === EE_System::req_type_reactivation
389
+			|| (
390
+				$request_type === EE_System::req_type_upgrade
391
+				&& $this->is_major_version_change()
392
+			)
393
+		) {
394
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
395
+		}
396
+	}
397
+
398
+
399
+
400
+	/**
401
+	 * Initializes the db for all registered addons
402
+	 */
403
+	public function initialize_addons()
404
+	{
405
+		//foreach registered addon, make sure its db is up-to-date too
406
+		foreach ($this->registry->addons as $addon) {
407
+			$addon->initialize_db_if_no_migrations_required();
408
+		}
409
+	}
410
+
411
+
412
+
413
+	/**
414
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
415
+	 *
416
+	 * @param    array  $version_history
417
+	 * @param    string $current_version_to_add version to be added to the version history
418
+	 * @return    boolean success as to whether or not this option was changed
419
+	 */
420
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
421
+	{
422
+		if ( ! $version_history) {
423
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
424
+		}
425
+		if ($current_version_to_add == null) {
426
+			$current_version_to_add = espresso_version();
427
+		}
428
+		$version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
429
+		// re-save
430
+		return update_option('espresso_db_update', $version_history);
431
+	}
432
+
433
+
434
+
435
+	/**
436
+	 * Detects if the current version indicated in the has existed in the list of
437
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
438
+	 *
439
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
440
+	 *                                  If not supplied, fetches it from the options table.
441
+	 *                                  Also, caches its result so later parts of the code can also know whether
442
+	 *                                  there's been an update or not. This way we can add the current version to
443
+	 *                                  espresso_db_update, but still know if this is a new install or not
444
+	 * @return int one of the constants on EE_System::req_type_
445
+	 */
446
+	public function detect_req_type($espresso_db_update = null)
447
+	{
448
+		if ($this->_req_type === null) {
449
+			$espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
450
+				: $this->fix_espresso_db_upgrade_option();
451
+			$this->_req_type = $this->detect_req_type_given_activation_history($espresso_db_update,
452
+				'ee_espresso_activation', espresso_version());
453
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
454
+		}
455
+		return $this->_req_type;
456
+	}
457
+
458
+
459
+
460
+	/**
461
+	 * Returns whether or not there was a non-micro version change (ie, change in either
462
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
463
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
464
+	 *
465
+	 * @param $activation_history
466
+	 * @return bool
467
+	 */
468
+	protected function _detect_major_version_change($activation_history)
469
+	{
470
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
471
+		$previous_version_parts = explode('.', $previous_version);
472
+		$current_version_parts = explode('.', espresso_version());
473
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
474
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
475
+				   || $previous_version_parts[1] !== $current_version_parts[1]
476
+			   );
477
+	}
478
+
479
+
480
+
481
+	/**
482
+	 * Returns true if either the major or minor version of EE changed during this request.
483
+	 * 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
484
+	 *
485
+	 * @return bool
486
+	 */
487
+	public function is_major_version_change()
488
+	{
489
+		return $this->_major_version_change;
490
+	}
491
+
492
+
493
+
494
+	/**
495
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
496
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the wordpress option which is temporarily
497
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
498
+	 * just activated to (for core that will always be espresso_version())
499
+	 *
500
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
501
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
502
+	 * @param string $activation_indicator_option_name the name of the wordpress option that is temporarily set to
503
+	 *                                                 indicate that this plugin was just activated
504
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
505
+	 *                                                 espresso_version())
506
+	 * @return int one of the constants on EE_System::req_type_*
507
+	 */
508
+	public static function detect_req_type_given_activation_history(
509
+		$activation_history_for_addon,
510
+		$activation_indicator_option_name,
511
+		$version_to_upgrade_to
512
+	) {
513
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
514
+		if ($activation_history_for_addon) {
515
+			//it exists, so this isn't a completely new install
516
+			//check if this version already in that list of previously installed versions
517
+			if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
518
+				//it a version we haven't seen before
519
+				if ($version_is_higher === 1) {
520
+					$req_type = EE_System::req_type_upgrade;
521
+				} else {
522
+					$req_type = EE_System::req_type_downgrade;
523
+				}
524
+				delete_option($activation_indicator_option_name);
525
+			} else {
526
+				// its not an update. maybe a reactivation?
527
+				if (get_option($activation_indicator_option_name, false)) {
528
+					if ($version_is_higher === -1) {
529
+						$req_type = EE_System::req_type_downgrade;
530
+					} elseif ($version_is_higher === 0) {
531
+						//we've seen this version before, but it's an activation. must be a reactivation
532
+						$req_type = EE_System::req_type_reactivation;
533
+					} else {//$version_is_higher === 1
534
+						$req_type = EE_System::req_type_upgrade;
535
+					}
536
+					delete_option($activation_indicator_option_name);
537
+				} else {
538
+					//we've seen this version before and the activation indicate doesn't show it was just activated
539
+					if ($version_is_higher === -1) {
540
+						$req_type = EE_System::req_type_downgrade;
541
+					} elseif ($version_is_higher === 0) {
542
+						//we've seen this version before and it's not an activation. its normal request
543
+						$req_type = EE_System::req_type_normal;
544
+					} else {//$version_is_higher === 1
545
+						$req_type = EE_System::req_type_upgrade;
546
+					}
547
+				}
548
+			}
549
+		} else {
550
+			//brand new install
551
+			$req_type = EE_System::req_type_new_activation;
552
+			delete_option($activation_indicator_option_name);
553
+		}
554
+		return $req_type;
555
+	}
556
+
557
+
558
+
559
+	/**
560
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
561
+	 * the $activation_history_for_addon
562
+	 *
563
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
564
+	 *                                             sometimes containing 'unknown-date'
565
+	 * @param string $version_to_upgrade_to        (current version)
566
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
567
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
568
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
569
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
570
+	 */
571
+	protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
572
+	{
573
+		//find the most recently-activated version
574
+		$most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
575
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
576
+	}
577
+
578
+
579
+
580
+	/**
581
+	 * Gets the most recently active version listed in the activation history,
582
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
583
+	 *
584
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
585
+	 *                                   sometimes containing 'unknown-date'
586
+	 * @return string
587
+	 */
588
+	protected static function _get_most_recently_active_version_from_activation_history($activation_history)
589
+	{
590
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
591
+		$most_recently_active_version = '0.0.0.dev.000';
592
+		if (is_array($activation_history)) {
593
+			foreach ($activation_history as $version => $times_activated) {
594
+				//check there is a record of when this version was activated. Otherwise,
595
+				//mark it as unknown
596
+				if ( ! $times_activated) {
597
+					$times_activated = array('unknown-date');
598
+				}
599
+				if (is_string($times_activated)) {
600
+					$times_activated = array($times_activated);
601
+				}
602
+				foreach ($times_activated as $an_activation) {
603
+					if ($an_activation != 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
604
+						$most_recently_active_version = $version;
605
+						$most_recently_active_version_activation = $an_activation == 'unknown-date'
606
+							? '1970-01-01 00:00:00' : $an_activation;
607
+					}
608
+				}
609
+			}
610
+		}
611
+		return $most_recently_active_version;
612
+	}
613
+
614
+
615
+
616
+	/**
617
+	 * This redirects to the about EE page after activation
618
+	 *
619
+	 * @return void
620
+	 */
621
+	public function redirect_to_about_ee()
622
+	{
623
+		$notices = EE_Error::get_notices(false);
624
+		//if current user is an admin and it's not an ajax or rest request
625
+		if (
626
+			! (defined('DOING_AJAX') && DOING_AJAX)
627
+			&& ! (defined('REST_REQUEST') && REST_REQUEST)
628
+			&& ! isset($notices['errors'])
629
+			&& apply_filters(
630
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
631
+				$this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
632
+			)
633
+		) {
634
+			$query_params = array('page' => 'espresso_about');
635
+			if (EE_System::instance()->detect_req_type() == EE_System::req_type_new_activation) {
636
+				$query_params['new_activation'] = true;
637
+			}
638
+			if (EE_System::instance()->detect_req_type() == EE_System::req_type_reactivation) {
639
+				$query_params['reactivation'] = true;
640
+			}
641
+			$url = add_query_arg($query_params, admin_url('admin.php'));
642
+			wp_safe_redirect($url);
643
+			exit();
644
+		}
645
+	}
646
+
647
+
648
+
649
+	/**
650
+	 * load_core_configuration
651
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
652
+	 * which runs during the WP 'plugins_loaded' action at priority 5
653
+	 *
654
+	 * @return void
655
+	 */
656
+	public function load_core_configuration()
657
+	{
658
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
659
+		$this->registry->load_core('EE_Load_Textdomain');
660
+		//load textdomain
661
+		EE_Load_Textdomain::load_textdomain();
662
+		// load and setup EE_Config and EE_Network_Config
663
+		$this->registry->load_core('Config');
664
+		$this->registry->load_core('Network_Config');
665
+		// setup autoloaders
666
+		// enable logging?
667
+		if ($this->registry->CFG->admin->use_full_logging) {
668
+			$this->registry->load_core('Log');
669
+		}
670
+		// check for activation errors
671
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
672
+		if ($activation_errors) {
673
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
674
+			update_option('ee_plugin_activation_errors', false);
675
+		}
676
+		// get model names
677
+		$this->_parse_model_names();
678
+		//load caf stuff a chance to play during the activation process too.
679
+		$this->_maybe_brew_regular();
680
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
681
+	}
682
+
683
+
684
+
685
+	/**
686
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
687
+	 *
688
+	 * @return void
689
+	 */
690
+	private function _parse_model_names()
691
+	{
692
+		//get all the files in the EE_MODELS folder that end in .model.php
693
+		$models = glob(EE_MODELS . '*.model.php');
694
+		$model_names = array();
695
+		$non_abstract_db_models = array();
696
+		foreach ($models as $model) {
697
+			// get model classname
698
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
699
+			$short_name = str_replace('EEM_', '', $classname);
700
+			$reflectionClass = new ReflectionClass($classname);
701
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
702
+				$non_abstract_db_models[$short_name] = $classname;
703
+			}
704
+			$model_names[$short_name] = $classname;
705
+		}
706
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
707
+		$this->registry->non_abstract_db_models = apply_filters('FHEE__EE_System__parse_implemented_model_names',
708
+			$non_abstract_db_models);
709
+	}
710
+
711
+
712
+
713
+	/**
714
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
715
+	 * that need to be setup before our EE_System launches.
716
+	 *
717
+	 * @return void
718
+	 */
719
+	private function _maybe_brew_regular()
720
+	{
721
+		if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
722
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
723
+		}
724
+	}
725
+
726
+
727
+
728
+	/**
729
+	 * register_shortcodes_modules_and_widgets
730
+	 * generate lists of shortcodes and modules, then verify paths and classes
731
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
732
+	 * which runs during the WP 'plugins_loaded' action at priority 7
733
+	 *
734
+	 * @access public
735
+	 * @return void
736
+	 */
737
+	public function register_shortcodes_modules_and_widgets()
738
+	{
739
+		try {
740
+			// load, register, and add shortcodes the new way
741
+			new ShortcodesManager(
742
+			// and the old way, but we'll put it under control of the new system
743
+				EE_Config::getLegacyShortcodesManager()
744
+			);
745
+		} catch (Exception $exception) {
746
+			new ExceptionStackTraceDisplay($exception);
747
+		}
748
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
749
+		// check for addons using old hookpoint
750
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
751
+			$this->_incompatible_addon_error();
752
+		}
753
+	}
754
+
755
+
756
+
757
+	/**
758
+	 * _incompatible_addon_error
759
+	 *
760
+	 * @access public
761
+	 * @return void
762
+	 */
763
+	private function _incompatible_addon_error()
764
+	{
765
+		// get array of classes hooking into here
766
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook('AHEE__EE_System__register_shortcodes_modules_and_addons');
767
+		if ( ! empty($class_names)) {
768
+			$msg = __('The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
769
+				'event_espresso');
770
+			$msg .= '<ul>';
771
+			foreach ($class_names as $class_name) {
772
+				$msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
773
+						$class_name) . '</b></li>';
774
+			}
775
+			$msg .= '</ul>';
776
+			$msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
777
+				'event_espresso');
778
+			// save list of incompatible addons to wp-options for later use
779
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
780
+			if (is_admin()) {
781
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
782
+			}
783
+		}
784
+	}
785
+
786
+
787
+
788
+	/**
789
+	 * brew_espresso
790
+	 * begins the process of setting hooks for initializing EE in the correct order
791
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hookpoint
792
+	 * which runs during the WP 'plugins_loaded' action at priority 9
793
+	 *
794
+	 * @return void
795
+	 */
796
+	public function brew_espresso()
797
+	{
798
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
799
+		// load some final core systems
800
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
801
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
802
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
803
+		add_action('init', array($this, 'load_controllers'), 7);
804
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
805
+		add_action('init', array($this, 'initialize'), 10);
806
+		add_action('init', array($this, 'initialize_last'), 100);
807
+		add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
808
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
809
+			// pew pew pew
810
+			$this->registry->load_core('PUE');
811
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
812
+		}
813
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
814
+	}
815
+
816
+
817
+
818
+	/**
819
+	 *    set_hooks_for_core
820
+	 *
821
+	 * @access public
822
+	 * @return    void
823
+	 */
824
+	public function set_hooks_for_core()
825
+	{
826
+		$this->_deactivate_incompatible_addons();
827
+		do_action('AHEE__EE_System__set_hooks_for_core');
828
+	}
829
+
830
+
831
+
832
+	/**
833
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
834
+	 * deactivates any addons considered incompatible with the current version of EE
835
+	 */
836
+	private function _deactivate_incompatible_addons()
837
+	{
838
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
839
+		if ( ! empty($incompatible_addons)) {
840
+			$active_plugins = get_option('active_plugins', array());
841
+			foreach ($active_plugins as $active_plugin) {
842
+				foreach ($incompatible_addons as $incompatible_addon) {
843
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
844
+						unset($_GET['activate']);
845
+						espresso_deactivate_plugin($active_plugin);
846
+					}
847
+				}
848
+			}
849
+		}
850
+	}
851
+
852
+
853
+
854
+	/**
855
+	 *    perform_activations_upgrades_and_migrations
856
+	 *
857
+	 * @access public
858
+	 * @return    void
859
+	 */
860
+	public function perform_activations_upgrades_and_migrations()
861
+	{
862
+		//first check if we had previously attempted to setup EE's directories but failed
863
+		if (EEH_Activation::upload_directories_incomplete()) {
864
+			EEH_Activation::create_upload_directories();
865
+		}
866
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
867
+	}
868
+
869
+
870
+
871
+	/**
872
+	 *    load_CPTs_and_session
873
+	 *
874
+	 * @access public
875
+	 * @return    void
876
+	 */
877
+	public function load_CPTs_and_session()
878
+	{
879
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
880
+		// register Custom Post Types
881
+		$this->registry->load_core('Register_CPTs');
882
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
883
+	}
884
+
885
+
886
+
887
+	/**
888
+	 * load_controllers
889
+	 * this is the best place to load any additional controllers that needs access to EE core.
890
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
891
+	 * time
892
+	 *
893
+	 * @access public
894
+	 * @return void
895
+	 */
896
+	public function load_controllers()
897
+	{
898
+		do_action('AHEE__EE_System__load_controllers__start');
899
+		// let's get it started
900
+		if ( ! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
901
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
902
+			$this->registry->load_core('Front_Controller');
903
+		} else if ( ! EE_FRONT_AJAX) {
904
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
905
+			EE_Registry::instance()->load_core('Admin');
906
+		}
907
+		do_action('AHEE__EE_System__load_controllers__complete');
908
+	}
909
+
910
+
911
+
912
+	/**
913
+	 * core_loaded_and_ready
914
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
915
+	 *
916
+	 * @access public
917
+	 * @return void
918
+	 */
919
+	public function core_loaded_and_ready()
920
+	{
921
+		$this->registry->load_core('Session');
922
+		do_action('AHEE__EE_System__core_loaded_and_ready');
923
+		// load_espresso_template_tags
924
+		if (is_readable(EE_PUBLIC . 'template_tags.php')) {
925
+			require_once(EE_PUBLIC . 'template_tags.php');
926
+		}
927
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
928
+		$this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
929
+		wp_enqueue_script('espresso_core');
930
+	}
931
+
932
+
933
+
934
+	/**
935
+	 * initialize
936
+	 * this is the best place to begin initializing client code
937
+	 *
938
+	 * @access public
939
+	 * @return void
940
+	 */
941
+	public function initialize()
942
+	{
943
+		do_action('AHEE__EE_System__initialize');
944
+	}
945
+
946
+
947
+
948
+	/**
949
+	 * initialize_last
950
+	 * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
951
+	 * initialize has done so
952
+	 *
953
+	 * @access public
954
+	 * @return void
955
+	 */
956
+	public function initialize_last()
957
+	{
958
+		do_action('AHEE__EE_System__initialize_last');
959
+	}
960
+
961
+
962
+
963
+	/**
964
+	 * set_hooks_for_shortcodes_modules_and_addons
965
+	 * this is the best place for other systems to set callbacks for hooking into other parts of EE
966
+	 * this happens at the very beginning of the wp_loaded hookpoint
967
+	 *
968
+	 * @access public
969
+	 * @return void
970
+	 */
971
+	public function set_hooks_for_shortcodes_modules_and_addons()
972
+	{
973
+		//		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
974
+	}
975
+
976
+
977
+
978
+	/**
979
+	 * do_not_cache
980
+	 * sets no cache headers and defines no cache constants for WP plugins
981
+	 *
982
+	 * @access public
983
+	 * @return void
984
+	 */
985
+	public static function do_not_cache()
986
+	{
987
+		// set no cache constants
988
+		if ( ! defined('DONOTCACHEPAGE')) {
989
+			define('DONOTCACHEPAGE', true);
990
+		}
991
+		if ( ! defined('DONOTCACHCEOBJECT')) {
992
+			define('DONOTCACHCEOBJECT', true);
993
+		}
994
+		if ( ! defined('DONOTCACHEDB')) {
995
+			define('DONOTCACHEDB', true);
996
+		}
997
+		// add no cache headers
998
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
999
+		// plus a little extra for nginx and Google Chrome
1000
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1001
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1002
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1003
+	}
1004
+
1005
+
1006
+
1007
+	/**
1008
+	 *    extra_nocache_headers
1009
+	 *
1010
+	 * @access    public
1011
+	 * @param $headers
1012
+	 * @return    array
1013
+	 */
1014
+	public static function extra_nocache_headers($headers)
1015
+	{
1016
+		// for NGINX
1017
+		$headers['X-Accel-Expires'] = 0;
1018
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1019
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1020
+		return $headers;
1021
+	}
1022
+
1023
+
1024
+
1025
+	/**
1026
+	 *    nocache_headers
1027
+	 *
1028
+	 * @access    public
1029
+	 * @return    void
1030
+	 */
1031
+	public static function nocache_headers()
1032
+	{
1033
+		nocache_headers();
1034
+	}
1035
+
1036
+
1037
+
1038
+	/**
1039
+	 *    espresso_toolbar_items
1040
+	 *
1041
+	 * @access public
1042
+	 * @param  WP_Admin_Bar $admin_bar
1043
+	 * @return void
1044
+	 */
1045
+	public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1046
+	{
1047
+		// if in full M-Mode, or its an AJAX request, or user is NOT an admin
1048
+		if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1049
+			|| defined('DOING_AJAX')
1050
+			|| ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1051
+		) {
1052
+			return;
1053
+		}
1054
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1055
+		$menu_class = 'espresso_menu_item_class';
1056
+		//we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1057
+		//because they're only defined in each of their respective constructors
1058
+		//and this might be a frontend request, in which case they aren't available
1059
+		$events_admin_url = admin_url("admin.php?page=espresso_events");
1060
+		$reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1061
+		$extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1062
+		//Top Level
1063
+		$admin_bar->add_menu(array(
1064
+			'id'    => 'espresso-toolbar',
1065
+			'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1066
+					   . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1067
+					   . '</span>',
1068
+			'href'  => $events_admin_url,
1069
+			'meta'  => array(
1070
+				'title' => __('Event Espresso', 'event_espresso'),
1071
+				'class' => $menu_class . 'first',
1072
+			),
1073
+		));
1074
+		//Events
1075
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1076
+			$admin_bar->add_menu(array(
1077
+				'id'     => 'espresso-toolbar-events',
1078
+				'parent' => 'espresso-toolbar',
1079
+				'title'  => __('Events', 'event_espresso'),
1080
+				'href'   => $events_admin_url,
1081
+				'meta'   => array(
1082
+					'title'  => __('Events', 'event_espresso'),
1083
+					'target' => '',
1084
+					'class'  => $menu_class,
1085
+				),
1086
+			));
1087
+		}
1088
+		if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1089
+			//Events Add New
1090
+			$admin_bar->add_menu(array(
1091
+				'id'     => 'espresso-toolbar-events-new',
1092
+				'parent' => 'espresso-toolbar-events',
1093
+				'title'  => __('Add New', 'event_espresso'),
1094
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1095
+				'meta'   => array(
1096
+					'title'  => __('Add New', 'event_espresso'),
1097
+					'target' => '',
1098
+					'class'  => $menu_class,
1099
+				),
1100
+			));
1101
+		}
1102
+		if (is_single() && (get_post_type() == 'espresso_events')) {
1103
+			//Current post
1104
+			global $post;
1105
+			if ($this->registry->CAP->current_user_can('ee_edit_event',
1106
+				'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1107
+			) {
1108
+				//Events Edit Current Event
1109
+				$admin_bar->add_menu(array(
1110
+					'id'     => 'espresso-toolbar-events-edit',
1111
+					'parent' => 'espresso-toolbar-events',
1112
+					'title'  => __('Edit Event', 'event_espresso'),
1113
+					'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1114
+						$events_admin_url),
1115
+					'meta'   => array(
1116
+						'title'  => __('Edit Event', 'event_espresso'),
1117
+						'target' => '',
1118
+						'class'  => $menu_class,
1119
+					),
1120
+				));
1121
+			}
1122
+		}
1123
+		//Events View
1124
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1125
+			'ee_admin_bar_menu_espresso-toolbar-events-view')
1126
+		) {
1127
+			$admin_bar->add_menu(array(
1128
+				'id'     => 'espresso-toolbar-events-view',
1129
+				'parent' => 'espresso-toolbar-events',
1130
+				'title'  => __('View', 'event_espresso'),
1131
+				'href'   => $events_admin_url,
1132
+				'meta'   => array(
1133
+					'title'  => __('View', 'event_espresso'),
1134
+					'target' => '',
1135
+					'class'  => $menu_class,
1136
+				),
1137
+			));
1138
+		}
1139
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1140
+			//Events View All
1141
+			$admin_bar->add_menu(array(
1142
+				'id'     => 'espresso-toolbar-events-all',
1143
+				'parent' => 'espresso-toolbar-events-view',
1144
+				'title'  => __('All', 'event_espresso'),
1145
+				'href'   => $events_admin_url,
1146
+				'meta'   => array(
1147
+					'title'  => __('All', 'event_espresso'),
1148
+					'target' => '',
1149
+					'class'  => $menu_class,
1150
+				),
1151
+			));
1152
+		}
1153
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1154
+			'ee_admin_bar_menu_espresso-toolbar-events-today')
1155
+		) {
1156
+			//Events View Today
1157
+			$admin_bar->add_menu(array(
1158
+				'id'     => 'espresso-toolbar-events-today',
1159
+				'parent' => 'espresso-toolbar-events-view',
1160
+				'title'  => __('Today', 'event_espresso'),
1161
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1162
+					$events_admin_url),
1163
+				'meta'   => array(
1164
+					'title'  => __('Today', 'event_espresso'),
1165
+					'target' => '',
1166
+					'class'  => $menu_class,
1167
+				),
1168
+			));
1169
+		}
1170
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1171
+			'ee_admin_bar_menu_espresso-toolbar-events-month')
1172
+		) {
1173
+			//Events View This Month
1174
+			$admin_bar->add_menu(array(
1175
+				'id'     => 'espresso-toolbar-events-month',
1176
+				'parent' => 'espresso-toolbar-events-view',
1177
+				'title'  => __('This Month', 'event_espresso'),
1178
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1179
+					$events_admin_url),
1180
+				'meta'   => array(
1181
+					'title'  => __('This Month', 'event_espresso'),
1182
+					'target' => '',
1183
+					'class'  => $menu_class,
1184
+				),
1185
+			));
1186
+		}
1187
+		//Registration Overview
1188
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1189
+			'ee_admin_bar_menu_espresso-toolbar-registrations')
1190
+		) {
1191
+			$admin_bar->add_menu(array(
1192
+				'id'     => 'espresso-toolbar-registrations',
1193
+				'parent' => 'espresso-toolbar',
1194
+				'title'  => __('Registrations', 'event_espresso'),
1195
+				'href'   => $reg_admin_url,
1196
+				'meta'   => array(
1197
+					'title'  => __('Registrations', 'event_espresso'),
1198
+					'target' => '',
1199
+					'class'  => $menu_class,
1200
+				),
1201
+			));
1202
+		}
1203
+		//Registration Overview Today
1204
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1205
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1206
+		) {
1207
+			$admin_bar->add_menu(array(
1208
+				'id'     => 'espresso-toolbar-registrations-today',
1209
+				'parent' => 'espresso-toolbar-registrations',
1210
+				'title'  => __('Today', 'event_espresso'),
1211
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1212
+					$reg_admin_url),
1213
+				'meta'   => array(
1214
+					'title'  => __('Today', 'event_espresso'),
1215
+					'target' => '',
1216
+					'class'  => $menu_class,
1217
+				),
1218
+			));
1219
+		}
1220
+		//Registration Overview Today Completed
1221
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1222
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1223
+		) {
1224
+			$admin_bar->add_menu(array(
1225
+				'id'     => 'espresso-toolbar-registrations-today-approved',
1226
+				'parent' => 'espresso-toolbar-registrations-today',
1227
+				'title'  => __('Approved', 'event_espresso'),
1228
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1229
+					'action'      => 'default',
1230
+					'status'      => 'today',
1231
+					'_reg_status' => EEM_Registration::status_id_approved,
1232
+				), $reg_admin_url),
1233
+				'meta'   => array(
1234
+					'title'  => __('Approved', 'event_espresso'),
1235
+					'target' => '',
1236
+					'class'  => $menu_class,
1237
+				),
1238
+			));
1239
+		}
1240
+		//Registration Overview Today Pending\
1241
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1242
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1243
+		) {
1244
+			$admin_bar->add_menu(array(
1245
+				'id'     => 'espresso-toolbar-registrations-today-pending',
1246
+				'parent' => 'espresso-toolbar-registrations-today',
1247
+				'title'  => __('Pending', 'event_espresso'),
1248
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1249
+					'action'     => 'default',
1250
+					'status'     => 'today',
1251
+					'reg_status' => EEM_Registration::status_id_pending_payment,
1252
+				), $reg_admin_url),
1253
+				'meta'   => array(
1254
+					'title'  => __('Pending Payment', 'event_espresso'),
1255
+					'target' => '',
1256
+					'class'  => $menu_class,
1257
+				),
1258
+			));
1259
+		}
1260
+		//Registration Overview Today Incomplete
1261
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1262
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1263
+		) {
1264
+			$admin_bar->add_menu(array(
1265
+				'id'     => 'espresso-toolbar-registrations-today-not-approved',
1266
+				'parent' => 'espresso-toolbar-registrations-today',
1267
+				'title'  => __('Not Approved', 'event_espresso'),
1268
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1269
+					'action'      => 'default',
1270
+					'status'      => 'today',
1271
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1272
+				), $reg_admin_url),
1273
+				'meta'   => array(
1274
+					'title'  => __('Not Approved', 'event_espresso'),
1275
+					'target' => '',
1276
+					'class'  => $menu_class,
1277
+				),
1278
+			));
1279
+		}
1280
+		//Registration Overview Today Incomplete
1281
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1282
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1283
+		) {
1284
+			$admin_bar->add_menu(array(
1285
+				'id'     => 'espresso-toolbar-registrations-today-cancelled',
1286
+				'parent' => 'espresso-toolbar-registrations-today',
1287
+				'title'  => __('Cancelled', 'event_espresso'),
1288
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1289
+					'action'      => 'default',
1290
+					'status'      => 'today',
1291
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1292
+				), $reg_admin_url),
1293
+				'meta'   => array(
1294
+					'title'  => __('Cancelled', 'event_espresso'),
1295
+					'target' => '',
1296
+					'class'  => $menu_class,
1297
+				),
1298
+			));
1299
+		}
1300
+		//Registration Overview This Month
1301
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1302
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1303
+		) {
1304
+			$admin_bar->add_menu(array(
1305
+				'id'     => 'espresso-toolbar-registrations-month',
1306
+				'parent' => 'espresso-toolbar-registrations',
1307
+				'title'  => __('This Month', 'event_espresso'),
1308
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1309
+					$reg_admin_url),
1310
+				'meta'   => array(
1311
+					'title'  => __('This Month', 'event_espresso'),
1312
+					'target' => '',
1313
+					'class'  => $menu_class,
1314
+				),
1315
+			));
1316
+		}
1317
+		//Registration Overview This Month Approved
1318
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1319
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1320
+		) {
1321
+			$admin_bar->add_menu(array(
1322
+				'id'     => 'espresso-toolbar-registrations-month-approved',
1323
+				'parent' => 'espresso-toolbar-registrations-month',
1324
+				'title'  => __('Approved', 'event_espresso'),
1325
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1326
+					'action'      => 'default',
1327
+					'status'      => 'month',
1328
+					'_reg_status' => EEM_Registration::status_id_approved,
1329
+				), $reg_admin_url),
1330
+				'meta'   => array(
1331
+					'title'  => __('Approved', 'event_espresso'),
1332
+					'target' => '',
1333
+					'class'  => $menu_class,
1334
+				),
1335
+			));
1336
+		}
1337
+		//Registration Overview This Month Pending
1338
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1339
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1340
+		) {
1341
+			$admin_bar->add_menu(array(
1342
+				'id'     => 'espresso-toolbar-registrations-month-pending',
1343
+				'parent' => 'espresso-toolbar-registrations-month',
1344
+				'title'  => __('Pending', 'event_espresso'),
1345
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1346
+					'action'      => 'default',
1347
+					'status'      => 'month',
1348
+					'_reg_status' => EEM_Registration::status_id_pending_payment,
1349
+				), $reg_admin_url),
1350
+				'meta'   => array(
1351
+					'title'  => __('Pending', 'event_espresso'),
1352
+					'target' => '',
1353
+					'class'  => $menu_class,
1354
+				),
1355
+			));
1356
+		}
1357
+		//Registration Overview This Month Not Approved
1358
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1359
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1360
+		) {
1361
+			$admin_bar->add_menu(array(
1362
+				'id'     => 'espresso-toolbar-registrations-month-not-approved',
1363
+				'parent' => 'espresso-toolbar-registrations-month',
1364
+				'title'  => __('Not Approved', 'event_espresso'),
1365
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1366
+					'action'      => 'default',
1367
+					'status'      => 'month',
1368
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1369
+				), $reg_admin_url),
1370
+				'meta'   => array(
1371
+					'title'  => __('Not Approved', 'event_espresso'),
1372
+					'target' => '',
1373
+					'class'  => $menu_class,
1374
+				),
1375
+			));
1376
+		}
1377
+		//Registration Overview This Month Cancelled
1378
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1379
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1380
+		) {
1381
+			$admin_bar->add_menu(array(
1382
+				'id'     => 'espresso-toolbar-registrations-month-cancelled',
1383
+				'parent' => 'espresso-toolbar-registrations-month',
1384
+				'title'  => __('Cancelled', 'event_espresso'),
1385
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1386
+					'action'      => 'default',
1387
+					'status'      => 'month',
1388
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1389
+				), $reg_admin_url),
1390
+				'meta'   => array(
1391
+					'title'  => __('Cancelled', 'event_espresso'),
1392
+					'target' => '',
1393
+					'class'  => $menu_class,
1394
+				),
1395
+			));
1396
+		}
1397
+		//Extensions & Services
1398
+		if ($this->registry->CAP->current_user_can('ee_read_ee',
1399
+			'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1400
+		) {
1401
+			$admin_bar->add_menu(array(
1402
+				'id'     => 'espresso-toolbar-extensions-and-services',
1403
+				'parent' => 'espresso-toolbar',
1404
+				'title'  => __('Extensions & Services', 'event_espresso'),
1405
+				'href'   => $extensions_admin_url,
1406
+				'meta'   => array(
1407
+					'title'  => __('Extensions & Services', 'event_espresso'),
1408
+					'target' => '',
1409
+					'class'  => $menu_class,
1410
+				),
1411
+			));
1412
+		}
1413
+	}
1414
+
1415
+
1416
+
1417
+	/**
1418
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1419
+	 * never returned with the function.
1420
+	 *
1421
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1422
+	 * @return array
1423
+	 */
1424
+	public function remove_pages_from_wp_list_pages($exclude_array)
1425
+	{
1426
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1427
+	}
1428 1428
 
1429 1429
 
1430 1430
 
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
     {
186 186
         // set autoloaders for all of the classes implementing EEI_Plugin_API
187 187
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
188
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
188
+        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
189 189
         //load and setup EE_Capabilities
190 190
         $this->registry->load_core('Capabilities');
191 191
         //caps need to be initialized on every request so that capability maps are set.
@@ -208,7 +208,7 @@  discard block
 block discarded – undo
208 208
                 && $_GET['activate'] === 'true'
209 209
             )
210 210
         ) {
211
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
211
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth'.DS.'basic-auth.php';
212 212
         }
213 213
         do_action('AHEE__EE_System__load_espresso_addons__complete');
214 214
     }
@@ -690,7 +690,7 @@  discard block
 block discarded – undo
690 690
     private function _parse_model_names()
691 691
     {
692 692
         //get all the files in the EE_MODELS folder that end in .model.php
693
-        $models = glob(EE_MODELS . '*.model.php');
693
+        $models = glob(EE_MODELS.'*.model.php');
694 694
         $model_names = array();
695 695
         $non_abstract_db_models = array();
696 696
         foreach ($models as $model) {
@@ -718,8 +718,8 @@  discard block
 block discarded – undo
718 718
      */
719 719
     private function _maybe_brew_regular()
720 720
     {
721
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
722
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
721
+        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH.'brewing_regular.php')) {
722
+            require_once EE_CAFF_PATH.'brewing_regular.php';
723 723
         }
724 724
     }
725 725
 
@@ -769,8 +769,8 @@  discard block
 block discarded – undo
769 769
                 'event_espresso');
770 770
             $msg .= '<ul>';
771 771
             foreach ($class_names as $class_name) {
772
-                $msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
773
-                        $class_name) . '</b></li>';
772
+                $msg .= '<li><b>Event Espresso - '.str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
773
+                        $class_name).'</b></li>';
774 774
             }
775 775
             $msg .= '</ul>';
776 776
             $msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
@@ -921,8 +921,8 @@  discard block
 block discarded – undo
921 921
         $this->registry->load_core('Session');
922 922
         do_action('AHEE__EE_System__core_loaded_and_ready');
923 923
         // load_espresso_template_tags
924
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
925
-            require_once(EE_PUBLIC . 'template_tags.php');
924
+        if (is_readable(EE_PUBLIC.'template_tags.php')) {
925
+            require_once(EE_PUBLIC.'template_tags.php');
926 926
         }
927 927
         do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
928 928
         $this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
@@ -1068,7 +1068,7 @@  discard block
 block discarded – undo
1068 1068
             'href'  => $events_admin_url,
1069 1069
             'meta'  => array(
1070 1070
                 'title' => __('Event Espresso', 'event_espresso'),
1071
-                'class' => $menu_class . 'first',
1071
+                'class' => $menu_class.'first',
1072 1072
             ),
1073 1073
         ));
1074 1074
         //Events
Please login to merge, or discard this patch.
core/libraries/form_sections/form_handlers/FormHandler.php 2 patches
Indentation   +637 added lines, -637 removed lines patch added patch discarded remove patch
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
 use EventEspresso\core\exceptions\InvalidFormSubmissionException;
13 13
 
14 14
 if (! defined('EVENT_ESPRESSO_VERSION')) {
15
-    exit('No direct script access allowed');
15
+	exit('No direct script access allowed');
16 16
 }
17 17
 
18 18
 
@@ -31,642 +31,642 @@  discard block
 block discarded – undo
31 31
 abstract class FormHandler implements FormHandlerInterface
32 32
 {
33 33
 
34
-    /**
35
-     * will add opening and closing HTML form tags as well as a submit button
36
-     */
37
-    const ADD_FORM_TAGS_AND_SUBMIT = 'add_form_tags_and_submit';
38
-
39
-    /**
40
-     * will add opening and closing HTML form tags but NOT a submit button
41
-     */
42
-    const ADD_FORM_TAGS_ONLY = 'add_form_tags_only';
43
-
44
-    /**
45
-     * will NOT add opening and closing HTML form tags but will add a submit button
46
-     */
47
-    const ADD_FORM_SUBMIT_ONLY = 'add_form_submit_only';
48
-
49
-    /**
50
-     * will NOT add opening and closing HTML form tags NOR a submit button
51
-     */
52
-    const DO_NOT_SETUP_FORM = 'do_not_setup_form';
53
-
54
-    /**
55
-     * if set to false, then this form has no displayable content,
56
-     * and will only be used for processing data sent passed via GET or POST
57
-     * defaults to true ( ie: form has displayable content )
58
-     *
59
-     * @var boolean $displayable
60
-     */
61
-    private $displayable = true;
62
-
63
-    /**
64
-     * @var string $form_name
65
-     */
66
-    private $form_name;
67
-
68
-    /**
69
-     * @var string $admin_name
70
-     */
71
-    private $admin_name;
72
-
73
-    /**
74
-     * @var string $slug
75
-     */
76
-    private $slug;
77
-
78
-    /**
79
-     * @var string $submit_btn_text
80
-     */
81
-    private $submit_btn_text;
82
-
83
-    /**
84
-     * @var string $form_action
85
-     */
86
-    private $form_action;
87
-
88
-    /**
89
-     * form params in key value pairs
90
-     * can be added to form action URL or as hidden inputs
91
-     *
92
-     * @var array $form_args
93
-     */
94
-    private $form_args = array();
95
-
96
-    /**
97
-     * value of one of the string constant above
98
-     *
99
-     * @var string $form_config
100
-     */
101
-    private $form_config;
102
-
103
-    /**
104
-     * whether or not the form was determined to be invalid
105
-     *
106
-     * @var boolean $form_has_errors
107
-     */
108
-    private $form_has_errors;
109
-
110
-    /**
111
-     * the absolute top level form section being used on the page
112
-     *
113
-     * @var \EE_Form_Section_Proper $form
114
-     */
115
-    private $form;
116
-
117
-    /**
118
-     * @var \EE_Registry $registry
119
-     */
120
-    protected $registry;
121
-
122
-
123
-
124
-    /**
125
-     * Form constructor.
126
-     *
127
-     * @param string       $form_name
128
-     * @param string       $admin_name
129
-     * @param string       $slug
130
-     * @param string       $form_action
131
-     * @param string       $form_config
132
-     * @param \EE_Registry $registry
133
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
134
-     * @throws \DomainException
135
-     * @throws \InvalidArgumentException
136
-     */
137
-    public function __construct(
138
-        $form_name,
139
-        $admin_name,
140
-        $slug,
141
-        $form_action = '',
142
-        $form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
143
-        \EE_Registry $registry
144
-    ) {
145
-        $this->setFormName($form_name);
146
-        $this->setAdminName($admin_name);
147
-        $this->setSlug($slug);
148
-        $this->setFormAction($form_action);
149
-        $this->setFormConfig($form_config);
150
-        $this->setSubmitBtnText(esc_html__('Submit', 'event_espresso'));
151
-        $this->registry = $registry;
152
-    }
153
-
154
-
155
-
156
-    /**
157
-     * @return array
158
-     */
159
-    public static function getFormConfigConstants()
160
-    {
161
-        return array(
162
-            FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
163
-            FormHandler::ADD_FORM_TAGS_ONLY,
164
-            FormHandler::ADD_FORM_SUBMIT_ONLY,
165
-            FormHandler::DO_NOT_SETUP_FORM,
166
-        );
167
-    }
168
-
169
-
170
-
171
-    /**
172
-     * @param bool $for_display
173
-     * @return \EE_Form_Section_Proper
174
-     * @throws \EE_Error
175
-     * @throws \LogicException
176
-     */
177
-    public function form($for_display = false)
178
-    {
179
-        if (! $this->formIsValid()) {
180
-            return null;
181
-        }
182
-        if ($for_display) {
183
-            $form_config = $this->formConfig();
184
-            if (
185
-                $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
186
-                || $form_config === FormHandler::ADD_FORM_SUBMIT_ONLY
187
-            ) {
188
-                $this->appendSubmitButton();
189
-                $this->clearFormButtonFloats();
190
-            }
191
-        }
192
-        return $this->form;
193
-    }
194
-
195
-
196
-
197
-    /**
198
-     * @return boolean
199
-     * @throws LogicException
200
-     */
201
-    public function formIsValid()
202
-    {
203
-        if (! $this->form instanceof \EE_Form_Section_Proper) {
204
-            static $generated = false;
205
-            if (! $generated) {
206
-                $generated = true;
207
-                $form = apply_filters(
208
-                    'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
209
-                    $this->generate(),
210
-                    $this
211
-                );
212
-                if ($form instanceof \EE_Form_Section_Proper) {
213
-                    $this->setForm($form);
214
-                }
215
-            }
216
-            return $this->verifyForm();
217
-        }
218
-        return true;
219
-    }
220
-
221
-
222
-
223
-    /**
224
-     * @return boolean
225
-     * @throws LogicException
226
-     */
227
-    public function verifyForm()
228
-    {
229
-        if ($this->form instanceof \EE_Form_Section_Proper) {
230
-            return true;
231
-        }
232
-        throw new LogicException(
233
-            sprintf(
234
-                esc_html__('The "%1$s" form is invalid or missing', 'event_espresso'),
235
-                $this->form_name
236
-            )
237
-        );
238
-    }
239
-
240
-
241
-
242
-    /**
243
-     * @param \EE_Form_Section_Proper $form
244
-     */
245
-    public function setForm(\EE_Form_Section_Proper $form)
246
-    {
247
-        $this->form = $form;
248
-    }
249
-
250
-
251
-
252
-    /**
253
-     * @return boolean
254
-     */
255
-    public function displayable()
256
-    {
257
-        return $this->displayable;
258
-    }
259
-
260
-
261
-
262
-    /**
263
-     * @param boolean $displayable
264
-     */
265
-    public function setDisplayable($displayable = false)
266
-    {
267
-        $this->displayable = filter_var($displayable, FILTER_VALIDATE_BOOLEAN);
268
-    }
269
-
270
-
271
-
272
-    /**
273
-     * a public name for the form that can be displayed on the frontend of a site
274
-     *
275
-     * @return string
276
-     */
277
-    public function formName()
278
-    {
279
-        return $this->form_name;
280
-    }
281
-
282
-
283
-
284
-    /**
285
-     * @param string $form_name
286
-     * @throws InvalidDataTypeException
287
-     */
288
-    public function setFormName($form_name)
289
-    {
290
-        if (! is_string($form_name)) {
291
-            throw new InvalidDataTypeException('$form_name', $form_name, 'string');
292
-        }
293
-        $this->form_name = $form_name;
294
-    }
295
-
296
-
297
-
298
-    /**
299
-     * a public name for the form that can be displayed, but only in the admin
300
-     *
301
-     * @return string
302
-     */
303
-    public function adminName()
304
-    {
305
-        return $this->admin_name;
306
-    }
307
-
308
-
309
-
310
-    /**
311
-     * @param string $admin_name
312
-     * @throws InvalidDataTypeException
313
-     */
314
-    public function setAdminName($admin_name)
315
-    {
316
-        if (! is_string($admin_name)) {
317
-            throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
318
-        }
319
-        $this->admin_name = $admin_name;
320
-    }
321
-
322
-
323
-
324
-    /**
325
-     * a URL friendly string that can be used for identifying the form
326
-     *
327
-     * @return string
328
-     */
329
-    public function slug()
330
-    {
331
-        return $this->slug;
332
-    }
333
-
334
-
335
-
336
-    /**
337
-     * @param string $slug
338
-     * @throws InvalidDataTypeException
339
-     */
340
-    public function setSlug($slug)
341
-    {
342
-        if (! is_string($slug)) {
343
-            throw new InvalidDataTypeException('$slug', $slug, 'string');
344
-        }
345
-        $this->slug = $slug;
346
-    }
347
-
348
-
349
-
350
-    /**
351
-     * @return string
352
-     */
353
-    public function submitBtnText()
354
-    {
355
-        return $this->submit_btn_text;
356
-    }
357
-
358
-
359
-
360
-    /**
361
-     * @param string $submit_btn_text
362
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
363
-     * @throws \InvalidArgumentException
364
-     */
365
-    public function setSubmitBtnText($submit_btn_text)
366
-    {
367
-        if (! is_string($submit_btn_text)) {
368
-            throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
369
-        }
370
-        if (empty($submit_btn_text)) {
371
-            throw new InvalidArgumentException(
372
-                esc_html__('Can not set Submit button text because an empty string was provided.', 'event_espresso')
373
-            );
374
-        }
375
-        $this->submit_btn_text = $submit_btn_text;
376
-    }
377
-
378
-
379
-
380
-    /**
381
-     * @return string
382
-     */
383
-    public function formAction()
384
-    {
385
-        return ! empty($this->form_args)
386
-            ? add_query_arg($this->form_args, $this->form_action)
387
-            : $this->form_action;
388
-    }
389
-
390
-
391
-
392
-    /**
393
-     * @param string $form_action
394
-     * @throws InvalidDataTypeException
395
-     */
396
-    public function setFormAction($form_action)
397
-    {
398
-        if (! is_string($form_action)) {
399
-            throw new InvalidDataTypeException('$form_action', $form_action, 'string');
400
-        }
401
-        $this->form_action = $form_action;
402
-    }
403
-
404
-
405
-
406
-    /**
407
-     * @param array $form_args
408
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
409
-     * @throws \InvalidArgumentException
410
-     */
411
-    public function addFormActionArgs($form_args = array())
412
-    {
413
-        if (is_object($form_args)) {
414
-            throw new InvalidDataTypeException(
415
-                '$form_args',
416
-                $form_args,
417
-                'anything other than an object was expected.'
418
-            );
419
-        }
420
-        if (empty($form_args)) {
421
-            throw new InvalidArgumentException(
422
-                esc_html__('The redirect arguments can not be an empty array.', 'event_espresso')
423
-            );
424
-        }
425
-        $this->form_args = array_merge($this->form_args, $form_args);
426
-    }
427
-
428
-
429
-
430
-    /**
431
-     * @return string
432
-     */
433
-    public function formConfig()
434
-    {
435
-        return $this->form_config;
436
-    }
437
-
438
-
439
-
440
-    /**
441
-     * @param string $form_config
442
-     * @throws DomainException
443
-     */
444
-    public function setFormConfig($form_config)
445
-    {
446
-        if (
447
-        ! in_array(
448
-            $form_config,
449
-            array(
450
-                FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
451
-                FormHandler::ADD_FORM_TAGS_ONLY,
452
-                FormHandler::ADD_FORM_SUBMIT_ONLY,
453
-                FormHandler::DO_NOT_SETUP_FORM,
454
-            ),
455
-            true
456
-        )
457
-        ) {
458
-            throw new DomainException(
459
-                sprintf(
460
-                    esc_html__('"%1$s" is not a valid value for the form config. Please use one of the class constants on \EventEspresso\core\libraries\form_sections\form_handlers\Form',
461
-                        'event_espresso'),
462
-                    $form_config
463
-                )
464
-            );
465
-        }
466
-        $this->form_config = $form_config;
467
-    }
468
-
469
-
470
-
471
-    /**
472
-     * called after the form is instantiated
473
-     * and used for performing any logic that needs to occur early
474
-     * before any of the other methods are called.
475
-     * returns true if everything is ok to proceed,
476
-     * and false if no further form logic should be implemented
477
-     *
478
-     * @return boolean
479
-     */
480
-    public function initialize()
481
-    {
482
-        $this->form_has_errors = \EE_Error::has_error(true);
483
-        return true;
484
-    }
485
-
486
-
487
-
488
-    /**
489
-     * used for setting up css and js
490
-     *
491
-     * @return void
492
-     * @throws LogicException
493
-     * @throws \EE_Error
494
-     */
495
-    public function enqueueStylesAndScripts()
496
-    {
497
-        $this->form(false)->enqueue_js();
498
-    }
499
-
500
-
501
-
502
-    /**
503
-     * creates and returns the actual form
504
-     *
505
-     * @return EE_Form_Section_Proper
506
-     */
507
-    abstract public function generate();
508
-
509
-
510
-
511
-    /**
512
-     * creates and returns an EE_Submit_Input labeled "Submit"
513
-     *
514
-     * @param string $text
515
-     * @return \EE_Submit_Input
516
-     */
517
-    public function generateSubmitButton($text = '')
518
-    {
519
-        $text = ! empty($text) ? $text : $this->submitBtnText();
520
-        return new EE_Submit_Input(
521
-            array(
522
-                'html_name'             => 'ee-form-submit-' . $this->slug(),
523
-                'html_id'               => 'ee-form-submit-' . $this->slug(),
524
-                'html_class'            => 'ee-form-submit',
525
-                'html_label'            => '&nbsp;',
526
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
527
-                'default'               => $text,
528
-            )
529
-        );
530
-    }
531
-
532
-
533
-
534
-    /**
535
-     * calls generateSubmitButton() and appends it onto the form along with a float clearing div
536
-     *
537
-     * @param string $text
538
-     * @return void
539
-     * @throws \LogicException
540
-     * @throws \EE_Error
541
-     */
542
-    public function appendSubmitButton($text = '')
543
-    {
544
-        if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
545
-            return;
546
-        }
547
-        $this->form->add_subsections(
548
-            array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
549
-            null,
550
-            false
551
-        );
552
-    }
553
-
554
-
555
-
556
-    /**
557
-     * creates and returns an EE_Submit_Input labeled "Cancel"
558
-     *
559
-     * @param string $text
560
-     * @return \EE_Submit_Input
561
-     */
562
-    public function generateCancelButton($text = '')
563
-    {
564
-        $cancel_button = new EE_Submit_Input(
565
-            array(
566
-                'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
567
-                'html_id'               => 'ee-cancel-form-' . $this->slug(),
568
-                'html_class'            => 'ee-cancel-form',
569
-                'html_label'            => '&nbsp;',
570
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
571
-                'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
572
-            )
573
-        );
574
-        $cancel_button->set_button_css_attributes(false);
575
-        return $cancel_button;
576
-    }
577
-
578
-
579
-
580
-    /**
581
-     * appends a float clearing div onto end of form
582
-     *
583
-     * @return void
584
-     * @throws \EE_Error
585
-     */
586
-    public function clearFormButtonFloats()
587
-    {
588
-        $this->form->add_subsections(
589
-            array(
590
-                'clear-submit-btn-float' => new \EE_Form_Section_HTML(
591
-                    EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
592
-                ),
593
-            ),
594
-            null,
595
-            false
596
-        );
597
-    }
598
-
599
-
600
-
601
-    /**
602
-     * takes the generated form and displays it along with ony other non-form HTML that may be required
603
-     * returns a string of HTML that can be directly echoed in a template
604
-     *
605
-     * @return string
606
-     * @throws LogicException
607
-     * @throws \EE_Error
608
-     */
609
-    public function display()
610
-    {
611
-        $form_html = apply_filters(
612
-            'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form',
613
-            ''
614
-        );
615
-        $form_config = $this->formConfig();
616
-        if (
617
-            $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
618
-            || $form_config === FormHandler::ADD_FORM_TAGS_ONLY
619
-        ) {
620
-            $form_html .= $this->form()->form_open($this->formAction());
621
-        }
622
-        $form_html .= $this->form(true)->get_html($this->form_has_errors);
623
-        if (
624
-            $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
625
-            || $form_config === FormHandler::ADD_FORM_TAGS_ONLY
626
-        ) {
627
-            $form_html .= $this->form()->form_close();
628
-        }
629
-        $form_html .= apply_filters(
630
-            'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__after_form',
631
-            ''
632
-        );
633
-        return $form_html;
634
-    }
635
-
636
-
637
-
638
-    /**
639
-     * handles processing the form submission
640
-     * returns true or false depending on whether the form was processed successfully or not
641
-     *
642
-     * @param array $submitted_form_data
643
-     * @return array
644
-     * @throws \EE_Error
645
-     * @throws \LogicException
646
-     * @throws InvalidFormSubmissionException
647
-     */
648
-    public function process($submitted_form_data = array())
649
-    {
650
-        if (! $this->form()->was_submitted($submitted_form_data)) {
651
-            throw new InvalidFormSubmissionException($this->form_name);
652
-        }
653
-        $this->form(true)->receive_form_submission($submitted_form_data);
654
-        if (! $this->form()->is_valid()) {
655
-            throw new InvalidFormSubmissionException(
656
-                $this->form_name,
657
-                sprintf(
658
-                    esc_html__(
659
-                        'The "%1$s" form is invalid. Please correct the following errors and resubmit: %2$s %3$s',
660
-                        'event_espresso'
661
-                    ),
662
-                    $this->form_name,
663
-                    '<br />',
664
-                    $this->form()->submission_error_message()
665
-                )
666
-            );
667
-        }
668
-        return $this->form()->valid_data();
669
-    }
34
+	/**
35
+	 * will add opening and closing HTML form tags as well as a submit button
36
+	 */
37
+	const ADD_FORM_TAGS_AND_SUBMIT = 'add_form_tags_and_submit';
38
+
39
+	/**
40
+	 * will add opening and closing HTML form tags but NOT a submit button
41
+	 */
42
+	const ADD_FORM_TAGS_ONLY = 'add_form_tags_only';
43
+
44
+	/**
45
+	 * will NOT add opening and closing HTML form tags but will add a submit button
46
+	 */
47
+	const ADD_FORM_SUBMIT_ONLY = 'add_form_submit_only';
48
+
49
+	/**
50
+	 * will NOT add opening and closing HTML form tags NOR a submit button
51
+	 */
52
+	const DO_NOT_SETUP_FORM = 'do_not_setup_form';
53
+
54
+	/**
55
+	 * if set to false, then this form has no displayable content,
56
+	 * and will only be used for processing data sent passed via GET or POST
57
+	 * defaults to true ( ie: form has displayable content )
58
+	 *
59
+	 * @var boolean $displayable
60
+	 */
61
+	private $displayable = true;
62
+
63
+	/**
64
+	 * @var string $form_name
65
+	 */
66
+	private $form_name;
67
+
68
+	/**
69
+	 * @var string $admin_name
70
+	 */
71
+	private $admin_name;
72
+
73
+	/**
74
+	 * @var string $slug
75
+	 */
76
+	private $slug;
77
+
78
+	/**
79
+	 * @var string $submit_btn_text
80
+	 */
81
+	private $submit_btn_text;
82
+
83
+	/**
84
+	 * @var string $form_action
85
+	 */
86
+	private $form_action;
87
+
88
+	/**
89
+	 * form params in key value pairs
90
+	 * can be added to form action URL or as hidden inputs
91
+	 *
92
+	 * @var array $form_args
93
+	 */
94
+	private $form_args = array();
95
+
96
+	/**
97
+	 * value of one of the string constant above
98
+	 *
99
+	 * @var string $form_config
100
+	 */
101
+	private $form_config;
102
+
103
+	/**
104
+	 * whether or not the form was determined to be invalid
105
+	 *
106
+	 * @var boolean $form_has_errors
107
+	 */
108
+	private $form_has_errors;
109
+
110
+	/**
111
+	 * the absolute top level form section being used on the page
112
+	 *
113
+	 * @var \EE_Form_Section_Proper $form
114
+	 */
115
+	private $form;
116
+
117
+	/**
118
+	 * @var \EE_Registry $registry
119
+	 */
120
+	protected $registry;
121
+
122
+
123
+
124
+	/**
125
+	 * Form constructor.
126
+	 *
127
+	 * @param string       $form_name
128
+	 * @param string       $admin_name
129
+	 * @param string       $slug
130
+	 * @param string       $form_action
131
+	 * @param string       $form_config
132
+	 * @param \EE_Registry $registry
133
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
134
+	 * @throws \DomainException
135
+	 * @throws \InvalidArgumentException
136
+	 */
137
+	public function __construct(
138
+		$form_name,
139
+		$admin_name,
140
+		$slug,
141
+		$form_action = '',
142
+		$form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
143
+		\EE_Registry $registry
144
+	) {
145
+		$this->setFormName($form_name);
146
+		$this->setAdminName($admin_name);
147
+		$this->setSlug($slug);
148
+		$this->setFormAction($form_action);
149
+		$this->setFormConfig($form_config);
150
+		$this->setSubmitBtnText(esc_html__('Submit', 'event_espresso'));
151
+		$this->registry = $registry;
152
+	}
153
+
154
+
155
+
156
+	/**
157
+	 * @return array
158
+	 */
159
+	public static function getFormConfigConstants()
160
+	{
161
+		return array(
162
+			FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
163
+			FormHandler::ADD_FORM_TAGS_ONLY,
164
+			FormHandler::ADD_FORM_SUBMIT_ONLY,
165
+			FormHandler::DO_NOT_SETUP_FORM,
166
+		);
167
+	}
168
+
169
+
170
+
171
+	/**
172
+	 * @param bool $for_display
173
+	 * @return \EE_Form_Section_Proper
174
+	 * @throws \EE_Error
175
+	 * @throws \LogicException
176
+	 */
177
+	public function form($for_display = false)
178
+	{
179
+		if (! $this->formIsValid()) {
180
+			return null;
181
+		}
182
+		if ($for_display) {
183
+			$form_config = $this->formConfig();
184
+			if (
185
+				$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
186
+				|| $form_config === FormHandler::ADD_FORM_SUBMIT_ONLY
187
+			) {
188
+				$this->appendSubmitButton();
189
+				$this->clearFormButtonFloats();
190
+			}
191
+		}
192
+		return $this->form;
193
+	}
194
+
195
+
196
+
197
+	/**
198
+	 * @return boolean
199
+	 * @throws LogicException
200
+	 */
201
+	public function formIsValid()
202
+	{
203
+		if (! $this->form instanceof \EE_Form_Section_Proper) {
204
+			static $generated = false;
205
+			if (! $generated) {
206
+				$generated = true;
207
+				$form = apply_filters(
208
+					'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
209
+					$this->generate(),
210
+					$this
211
+				);
212
+				if ($form instanceof \EE_Form_Section_Proper) {
213
+					$this->setForm($form);
214
+				}
215
+			}
216
+			return $this->verifyForm();
217
+		}
218
+		return true;
219
+	}
220
+
221
+
222
+
223
+	/**
224
+	 * @return boolean
225
+	 * @throws LogicException
226
+	 */
227
+	public function verifyForm()
228
+	{
229
+		if ($this->form instanceof \EE_Form_Section_Proper) {
230
+			return true;
231
+		}
232
+		throw new LogicException(
233
+			sprintf(
234
+				esc_html__('The "%1$s" form is invalid or missing', 'event_espresso'),
235
+				$this->form_name
236
+			)
237
+		);
238
+	}
239
+
240
+
241
+
242
+	/**
243
+	 * @param \EE_Form_Section_Proper $form
244
+	 */
245
+	public function setForm(\EE_Form_Section_Proper $form)
246
+	{
247
+		$this->form = $form;
248
+	}
249
+
250
+
251
+
252
+	/**
253
+	 * @return boolean
254
+	 */
255
+	public function displayable()
256
+	{
257
+		return $this->displayable;
258
+	}
259
+
260
+
261
+
262
+	/**
263
+	 * @param boolean $displayable
264
+	 */
265
+	public function setDisplayable($displayable = false)
266
+	{
267
+		$this->displayable = filter_var($displayable, FILTER_VALIDATE_BOOLEAN);
268
+	}
269
+
270
+
271
+
272
+	/**
273
+	 * a public name for the form that can be displayed on the frontend of a site
274
+	 *
275
+	 * @return string
276
+	 */
277
+	public function formName()
278
+	{
279
+		return $this->form_name;
280
+	}
281
+
282
+
283
+
284
+	/**
285
+	 * @param string $form_name
286
+	 * @throws InvalidDataTypeException
287
+	 */
288
+	public function setFormName($form_name)
289
+	{
290
+		if (! is_string($form_name)) {
291
+			throw new InvalidDataTypeException('$form_name', $form_name, 'string');
292
+		}
293
+		$this->form_name = $form_name;
294
+	}
295
+
296
+
297
+
298
+	/**
299
+	 * a public name for the form that can be displayed, but only in the admin
300
+	 *
301
+	 * @return string
302
+	 */
303
+	public function adminName()
304
+	{
305
+		return $this->admin_name;
306
+	}
307
+
308
+
309
+
310
+	/**
311
+	 * @param string $admin_name
312
+	 * @throws InvalidDataTypeException
313
+	 */
314
+	public function setAdminName($admin_name)
315
+	{
316
+		if (! is_string($admin_name)) {
317
+			throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
318
+		}
319
+		$this->admin_name = $admin_name;
320
+	}
321
+
322
+
323
+
324
+	/**
325
+	 * a URL friendly string that can be used for identifying the form
326
+	 *
327
+	 * @return string
328
+	 */
329
+	public function slug()
330
+	{
331
+		return $this->slug;
332
+	}
333
+
334
+
335
+
336
+	/**
337
+	 * @param string $slug
338
+	 * @throws InvalidDataTypeException
339
+	 */
340
+	public function setSlug($slug)
341
+	{
342
+		if (! is_string($slug)) {
343
+			throw new InvalidDataTypeException('$slug', $slug, 'string');
344
+		}
345
+		$this->slug = $slug;
346
+	}
347
+
348
+
349
+
350
+	/**
351
+	 * @return string
352
+	 */
353
+	public function submitBtnText()
354
+	{
355
+		return $this->submit_btn_text;
356
+	}
357
+
358
+
359
+
360
+	/**
361
+	 * @param string $submit_btn_text
362
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
363
+	 * @throws \InvalidArgumentException
364
+	 */
365
+	public function setSubmitBtnText($submit_btn_text)
366
+	{
367
+		if (! is_string($submit_btn_text)) {
368
+			throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
369
+		}
370
+		if (empty($submit_btn_text)) {
371
+			throw new InvalidArgumentException(
372
+				esc_html__('Can not set Submit button text because an empty string was provided.', 'event_espresso')
373
+			);
374
+		}
375
+		$this->submit_btn_text = $submit_btn_text;
376
+	}
377
+
378
+
379
+
380
+	/**
381
+	 * @return string
382
+	 */
383
+	public function formAction()
384
+	{
385
+		return ! empty($this->form_args)
386
+			? add_query_arg($this->form_args, $this->form_action)
387
+			: $this->form_action;
388
+	}
389
+
390
+
391
+
392
+	/**
393
+	 * @param string $form_action
394
+	 * @throws InvalidDataTypeException
395
+	 */
396
+	public function setFormAction($form_action)
397
+	{
398
+		if (! is_string($form_action)) {
399
+			throw new InvalidDataTypeException('$form_action', $form_action, 'string');
400
+		}
401
+		$this->form_action = $form_action;
402
+	}
403
+
404
+
405
+
406
+	/**
407
+	 * @param array $form_args
408
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
409
+	 * @throws \InvalidArgumentException
410
+	 */
411
+	public function addFormActionArgs($form_args = array())
412
+	{
413
+		if (is_object($form_args)) {
414
+			throw new InvalidDataTypeException(
415
+				'$form_args',
416
+				$form_args,
417
+				'anything other than an object was expected.'
418
+			);
419
+		}
420
+		if (empty($form_args)) {
421
+			throw new InvalidArgumentException(
422
+				esc_html__('The redirect arguments can not be an empty array.', 'event_espresso')
423
+			);
424
+		}
425
+		$this->form_args = array_merge($this->form_args, $form_args);
426
+	}
427
+
428
+
429
+
430
+	/**
431
+	 * @return string
432
+	 */
433
+	public function formConfig()
434
+	{
435
+		return $this->form_config;
436
+	}
437
+
438
+
439
+
440
+	/**
441
+	 * @param string $form_config
442
+	 * @throws DomainException
443
+	 */
444
+	public function setFormConfig($form_config)
445
+	{
446
+		if (
447
+		! in_array(
448
+			$form_config,
449
+			array(
450
+				FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
451
+				FormHandler::ADD_FORM_TAGS_ONLY,
452
+				FormHandler::ADD_FORM_SUBMIT_ONLY,
453
+				FormHandler::DO_NOT_SETUP_FORM,
454
+			),
455
+			true
456
+		)
457
+		) {
458
+			throw new DomainException(
459
+				sprintf(
460
+					esc_html__('"%1$s" is not a valid value for the form config. Please use one of the class constants on \EventEspresso\core\libraries\form_sections\form_handlers\Form',
461
+						'event_espresso'),
462
+					$form_config
463
+				)
464
+			);
465
+		}
466
+		$this->form_config = $form_config;
467
+	}
468
+
469
+
470
+
471
+	/**
472
+	 * called after the form is instantiated
473
+	 * and used for performing any logic that needs to occur early
474
+	 * before any of the other methods are called.
475
+	 * returns true if everything is ok to proceed,
476
+	 * and false if no further form logic should be implemented
477
+	 *
478
+	 * @return boolean
479
+	 */
480
+	public function initialize()
481
+	{
482
+		$this->form_has_errors = \EE_Error::has_error(true);
483
+		return true;
484
+	}
485
+
486
+
487
+
488
+	/**
489
+	 * used for setting up css and js
490
+	 *
491
+	 * @return void
492
+	 * @throws LogicException
493
+	 * @throws \EE_Error
494
+	 */
495
+	public function enqueueStylesAndScripts()
496
+	{
497
+		$this->form(false)->enqueue_js();
498
+	}
499
+
500
+
501
+
502
+	/**
503
+	 * creates and returns the actual form
504
+	 *
505
+	 * @return EE_Form_Section_Proper
506
+	 */
507
+	abstract public function generate();
508
+
509
+
510
+
511
+	/**
512
+	 * creates and returns an EE_Submit_Input labeled "Submit"
513
+	 *
514
+	 * @param string $text
515
+	 * @return \EE_Submit_Input
516
+	 */
517
+	public function generateSubmitButton($text = '')
518
+	{
519
+		$text = ! empty($text) ? $text : $this->submitBtnText();
520
+		return new EE_Submit_Input(
521
+			array(
522
+				'html_name'             => 'ee-form-submit-' . $this->slug(),
523
+				'html_id'               => 'ee-form-submit-' . $this->slug(),
524
+				'html_class'            => 'ee-form-submit',
525
+				'html_label'            => '&nbsp;',
526
+				'other_html_attributes' => ' rel="' . $this->slug() . '"',
527
+				'default'               => $text,
528
+			)
529
+		);
530
+	}
531
+
532
+
533
+
534
+	/**
535
+	 * calls generateSubmitButton() and appends it onto the form along with a float clearing div
536
+	 *
537
+	 * @param string $text
538
+	 * @return void
539
+	 * @throws \LogicException
540
+	 * @throws \EE_Error
541
+	 */
542
+	public function appendSubmitButton($text = '')
543
+	{
544
+		if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
545
+			return;
546
+		}
547
+		$this->form->add_subsections(
548
+			array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
549
+			null,
550
+			false
551
+		);
552
+	}
553
+
554
+
555
+
556
+	/**
557
+	 * creates and returns an EE_Submit_Input labeled "Cancel"
558
+	 *
559
+	 * @param string $text
560
+	 * @return \EE_Submit_Input
561
+	 */
562
+	public function generateCancelButton($text = '')
563
+	{
564
+		$cancel_button = new EE_Submit_Input(
565
+			array(
566
+				'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
567
+				'html_id'               => 'ee-cancel-form-' . $this->slug(),
568
+				'html_class'            => 'ee-cancel-form',
569
+				'html_label'            => '&nbsp;',
570
+				'other_html_attributes' => ' rel="' . $this->slug() . '"',
571
+				'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
572
+			)
573
+		);
574
+		$cancel_button->set_button_css_attributes(false);
575
+		return $cancel_button;
576
+	}
577
+
578
+
579
+
580
+	/**
581
+	 * appends a float clearing div onto end of form
582
+	 *
583
+	 * @return void
584
+	 * @throws \EE_Error
585
+	 */
586
+	public function clearFormButtonFloats()
587
+	{
588
+		$this->form->add_subsections(
589
+			array(
590
+				'clear-submit-btn-float' => new \EE_Form_Section_HTML(
591
+					EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
592
+				),
593
+			),
594
+			null,
595
+			false
596
+		);
597
+	}
598
+
599
+
600
+
601
+	/**
602
+	 * takes the generated form and displays it along with ony other non-form HTML that may be required
603
+	 * returns a string of HTML that can be directly echoed in a template
604
+	 *
605
+	 * @return string
606
+	 * @throws LogicException
607
+	 * @throws \EE_Error
608
+	 */
609
+	public function display()
610
+	{
611
+		$form_html = apply_filters(
612
+			'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form',
613
+			''
614
+		);
615
+		$form_config = $this->formConfig();
616
+		if (
617
+			$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
618
+			|| $form_config === FormHandler::ADD_FORM_TAGS_ONLY
619
+		) {
620
+			$form_html .= $this->form()->form_open($this->formAction());
621
+		}
622
+		$form_html .= $this->form(true)->get_html($this->form_has_errors);
623
+		if (
624
+			$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
625
+			|| $form_config === FormHandler::ADD_FORM_TAGS_ONLY
626
+		) {
627
+			$form_html .= $this->form()->form_close();
628
+		}
629
+		$form_html .= apply_filters(
630
+			'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__after_form',
631
+			''
632
+		);
633
+		return $form_html;
634
+	}
635
+
636
+
637
+
638
+	/**
639
+	 * handles processing the form submission
640
+	 * returns true or false depending on whether the form was processed successfully or not
641
+	 *
642
+	 * @param array $submitted_form_data
643
+	 * @return array
644
+	 * @throws \EE_Error
645
+	 * @throws \LogicException
646
+	 * @throws InvalidFormSubmissionException
647
+	 */
648
+	public function process($submitted_form_data = array())
649
+	{
650
+		if (! $this->form()->was_submitted($submitted_form_data)) {
651
+			throw new InvalidFormSubmissionException($this->form_name);
652
+		}
653
+		$this->form(true)->receive_form_submission($submitted_form_data);
654
+		if (! $this->form()->is_valid()) {
655
+			throw new InvalidFormSubmissionException(
656
+				$this->form_name,
657
+				sprintf(
658
+					esc_html__(
659
+						'The "%1$s" form is invalid. Please correct the following errors and resubmit: %2$s %3$s',
660
+						'event_espresso'
661
+					),
662
+					$this->form_name,
663
+					'<br />',
664
+					$this->form()->submission_error_message()
665
+				)
666
+			);
667
+		}
668
+		return $this->form()->valid_data();
669
+	}
670 670
 
671 671
 
672 672
 
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 use EventEspresso\core\exceptions\InvalidDataTypeException;
12 12
 use EventEspresso\core\exceptions\InvalidFormSubmissionException;
13 13
 
14
-if (! defined('EVENT_ESPRESSO_VERSION')) {
14
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
15 15
     exit('No direct script access allowed');
16 16
 }
17 17
 
@@ -176,7 +176,7 @@  discard block
 block discarded – undo
176 176
      */
177 177
     public function form($for_display = false)
178 178
     {
179
-        if (! $this->formIsValid()) {
179
+        if ( ! $this->formIsValid()) {
180 180
             return null;
181 181
         }
182 182
         if ($for_display) {
@@ -200,9 +200,9 @@  discard block
 block discarded – undo
200 200
      */
201 201
     public function formIsValid()
202 202
     {
203
-        if (! $this->form instanceof \EE_Form_Section_Proper) {
203
+        if ( ! $this->form instanceof \EE_Form_Section_Proper) {
204 204
             static $generated = false;
205
-            if (! $generated) {
205
+            if ( ! $generated) {
206 206
                 $generated = true;
207 207
                 $form = apply_filters(
208 208
                     'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
@@ -287,7 +287,7 @@  discard block
 block discarded – undo
287 287
      */
288 288
     public function setFormName($form_name)
289 289
     {
290
-        if (! is_string($form_name)) {
290
+        if ( ! is_string($form_name)) {
291 291
             throw new InvalidDataTypeException('$form_name', $form_name, 'string');
292 292
         }
293 293
         $this->form_name = $form_name;
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
      */
314 314
     public function setAdminName($admin_name)
315 315
     {
316
-        if (! is_string($admin_name)) {
316
+        if ( ! is_string($admin_name)) {
317 317
             throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
318 318
         }
319 319
         $this->admin_name = $admin_name;
@@ -339,7 +339,7 @@  discard block
 block discarded – undo
339 339
      */
340 340
     public function setSlug($slug)
341 341
     {
342
-        if (! is_string($slug)) {
342
+        if ( ! is_string($slug)) {
343 343
             throw new InvalidDataTypeException('$slug', $slug, 'string');
344 344
         }
345 345
         $this->slug = $slug;
@@ -364,7 +364,7 @@  discard block
 block discarded – undo
364 364
      */
365 365
     public function setSubmitBtnText($submit_btn_text)
366 366
     {
367
-        if (! is_string($submit_btn_text)) {
367
+        if ( ! is_string($submit_btn_text)) {
368 368
             throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
369 369
         }
370 370
         if (empty($submit_btn_text)) {
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
      */
396 396
     public function setFormAction($form_action)
397 397
     {
398
-        if (! is_string($form_action)) {
398
+        if ( ! is_string($form_action)) {
399 399
             throw new InvalidDataTypeException('$form_action', $form_action, 'string');
400 400
         }
401 401
         $this->form_action = $form_action;
@@ -519,11 +519,11 @@  discard block
 block discarded – undo
519 519
         $text = ! empty($text) ? $text : $this->submitBtnText();
520 520
         return new EE_Submit_Input(
521 521
             array(
522
-                'html_name'             => 'ee-form-submit-' . $this->slug(),
523
-                'html_id'               => 'ee-form-submit-' . $this->slug(),
522
+                'html_name'             => 'ee-form-submit-'.$this->slug(),
523
+                'html_id'               => 'ee-form-submit-'.$this->slug(),
524 524
                 'html_class'            => 'ee-form-submit',
525 525
                 'html_label'            => '&nbsp;',
526
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
526
+                'other_html_attributes' => ' rel="'.$this->slug().'"',
527 527
                 'default'               => $text,
528 528
             )
529 529
         );
@@ -541,11 +541,11 @@  discard block
 block discarded – undo
541 541
      */
542 542
     public function appendSubmitButton($text = '')
543 543
     {
544
-        if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
544
+        if ($this->form->subsection_exists($this->slug().'-submit-btn')) {
545 545
             return;
546 546
         }
547 547
         $this->form->add_subsections(
548
-            array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
548
+            array($this->slug().'-submit-btn' => $this->generateSubmitButton($text)),
549 549
             null,
550 550
             false
551 551
         );
@@ -563,11 +563,11 @@  discard block
 block discarded – undo
563 563
     {
564 564
         $cancel_button = new EE_Submit_Input(
565 565
             array(
566
-                'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
567
-                'html_id'               => 'ee-cancel-form-' . $this->slug(),
566
+                'html_name'             => 'ee-form-submit-'.$this->slug(), // YES! Same name as submit !!!
567
+                'html_id'               => 'ee-cancel-form-'.$this->slug(),
568 568
                 'html_class'            => 'ee-cancel-form',
569 569
                 'html_label'            => '&nbsp;',
570
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
570
+                'other_html_attributes' => ' rel="'.$this->slug().'"',
571 571
                 'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
572 572
             )
573 573
         );
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
         $this->form->add_subsections(
589 589
             array(
590 590
                 'clear-submit-btn-float' => new \EE_Form_Section_HTML(
591
-                    EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
591
+                    EEH_HTML::div('', '', 'clear-float').EEH_HTML::divx()
592 592
                 ),
593 593
             ),
594 594
             null,
@@ -647,11 +647,11 @@  discard block
 block discarded – undo
647 647
      */
648 648
     public function process($submitted_form_data = array())
649 649
     {
650
-        if (! $this->form()->was_submitted($submitted_form_data)) {
650
+        if ( ! $this->form()->was_submitted($submitted_form_data)) {
651 651
             throw new InvalidFormSubmissionException($this->form_name);
652 652
         }
653 653
         $this->form(true)->receive_form_submission($submitted_form_data);
654
-        if (! $this->form()->is_valid()) {
654
+        if ( ! $this->form()->is_valid()) {
655 655
             throw new InvalidFormSubmissionException(
656 656
                 $this->form_name,
657 657
                 sprintf(
Please login to merge, or discard this patch.