Completed
Branch FET-3467-waitlists (9ee75b)
by
unknown
91:40 queued 79:00
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.
core/EE_System.core.php 2 patches
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.
Indentation   +1406 added lines, -1406 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,1411 +19,1411 @@  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
-    }
930
-
931
-
932
-
933
-    /**
934
-     * initialize
935
-     * this is the best place to begin initializing client code
936
-     *
937
-     * @access public
938
-     * @return void
939
-     */
940
-    public function initialize()
941
-    {
942
-        do_action('AHEE__EE_System__initialize');
943
-    }
944
-
945
-
946
-
947
-    /**
948
-     * initialize_last
949
-     * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
950
-     * initialize has done so
951
-     *
952
-     * @access public
953
-     * @return void
954
-     */
955
-    public function initialize_last()
956
-    {
957
-        do_action('AHEE__EE_System__initialize_last');
958
-    }
959
-
960
-
961
-
962
-    /**
963
-     * set_hooks_for_shortcodes_modules_and_addons
964
-     * this is the best place for other systems to set callbacks for hooking into other parts of EE
965
-     * this happens at the very beginning of the wp_loaded hookpoint
966
-     *
967
-     * @access public
968
-     * @return void
969
-     */
970
-    public function set_hooks_for_shortcodes_modules_and_addons()
971
-    {
972
-        //		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
973
-    }
974
-
975
-
976
-
977
-    /**
978
-     * do_not_cache
979
-     * sets no cache headers and defines no cache constants for WP plugins
980
-     *
981
-     * @access public
982
-     * @return void
983
-     */
984
-    public static function do_not_cache()
985
-    {
986
-        // set no cache constants
987
-        if ( ! defined('DONOTCACHEPAGE')) {
988
-            define('DONOTCACHEPAGE', true);
989
-        }
990
-        if ( ! defined('DONOTCACHCEOBJECT')) {
991
-            define('DONOTCACHCEOBJECT', true);
992
-        }
993
-        if ( ! defined('DONOTCACHEDB')) {
994
-            define('DONOTCACHEDB', true);
995
-        }
996
-        // add no cache headers
997
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
998
-        // plus a little extra for nginx and Google Chrome
999
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1000
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1001
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1002
-    }
1003
-
1004
-
1005
-
1006
-    /**
1007
-     *    extra_nocache_headers
1008
-     *
1009
-     * @access    public
1010
-     * @param $headers
1011
-     * @return    array
1012
-     */
1013
-    public static function extra_nocache_headers($headers)
1014
-    {
1015
-        // for NGINX
1016
-        $headers['X-Accel-Expires'] = 0;
1017
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1018
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1019
-        return $headers;
1020
-    }
1021
-
1022
-
1023
-
1024
-    /**
1025
-     *    nocache_headers
1026
-     *
1027
-     * @access    public
1028
-     * @return    void
1029
-     */
1030
-    public static function nocache_headers()
1031
-    {
1032
-        nocache_headers();
1033
-    }
1034
-
1035
-
1036
-
1037
-    /**
1038
-     *    espresso_toolbar_items
1039
-     *
1040
-     * @access public
1041
-     * @param  WP_Admin_Bar $admin_bar
1042
-     * @return void
1043
-     */
1044
-    public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1045
-    {
1046
-        // if in full M-Mode, or its an AJAX request, or user is NOT an admin
1047
-        if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1048
-            || defined('DOING_AJAX')
1049
-            || ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1050
-        ) {
1051
-            return;
1052
-        }
1053
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1054
-        $menu_class = 'espresso_menu_item_class';
1055
-        //we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1056
-        //because they're only defined in each of their respective constructors
1057
-        //and this might be a frontend request, in which case they aren't available
1058
-        $events_admin_url = admin_url("admin.php?page=espresso_events");
1059
-        $reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1060
-        $extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1061
-        //Top Level
1062
-        $admin_bar->add_menu(array(
1063
-            'id'    => 'espresso-toolbar',
1064
-            'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1065
-                       . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1066
-                       . '</span>',
1067
-            'href'  => $events_admin_url,
1068
-            'meta'  => array(
1069
-                'title' => __('Event Espresso', 'event_espresso'),
1070
-                'class' => $menu_class . 'first',
1071
-            ),
1072
-        ));
1073
-        //Events
1074
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1075
-            $admin_bar->add_menu(array(
1076
-                'id'     => 'espresso-toolbar-events',
1077
-                'parent' => 'espresso-toolbar',
1078
-                'title'  => __('Events', 'event_espresso'),
1079
-                'href'   => $events_admin_url,
1080
-                'meta'   => array(
1081
-                    'title'  => __('Events', 'event_espresso'),
1082
-                    'target' => '',
1083
-                    'class'  => $menu_class,
1084
-                ),
1085
-            ));
1086
-        }
1087
-        if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1088
-            //Events Add New
1089
-            $admin_bar->add_menu(array(
1090
-                'id'     => 'espresso-toolbar-events-new',
1091
-                'parent' => 'espresso-toolbar-events',
1092
-                'title'  => __('Add New', 'event_espresso'),
1093
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1094
-                'meta'   => array(
1095
-                    'title'  => __('Add New', 'event_espresso'),
1096
-                    'target' => '',
1097
-                    'class'  => $menu_class,
1098
-                ),
1099
-            ));
1100
-        }
1101
-        if (is_single() && (get_post_type() == 'espresso_events')) {
1102
-            //Current post
1103
-            global $post;
1104
-            if ($this->registry->CAP->current_user_can('ee_edit_event',
1105
-                'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1106
-            ) {
1107
-                //Events Edit Current Event
1108
-                $admin_bar->add_menu(array(
1109
-                    'id'     => 'espresso-toolbar-events-edit',
1110
-                    'parent' => 'espresso-toolbar-events',
1111
-                    'title'  => __('Edit Event', 'event_espresso'),
1112
-                    'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1113
-                        $events_admin_url),
1114
-                    'meta'   => array(
1115
-                        'title'  => __('Edit Event', 'event_espresso'),
1116
-                        'target' => '',
1117
-                        'class'  => $menu_class,
1118
-                    ),
1119
-                ));
1120
-            }
1121
-        }
1122
-        //Events View
1123
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1124
-            'ee_admin_bar_menu_espresso-toolbar-events-view')
1125
-        ) {
1126
-            $admin_bar->add_menu(array(
1127
-                'id'     => 'espresso-toolbar-events-view',
1128
-                'parent' => 'espresso-toolbar-events',
1129
-                'title'  => __('View', 'event_espresso'),
1130
-                'href'   => $events_admin_url,
1131
-                'meta'   => array(
1132
-                    'title'  => __('View', 'event_espresso'),
1133
-                    'target' => '',
1134
-                    'class'  => $menu_class,
1135
-                ),
1136
-            ));
1137
-        }
1138
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1139
-            //Events View All
1140
-            $admin_bar->add_menu(array(
1141
-                'id'     => 'espresso-toolbar-events-all',
1142
-                'parent' => 'espresso-toolbar-events-view',
1143
-                'title'  => __('All', 'event_espresso'),
1144
-                'href'   => $events_admin_url,
1145
-                'meta'   => array(
1146
-                    'title'  => __('All', 'event_espresso'),
1147
-                    'target' => '',
1148
-                    'class'  => $menu_class,
1149
-                ),
1150
-            ));
1151
-        }
1152
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1153
-            'ee_admin_bar_menu_espresso-toolbar-events-today')
1154
-        ) {
1155
-            //Events View Today
1156
-            $admin_bar->add_menu(array(
1157
-                'id'     => 'espresso-toolbar-events-today',
1158
-                'parent' => 'espresso-toolbar-events-view',
1159
-                'title'  => __('Today', 'event_espresso'),
1160
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1161
-                    $events_admin_url),
1162
-                'meta'   => array(
1163
-                    'title'  => __('Today', 'event_espresso'),
1164
-                    'target' => '',
1165
-                    'class'  => $menu_class,
1166
-                ),
1167
-            ));
1168
-        }
1169
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1170
-            'ee_admin_bar_menu_espresso-toolbar-events-month')
1171
-        ) {
1172
-            //Events View This Month
1173
-            $admin_bar->add_menu(array(
1174
-                'id'     => 'espresso-toolbar-events-month',
1175
-                'parent' => 'espresso-toolbar-events-view',
1176
-                'title'  => __('This Month', 'event_espresso'),
1177
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1178
-                    $events_admin_url),
1179
-                'meta'   => array(
1180
-                    'title'  => __('This Month', 'event_espresso'),
1181
-                    'target' => '',
1182
-                    'class'  => $menu_class,
1183
-                ),
1184
-            ));
1185
-        }
1186
-        //Registration Overview
1187
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1188
-            'ee_admin_bar_menu_espresso-toolbar-registrations')
1189
-        ) {
1190
-            $admin_bar->add_menu(array(
1191
-                'id'     => 'espresso-toolbar-registrations',
1192
-                'parent' => 'espresso-toolbar',
1193
-                'title'  => __('Registrations', 'event_espresso'),
1194
-                'href'   => $reg_admin_url,
1195
-                'meta'   => array(
1196
-                    'title'  => __('Registrations', 'event_espresso'),
1197
-                    'target' => '',
1198
-                    'class'  => $menu_class,
1199
-                ),
1200
-            ));
1201
-        }
1202
-        //Registration Overview Today
1203
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1204
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1205
-        ) {
1206
-            $admin_bar->add_menu(array(
1207
-                'id'     => 'espresso-toolbar-registrations-today',
1208
-                'parent' => 'espresso-toolbar-registrations',
1209
-                'title'  => __('Today', 'event_espresso'),
1210
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1211
-                    $reg_admin_url),
1212
-                'meta'   => array(
1213
-                    'title'  => __('Today', 'event_espresso'),
1214
-                    'target' => '',
1215
-                    'class'  => $menu_class,
1216
-                ),
1217
-            ));
1218
-        }
1219
-        //Registration Overview Today Completed
1220
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1221
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1222
-        ) {
1223
-            $admin_bar->add_menu(array(
1224
-                'id'     => 'espresso-toolbar-registrations-today-approved',
1225
-                'parent' => 'espresso-toolbar-registrations-today',
1226
-                'title'  => __('Approved', 'event_espresso'),
1227
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1228
-                    'action'      => 'default',
1229
-                    'status'      => 'today',
1230
-                    '_reg_status' => EEM_Registration::status_id_approved,
1231
-                ), $reg_admin_url),
1232
-                'meta'   => array(
1233
-                    'title'  => __('Approved', 'event_espresso'),
1234
-                    'target' => '',
1235
-                    'class'  => $menu_class,
1236
-                ),
1237
-            ));
1238
-        }
1239
-        //Registration Overview Today Pending\
1240
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1241
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1242
-        ) {
1243
-            $admin_bar->add_menu(array(
1244
-                'id'     => 'espresso-toolbar-registrations-today-pending',
1245
-                'parent' => 'espresso-toolbar-registrations-today',
1246
-                'title'  => __('Pending', 'event_espresso'),
1247
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1248
-                    'action'     => 'default',
1249
-                    'status'     => 'today',
1250
-                    'reg_status' => EEM_Registration::status_id_pending_payment,
1251
-                ), $reg_admin_url),
1252
-                'meta'   => array(
1253
-                    'title'  => __('Pending Payment', 'event_espresso'),
1254
-                    'target' => '',
1255
-                    'class'  => $menu_class,
1256
-                ),
1257
-            ));
1258
-        }
1259
-        //Registration Overview Today Incomplete
1260
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1261
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1262
-        ) {
1263
-            $admin_bar->add_menu(array(
1264
-                'id'     => 'espresso-toolbar-registrations-today-not-approved',
1265
-                'parent' => 'espresso-toolbar-registrations-today',
1266
-                'title'  => __('Not Approved', 'event_espresso'),
1267
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1268
-                    'action'      => 'default',
1269
-                    'status'      => 'today',
1270
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1271
-                ), $reg_admin_url),
1272
-                'meta'   => array(
1273
-                    'title'  => __('Not Approved', 'event_espresso'),
1274
-                    'target' => '',
1275
-                    'class'  => $menu_class,
1276
-                ),
1277
-            ));
1278
-        }
1279
-        //Registration Overview Today Incomplete
1280
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1281
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1282
-        ) {
1283
-            $admin_bar->add_menu(array(
1284
-                'id'     => 'espresso-toolbar-registrations-today-cancelled',
1285
-                'parent' => 'espresso-toolbar-registrations-today',
1286
-                'title'  => __('Cancelled', 'event_espresso'),
1287
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1288
-                    'action'      => 'default',
1289
-                    'status'      => 'today',
1290
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1291
-                ), $reg_admin_url),
1292
-                'meta'   => array(
1293
-                    'title'  => __('Cancelled', 'event_espresso'),
1294
-                    'target' => '',
1295
-                    'class'  => $menu_class,
1296
-                ),
1297
-            ));
1298
-        }
1299
-        //Registration Overview This Month
1300
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1301
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1302
-        ) {
1303
-            $admin_bar->add_menu(array(
1304
-                'id'     => 'espresso-toolbar-registrations-month',
1305
-                'parent' => 'espresso-toolbar-registrations',
1306
-                'title'  => __('This Month', 'event_espresso'),
1307
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1308
-                    $reg_admin_url),
1309
-                'meta'   => array(
1310
-                    'title'  => __('This Month', 'event_espresso'),
1311
-                    'target' => '',
1312
-                    'class'  => $menu_class,
1313
-                ),
1314
-            ));
1315
-        }
1316
-        //Registration Overview This Month Approved
1317
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1318
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1319
-        ) {
1320
-            $admin_bar->add_menu(array(
1321
-                'id'     => 'espresso-toolbar-registrations-month-approved',
1322
-                'parent' => 'espresso-toolbar-registrations-month',
1323
-                'title'  => __('Approved', 'event_espresso'),
1324
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1325
-                    'action'      => 'default',
1326
-                    'status'      => 'month',
1327
-                    '_reg_status' => EEM_Registration::status_id_approved,
1328
-                ), $reg_admin_url),
1329
-                'meta'   => array(
1330
-                    'title'  => __('Approved', 'event_espresso'),
1331
-                    'target' => '',
1332
-                    'class'  => $menu_class,
1333
-                ),
1334
-            ));
1335
-        }
1336
-        //Registration Overview This Month Pending
1337
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1338
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1339
-        ) {
1340
-            $admin_bar->add_menu(array(
1341
-                'id'     => 'espresso-toolbar-registrations-month-pending',
1342
-                'parent' => 'espresso-toolbar-registrations-month',
1343
-                'title'  => __('Pending', 'event_espresso'),
1344
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1345
-                    'action'      => 'default',
1346
-                    'status'      => 'month',
1347
-                    '_reg_status' => EEM_Registration::status_id_pending_payment,
1348
-                ), $reg_admin_url),
1349
-                'meta'   => array(
1350
-                    'title'  => __('Pending', 'event_espresso'),
1351
-                    'target' => '',
1352
-                    'class'  => $menu_class,
1353
-                ),
1354
-            ));
1355
-        }
1356
-        //Registration Overview This Month Not Approved
1357
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1358
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1359
-        ) {
1360
-            $admin_bar->add_menu(array(
1361
-                'id'     => 'espresso-toolbar-registrations-month-not-approved',
1362
-                'parent' => 'espresso-toolbar-registrations-month',
1363
-                'title'  => __('Not Approved', 'event_espresso'),
1364
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1365
-                    'action'      => 'default',
1366
-                    'status'      => 'month',
1367
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1368
-                ), $reg_admin_url),
1369
-                'meta'   => array(
1370
-                    'title'  => __('Not Approved', 'event_espresso'),
1371
-                    'target' => '',
1372
-                    'class'  => $menu_class,
1373
-                ),
1374
-            ));
1375
-        }
1376
-        //Registration Overview This Month Cancelled
1377
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1378
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1379
-        ) {
1380
-            $admin_bar->add_menu(array(
1381
-                'id'     => 'espresso-toolbar-registrations-month-cancelled',
1382
-                'parent' => 'espresso-toolbar-registrations-month',
1383
-                'title'  => __('Cancelled', 'event_espresso'),
1384
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1385
-                    'action'      => 'default',
1386
-                    'status'      => 'month',
1387
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1388
-                ), $reg_admin_url),
1389
-                'meta'   => array(
1390
-                    'title'  => __('Cancelled', 'event_espresso'),
1391
-                    'target' => '',
1392
-                    'class'  => $menu_class,
1393
-                ),
1394
-            ));
1395
-        }
1396
-        //Extensions & Services
1397
-        if ($this->registry->CAP->current_user_can('ee_read_ee',
1398
-            'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1399
-        ) {
1400
-            $admin_bar->add_menu(array(
1401
-                'id'     => 'espresso-toolbar-extensions-and-services',
1402
-                'parent' => 'espresso-toolbar',
1403
-                'title'  => __('Extensions & Services', 'event_espresso'),
1404
-                'href'   => $extensions_admin_url,
1405
-                'meta'   => array(
1406
-                    'title'  => __('Extensions & Services', 'event_espresso'),
1407
-                    'target' => '',
1408
-                    'class'  => $menu_class,
1409
-                ),
1410
-            ));
1411
-        }
1412
-    }
1413
-
1414
-
1415
-
1416
-    /**
1417
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1418
-     * never returned with the function.
1419
-     *
1420
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1421
-     * @return array
1422
-     */
1423
-    public function remove_pages_from_wp_list_pages($exclude_array)
1424
-    {
1425
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1426
-    }
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
+	}
930
+
931
+
932
+
933
+	/**
934
+	 * initialize
935
+	 * this is the best place to begin initializing client code
936
+	 *
937
+	 * @access public
938
+	 * @return void
939
+	 */
940
+	public function initialize()
941
+	{
942
+		do_action('AHEE__EE_System__initialize');
943
+	}
944
+
945
+
946
+
947
+	/**
948
+	 * initialize_last
949
+	 * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
950
+	 * initialize has done so
951
+	 *
952
+	 * @access public
953
+	 * @return void
954
+	 */
955
+	public function initialize_last()
956
+	{
957
+		do_action('AHEE__EE_System__initialize_last');
958
+	}
959
+
960
+
961
+
962
+	/**
963
+	 * set_hooks_for_shortcodes_modules_and_addons
964
+	 * this is the best place for other systems to set callbacks for hooking into other parts of EE
965
+	 * this happens at the very beginning of the wp_loaded hookpoint
966
+	 *
967
+	 * @access public
968
+	 * @return void
969
+	 */
970
+	public function set_hooks_for_shortcodes_modules_and_addons()
971
+	{
972
+		//		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
973
+	}
974
+
975
+
976
+
977
+	/**
978
+	 * do_not_cache
979
+	 * sets no cache headers and defines no cache constants for WP plugins
980
+	 *
981
+	 * @access public
982
+	 * @return void
983
+	 */
984
+	public static function do_not_cache()
985
+	{
986
+		// set no cache constants
987
+		if ( ! defined('DONOTCACHEPAGE')) {
988
+			define('DONOTCACHEPAGE', true);
989
+		}
990
+		if ( ! defined('DONOTCACHCEOBJECT')) {
991
+			define('DONOTCACHCEOBJECT', true);
992
+		}
993
+		if ( ! defined('DONOTCACHEDB')) {
994
+			define('DONOTCACHEDB', true);
995
+		}
996
+		// add no cache headers
997
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
998
+		// plus a little extra for nginx and Google Chrome
999
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1000
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1001
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1002
+	}
1003
+
1004
+
1005
+
1006
+	/**
1007
+	 *    extra_nocache_headers
1008
+	 *
1009
+	 * @access    public
1010
+	 * @param $headers
1011
+	 * @return    array
1012
+	 */
1013
+	public static function extra_nocache_headers($headers)
1014
+	{
1015
+		// for NGINX
1016
+		$headers['X-Accel-Expires'] = 0;
1017
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1018
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1019
+		return $headers;
1020
+	}
1021
+
1022
+
1023
+
1024
+	/**
1025
+	 *    nocache_headers
1026
+	 *
1027
+	 * @access    public
1028
+	 * @return    void
1029
+	 */
1030
+	public static function nocache_headers()
1031
+	{
1032
+		nocache_headers();
1033
+	}
1034
+
1035
+
1036
+
1037
+	/**
1038
+	 *    espresso_toolbar_items
1039
+	 *
1040
+	 * @access public
1041
+	 * @param  WP_Admin_Bar $admin_bar
1042
+	 * @return void
1043
+	 */
1044
+	public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1045
+	{
1046
+		// if in full M-Mode, or its an AJAX request, or user is NOT an admin
1047
+		if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1048
+			|| defined('DOING_AJAX')
1049
+			|| ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1050
+		) {
1051
+			return;
1052
+		}
1053
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1054
+		$menu_class = 'espresso_menu_item_class';
1055
+		//we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1056
+		//because they're only defined in each of their respective constructors
1057
+		//and this might be a frontend request, in which case they aren't available
1058
+		$events_admin_url = admin_url("admin.php?page=espresso_events");
1059
+		$reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1060
+		$extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1061
+		//Top Level
1062
+		$admin_bar->add_menu(array(
1063
+			'id'    => 'espresso-toolbar',
1064
+			'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1065
+					   . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1066
+					   . '</span>',
1067
+			'href'  => $events_admin_url,
1068
+			'meta'  => array(
1069
+				'title' => __('Event Espresso', 'event_espresso'),
1070
+				'class' => $menu_class . 'first',
1071
+			),
1072
+		));
1073
+		//Events
1074
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1075
+			$admin_bar->add_menu(array(
1076
+				'id'     => 'espresso-toolbar-events',
1077
+				'parent' => 'espresso-toolbar',
1078
+				'title'  => __('Events', 'event_espresso'),
1079
+				'href'   => $events_admin_url,
1080
+				'meta'   => array(
1081
+					'title'  => __('Events', 'event_espresso'),
1082
+					'target' => '',
1083
+					'class'  => $menu_class,
1084
+				),
1085
+			));
1086
+		}
1087
+		if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1088
+			//Events Add New
1089
+			$admin_bar->add_menu(array(
1090
+				'id'     => 'espresso-toolbar-events-new',
1091
+				'parent' => 'espresso-toolbar-events',
1092
+				'title'  => __('Add New', 'event_espresso'),
1093
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1094
+				'meta'   => array(
1095
+					'title'  => __('Add New', 'event_espresso'),
1096
+					'target' => '',
1097
+					'class'  => $menu_class,
1098
+				),
1099
+			));
1100
+		}
1101
+		if (is_single() && (get_post_type() == 'espresso_events')) {
1102
+			//Current post
1103
+			global $post;
1104
+			if ($this->registry->CAP->current_user_can('ee_edit_event',
1105
+				'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1106
+			) {
1107
+				//Events Edit Current Event
1108
+				$admin_bar->add_menu(array(
1109
+					'id'     => 'espresso-toolbar-events-edit',
1110
+					'parent' => 'espresso-toolbar-events',
1111
+					'title'  => __('Edit Event', 'event_espresso'),
1112
+					'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1113
+						$events_admin_url),
1114
+					'meta'   => array(
1115
+						'title'  => __('Edit Event', 'event_espresso'),
1116
+						'target' => '',
1117
+						'class'  => $menu_class,
1118
+					),
1119
+				));
1120
+			}
1121
+		}
1122
+		//Events View
1123
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1124
+			'ee_admin_bar_menu_espresso-toolbar-events-view')
1125
+		) {
1126
+			$admin_bar->add_menu(array(
1127
+				'id'     => 'espresso-toolbar-events-view',
1128
+				'parent' => 'espresso-toolbar-events',
1129
+				'title'  => __('View', 'event_espresso'),
1130
+				'href'   => $events_admin_url,
1131
+				'meta'   => array(
1132
+					'title'  => __('View', 'event_espresso'),
1133
+					'target' => '',
1134
+					'class'  => $menu_class,
1135
+				),
1136
+			));
1137
+		}
1138
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1139
+			//Events View All
1140
+			$admin_bar->add_menu(array(
1141
+				'id'     => 'espresso-toolbar-events-all',
1142
+				'parent' => 'espresso-toolbar-events-view',
1143
+				'title'  => __('All', 'event_espresso'),
1144
+				'href'   => $events_admin_url,
1145
+				'meta'   => array(
1146
+					'title'  => __('All', 'event_espresso'),
1147
+					'target' => '',
1148
+					'class'  => $menu_class,
1149
+				),
1150
+			));
1151
+		}
1152
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1153
+			'ee_admin_bar_menu_espresso-toolbar-events-today')
1154
+		) {
1155
+			//Events View Today
1156
+			$admin_bar->add_menu(array(
1157
+				'id'     => 'espresso-toolbar-events-today',
1158
+				'parent' => 'espresso-toolbar-events-view',
1159
+				'title'  => __('Today', 'event_espresso'),
1160
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1161
+					$events_admin_url),
1162
+				'meta'   => array(
1163
+					'title'  => __('Today', 'event_espresso'),
1164
+					'target' => '',
1165
+					'class'  => $menu_class,
1166
+				),
1167
+			));
1168
+		}
1169
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1170
+			'ee_admin_bar_menu_espresso-toolbar-events-month')
1171
+		) {
1172
+			//Events View This Month
1173
+			$admin_bar->add_menu(array(
1174
+				'id'     => 'espresso-toolbar-events-month',
1175
+				'parent' => 'espresso-toolbar-events-view',
1176
+				'title'  => __('This Month', 'event_espresso'),
1177
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1178
+					$events_admin_url),
1179
+				'meta'   => array(
1180
+					'title'  => __('This Month', 'event_espresso'),
1181
+					'target' => '',
1182
+					'class'  => $menu_class,
1183
+				),
1184
+			));
1185
+		}
1186
+		//Registration Overview
1187
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1188
+			'ee_admin_bar_menu_espresso-toolbar-registrations')
1189
+		) {
1190
+			$admin_bar->add_menu(array(
1191
+				'id'     => 'espresso-toolbar-registrations',
1192
+				'parent' => 'espresso-toolbar',
1193
+				'title'  => __('Registrations', 'event_espresso'),
1194
+				'href'   => $reg_admin_url,
1195
+				'meta'   => array(
1196
+					'title'  => __('Registrations', 'event_espresso'),
1197
+					'target' => '',
1198
+					'class'  => $menu_class,
1199
+				),
1200
+			));
1201
+		}
1202
+		//Registration Overview Today
1203
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1204
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1205
+		) {
1206
+			$admin_bar->add_menu(array(
1207
+				'id'     => 'espresso-toolbar-registrations-today',
1208
+				'parent' => 'espresso-toolbar-registrations',
1209
+				'title'  => __('Today', 'event_espresso'),
1210
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1211
+					$reg_admin_url),
1212
+				'meta'   => array(
1213
+					'title'  => __('Today', 'event_espresso'),
1214
+					'target' => '',
1215
+					'class'  => $menu_class,
1216
+				),
1217
+			));
1218
+		}
1219
+		//Registration Overview Today Completed
1220
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1221
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1222
+		) {
1223
+			$admin_bar->add_menu(array(
1224
+				'id'     => 'espresso-toolbar-registrations-today-approved',
1225
+				'parent' => 'espresso-toolbar-registrations-today',
1226
+				'title'  => __('Approved', 'event_espresso'),
1227
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1228
+					'action'      => 'default',
1229
+					'status'      => 'today',
1230
+					'_reg_status' => EEM_Registration::status_id_approved,
1231
+				), $reg_admin_url),
1232
+				'meta'   => array(
1233
+					'title'  => __('Approved', 'event_espresso'),
1234
+					'target' => '',
1235
+					'class'  => $menu_class,
1236
+				),
1237
+			));
1238
+		}
1239
+		//Registration Overview Today Pending\
1240
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1241
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1242
+		) {
1243
+			$admin_bar->add_menu(array(
1244
+				'id'     => 'espresso-toolbar-registrations-today-pending',
1245
+				'parent' => 'espresso-toolbar-registrations-today',
1246
+				'title'  => __('Pending', 'event_espresso'),
1247
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1248
+					'action'     => 'default',
1249
+					'status'     => 'today',
1250
+					'reg_status' => EEM_Registration::status_id_pending_payment,
1251
+				), $reg_admin_url),
1252
+				'meta'   => array(
1253
+					'title'  => __('Pending Payment', 'event_espresso'),
1254
+					'target' => '',
1255
+					'class'  => $menu_class,
1256
+				),
1257
+			));
1258
+		}
1259
+		//Registration Overview Today Incomplete
1260
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1261
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1262
+		) {
1263
+			$admin_bar->add_menu(array(
1264
+				'id'     => 'espresso-toolbar-registrations-today-not-approved',
1265
+				'parent' => 'espresso-toolbar-registrations-today',
1266
+				'title'  => __('Not Approved', 'event_espresso'),
1267
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1268
+					'action'      => 'default',
1269
+					'status'      => 'today',
1270
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1271
+				), $reg_admin_url),
1272
+				'meta'   => array(
1273
+					'title'  => __('Not Approved', 'event_espresso'),
1274
+					'target' => '',
1275
+					'class'  => $menu_class,
1276
+				),
1277
+			));
1278
+		}
1279
+		//Registration Overview Today Incomplete
1280
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1281
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1282
+		) {
1283
+			$admin_bar->add_menu(array(
1284
+				'id'     => 'espresso-toolbar-registrations-today-cancelled',
1285
+				'parent' => 'espresso-toolbar-registrations-today',
1286
+				'title'  => __('Cancelled', 'event_espresso'),
1287
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1288
+					'action'      => 'default',
1289
+					'status'      => 'today',
1290
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1291
+				), $reg_admin_url),
1292
+				'meta'   => array(
1293
+					'title'  => __('Cancelled', 'event_espresso'),
1294
+					'target' => '',
1295
+					'class'  => $menu_class,
1296
+				),
1297
+			));
1298
+		}
1299
+		//Registration Overview This Month
1300
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1301
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1302
+		) {
1303
+			$admin_bar->add_menu(array(
1304
+				'id'     => 'espresso-toolbar-registrations-month',
1305
+				'parent' => 'espresso-toolbar-registrations',
1306
+				'title'  => __('This Month', 'event_espresso'),
1307
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1308
+					$reg_admin_url),
1309
+				'meta'   => array(
1310
+					'title'  => __('This Month', 'event_espresso'),
1311
+					'target' => '',
1312
+					'class'  => $menu_class,
1313
+				),
1314
+			));
1315
+		}
1316
+		//Registration Overview This Month Approved
1317
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1318
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1319
+		) {
1320
+			$admin_bar->add_menu(array(
1321
+				'id'     => 'espresso-toolbar-registrations-month-approved',
1322
+				'parent' => 'espresso-toolbar-registrations-month',
1323
+				'title'  => __('Approved', 'event_espresso'),
1324
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1325
+					'action'      => 'default',
1326
+					'status'      => 'month',
1327
+					'_reg_status' => EEM_Registration::status_id_approved,
1328
+				), $reg_admin_url),
1329
+				'meta'   => array(
1330
+					'title'  => __('Approved', 'event_espresso'),
1331
+					'target' => '',
1332
+					'class'  => $menu_class,
1333
+				),
1334
+			));
1335
+		}
1336
+		//Registration Overview This Month Pending
1337
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1338
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1339
+		) {
1340
+			$admin_bar->add_menu(array(
1341
+				'id'     => 'espresso-toolbar-registrations-month-pending',
1342
+				'parent' => 'espresso-toolbar-registrations-month',
1343
+				'title'  => __('Pending', 'event_espresso'),
1344
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1345
+					'action'      => 'default',
1346
+					'status'      => 'month',
1347
+					'_reg_status' => EEM_Registration::status_id_pending_payment,
1348
+				), $reg_admin_url),
1349
+				'meta'   => array(
1350
+					'title'  => __('Pending', 'event_espresso'),
1351
+					'target' => '',
1352
+					'class'  => $menu_class,
1353
+				),
1354
+			));
1355
+		}
1356
+		//Registration Overview This Month Not Approved
1357
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1358
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1359
+		) {
1360
+			$admin_bar->add_menu(array(
1361
+				'id'     => 'espresso-toolbar-registrations-month-not-approved',
1362
+				'parent' => 'espresso-toolbar-registrations-month',
1363
+				'title'  => __('Not Approved', 'event_espresso'),
1364
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1365
+					'action'      => 'default',
1366
+					'status'      => 'month',
1367
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1368
+				), $reg_admin_url),
1369
+				'meta'   => array(
1370
+					'title'  => __('Not Approved', 'event_espresso'),
1371
+					'target' => '',
1372
+					'class'  => $menu_class,
1373
+				),
1374
+			));
1375
+		}
1376
+		//Registration Overview This Month Cancelled
1377
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1378
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1379
+		) {
1380
+			$admin_bar->add_menu(array(
1381
+				'id'     => 'espresso-toolbar-registrations-month-cancelled',
1382
+				'parent' => 'espresso-toolbar-registrations-month',
1383
+				'title'  => __('Cancelled', 'event_espresso'),
1384
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1385
+					'action'      => 'default',
1386
+					'status'      => 'month',
1387
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1388
+				), $reg_admin_url),
1389
+				'meta'   => array(
1390
+					'title'  => __('Cancelled', 'event_espresso'),
1391
+					'target' => '',
1392
+					'class'  => $menu_class,
1393
+				),
1394
+			));
1395
+		}
1396
+		//Extensions & Services
1397
+		if ($this->registry->CAP->current_user_can('ee_read_ee',
1398
+			'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1399
+		) {
1400
+			$admin_bar->add_menu(array(
1401
+				'id'     => 'espresso-toolbar-extensions-and-services',
1402
+				'parent' => 'espresso-toolbar',
1403
+				'title'  => __('Extensions & Services', 'event_espresso'),
1404
+				'href'   => $extensions_admin_url,
1405
+				'meta'   => array(
1406
+					'title'  => __('Extensions & Services', 'event_espresso'),
1407
+					'target' => '',
1408
+					'class'  => $menu_class,
1409
+				),
1410
+			));
1411
+		}
1412
+	}
1413
+
1414
+
1415
+
1416
+	/**
1417
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1418
+	 * never returned with the function.
1419
+	 *
1420
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1421
+	 * @return array
1422
+	 */
1423
+	public function remove_pages_from_wp_list_pages($exclude_array)
1424
+	{
1425
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1426
+	}
1427 1427
 
1428 1428
 
1429 1429
 
Please login to merge, or discard this patch.
core/admin/EE_Admin_List_Table.core.php 2 patches
Indentation   +780 added lines, -780 removed lines patch added patch discarded remove patch
@@ -1,9 +1,9 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if (! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('NO direct script access allowed');
3
+	exit('NO direct script access allowed');
4 4
 }
5 5
 if (! class_exists('WP_List_Table')) {
6
-    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
6
+	require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
7 7
 }
8 8
 
9 9
 
@@ -22,782 +22,782 @@  discard block
 block discarded – undo
22 22
 abstract class EE_Admin_List_Table extends WP_List_Table
23 23
 {
24 24
 
25
-    /**
26
-     * holds the data that will be processed for the table
27
-     *
28
-     * @var array $_data
29
-     */
30
-    protected $_data;
31
-
32
-
33
-    /**
34
-     * This holds the value of all the data available for the given view (for all pages).
35
-     *
36
-     * @var int $_all_data_count
37
-     */
38
-    protected $_all_data_count;
39
-
40
-
41
-    /**
42
-     * Will contain the count of trashed items for the view label.
43
-     *
44
-     * @var int $_trashed_count
45
-     */
46
-    protected $_trashed_count;
47
-
48
-
49
-    /**
50
-     * This is what will be referenced as the slug for the current screen
51
-     *
52
-     * @var string $_screen
53
-     */
54
-    protected $_screen;
55
-
56
-
57
-    /**
58
-     * this is the EE_Admin_Page object
59
-     *
60
-     * @var EE_Admin_Page $_admin_page
61
-     */
62
-    protected $_admin_page;
63
-
64
-
65
-    /**
66
-     * The current view
67
-     *
68
-     * @var string $_view
69
-     */
70
-    protected $_view;
71
-
72
-
73
-    /**
74
-     * array of possible views for this table
75
-     *
76
-     * @var array $_views
77
-     */
78
-    protected $_views;
79
-
80
-
81
-    /**
82
-     * An array of key => value pairs containing information about the current table
83
-     * array(
84
-     *        'plural' => 'plural label',
85
-     *        'singular' => 'singular label',
86
-     *        'ajax' => false, //whether to use ajax or not
87
-     *        'screen' => null, //string used to reference what screen this is
88
-     *        (WP_List_table converts to screen object)
89
-     * )
90
-     *
91
-     * @var array $_wp_list_args
92
-     */
93
-    protected $_wp_list_args;
94
-
95
-    /**
96
-     * an array of column names
97
-     * array(
98
-     *    'internal-name' => 'Title'
99
-     * )
100
-     *
101
-     * @var array $_columns
102
-     */
103
-    protected $_columns;
104
-
105
-    /**
106
-     * An array of sortable columns
107
-     * array(
108
-     *    'internal-name' => 'orderby' //or
109
-     *    'internal-name' => array( 'orderby', true )
110
-     * )
111
-     *
112
-     * @var array $_sortable_columns
113
-     */
114
-    protected $_sortable_columns;
115
-
116
-    /**
117
-     * callback method used to perform AJAX row reordering
118
-     *
119
-     * @var string $_ajax_sorting_callback
120
-     */
121
-    protected $_ajax_sorting_callback;
122
-
123
-    /**
124
-     * An array of hidden columns (if needed)
125
-     * array('internal-name', 'internal-name')
126
-     *
127
-     * @var array $_hidden_columns
128
-     */
129
-    protected $_hidden_columns;
130
-
131
-    /**
132
-     * holds the per_page value
133
-     *
134
-     * @var int $_per_page
135
-     */
136
-    protected $_per_page;
137
-
138
-    /**
139
-     * holds what page number is currently being viewed
140
-     *
141
-     * @var int $_current_page
142
-     */
143
-    protected $_current_page;
144
-
145
-    /**
146
-     * the reference string for the nonce_action
147
-     *
148
-     * @var string $_nonce_action_ref
149
-     */
150
-    protected $_nonce_action_ref;
151
-
152
-    /**
153
-     * property to hold incoming request data (as set by the admin_page_core)
154
-     *
155
-     * @var array $_req_data
156
-     */
157
-    protected $_req_data;
158
-
159
-
160
-    /**
161
-     * yes / no array for admin form fields
162
-     *
163
-     * @var array $_yes_no
164
-     */
165
-    protected $_yes_no = array();
166
-
167
-    /**
168
-     * Array describing buttons that should appear at the bottom of the page
169
-     * Keys are strings that represent the button's function (specifically a key in _labels['buttons']),
170
-     * and the values are another array with the following keys
171
-     * array(
172
-     *    'route' => 'page_route',
173
-     *    'extra_request' => array('evt_id' => 1 ); //extra request vars that need to be included in the button.
174
-     * )
175
-     *
176
-     * @var array $_bottom_buttons
177
-     */
178
-    protected $_bottom_buttons = array();
179
-
180
-
181
-    /**
182
-     * Used to indicate what should be the primary column for the list table.
183
-     * If not present then falls back to what WP calculates
184
-     * as the primary column.
185
-     *
186
-     * @type string $_primary_column
187
-     */
188
-    protected $_primary_column = '';
189
-
190
-
191
-    /**
192
-     * Used to indicate whether the table has a checkbox column or not.
193
-     *
194
-     * @type bool $_has_checkbox_column
195
-     */
196
-    protected $_has_checkbox_column = false;
197
-
198
-
199
-    /**
200
-     * @param \EE_Admin_Page $admin_page we use this for obtaining everything we need in the list table
201
-     */
202
-    public function __construct(EE_Admin_Page $admin_page)
203
-    {
204
-        $this->_admin_page   = $admin_page;
205
-        $this->_req_data     = $this->_admin_page->get_request_data();
206
-        $this->_view         = $this->_admin_page->get_view();
207
-        $this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208
-        $this->_current_page = $this->get_pagenum();
209
-        $this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
210
-        $this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211
-
212
-        $this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
213
-
214
-        $this->_setup_data();
215
-        $this->_add_view_counts();
216
-
217
-        $this->_nonce_action_ref = $this->_view;
218
-
219
-        $this->_set_properties();
220
-
221
-        //set primary column
222
-        add_filter('list_table_primary_column', array($this, 'set_primary_column'));
223
-
224
-        //set parent defaults
225
-        parent::__construct($this->_wp_list_args);
226
-
227
-        $this->prepare_items();
228
-    }
229
-
230
-
231
-    /**
232
-     * _setup_data
233
-     * this method is used to setup the $_data, $_all_data_count, and _per_page properties
234
-     *
235
-     * @uses $this->_admin_page
236
-     * @return void
237
-     */
238
-    abstract protected function _setup_data();
239
-
240
-
241
-    /**
242
-     * set the properties that this class needs to be able to execute wp_list_table properly
243
-     * properties set:
244
-     * _wp_list_args = what the arguments required for the parent _wp_list_table.
245
-     * _columns = set the columns in an array.
246
-     * _sortable_columns = columns that are sortable (array).
247
-     * _hidden_columns = columns that are hidden (array)
248
-     * _default_orderby = the default orderby for sorting.
249
-     *
250
-     * @abstract
251
-     * @access protected
252
-     * @return void
253
-     */
254
-    abstract protected function _set_properties();
255
-
256
-
257
-    /**
258
-     * _get_table_filters
259
-     * We use this to assemble and return any filters that are associated with this table that help further refine what
260
-     * get's shown in the table.
261
-     *
262
-     * @abstract
263
-     * @access protected
264
-     * @return string
265
-     */
266
-    abstract protected function _get_table_filters();
267
-
268
-
269
-    /**
270
-     * this is a method that child class will do to add counts to the views array so when views are displayed the
271
-     * counts of the views is accurate.
272
-     *
273
-     * @abstract
274
-     * @access protected
275
-     * @return void
276
-     */
277
-    abstract protected function _add_view_counts();
278
-
279
-
280
-    /**
281
-     * _get_hidden_fields
282
-     * returns a html string of hidden fields so if any table filters are used the current view will be respected.
283
-     *
284
-     * @return string
285
-     */
286
-    protected function _get_hidden_fields()
287
-    {
288
-        $action = isset($this->_req_data['route']) ? $this->_req_data['route'] : '';
289
-        $action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290
-        //if action is STILL empty, then we set it to default
291
-        $action = empty($action) ? 'default' : $action;
292
-        $field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
-        $field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
-        $field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
295
-
296
-        $bulk_actions = $this->_get_bulk_actions();
297
-        foreach ($bulk_actions as $bulk_action => $label) {
298
-            $field .= '<input type="hidden" name="' . $bulk_action . '_nonce" value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
299
-        }
300
-
301
-        return $field;
302
-    }
303
-
304
-
305
-    /**
306
-     * _set_column_info
307
-     * we're using this to set the column headers property.
308
-     *
309
-     * @access protected
310
-     * @return void
311
-     */
312
-    protected function _set_column_info()
313
-    {
314
-        $columns   = $this->get_columns();
315
-        $hidden    = $this->get_hidden_columns();
316
-        $_sortable = $this->get_sortable_columns();
317
-
318
-        /**
319
-         * Dynamic hook allowing for adding sortable columns in this list table.
320
-         * Note that $this->screen->id is in the format
321
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
322
-         * table it is: event-espresso_page_espresso_messages.
323
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
324
-         * hook prefix ("event-espresso") will be different.
325
-         *
326
-         * @var array
327
-         */
328
-        $_sortable = apply_filters("FHEE_manage_{$this->screen->id}_sortable_columns", $_sortable, $this->_screen);
329
-
330
-        $sortable = array();
331
-        foreach ($_sortable as $id => $data) {
332
-            if (empty($data)) {
333
-                continue;
334
-            }
335
-            //fix for offset errors with WP_List_Table default get_columninfo()
336
-            if (is_array($data)) {
337
-                $_data[0] = key($data);
338
-                $_data[1] = isset($data[1]) ? $data[1] : false;
339
-            } else {
340
-                $_data[0] = $data;
341
-            }
342
-
343
-            $data = (array)$data;
344
-
345
-            if (! isset($data[1])) {
346
-                $_data[1] = false;
347
-            }
348
-
349
-            $sortable[$id] = $_data;
350
-        }
351
-        $primary               = $this->get_primary_column_name();
352
-        $this->_column_headers = array($columns, $hidden, $sortable, $primary);
353
-    }
354
-
355
-
356
-    /**
357
-     * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
358
-     *
359
-     * @return string
360
-     */
361
-    protected function get_primary_column_name()
362
-    {
363
-        foreach (class_parents($this) as $parent) {
364
-            if ($parent === 'WP_List_Table' && method_exists($parent, 'get_primary_column_name')) {
365
-                return parent::get_primary_column_name();
366
-            }
367
-        }
368
-        return $this->_primary_column;
369
-    }
370
-
371
-
372
-    /**
373
-     * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
374
-     *
375
-     * @param EE_Base_Class $item
376
-     * @param string        $column_name
377
-     * @param string        $primary
378
-     * @return string
379
-     */
380
-    protected function handle_row_actions($item, $column_name, $primary)
381
-    {
382
-        foreach (class_parents($this) as $parent) {
383
-            if ($parent === 'WP_List_Table' && method_exists($parent, 'handle_row_actions')) {
384
-                return parent::handle_row_actions($item, $column_name, $primary);
385
-            }
386
-        }
387
-        return '';
388
-    }
389
-
390
-
391
-    /**
392
-     * _get_bulk_actions
393
-     * This is a wrapper called by WP_List_Table::get_bulk_actions()
394
-     *
395
-     * @access protected
396
-     * @return array bulk_actions
397
-     */
398
-    protected function _get_bulk_actions()
399
-    {
400
-        $actions = array();
401
-        //the _views property should have the bulk_actions, so let's go through and extract them into a properly formatted array for the wp_list_table();
402
-        foreach ($this->_views as $view => $args) {
403
-            if ($this->_view === $view && isset($args['bulk_action']) && is_array($args['bulk_action'])) {
404
-                //each bulk action will correspond with a admin page route, so we can check whatever the capability is for that page route and skip adding the bulk action if no access for the current logged in user.
405
-                foreach ($args['bulk_action'] as $route => $label) {
406
-                    if ($this->_admin_page->check_user_access($route, true)) {
407
-                        $actions[$route] = $label;
408
-                    }
409
-                }
410
-            }
411
-        }
412
-        return $actions;
413
-    }
414
-
415
-
416
-    /**
417
-     * _filters
418
-     * This receives the filters array from children _get_table_filters() and assembles the string including the filter
419
-     * button.
420
-     *
421
-     * @access private
422
-     * @return string html showing filters
423
-     */
424
-    private function _filters()
425
-    {
426
-        $classname = get_class($this);
427
-        $filters   = apply_filters("FHEE__{$classname}__filters", (array)$this->_get_table_filters(), $this,
428
-            $this->_screen);
429
-
430
-        if (empty($filters)) {
431
-            return;
432
-        }
433
-        foreach ($filters as $filter) {
434
-            echo $filter;
435
-        }
436
-        //add filter button at end
437
-        echo '<input type="submit" class="button-secondary" value="' . __('Filter',
438
-                'event_espresso') . '" id="post-query-submit" />';
439
-        //add reset filters button at end
440
-        echo '<a class="button button-secondary"  href="' . $this->_admin_page->get_current_page_view_url() . '" style="display:inline-block">' . __('Reset Filters',
441
-                'event_espresso') . '</a>';
442
-    }
443
-
444
-
445
-    /**
446
-     * Callback for 'list_table_primary_column' WordPress filter
447
-     * If child EE_Admin_List_Table classes set the _primary_column property then that will be set as the primary
448
-     * column when class is instantiated.
449
-     *
450
-     * @see WP_List_Table::get_primary_column_name
451
-     * @param string $column_name
452
-     * @return string
453
-     */
454
-    public function set_primary_column($column_name)
455
-    {
456
-        return ! empty($this->_primary_column) ? $this->_primary_column : $column_name;
457
-    }
458
-
459
-
460
-    /**
461
-     *
462
-     */
463
-    public function prepare_items()
464
-    {
465
-
466
-        $this->_set_column_info();
467
-        //$this->_column_headers = $this->get_column_info();
468
-        $total_items = $this->_all_data_count;
469
-        $this->process_bulk_action();
470
-
471
-        $this->items = $this->_data;
472
-        $this->set_pagination_args(
473
-            array(
474
-                'total_items' => $total_items,
475
-                'per_page'    => $this->_per_page,
476
-                'total_pages' => ceil($total_items / $this->_per_page),
477
-            )
478
-        );
479
-    }
480
-
481
-
482
-    /**
483
-     * This column is the default for when there is no defined column method for a registered column.
484
-     * This can be overridden by child classes, but allows for hooking in for custom columns.
485
-     *
486
-     * @param EE_Base_Class $item
487
-     * @param string        $column_name The column being called.
488
-     * @return string html content for the column
489
-     */
490
-    public function column_default($item, $column_name)
491
-    {
492
-        /**
493
-         * Dynamic hook allowing for adding additional column content in this list table.
494
-         * Note that $this->screen->id is in the format
495
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
496
-         * table it is: event-espresso_page_espresso_messages.
497
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
498
-         * hook prefix ("event-espresso") will be different.
499
-         */
500
-        do_action('AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id, $item,
501
-            $this->_screen);
502
-    }
503
-
504
-
505
-    /**
506
-     * Get a list of columns. The format is:
507
-     * 'internal-name' => 'Title'
508
-     *
509
-     * @since  3.1.0
510
-     * @access public
511
-     * @abstract
512
-     * @return array
513
-     */
514
-    public function get_columns()
515
-    {
516
-        /**
517
-         * Dynamic hook allowing for adding additional columns in this list table.
518
-         * Note that $this->screen->id is in the format
519
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
520
-         * table it is: event-espresso_page_espresso_messages.
521
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
522
-         * hook prefix ("event-espresso") will be different.
523
-         *
524
-         * @var array
525
-         */
526
-        $columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
527
-        return $columns;
528
-    }
529
-
530
-
531
-    /**
532
-     * Get an associative array ( id => link ) with the list
533
-     * of views available on this table.
534
-     *
535
-     * @since  3.1.0
536
-     * @access protected
537
-     * @return array
538
-     */
539
-    public function get_views()
540
-    {
541
-        return $this->_views;
542
-    }
543
-
544
-    public function display_views()
545
-    {
546
-        $views           = $this->get_views();
547
-        $assembled_views = array();
548
-
549
-        if (empty($views)) {
550
-            return;
551
-        }
552
-        echo "<ul class='subsubsub'>\n";
553
-        foreach ($views as $view) {
554
-            $count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
555
-            if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
556
-                $assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>" . '<a href="' . $view['url'] . '">' . $view['label'] . '</a> <span class="count">(' . $count . ')</span>';
557
-            }
558
-        }
559
-
560
-        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
561
-        echo "</ul>";
562
-    }
563
-
564
-
565
-    /**
566
-     * Generates content for a single row of the table
567
-     *
568
-     * @since  4.1
569
-     * @access public
570
-     * @param EE_Base_Class $item The current item
571
-     */
572
-    public function single_row($item)
573
-    {
574
-        $row_class = $this->_get_row_class($item);
575
-        echo '<tr class="' . esc_attr($row_class) . '">';
576
-        $this->single_row_columns($item);
577
-        echo '</tr>';
578
-    }
579
-
580
-
581
-    /**
582
-     * This simply sets up the row class for the table rows.
583
-     * Allows for easier overriding of child methods for setting up sorting.
584
-     *
585
-     * @param  EE_Base_Class $item the current item
586
-     * @return string
587
-     */
588
-    protected function _get_row_class($item)
589
-    {
590
-        static $row_class = '';
591
-        $row_class = ($row_class === '' ? 'alternate' : '');
592
-
593
-        $new_row_class = $row_class;
594
-
595
-        if (! empty($this->_ajax_sorting_callback)) {
596
-            $new_row_class .= ' rowsortable';
597
-        }
598
-
599
-        return $new_row_class;
600
-    }
601
-
602
-
603
-    /**
604
-     * @return array
605
-     */
606
-    public function get_sortable_columns()
607
-    {
608
-        return (array)$this->_sortable_columns;
609
-    }
610
-
611
-
612
-    /**
613
-     * @return string
614
-     */
615
-    public function get_ajax_sorting_callback()
616
-    {
617
-        return $this->_ajax_sorting_callback;
618
-    }
619
-
620
-
621
-    /**
622
-     * @return array
623
-     */
624
-    public function get_hidden_columns()
625
-    {
626
-        $user_id     = get_current_user_id();
627
-        $has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
628
-        if (empty($has_default) && ! empty($this->_hidden_columns)) {
629
-            update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
630
-            update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
631
-        }
632
-        $ref = 'manage' . $this->screen->id . 'columnshidden';
633
-        return (array)get_user_option($ref, $user_id);
634
-    }
635
-
636
-
637
-    /**
638
-     * Generates the columns for a single row of the table.
639
-     * Overridden from wp_list_table so as to allow us to filter the column content for a given
640
-     * column.
641
-     *
642
-     * @since 3.1.0
643
-     * @param EE_Base_Class $item The current item
644
-     */
645
-    public function single_row_columns($item)
646
-    {
647
-        list($columns, $hidden, $sortable, $primary) = $this->get_column_info();
648
-
649
-        global $wp_version;
650
-        $use_hidden_class = version_compare($wp_version, '4.3-RC', '>=');
651
-
652
-        foreach ($columns as $column_name => $column_display_name) {
653
-
654
-            /**
655
-             * With WordPress version 4.3.RC+ WordPress started using the hidden css class to control whether columns are
656
-             * hidden or not instead of using "display:none;".  This bit of code provides backward compat.
657
-             */
658
-            $hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
659
-            $style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
660
-
661
-            $classes = $column_name . ' column-' . $column_name . $hidden_class;
662
-            if ($primary === $column_name) {
663
-                $classes .= ' has-row-actions column-primary';
664
-            }
665
-
666
-            $data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
667
-
668
-            $class = "class='$classes'";
669
-
670
-            $attributes = "$class$style$data";
671
-
672
-            if ($column_name === 'cb') {
673
-                echo '<th scope="row" class="check-column">';
674
-                echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_cb_content',
675
-                    $this->column_cb($item), $item, $this);
676
-                echo '</th>';
677
-            } elseif (method_exists($this, 'column_' . $column_name)) {
678
-                echo "<td $attributes>";
679
-                echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
680
-                    call_user_func(array($this, 'column_' . $column_name), $item), $item, $this);
681
-                echo $this->handle_row_actions($item, $column_name, $primary);
682
-                echo "</td>";
683
-            } else {
684
-                echo "<td $attributes>";
685
-                echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_default__column_content',
686
-                    $this->column_default($item, $column_name), $item, $column_name, $this);
687
-                echo $this->handle_row_actions($item, $column_name, $primary);
688
-                echo "</td>";
689
-            }
690
-        }
691
-    }
692
-
693
-
694
-    /**
695
-     * Extra controls to be displayed between bulk actions and pagination
696
-     *
697
-     * @access public
698
-     * @param string $which
699
-     * @throws \EE_Error
700
-     */
701
-    public function extra_tablenav($which)
702
-    {
703
-        if ($which === 'top') {
704
-            $this->_filters();
705
-            echo $this->_get_hidden_fields();
706
-        } else {
707
-            echo '<div class="list-table-bottom-buttons alignleft actions">';
708
-            foreach ($this->_bottom_buttons as $type => $action) {
709
-                $route         = isset($action['route']) ? $action['route'] : '';
710
-                $extra_request = isset($action['extra_request']) ? $action['extra_request'] : '';
711
-                echo $this->_admin_page->get_action_link_or_button(
712
-                    $route,
713
-                    $type,
714
-                    $extra_request,
715
-                    'button button-secondary',
716
-                    '',
717
-                    false
718
-                );
719
-            }
720
-            do_action('AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons', $this, $this->_screen);
721
-            echo '</div>';
722
-        }
723
-        //echo $this->_entries_per_page_dropdown;
724
-    }
725
-
726
-
727
-    /**
728
-     * Get an associative array ( option_name => option_title ) with the list
729
-     * of bulk actions available on this table.
730
-     *
731
-     * @since  3.1.0
732
-     * @access protected
733
-     * @return array
734
-     */
735
-    public function get_bulk_actions()
736
-    {
737
-        return (array)$this->_get_bulk_actions();
738
-    }
739
-
740
-    public function process_bulk_action()
741
-    {
742
-        //this is not used it is handled by the child EE_Admin_Page class (routes).  However, including here for reference in case there is a case where it gets used.
743
-    }
744
-
745
-
746
-    /**
747
-     * returns the EE admin page this list table is associated with
748
-     *
749
-     * @return EE_Admin_Page
750
-     */
751
-    public function get_admin_page()
752
-    {
753
-        return $this->_admin_page;
754
-    }
755
-
756
-
757
-    /**
758
-     * A "helper" function for all children to provide an html string of
759
-     * actions to output in their content.  It is preferable for child classes
760
-     * to use this method for generating their actions content so that it's
761
-     * filterable by plugins
762
-     *
763
-     * @param string        $action_container           what are the html container
764
-     *                                                  elements for this actions string?
765
-     * @param string        $action_class               What class is for the container
766
-     *                                                  element.
767
-     * @param string        $action_items               The contents for the action items
768
-     *                                                  container.  This is filtered before
769
-     *                                                  returned.
770
-     * @param string        $action_id                  What id (optional) is used for the
771
-     *                                                  container element.
772
-     * @param EE_Base_Class $item                       The object for the column displaying
773
-     *                                                  the actions.
774
-     * @return string The assembled action elements container.
775
-     */
776
-    protected function _action_string(
777
-        $action_items,
778
-        $item,
779
-        $action_container = 'ul',
780
-        $action_class = '',
781
-        $action_id = ''
782
-    ) {
783
-        $content      = '';
784
-        $action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
785
-        $action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
786
-        $content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
787
-        try {
788
-            $content .= apply_filters(
789
-                'FHEE__EE_Admin_List_Table___action_string__action_items',
790
-                $action_items,
791
-                $item,
792
-                $this
793
-            );
794
-        } catch (\Exception $e) {
795
-            if (WP_DEBUG) {
796
-                \EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
797
-            }
798
-            $content .= $action_items;
799
-        }
800
-        $content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
801
-        return $content;
802
-    }
25
+	/**
26
+	 * holds the data that will be processed for the table
27
+	 *
28
+	 * @var array $_data
29
+	 */
30
+	protected $_data;
31
+
32
+
33
+	/**
34
+	 * This holds the value of all the data available for the given view (for all pages).
35
+	 *
36
+	 * @var int $_all_data_count
37
+	 */
38
+	protected $_all_data_count;
39
+
40
+
41
+	/**
42
+	 * Will contain the count of trashed items for the view label.
43
+	 *
44
+	 * @var int $_trashed_count
45
+	 */
46
+	protected $_trashed_count;
47
+
48
+
49
+	/**
50
+	 * This is what will be referenced as the slug for the current screen
51
+	 *
52
+	 * @var string $_screen
53
+	 */
54
+	protected $_screen;
55
+
56
+
57
+	/**
58
+	 * this is the EE_Admin_Page object
59
+	 *
60
+	 * @var EE_Admin_Page $_admin_page
61
+	 */
62
+	protected $_admin_page;
63
+
64
+
65
+	/**
66
+	 * The current view
67
+	 *
68
+	 * @var string $_view
69
+	 */
70
+	protected $_view;
71
+
72
+
73
+	/**
74
+	 * array of possible views for this table
75
+	 *
76
+	 * @var array $_views
77
+	 */
78
+	protected $_views;
79
+
80
+
81
+	/**
82
+	 * An array of key => value pairs containing information about the current table
83
+	 * array(
84
+	 *        'plural' => 'plural label',
85
+	 *        'singular' => 'singular label',
86
+	 *        'ajax' => false, //whether to use ajax or not
87
+	 *        'screen' => null, //string used to reference what screen this is
88
+	 *        (WP_List_table converts to screen object)
89
+	 * )
90
+	 *
91
+	 * @var array $_wp_list_args
92
+	 */
93
+	protected $_wp_list_args;
94
+
95
+	/**
96
+	 * an array of column names
97
+	 * array(
98
+	 *    'internal-name' => 'Title'
99
+	 * )
100
+	 *
101
+	 * @var array $_columns
102
+	 */
103
+	protected $_columns;
104
+
105
+	/**
106
+	 * An array of sortable columns
107
+	 * array(
108
+	 *    'internal-name' => 'orderby' //or
109
+	 *    'internal-name' => array( 'orderby', true )
110
+	 * )
111
+	 *
112
+	 * @var array $_sortable_columns
113
+	 */
114
+	protected $_sortable_columns;
115
+
116
+	/**
117
+	 * callback method used to perform AJAX row reordering
118
+	 *
119
+	 * @var string $_ajax_sorting_callback
120
+	 */
121
+	protected $_ajax_sorting_callback;
122
+
123
+	/**
124
+	 * An array of hidden columns (if needed)
125
+	 * array('internal-name', 'internal-name')
126
+	 *
127
+	 * @var array $_hidden_columns
128
+	 */
129
+	protected $_hidden_columns;
130
+
131
+	/**
132
+	 * holds the per_page value
133
+	 *
134
+	 * @var int $_per_page
135
+	 */
136
+	protected $_per_page;
137
+
138
+	/**
139
+	 * holds what page number is currently being viewed
140
+	 *
141
+	 * @var int $_current_page
142
+	 */
143
+	protected $_current_page;
144
+
145
+	/**
146
+	 * the reference string for the nonce_action
147
+	 *
148
+	 * @var string $_nonce_action_ref
149
+	 */
150
+	protected $_nonce_action_ref;
151
+
152
+	/**
153
+	 * property to hold incoming request data (as set by the admin_page_core)
154
+	 *
155
+	 * @var array $_req_data
156
+	 */
157
+	protected $_req_data;
158
+
159
+
160
+	/**
161
+	 * yes / no array for admin form fields
162
+	 *
163
+	 * @var array $_yes_no
164
+	 */
165
+	protected $_yes_no = array();
166
+
167
+	/**
168
+	 * Array describing buttons that should appear at the bottom of the page
169
+	 * Keys are strings that represent the button's function (specifically a key in _labels['buttons']),
170
+	 * and the values are another array with the following keys
171
+	 * array(
172
+	 *    'route' => 'page_route',
173
+	 *    'extra_request' => array('evt_id' => 1 ); //extra request vars that need to be included in the button.
174
+	 * )
175
+	 *
176
+	 * @var array $_bottom_buttons
177
+	 */
178
+	protected $_bottom_buttons = array();
179
+
180
+
181
+	/**
182
+	 * Used to indicate what should be the primary column for the list table.
183
+	 * If not present then falls back to what WP calculates
184
+	 * as the primary column.
185
+	 *
186
+	 * @type string $_primary_column
187
+	 */
188
+	protected $_primary_column = '';
189
+
190
+
191
+	/**
192
+	 * Used to indicate whether the table has a checkbox column or not.
193
+	 *
194
+	 * @type bool $_has_checkbox_column
195
+	 */
196
+	protected $_has_checkbox_column = false;
197
+
198
+
199
+	/**
200
+	 * @param \EE_Admin_Page $admin_page we use this for obtaining everything we need in the list table
201
+	 */
202
+	public function __construct(EE_Admin_Page $admin_page)
203
+	{
204
+		$this->_admin_page   = $admin_page;
205
+		$this->_req_data     = $this->_admin_page->get_request_data();
206
+		$this->_view         = $this->_admin_page->get_view();
207
+		$this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208
+		$this->_current_page = $this->get_pagenum();
209
+		$this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
210
+		$this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211
+
212
+		$this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
213
+
214
+		$this->_setup_data();
215
+		$this->_add_view_counts();
216
+
217
+		$this->_nonce_action_ref = $this->_view;
218
+
219
+		$this->_set_properties();
220
+
221
+		//set primary column
222
+		add_filter('list_table_primary_column', array($this, 'set_primary_column'));
223
+
224
+		//set parent defaults
225
+		parent::__construct($this->_wp_list_args);
226
+
227
+		$this->prepare_items();
228
+	}
229
+
230
+
231
+	/**
232
+	 * _setup_data
233
+	 * this method is used to setup the $_data, $_all_data_count, and _per_page properties
234
+	 *
235
+	 * @uses $this->_admin_page
236
+	 * @return void
237
+	 */
238
+	abstract protected function _setup_data();
239
+
240
+
241
+	/**
242
+	 * set the properties that this class needs to be able to execute wp_list_table properly
243
+	 * properties set:
244
+	 * _wp_list_args = what the arguments required for the parent _wp_list_table.
245
+	 * _columns = set the columns in an array.
246
+	 * _sortable_columns = columns that are sortable (array).
247
+	 * _hidden_columns = columns that are hidden (array)
248
+	 * _default_orderby = the default orderby for sorting.
249
+	 *
250
+	 * @abstract
251
+	 * @access protected
252
+	 * @return void
253
+	 */
254
+	abstract protected function _set_properties();
255
+
256
+
257
+	/**
258
+	 * _get_table_filters
259
+	 * We use this to assemble and return any filters that are associated with this table that help further refine what
260
+	 * get's shown in the table.
261
+	 *
262
+	 * @abstract
263
+	 * @access protected
264
+	 * @return string
265
+	 */
266
+	abstract protected function _get_table_filters();
267
+
268
+
269
+	/**
270
+	 * this is a method that child class will do to add counts to the views array so when views are displayed the
271
+	 * counts of the views is accurate.
272
+	 *
273
+	 * @abstract
274
+	 * @access protected
275
+	 * @return void
276
+	 */
277
+	abstract protected function _add_view_counts();
278
+
279
+
280
+	/**
281
+	 * _get_hidden_fields
282
+	 * returns a html string of hidden fields so if any table filters are used the current view will be respected.
283
+	 *
284
+	 * @return string
285
+	 */
286
+	protected function _get_hidden_fields()
287
+	{
288
+		$action = isset($this->_req_data['route']) ? $this->_req_data['route'] : '';
289
+		$action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290
+		//if action is STILL empty, then we set it to default
291
+		$action = empty($action) ? 'default' : $action;
292
+		$field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
+		$field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
+		$field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
295
+
296
+		$bulk_actions = $this->_get_bulk_actions();
297
+		foreach ($bulk_actions as $bulk_action => $label) {
298
+			$field .= '<input type="hidden" name="' . $bulk_action . '_nonce" value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
299
+		}
300
+
301
+		return $field;
302
+	}
303
+
304
+
305
+	/**
306
+	 * _set_column_info
307
+	 * we're using this to set the column headers property.
308
+	 *
309
+	 * @access protected
310
+	 * @return void
311
+	 */
312
+	protected function _set_column_info()
313
+	{
314
+		$columns   = $this->get_columns();
315
+		$hidden    = $this->get_hidden_columns();
316
+		$_sortable = $this->get_sortable_columns();
317
+
318
+		/**
319
+		 * Dynamic hook allowing for adding sortable columns in this list table.
320
+		 * Note that $this->screen->id is in the format
321
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
322
+		 * table it is: event-espresso_page_espresso_messages.
323
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
324
+		 * hook prefix ("event-espresso") will be different.
325
+		 *
326
+		 * @var array
327
+		 */
328
+		$_sortable = apply_filters("FHEE_manage_{$this->screen->id}_sortable_columns", $_sortable, $this->_screen);
329
+
330
+		$sortable = array();
331
+		foreach ($_sortable as $id => $data) {
332
+			if (empty($data)) {
333
+				continue;
334
+			}
335
+			//fix for offset errors with WP_List_Table default get_columninfo()
336
+			if (is_array($data)) {
337
+				$_data[0] = key($data);
338
+				$_data[1] = isset($data[1]) ? $data[1] : false;
339
+			} else {
340
+				$_data[0] = $data;
341
+			}
342
+
343
+			$data = (array)$data;
344
+
345
+			if (! isset($data[1])) {
346
+				$_data[1] = false;
347
+			}
348
+
349
+			$sortable[$id] = $_data;
350
+		}
351
+		$primary               = $this->get_primary_column_name();
352
+		$this->_column_headers = array($columns, $hidden, $sortable, $primary);
353
+	}
354
+
355
+
356
+	/**
357
+	 * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
358
+	 *
359
+	 * @return string
360
+	 */
361
+	protected function get_primary_column_name()
362
+	{
363
+		foreach (class_parents($this) as $parent) {
364
+			if ($parent === 'WP_List_Table' && method_exists($parent, 'get_primary_column_name')) {
365
+				return parent::get_primary_column_name();
366
+			}
367
+		}
368
+		return $this->_primary_column;
369
+	}
370
+
371
+
372
+	/**
373
+	 * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
374
+	 *
375
+	 * @param EE_Base_Class $item
376
+	 * @param string        $column_name
377
+	 * @param string        $primary
378
+	 * @return string
379
+	 */
380
+	protected function handle_row_actions($item, $column_name, $primary)
381
+	{
382
+		foreach (class_parents($this) as $parent) {
383
+			if ($parent === 'WP_List_Table' && method_exists($parent, 'handle_row_actions')) {
384
+				return parent::handle_row_actions($item, $column_name, $primary);
385
+			}
386
+		}
387
+		return '';
388
+	}
389
+
390
+
391
+	/**
392
+	 * _get_bulk_actions
393
+	 * This is a wrapper called by WP_List_Table::get_bulk_actions()
394
+	 *
395
+	 * @access protected
396
+	 * @return array bulk_actions
397
+	 */
398
+	protected function _get_bulk_actions()
399
+	{
400
+		$actions = array();
401
+		//the _views property should have the bulk_actions, so let's go through and extract them into a properly formatted array for the wp_list_table();
402
+		foreach ($this->_views as $view => $args) {
403
+			if ($this->_view === $view && isset($args['bulk_action']) && is_array($args['bulk_action'])) {
404
+				//each bulk action will correspond with a admin page route, so we can check whatever the capability is for that page route and skip adding the bulk action if no access for the current logged in user.
405
+				foreach ($args['bulk_action'] as $route => $label) {
406
+					if ($this->_admin_page->check_user_access($route, true)) {
407
+						$actions[$route] = $label;
408
+					}
409
+				}
410
+			}
411
+		}
412
+		return $actions;
413
+	}
414
+
415
+
416
+	/**
417
+	 * _filters
418
+	 * This receives the filters array from children _get_table_filters() and assembles the string including the filter
419
+	 * button.
420
+	 *
421
+	 * @access private
422
+	 * @return string html showing filters
423
+	 */
424
+	private function _filters()
425
+	{
426
+		$classname = get_class($this);
427
+		$filters   = apply_filters("FHEE__{$classname}__filters", (array)$this->_get_table_filters(), $this,
428
+			$this->_screen);
429
+
430
+		if (empty($filters)) {
431
+			return;
432
+		}
433
+		foreach ($filters as $filter) {
434
+			echo $filter;
435
+		}
436
+		//add filter button at end
437
+		echo '<input type="submit" class="button-secondary" value="' . __('Filter',
438
+				'event_espresso') . '" id="post-query-submit" />';
439
+		//add reset filters button at end
440
+		echo '<a class="button button-secondary"  href="' . $this->_admin_page->get_current_page_view_url() . '" style="display:inline-block">' . __('Reset Filters',
441
+				'event_espresso') . '</a>';
442
+	}
443
+
444
+
445
+	/**
446
+	 * Callback for 'list_table_primary_column' WordPress filter
447
+	 * If child EE_Admin_List_Table classes set the _primary_column property then that will be set as the primary
448
+	 * column when class is instantiated.
449
+	 *
450
+	 * @see WP_List_Table::get_primary_column_name
451
+	 * @param string $column_name
452
+	 * @return string
453
+	 */
454
+	public function set_primary_column($column_name)
455
+	{
456
+		return ! empty($this->_primary_column) ? $this->_primary_column : $column_name;
457
+	}
458
+
459
+
460
+	/**
461
+	 *
462
+	 */
463
+	public function prepare_items()
464
+	{
465
+
466
+		$this->_set_column_info();
467
+		//$this->_column_headers = $this->get_column_info();
468
+		$total_items = $this->_all_data_count;
469
+		$this->process_bulk_action();
470
+
471
+		$this->items = $this->_data;
472
+		$this->set_pagination_args(
473
+			array(
474
+				'total_items' => $total_items,
475
+				'per_page'    => $this->_per_page,
476
+				'total_pages' => ceil($total_items / $this->_per_page),
477
+			)
478
+		);
479
+	}
480
+
481
+
482
+	/**
483
+	 * This column is the default for when there is no defined column method for a registered column.
484
+	 * This can be overridden by child classes, but allows for hooking in for custom columns.
485
+	 *
486
+	 * @param EE_Base_Class $item
487
+	 * @param string        $column_name The column being called.
488
+	 * @return string html content for the column
489
+	 */
490
+	public function column_default($item, $column_name)
491
+	{
492
+		/**
493
+		 * Dynamic hook allowing for adding additional column content in this list table.
494
+		 * Note that $this->screen->id is in the format
495
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
496
+		 * table it is: event-espresso_page_espresso_messages.
497
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
498
+		 * hook prefix ("event-espresso") will be different.
499
+		 */
500
+		do_action('AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id, $item,
501
+			$this->_screen);
502
+	}
503
+
504
+
505
+	/**
506
+	 * Get a list of columns. The format is:
507
+	 * 'internal-name' => 'Title'
508
+	 *
509
+	 * @since  3.1.0
510
+	 * @access public
511
+	 * @abstract
512
+	 * @return array
513
+	 */
514
+	public function get_columns()
515
+	{
516
+		/**
517
+		 * Dynamic hook allowing for adding additional columns in this list table.
518
+		 * Note that $this->screen->id is in the format
519
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
520
+		 * table it is: event-espresso_page_espresso_messages.
521
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
522
+		 * hook prefix ("event-espresso") will be different.
523
+		 *
524
+		 * @var array
525
+		 */
526
+		$columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
527
+		return $columns;
528
+	}
529
+
530
+
531
+	/**
532
+	 * Get an associative array ( id => link ) with the list
533
+	 * of views available on this table.
534
+	 *
535
+	 * @since  3.1.0
536
+	 * @access protected
537
+	 * @return array
538
+	 */
539
+	public function get_views()
540
+	{
541
+		return $this->_views;
542
+	}
543
+
544
+	public function display_views()
545
+	{
546
+		$views           = $this->get_views();
547
+		$assembled_views = array();
548
+
549
+		if (empty($views)) {
550
+			return;
551
+		}
552
+		echo "<ul class='subsubsub'>\n";
553
+		foreach ($views as $view) {
554
+			$count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
555
+			if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
556
+				$assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>" . '<a href="' . $view['url'] . '">' . $view['label'] . '</a> <span class="count">(' . $count . ')</span>';
557
+			}
558
+		}
559
+
560
+		echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
561
+		echo "</ul>";
562
+	}
563
+
564
+
565
+	/**
566
+	 * Generates content for a single row of the table
567
+	 *
568
+	 * @since  4.1
569
+	 * @access public
570
+	 * @param EE_Base_Class $item The current item
571
+	 */
572
+	public function single_row($item)
573
+	{
574
+		$row_class = $this->_get_row_class($item);
575
+		echo '<tr class="' . esc_attr($row_class) . '">';
576
+		$this->single_row_columns($item);
577
+		echo '</tr>';
578
+	}
579
+
580
+
581
+	/**
582
+	 * This simply sets up the row class for the table rows.
583
+	 * Allows for easier overriding of child methods for setting up sorting.
584
+	 *
585
+	 * @param  EE_Base_Class $item the current item
586
+	 * @return string
587
+	 */
588
+	protected function _get_row_class($item)
589
+	{
590
+		static $row_class = '';
591
+		$row_class = ($row_class === '' ? 'alternate' : '');
592
+
593
+		$new_row_class = $row_class;
594
+
595
+		if (! empty($this->_ajax_sorting_callback)) {
596
+			$new_row_class .= ' rowsortable';
597
+		}
598
+
599
+		return $new_row_class;
600
+	}
601
+
602
+
603
+	/**
604
+	 * @return array
605
+	 */
606
+	public function get_sortable_columns()
607
+	{
608
+		return (array)$this->_sortable_columns;
609
+	}
610
+
611
+
612
+	/**
613
+	 * @return string
614
+	 */
615
+	public function get_ajax_sorting_callback()
616
+	{
617
+		return $this->_ajax_sorting_callback;
618
+	}
619
+
620
+
621
+	/**
622
+	 * @return array
623
+	 */
624
+	public function get_hidden_columns()
625
+	{
626
+		$user_id     = get_current_user_id();
627
+		$has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
628
+		if (empty($has_default) && ! empty($this->_hidden_columns)) {
629
+			update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
630
+			update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
631
+		}
632
+		$ref = 'manage' . $this->screen->id . 'columnshidden';
633
+		return (array)get_user_option($ref, $user_id);
634
+	}
635
+
636
+
637
+	/**
638
+	 * Generates the columns for a single row of the table.
639
+	 * Overridden from wp_list_table so as to allow us to filter the column content for a given
640
+	 * column.
641
+	 *
642
+	 * @since 3.1.0
643
+	 * @param EE_Base_Class $item The current item
644
+	 */
645
+	public function single_row_columns($item)
646
+	{
647
+		list($columns, $hidden, $sortable, $primary) = $this->get_column_info();
648
+
649
+		global $wp_version;
650
+		$use_hidden_class = version_compare($wp_version, '4.3-RC', '>=');
651
+
652
+		foreach ($columns as $column_name => $column_display_name) {
653
+
654
+			/**
655
+			 * With WordPress version 4.3.RC+ WordPress started using the hidden css class to control whether columns are
656
+			 * hidden or not instead of using "display:none;".  This bit of code provides backward compat.
657
+			 */
658
+			$hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
659
+			$style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
660
+
661
+			$classes = $column_name . ' column-' . $column_name . $hidden_class;
662
+			if ($primary === $column_name) {
663
+				$classes .= ' has-row-actions column-primary';
664
+			}
665
+
666
+			$data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
667
+
668
+			$class = "class='$classes'";
669
+
670
+			$attributes = "$class$style$data";
671
+
672
+			if ($column_name === 'cb') {
673
+				echo '<th scope="row" class="check-column">';
674
+				echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_cb_content',
675
+					$this->column_cb($item), $item, $this);
676
+				echo '</th>';
677
+			} elseif (method_exists($this, 'column_' . $column_name)) {
678
+				echo "<td $attributes>";
679
+				echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
680
+					call_user_func(array($this, 'column_' . $column_name), $item), $item, $this);
681
+				echo $this->handle_row_actions($item, $column_name, $primary);
682
+				echo "</td>";
683
+			} else {
684
+				echo "<td $attributes>";
685
+				echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_default__column_content',
686
+					$this->column_default($item, $column_name), $item, $column_name, $this);
687
+				echo $this->handle_row_actions($item, $column_name, $primary);
688
+				echo "</td>";
689
+			}
690
+		}
691
+	}
692
+
693
+
694
+	/**
695
+	 * Extra controls to be displayed between bulk actions and pagination
696
+	 *
697
+	 * @access public
698
+	 * @param string $which
699
+	 * @throws \EE_Error
700
+	 */
701
+	public function extra_tablenav($which)
702
+	{
703
+		if ($which === 'top') {
704
+			$this->_filters();
705
+			echo $this->_get_hidden_fields();
706
+		} else {
707
+			echo '<div class="list-table-bottom-buttons alignleft actions">';
708
+			foreach ($this->_bottom_buttons as $type => $action) {
709
+				$route         = isset($action['route']) ? $action['route'] : '';
710
+				$extra_request = isset($action['extra_request']) ? $action['extra_request'] : '';
711
+				echo $this->_admin_page->get_action_link_or_button(
712
+					$route,
713
+					$type,
714
+					$extra_request,
715
+					'button button-secondary',
716
+					'',
717
+					false
718
+				);
719
+			}
720
+			do_action('AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons', $this, $this->_screen);
721
+			echo '</div>';
722
+		}
723
+		//echo $this->_entries_per_page_dropdown;
724
+	}
725
+
726
+
727
+	/**
728
+	 * Get an associative array ( option_name => option_title ) with the list
729
+	 * of bulk actions available on this table.
730
+	 *
731
+	 * @since  3.1.0
732
+	 * @access protected
733
+	 * @return array
734
+	 */
735
+	public function get_bulk_actions()
736
+	{
737
+		return (array)$this->_get_bulk_actions();
738
+	}
739
+
740
+	public function process_bulk_action()
741
+	{
742
+		//this is not used it is handled by the child EE_Admin_Page class (routes).  However, including here for reference in case there is a case where it gets used.
743
+	}
744
+
745
+
746
+	/**
747
+	 * returns the EE admin page this list table is associated with
748
+	 *
749
+	 * @return EE_Admin_Page
750
+	 */
751
+	public function get_admin_page()
752
+	{
753
+		return $this->_admin_page;
754
+	}
755
+
756
+
757
+	/**
758
+	 * A "helper" function for all children to provide an html string of
759
+	 * actions to output in their content.  It is preferable for child classes
760
+	 * to use this method for generating their actions content so that it's
761
+	 * filterable by plugins
762
+	 *
763
+	 * @param string        $action_container           what are the html container
764
+	 *                                                  elements for this actions string?
765
+	 * @param string        $action_class               What class is for the container
766
+	 *                                                  element.
767
+	 * @param string        $action_items               The contents for the action items
768
+	 *                                                  container.  This is filtered before
769
+	 *                                                  returned.
770
+	 * @param string        $action_id                  What id (optional) is used for the
771
+	 *                                                  container element.
772
+	 * @param EE_Base_Class $item                       The object for the column displaying
773
+	 *                                                  the actions.
774
+	 * @return string The assembled action elements container.
775
+	 */
776
+	protected function _action_string(
777
+		$action_items,
778
+		$item,
779
+		$action_container = 'ul',
780
+		$action_class = '',
781
+		$action_id = ''
782
+	) {
783
+		$content      = '';
784
+		$action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
785
+		$action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
786
+		$content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
787
+		try {
788
+			$content .= apply_filters(
789
+				'FHEE__EE_Admin_List_Table___action_string__action_items',
790
+				$action_items,
791
+				$item,
792
+				$this
793
+			);
794
+		} catch (\Exception $e) {
795
+			if (WP_DEBUG) {
796
+				\EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
797
+			}
798
+			$content .= $action_items;
799
+		}
800
+		$content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
801
+		return $content;
802
+	}
803 803
 }
Please login to merge, or discard this patch.
Spacing   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -1,9 +1,9 @@  discard block
 block discarded – undo
1 1
 <?php
2
-if (! defined('EVENT_ESPRESSO_VERSION')) {
2
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3 3
     exit('NO direct script access allowed');
4 4
 }
5
-if (! class_exists('WP_List_Table')) {
6
-    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
5
+if ( ! class_exists('WP_List_Table')) {
6
+    require_once(ABSPATH.'wp-admin/includes/class-wp-list-table.php');
7 7
 }
8 8
 
9 9
 
@@ -206,10 +206,10 @@  discard block
 block discarded – undo
206 206
         $this->_view         = $this->_admin_page->get_view();
207 207
         $this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208 208
         $this->_current_page = $this->get_pagenum();
209
-        $this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
209
+        $this->_screen       = $this->_admin_page->get_current_page().'_'.$this->_admin_page->get_current_view();
210 210
         $this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211 211
 
212
-        $this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
212
+        $this->_per_page = $this->get_items_per_page($this->_screen.'_per_page', 10);
213 213
 
214 214
         $this->_setup_data();
215 215
         $this->_add_view_counts();
@@ -289,13 +289,13 @@  discard block
 block discarded – undo
289 289
         $action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290 290
         //if action is STILL empty, then we set it to default
291 291
         $action = empty($action) ? 'default' : $action;
292
-        $field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
-        $field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
-        $field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
292
+        $field  = '<input type="hidden" name="page" value="'.$this->_req_data['page'].'" />'."\n";
293
+        $field  .= '<input type="hidden" name="route" value="'.$action.'" />'."\n"; /**/
294
+        $field  .= '<input type="hidden" name="perpage" value="'.$this->_per_page.'" />'."\n";
295 295
 
296 296
         $bulk_actions = $this->_get_bulk_actions();
297 297
         foreach ($bulk_actions as $bulk_action => $label) {
298
-            $field .= '<input type="hidden" name="' . $bulk_action . '_nonce" value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
298
+            $field .= '<input type="hidden" name="'.$bulk_action.'_nonce" value="'.wp_create_nonce($bulk_action.'_nonce').'" />'."\n";
299 299
         }
300 300
 
301 301
         return $field;
@@ -340,9 +340,9 @@  discard block
 block discarded – undo
340 340
                 $_data[0] = $data;
341 341
             }
342 342
 
343
-            $data = (array)$data;
343
+            $data = (array) $data;
344 344
 
345
-            if (! isset($data[1])) {
345
+            if ( ! isset($data[1])) {
346 346
                 $_data[1] = false;
347 347
             }
348 348
 
@@ -424,7 +424,7 @@  discard block
 block discarded – undo
424 424
     private function _filters()
425 425
     {
426 426
         $classname = get_class($this);
427
-        $filters   = apply_filters("FHEE__{$classname}__filters", (array)$this->_get_table_filters(), $this,
427
+        $filters   = apply_filters("FHEE__{$classname}__filters", (array) $this->_get_table_filters(), $this,
428 428
             $this->_screen);
429 429
 
430 430
         if (empty($filters)) {
@@ -434,11 +434,11 @@  discard block
 block discarded – undo
434 434
             echo $filter;
435 435
         }
436 436
         //add filter button at end
437
-        echo '<input type="submit" class="button-secondary" value="' . __('Filter',
438
-                'event_espresso') . '" id="post-query-submit" />';
437
+        echo '<input type="submit" class="button-secondary" value="'.__('Filter',
438
+                'event_espresso').'" id="post-query-submit" />';
439 439
         //add reset filters button at end
440
-        echo '<a class="button button-secondary"  href="' . $this->_admin_page->get_current_page_view_url() . '" style="display:inline-block">' . __('Reset Filters',
441
-                'event_espresso') . '</a>';
440
+        echo '<a class="button button-secondary"  href="'.$this->_admin_page->get_current_page_view_url().'" style="display:inline-block">'.__('Reset Filters',
441
+                'event_espresso').'</a>';
442 442
     }
443 443
 
444 444
 
@@ -497,7 +497,7 @@  discard block
 block discarded – undo
497 497
          * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
498 498
          * hook prefix ("event-espresso") will be different.
499 499
          */
500
-        do_action('AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id, $item,
500
+        do_action('AHEE__EE_Admin_List_Table__column_'.$column_name.'__'.$this->screen->id, $item,
501 501
             $this->_screen);
502 502
     }
503 503
 
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
          *
524 524
          * @var array
525 525
          */
526
-        $columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
526
+        $columns = apply_filters('FHEE_manage_'.$this->screen->id.'_columns', $this->_columns, $this->_screen);
527 527
         return $columns;
528 528
     }
529 529
 
@@ -553,11 +553,11 @@  discard block
 block discarded – undo
553 553
         foreach ($views as $view) {
554 554
             $count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
555 555
             if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
556
-                $assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>" . '<a href="' . $view['url'] . '">' . $view['label'] . '</a> <span class="count">(' . $count . ')</span>';
556
+                $assembled_views[$view['slug']] = "\t<li class='".$view['class']."'>".'<a href="'.$view['url'].'">'.$view['label'].'</a> <span class="count">('.$count.')</span>';
557 557
             }
558 558
         }
559 559
 
560
-        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
560
+        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views)."</li>\n" : '';
561 561
         echo "</ul>";
562 562
     }
563 563
 
@@ -572,7 +572,7 @@  discard block
 block discarded – undo
572 572
     public function single_row($item)
573 573
     {
574 574
         $row_class = $this->_get_row_class($item);
575
-        echo '<tr class="' . esc_attr($row_class) . '">';
575
+        echo '<tr class="'.esc_attr($row_class).'">';
576 576
         $this->single_row_columns($item);
577 577
         echo '</tr>';
578 578
     }
@@ -592,7 +592,7 @@  discard block
 block discarded – undo
592 592
 
593 593
         $new_row_class = $row_class;
594 594
 
595
-        if (! empty($this->_ajax_sorting_callback)) {
595
+        if ( ! empty($this->_ajax_sorting_callback)) {
596 596
             $new_row_class .= ' rowsortable';
597 597
         }
598 598
 
@@ -605,7 +605,7 @@  discard block
 block discarded – undo
605 605
      */
606 606
     public function get_sortable_columns()
607 607
     {
608
-        return (array)$this->_sortable_columns;
608
+        return (array) $this->_sortable_columns;
609 609
     }
610 610
 
611 611
 
@@ -624,13 +624,13 @@  discard block
 block discarded – undo
624 624
     public function get_hidden_columns()
625 625
     {
626 626
         $user_id     = get_current_user_id();
627
-        $has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
627
+        $has_default = get_user_option('default'.$this->screen->id.'columnshidden', $user_id);
628 628
         if (empty($has_default) && ! empty($this->_hidden_columns)) {
629
-            update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
630
-            update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
629
+            update_user_option($user_id, 'default'.$this->screen->id.'columnshidden', true);
630
+            update_user_option($user_id, 'manage'.$this->screen->id.'columnshidden', $this->_hidden_columns, true);
631 631
         }
632
-        $ref = 'manage' . $this->screen->id . 'columnshidden';
633
-        return (array)get_user_option($ref, $user_id);
632
+        $ref = 'manage'.$this->screen->id.'columnshidden';
633
+        return (array) get_user_option($ref, $user_id);
634 634
     }
635 635
 
636 636
 
@@ -658,12 +658,12 @@  discard block
 block discarded – undo
658 658
             $hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
659 659
             $style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
660 660
 
661
-            $classes = $column_name . ' column-' . $column_name . $hidden_class;
661
+            $classes = $column_name.' column-'.$column_name.$hidden_class;
662 662
             if ($primary === $column_name) {
663 663
                 $classes .= ' has-row-actions column-primary';
664 664
             }
665 665
 
666
-            $data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
666
+            $data = ' data-colname="'.wp_strip_all_tags($column_display_name).'"';
667 667
 
668 668
             $class = "class='$classes'";
669 669
 
@@ -674,10 +674,10 @@  discard block
 block discarded – undo
674 674
                 echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_cb_content',
675 675
                     $this->column_cb($item), $item, $this);
676 676
                 echo '</th>';
677
-            } elseif (method_exists($this, 'column_' . $column_name)) {
677
+            } elseif (method_exists($this, 'column_'.$column_name)) {
678 678
                 echo "<td $attributes>";
679
-                echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
680
-                    call_user_func(array($this, 'column_' . $column_name), $item), $item, $this);
679
+                echo apply_filters('FHEE__EE_Admin_List_Table__single_row_columns__column_'.$column_name.'__column_content',
680
+                    call_user_func(array($this, 'column_'.$column_name), $item), $item, $this);
681 681
                 echo $this->handle_row_actions($item, $column_name, $primary);
682 682
                 echo "</td>";
683 683
             } else {
@@ -734,7 +734,7 @@  discard block
 block discarded – undo
734 734
      */
735 735
     public function get_bulk_actions()
736 736
     {
737
-        return (array)$this->_get_bulk_actions();
737
+        return (array) $this->_get_bulk_actions();
738 738
     }
739 739
 
740 740
     public function process_bulk_action()
@@ -781,9 +781,9 @@  discard block
 block discarded – undo
781 781
         $action_id = ''
782 782
     ) {
783 783
         $content      = '';
784
-        $action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
785
-        $action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
786
-        $content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
784
+        $action_class = ! empty($action_class) ? ' class="'.$action_class.'"' : '';
785
+        $action_id    = ! empty($action_id) ? ' id="'.$action_id.'"' : '';
786
+        $content .= ! empty($action_container) ? '<'.$action_container.$action_class.$action_id.'>' : '';
787 787
         try {
788 788
             $content .= apply_filters(
789 789
                 'FHEE__EE_Admin_List_Table___action_string__action_items',
@@ -797,7 +797,7 @@  discard block
 block discarded – undo
797 797
             }
798 798
             $content .= $action_items;
799 799
         }
800
-        $content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
800
+        $content .= ! empty($action_container) ? '</'.$action_container.'>' : '';
801 801
         return $content;
802 802
     }
803 803
 }
Please login to merge, or discard this patch.
core/services/assets/Registry.php 1 patch
Indentation   +386 added lines, -386 removed lines patch added patch discarded remove patch
@@ -23,396 +23,396 @@
 block discarded – undo
23 23
 class Registry
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Template_Config $template_config
28
-     */
29
-    protected $template_config;
30
-
31
-    /**
32
-     * @var EE_Currency_Config $currency_config
33
-     */
34
-    protected $currency_config;
35
-
36
-    /**
37
-     * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
38
-     *
39
-     * @var array
40
-     */
41
-    protected $jsdata = array();
42
-
43
-
44
-
45
-    /**
46
-     * Registry constructor.
47
-     * Hooking into WP actions for script registry.
48
-     *
49
-     * @param EE_Template_Config $template_config
50
-     * @param EE_Currency_Config $currency_config
51
-     */
52
-    public function __construct(EE_Template_Config $template_config, EE_Currency_Config $currency_config)
53
-    {
54
-        $this->template_config = $template_config;
55
-        $this->currency_config = $currency_config;
56
-        add_action('wp_enqueue_scripts', array($this, 'scripts'), 1);
57
-        add_action('admin_enqueue_scripts', array($this, 'scripts'), 1);
58
-        add_action('wp_enqueue_scripts', array($this, 'enqueueData'), 2);
59
-        add_action('admin_enqueue_scripts', array($this, 'enqueueData'), 2);
60
-        add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
61
-        add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
62
-    }
63
-
64
-
65
-
66
-    /**
67
-     * Callback for the WP script actions.
68
-     * Used to register globally accessible core scripts.
69
-     * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
70
-     */
71
-    public function scripts()
72
-    {
73
-        global $wp_version;
74
-        wp_register_script(
75
-            'eejs-core',
76
-            EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
77
-            array(),
78
-            EVENT_ESPRESSO_VERSION,
79
-            true
80
-        );
81
-        //only run this if WordPress 4.4.0 > is in use.
82
-        if (version_compare($wp_version, '4.4.0', '>')) {
83
-            //js.api
84
-            wp_register_script(
85
-                'eejs-api',
86
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
87
-                array('underscore', 'eejs-core'),
88
-                EVENT_ESPRESSO_VERSION,
89
-                true
90
-            );
91
-            $this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
92
-            $this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
93
-        }
94
-        if (! is_admin()) {
95
-            $this->loadCoreCss();
96
-        }
97
-        $this->loadCoreJs();
98
-        $this->loadJqueryValidate();
99
-        $this->loadAccountingJs();
100
-        $this->loadQtipJs();
101
-    }
102
-
103
-
104
-
105
-    /**
106
-     * Call back for the script print in frontend and backend.
107
-     * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hook point.
108
-     *
109
-     * @since 4.9.31.rc.015
110
-     */
111
-    public function enqueueData()
112
-    {
113
-        wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
114
-        wp_localize_script('espresso_core', 'eei18n', EE_Registry::$i18n_js_strings);
115
-        $this->localizeAccountingJs();
116
-    }
117
-
118
-
119
-
120
-    /**
121
-     * Used to add data to eejs.data object.
122
-     * Note:  Overriding existing data is not allowed.
123
-     * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
124
-     * If the data you add is something like this:
125
-     *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
126
-     * It will be exposed in the page source as:
127
-     *  eejs.data.my_plugin_data.foo == gar
128
-     *
129
-     * @param string       $key   Key used to access your data
130
-     * @param string|array $value Value to attach to key
131
-     * @throws InvalidArgumentException
132
-     */
133
-    public function addData($key, $value)
134
-    {
135
-        if ($this->verifyDataNotExisting($key)) {
136
-            $this->jsdata[$key] = $value;
137
-        }
138
-    }
139
-
140
-
141
-
142
-    /**
143
-     * Similar to addData except this allows for users to push values to an existing key where the values on key are
144
-     * elements in an array.
145
-     * When you use this method, the value you include will be appended to the end of an array on $key.
146
-     * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript
147
-     * object like this, eejs.data.test = [ my_data,
148
-     * ]
149
-     * If there has already been a scalar value attached to the data object given key, then
150
-     * this will throw an exception.
151
-     *
152
-     * @param string       $key   Key to attach data to.
153
-     * @param string|array $value Value being registered.
154
-     * @throws InvalidArgumentException
155
-     */
156
-    public function pushData($key, $value)
157
-    {
158
-        if (isset($this->jsdata[$key])
159
-            && ! is_array($this->jsdata[$key])
160
-        ) {
161
-            throw new invalidArgumentException(
162
-                sprintf(
163
-                    __(
164
-                        'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
26
+	/**
27
+	 * @var EE_Template_Config $template_config
28
+	 */
29
+	protected $template_config;
30
+
31
+	/**
32
+	 * @var EE_Currency_Config $currency_config
33
+	 */
34
+	protected $currency_config;
35
+
36
+	/**
37
+	 * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
38
+	 *
39
+	 * @var array
40
+	 */
41
+	protected $jsdata = array();
42
+
43
+
44
+
45
+	/**
46
+	 * Registry constructor.
47
+	 * Hooking into WP actions for script registry.
48
+	 *
49
+	 * @param EE_Template_Config $template_config
50
+	 * @param EE_Currency_Config $currency_config
51
+	 */
52
+	public function __construct(EE_Template_Config $template_config, EE_Currency_Config $currency_config)
53
+	{
54
+		$this->template_config = $template_config;
55
+		$this->currency_config = $currency_config;
56
+		add_action('wp_enqueue_scripts', array($this, 'scripts'), 1);
57
+		add_action('admin_enqueue_scripts', array($this, 'scripts'), 1);
58
+		add_action('wp_enqueue_scripts', array($this, 'enqueueData'), 2);
59
+		add_action('admin_enqueue_scripts', array($this, 'enqueueData'), 2);
60
+		add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
61
+		add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
62
+	}
63
+
64
+
65
+
66
+	/**
67
+	 * Callback for the WP script actions.
68
+	 * Used to register globally accessible core scripts.
69
+	 * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
70
+	 */
71
+	public function scripts()
72
+	{
73
+		global $wp_version;
74
+		wp_register_script(
75
+			'eejs-core',
76
+			EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
77
+			array(),
78
+			EVENT_ESPRESSO_VERSION,
79
+			true
80
+		);
81
+		//only run this if WordPress 4.4.0 > is in use.
82
+		if (version_compare($wp_version, '4.4.0', '>')) {
83
+			//js.api
84
+			wp_register_script(
85
+				'eejs-api',
86
+				EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
87
+				array('underscore', 'eejs-core'),
88
+				EVENT_ESPRESSO_VERSION,
89
+				true
90
+			);
91
+			$this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
92
+			$this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
93
+		}
94
+		if (! is_admin()) {
95
+			$this->loadCoreCss();
96
+		}
97
+		$this->loadCoreJs();
98
+		$this->loadJqueryValidate();
99
+		$this->loadAccountingJs();
100
+		$this->loadQtipJs();
101
+	}
102
+
103
+
104
+
105
+	/**
106
+	 * Call back for the script print in frontend and backend.
107
+	 * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hook point.
108
+	 *
109
+	 * @since 4.9.31.rc.015
110
+	 */
111
+	public function enqueueData()
112
+	{
113
+		wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
114
+		wp_localize_script('espresso_core', 'eei18n', EE_Registry::$i18n_js_strings);
115
+		$this->localizeAccountingJs();
116
+	}
117
+
118
+
119
+
120
+	/**
121
+	 * Used to add data to eejs.data object.
122
+	 * Note:  Overriding existing data is not allowed.
123
+	 * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
124
+	 * If the data you add is something like this:
125
+	 *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
126
+	 * It will be exposed in the page source as:
127
+	 *  eejs.data.my_plugin_data.foo == gar
128
+	 *
129
+	 * @param string       $key   Key used to access your data
130
+	 * @param string|array $value Value to attach to key
131
+	 * @throws InvalidArgumentException
132
+	 */
133
+	public function addData($key, $value)
134
+	{
135
+		if ($this->verifyDataNotExisting($key)) {
136
+			$this->jsdata[$key] = $value;
137
+		}
138
+	}
139
+
140
+
141
+
142
+	/**
143
+	 * Similar to addData except this allows for users to push values to an existing key where the values on key are
144
+	 * elements in an array.
145
+	 * When you use this method, the value you include will be appended to the end of an array on $key.
146
+	 * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript
147
+	 * object like this, eejs.data.test = [ my_data,
148
+	 * ]
149
+	 * If there has already been a scalar value attached to the data object given key, then
150
+	 * this will throw an exception.
151
+	 *
152
+	 * @param string       $key   Key to attach data to.
153
+	 * @param string|array $value Value being registered.
154
+	 * @throws InvalidArgumentException
155
+	 */
156
+	public function pushData($key, $value)
157
+	{
158
+		if (isset($this->jsdata[$key])
159
+			&& ! is_array($this->jsdata[$key])
160
+		) {
161
+			throw new invalidArgumentException(
162
+				sprintf(
163
+					__(
164
+						'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
165 165
                          push values to this data element when it is an array.',
166
-                        'event_espresso'
167
-                    ),
168
-                    $key,
169
-                    __METHOD__
170
-                )
171
-            );
172
-        }
173
-        $this->jsdata[$key][] = $value;
174
-    }
175
-
176
-
177
-
178
-    /**
179
-     * Used to set content used by javascript for a template.
180
-     * Note: Overrides of existing registered templates are not allowed.
181
-     *
182
-     * @param string $template_reference
183
-     * @param string $template_content
184
-     * @throws InvalidArgumentException
185
-     */
186
-    public function addTemplate($template_reference, $template_content)
187
-    {
188
-        if (! isset($this->jsdata['templates'])) {
189
-            $this->jsdata['templates'] = array();
190
-        }
191
-        //no overrides allowed.
192
-        if (isset($this->jsdata['templates'][$template_reference])) {
193
-            throw new invalidArgumentException(
194
-                sprintf(
195
-                    __(
196
-                        'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
197
-                        'event_espresso'
198
-                    ),
199
-                    $template_reference
200
-                )
201
-            );
202
-        }
203
-        $this->jsdata['templates'][$template_reference] = $template_content;
204
-    }
205
-
206
-
207
-
208
-    /**
209
-     * Retrieve the template content already registered for the given reference.
210
-     *
211
-     * @param string $template_reference
212
-     * @return string
213
-     */
214
-    public function getTemplate($template_reference)
215
-    {
216
-        return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
217
-            ? $this->jsdata['templates'][$template_reference]
218
-            : '';
219
-    }
220
-
221
-
222
-
223
-    /**
224
-     * Retrieve registered data.
225
-     *
226
-     * @param string $key Name of key to attach data to.
227
-     * @return mixed                If there is no for the given key, then false is returned.
228
-     */
229
-    public function getData($key)
230
-    {
231
-        return isset($this->jsdata[$key])
232
-            ? $this->jsdata[$key]
233
-            : false;
234
-    }
235
-
236
-
237
-
238
-    /**
239
-     * Verifies whether the given data exists already on the jsdata array.
240
-     * Overriding data is not allowed.
241
-     *
242
-     * @param string $key Index for data.
243
-     * @return bool        If valid then return true.
244
-     * @throws InvalidArgumentException if data already exists.
245
-     */
246
-    protected function verifyDataNotExisting($key)
247
-    {
248
-        if (isset($this->jsdata[$key])) {
249
-            if (is_array($this->jsdata[$key])) {
250
-                throw new InvalidArgumentException(
251
-                    sprintf(
252
-                        __(
253
-                            'The value for %1$s already exists in the Registry::eejs object.
166
+						'event_espresso'
167
+					),
168
+					$key,
169
+					__METHOD__
170
+				)
171
+			);
172
+		}
173
+		$this->jsdata[$key][] = $value;
174
+	}
175
+
176
+
177
+
178
+	/**
179
+	 * Used to set content used by javascript for a template.
180
+	 * Note: Overrides of existing registered templates are not allowed.
181
+	 *
182
+	 * @param string $template_reference
183
+	 * @param string $template_content
184
+	 * @throws InvalidArgumentException
185
+	 */
186
+	public function addTemplate($template_reference, $template_content)
187
+	{
188
+		if (! isset($this->jsdata['templates'])) {
189
+			$this->jsdata['templates'] = array();
190
+		}
191
+		//no overrides allowed.
192
+		if (isset($this->jsdata['templates'][$template_reference])) {
193
+			throw new invalidArgumentException(
194
+				sprintf(
195
+					__(
196
+						'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
197
+						'event_espresso'
198
+					),
199
+					$template_reference
200
+				)
201
+			);
202
+		}
203
+		$this->jsdata['templates'][$template_reference] = $template_content;
204
+	}
205
+
206
+
207
+
208
+	/**
209
+	 * Retrieve the template content already registered for the given reference.
210
+	 *
211
+	 * @param string $template_reference
212
+	 * @return string
213
+	 */
214
+	public function getTemplate($template_reference)
215
+	{
216
+		return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
217
+			? $this->jsdata['templates'][$template_reference]
218
+			: '';
219
+	}
220
+
221
+
222
+
223
+	/**
224
+	 * Retrieve registered data.
225
+	 *
226
+	 * @param string $key Name of key to attach data to.
227
+	 * @return mixed                If there is no for the given key, then false is returned.
228
+	 */
229
+	public function getData($key)
230
+	{
231
+		return isset($this->jsdata[$key])
232
+			? $this->jsdata[$key]
233
+			: false;
234
+	}
235
+
236
+
237
+
238
+	/**
239
+	 * Verifies whether the given data exists already on the jsdata array.
240
+	 * Overriding data is not allowed.
241
+	 *
242
+	 * @param string $key Index for data.
243
+	 * @return bool        If valid then return true.
244
+	 * @throws InvalidArgumentException if data already exists.
245
+	 */
246
+	protected function verifyDataNotExisting($key)
247
+	{
248
+		if (isset($this->jsdata[$key])) {
249
+			if (is_array($this->jsdata[$key])) {
250
+				throw new InvalidArgumentException(
251
+					sprintf(
252
+						__(
253
+							'The value for %1$s already exists in the Registry::eejs object.
254 254
                             Overrides are not allowed. Since the value of this data is an array, you may want to use the
255 255
                             %2$s method to push your value to the array.',
256
-                            'event_espresso'
257
-                        ),
258
-                        $key,
259
-                        'pushData()'
260
-                    )
261
-                );
262
-            }
263
-            throw new InvalidArgumentException(
264
-                sprintf(
265
-                    __(
266
-                        'The value for %1$s already exists in the Registry::eejs object. Overrides are not
256
+							'event_espresso'
257
+						),
258
+						$key,
259
+						'pushData()'
260
+					)
261
+				);
262
+			}
263
+			throw new InvalidArgumentException(
264
+				sprintf(
265
+					__(
266
+						'The value for %1$s already exists in the Registry::eejs object. Overrides are not
267 267
                         allowed.  Consider attaching your value to a different key',
268
-                        'event_espresso'
269
-                    ),
270
-                    $key
271
-                )
272
-            );
273
-        }
274
-        return true;
275
-    }
276
-
277
-
278
-
279
-    /**
280
-     * registers core default stylesheets
281
-     */
282
-    private function loadCoreCss()
283
-    {
284
-        if ($this->template_config->enable_default_style) {
285
-            $default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
286
-                ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
287
-                : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css';
288
-            wp_register_style(
289
-                'espresso_default',
290
-                $default_stylesheet_path,
291
-                array('dashicons'),
292
-                EVENT_ESPRESSO_VERSION
293
-            );
294
-            //Load custom style sheet if available
295
-            if ($this->template_config->custom_style_sheet !== null) {
296
-                wp_register_style(
297
-                    'espresso_custom_css',
298
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
299
-                    array('espresso_default'),
300
-                    EVENT_ESPRESSO_VERSION
301
-                );
302
-            }
303
-        }
304
-    }
305
-
306
-
307
-
308
-    /**
309
-     * registers core default javascript
310
-     */
311
-    private function loadCoreJs()
312
-    {
313
-        // load core js
314
-        wp_register_script(
315
-            'espresso_core',
316
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
317
-            array('jquery'),
318
-            EVENT_ESPRESSO_VERSION,
319
-            true
320
-        );
321
-    }
322
-
323
-
324
-
325
-    /**
326
-     * registers jQuery Validate for form validation
327
-     */
328
-    private function loadJqueryValidate()
329
-    {
330
-        // register jQuery Validate and additional methods
331
-        wp_register_script(
332
-            'jquery-validate',
333
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
334
-            array('jquery'),
335
-            '1.15.0',
336
-            true
337
-        );
338
-        wp_register_script(
339
-            'jquery-validate-extra-methods',
340
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
341
-            array('jquery', 'jquery-validate'),
342
-            '1.15.0',
343
-            true
344
-        );
345
-    }
346
-
347
-
348
-
349
-    /**
350
-     * registers accounting.js for performing client-side calculations
351
-     */
352
-    private function loadAccountingJs()
353
-    {
354
-        //accounting.js library
355
-        // @link http://josscrowcroft.github.io/accounting.js/
356
-        wp_register_script(
357
-            'ee-accounting-core',
358
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
359
-            array('underscore'),
360
-            '0.3.2',
361
-            true
362
-        );
363
-        wp_register_script(
364
-            'ee-accounting',
365
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
366
-            array('ee-accounting-core'),
367
-            EVENT_ESPRESSO_VERSION,
368
-            true
369
-        );
370
-    }
371
-
372
-
373
-
374
-    /**
375
-     * registers accounting.js for performing client-side calculations
376
-     */
377
-    private function localizeAccountingJs()
378
-    {
379
-        wp_localize_script(
380
-            'ee-accounting',
381
-            'EE_ACCOUNTING_CFG',
382
-            array(
383
-                'currency' => array(
384
-                    'symbol'    => $this->currency_config->sign,
385
-                    'format'    => array(
386
-                        'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
387
-                        'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
388
-                        'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
389
-                    ),
390
-                    'decimal'   => $this->currency_config->dec_mrk,
391
-                    'thousand'  => $this->currency_config->thsnds,
392
-                    'precision' => $this->currency_config->dec_plc,
393
-                ),
394
-                'number'   => array(
395
-                    'precision' => $this->currency_config->dec_plc,
396
-                    'thousand'  => $this->currency_config->thsnds,
397
-                    'decimal'   => $this->currency_config->dec_mrk,
398
-                ),
399
-            )
400
-        );
401
-    }
402
-
403
-
404
-
405
-    /**
406
-     * registers assets for cleaning your ears
407
-     */
408
-    private function loadQtipJs()
409
-    {
410
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
411
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
412
-        if (apply_filters('FHEE_load_qtip', false)) {
413
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
414
-        }
415
-    }
268
+						'event_espresso'
269
+					),
270
+					$key
271
+				)
272
+			);
273
+		}
274
+		return true;
275
+	}
276
+
277
+
278
+
279
+	/**
280
+	 * registers core default stylesheets
281
+	 */
282
+	private function loadCoreCss()
283
+	{
284
+		if ($this->template_config->enable_default_style) {
285
+			$default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
286
+				? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
287
+				: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css';
288
+			wp_register_style(
289
+				'espresso_default',
290
+				$default_stylesheet_path,
291
+				array('dashicons'),
292
+				EVENT_ESPRESSO_VERSION
293
+			);
294
+			//Load custom style sheet if available
295
+			if ($this->template_config->custom_style_sheet !== null) {
296
+				wp_register_style(
297
+					'espresso_custom_css',
298
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
299
+					array('espresso_default'),
300
+					EVENT_ESPRESSO_VERSION
301
+				);
302
+			}
303
+		}
304
+	}
305
+
306
+
307
+
308
+	/**
309
+	 * registers core default javascript
310
+	 */
311
+	private function loadCoreJs()
312
+	{
313
+		// load core js
314
+		wp_register_script(
315
+			'espresso_core',
316
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
317
+			array('jquery'),
318
+			EVENT_ESPRESSO_VERSION,
319
+			true
320
+		);
321
+	}
322
+
323
+
324
+
325
+	/**
326
+	 * registers jQuery Validate for form validation
327
+	 */
328
+	private function loadJqueryValidate()
329
+	{
330
+		// register jQuery Validate and additional methods
331
+		wp_register_script(
332
+			'jquery-validate',
333
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
334
+			array('jquery'),
335
+			'1.15.0',
336
+			true
337
+		);
338
+		wp_register_script(
339
+			'jquery-validate-extra-methods',
340
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
341
+			array('jquery', 'jquery-validate'),
342
+			'1.15.0',
343
+			true
344
+		);
345
+	}
346
+
347
+
348
+
349
+	/**
350
+	 * registers accounting.js for performing client-side calculations
351
+	 */
352
+	private function loadAccountingJs()
353
+	{
354
+		//accounting.js library
355
+		// @link http://josscrowcroft.github.io/accounting.js/
356
+		wp_register_script(
357
+			'ee-accounting-core',
358
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
359
+			array('underscore'),
360
+			'0.3.2',
361
+			true
362
+		);
363
+		wp_register_script(
364
+			'ee-accounting',
365
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
366
+			array('ee-accounting-core'),
367
+			EVENT_ESPRESSO_VERSION,
368
+			true
369
+		);
370
+	}
371
+
372
+
373
+
374
+	/**
375
+	 * registers accounting.js for performing client-side calculations
376
+	 */
377
+	private function localizeAccountingJs()
378
+	{
379
+		wp_localize_script(
380
+			'ee-accounting',
381
+			'EE_ACCOUNTING_CFG',
382
+			array(
383
+				'currency' => array(
384
+					'symbol'    => $this->currency_config->sign,
385
+					'format'    => array(
386
+						'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
387
+						'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
388
+						'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
389
+					),
390
+					'decimal'   => $this->currency_config->dec_mrk,
391
+					'thousand'  => $this->currency_config->thsnds,
392
+					'precision' => $this->currency_config->dec_plc,
393
+				),
394
+				'number'   => array(
395
+					'precision' => $this->currency_config->dec_plc,
396
+					'thousand'  => $this->currency_config->thsnds,
397
+					'decimal'   => $this->currency_config->dec_mrk,
398
+				),
399
+			)
400
+		);
401
+	}
402
+
403
+
404
+
405
+	/**
406
+	 * registers assets for cleaning your ears
407
+	 */
408
+	private function loadQtipJs()
409
+	{
410
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
411
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
412
+		if (apply_filters('FHEE_load_qtip', false)) {
413
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
414
+		}
415
+	}
416 416
 
417 417
 
418 418
 
Please login to merge, or discard this patch.
acceptance_tests/Helpers/CountrySettingsAdmin.php 2 patches
Unused Use Statements   -1 removed lines patch added patch discarded remove patch
@@ -1,7 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 namespace EventEspresso\Codeception\helpers;
3 3
 
4
-use Page\CoreAdmin;
5 4
 use Page\CountrySettingsAdmin as CountrySettings;
6 5
 
7 6
 trait CountrySettingsAdmin
Please login to merge, or discard this patch.
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -6,59 +6,59 @@
 block discarded – undo
6 6
 
7 7
 trait CountrySettingsAdmin
8 8
 {
9
-    /**
10
-     * Instructs the actor to browse to the country settings page.
11
-     * Assumes the actor is already logged in.
12
-     * @param string $additional_params
13
-     */
14
-    public function amOnCountrySettingsAdminPage($additional_params = '')
15
-    {
16
-        $this->actor()->amOnAdminPage(CountrySettings::url($additional_params));
17
-    }
9
+	/**
10
+	 * Instructs the actor to browse to the country settings page.
11
+	 * Assumes the actor is already logged in.
12
+	 * @param string $additional_params
13
+	 */
14
+	public function amOnCountrySettingsAdminPage($additional_params = '')
15
+	{
16
+		$this->actor()->amOnAdminPage(CountrySettings::url($additional_params));
17
+	}
18 18
 
19 19
 
20
-    /**
21
-     * Instructs the actor to select the given decimal places radio option.
22
-     * Assumes the actor is already on the country settings page.
23
-     * @param string $decimal_places
24
-     * @param string $country_code
25
-     */
26
-    public function setCurrencyDecimalPlacesTo($decimal_places = '2', $country_code = 'US')
27
-    {
28
-        $this->actor()->click(CountrySettings::currencyDecimalPlacesRadioField($decimal_places, $country_code));
29
-    }
20
+	/**
21
+	 * Instructs the actor to select the given decimal places radio option.
22
+	 * Assumes the actor is already on the country settings page.
23
+	 * @param string $decimal_places
24
+	 * @param string $country_code
25
+	 */
26
+	public function setCurrencyDecimalPlacesTo($decimal_places = '2', $country_code = 'US')
27
+	{
28
+		$this->actor()->click(CountrySettings::currencyDecimalPlacesRadioField($decimal_places, $country_code));
29
+	}
30 30
 
31 31
 
32
-    /**
33
-     * Instructs the actor to select the given decimal mark radio option.
34
-     * Assumes the actor is already on the country settings page.
35
-     * @param string $decimal_mark
36
-     */
37
-    public function setCurrencyDecimalMarkTo($decimal_mark = '.')
38
-    {
39
-        $this->actor()->click(CountrySettings::currencyDecimalMarkRadioField($decimal_mark));
40
-    }
32
+	/**
33
+	 * Instructs the actor to select the given decimal mark radio option.
34
+	 * Assumes the actor is already on the country settings page.
35
+	 * @param string $decimal_mark
36
+	 */
37
+	public function setCurrencyDecimalMarkTo($decimal_mark = '.')
38
+	{
39
+		$this->actor()->click(CountrySettings::currencyDecimalMarkRadioField($decimal_mark));
40
+	}
41 41
 
42 42
 
43
-    /**
44
-     * Instructs the actor to select the given thousands separator radio option.
45
-     * Assumes the actor is already on the country settings page.
46
-     * @param string $thousands_seperator
47
-     */
48
-    public function setCurrencyThousandsSeparatorTo($thousands_seperator = ',')
49
-    {
50
-        $this->actor()->click(CountrySettings::currencyThousandsSeparatorField($thousands_seperator));
51
-    }
43
+	/**
44
+	 * Instructs the actor to select the given thousands separator radio option.
45
+	 * Assumes the actor is already on the country settings page.
46
+	 * @param string $thousands_seperator
47
+	 */
48
+	public function setCurrencyThousandsSeparatorTo($thousands_seperator = ',')
49
+	{
50
+		$this->actor()->click(CountrySettings::currencyThousandsSeparatorField($thousands_seperator));
51
+	}
52 52
 
53 53
 
54
-    /**
55
-     * Clicks the country settings submit button.
56
-     * Assumes the actor is on the country settings admin page.
57
-     */
58
-    public function saveCountrySettings()
59
-    {
60
-        $this->actor()->click(CountrySettings::COUNTRY_SETTINGS_SAVE_BUTTON);
61
-        //no indicator on the page when stuff has been updated so just give a bit of time for it to finish.
62
-        $this->actor()->wait(5);
63
-    }
54
+	/**
55
+	 * Clicks the country settings submit button.
56
+	 * Assumes the actor is on the country settings admin page.
57
+	 */
58
+	public function saveCountrySettings()
59
+	{
60
+		$this->actor()->click(CountrySettings::COUNTRY_SETTINGS_SAVE_BUTTON);
61
+		//no indicator on the page when stuff has been updated so just give a bit of time for it to finish.
62
+		$this->actor()->wait(5);
63
+	}
64 64
 }
65 65
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Helpers/EventsAdmin.php 1 patch
Indentation   +114 added lines, -114 removed lines patch added patch discarded remove patch
@@ -14,118 +14,118 @@
 block discarded – undo
14 14
 trait EventsAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * @param string $additional_params
19
-     */
20
-    public function amOnDefaultEventsListTablePage($additional_params = '')
21
-    {
22
-        $this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
-    }
24
-
25
-
26
-    /**
27
-     * Triggers the publishing of the Event.
28
-     */
29
-    public function publishEvent()
30
-    {
31
-        $this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
-    }
33
-
34
-
35
-    /**
36
-     * Triggers saving the Event.
37
-     */
38
-    public function saveEvent()
39
-    {
40
-        $this->actor()->click(EventsPage::EVENT_EDITOR_SAVE_BUTTON_SELECTOR);
41
-    }
42
-
43
-
44
-    /**
45
-     * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
46
-     * First this will search using the given title and then attempt to edit from the results of the search.
47
-     *
48
-     * Assumes actor is already logged in.
49
-     * @param $event_title
50
-     */
51
-    public function amEditingTheEventWithTitle($event_title)
52
-    {
53
-        $this->amOnDefaultEventsListTablePage();
54
-        $this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
55
-        $this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
56
-        $this->actor()->waitForText('Displaying search results for');
57
-        $this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
58
-    }
59
-
60
-
61
-    /**
62
-     * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
63
-     * link for the event in the event list table.
64
-     * Assumes the actor is already logged in and on the Event list table page.
65
-     *
66
-     * @param string $event_title
67
-     */
68
-    public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
69
-    {
70
-        $this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
71
-        $this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
72
-    }
73
-
74
-
75
-    /**
76
-     * This performs the click action on the gear icon that triggers the advanced settings view state.
77
-     * Assumes the actor is already logged in and editing an event.
78
-     *
79
-     * @param int $row_number  What ticket row to toggle open/close.
80
-     */
81
-    public function toggleAdvancedSettingsViewForTicketRow($row_number = 1)
82
-    {
83
-        $this->actor()->click(EventsPage::eventEditorTicketAdvancedDetailsSelector($row_number));
84
-    }
85
-
86
-
87
-    /**
88
-     * Toggles the TKT_is_taxable checkbox for the ticket in the given row.
89
-     * Assumes the actor is already logged in and editing an event and that the advanced settings view state for that
90
-     * ticket is "open".
91
-     *
92
-     * @param int $row_number  What ticket row to toggle the checkbox for.
93
-     */
94
-    public function toggleTicketIsTaxableForTicketRow($row_number = 1)
95
-    {
96
-        $this->actor()->click(EventsPage::eventEditorTicketTaxableCheckboxSelector($row_number));
97
-    }
98
-
99
-
100
-    /**
101
-     * Use to change the default registration status for the event.
102
-     * Assumes the view is already on the event editor.
103
-     * @param $registration_status
104
-     */
105
-    public function changeDefaultRegistrationStatusTo($registration_status)
106
-    {
107
-        $this->actor()->selectOption(
108
-            EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
109
-            $registration_status
110
-        );
111
-    }
112
-
113
-
114
-    /**
115
-     * Use this from the context of the event editor to select the given custom template for a given message type and
116
-     * messenger.
117
-     *
118
-     * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
119
-     * @param string $messenger_slug      The slug for the messenger (eg 'email')
120
-     * @param string $custom_template_label The visible label in the select input for the custom template you want
121
-     *                                      selected.
122
-     */
123
-    public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
124
-    {
125
-        $this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
126
-        $this->actor()->selectOption(
127
-            EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
128
-            $custom_template_label
129
-        );
130
-    }
17
+	/**
18
+	 * @param string $additional_params
19
+	 */
20
+	public function amOnDefaultEventsListTablePage($additional_params = '')
21
+	{
22
+		$this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
+	}
24
+
25
+
26
+	/**
27
+	 * Triggers the publishing of the Event.
28
+	 */
29
+	public function publishEvent()
30
+	{
31
+		$this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
+	}
33
+
34
+
35
+	/**
36
+	 * Triggers saving the Event.
37
+	 */
38
+	public function saveEvent()
39
+	{
40
+		$this->actor()->click(EventsPage::EVENT_EDITOR_SAVE_BUTTON_SELECTOR);
41
+	}
42
+
43
+
44
+	/**
45
+	 * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
46
+	 * First this will search using the given title and then attempt to edit from the results of the search.
47
+	 *
48
+	 * Assumes actor is already logged in.
49
+	 * @param $event_title
50
+	 */
51
+	public function amEditingTheEventWithTitle($event_title)
52
+	{
53
+		$this->amOnDefaultEventsListTablePage();
54
+		$this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
55
+		$this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
56
+		$this->actor()->waitForText('Displaying search results for');
57
+		$this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
58
+	}
59
+
60
+
61
+	/**
62
+	 * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
63
+	 * link for the event in the event list table.
64
+	 * Assumes the actor is already logged in and on the Event list table page.
65
+	 *
66
+	 * @param string $event_title
67
+	 */
68
+	public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
69
+	{
70
+		$this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
71
+		$this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
72
+	}
73
+
74
+
75
+	/**
76
+	 * This performs the click action on the gear icon that triggers the advanced settings view state.
77
+	 * Assumes the actor is already logged in and editing an event.
78
+	 *
79
+	 * @param int $row_number  What ticket row to toggle open/close.
80
+	 */
81
+	public function toggleAdvancedSettingsViewForTicketRow($row_number = 1)
82
+	{
83
+		$this->actor()->click(EventsPage::eventEditorTicketAdvancedDetailsSelector($row_number));
84
+	}
85
+
86
+
87
+	/**
88
+	 * Toggles the TKT_is_taxable checkbox for the ticket in the given row.
89
+	 * Assumes the actor is already logged in and editing an event and that the advanced settings view state for that
90
+	 * ticket is "open".
91
+	 *
92
+	 * @param int $row_number  What ticket row to toggle the checkbox for.
93
+	 */
94
+	public function toggleTicketIsTaxableForTicketRow($row_number = 1)
95
+	{
96
+		$this->actor()->click(EventsPage::eventEditorTicketTaxableCheckboxSelector($row_number));
97
+	}
98
+
99
+
100
+	/**
101
+	 * Use to change the default registration status for the event.
102
+	 * Assumes the view is already on the event editor.
103
+	 * @param $registration_status
104
+	 */
105
+	public function changeDefaultRegistrationStatusTo($registration_status)
106
+	{
107
+		$this->actor()->selectOption(
108
+			EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
109
+			$registration_status
110
+		);
111
+	}
112
+
113
+
114
+	/**
115
+	 * Use this from the context of the event editor to select the given custom template for a given message type and
116
+	 * messenger.
117
+	 *
118
+	 * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
119
+	 * @param string $messenger_slug      The slug for the messenger (eg 'email')
120
+	 * @param string $custom_template_label The visible label in the select input for the custom template you want
121
+	 *                                      selected.
122
+	 */
123
+	public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
124
+	{
125
+		$this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
126
+		$this->actor()->selectOption(
127
+			EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
128
+			$custom_template_label
129
+		);
130
+	}
131 131
 }
132 132
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Page/EventsAdmin.php 1 patch
Indentation   +222 added lines, -222 removed lines patch added patch discarded remove patch
@@ -14,231 +14,231 @@
 block discarded – undo
14 14
 class EventsAdmin extends CoreAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * Selector for the Add new Event button in the admin.
19
-     * @var string
20
-     */
21
-    const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
-
23
-
24
-    /**
25
-     * Selector for the Event Title field in the event editor
26
-     * @var string
27
-     */
28
-    const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
-
30
-    /**
31
-     * Selector for the publish submit button in the event editor.
32
-     * @var string
33
-     */
34
-    const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
-
36
-
37
-    /**
38
-     * Selector for the save button in the event editor
39
-     */
40
-    const EVENT_EDITOR_SAVE_BUTTON_SELECTOR = "#save-post";
41
-
42
-
43
-    /**
44
-     * @var string
45
-     */
46
-    const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
17
+	/**
18
+	 * Selector for the Add new Event button in the admin.
19
+	 * @var string
20
+	 */
21
+	const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
+
23
+
24
+	/**
25
+	 * Selector for the Event Title field in the event editor
26
+	 * @var string
27
+	 */
28
+	const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
+
30
+	/**
31
+	 * Selector for the publish submit button in the event editor.
32
+	 * @var string
33
+	 */
34
+	const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
+
36
+
37
+	/**
38
+	 * Selector for the save button in the event editor
39
+	 */
40
+	const EVENT_EDITOR_SAVE_BUTTON_SELECTOR = "#save-post";
41
+
42
+
43
+	/**
44
+	 * @var string
45
+	 */
46
+	const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
47 47
 
48
-    /**
49
-     * Selector for the view link after publishing an event.
50
-     * @var string
51
-     */
52
-    const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
48
+	/**
49
+	 * Selector for the view link after publishing an event.
50
+	 * @var string
51
+	 */
52
+	const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
53 53
 
54 54
 
55
-    /**
56
-     * Selector for the ID of the event in the event editor
57
-     * @var string
58
-     */
59
-    const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
55
+	/**
56
+	 * Selector for the ID of the event in the event editor
57
+	 * @var string
58
+	 */
59
+	const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
60 60
 
61 61
 
62
-    /**
63
-     * Selector for the search input on the event list table page.
64
-     * @var string
65
-     */
66
-    const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
67
-
68
-
69
-
70
-
71
-    /**
72
-     * @param string $additional_params
73
-     * @return string
74
-     */
75
-    public static function defaultEventsListTableUrl($additional_params = '')
76
-    {
77
-        return self::adminUrl('espresso_events', 'default', $additional_params);
78
-    }
79
-
80
-
81
-    /**
82
-     * The selector for the DTTname field for the given row in the event editor.
83
-     * @param int $row_number
84
-     * @return string
85
-     */
86
-    public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
87
-    {
88
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
89
-    }
90
-
91
-
92
-    /**
93
-     * The selector for the DTT_EVT_start field for the given row in the event editor.d
94
-     * @param int $row_number
95
-     * @return string
96
-     */
97
-    public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
98
-    {
99
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
100
-    }
101
-
102
-
103
-    /**
104
-     * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
105
-     *
106
-     * @param string $field_name
107
-     * @param int    $row_number
108
-     * @return string
109
-     */
110
-    public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
111
-    {
112
-        return "//input[@id='event-datetime-$field_name-$row_number']";
113
-    }
114
-
115
-
116
-    /**
117
-     * The selector for the TKT_name field for the given display row in the event editor.
118
-     * @param int $row_number
119
-     * @return string
120
-     */
121
-    public static function eventEditorTicketNameFieldSelector($row_number = 1)
122
-    {
123
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
124
-    }
125
-
126
-
127
-    public static function eventEditorTicketPriceFieldSelector($row_number = 1)
128
-    {
129
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_base_price', $row_number);
130
-    }
131
-
132
-
133
-    public static function eventEditorTicketAdvancedDetailsSelector($row_number = 1)
134
-    {
135
-        return "//tr[@id='display-ticketrow-$row_number']//span[contains(@class, 'gear-icon')]";
136
-    }
137
-
138
-
139
-    public static function eventEditorTicketAdvancedDetailsSubtotalSelector($row_number = 1)
140
-    {
141
-        return "//span[@id='price-total-amount-$row_number']";
142
-    }
143
-
144
-
145
-    public static function eventEditorTicketAdvancedDetailsTotalSelector($row_number = 1)
146
-    {
147
-        return "//span[@id='price-total-amount-$row_number']";
148
-    }
149
-
150
-
151
-    public static function eventEditorTicketTaxableCheckboxSelector($row_number = 1)
152
-    {
153
-        return "//input[@id='edit-ticket-TKT_taxable-$row_number']";
154
-    }
155
-
156
-
157
-    /**
158
-     * This returns the xpath locater for the Tax amount display container within the advanced settings view for the
159
-     * given ticket (row) and the given tax id (PRC_ID).
160
-     *
161
-     * @param int $tax_id     The PRC_ID for the tax you want the locater for.  Note, this defaults to the default tax
162
-     *                        setup on a fresh install.
163
-     * @param int $row_number What row representing the ticket you want the locator for.
164
-     * @return string
165
-     */
166
-    public static function eventEditorTicketTaxAmountDisplayForTaxIdAndTicketRowSelector($tax_id = 2, $row_number = 1)
167
-    {
168
-        return "//span[@id='TKT-tax-amount-display-$tax_id-$row_number']";
169
-    }
170
-
171
-
172
-    /**
173
-     * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
174
-     * @param     $field_name
175
-     * @param int $row_number
176
-     * @return string
177
-     */
178
-    public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
179
-    {
180
-        return "//tr[@id='display-ticketrow-$row_number']//input[contains(@class, 'edit-ticket-$field_name')]";
181
-    }
182
-
183
-
184
-    /**
185
-     * Returns the selector for the event title edit link in the events list table for the given Event Title.
186
-     * @param string $event_title
187
-     * @return string
188
-     */
189
-    public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
190
-    {
191
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
192
-    }
193
-
194
-
195
-    /**
196
-     * Locator for for the ID column in the event list table for a given event title.
197
-     * @param string $event_title
198
-     * @return string
199
-     */
200
-    public static function eventListTableEventIdSelectorForTitle($event_title)
201
-    {
202
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
203
-               . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
204
-    }
205
-
206
-
207
-    /**
208
-     * Locator for the view link in the row of an event list table for the given event title.
209
-     * @param string $event_title
210
-     * @return string
211
-     */
212
-    public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
213
-    {
214
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
215
-               . "//ancestor::td//span[@class='view']/a";
216
-    }
217
-
218
-
219
-    /**
220
-     * Locator for the messenger tab in the Notifications metabox in the event editor.
221
-     * @param string $messenger_slug  The slug for the messenger (it's reference slug).
222
-     * @return string
223
-     */
224
-    public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
225
-    {
226
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
227
-               . "//a[@rel='ee-tab-$messenger_slug']";
228
-    }
229
-
230
-
231
-    /**
232
-     * Locator for the select input within the notifications metabox.
233
-     * Note, this assumes the tab content for the related messenger is already visible.
234
-     * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
235
-     * @return string
236
-     */
237
-    public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
238
-    {
239
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
240
-               . "//table[@class='messages-custom-template-switcher']"
241
-               . "//tr/td[contains(.,'Registration Approved')]"
242
-               . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
243
-    }
62
+	/**
63
+	 * Selector for the search input on the event list table page.
64
+	 * @var string
65
+	 */
66
+	const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
67
+
68
+
69
+
70
+
71
+	/**
72
+	 * @param string $additional_params
73
+	 * @return string
74
+	 */
75
+	public static function defaultEventsListTableUrl($additional_params = '')
76
+	{
77
+		return self::adminUrl('espresso_events', 'default', $additional_params);
78
+	}
79
+
80
+
81
+	/**
82
+	 * The selector for the DTTname field for the given row in the event editor.
83
+	 * @param int $row_number
84
+	 * @return string
85
+	 */
86
+	public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
87
+	{
88
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
89
+	}
90
+
91
+
92
+	/**
93
+	 * The selector for the DTT_EVT_start field for the given row in the event editor.d
94
+	 * @param int $row_number
95
+	 * @return string
96
+	 */
97
+	public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
98
+	{
99
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
100
+	}
101
+
102
+
103
+	/**
104
+	 * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
105
+	 *
106
+	 * @param string $field_name
107
+	 * @param int    $row_number
108
+	 * @return string
109
+	 */
110
+	public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
111
+	{
112
+		return "//input[@id='event-datetime-$field_name-$row_number']";
113
+	}
114
+
115
+
116
+	/**
117
+	 * The selector for the TKT_name field for the given display row in the event editor.
118
+	 * @param int $row_number
119
+	 * @return string
120
+	 */
121
+	public static function eventEditorTicketNameFieldSelector($row_number = 1)
122
+	{
123
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
124
+	}
125
+
126
+
127
+	public static function eventEditorTicketPriceFieldSelector($row_number = 1)
128
+	{
129
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_base_price', $row_number);
130
+	}
131
+
132
+
133
+	public static function eventEditorTicketAdvancedDetailsSelector($row_number = 1)
134
+	{
135
+		return "//tr[@id='display-ticketrow-$row_number']//span[contains(@class, 'gear-icon')]";
136
+	}
137
+
138
+
139
+	public static function eventEditorTicketAdvancedDetailsSubtotalSelector($row_number = 1)
140
+	{
141
+		return "//span[@id='price-total-amount-$row_number']";
142
+	}
143
+
144
+
145
+	public static function eventEditorTicketAdvancedDetailsTotalSelector($row_number = 1)
146
+	{
147
+		return "//span[@id='price-total-amount-$row_number']";
148
+	}
149
+
150
+
151
+	public static function eventEditorTicketTaxableCheckboxSelector($row_number = 1)
152
+	{
153
+		return "//input[@id='edit-ticket-TKT_taxable-$row_number']";
154
+	}
155
+
156
+
157
+	/**
158
+	 * This returns the xpath locater for the Tax amount display container within the advanced settings view for the
159
+	 * given ticket (row) and the given tax id (PRC_ID).
160
+	 *
161
+	 * @param int $tax_id     The PRC_ID for the tax you want the locater for.  Note, this defaults to the default tax
162
+	 *                        setup on a fresh install.
163
+	 * @param int $row_number What row representing the ticket you want the locator for.
164
+	 * @return string
165
+	 */
166
+	public static function eventEditorTicketTaxAmountDisplayForTaxIdAndTicketRowSelector($tax_id = 2, $row_number = 1)
167
+	{
168
+		return "//span[@id='TKT-tax-amount-display-$tax_id-$row_number']";
169
+	}
170
+
171
+
172
+	/**
173
+	 * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
174
+	 * @param     $field_name
175
+	 * @param int $row_number
176
+	 * @return string
177
+	 */
178
+	public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
179
+	{
180
+		return "//tr[@id='display-ticketrow-$row_number']//input[contains(@class, 'edit-ticket-$field_name')]";
181
+	}
182
+
183
+
184
+	/**
185
+	 * Returns the selector for the event title edit link in the events list table for the given Event Title.
186
+	 * @param string $event_title
187
+	 * @return string
188
+	 */
189
+	public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
190
+	{
191
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
192
+	}
193
+
194
+
195
+	/**
196
+	 * Locator for for the ID column in the event list table for a given event title.
197
+	 * @param string $event_title
198
+	 * @return string
199
+	 */
200
+	public static function eventListTableEventIdSelectorForTitle($event_title)
201
+	{
202
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
203
+			   . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
204
+	}
205
+
206
+
207
+	/**
208
+	 * Locator for the view link in the row of an event list table for the given event title.
209
+	 * @param string $event_title
210
+	 * @return string
211
+	 */
212
+	public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
213
+	{
214
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
215
+			   . "//ancestor::td//span[@class='view']/a";
216
+	}
217
+
218
+
219
+	/**
220
+	 * Locator for the messenger tab in the Notifications metabox in the event editor.
221
+	 * @param string $messenger_slug  The slug for the messenger (it's reference slug).
222
+	 * @return string
223
+	 */
224
+	public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
225
+	{
226
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
227
+			   . "//a[@rel='ee-tab-$messenger_slug']";
228
+	}
229
+
230
+
231
+	/**
232
+	 * Locator for the select input within the notifications metabox.
233
+	 * Note, this assumes the tab content for the related messenger is already visible.
234
+	 * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
235
+	 * @return string
236
+	 */
237
+	public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
238
+	{
239
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
240
+			   . "//table[@class='messages-custom-template-switcher']"
241
+			   . "//tr/td[contains(.,'Registration Approved')]"
242
+			   . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
243
+	}
244 244
 }
Please login to merge, or discard this patch.
acceptance_tests/Page/CountrySettingsAdmin.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -14,51 +14,51 @@
 block discarded – undo
14 14
 {
15 15
 
16 16
 
17
-    const COUNTRY_SETTINGS_SAVE_BUTTON = '#country_settings_save_2';
17
+	const COUNTRY_SETTINGS_SAVE_BUTTON = '#country_settings_save_2';
18 18
 
19 19
 
20 20
 
21
-    /**
22
-     * Return the url for the country settings admin page.
23
-     * @param string $additional_params
24
-     * @return string
25
-     */
26
-    public static function url($additional_params = '')
27
-    {
28
-        return self::adminUrl('espresso_general_settings', 'country_settings', $additional_params);
29
-    }
21
+	/**
22
+	 * Return the url for the country settings admin page.
23
+	 * @param string $additional_params
24
+	 * @return string
25
+	 */
26
+	public static function url($additional_params = '')
27
+	{
28
+		return self::adminUrl('espresso_general_settings', 'country_settings', $additional_params);
29
+	}
30 30
 
31 31
 
32
-    /**
33
-     * Return the decimal places (precision) radio field locator for selection.
34
-     * @param int    $decimal_place_value
35
-     * @param string $country_code
36
-     * @return string
37
-     */
38
-    public static function currencyDecimalPlacesRadioField($decimal_place_value = 2, $country_code = 'US')
39
-    {
40
-        return "//input[@id='CNT_cur_dec_plc-$country_code-$decimal_place_value']";
41
-    }
32
+	/**
33
+	 * Return the decimal places (precision) radio field locator for selection.
34
+	 * @param int    $decimal_place_value
35
+	 * @param string $country_code
36
+	 * @return string
37
+	 */
38
+	public static function currencyDecimalPlacesRadioField($decimal_place_value = 2, $country_code = 'US')
39
+	{
40
+		return "//input[@id='CNT_cur_dec_plc-$country_code-$decimal_place_value']";
41
+	}
42 42
 
43 43
 
44
-    /**
45
-     * Return the currency decimal mark field locator for selection.
46
-     * @param string $decimal_mark
47
-     * @return string
48
-     */
49
-    public static function currencyDecimalMarkRadioField($decimal_mark = '.')
50
-    {
51
-        return "//input[@class='CNT_cur_dec_mrk' and @value='$decimal_mark']";
52
-    }
44
+	/**
45
+	 * Return the currency decimal mark field locator for selection.
46
+	 * @param string $decimal_mark
47
+	 * @return string
48
+	 */
49
+	public static function currencyDecimalMarkRadioField($decimal_mark = '.')
50
+	{
51
+		return "//input[@class='CNT_cur_dec_mrk' and @value='$decimal_mark']";
52
+	}
53 53
 
54 54
 
55
-    /**
56
-     * Return the currency thousands separator field locator for selection.
57
-     * @param string $thousands_separator
58
-     * @return string
59
-     */
60
-    public static function currencyThousandsSeparatorField($thousands_separator = ',')
61
-    {
62
-        return "//input[@class='CNT_cur_thsnds' and @value='$thousands_separator']";
63
-    }
55
+	/**
56
+	 * Return the currency thousands separator field locator for selection.
57
+	 * @param string $thousands_separator
58
+	 * @return string
59
+	 */
60
+	public static function currencyThousandsSeparatorField($thousands_separator = ',')
61
+	{
62
+		return "//input[@class='CNT_cur_thsnds' and @value='$thousands_separator']";
63
+	}
64 64
 }
65 65
\ No newline at end of file
Please login to merge, or discard this patch.