Completed
Branch BUG-10236-refresh-fix-reset-ca... (5231fa)
by
unknown
14:37 queued 17s
created
acceptance_tests/Page/EventsAdmin.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -120,7 +120,7 @@
 block discarded – undo
120 120
 
121 121
     /**
122 122
      * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
-     * @param     $field_name
123
+     * @param     string $field_name
124 124
      * @param int $row_number
125 125
      * @return string
126 126
      */
Please login to merge, or discard this patch.
Indentation   +177 added lines, -177 removed lines patch added patch discarded remove patch
@@ -14,181 +14,181 @@
 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
-     * @var string
39
-     */
40
-    const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
-
42
-    /**
43
-     * Selector for the view link after publishing an event.
44
-     * @var string
45
-     */
46
-    const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
47
-
48
-
49
-    /**
50
-     * Selector for the ID of the event in the event editor
51
-     * @var string
52
-     */
53
-    const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
54
-
55
-
56
-    /**
57
-     * Selector for the search input on the event list table page.
58
-     * @var string
59
-     */
60
-    const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
-
62
-
63
-
64
-
65
-    /**
66
-     * @param string $additional_params
67
-     * @return string
68
-     */
69
-    public static function defaultEventsListTableUrl($additional_params = '')
70
-    {
71
-        return self::adminUrl('espresso_events', 'default', $additional_params);
72
-    }
73
-
74
-
75
-    /**
76
-     * The selector for the DTTname field for the given row in the event editor.
77
-     * @param int $row_number
78
-     * @return string
79
-     */
80
-    public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
-    {
82
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
-    }
84
-
85
-
86
-    /**
87
-     * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
-     * @param int $row_number
89
-     * @return string
90
-     */
91
-    public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
-    {
93
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
-    }
95
-
96
-
97
-    /**
98
-     * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
-     *
100
-     * @param string $field_name
101
-     * @param int    $row_number
102
-     * @return string
103
-     */
104
-    public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
-    {
106
-        return "//input[@id='event-datetime-$field_name-$row_number']";
107
-    }
108
-
109
-
110
-    /**
111
-     * The selector for the TKT_name field for the given display row in the event editor.
112
-     * @param int $row_number
113
-     * @return string
114
-     */
115
-    public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
-    {
117
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
-    }
119
-
120
-
121
-    /**
122
-     * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
-     * @param     $field_name
124
-     * @param int $row_number
125
-     * @return string
126
-     */
127
-    public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
128
-    {
129
-        return "//tr[@id='display-ticketrow-$row_number']"
130
-               . "/td[2]/input[@class='edit-ticket-$field_name ee-large-text-inp']";
131
-    }
132
-
133
-
134
-    /**
135
-     * Returns the selector for the event title edit link in the events list table for the given Event Title.
136
-     * @param string $event_title
137
-     * @return string
138
-     */
139
-    public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
140
-    {
141
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
142
-    }
143
-
144
-
145
-    /**
146
-     * Locator for for the ID column in the event list table for a given event title.
147
-     * @param string $event_title
148
-     * @return string
149
-     */
150
-    public static function eventListTableEventIdSelectorForTitle($event_title)
151
-    {
152
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
153
-               . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
154
-    }
155
-
156
-
157
-    /**
158
-     * Locator for the view link in the row of an event list table for the given event title.
159
-     * @param string $event_title
160
-     * @return string
161
-     */
162
-    public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
163
-    {
164
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
165
-               . "//ancestor::td//span[@class='view']/a";
166
-    }
167
-
168
-
169
-    /**
170
-     * Locator for the messenger tab in the Notifications metabox in the event editor.
171
-     * @param string $messenger_slug  The slug for the messenger (it's reference slug).
172
-     * @return string
173
-     */
174
-    public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
175
-    {
176
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
177
-               . "//a[@rel='ee-tab-$messenger_slug']";
178
-    }
179
-
180
-
181
-    /**
182
-     * Locator for the select input within the notifications metabox.
183
-     * Note, this assumes the tab content for the related messenger is already visible.
184
-     * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
185
-     * @return string
186
-     */
187
-    public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
188
-    {
189
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
190
-               . "//table[@class='messages-custom-template-switcher']"
191
-               . "//tr/td[contains(.,'Registration Approved')]"
192
-               . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
193
-    }
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
+	 * @var string
39
+	 */
40
+	const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
+
42
+	/**
43
+	 * Selector for the view link after publishing an event.
44
+	 * @var string
45
+	 */
46
+	const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
47
+
48
+
49
+	/**
50
+	 * Selector for the ID of the event in the event editor
51
+	 * @var string
52
+	 */
53
+	const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
54
+
55
+
56
+	/**
57
+	 * Selector for the search input on the event list table page.
58
+	 * @var string
59
+	 */
60
+	const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
+
62
+
63
+
64
+
65
+	/**
66
+	 * @param string $additional_params
67
+	 * @return string
68
+	 */
69
+	public static function defaultEventsListTableUrl($additional_params = '')
70
+	{
71
+		return self::adminUrl('espresso_events', 'default', $additional_params);
72
+	}
73
+
74
+
75
+	/**
76
+	 * The selector for the DTTname field for the given row in the event editor.
77
+	 * @param int $row_number
78
+	 * @return string
79
+	 */
80
+	public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
+	{
82
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
+	}
84
+
85
+
86
+	/**
87
+	 * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
+	 * @param int $row_number
89
+	 * @return string
90
+	 */
91
+	public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
+	{
93
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
+	}
95
+
96
+
97
+	/**
98
+	 * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
+	 *
100
+	 * @param string $field_name
101
+	 * @param int    $row_number
102
+	 * @return string
103
+	 */
104
+	public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
+	{
106
+		return "//input[@id='event-datetime-$field_name-$row_number']";
107
+	}
108
+
109
+
110
+	/**
111
+	 * The selector for the TKT_name field for the given display row in the event editor.
112
+	 * @param int $row_number
113
+	 * @return string
114
+	 */
115
+	public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
+	{
117
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
+	}
119
+
120
+
121
+	/**
122
+	 * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
+	 * @param     $field_name
124
+	 * @param int $row_number
125
+	 * @return string
126
+	 */
127
+	public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
128
+	{
129
+		return "//tr[@id='display-ticketrow-$row_number']"
130
+			   . "/td[2]/input[@class='edit-ticket-$field_name ee-large-text-inp']";
131
+	}
132
+
133
+
134
+	/**
135
+	 * Returns the selector for the event title edit link in the events list table for the given Event Title.
136
+	 * @param string $event_title
137
+	 * @return string
138
+	 */
139
+	public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
140
+	{
141
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
142
+	}
143
+
144
+
145
+	/**
146
+	 * Locator for for the ID column in the event list table for a given event title.
147
+	 * @param string $event_title
148
+	 * @return string
149
+	 */
150
+	public static function eventListTableEventIdSelectorForTitle($event_title)
151
+	{
152
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
153
+			   . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
154
+	}
155
+
156
+
157
+	/**
158
+	 * Locator for the view link in the row of an event list table for the given event title.
159
+	 * @param string $event_title
160
+	 * @return string
161
+	 */
162
+	public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
163
+	{
164
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
165
+			   . "//ancestor::td//span[@class='view']/a";
166
+	}
167
+
168
+
169
+	/**
170
+	 * Locator for the messenger tab in the Notifications metabox in the event editor.
171
+	 * @param string $messenger_slug  The slug for the messenger (it's reference slug).
172
+	 * @return string
173
+	 */
174
+	public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
175
+	{
176
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
177
+			   . "//a[@rel='ee-tab-$messenger_slug']";
178
+	}
179
+
180
+
181
+	/**
182
+	 * Locator for the select input within the notifications metabox.
183
+	 * Note, this assumes the tab content for the related messenger is already visible.
184
+	 * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
185
+	 * @return string
186
+	 */
187
+	public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
188
+	{
189
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
190
+			   . "//table[@class='messages-custom-template-switcher']"
191
+			   . "//tr/td[contains(.,'Registration Approved')]"
192
+			   . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
193
+	}
194 194
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +219 added lines, -219 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('ABSPATH')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /*
5 5
   Plugin Name:		Event Espresso
@@ -40,243 +40,243 @@  discard block
 block discarded – undo
40 40
  * @since            4.0
41 41
  */
42 42
 if (function_exists('espresso_version')) {
43
-    /**
44
-     *    espresso_duplicate_plugin_error
45
-     *    displays if more than one version of EE is activated at the same time
46
-     */
47
-    function espresso_duplicate_plugin_error()
48
-    {
49
-        ?>
43
+	/**
44
+	 *    espresso_duplicate_plugin_error
45
+	 *    displays if more than one version of EE is activated at the same time
46
+	 */
47
+	function espresso_duplicate_plugin_error()
48
+	{
49
+		?>
50 50
         <div class="error">
51 51
             <p>
52 52
                 <?php echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                ); ?>
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+				); ?>
56 56
             </p>
57 57
         </div>
58 58
         <?php
59
-        espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-    }
59
+		espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+	}
61 61
 
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
-    if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
65
+	if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                            esc_html__(
79
-                                    'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                                    'event_espresso'
81
-                            ),
82
-                            EE_MIN_PHP_VER_REQUIRED,
83
-                            PHP_VERSION,
84
-                            '<br/>',
85
-                            '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+							esc_html__(
79
+									'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+									'event_espresso'
81
+							),
82
+							EE_MIN_PHP_VER_REQUIRED,
83
+							PHP_VERSION,
84
+							'<br/>',
85
+							'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        /**
97
-         * espresso_version
98
-         * Returns the plugin version
99
-         *
100
-         * @return string
101
-         */
102
-        function espresso_version()
103
-        {
104
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.41.rc.004');
105
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		/**
97
+		 * espresso_version
98
+		 * Returns the plugin version
99
+		 *
100
+		 * @return string
101
+		 */
102
+		function espresso_version()
103
+		{
104
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.41.rc.004');
105
+		}
106 106
 
107
-        // define versions
108
-        define('EVENT_ESPRESSO_VERSION', espresso_version());
109
-        define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
-        define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
-        define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
-        //used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
-        if ( ! defined('DS')) {
115
-            define('DS', '/');
116
-        }
117
-        if ( ! defined('PS')) {
118
-            define('PS', PATH_SEPARATOR);
119
-        }
120
-        if ( ! defined('SP')) {
121
-            define('SP', ' ');
122
-        }
123
-        if ( ! defined('EENL')) {
124
-            define('EENL', "\n");
125
-        }
126
-        define('EE_SUPPORT_EMAIL', '[email protected]');
127
-        // define the plugin directory and URL
128
-        define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
-        define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
-        define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
-        // main root folder paths
132
-        define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
-        define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
-        define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
-        define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
-        define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
-        define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
-        define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
-        define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
-        // core system paths
141
-        define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
-        define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
-        define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
-        define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
-        define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
-        define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
-        define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
-        define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
-        define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
-        define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
-        define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
-        define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
-        // gateways
154
-        define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
-        define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
-        // asset URL paths
157
-        define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
-        define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
-        define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
-        define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
-        define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
-        define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
-        // define upload paths
164
-        $uploads = wp_upload_dir();
165
-        // define the uploads directory and URL
166
-        define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
-        define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
-        // define the templates directory and URL
169
-        define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
-        define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
-        // define the gateway directory and URL
172
-        define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
-        define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
-        // languages folder/path
175
-        define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
-        define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
-        //check for dompdf fonts in uploads
178
-        if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
-            define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
-        }
181
-        //ajax constants
182
-        define(
183
-                'EE_FRONT_AJAX',
184
-                isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
-        );
186
-        define(
187
-                'EE_ADMIN_AJAX',
188
-                isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
-        );
190
-        //just a handy constant occasionally needed for finding values representing infinity in the DB
191
-        //you're better to use this than its straight value (currently -1) in case you ever
192
-        //want to change its default value! or find when -1 means infinity
193
-        define('EE_INF_IN_DB', -1);
194
-        define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
-        define('EE_DEBUG', false);
196
-        // for older WP versions
197
-        if ( ! defined('MONTH_IN_SECONDS')) {
198
-            define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
-        }
200
-        /**
201
-         *    espresso_plugin_activation
202
-         *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
-         */
204
-        function espresso_plugin_activation()
205
-        {
206
-            update_option('ee_espresso_activation', true);
207
-        }
107
+		// define versions
108
+		define('EVENT_ESPRESSO_VERSION', espresso_version());
109
+		define('EE_MIN_WP_VER_REQUIRED', '4.1');
110
+		define('EE_MIN_WP_VER_RECOMMENDED', '4.4.2');
111
+		define('EE_MIN_PHP_VER_RECOMMENDED', '5.4.44');
112
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
113
+		//used to be DIRECTORY_SEPARATOR, but that caused issues on windows
114
+		if ( ! defined('DS')) {
115
+			define('DS', '/');
116
+		}
117
+		if ( ! defined('PS')) {
118
+			define('PS', PATH_SEPARATOR);
119
+		}
120
+		if ( ! defined('SP')) {
121
+			define('SP', ' ');
122
+		}
123
+		if ( ! defined('EENL')) {
124
+			define('EENL', "\n");
125
+		}
126
+		define('EE_SUPPORT_EMAIL', '[email protected]');
127
+		// define the plugin directory and URL
128
+		define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
129
+		define('EE_PLUGIN_DIR_PATH', plugin_dir_path(EVENT_ESPRESSO_MAIN_FILE));
130
+		define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
131
+		// main root folder paths
132
+		define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages' . DS);
133
+		define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core' . DS);
134
+		define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules' . DS);
135
+		define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public' . DS);
136
+		define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes' . DS);
137
+		define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets' . DS);
138
+		define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods' . DS);
139
+		define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated' . DS);
140
+		// core system paths
141
+		define('EE_ADMIN', EE_CORE . 'admin' . DS);
142
+		define('EE_CPTS', EE_CORE . 'CPTs' . DS);
143
+		define('EE_CLASSES', EE_CORE . 'db_classes' . DS);
144
+		define('EE_INTERFACES', EE_CORE . 'interfaces' . DS);
145
+		define('EE_BUSINESS', EE_CORE . 'business' . DS);
146
+		define('EE_MODELS', EE_CORE . 'db_models' . DS);
147
+		define('EE_HELPERS', EE_CORE . 'helpers' . DS);
148
+		define('EE_LIBRARIES', EE_CORE . 'libraries' . DS);
149
+		define('EE_TEMPLATES', EE_CORE . 'templates' . DS);
150
+		define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs' . DS);
151
+		define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets' . DS);
152
+		define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections' . DS);
153
+		// gateways
154
+		define('EE_GATEWAYS', EE_MODULES . 'gateways' . DS);
155
+		define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules' . DS . 'gateways' . DS);
156
+		// asset URL paths
157
+		define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'templates' . DS);
158
+		define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets' . DS);
159
+		define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images' . DS);
160
+		define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core' . DS . 'third_party_libs' . DS);
161
+		define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
162
+		define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
163
+		// define upload paths
164
+		$uploads = wp_upload_dir();
165
+		// define the uploads directory and URL
166
+		define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . DS . 'espresso' . DS);
167
+		define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . DS . 'espresso' . DS);
168
+		// define the templates directory and URL
169
+		define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'templates' . DS);
170
+		define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'templates' . DS);
171
+		// define the gateway directory and URL
172
+		define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . DS . 'espresso' . DS . 'gateways' . DS);
173
+		define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . DS . 'espresso' . DS . 'gateways' . DS);
174
+		// languages folder/path
175
+		define('EE_LANGUAGES_SAFE_LOC', '..' . DS . 'uploads' . DS . 'espresso' . DS . 'languages' . DS);
176
+		define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages' . DS);
177
+		//check for dompdf fonts in uploads
178
+		if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS)) {
179
+			define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts' . DS);
180
+		}
181
+		//ajax constants
182
+		define(
183
+				'EE_FRONT_AJAX',
184
+				isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax']) ? true : false
185
+		);
186
+		define(
187
+				'EE_ADMIN_AJAX',
188
+				isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax']) ? true : false
189
+		);
190
+		//just a handy constant occasionally needed for finding values representing infinity in the DB
191
+		//you're better to use this than its straight value (currently -1) in case you ever
192
+		//want to change its default value! or find when -1 means infinity
193
+		define('EE_INF_IN_DB', -1);
194
+		define('EE_INF', INF > (float)PHP_INT_MAX ? INF : PHP_INT_MAX);
195
+		define('EE_DEBUG', false);
196
+		// for older WP versions
197
+		if ( ! defined('MONTH_IN_SECONDS')) {
198
+			define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
199
+		}
200
+		/**
201
+		 *    espresso_plugin_activation
202
+		 *    adds a wp-option to indicate that EE has been activated via the WP admin plugins page
203
+		 */
204
+		function espresso_plugin_activation()
205
+		{
206
+			update_option('ee_espresso_activation', true);
207
+		}
208 208
 
209
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
-        /**
211
-         *    espresso_load_error_handling
212
-         *    this function loads EE's class for handling exceptions and errors
213
-         */
214
-        function espresso_load_error_handling()
215
-        {
216
-            // load debugging tools
217
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
-                require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
-                EEH_Debug_Tools::instance();
220
-            }
221
-            // load error handling
222
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
-                require_once(EE_CORE . 'EE_Error.core.php');
224
-            } else {
225
-                wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
-            }
227
-        }
209
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
210
+		/**
211
+		 *    espresso_load_error_handling
212
+		 *    this function loads EE's class for handling exceptions and errors
213
+		 */
214
+		function espresso_load_error_handling()
215
+		{
216
+			// load debugging tools
217
+			if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
218
+				require_once(EE_HELPERS . 'EEH_Debug_Tools.helper.php');
219
+				EEH_Debug_Tools::instance();
220
+			}
221
+			// load error handling
222
+			if (is_readable(EE_CORE . 'EE_Error.core.php')) {
223
+				require_once(EE_CORE . 'EE_Error.core.php');
224
+			} else {
225
+				wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
226
+			}
227
+		}
228 228
 
229
-        /**
230
-         *    espresso_load_required
231
-         *    given a class name and path, this function will load that file or throw an exception
232
-         *
233
-         * @param    string $classname
234
-         * @param    string $full_path_to_file
235
-         * @throws    EE_Error
236
-         */
237
-        function espresso_load_required($classname, $full_path_to_file)
238
-        {
239
-            static $error_handling_loaded = false;
240
-            if ( ! $error_handling_loaded) {
241
-                espresso_load_error_handling();
242
-                $error_handling_loaded = true;
243
-            }
244
-            if (is_readable($full_path_to_file)) {
245
-                require_once($full_path_to_file);
246
-            } else {
247
-                throw new EE_Error (
248
-                        sprintf(
249
-                                esc_html__(
250
-                                        'The %s class file could not be located or is not readable due to file permissions.',
251
-                                        'event_espresso'
252
-                                ),
253
-                                $classname
254
-                        )
255
-                );
256
-            }
257
-        }
229
+		/**
230
+		 *    espresso_load_required
231
+		 *    given a class name and path, this function will load that file or throw an exception
232
+		 *
233
+		 * @param    string $classname
234
+		 * @param    string $full_path_to_file
235
+		 * @throws    EE_Error
236
+		 */
237
+		function espresso_load_required($classname, $full_path_to_file)
238
+		{
239
+			static $error_handling_loaded = false;
240
+			if ( ! $error_handling_loaded) {
241
+				espresso_load_error_handling();
242
+				$error_handling_loaded = true;
243
+			}
244
+			if (is_readable($full_path_to_file)) {
245
+				require_once($full_path_to_file);
246
+			} else {
247
+				throw new EE_Error (
248
+						sprintf(
249
+								esc_html__(
250
+										'The %s class file could not be located or is not readable due to file permissions.',
251
+										'event_espresso'
252
+								),
253
+								$classname
254
+						)
255
+				);
256
+			}
257
+		}
258 258
 
259
-        espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
-        espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
-        espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
-        new EE_Bootstrap();
263
-    }
259
+		espresso_load_required('EEH_Base', EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php');
260
+		espresso_load_required('EEH_File', EE_CORE . 'helpers' . DS . 'EEH_File.helper.php');
261
+		espresso_load_required('EE_Bootstrap', EE_CORE . 'EE_Bootstrap.core.php');
262
+		new EE_Bootstrap();
263
+	}
264 264
 }
265 265
 if ( ! function_exists('espresso_deactivate_plugin')) {
266
-    /**
267
-     *    deactivate_plugin
268
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
-     *
270
-     * @access public
271
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
-     * @return    void
273
-     */
274
-    function espresso_deactivate_plugin($plugin_basename = '')
275
-    {
276
-        if ( ! function_exists('deactivate_plugins')) {
277
-            require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
-        }
279
-        unset($_GET['activate'], $_REQUEST['activate']);
280
-        deactivate_plugins($plugin_basename);
281
-    }
266
+	/**
267
+	 *    deactivate_plugin
268
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
269
+	 *
270
+	 * @access public
271
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
272
+	 * @return    void
273
+	 */
274
+	function espresso_deactivate_plugin($plugin_basename = '')
275
+	{
276
+		if ( ! function_exists('deactivate_plugins')) {
277
+			require_once(ABSPATH . 'wp-admin/includes/plugin.php');
278
+		}
279
+		unset($_GET['activate'], $_REQUEST['activate']);
280
+		deactivate_plugins($plugin_basename);
281
+	}
282 282
 }
283 283
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Helpers/BaseCoreAdmin.php 1 patch
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -13,58 +13,58 @@
 block discarded – undo
13 13
 trait BaseCoreAdmin
14 14
 {
15 15
 
16
-    /**
17
-     * Core method for going to an Event Espresso Admin page.
18
-     * @param string $page
19
-     * @param string $action
20
-     * @param string $additional_params
21
-     */
22
-    public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
-    {
24
-        $this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
-    }
16
+	/**
17
+	 * Core method for going to an Event Espresso Admin page.
18
+	 * @param string $page
19
+	 * @param string $action
20
+	 * @param string $additional_params
21
+	 */
22
+	public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
+	{
24
+		$this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
+	}
26 26
 
27 27
 
28
-    /**
29
-     * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
-     * @return \EventEspressoAcceptanceTester;
31
-     */
32
-    protected function actor()
33
-    {
34
-        /** @var \EventEspressoAcceptanceTester $this */
35
-        return $this;
36
-    }
28
+	/**
29
+	 * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
+	 * @return \EventEspressoAcceptanceTester;
31
+	 */
32
+	protected function actor()
33
+	{
34
+		/** @var \EventEspressoAcceptanceTester $this */
35
+		return $this;
36
+	}
37 37
 
38 38
 
39
-    /**
40
-     * Use this to set the per page option for a list table page.
41
-     * Assumes you are on a page that has this field exposed.
42
-     *
43
-     * @param int|string $per_page_value
44
-     * @throws \Codeception\Exception\TestRuntimeException
45
-     */
46
-    public function setPerPageOptionForScreen($per_page_value)
47
-    {
48
-        $this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
-        $this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
-        $this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
-        $this->actor()->wait(8);
52
-    }
39
+	/**
40
+	 * Use this to set the per page option for a list table page.
41
+	 * Assumes you are on a page that has this field exposed.
42
+	 *
43
+	 * @param int|string $per_page_value
44
+	 * @throws \Codeception\Exception\TestRuntimeException
45
+	 */
46
+	public function setPerPageOptionForScreen($per_page_value)
47
+	{
48
+		$this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
+		$this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
+		$this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
+		$this->actor()->wait(8);
52
+	}
53 53
 
54 54
 
55 55
 
56
-    /**
57
-     * Use this to append a given value to a wpEditor instance.
58
-     * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
-     * the value is added to the text area.
60
-     *
61
-     * @param $field_reference
62
-     * @param $value
63
-     * @throws \Codeception\Exception\ElementNotFound
64
-     */
65
-    public function appendToWPEditorField($field_reference, $value)
66
-    {
67
-        $this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
-        $this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
-    }
56
+	/**
57
+	 * Use this to append a given value to a wpEditor instance.
58
+	 * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
+	 * the value is added to the text area.
60
+	 *
61
+	 * @param $field_reference
62
+	 * @param $value
63
+	 * @throws \Codeception\Exception\ElementNotFound
64
+	 */
65
+	public function appendToWPEditorField($field_reference, $value)
66
+	{
67
+		$this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
+		$this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
+	}
70 70
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/MessagesAdmin.php 1 patch
Indentation   +224 added lines, -224 removed lines patch added patch discarded remove patch
@@ -10,228 +10,228 @@
 block discarded – undo
10 10
  */
11 11
 trait MessagesAdmin
12 12
 {
13
-    /**
14
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
15
-     *                                  a string.
16
-     */
17
-    public function amOnMessagesActivityListTablePage($additional_params = '')
18
-    {
19
-        $this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
-    }
21
-
22
-    /**
23
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
24
-     *                                  a string.
25
-     */
26
-    public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
-    {
28
-        $this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
-    }
30
-
31
-
32
-    /**
33
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
34
-     *                                  a string.
35
-     */
36
-    public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
-    {
38
-        $this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
-    }
40
-
41
-
42
-    /**
43
-     * Directs to message settings page
44
-     */
45
-    public function amOnMessageSettingsPage()
46
-    {
47
-        $this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
-    }
49
-
50
-
51
-    public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
-    {
53
-        $this->actor()->dragAndDrop(
54
-            MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
-            MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
-        );
57
-    }
58
-
59
-
60
-    /**
61
-     * Assumes you are already on the list table page that has the ui for editing the template.
62
-     * @param string $message_type_slug
63
-     * @param string $context [optional] if you want to click directly to the given context in the editor
64
-     */
65
-    public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
-    {
67
-        $this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
-    }
69
-
70
-
71
-    /**
72
-     * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
-     * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
-     *
75
-     * @param int    $expected_occurence_count
76
-     * @param string $text_to_check_for
77
-     * @param string $field
78
-     * @param string $message_type_label
79
-     * @param string $message_status
80
-     * @param string $messenger
81
-     * @param string $context
82
-     */
83
-    public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
-        $expected_occurence_count,
85
-        $text_to_check_for,
86
-        $field,
87
-        $message_type_label,
88
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
-        $messenger = 'Email',
90
-        $context = 'Event Admin'
91
-    ) {
92
-        $elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
-            $field,
94
-            $message_type_label,
95
-            $message_status,
96
-            $messenger,
97
-            $context,
98
-            $text_to_check_for,
99
-            0
100
-        ));
101
-        $actual_count = count($elements);
102
-        $this->actor()->assertEquals(
103
-            $expected_occurence_count,
104
-            $actual_count,
105
-            sprintf(
106
-                'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
-                $expected_occurence_count,
108
-                $text_to_check_for,
109
-                $field,
110
-                $actual_count
111
-            )
112
-        );
113
-    }
114
-
115
-
116
-    /**
117
-     * This will create a custom message template for the given messenger and message type from the context of the
118
-     * default (global) message template list table.
119
-     * Also takes care of verifying the template was created.
120
-     * @param string $message_type_label
121
-     * @param string $messenger_label
122
-     */
123
-    public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
-    {
125
-        $this->amOnDefaultMessageTemplateListTablePage();
126
-        $this->actor()->click(
127
-            MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
-                $message_type_label,
129
-                $messenger_label
130
-            )
131
-        );
132
-        $this->actor()->seeInField('#title', 'New Custom Template');
133
-    }
134
-
135
-
136
-    /**
137
-     * This switches the context of the current messages template to the given reference.
138
-     * @param string $context_reference  This should be the visible label for the option.
139
-     */
140
-    public function switchContextTo($context_reference)
141
-    {
142
-        $this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
-        $this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
-        $this->actor()->waitForText($context_reference, 10, 'h1');
145
-    }
146
-
147
-
148
-    /**
149
-     * This takes care of clicking the View Message icon for the given parameters.
150
-     * Assumes you are already viewing the messages activity list table.
151
-     * @param        $message_type_label
152
-     * @param        $message_status
153
-     * @param string $messenger
154
-     * @param string $context
155
-     * @param int    $number_in_set
156
-     */
157
-    public function viewMessageInMessagesListTableFor(
158
-        $message_type_label,
159
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
-        $messenger = 'Email',
161
-        $context = 'Event Admin',
162
-        $number_in_set = 1
163
-    ) {
164
-        $this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
-            $message_type_label,
166
-            $message_status,
167
-            $messenger,
168
-            $context,
169
-            $number_in_set
170
-        ));
171
-    }
172
-
173
-
174
-    /**
175
-     * Takes care of deleting a message matching the given parameters via the message activity list table.
176
-     * Assumes you are already viewing the messages activity list table.
177
-     * @param        $message_type_label
178
-     * @param        $message_status
179
-     * @param string $messenger
180
-     * @param string $context
181
-     * @param int    $number_in_set
182
-     */
183
-    public function deleteMessageInMessagesListTableFor(
184
-        $message_type_label,
185
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
-        $messenger = 'Email',
187
-        $context = 'Event Admin',
188
-        $number_in_set = 1
189
-    ) {
190
-        $this->actor()->moveMouseOver(
191
-            MessagesPage::messagesActivityListTableCellSelectorFor(
192
-                'to',
193
-                $message_type_label,
194
-                $message_status,
195
-                $messenger,
196
-                $context,
197
-                '',
198
-                $number_in_set
199
-            )
200
-        );
201
-        $this->actor()->click(
202
-            MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
-                $message_type_label,
204
-                $message_status,
205
-                $messenger,
206
-                $context,
207
-                $number_in_set
208
-            )
209
-        );
210
-        $this->actor()->waitForText('successfully deleted');
211
-    }
212
-
213
-
214
-    /**
215
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
216
-     * list table, this will take care of validating the given text is in that window.
217
-     * @param string $text_to_view
218
-     */
219
-    public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
220
-    {
221
-        $this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
222
-        $this->actor()->switchToIframe('message-view-window');
223
-        $should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
224
-        $this->actor()->switchToIframe();
225
-    }
226
-
227
-
228
-    /**
229
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
230
-     * list table, this will take care of validating the given text is NOT that window.
231
-     * @param string $text_to_view
232
-     */
233
-    public function dontSeeTextInViewMessageModal($text_to_view)
234
-    {
235
-        $this->seeTextInViewMessageModal($text_to_view, true);
236
-    }
13
+	/**
14
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
15
+	 *                                  a string.
16
+	 */
17
+	public function amOnMessagesActivityListTablePage($additional_params = '')
18
+	{
19
+		$this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
+	}
21
+
22
+	/**
23
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
24
+	 *                                  a string.
25
+	 */
26
+	public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
+	{
28
+		$this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
+	}
30
+
31
+
32
+	/**
33
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
34
+	 *                                  a string.
35
+	 */
36
+	public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
+	{
38
+		$this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
+	}
40
+
41
+
42
+	/**
43
+	 * Directs to message settings page
44
+	 */
45
+	public function amOnMessageSettingsPage()
46
+	{
47
+		$this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
+	}
49
+
50
+
51
+	public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
+	{
53
+		$this->actor()->dragAndDrop(
54
+			MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
+			MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
+		);
57
+	}
58
+
59
+
60
+	/**
61
+	 * Assumes you are already on the list table page that has the ui for editing the template.
62
+	 * @param string $message_type_slug
63
+	 * @param string $context [optional] if you want to click directly to the given context in the editor
64
+	 */
65
+	public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
+	{
67
+		$this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
+	}
69
+
70
+
71
+	/**
72
+	 * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
+	 * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
+	 *
75
+	 * @param int    $expected_occurence_count
76
+	 * @param string $text_to_check_for
77
+	 * @param string $field
78
+	 * @param string $message_type_label
79
+	 * @param string $message_status
80
+	 * @param string $messenger
81
+	 * @param string $context
82
+	 */
83
+	public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
+		$expected_occurence_count,
85
+		$text_to_check_for,
86
+		$field,
87
+		$message_type_label,
88
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
+		$messenger = 'Email',
90
+		$context = 'Event Admin'
91
+	) {
92
+		$elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
+			$field,
94
+			$message_type_label,
95
+			$message_status,
96
+			$messenger,
97
+			$context,
98
+			$text_to_check_for,
99
+			0
100
+		));
101
+		$actual_count = count($elements);
102
+		$this->actor()->assertEquals(
103
+			$expected_occurence_count,
104
+			$actual_count,
105
+			sprintf(
106
+				'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
+				$expected_occurence_count,
108
+				$text_to_check_for,
109
+				$field,
110
+				$actual_count
111
+			)
112
+		);
113
+	}
114
+
115
+
116
+	/**
117
+	 * This will create a custom message template for the given messenger and message type from the context of the
118
+	 * default (global) message template list table.
119
+	 * Also takes care of verifying the template was created.
120
+	 * @param string $message_type_label
121
+	 * @param string $messenger_label
122
+	 */
123
+	public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
+	{
125
+		$this->amOnDefaultMessageTemplateListTablePage();
126
+		$this->actor()->click(
127
+			MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
+				$message_type_label,
129
+				$messenger_label
130
+			)
131
+		);
132
+		$this->actor()->seeInField('#title', 'New Custom Template');
133
+	}
134
+
135
+
136
+	/**
137
+	 * This switches the context of the current messages template to the given reference.
138
+	 * @param string $context_reference  This should be the visible label for the option.
139
+	 */
140
+	public function switchContextTo($context_reference)
141
+	{
142
+		$this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
+		$this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
+		$this->actor()->waitForText($context_reference, 10, 'h1');
145
+	}
146
+
147
+
148
+	/**
149
+	 * This takes care of clicking the View Message icon for the given parameters.
150
+	 * Assumes you are already viewing the messages activity list table.
151
+	 * @param        $message_type_label
152
+	 * @param        $message_status
153
+	 * @param string $messenger
154
+	 * @param string $context
155
+	 * @param int    $number_in_set
156
+	 */
157
+	public function viewMessageInMessagesListTableFor(
158
+		$message_type_label,
159
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
+		$messenger = 'Email',
161
+		$context = 'Event Admin',
162
+		$number_in_set = 1
163
+	) {
164
+		$this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
+			$message_type_label,
166
+			$message_status,
167
+			$messenger,
168
+			$context,
169
+			$number_in_set
170
+		));
171
+	}
172
+
173
+
174
+	/**
175
+	 * Takes care of deleting a message matching the given parameters via the message activity list table.
176
+	 * Assumes you are already viewing the messages activity list table.
177
+	 * @param        $message_type_label
178
+	 * @param        $message_status
179
+	 * @param string $messenger
180
+	 * @param string $context
181
+	 * @param int    $number_in_set
182
+	 */
183
+	public function deleteMessageInMessagesListTableFor(
184
+		$message_type_label,
185
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
+		$messenger = 'Email',
187
+		$context = 'Event Admin',
188
+		$number_in_set = 1
189
+	) {
190
+		$this->actor()->moveMouseOver(
191
+			MessagesPage::messagesActivityListTableCellSelectorFor(
192
+				'to',
193
+				$message_type_label,
194
+				$message_status,
195
+				$messenger,
196
+				$context,
197
+				'',
198
+				$number_in_set
199
+			)
200
+		);
201
+		$this->actor()->click(
202
+			MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
+				$message_type_label,
204
+				$message_status,
205
+				$messenger,
206
+				$context,
207
+				$number_in_set
208
+			)
209
+		);
210
+		$this->actor()->waitForText('successfully deleted');
211
+	}
212
+
213
+
214
+	/**
215
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
216
+	 * list table, this will take care of validating the given text is in that window.
217
+	 * @param string $text_to_view
218
+	 */
219
+	public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
220
+	{
221
+		$this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
222
+		$this->actor()->switchToIframe('message-view-window');
223
+		$should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
224
+		$this->actor()->switchToIframe();
225
+	}
226
+
227
+
228
+	/**
229
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
230
+	 * list table, this will take care of validating the given text is NOT that window.
231
+	 * @param string $text_to_view
232
+	 */
233
+	public function dontSeeTextInViewMessageModal($text_to_view)
234
+	{
235
+		$this->seeTextInViewMessageModal($text_to_view, true);
236
+	}
237 237
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/EventsAdmin.php 1 patch
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -14,84 +14,84 @@
 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
-    }
17
+	/**
18
+	 * @param string $additional_params
19
+	 */
20
+	public function amOnDefaultEventsListTablePage($additional_params = '')
21
+	{
22
+		$this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
+	}
24 24
 
25 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
-    }
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 33
 
34 34
 
35
-    /**
36
-     * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
-     * First this will search using the given title and then attempt to edit from the results of the search.
38
-     *
39
-     * Assumes actor is already logged in.
40
-     * @param $event_title
41
-     */
42
-    public function amEditingTheEventWithTitle($event_title)
43
-    {
44
-        $this->amOnDefaultEventsListTablePage();
45
-        $this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
-        $this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
-        $this->actor()->waitForText('Displaying search results for');
48
-        $this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
-    }
35
+	/**
36
+	 * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
+	 * First this will search using the given title and then attempt to edit from the results of the search.
38
+	 *
39
+	 * Assumes actor is already logged in.
40
+	 * @param $event_title
41
+	 */
42
+	public function amEditingTheEventWithTitle($event_title)
43
+	{
44
+		$this->amOnDefaultEventsListTablePage();
45
+		$this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
+		$this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
+		$this->actor()->waitForText('Displaying search results for');
48
+		$this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
-     * link for the event in the event list table.
55
-     * Assumes the actor is already logged in and on the Event list table page.
56
-     *
57
-     * @param string $event_title
58
-     */
59
-    public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
-    {
61
-        $this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
-        $this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
-    }
52
+	/**
53
+	 * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
+	 * link for the event in the event list table.
55
+	 * Assumes the actor is already logged in and on the Event list table page.
56
+	 *
57
+	 * @param string $event_title
58
+	 */
59
+	public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
+	{
61
+		$this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
+		$this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
+	}
64 64
 
65 65
 
66
-    /**
67
-     * Use to change the default registration status for the event.
68
-     * Assumes the view is already on the event editor.
69
-     * @param $registration_status
70
-     */
71
-    public function changeDefaultRegistrationStatusTo($registration_status)
72
-    {
73
-        $this->actor()->selectOption(
74
-            EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
75
-            $registration_status
76
-        );
77
-    }
66
+	/**
67
+	 * Use to change the default registration status for the event.
68
+	 * Assumes the view is already on the event editor.
69
+	 * @param $registration_status
70
+	 */
71
+	public function changeDefaultRegistrationStatusTo($registration_status)
72
+	{
73
+		$this->actor()->selectOption(
74
+			EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
75
+			$registration_status
76
+		);
77
+	}
78 78
 
79 79
 
80
-    /**
81
-     * Use this from the context of the event editor to select the given custom template for a given message type and
82
-     * messenger.
83
-     *
84
-     * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
85
-     * @param string $messenger_slug      The slug for the messenger (eg 'email')
86
-     * @param string $custom_template_label The visible label in the select input for the custom template you want
87
-     *                                      selected.
88
-     */
89
-    public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
90
-    {
91
-        $this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
92
-        $this->actor()->selectOption(
93
-            EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
94
-            $custom_template_label
95
-        );
96
-    }
80
+	/**
81
+	 * Use this from the context of the event editor to select the given custom template for a given message type and
82
+	 * messenger.
83
+	 *
84
+	 * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
85
+	 * @param string $messenger_slug      The slug for the messenger (eg 'email')
86
+	 * @param string $custom_template_label The visible label in the select input for the custom template you want
87
+	 *                                      selected.
88
+	 */
89
+	public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
90
+	{
91
+		$this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
92
+		$this->actor()->selectOption(
93
+			EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
94
+			$custom_template_label
95
+		);
96
+	}
97 97
 }
98 98
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Page/CoreAdmin.php 2 patches
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -13,84 +13,84 @@
 block discarded – undo
13 13
 class CoreAdmin
14 14
 {
15 15
 
16
-    /**
17
-     * @var string
18
-     */
19
-    const URL_PREFIX = 'admin.php?page=';
20
-
21
-
22
-    /**
23
-     * This is the selector for the next page button on list tables.
24
-     * @var string
25
-     */
26
-    const ADMIN_LIST_TABLE_NEXT_PAGE_CLASS = '.next-page';
27
-
28
-
29
-    /**
30
-     * The selector for the search input submit button on list table pages
31
-     * @var string
32
-     */
33
-    const LIST_TABLE_SEARCH_SUBMIT_SELECTOR = '#search-submit';
34
-
35
-
36
-    /**
37
-     * Selector for the screen options dropdown.
38
-     * @var string
39
-     */
40
-    const WP_SCREEN_SETTINGS_LINK_SELECTOR = '#show-settings-link';
41
-
42
-
43
-    /**
44
-     * Selector for the per page field setting selector (found within screen options dropdown)
45
-     * @var string
46
-     */
47
-    const WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR = '.screen-per-page';
48
-
49
-
50
-    /**
51
-     * Selector for apply screen options settings.
52
-     * @var string
53
-     */
54
-    const WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR = '#screen-options-apply';
55
-
56
-
57
-    /**
58
-     * Get the EE admin url for the given properties.
59
-     * Note, this is JUST the endpoint for the admin route.  It is expected that the actor/test would be calling this
60
-     * with `amOnAdminPage` action.
61
-     *
62
-     * @param string $page
63
-     * @param string $action
64
-     * @param string $additional_params
65
-     * @return string
66
-     */
67
-    public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68
-    {
69
-        $url = self::URL_PREFIX . $page;
70
-        $url .= $action ? '&action=' . $action : '';
71
-        $url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
72
-        return $url;
73
-    }
74
-
75
-
76
-    /**
77
-     * Returns the selector for the text tab switcher for a wp-editor instance.
78
-     * @param $field_reference
79
-     * @return string
80
-     */
81
-    public static function wpEditorTextTabSelector($field_reference)
82
-    {
83
-        return '#content-' . $field_reference . '-content-html';
84
-    }
85
-
86
-
87
-    /**
88
-     * Returns the selector for the textarea exposed when clicing the text tab switcher for a wp-editor instance.
89
-     * @param $field_reference
90
-     * @return string
91
-     */
92
-    public static function wpEditorTextAreaSelector($field_reference)
93
-    {
94
-        return '#content-' . $field_reference . '-content';
95
-    }
16
+	/**
17
+	 * @var string
18
+	 */
19
+	const URL_PREFIX = 'admin.php?page=';
20
+
21
+
22
+	/**
23
+	 * This is the selector for the next page button on list tables.
24
+	 * @var string
25
+	 */
26
+	const ADMIN_LIST_TABLE_NEXT_PAGE_CLASS = '.next-page';
27
+
28
+
29
+	/**
30
+	 * The selector for the search input submit button on list table pages
31
+	 * @var string
32
+	 */
33
+	const LIST_TABLE_SEARCH_SUBMIT_SELECTOR = '#search-submit';
34
+
35
+
36
+	/**
37
+	 * Selector for the screen options dropdown.
38
+	 * @var string
39
+	 */
40
+	const WP_SCREEN_SETTINGS_LINK_SELECTOR = '#show-settings-link';
41
+
42
+
43
+	/**
44
+	 * Selector for the per page field setting selector (found within screen options dropdown)
45
+	 * @var string
46
+	 */
47
+	const WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR = '.screen-per-page';
48
+
49
+
50
+	/**
51
+	 * Selector for apply screen options settings.
52
+	 * @var string
53
+	 */
54
+	const WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR = '#screen-options-apply';
55
+
56
+
57
+	/**
58
+	 * Get the EE admin url for the given properties.
59
+	 * Note, this is JUST the endpoint for the admin route.  It is expected that the actor/test would be calling this
60
+	 * with `amOnAdminPage` action.
61
+	 *
62
+	 * @param string $page
63
+	 * @param string $action
64
+	 * @param string $additional_params
65
+	 * @return string
66
+	 */
67
+	public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68
+	{
69
+		$url = self::URL_PREFIX . $page;
70
+		$url .= $action ? '&action=' . $action : '';
71
+		$url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
72
+		return $url;
73
+	}
74
+
75
+
76
+	/**
77
+	 * Returns the selector for the text tab switcher for a wp-editor instance.
78
+	 * @param $field_reference
79
+	 * @return string
80
+	 */
81
+	public static function wpEditorTextTabSelector($field_reference)
82
+	{
83
+		return '#content-' . $field_reference . '-content-html';
84
+	}
85
+
86
+
87
+	/**
88
+	 * Returns the selector for the textarea exposed when clicing the text tab switcher for a wp-editor instance.
89
+	 * @param $field_reference
90
+	 * @return string
91
+	 */
92
+	public static function wpEditorTextAreaSelector($field_reference)
93
+	{
94
+		return '#content-' . $field_reference . '-content';
95
+	}
96 96
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -66,9 +66,9 @@  discard block
 block discarded – undo
66 66
      */
67 67
     public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68 68
     {
69
-        $url = self::URL_PREFIX . $page;
70
-        $url .= $action ? '&action=' . $action : '';
71
-        $url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
69
+        $url = self::URL_PREFIX.$page;
70
+        $url .= $action ? '&action='.$action : '';
71
+        $url .= $additional_params ? '&'.ltrim('&', ltrim('?', $additional_params)) : '';
72 72
         return $url;
73 73
     }
74 74
 
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
      */
81 81
     public static function wpEditorTextTabSelector($field_reference)
82 82
     {
83
-        return '#content-' . $field_reference . '-content-html';
83
+        return '#content-'.$field_reference.'-content-html';
84 84
     }
85 85
 
86 86
 
@@ -91,6 +91,6 @@  discard block
 block discarded – undo
91 91
      */
92 92
     public static function wpEditorTextAreaSelector($field_reference)
93 93
     {
94
-        return '#content-' . $field_reference . '-content';
94
+        return '#content-'.$field_reference.'-content';
95 95
     }
96 96
 }
Please login to merge, or discard this patch.
acceptance_tests/Page/MessagesAdmin.php 1 patch
Indentation   +243 added lines, -243 removed lines patch added patch discarded remove patch
@@ -12,255 +12,255 @@
 block discarded – undo
12 12
 class MessagesAdmin extends CoreAdmin
13 13
 {
14 14
 
15
-    /**
16
-     * Context slug for the admin messages context.
17
-     * @var string
18
-     */
19
-    const ADMIN_CONTEXT_SLUG = 'admin';
15
+	/**
16
+	 * Context slug for the admin messages context.
17
+	 * @var string
18
+	 */
19
+	const ADMIN_CONTEXT_SLUG = 'admin';
20 20
 
21
-    /**
22
-     * Context slug for the primary attendee messages context
23
-     * @var string
24
-     */
25
-    const PRIMARY_ATTENDEE_CONTEXT_SLUG = 'primary_attendee';
21
+	/**
22
+	 * Context slug for the primary attendee messages context
23
+	 * @var string
24
+	 */
25
+	const PRIMARY_ATTENDEE_CONTEXT_SLUG = 'primary_attendee';
26 26
 
27 27
 
28
-    /**
29
-     * Status reference for the EEM_Message::status_sent status.
30
-     * @var string
31
-     */
32
-    const MESSAGE_STATUS_SENT = 'MSN';
28
+	/**
29
+	 * Status reference for the EEM_Message::status_sent status.
30
+	 * @var string
31
+	 */
32
+	const MESSAGE_STATUS_SENT = 'MSN';
33 33
 
34 34
 
35
-    /**
36
-     * Message type slug for the Payment Failed message type
37
-     */
38
-    const PAYMENT_FAILED_MESSAGE_TYPE_SLUG = 'payment_failed';
35
+	/**
36
+	 * Message type slug for the Payment Failed message type
37
+	 */
38
+	const PAYMENT_FAILED_MESSAGE_TYPE_SLUG = 'payment_failed';
39 39
 
40 40
 
41
-    /**
42
-     * Selector for the Global Messages "Send on same request" field in the Messages Settings tab.
43
-     * @var string
44
-     */
45
-    const GLOBAL_MESSAGES_SETTINGS_ON_REQUEST_SELECTION_SELECTOR =
46
-        '#global_messages_settings-do-messages-on-same-request';
47
-
41
+	/**
42
+	 * Selector for the Global Messages "Send on same request" field in the Messages Settings tab.
43
+	 * @var string
44
+	 */
45
+	const GLOBAL_MESSAGES_SETTINGS_ON_REQUEST_SELECTION_SELECTOR =
46
+		'#global_messages_settings-do-messages-on-same-request';
47
+
48 48
 
49
-    /**
50
-     * Selector for the Global Messages Settings submit button in the Messages Settings tab.
51
-     * @var string
52
-     */
53
-    const GLOBAL_MESSAGES_SETTINGS_SUBMIT_SELECTOR = '#global_messages_settings-update-settings-submit';
54
-
55
-
56
-    /**
57
-     * This is the container where active message types for a messenger are found/dragged to.
58
-     * @var string
59
-     */
60
-    const MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR = '#active-message-types';
61
-
62
-
63
-    /**
64
-     * Locator for the context switcher selector on the Message Template Editor page.
65
-     * @var string
66
-     */
67
-    const MESSAGES_CONTEXT_SWITCHER_SELECTOR = "//form[@id='ee-msg-context-switcher-frm']/select";
68
-
69
-
70
-    /**
71
-     * Locator for the context switcher submit button in the Message Template Editor page.
72
-     * @var string
73
-     */
74
-    const MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR = "#submit-msg-context-switcher-sbmt";
75
-
76
-
77
-    /**
78
-     * Locator for the dialog container used for housing viewed messages in the message activity list table.
79
-     * @var string
80
-     */
81
-    const MESSAGES_LIST_TABLE_VIEW_MESSAGE_DIALOG_CONTAINER_SELECTOR = '.ee-admin-dialog-container-inner-content';
82
-
83
-
84
-
85
-    /**
86
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
87
-     *                                  a string.
88
-     * @return string
89
-     */
90
-    public static function messageActivityListTableUrl($additional_params = '')
91
-    {
92
-        return self::adminUrl('espresso_messages', 'default', $additional_params);
93
-    }
94
-
95
-
96
-    /**
97
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
98
-     *                                  a string.
99
-     * @return string
100
-     */
101
-    public static function defaultMessageTemplateListTableUrl($additional_params = '')
102
-    {
103
-        return self::adminUrl('espresso_messages', 'global_mtps', $additional_params);
104
-    }
105
-
106
-
107
-    /**
108
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
109
-     *                                  a string.
110
-     * @return string
111
-     */
112
-    public static function customMessageTemplateListTableUrl($additional_params = '')
113
-    {
114
-        return self::adminUrl('espresso_messages', 'custom_mtps', $additional_params);
115
-    }
116
-
117
-
118
-    /**
119
-     * @return string
120
-     */
121
-    public static function messageSettingsUrl()
122
-    {
123
-        return self::adminUrl('espresso_messages', 'settings');
124
-    }
125
-
126
-
127
-
128
-    public static function draggableSettingsBoxSelectorForMessageTypeAndMessenger(
129
-        $message_type_slug,
130
-        $messenger_slug = 'email'
131
-    ) {
132
-        return "#$message_type_slug-messagetype-$messenger_slug";
133
-    }
134
-
135
-
136
-    /**
137
-     * @param string $message_type_slug
138
-     * @param string $context
139
-     * @return string
140
-     */
141
-    public static function editMessageTemplateClassByMessageType($message_type_slug, $context = '')
142
-    {
143
-        return $context
144
-            ? '.' . $message_type_slug . '-' . $context . '-edit-link'
145
-            : '.' . $message_type_slug . '-edit-link';
146
-    }
147
-
148
-
149
-    /**
150
-     * Selector for (a) specific table cell(s) in the Messages Activity list table for the given parameters.
151
-     *
152
-     * @param        $field
153
-     * @param        $message_type_label
154
-     * @param string $message_status
155
-     * @param string $messenger
156
-     * @param string $context
157
-     * @param string $table_cell_content_for_field
158
-     * @param int    $number_in_set   It's possible that the given parameters could match multiple items in the view.
159
-     *                                This allows you to indicate which item from the set to match.  If this is set to 0
160
-     *                                then all matches for the locator will be returned.
161
-     * @return string
162
-     */
163
-    public static function messagesActivityListTableCellSelectorFor(
164
-        $field,
165
-        $message_type_label,
166
-        $message_status = self::MESSAGE_STATUS_SENT,
167
-        $messenger = 'Email',
168
-        $context = 'Event Admin',
169
-        $table_cell_content_for_field = '',
170
-        $number_in_set = 1
171
-    ) {
172
-        $selector = $number_in_set > 0 ? '(' : '';
173
-        $selector .= "//tr[contains(@class, 'msg-status-$message_status')]"
174
-                     . "//td[contains(@class, 'message_type') and text()='$message_type_label']";
175
-        if ($messenger) {
176
-            $selector .= "/ancestor::tr/td[contains(@class, 'messenger') and text()='$messenger']";
177
-        }
178
-        $selector .= "/ancestor::tr/td[contains(@class, 'column-context') and text()='$context']";
179
-        $selector .= $table_cell_content_for_field
180
-            ? "/ancestor::tr/td[contains(@class, 'column-$field') and text()='$table_cell_content_for_field']"
181
-            : "/ancestor::tr/td[contains(@class, 'column-$field')]";
182
-        $selector .= $number_in_set > 0 ? ")[$number_in_set]" : '';
183
-        return $selector;
184
-    }
185
-
186
-
187
-    /**
188
-     * Selector for the Create Custom button found in the message template list table.
189
-     * @param string $message_type_label
190
-     * @param string $messenger_label
191
-     * @return string
192
-     */
193
-    public static function createCustomButtonForMessageTypeAndMessenger($message_type_label, $messenger_label)
194
-    {
195
-        $selector = "//tr/td[contains(@class, 'message_type') and text()='$message_type_label']"
196
-                    . "//ancestor::tr/td[contains(@class, 'messenger') and contains(., '$messenger_label')]"
197
-                    . "//ancestor::tr/td/a[@class='button button-small']";
198
-        return $selector;
199
-    }
200
-
201
-
202
-    /**
203
-     * Note, this could potentially match multiple buttons in the view so the selector is intentionally restricted to
204
-     * the FIRST match (which will be the latest message sent if the table is default sorted).
205
-     *
206
-     * @param string $message_type_label    The visible message type label for the row you want to match
207
-     * @param string $message_status        The status of the message for the row you want to match.
208
-     * @param string $messenger             The visible messenger label for the row you want to match.
209
-     * @param string $context               The visible context label for the row you want to match.
210
-     * @param int    $number_in_set         It's possible that the given parameters could match multiple items in the
211
-     *                                      view. This allows you to indicate which item from the set to match.
212
-     * @return string
213
-     */
214
-    public static function messagesActivityListTableViewButtonSelectorFor(
215
-        $message_type_label,
216
-        $message_status = self::MESSAGE_STATUS_SENT,
217
-        $messenger = 'Email',
218
-        $context = 'Event Admin',
219
-        $number_in_set = 1
220
-    ) {
221
-        $selector = self::messagesActivityListTableCellSelectorFor(
222
-            'action',
223
-            $message_type_label,
224
-            $message_status,
225
-            $messenger,
226
-            $context,
227
-            '',
228
-            $number_in_set
229
-        );
230
-        $selector .= "/a/span[contains(@class, 'ee-message-action-link-view')"
231
-                     . " and not(contains(@class, 'ee-message-action-link-view_transaction'))]";
232
-        return $selector;
233
-    }
234
-
235
-
236
-
237
-    /**
238
-     * Locator for the delete action link for a message item in the message activity list table.
239
-     * Note: The link is not visible by default, so the column would need hovered over for the link to appear.
240
-     * @param        $message_type_label
241
-     * @param string $message_status
242
-     * @param string $messenger
243
-     * @param string $context
244
-     * @param int    $number_in_set
245
-     * @return string
246
-     */
247
-    public static function messagesActivityListTableDeleteActionSelectorFor(
248
-        $message_type_label,
249
-        $message_status = self::MESSAGE_STATUS_SENT,
250
-        $messenger = 'Email',
251
-        $context = 'Event Admin',
252
-        $number_in_set = 1
253
-    ) {
254
-        $selector = self::messagesActivityListTableCellSelectorFor(
255
-            'to',
256
-            $message_type_label,
257
-            $message_status,
258
-            $messenger,
259
-            $context,
260
-            '',
261
-            $number_in_set
262
-        );
263
-        $selector .= "/div/span[@class='delete']/a";
264
-        return $selector;
265
-    }
49
+	/**
50
+	 * Selector for the Global Messages Settings submit button in the Messages Settings tab.
51
+	 * @var string
52
+	 */
53
+	const GLOBAL_MESSAGES_SETTINGS_SUBMIT_SELECTOR = '#global_messages_settings-update-settings-submit';
54
+
55
+
56
+	/**
57
+	 * This is the container where active message types for a messenger are found/dragged to.
58
+	 * @var string
59
+	 */
60
+	const MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR = '#active-message-types';
61
+
62
+
63
+	/**
64
+	 * Locator for the context switcher selector on the Message Template Editor page.
65
+	 * @var string
66
+	 */
67
+	const MESSAGES_CONTEXT_SWITCHER_SELECTOR = "//form[@id='ee-msg-context-switcher-frm']/select";
68
+
69
+
70
+	/**
71
+	 * Locator for the context switcher submit button in the Message Template Editor page.
72
+	 * @var string
73
+	 */
74
+	const MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR = "#submit-msg-context-switcher-sbmt";
75
+
76
+
77
+	/**
78
+	 * Locator for the dialog container used for housing viewed messages in the message activity list table.
79
+	 * @var string
80
+	 */
81
+	const MESSAGES_LIST_TABLE_VIEW_MESSAGE_DIALOG_CONTAINER_SELECTOR = '.ee-admin-dialog-container-inner-content';
82
+
83
+
84
+
85
+	/**
86
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
87
+	 *                                  a string.
88
+	 * @return string
89
+	 */
90
+	public static function messageActivityListTableUrl($additional_params = '')
91
+	{
92
+		return self::adminUrl('espresso_messages', 'default', $additional_params);
93
+	}
94
+
95
+
96
+	/**
97
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
98
+	 *                                  a string.
99
+	 * @return string
100
+	 */
101
+	public static function defaultMessageTemplateListTableUrl($additional_params = '')
102
+	{
103
+		return self::adminUrl('espresso_messages', 'global_mtps', $additional_params);
104
+	}
105
+
106
+
107
+	/**
108
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
109
+	 *                                  a string.
110
+	 * @return string
111
+	 */
112
+	public static function customMessageTemplateListTableUrl($additional_params = '')
113
+	{
114
+		return self::adminUrl('espresso_messages', 'custom_mtps', $additional_params);
115
+	}
116
+
117
+
118
+	/**
119
+	 * @return string
120
+	 */
121
+	public static function messageSettingsUrl()
122
+	{
123
+		return self::adminUrl('espresso_messages', 'settings');
124
+	}
125
+
126
+
127
+
128
+	public static function draggableSettingsBoxSelectorForMessageTypeAndMessenger(
129
+		$message_type_slug,
130
+		$messenger_slug = 'email'
131
+	) {
132
+		return "#$message_type_slug-messagetype-$messenger_slug";
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param string $message_type_slug
138
+	 * @param string $context
139
+	 * @return string
140
+	 */
141
+	public static function editMessageTemplateClassByMessageType($message_type_slug, $context = '')
142
+	{
143
+		return $context
144
+			? '.' . $message_type_slug . '-' . $context . '-edit-link'
145
+			: '.' . $message_type_slug . '-edit-link';
146
+	}
147
+
148
+
149
+	/**
150
+	 * Selector for (a) specific table cell(s) in the Messages Activity list table for the given parameters.
151
+	 *
152
+	 * @param        $field
153
+	 * @param        $message_type_label
154
+	 * @param string $message_status
155
+	 * @param string $messenger
156
+	 * @param string $context
157
+	 * @param string $table_cell_content_for_field
158
+	 * @param int    $number_in_set   It's possible that the given parameters could match multiple items in the view.
159
+	 *                                This allows you to indicate which item from the set to match.  If this is set to 0
160
+	 *                                then all matches for the locator will be returned.
161
+	 * @return string
162
+	 */
163
+	public static function messagesActivityListTableCellSelectorFor(
164
+		$field,
165
+		$message_type_label,
166
+		$message_status = self::MESSAGE_STATUS_SENT,
167
+		$messenger = 'Email',
168
+		$context = 'Event Admin',
169
+		$table_cell_content_for_field = '',
170
+		$number_in_set = 1
171
+	) {
172
+		$selector = $number_in_set > 0 ? '(' : '';
173
+		$selector .= "//tr[contains(@class, 'msg-status-$message_status')]"
174
+					 . "//td[contains(@class, 'message_type') and text()='$message_type_label']";
175
+		if ($messenger) {
176
+			$selector .= "/ancestor::tr/td[contains(@class, 'messenger') and text()='$messenger']";
177
+		}
178
+		$selector .= "/ancestor::tr/td[contains(@class, 'column-context') and text()='$context']";
179
+		$selector .= $table_cell_content_for_field
180
+			? "/ancestor::tr/td[contains(@class, 'column-$field') and text()='$table_cell_content_for_field']"
181
+			: "/ancestor::tr/td[contains(@class, 'column-$field')]";
182
+		$selector .= $number_in_set > 0 ? ")[$number_in_set]" : '';
183
+		return $selector;
184
+	}
185
+
186
+
187
+	/**
188
+	 * Selector for the Create Custom button found in the message template list table.
189
+	 * @param string $message_type_label
190
+	 * @param string $messenger_label
191
+	 * @return string
192
+	 */
193
+	public static function createCustomButtonForMessageTypeAndMessenger($message_type_label, $messenger_label)
194
+	{
195
+		$selector = "//tr/td[contains(@class, 'message_type') and text()='$message_type_label']"
196
+					. "//ancestor::tr/td[contains(@class, 'messenger') and contains(., '$messenger_label')]"
197
+					. "//ancestor::tr/td/a[@class='button button-small']";
198
+		return $selector;
199
+	}
200
+
201
+
202
+	/**
203
+	 * Note, this could potentially match multiple buttons in the view so the selector is intentionally restricted to
204
+	 * the FIRST match (which will be the latest message sent if the table is default sorted).
205
+	 *
206
+	 * @param string $message_type_label    The visible message type label for the row you want to match
207
+	 * @param string $message_status        The status of the message for the row you want to match.
208
+	 * @param string $messenger             The visible messenger label for the row you want to match.
209
+	 * @param string $context               The visible context label for the row you want to match.
210
+	 * @param int    $number_in_set         It's possible that the given parameters could match multiple items in the
211
+	 *                                      view. This allows you to indicate which item from the set to match.
212
+	 * @return string
213
+	 */
214
+	public static function messagesActivityListTableViewButtonSelectorFor(
215
+		$message_type_label,
216
+		$message_status = self::MESSAGE_STATUS_SENT,
217
+		$messenger = 'Email',
218
+		$context = 'Event Admin',
219
+		$number_in_set = 1
220
+	) {
221
+		$selector = self::messagesActivityListTableCellSelectorFor(
222
+			'action',
223
+			$message_type_label,
224
+			$message_status,
225
+			$messenger,
226
+			$context,
227
+			'',
228
+			$number_in_set
229
+		);
230
+		$selector .= "/a/span[contains(@class, 'ee-message-action-link-view')"
231
+					 . " and not(contains(@class, 'ee-message-action-link-view_transaction'))]";
232
+		return $selector;
233
+	}
234
+
235
+
236
+
237
+	/**
238
+	 * Locator for the delete action link for a message item in the message activity list table.
239
+	 * Note: The link is not visible by default, so the column would need hovered over for the link to appear.
240
+	 * @param        $message_type_label
241
+	 * @param string $message_status
242
+	 * @param string $messenger
243
+	 * @param string $context
244
+	 * @param int    $number_in_set
245
+	 * @return string
246
+	 */
247
+	public static function messagesActivityListTableDeleteActionSelectorFor(
248
+		$message_type_label,
249
+		$message_status = self::MESSAGE_STATUS_SENT,
250
+		$messenger = 'Email',
251
+		$context = 'Event Admin',
252
+		$number_in_set = 1
253
+	) {
254
+		$selector = self::messagesActivityListTableCellSelectorFor(
255
+			'to',
256
+			$message_type_label,
257
+			$message_status,
258
+			$messenger,
259
+			$context,
260
+			'',
261
+			$number_in_set
262
+		);
263
+		$selector .= "/div/span[@class='delete']/a";
264
+		return $selector;
265
+	}
266 266
 }
267 267
\ No newline at end of file
Please login to merge, or discard this patch.
core/EE_System.core.php 2 patches
Indentation   +1432 added lines, -1432 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
 use EventEspresso\core\services\shortcodes\ShortcodesManager;
5 5
 
6 6
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
7
-    exit('No direct script access allowed');
7
+	exit('No direct script access allowed');
8 8
 }
9 9
 
10 10
 
@@ -21,1437 +21,1437 @@  discard block
 block discarded – undo
21 21
 {
22 22
 
23 23
 
24
-    /**
25
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
26
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
27
-     */
28
-    const req_type_normal = 0;
29
-
30
-    /**
31
-     * Indicates this is a brand new installation of EE so we should install
32
-     * tables and default data etc
33
-     */
34
-    const req_type_new_activation = 1;
35
-
36
-    /**
37
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
38
-     * and we just exited maintenance mode). We MUST check the database is setup properly
39
-     * and that default data is setup too
40
-     */
41
-    const req_type_reactivation = 2;
42
-
43
-    /**
44
-     * indicates that EE has been upgraded since its previous request.
45
-     * We may have data migration scripts to call and will want to trigger maintenance mode
46
-     */
47
-    const req_type_upgrade = 3;
48
-
49
-    /**
50
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
51
-     */
52
-    const req_type_downgrade = 4;
53
-
54
-    /**
55
-     * @deprecated since version 4.6.0.dev.006
56
-     * Now whenever a new_activation is detected the request type is still just
57
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
58
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
59
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
60
-     * (Specifically, when the migration manager indicates migrations are finished
61
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
62
-     */
63
-    const req_type_activation_but_not_installed = 5;
64
-
65
-    /**
66
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
67
-     */
68
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
69
-
70
-
71
-    /**
72
-     *    instance of the EE_System object
73
-     *
74
-     * @var    $_instance
75
-     * @access    private
76
-     */
77
-    private static $_instance = null;
78
-
79
-    /**
80
-     * @type  EE_Registry $Registry
81
-     * @access    protected
82
-     */
83
-    protected $registry;
84
-
85
-    /**
86
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
87
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
88
-     *
89
-     * @var int
90
-     */
91
-    private $_req_type;
92
-
93
-    /**
94
-     * Whether or not there was a non-micro version change in EE core version during this request
95
-     *
96
-     * @var boolean
97
-     */
98
-    private $_major_version_change = false;
99
-
100
-
101
-
102
-    /**
103
-     * @singleton method used to instantiate class object
104
-     * @access    public
105
-     * @param  \EE_Registry $Registry
106
-     * @return \EE_System
107
-     */
108
-    public static function instance(EE_Registry $Registry = null)
109
-    {
110
-        // check if class object is instantiated
111
-        if ( ! self::$_instance instanceof EE_System) {
112
-            self::$_instance = new self($Registry);
113
-        }
114
-        return self::$_instance;
115
-    }
116
-
117
-
118
-
119
-    /**
120
-     * resets the instance and returns it
121
-     *
122
-     * @return EE_System
123
-     */
124
-    public static function reset()
125
-    {
126
-        self::$_instance->_req_type = null;
127
-        //make sure none of the old hooks are left hanging around
128
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
129
-        //we need to reset the migration manager in order for it to detect DMSs properly
130
-        EE_Data_Migration_Manager::reset();
131
-        self::instance()->detect_activations_or_upgrades();
132
-        self::instance()->perform_activations_upgrades_and_migrations();
133
-        return self::instance();
134
-    }
135
-
136
-
137
-
138
-    /**
139
-     *    sets hooks for running rest of system
140
-     *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
141
-     *    starting EE Addons from any other point may lead to problems
142
-     *
143
-     * @access private
144
-     * @param  \EE_Registry $Registry
145
-     */
146
-    private function __construct(EE_Registry $Registry)
147
-    {
148
-        $this->registry = $Registry;
149
-        do_action('AHEE__EE_System__construct__begin', $this);
150
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
151
-        add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
152
-        // when an ee addon is activated, we want to call the core hook(s) again
153
-        // because the newly-activated addon didn't get a chance to run at all
154
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
155
-        // detect whether install or upgrade
156
-        add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
157
-            3);
158
-        // load EE_Config, EE_Textdomain, etc
159
-        add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
160
-        // load EE_Config, EE_Textdomain, etc
161
-        add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
162
-            array($this, 'register_shortcodes_modules_and_widgets'), 7);
163
-        // you wanna get going? I wanna get going... let's get going!
164
-        add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
165
-        //other housekeeping
166
-        //exclude EE critical pages from wp_list_pages
167
-        add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
168
-        // ALL EE Addons should use the following hook point to attach their initial setup too
169
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when
170
-        // the EE_Config loads
171
-        do_action('AHEE__EE_System__construct__complete', $this);
172
-    }
173
-
174
-
175
-    /**
176
-     * load_espresso_addons
177
-     * allow addons to load first so that they can set hooks for running DMS's, etc
178
-     * this is hooked into both:
179
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
180
-     *        which runs during the WP 'plugins_loaded' action at priority 5
181
-     *    and the WP 'activate_plugin' hookpoint
182
-     *
183
-     * @access public
184
-     * @return void
185
-     * @throws EE_Error
186
-     * @throws \EventEspresso\core\exceptions\InvalidExecutionPathException
187
-     */
188
-    public function load_espresso_addons()
189
-    {
190
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
191
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
192
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
193
-        //load and setup EE_Capabilities
194
-        $this->registry->load_core('Capabilities');
195
-
196
-        do_action('AHEE__EE_System__load_espresso_addons');
197
-        //if the WP API basic auth plugin isn't already loaded, load it now.
198
-        //We want it for mobile apps. Just include the entire plugin
199
-        //also, don't load the basic auth when a plugin is getting activated, because
200
-        //it could be the basic auth plugin, and it doesn't check if its methods are already defined
201
-        //and causes a fatal error
202
-        if ( ! function_exists('json_basic_auth_handler')
203
-             && ! function_exists('json_basic_auth_error')
204
-             && ! (
205
-                isset($_GET['action'])
206
-                && in_array($_GET['action'], array('activate', 'activate-selected'))
207
-            )
208
-             && ! (
209
-                isset($_GET['activate'])
210
-                && $_GET['activate'] === 'true'
211
-            )
212
-        ) {
213
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
214
-        }
215
-        $this->_maybe_brew_regular();
216
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
217
-        $this->registry->CAP->init_caps();
218
-    }
219
-
220
-
221
-
222
-    /**
223
-     * detect_activations_or_upgrades
224
-     * Checks for activation or upgrade of core first;
225
-     * then also checks if any registered addons have been activated or upgraded
226
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
227
-     * which runs during the WP 'plugins_loaded' action at priority 3
228
-     *
229
-     * @access public
230
-     * @return void
231
-     */
232
-    public function detect_activations_or_upgrades()
233
-    {
234
-        //first off: let's make sure to handle core
235
-        $this->detect_if_activation_or_upgrade();
236
-        foreach ($this->registry->addons as $addon) {
237
-            //detect teh request type for that addon
238
-            $addon->detect_activation_or_upgrade();
239
-        }
240
-    }
241
-
242
-
243
-
244
-    /**
245
-     * detect_if_activation_or_upgrade
246
-     * Takes care of detecting whether this is a brand new install or code upgrade,
247
-     * and either setting up the DB or setting up maintenance mode etc.
248
-     *
249
-     * @access public
250
-     * @return void
251
-     */
252
-    public function detect_if_activation_or_upgrade()
253
-    {
254
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
255
-        // load M-Mode class
256
-        $this->registry->load_core('Maintenance_Mode');
257
-        // check if db has been updated, or if its a brand-new installation
258
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
259
-        $request_type = $this->detect_req_type($espresso_db_update);
260
-        //EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
261
-        switch ($request_type) {
262
-            case EE_System::req_type_new_activation:
263
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
264
-                $this->_handle_core_version_change($espresso_db_update);
265
-                break;
266
-            case EE_System::req_type_reactivation:
267
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
268
-                $this->_handle_core_version_change($espresso_db_update);
269
-                break;
270
-            case EE_System::req_type_upgrade:
271
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
272
-                //migrations may be required now that we've upgraded
273
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
274
-                $this->_handle_core_version_change($espresso_db_update);
275
-                //				echo "done upgrade";die;
276
-                break;
277
-            case EE_System::req_type_downgrade:
278
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
279
-                //its possible migrations are no longer required
280
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
281
-                $this->_handle_core_version_change($espresso_db_update);
282
-                break;
283
-            case EE_System::req_type_normal:
284
-            default:
285
-                //				$this->_maybe_redirect_to_ee_about();
286
-                break;
287
-        }
288
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
289
-    }
290
-
291
-
292
-
293
-    /**
294
-     * Updates the list of installed versions and sets hooks for
295
-     * initializing the database later during the request
296
-     *
297
-     * @param array $espresso_db_update
298
-     */
299
-    protected function _handle_core_version_change($espresso_db_update)
300
-    {
301
-        $this->update_list_of_installed_versions($espresso_db_update);
302
-        //get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
303
-        add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
304
-            array($this, 'initialize_db_if_no_migrations_required'));
305
-    }
306
-
307
-
308
-
309
-    /**
310
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
311
-     * information about what versions of EE have been installed and activated,
312
-     * NOT necessarily the state of the database
313
-     *
314
-     * @param null $espresso_db_update
315
-     * @internal param array $espresso_db_update_value the value of the WordPress option. If not supplied, fetches it
316
-     *           from the options table
317
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
318
-     */
319
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
320
-    {
321
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
322
-        if ( ! $espresso_db_update) {
323
-            $espresso_db_update = get_option('espresso_db_update');
324
-        }
325
-        // check that option is an array
326
-        if ( ! is_array($espresso_db_update)) {
327
-            // if option is FALSE, then it never existed
328
-            if ($espresso_db_update === false) {
329
-                // make $espresso_db_update an array and save option with autoload OFF
330
-                $espresso_db_update = array();
331
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
332
-            } else {
333
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
334
-                $espresso_db_update = array($espresso_db_update => array());
335
-                update_option('espresso_db_update', $espresso_db_update);
336
-            }
337
-        } else {
338
-            $corrected_db_update = array();
339
-            //if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
340
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
341
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
342
-                    //the key is an int, and the value IS NOT an array
343
-                    //so it must be numerically-indexed, where values are versions installed...
344
-                    //fix it!
345
-                    $version_string = $should_be_array;
346
-                    $corrected_db_update[$version_string] = array('unknown-date');
347
-                } else {
348
-                    //ok it checks out
349
-                    $corrected_db_update[$should_be_version_string] = $should_be_array;
350
-                }
351
-            }
352
-            $espresso_db_update = $corrected_db_update;
353
-            update_option('espresso_db_update', $espresso_db_update);
354
-        }
355
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
356
-        return $espresso_db_update;
357
-    }
358
-
359
-
360
-    /**
361
-     * Does the traditional work of setting up the plugin's database and adding default data.
362
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
363
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
364
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
365
-     * so that it will be done when migrations are finished
366
-     *
367
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
368
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
369
-     *                                       This is a resource-intensive job
370
-     *                                       so we prefer to only do it when necessary
371
-     * @return void
372
-     * @throws EE_Error
373
-     */
374
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
375
-    {
376
-        $request_type = $this->detect_req_type();
377
-        //only initialize system if we're not in maintenance mode.
378
-        if (EE_Maintenance_Mode::instance()->level() != EE_Maintenance_Mode::level_2_complete_maintenance) {
379
-            update_option('ee_flush_rewrite_rules', true);
380
-            if ($verify_schema) {
381
-                EEH_Activation::initialize_db_and_folders();
382
-            }
383
-            EEH_Activation::initialize_db_content();
384
-            EEH_Activation::system_initialization();
385
-            if ($initialize_addons_too) {
386
-                $this->initialize_addons();
387
-            }
388
-        } else {
389
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
390
-        }
391
-        if ($request_type === EE_System::req_type_new_activation
392
-            || $request_type === EE_System::req_type_reactivation
393
-            || (
394
-                $request_type === EE_System::req_type_upgrade
395
-                && $this->is_major_version_change()
396
-            )
397
-        ) {
398
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
399
-        }
400
-    }
401
-
402
-
403
-
404
-    /**
405
-     * Initializes the db for all registered addons
406
-     */
407
-    public function initialize_addons()
408
-    {
409
-        //foreach registered addon, make sure its db is up-to-date too
410
-        foreach ($this->registry->addons as $addon) {
411
-            $addon->initialize_db_if_no_migrations_required();
412
-        }
413
-    }
414
-
415
-
416
-
417
-    /**
418
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
419
-     *
420
-     * @param    array  $version_history
421
-     * @param    string $current_version_to_add version to be added to the version history
422
-     * @return    boolean success as to whether or not this option was changed
423
-     */
424
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
425
-    {
426
-        if ( ! $version_history) {
427
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
428
-        }
429
-        if ($current_version_to_add == null) {
430
-            $current_version_to_add = espresso_version();
431
-        }
432
-        $version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
433
-        // re-save
434
-        return update_option('espresso_db_update', $version_history);
435
-    }
436
-
437
-
438
-
439
-    /**
440
-     * Detects if the current version indicated in the has existed in the list of
441
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
442
-     *
443
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
444
-     *                                  If not supplied, fetches it from the options table.
445
-     *                                  Also, caches its result so later parts of the code can also know whether
446
-     *                                  there's been an update or not. This way we can add the current version to
447
-     *                                  espresso_db_update, but still know if this is a new install or not
448
-     * @return int one of the constants on EE_System::req_type_
449
-     */
450
-    public function detect_req_type($espresso_db_update = null)
451
-    {
452
-        if ($this->_req_type === null) {
453
-            $espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
454
-                : $this->fix_espresso_db_upgrade_option();
455
-            $this->_req_type = $this->detect_req_type_given_activation_history($espresso_db_update,
456
-                'ee_espresso_activation', espresso_version());
457
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
458
-        }
459
-        return $this->_req_type;
460
-    }
461
-
462
-
463
-
464
-    /**
465
-     * Returns whether or not there was a non-micro version change (ie, change in either
466
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
467
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
468
-     *
469
-     * @param $activation_history
470
-     * @return bool
471
-     */
472
-    protected function _detect_major_version_change($activation_history)
473
-    {
474
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
475
-        $previous_version_parts = explode('.', $previous_version);
476
-        $current_version_parts = explode('.', espresso_version());
477
-        return isset(
478
-            $previous_version_parts[0],
479
-            $previous_version_parts[1],
480
-            $current_version_parts[0],
481
-            $current_version_parts[1]
482
-        )
483
-               && ($previous_version_parts[0] !== $current_version_parts[0]
484
-                   || $previous_version_parts[1] !== $current_version_parts[1]
485
-               );
486
-    }
487
-
488
-
489
-
490
-    /**
491
-     * Returns true if either the major or minor version of EE changed during this request.
492
-     * 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
493
-     *
494
-     * @return bool
495
-     */
496
-    public function is_major_version_change()
497
-    {
498
-        return $this->_major_version_change;
499
-    }
500
-
501
-
502
-
503
-    /**
504
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
505
-     * histories (for core that' 'espresso_db_update' wp option); the name of the wordpress option which is temporarily
506
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
507
-     * just activated to (for core that will always be espresso_version())
508
-     *
509
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
510
-     *                                                 ee plugin. for core that's 'espresso_db_update'
511
-     * @param string $activation_indicator_option_name the name of the wordpress option that is temporarily set to
512
-     *                                                 indicate that this plugin was just activated
513
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
514
-     *                                                 espresso_version())
515
-     * @return int one of the constants on EE_System::req_type_*
516
-     */
517
-    public static function detect_req_type_given_activation_history(
518
-        $activation_history_for_addon,
519
-        $activation_indicator_option_name,
520
-        $version_to_upgrade_to
521
-    ) {
522
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
523
-        if ($activation_history_for_addon) {
524
-            //it exists, so this isn't a completely new install
525
-            //check if this version already in that list of previously installed versions
526
-            if (! isset($activation_history_for_addon[$version_to_upgrade_to])) {
527
-                //it a version we haven't seen before
528
-                if ($version_is_higher === 1) {
529
-                    $req_type = EE_System::req_type_upgrade;
530
-                } else {
531
-                    $req_type = EE_System::req_type_downgrade;
532
-                }
533
-                delete_option($activation_indicator_option_name);
534
-            } else {
535
-                // its not an update. maybe a reactivation?
536
-                if (get_option($activation_indicator_option_name, false)) {
537
-                    if ($version_is_higher === -1) {
538
-                        $req_type = EE_System::req_type_downgrade;
539
-                    } elseif ($version_is_higher === 0) {
540
-                        //we've seen this version before, but it's an activation. must be a reactivation
541
-                        $req_type = EE_System::req_type_reactivation;
542
-                    } else {//$version_is_higher === 1
543
-                        $req_type = EE_System::req_type_upgrade;
544
-                    }
545
-                    delete_option($activation_indicator_option_name);
546
-                } else {
547
-                    //we've seen this version before and the activation indicate doesn't show it was just activated
548
-                    if ($version_is_higher === -1) {
549
-                        $req_type = EE_System::req_type_downgrade;
550
-                    } elseif ($version_is_higher === 0) {
551
-                        //we've seen this version before and it's not an activation. its normal request
552
-                        $req_type = EE_System::req_type_normal;
553
-                    } else {//$version_is_higher === 1
554
-                        $req_type = EE_System::req_type_upgrade;
555
-                    }
556
-                }
557
-            }
558
-        } else {
559
-            //brand new install
560
-            $req_type = EE_System::req_type_new_activation;
561
-            delete_option($activation_indicator_option_name);
562
-        }
563
-        return $req_type;
564
-    }
565
-
566
-
567
-
568
-    /**
569
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
570
-     * the $activation_history_for_addon
571
-     *
572
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
573
-     *                                             sometimes containing 'unknown-date'
574
-     * @param string $version_to_upgrade_to        (current version)
575
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
576
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
577
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
578
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
579
-     */
580
-    protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
581
-    {
582
-        //find the most recently-activated version
583
-        $most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history(
584
-            $activation_history_for_addon
585
-        );
586
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
587
-    }
588
-
589
-
590
-
591
-    /**
592
-     * Gets the most recently active version listed in the activation history,
593
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
594
-     *
595
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
596
-     *                                   sometimes containing 'unknown-date'
597
-     * @return string
598
-     */
599
-    protected static function _get_most_recently_active_version_from_activation_history($activation_history)
600
-    {
601
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
602
-        $most_recently_active_version = '0.0.0.dev.000';
603
-        if (is_array($activation_history)) {
604
-            foreach ($activation_history as $version => $times_activated) {
605
-                //check there is a record of when this version was activated. Otherwise,
606
-                //mark it as unknown
607
-                if (! $times_activated) {
608
-                    $times_activated = array('unknown-date');
609
-                }
610
-                if (is_string($times_activated)) {
611
-                    $times_activated = array($times_activated);
612
-                }
613
-                foreach ($times_activated as $an_activation) {
614
-                    if ($an_activation != 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
615
-                        $most_recently_active_version = $version;
616
-                        $most_recently_active_version_activation = $an_activation == 'unknown-date'
617
-                            ? '1970-01-01 00:00:00' : $an_activation;
618
-                    }
619
-                }
620
-            }
621
-        }
622
-        return $most_recently_active_version;
623
-    }
624
-
625
-
626
-
627
-    /**
628
-     * This redirects to the about EE page after activation
629
-     *
630
-     * @return void
631
-     */
632
-    public function redirect_to_about_ee()
633
-    {
634
-        $notices = EE_Error::get_notices(false);
635
-        //if current user is an admin and it's not an ajax or rest request
636
-        if (! (defined('DOING_AJAX') && DOING_AJAX)
637
-            && ! (defined('REST_REQUEST') && REST_REQUEST)
638
-            && ! isset($notices['errors'])
639
-            && apply_filters(
640
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
641
-                $this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
642
-            )
643
-        ) {
644
-            $query_params = array('page' => 'espresso_about');
645
-            if (EE_System::instance()->detect_req_type() == EE_System::req_type_new_activation) {
646
-                $query_params['new_activation'] = true;
647
-            }
648
-            if (EE_System::instance()->detect_req_type() == EE_System::req_type_reactivation) {
649
-                $query_params['reactivation'] = true;
650
-            }
651
-            $url = add_query_arg($query_params, admin_url('admin.php'));
652
-            wp_safe_redirect($url);
653
-            exit();
654
-        }
655
-    }
656
-
657
-
658
-
659
-    /**
660
-     * load_core_configuration
661
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
662
-     * which runs during the WP 'plugins_loaded' action at priority 5
663
-     *
664
-     * @return void
665
-     */
666
-    public function load_core_configuration()
667
-    {
668
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
669
-        $this->registry->load_core('EE_Load_Textdomain');
670
-        //load textdomain
671
-        EE_Load_Textdomain::load_textdomain();
672
-        // load and setup EE_Config and EE_Network_Config
673
-        $this->registry->load_core('Config');
674
-        $this->registry->load_core('Network_Config');
675
-        // setup autoloaders
676
-        // enable logging?
677
-        if ($this->registry->CFG->admin->use_full_logging) {
678
-            $this->registry->load_core('Log');
679
-        }
680
-        // check for activation errors
681
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
682
-        if ($activation_errors) {
683
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
684
-            update_option('ee_plugin_activation_errors', false);
685
-        }
686
-        // get model names
687
-        $this->_parse_model_names();
688
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
689
-    }
690
-
691
-
692
-
693
-    /**
694
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
695
-     *
696
-     * @return void
697
-     */
698
-    private function _parse_model_names()
699
-    {
700
-        //get all the files in the EE_MODELS folder that end in .model.php
701
-        $models = glob(EE_MODELS . '*.model.php');
702
-        $model_names = array();
703
-        $non_abstract_db_models = array();
704
-        foreach ($models as $model) {
705
-            // get model classname
706
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
707
-            $short_name = str_replace('EEM_', '', $classname);
708
-            $reflectionClass = new ReflectionClass($classname);
709
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
710
-                $non_abstract_db_models[$short_name] = $classname;
711
-            }
712
-            $model_names[$short_name] = $classname;
713
-        }
714
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
715
-        $this->registry->non_abstract_db_models = apply_filters(
716
-            'FHEE__EE_System__parse_implemented_model_names',
717
-            $non_abstract_db_models
718
-        );
719
-    }
720
-
721
-
722
-
723
-    /**
724
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
725
-     * that need to be setup before our EE_System launches.
726
-     *
727
-     * @return void
728
-     */
729
-    private function _maybe_brew_regular()
730
-    {
731
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
732
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
733
-        }
734
-    }
735
-
736
-
737
-
738
-    /**
739
-     * register_shortcodes_modules_and_widgets
740
-     * generate lists of shortcodes and modules, then verify paths and classes
741
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
742
-     * which runs during the WP 'plugins_loaded' action at priority 7
743
-     *
744
-     * @access public
745
-     * @return void
746
-     */
747
-    public function register_shortcodes_modules_and_widgets()
748
-    {
749
-        try {
750
-            // load, register, and add shortcodes the new way
751
-            new ShortcodesManager(
752
-                // and the old way, but we'll put it under control of the new system
753
-                EE_Config::getLegacyShortcodesManager()
754
-            );
755
-        } catch (Exception $exception) {
756
-            new ExceptionStackTraceDisplay($exception);
757
-        }
758
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
759
-        // check for addons using old hookpoint
760
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
761
-            $this->_incompatible_addon_error();
762
-        }
763
-    }
764
-
765
-
766
-
767
-    /**
768
-     * _incompatible_addon_error
769
-     *
770
-     * @access public
771
-     * @return void
772
-     */
773
-    private function _incompatible_addon_error()
774
-    {
775
-        // get array of classes hooking into here
776
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
777
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
778
-        );
779
-        if (! empty($class_names)) {
780
-            $msg = esc_html__(
781
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
782
-                'event_espresso'
783
-            );
784
-            $msg .= '<ul>';
785
-            foreach ($class_names as $class_name) {
786
-                $msg .= '<li><b>Event Espresso - '
787
-                        . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '', $class_name)
788
-                        . '</b></li>';
789
-            }
790
-            $msg .= '</ul>';
791
-            $msg .= esc_html__(
792
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
793
-                'event_espresso'
794
-            );
795
-            // save list of incompatible addons to wp-options for later use
796
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
797
-            if (is_admin()) {
798
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
799
-            }
800
-        }
801
-    }
802
-
803
-
804
-
805
-    /**
806
-     * brew_espresso
807
-     * begins the process of setting hooks for initializing EE in the correct order
808
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hookpoint
809
-     * which runs during the WP 'plugins_loaded' action at priority 9
810
-     *
811
-     * @return void
812
-     */
813
-    public function brew_espresso()
814
-    {
815
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
816
-        // load some final core systems
817
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
818
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
819
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
820
-        add_action('init', array($this, 'load_controllers'), 7);
821
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
822
-        add_action('init', array($this, 'initialize'), 10);
823
-        add_action('init', array($this, 'initialize_last'), 100);
824
-        add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
825
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
826
-            // pew pew pew
827
-            $this->registry->load_core('PUE');
828
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
829
-        }
830
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
831
-    }
832
-
833
-
834
-
835
-    /**
836
-     *    set_hooks_for_core
837
-     *
838
-     * @access public
839
-     * @return    void
840
-     */
841
-    public function set_hooks_for_core()
842
-    {
843
-        $this->_deactivate_incompatible_addons();
844
-        do_action('AHEE__EE_System__set_hooks_for_core');
845
-    }
846
-
847
-
848
-
849
-    /**
850
-     * Using the information gathered in EE_System::_incompatible_addon_error,
851
-     * deactivates any addons considered incompatible with the current version of EE
852
-     */
853
-    private function _deactivate_incompatible_addons()
854
-    {
855
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
856
-        if (! empty($incompatible_addons)) {
857
-            $active_plugins = get_option('active_plugins', array());
858
-            foreach ($active_plugins as $active_plugin) {
859
-                foreach ($incompatible_addons as $incompatible_addon) {
860
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
861
-                        unset($_GET['activate']);
862
-                        espresso_deactivate_plugin($active_plugin);
863
-                    }
864
-                }
865
-            }
866
-        }
867
-    }
868
-
869
-
870
-
871
-    /**
872
-     *    perform_activations_upgrades_and_migrations
873
-     *
874
-     * @access public
875
-     * @return    void
876
-     */
877
-    public function perform_activations_upgrades_and_migrations()
878
-    {
879
-        //first check if we had previously attempted to setup EE's directories but failed
880
-        if (EEH_Activation::upload_directories_incomplete()) {
881
-            EEH_Activation::create_upload_directories();
882
-        }
883
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
884
-    }
885
-
886
-
887
-
888
-    /**
889
-     *    load_CPTs_and_session
890
-     *
891
-     * @access public
892
-     * @return    void
893
-     */
894
-    public function load_CPTs_and_session()
895
-    {
896
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
897
-        // register Custom Post Types
898
-        $this->registry->load_core('Register_CPTs');
899
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
900
-    }
901
-
902
-
903
-
904
-    /**
905
-     * load_controllers
906
-     * this is the best place to load any additional controllers that needs access to EE core.
907
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
908
-     * time
909
-     *
910
-     * @access public
911
-     * @return void
912
-     */
913
-    public function load_controllers()
914
-    {
915
-        do_action('AHEE__EE_System__load_controllers__start');
916
-        // let's get it started
917
-        if (! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
918
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
919
-            $this->registry->load_core('Front_Controller');
920
-        } elseif (! EE_FRONT_AJAX) {
921
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
922
-            EE_Registry::instance()->load_core('Admin');
923
-        }
924
-        do_action('AHEE__EE_System__load_controllers__complete');
925
-    }
926
-
927
-
928
-
929
-    /**
930
-     * core_loaded_and_ready
931
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
932
-     *
933
-     * @access public
934
-     * @return void
935
-     */
936
-    public function core_loaded_and_ready()
937
-    {
938
-        do_action('AHEE__EE_System__core_loaded_and_ready');
939
-        // load_espresso_template_tags
940
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
941
-            require_once(EE_PUBLIC . 'template_tags.php');
942
-        }
943
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
944
-        $this->registry->load_core('Session');
945
-        $this->registry->create('EventEspresso\core\services\assets\Registry');
946
-        wp_enqueue_script('espresso_core');
947
-    }
948
-
949
-
950
-
951
-    /**
952
-     * initialize
953
-     * this is the best place to begin initializing client code
954
-     *
955
-     * @access public
956
-     * @return void
957
-     */
958
-    public function initialize()
959
-    {
960
-        do_action('AHEE__EE_System__initialize');
961
-    }
962
-
963
-
964
-
965
-    /**
966
-     * initialize_last
967
-     * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
968
-     * initialize has done so
969
-     *
970
-     * @access public
971
-     * @return void
972
-     */
973
-    public function initialize_last()
974
-    {
975
-        do_action('AHEE__EE_System__initialize_last');
976
-    }
977
-
978
-
979
-
980
-    /**
981
-     * set_hooks_for_shortcodes_modules_and_addons
982
-     * this is the best place for other systems to set callbacks for hooking into other parts of EE
983
-     * this happens at the very beginning of the wp_loaded hookpoint
984
-     *
985
-     * @access public
986
-     * @return void
987
-     */
988
-    public function set_hooks_for_shortcodes_modules_and_addons()
989
-    {
990
-        //		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
991
-    }
992
-
993
-
994
-
995
-    /**
996
-     * do_not_cache
997
-     * sets no cache headers and defines no cache constants for WP plugins
998
-     *
999
-     * @access public
1000
-     * @return void
1001
-     */
1002
-    public static function do_not_cache()
1003
-    {
1004
-        // set no cache constants
1005
-        if (! defined('DONOTCACHEPAGE')) {
1006
-            define('DONOTCACHEPAGE', true);
1007
-        }
1008
-        if (! defined('DONOTCACHCEOBJECT')) {
1009
-            define('DONOTCACHCEOBJECT', true);
1010
-        }
1011
-        if (! defined('DONOTCACHEDB')) {
1012
-            define('DONOTCACHEDB', true);
1013
-        }
1014
-        // add no cache headers
1015
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1016
-        // plus a little extra for nginx and Google Chrome
1017
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1018
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes
1019
-        // with the registration process
1020
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1021
-    }
1022
-
1023
-
1024
-
1025
-    /**
1026
-     *    extra_nocache_headers
1027
-     *
1028
-     * @access    public
1029
-     * @param $headers
1030
-     * @return    array
1031
-     */
1032
-    public static function extra_nocache_headers($headers)
1033
-    {
1034
-        // for NGINX
1035
-        $headers['X-Accel-Expires'] = 0;
1036
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1037
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1038
-        return $headers;
1039
-    }
1040
-
1041
-
1042
-
1043
-    /**
1044
-     *    nocache_headers
1045
-     *
1046
-     * @access    public
1047
-     * @return    void
1048
-     */
1049
-    public static function nocache_headers()
1050
-    {
1051
-        nocache_headers();
1052
-    }
1053
-
1054
-
1055
-
1056
-    /**
1057
-     *    espresso_toolbar_items
1058
-     *
1059
-     * @access public
1060
-     * @param  WP_Admin_Bar $admin_bar
1061
-     * @return void
1062
-     */
1063
-    public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1064
-    {
1065
-        // if in full M-Mode, or its an AJAX request, or user is NOT an admin
1066
-        if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1067
-            || defined('DOING_AJAX')
1068
-            || ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1069
-        ) {
1070
-            return;
1071
-        }
1072
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1073
-        $menu_class = 'espresso_menu_item_class';
1074
-        //we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1075
-        //because they're only defined in each of their respective constructors
1076
-        //and this might be a frontend request, in which case they aren't available
1077
-        $events_admin_url = admin_url("admin.php?page=espresso_events");
1078
-        $reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1079
-        $extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1080
-        //Top Level
1081
-        $admin_bar->add_menu(array(
1082
-            'id'    => 'espresso-toolbar',
1083
-            'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1084
-                       . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1085
-                       . '</span>',
1086
-            'href'  => $events_admin_url,
1087
-            'meta'  => array(
1088
-                'title' => esc_html__('Event Espresso', 'event_espresso'),
1089
-                'class' => $menu_class . 'first',
1090
-            ),
1091
-        ));
1092
-        //Events
1093
-        if ($this->registry->CAP->current_user_can(
1094
-            'ee_read_events',
1095
-            'ee_admin_bar_menu_espresso-toolbar-events'
1096
-        )) {
1097
-            $admin_bar->add_menu(array(
1098
-                'id'     => 'espresso-toolbar-events',
1099
-                'parent' => 'espresso-toolbar',
1100
-                'title'  => esc_html__('Events', 'event_espresso'),
1101
-                'href'   => $events_admin_url,
1102
-                'meta'   => array(
1103
-                    'title'  => esc_html__('Events', 'event_espresso'),
1104
-                    'target' => '',
1105
-                    'class'  => $menu_class,
1106
-                ),
1107
-            ));
1108
-        }
1109
-        if ($this->registry->CAP->current_user_can(
1110
-            'ee_edit_events',
1111
-            'ee_admin_bar_menu_espresso-toolbar-events-new'
1112
-        )) {
1113
-            //Events Add New
1114
-            $admin_bar->add_menu(array(
1115
-                'id'     => 'espresso-toolbar-events-new',
1116
-                'parent' => 'espresso-toolbar-events',
1117
-                'title'  => esc_html__('Add New', 'event_espresso'),
1118
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1119
-                'meta'   => array(
1120
-                    'title'  => esc_html__('Add New', 'event_espresso'),
1121
-                    'target' => '',
1122
-                    'class'  => $menu_class,
1123
-                ),
1124
-            ));
1125
-        }
1126
-        if (is_single() && (get_post_type() == 'espresso_events')) {
1127
-            //Current post
1128
-            global $post;
1129
-            if ($this->registry->CAP->current_user_can('ee_edit_event',
1130
-                'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1131
-            ) {
1132
-                //Events Edit Current Event
1133
-                $admin_bar->add_menu(array(
1134
-                    'id'     => 'espresso-toolbar-events-edit',
1135
-                    'parent' => 'espresso-toolbar-events',
1136
-                    'title'  => esc_html__('Edit Event', 'event_espresso'),
1137
-                    'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1138
-                        $events_admin_url),
1139
-                    'meta'   => array(
1140
-                        'title'  => esc_html__('Edit Event', 'event_espresso'),
1141
-                        'target' => '',
1142
-                        'class'  => $menu_class,
1143
-                    ),
1144
-                ));
1145
-            }
1146
-        }
1147
-        //Events View
1148
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1149
-            'ee_admin_bar_menu_espresso-toolbar-events-view')
1150
-        ) {
1151
-            $admin_bar->add_menu(array(
1152
-                'id'     => 'espresso-toolbar-events-view',
1153
-                'parent' => 'espresso-toolbar-events',
1154
-                'title'  => esc_html__('View', 'event_espresso'),
1155
-                'href'   => $events_admin_url,
1156
-                'meta'   => array(
1157
-                    'title'  => esc_html__('View', 'event_espresso'),
1158
-                    'target' => '',
1159
-                    'class'  => $menu_class,
1160
-                ),
1161
-            ));
1162
-        }
1163
-        if ($this->registry->CAP->current_user_can(
1164
-            'ee_read_events',
1165
-            'ee_admin_bar_menu_espresso-toolbar-events-all'
1166
-        )) {
1167
-            //Events View All
1168
-            $admin_bar->add_menu(array(
1169
-                'id'     => 'espresso-toolbar-events-all',
1170
-                'parent' => 'espresso-toolbar-events-view',
1171
-                'title'  => esc_html__('All', 'event_espresso'),
1172
-                'href'   => $events_admin_url,
1173
-                'meta'   => array(
1174
-                    'title'  => esc_html__('All', 'event_espresso'),
1175
-                    'target' => '',
1176
-                    'class'  => $menu_class,
1177
-                ),
1178
-            ));
1179
-        }
1180
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1181
-            'ee_admin_bar_menu_espresso-toolbar-events-today')
1182
-        ) {
1183
-            //Events View Today
1184
-            $admin_bar->add_menu(array(
1185
-                'id'     => 'espresso-toolbar-events-today',
1186
-                'parent' => 'espresso-toolbar-events-view',
1187
-                'title'  => esc_html__('Today', 'event_espresso'),
1188
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1189
-                    $events_admin_url),
1190
-                'meta'   => array(
1191
-                    'title'  => esc_html__('Today', 'event_espresso'),
1192
-                    'target' => '',
1193
-                    'class'  => $menu_class,
1194
-                ),
1195
-            ));
1196
-        }
1197
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1198
-            'ee_admin_bar_menu_espresso-toolbar-events-month')
1199
-        ) {
1200
-            //Events View This Month
1201
-            $admin_bar->add_menu(array(
1202
-                'id'     => 'espresso-toolbar-events-month',
1203
-                'parent' => 'espresso-toolbar-events-view',
1204
-                'title'  => esc_html__('This Month', 'event_espresso'),
1205
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1206
-                    $events_admin_url),
1207
-                'meta'   => array(
1208
-                    'title'  => esc_html__('This Month', 'event_espresso'),
1209
-                    'target' => '',
1210
-                    'class'  => $menu_class,
1211
-                ),
1212
-            ));
1213
-        }
1214
-        //Registration Overview
1215
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1216
-            'ee_admin_bar_menu_espresso-toolbar-registrations')
1217
-        ) {
1218
-            $admin_bar->add_menu(array(
1219
-                'id'     => 'espresso-toolbar-registrations',
1220
-                'parent' => 'espresso-toolbar',
1221
-                'title'  => esc_html__('Registrations', 'event_espresso'),
1222
-                'href'   => $reg_admin_url,
1223
-                'meta'   => array(
1224
-                    'title'  => esc_html__('Registrations', 'event_espresso'),
1225
-                    'target' => '',
1226
-                    'class'  => $menu_class,
1227
-                ),
1228
-            ));
1229
-        }
1230
-        //Registration Overview Today
1231
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1232
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1233
-        ) {
1234
-            $admin_bar->add_menu(array(
1235
-                'id'     => 'espresso-toolbar-registrations-today',
1236
-                'parent' => 'espresso-toolbar-registrations',
1237
-                'title'  => esc_html__('Today', 'event_espresso'),
1238
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1239
-                    $reg_admin_url),
1240
-                'meta'   => array(
1241
-                    'title'  => esc_html__('Today', 'event_espresso'),
1242
-                    'target' => '',
1243
-                    'class'  => $menu_class,
1244
-                ),
1245
-            ));
1246
-        }
1247
-        //Registration Overview Today Completed
1248
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1249
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1250
-        ) {
1251
-            $admin_bar->add_menu(array(
1252
-                'id'     => 'espresso-toolbar-registrations-today-approved',
1253
-                'parent' => 'espresso-toolbar-registrations-today',
1254
-                'title'  => esc_html__('Approved', 'event_espresso'),
1255
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1256
-                    'action'      => 'default',
1257
-                    'status'      => 'today',
1258
-                    '_reg_status' => EEM_Registration::status_id_approved,
1259
-                ), $reg_admin_url),
1260
-                'meta'   => array(
1261
-                    'title'  => esc_html__('Approved', 'event_espresso'),
1262
-                    'target' => '',
1263
-                    'class'  => $menu_class,
1264
-                ),
1265
-            ));
1266
-        }
1267
-        //Registration Overview Today Pending\
1268
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1269
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1270
-        ) {
1271
-            $admin_bar->add_menu(array(
1272
-                'id'     => 'espresso-toolbar-registrations-today-pending',
1273
-                'parent' => 'espresso-toolbar-registrations-today',
1274
-                'title'  => esc_html__('Pending', 'event_espresso'),
1275
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1276
-                    'action'     => 'default',
1277
-                    'status'     => 'today',
1278
-                    'reg_status' => EEM_Registration::status_id_pending_payment,
1279
-                ), $reg_admin_url),
1280
-                'meta'   => array(
1281
-                    'title'  => esc_html__('Pending Payment', 'event_espresso'),
1282
-                    'target' => '',
1283
-                    'class'  => $menu_class,
1284
-                ),
1285
-            ));
1286
-        }
1287
-        //Registration Overview Today Incomplete
1288
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1289
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1290
-        ) {
1291
-            $admin_bar->add_menu(array(
1292
-                'id'     => 'espresso-toolbar-registrations-today-not-approved',
1293
-                'parent' => 'espresso-toolbar-registrations-today',
1294
-                'title'  => esc_html__('Not Approved', 'event_espresso'),
1295
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1296
-                    'action'      => 'default',
1297
-                    'status'      => 'today',
1298
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1299
-                ), $reg_admin_url),
1300
-                'meta'   => array(
1301
-                    'title'  => esc_html__('Not Approved', 'event_espresso'),
1302
-                    'target' => '',
1303
-                    'class'  => $menu_class,
1304
-                ),
1305
-            ));
1306
-        }
1307
-        //Registration Overview Today Incomplete
1308
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1309
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1310
-        ) {
1311
-            $admin_bar->add_menu(array(
1312
-                'id'     => 'espresso-toolbar-registrations-today-cancelled',
1313
-                'parent' => 'espresso-toolbar-registrations-today',
1314
-                'title'  => esc_html__('Cancelled', 'event_espresso'),
1315
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1316
-                    'action'      => 'default',
1317
-                    'status'      => 'today',
1318
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1319
-                ), $reg_admin_url),
1320
-                'meta'   => array(
1321
-                    'title'  => esc_html__('Cancelled', 'event_espresso'),
1322
-                    'target' => '',
1323
-                    'class'  => $menu_class,
1324
-                ),
1325
-            ));
1326
-        }
1327
-        //Registration Overview This Month
1328
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1329
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1330
-        ) {
1331
-            $admin_bar->add_menu(array(
1332
-                'id'     => 'espresso-toolbar-registrations-month',
1333
-                'parent' => 'espresso-toolbar-registrations',
1334
-                'title'  => esc_html__('This Month', 'event_espresso'),
1335
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1336
-                    $reg_admin_url),
1337
-                'meta'   => array(
1338
-                    'title'  => esc_html__('This Month', 'event_espresso'),
1339
-                    'target' => '',
1340
-                    'class'  => $menu_class,
1341
-                ),
1342
-            ));
1343
-        }
1344
-        //Registration Overview This Month Approved
1345
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1346
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1347
-        ) {
1348
-            $admin_bar->add_menu(array(
1349
-                'id'     => 'espresso-toolbar-registrations-month-approved',
1350
-                'parent' => 'espresso-toolbar-registrations-month',
1351
-                'title'  => esc_html__('Approved', 'event_espresso'),
1352
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1353
-                    'action'      => 'default',
1354
-                    'status'      => 'month',
1355
-                    '_reg_status' => EEM_Registration::status_id_approved,
1356
-                ), $reg_admin_url),
1357
-                'meta'   => array(
1358
-                    'title'  => esc_html__('Approved', 'event_espresso'),
1359
-                    'target' => '',
1360
-                    'class'  => $menu_class,
1361
-                ),
1362
-            ));
1363
-        }
1364
-        //Registration Overview This Month Pending
1365
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1366
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1367
-        ) {
1368
-            $admin_bar->add_menu(array(
1369
-                'id'     => 'espresso-toolbar-registrations-month-pending',
1370
-                'parent' => 'espresso-toolbar-registrations-month',
1371
-                'title'  => esc_html__('Pending', 'event_espresso'),
1372
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1373
-                    'action'      => 'default',
1374
-                    'status'      => 'month',
1375
-                    '_reg_status' => EEM_Registration::status_id_pending_payment,
1376
-                ), $reg_admin_url),
1377
-                'meta'   => array(
1378
-                    'title'  => esc_html__('Pending', 'event_espresso'),
1379
-                    'target' => '',
1380
-                    'class'  => $menu_class,
1381
-                ),
1382
-            ));
1383
-        }
1384
-        //Registration Overview This Month Not Approved
1385
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1386
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1387
-        ) {
1388
-            $admin_bar->add_menu(array(
1389
-                'id'     => 'espresso-toolbar-registrations-month-not-approved',
1390
-                'parent' => 'espresso-toolbar-registrations-month',
1391
-                'title'  => esc_html__('Not Approved', 'event_espresso'),
1392
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1393
-                    'action'      => 'default',
1394
-                    'status'      => 'month',
1395
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1396
-                ), $reg_admin_url),
1397
-                'meta'   => array(
1398
-                    'title'  => esc_html__('Not Approved', 'event_espresso'),
1399
-                    'target' => '',
1400
-                    'class'  => $menu_class,
1401
-                ),
1402
-            ));
1403
-        }
1404
-        //Registration Overview This Month Cancelled
1405
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1406
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1407
-        ) {
1408
-            $admin_bar->add_menu(array(
1409
-                'id'     => 'espresso-toolbar-registrations-month-cancelled',
1410
-                'parent' => 'espresso-toolbar-registrations-month',
1411
-                'title'  => esc_html__('Cancelled', 'event_espresso'),
1412
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1413
-                    'action'      => 'default',
1414
-                    'status'      => 'month',
1415
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1416
-                ), $reg_admin_url),
1417
-                'meta'   => array(
1418
-                    'title'  => esc_html__('Cancelled', 'event_espresso'),
1419
-                    'target' => '',
1420
-                    'class'  => $menu_class,
1421
-                ),
1422
-            ));
1423
-        }
1424
-        //Extensions & Services
1425
-        if ($this->registry->CAP->current_user_can('ee_read_ee',
1426
-            'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1427
-        ) {
1428
-            $admin_bar->add_menu(array(
1429
-                'id'     => 'espresso-toolbar-extensions-and-services',
1430
-                'parent' => 'espresso-toolbar',
1431
-                'title'  => esc_html__('Extensions & Services', 'event_espresso'),
1432
-                'href'   => $extensions_admin_url,
1433
-                'meta'   => array(
1434
-                    'title'  => esc_html__('Extensions & Services', 'event_espresso'),
1435
-                    'target' => '',
1436
-                    'class'  => $menu_class,
1437
-                ),
1438
-            ));
1439
-        }
1440
-    }
1441
-
1442
-
1443
-
1444
-    /**
1445
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1446
-     * never returned with the function.
1447
-     *
1448
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1449
-     * @return array
1450
-     */
1451
-    public function remove_pages_from_wp_list_pages($exclude_array)
1452
-    {
1453
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1454
-    }
24
+	/**
25
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
26
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
27
+	 */
28
+	const req_type_normal = 0;
29
+
30
+	/**
31
+	 * Indicates this is a brand new installation of EE so we should install
32
+	 * tables and default data etc
33
+	 */
34
+	const req_type_new_activation = 1;
35
+
36
+	/**
37
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
38
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
39
+	 * and that default data is setup too
40
+	 */
41
+	const req_type_reactivation = 2;
42
+
43
+	/**
44
+	 * indicates that EE has been upgraded since its previous request.
45
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
46
+	 */
47
+	const req_type_upgrade = 3;
48
+
49
+	/**
50
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
51
+	 */
52
+	const req_type_downgrade = 4;
53
+
54
+	/**
55
+	 * @deprecated since version 4.6.0.dev.006
56
+	 * Now whenever a new_activation is detected the request type is still just
57
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
58
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
59
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
60
+	 * (Specifically, when the migration manager indicates migrations are finished
61
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
62
+	 */
63
+	const req_type_activation_but_not_installed = 5;
64
+
65
+	/**
66
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
67
+	 */
68
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
69
+
70
+
71
+	/**
72
+	 *    instance of the EE_System object
73
+	 *
74
+	 * @var    $_instance
75
+	 * @access    private
76
+	 */
77
+	private static $_instance = null;
78
+
79
+	/**
80
+	 * @type  EE_Registry $Registry
81
+	 * @access    protected
82
+	 */
83
+	protected $registry;
84
+
85
+	/**
86
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
87
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
88
+	 *
89
+	 * @var int
90
+	 */
91
+	private $_req_type;
92
+
93
+	/**
94
+	 * Whether or not there was a non-micro version change in EE core version during this request
95
+	 *
96
+	 * @var boolean
97
+	 */
98
+	private $_major_version_change = false;
99
+
100
+
101
+
102
+	/**
103
+	 * @singleton method used to instantiate class object
104
+	 * @access    public
105
+	 * @param  \EE_Registry $Registry
106
+	 * @return \EE_System
107
+	 */
108
+	public static function instance(EE_Registry $Registry = null)
109
+	{
110
+		// check if class object is instantiated
111
+		if ( ! self::$_instance instanceof EE_System) {
112
+			self::$_instance = new self($Registry);
113
+		}
114
+		return self::$_instance;
115
+	}
116
+
117
+
118
+
119
+	/**
120
+	 * resets the instance and returns it
121
+	 *
122
+	 * @return EE_System
123
+	 */
124
+	public static function reset()
125
+	{
126
+		self::$_instance->_req_type = null;
127
+		//make sure none of the old hooks are left hanging around
128
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
129
+		//we need to reset the migration manager in order for it to detect DMSs properly
130
+		EE_Data_Migration_Manager::reset();
131
+		self::instance()->detect_activations_or_upgrades();
132
+		self::instance()->perform_activations_upgrades_and_migrations();
133
+		return self::instance();
134
+	}
135
+
136
+
137
+
138
+	/**
139
+	 *    sets hooks for running rest of system
140
+	 *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
141
+	 *    starting EE Addons from any other point may lead to problems
142
+	 *
143
+	 * @access private
144
+	 * @param  \EE_Registry $Registry
145
+	 */
146
+	private function __construct(EE_Registry $Registry)
147
+	{
148
+		$this->registry = $Registry;
149
+		do_action('AHEE__EE_System__construct__begin', $this);
150
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
151
+		add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
152
+		// when an ee addon is activated, we want to call the core hook(s) again
153
+		// because the newly-activated addon didn't get a chance to run at all
154
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
155
+		// detect whether install or upgrade
156
+		add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
157
+			3);
158
+		// load EE_Config, EE_Textdomain, etc
159
+		add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
160
+		// load EE_Config, EE_Textdomain, etc
161
+		add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
162
+			array($this, 'register_shortcodes_modules_and_widgets'), 7);
163
+		// you wanna get going? I wanna get going... let's get going!
164
+		add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
165
+		//other housekeeping
166
+		//exclude EE critical pages from wp_list_pages
167
+		add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
168
+		// ALL EE Addons should use the following hook point to attach their initial setup too
169
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when
170
+		// the EE_Config loads
171
+		do_action('AHEE__EE_System__construct__complete', $this);
172
+	}
173
+
174
+
175
+	/**
176
+	 * load_espresso_addons
177
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
178
+	 * this is hooked into both:
179
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
180
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
181
+	 *    and the WP 'activate_plugin' hookpoint
182
+	 *
183
+	 * @access public
184
+	 * @return void
185
+	 * @throws EE_Error
186
+	 * @throws \EventEspresso\core\exceptions\InvalidExecutionPathException
187
+	 */
188
+	public function load_espresso_addons()
189
+	{
190
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
191
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
192
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
193
+		//load and setup EE_Capabilities
194
+		$this->registry->load_core('Capabilities');
195
+
196
+		do_action('AHEE__EE_System__load_espresso_addons');
197
+		//if the WP API basic auth plugin isn't already loaded, load it now.
198
+		//We want it for mobile apps. Just include the entire plugin
199
+		//also, don't load the basic auth when a plugin is getting activated, because
200
+		//it could be the basic auth plugin, and it doesn't check if its methods are already defined
201
+		//and causes a fatal error
202
+		if ( ! function_exists('json_basic_auth_handler')
203
+			 && ! function_exists('json_basic_auth_error')
204
+			 && ! (
205
+				isset($_GET['action'])
206
+				&& in_array($_GET['action'], array('activate', 'activate-selected'))
207
+			)
208
+			 && ! (
209
+				isset($_GET['activate'])
210
+				&& $_GET['activate'] === 'true'
211
+			)
212
+		) {
213
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
214
+		}
215
+		$this->_maybe_brew_regular();
216
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
217
+		$this->registry->CAP->init_caps();
218
+	}
219
+
220
+
221
+
222
+	/**
223
+	 * detect_activations_or_upgrades
224
+	 * Checks for activation or upgrade of core first;
225
+	 * then also checks if any registered addons have been activated or upgraded
226
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
227
+	 * which runs during the WP 'plugins_loaded' action at priority 3
228
+	 *
229
+	 * @access public
230
+	 * @return void
231
+	 */
232
+	public function detect_activations_or_upgrades()
233
+	{
234
+		//first off: let's make sure to handle core
235
+		$this->detect_if_activation_or_upgrade();
236
+		foreach ($this->registry->addons as $addon) {
237
+			//detect teh request type for that addon
238
+			$addon->detect_activation_or_upgrade();
239
+		}
240
+	}
241
+
242
+
243
+
244
+	/**
245
+	 * detect_if_activation_or_upgrade
246
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
247
+	 * and either setting up the DB or setting up maintenance mode etc.
248
+	 *
249
+	 * @access public
250
+	 * @return void
251
+	 */
252
+	public function detect_if_activation_or_upgrade()
253
+	{
254
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
255
+		// load M-Mode class
256
+		$this->registry->load_core('Maintenance_Mode');
257
+		// check if db has been updated, or if its a brand-new installation
258
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
259
+		$request_type = $this->detect_req_type($espresso_db_update);
260
+		//EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
261
+		switch ($request_type) {
262
+			case EE_System::req_type_new_activation:
263
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
264
+				$this->_handle_core_version_change($espresso_db_update);
265
+				break;
266
+			case EE_System::req_type_reactivation:
267
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
268
+				$this->_handle_core_version_change($espresso_db_update);
269
+				break;
270
+			case EE_System::req_type_upgrade:
271
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
272
+				//migrations may be required now that we've upgraded
273
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
274
+				$this->_handle_core_version_change($espresso_db_update);
275
+				//				echo "done upgrade";die;
276
+				break;
277
+			case EE_System::req_type_downgrade:
278
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
279
+				//its possible migrations are no longer required
280
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
281
+				$this->_handle_core_version_change($espresso_db_update);
282
+				break;
283
+			case EE_System::req_type_normal:
284
+			default:
285
+				//				$this->_maybe_redirect_to_ee_about();
286
+				break;
287
+		}
288
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
289
+	}
290
+
291
+
292
+
293
+	/**
294
+	 * Updates the list of installed versions and sets hooks for
295
+	 * initializing the database later during the request
296
+	 *
297
+	 * @param array $espresso_db_update
298
+	 */
299
+	protected function _handle_core_version_change($espresso_db_update)
300
+	{
301
+		$this->update_list_of_installed_versions($espresso_db_update);
302
+		//get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
303
+		add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
304
+			array($this, 'initialize_db_if_no_migrations_required'));
305
+	}
306
+
307
+
308
+
309
+	/**
310
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
311
+	 * information about what versions of EE have been installed and activated,
312
+	 * NOT necessarily the state of the database
313
+	 *
314
+	 * @param null $espresso_db_update
315
+	 * @internal param array $espresso_db_update_value the value of the WordPress option. If not supplied, fetches it
316
+	 *           from the options table
317
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
318
+	 */
319
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
320
+	{
321
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
322
+		if ( ! $espresso_db_update) {
323
+			$espresso_db_update = get_option('espresso_db_update');
324
+		}
325
+		// check that option is an array
326
+		if ( ! is_array($espresso_db_update)) {
327
+			// if option is FALSE, then it never existed
328
+			if ($espresso_db_update === false) {
329
+				// make $espresso_db_update an array and save option with autoload OFF
330
+				$espresso_db_update = array();
331
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
332
+			} else {
333
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
334
+				$espresso_db_update = array($espresso_db_update => array());
335
+				update_option('espresso_db_update', $espresso_db_update);
336
+			}
337
+		} else {
338
+			$corrected_db_update = array();
339
+			//if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
340
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
341
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
342
+					//the key is an int, and the value IS NOT an array
343
+					//so it must be numerically-indexed, where values are versions installed...
344
+					//fix it!
345
+					$version_string = $should_be_array;
346
+					$corrected_db_update[$version_string] = array('unknown-date');
347
+				} else {
348
+					//ok it checks out
349
+					$corrected_db_update[$should_be_version_string] = $should_be_array;
350
+				}
351
+			}
352
+			$espresso_db_update = $corrected_db_update;
353
+			update_option('espresso_db_update', $espresso_db_update);
354
+		}
355
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
356
+		return $espresso_db_update;
357
+	}
358
+
359
+
360
+	/**
361
+	 * Does the traditional work of setting up the plugin's database and adding default data.
362
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
363
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
364
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
365
+	 * so that it will be done when migrations are finished
366
+	 *
367
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
368
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
369
+	 *                                       This is a resource-intensive job
370
+	 *                                       so we prefer to only do it when necessary
371
+	 * @return void
372
+	 * @throws EE_Error
373
+	 */
374
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
375
+	{
376
+		$request_type = $this->detect_req_type();
377
+		//only initialize system if we're not in maintenance mode.
378
+		if (EE_Maintenance_Mode::instance()->level() != EE_Maintenance_Mode::level_2_complete_maintenance) {
379
+			update_option('ee_flush_rewrite_rules', true);
380
+			if ($verify_schema) {
381
+				EEH_Activation::initialize_db_and_folders();
382
+			}
383
+			EEH_Activation::initialize_db_content();
384
+			EEH_Activation::system_initialization();
385
+			if ($initialize_addons_too) {
386
+				$this->initialize_addons();
387
+			}
388
+		} else {
389
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
390
+		}
391
+		if ($request_type === EE_System::req_type_new_activation
392
+			|| $request_type === EE_System::req_type_reactivation
393
+			|| (
394
+				$request_type === EE_System::req_type_upgrade
395
+				&& $this->is_major_version_change()
396
+			)
397
+		) {
398
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
399
+		}
400
+	}
401
+
402
+
403
+
404
+	/**
405
+	 * Initializes the db for all registered addons
406
+	 */
407
+	public function initialize_addons()
408
+	{
409
+		//foreach registered addon, make sure its db is up-to-date too
410
+		foreach ($this->registry->addons as $addon) {
411
+			$addon->initialize_db_if_no_migrations_required();
412
+		}
413
+	}
414
+
415
+
416
+
417
+	/**
418
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
419
+	 *
420
+	 * @param    array  $version_history
421
+	 * @param    string $current_version_to_add version to be added to the version history
422
+	 * @return    boolean success as to whether or not this option was changed
423
+	 */
424
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
425
+	{
426
+		if ( ! $version_history) {
427
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
428
+		}
429
+		if ($current_version_to_add == null) {
430
+			$current_version_to_add = espresso_version();
431
+		}
432
+		$version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
433
+		// re-save
434
+		return update_option('espresso_db_update', $version_history);
435
+	}
436
+
437
+
438
+
439
+	/**
440
+	 * Detects if the current version indicated in the has existed in the list of
441
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
442
+	 *
443
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
444
+	 *                                  If not supplied, fetches it from the options table.
445
+	 *                                  Also, caches its result so later parts of the code can also know whether
446
+	 *                                  there's been an update or not. This way we can add the current version to
447
+	 *                                  espresso_db_update, but still know if this is a new install or not
448
+	 * @return int one of the constants on EE_System::req_type_
449
+	 */
450
+	public function detect_req_type($espresso_db_update = null)
451
+	{
452
+		if ($this->_req_type === null) {
453
+			$espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
454
+				: $this->fix_espresso_db_upgrade_option();
455
+			$this->_req_type = $this->detect_req_type_given_activation_history($espresso_db_update,
456
+				'ee_espresso_activation', espresso_version());
457
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
458
+		}
459
+		return $this->_req_type;
460
+	}
461
+
462
+
463
+
464
+	/**
465
+	 * Returns whether or not there was a non-micro version change (ie, change in either
466
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
467
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
468
+	 *
469
+	 * @param $activation_history
470
+	 * @return bool
471
+	 */
472
+	protected function _detect_major_version_change($activation_history)
473
+	{
474
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
475
+		$previous_version_parts = explode('.', $previous_version);
476
+		$current_version_parts = explode('.', espresso_version());
477
+		return isset(
478
+			$previous_version_parts[0],
479
+			$previous_version_parts[1],
480
+			$current_version_parts[0],
481
+			$current_version_parts[1]
482
+		)
483
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
484
+				   || $previous_version_parts[1] !== $current_version_parts[1]
485
+			   );
486
+	}
487
+
488
+
489
+
490
+	/**
491
+	 * Returns true if either the major or minor version of EE changed during this request.
492
+	 * 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
493
+	 *
494
+	 * @return bool
495
+	 */
496
+	public function is_major_version_change()
497
+	{
498
+		return $this->_major_version_change;
499
+	}
500
+
501
+
502
+
503
+	/**
504
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
505
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the wordpress option which is temporarily
506
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
507
+	 * just activated to (for core that will always be espresso_version())
508
+	 *
509
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
510
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
511
+	 * @param string $activation_indicator_option_name the name of the wordpress option that is temporarily set to
512
+	 *                                                 indicate that this plugin was just activated
513
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
514
+	 *                                                 espresso_version())
515
+	 * @return int one of the constants on EE_System::req_type_*
516
+	 */
517
+	public static function detect_req_type_given_activation_history(
518
+		$activation_history_for_addon,
519
+		$activation_indicator_option_name,
520
+		$version_to_upgrade_to
521
+	) {
522
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
523
+		if ($activation_history_for_addon) {
524
+			//it exists, so this isn't a completely new install
525
+			//check if this version already in that list of previously installed versions
526
+			if (! isset($activation_history_for_addon[$version_to_upgrade_to])) {
527
+				//it a version we haven't seen before
528
+				if ($version_is_higher === 1) {
529
+					$req_type = EE_System::req_type_upgrade;
530
+				} else {
531
+					$req_type = EE_System::req_type_downgrade;
532
+				}
533
+				delete_option($activation_indicator_option_name);
534
+			} else {
535
+				// its not an update. maybe a reactivation?
536
+				if (get_option($activation_indicator_option_name, false)) {
537
+					if ($version_is_higher === -1) {
538
+						$req_type = EE_System::req_type_downgrade;
539
+					} elseif ($version_is_higher === 0) {
540
+						//we've seen this version before, but it's an activation. must be a reactivation
541
+						$req_type = EE_System::req_type_reactivation;
542
+					} else {//$version_is_higher === 1
543
+						$req_type = EE_System::req_type_upgrade;
544
+					}
545
+					delete_option($activation_indicator_option_name);
546
+				} else {
547
+					//we've seen this version before and the activation indicate doesn't show it was just activated
548
+					if ($version_is_higher === -1) {
549
+						$req_type = EE_System::req_type_downgrade;
550
+					} elseif ($version_is_higher === 0) {
551
+						//we've seen this version before and it's not an activation. its normal request
552
+						$req_type = EE_System::req_type_normal;
553
+					} else {//$version_is_higher === 1
554
+						$req_type = EE_System::req_type_upgrade;
555
+					}
556
+				}
557
+			}
558
+		} else {
559
+			//brand new install
560
+			$req_type = EE_System::req_type_new_activation;
561
+			delete_option($activation_indicator_option_name);
562
+		}
563
+		return $req_type;
564
+	}
565
+
566
+
567
+
568
+	/**
569
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
570
+	 * the $activation_history_for_addon
571
+	 *
572
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
573
+	 *                                             sometimes containing 'unknown-date'
574
+	 * @param string $version_to_upgrade_to        (current version)
575
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
576
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
577
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
578
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
579
+	 */
580
+	protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
581
+	{
582
+		//find the most recently-activated version
583
+		$most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history(
584
+			$activation_history_for_addon
585
+		);
586
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
587
+	}
588
+
589
+
590
+
591
+	/**
592
+	 * Gets the most recently active version listed in the activation history,
593
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
594
+	 *
595
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
596
+	 *                                   sometimes containing 'unknown-date'
597
+	 * @return string
598
+	 */
599
+	protected static function _get_most_recently_active_version_from_activation_history($activation_history)
600
+	{
601
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
602
+		$most_recently_active_version = '0.0.0.dev.000';
603
+		if (is_array($activation_history)) {
604
+			foreach ($activation_history as $version => $times_activated) {
605
+				//check there is a record of when this version was activated. Otherwise,
606
+				//mark it as unknown
607
+				if (! $times_activated) {
608
+					$times_activated = array('unknown-date');
609
+				}
610
+				if (is_string($times_activated)) {
611
+					$times_activated = array($times_activated);
612
+				}
613
+				foreach ($times_activated as $an_activation) {
614
+					if ($an_activation != 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
615
+						$most_recently_active_version = $version;
616
+						$most_recently_active_version_activation = $an_activation == 'unknown-date'
617
+							? '1970-01-01 00:00:00' : $an_activation;
618
+					}
619
+				}
620
+			}
621
+		}
622
+		return $most_recently_active_version;
623
+	}
624
+
625
+
626
+
627
+	/**
628
+	 * This redirects to the about EE page after activation
629
+	 *
630
+	 * @return void
631
+	 */
632
+	public function redirect_to_about_ee()
633
+	{
634
+		$notices = EE_Error::get_notices(false);
635
+		//if current user is an admin and it's not an ajax or rest request
636
+		if (! (defined('DOING_AJAX') && DOING_AJAX)
637
+			&& ! (defined('REST_REQUEST') && REST_REQUEST)
638
+			&& ! isset($notices['errors'])
639
+			&& apply_filters(
640
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
641
+				$this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
642
+			)
643
+		) {
644
+			$query_params = array('page' => 'espresso_about');
645
+			if (EE_System::instance()->detect_req_type() == EE_System::req_type_new_activation) {
646
+				$query_params['new_activation'] = true;
647
+			}
648
+			if (EE_System::instance()->detect_req_type() == EE_System::req_type_reactivation) {
649
+				$query_params['reactivation'] = true;
650
+			}
651
+			$url = add_query_arg($query_params, admin_url('admin.php'));
652
+			wp_safe_redirect($url);
653
+			exit();
654
+		}
655
+	}
656
+
657
+
658
+
659
+	/**
660
+	 * load_core_configuration
661
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
662
+	 * which runs during the WP 'plugins_loaded' action at priority 5
663
+	 *
664
+	 * @return void
665
+	 */
666
+	public function load_core_configuration()
667
+	{
668
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
669
+		$this->registry->load_core('EE_Load_Textdomain');
670
+		//load textdomain
671
+		EE_Load_Textdomain::load_textdomain();
672
+		// load and setup EE_Config and EE_Network_Config
673
+		$this->registry->load_core('Config');
674
+		$this->registry->load_core('Network_Config');
675
+		// setup autoloaders
676
+		// enable logging?
677
+		if ($this->registry->CFG->admin->use_full_logging) {
678
+			$this->registry->load_core('Log');
679
+		}
680
+		// check for activation errors
681
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
682
+		if ($activation_errors) {
683
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
684
+			update_option('ee_plugin_activation_errors', false);
685
+		}
686
+		// get model names
687
+		$this->_parse_model_names();
688
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
689
+	}
690
+
691
+
692
+
693
+	/**
694
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
695
+	 *
696
+	 * @return void
697
+	 */
698
+	private function _parse_model_names()
699
+	{
700
+		//get all the files in the EE_MODELS folder that end in .model.php
701
+		$models = glob(EE_MODELS . '*.model.php');
702
+		$model_names = array();
703
+		$non_abstract_db_models = array();
704
+		foreach ($models as $model) {
705
+			// get model classname
706
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
707
+			$short_name = str_replace('EEM_', '', $classname);
708
+			$reflectionClass = new ReflectionClass($classname);
709
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
710
+				$non_abstract_db_models[$short_name] = $classname;
711
+			}
712
+			$model_names[$short_name] = $classname;
713
+		}
714
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
715
+		$this->registry->non_abstract_db_models = apply_filters(
716
+			'FHEE__EE_System__parse_implemented_model_names',
717
+			$non_abstract_db_models
718
+		);
719
+	}
720
+
721
+
722
+
723
+	/**
724
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
725
+	 * that need to be setup before our EE_System launches.
726
+	 *
727
+	 * @return void
728
+	 */
729
+	private function _maybe_brew_regular()
730
+	{
731
+		if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
732
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
733
+		}
734
+	}
735
+
736
+
737
+
738
+	/**
739
+	 * register_shortcodes_modules_and_widgets
740
+	 * generate lists of shortcodes and modules, then verify paths and classes
741
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
742
+	 * which runs during the WP 'plugins_loaded' action at priority 7
743
+	 *
744
+	 * @access public
745
+	 * @return void
746
+	 */
747
+	public function register_shortcodes_modules_and_widgets()
748
+	{
749
+		try {
750
+			// load, register, and add shortcodes the new way
751
+			new ShortcodesManager(
752
+				// and the old way, but we'll put it under control of the new system
753
+				EE_Config::getLegacyShortcodesManager()
754
+			);
755
+		} catch (Exception $exception) {
756
+			new ExceptionStackTraceDisplay($exception);
757
+		}
758
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
759
+		// check for addons using old hookpoint
760
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
761
+			$this->_incompatible_addon_error();
762
+		}
763
+	}
764
+
765
+
766
+
767
+	/**
768
+	 * _incompatible_addon_error
769
+	 *
770
+	 * @access public
771
+	 * @return void
772
+	 */
773
+	private function _incompatible_addon_error()
774
+	{
775
+		// get array of classes hooking into here
776
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
777
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
778
+		);
779
+		if (! empty($class_names)) {
780
+			$msg = esc_html__(
781
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
782
+				'event_espresso'
783
+			);
784
+			$msg .= '<ul>';
785
+			foreach ($class_names as $class_name) {
786
+				$msg .= '<li><b>Event Espresso - '
787
+						. str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '', $class_name)
788
+						. '</b></li>';
789
+			}
790
+			$msg .= '</ul>';
791
+			$msg .= esc_html__(
792
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
793
+				'event_espresso'
794
+			);
795
+			// save list of incompatible addons to wp-options for later use
796
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
797
+			if (is_admin()) {
798
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
799
+			}
800
+		}
801
+	}
802
+
803
+
804
+
805
+	/**
806
+	 * brew_espresso
807
+	 * begins the process of setting hooks for initializing EE in the correct order
808
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hookpoint
809
+	 * which runs during the WP 'plugins_loaded' action at priority 9
810
+	 *
811
+	 * @return void
812
+	 */
813
+	public function brew_espresso()
814
+	{
815
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
816
+		// load some final core systems
817
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
818
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
819
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
820
+		add_action('init', array($this, 'load_controllers'), 7);
821
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
822
+		add_action('init', array($this, 'initialize'), 10);
823
+		add_action('init', array($this, 'initialize_last'), 100);
824
+		add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
825
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
826
+			// pew pew pew
827
+			$this->registry->load_core('PUE');
828
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
829
+		}
830
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
831
+	}
832
+
833
+
834
+
835
+	/**
836
+	 *    set_hooks_for_core
837
+	 *
838
+	 * @access public
839
+	 * @return    void
840
+	 */
841
+	public function set_hooks_for_core()
842
+	{
843
+		$this->_deactivate_incompatible_addons();
844
+		do_action('AHEE__EE_System__set_hooks_for_core');
845
+	}
846
+
847
+
848
+
849
+	/**
850
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
851
+	 * deactivates any addons considered incompatible with the current version of EE
852
+	 */
853
+	private function _deactivate_incompatible_addons()
854
+	{
855
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
856
+		if (! empty($incompatible_addons)) {
857
+			$active_plugins = get_option('active_plugins', array());
858
+			foreach ($active_plugins as $active_plugin) {
859
+				foreach ($incompatible_addons as $incompatible_addon) {
860
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
861
+						unset($_GET['activate']);
862
+						espresso_deactivate_plugin($active_plugin);
863
+					}
864
+				}
865
+			}
866
+		}
867
+	}
868
+
869
+
870
+
871
+	/**
872
+	 *    perform_activations_upgrades_and_migrations
873
+	 *
874
+	 * @access public
875
+	 * @return    void
876
+	 */
877
+	public function perform_activations_upgrades_and_migrations()
878
+	{
879
+		//first check if we had previously attempted to setup EE's directories but failed
880
+		if (EEH_Activation::upload_directories_incomplete()) {
881
+			EEH_Activation::create_upload_directories();
882
+		}
883
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
884
+	}
885
+
886
+
887
+
888
+	/**
889
+	 *    load_CPTs_and_session
890
+	 *
891
+	 * @access public
892
+	 * @return    void
893
+	 */
894
+	public function load_CPTs_and_session()
895
+	{
896
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
897
+		// register Custom Post Types
898
+		$this->registry->load_core('Register_CPTs');
899
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
900
+	}
901
+
902
+
903
+
904
+	/**
905
+	 * load_controllers
906
+	 * this is the best place to load any additional controllers that needs access to EE core.
907
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
908
+	 * time
909
+	 *
910
+	 * @access public
911
+	 * @return void
912
+	 */
913
+	public function load_controllers()
914
+	{
915
+		do_action('AHEE__EE_System__load_controllers__start');
916
+		// let's get it started
917
+		if (! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
918
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
919
+			$this->registry->load_core('Front_Controller');
920
+		} elseif (! EE_FRONT_AJAX) {
921
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
922
+			EE_Registry::instance()->load_core('Admin');
923
+		}
924
+		do_action('AHEE__EE_System__load_controllers__complete');
925
+	}
926
+
927
+
928
+
929
+	/**
930
+	 * core_loaded_and_ready
931
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
932
+	 *
933
+	 * @access public
934
+	 * @return void
935
+	 */
936
+	public function core_loaded_and_ready()
937
+	{
938
+		do_action('AHEE__EE_System__core_loaded_and_ready');
939
+		// load_espresso_template_tags
940
+		if (is_readable(EE_PUBLIC . 'template_tags.php')) {
941
+			require_once(EE_PUBLIC . 'template_tags.php');
942
+		}
943
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
944
+		$this->registry->load_core('Session');
945
+		$this->registry->create('EventEspresso\core\services\assets\Registry');
946
+		wp_enqueue_script('espresso_core');
947
+	}
948
+
949
+
950
+
951
+	/**
952
+	 * initialize
953
+	 * this is the best place to begin initializing client code
954
+	 *
955
+	 * @access public
956
+	 * @return void
957
+	 */
958
+	public function initialize()
959
+	{
960
+		do_action('AHEE__EE_System__initialize');
961
+	}
962
+
963
+
964
+
965
+	/**
966
+	 * initialize_last
967
+	 * this is run really late during the WP init hookpoint, and ensures that mostly everything else that needs to
968
+	 * initialize has done so
969
+	 *
970
+	 * @access public
971
+	 * @return void
972
+	 */
973
+	public function initialize_last()
974
+	{
975
+		do_action('AHEE__EE_System__initialize_last');
976
+	}
977
+
978
+
979
+
980
+	/**
981
+	 * set_hooks_for_shortcodes_modules_and_addons
982
+	 * this is the best place for other systems to set callbacks for hooking into other parts of EE
983
+	 * this happens at the very beginning of the wp_loaded hookpoint
984
+	 *
985
+	 * @access public
986
+	 * @return void
987
+	 */
988
+	public function set_hooks_for_shortcodes_modules_and_addons()
989
+	{
990
+		//		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
991
+	}
992
+
993
+
994
+
995
+	/**
996
+	 * do_not_cache
997
+	 * sets no cache headers and defines no cache constants for WP plugins
998
+	 *
999
+	 * @access public
1000
+	 * @return void
1001
+	 */
1002
+	public static function do_not_cache()
1003
+	{
1004
+		// set no cache constants
1005
+		if (! defined('DONOTCACHEPAGE')) {
1006
+			define('DONOTCACHEPAGE', true);
1007
+		}
1008
+		if (! defined('DONOTCACHCEOBJECT')) {
1009
+			define('DONOTCACHCEOBJECT', true);
1010
+		}
1011
+		if (! defined('DONOTCACHEDB')) {
1012
+			define('DONOTCACHEDB', true);
1013
+		}
1014
+		// add no cache headers
1015
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1016
+		// plus a little extra for nginx and Google Chrome
1017
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1018
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes
1019
+		// with the registration process
1020
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1021
+	}
1022
+
1023
+
1024
+
1025
+	/**
1026
+	 *    extra_nocache_headers
1027
+	 *
1028
+	 * @access    public
1029
+	 * @param $headers
1030
+	 * @return    array
1031
+	 */
1032
+	public static function extra_nocache_headers($headers)
1033
+	{
1034
+		// for NGINX
1035
+		$headers['X-Accel-Expires'] = 0;
1036
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1037
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1038
+		return $headers;
1039
+	}
1040
+
1041
+
1042
+
1043
+	/**
1044
+	 *    nocache_headers
1045
+	 *
1046
+	 * @access    public
1047
+	 * @return    void
1048
+	 */
1049
+	public static function nocache_headers()
1050
+	{
1051
+		nocache_headers();
1052
+	}
1053
+
1054
+
1055
+
1056
+	/**
1057
+	 *    espresso_toolbar_items
1058
+	 *
1059
+	 * @access public
1060
+	 * @param  WP_Admin_Bar $admin_bar
1061
+	 * @return void
1062
+	 */
1063
+	public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1064
+	{
1065
+		// if in full M-Mode, or its an AJAX request, or user is NOT an admin
1066
+		if (EE_Maintenance_Mode::instance()->level() == EE_Maintenance_Mode::level_2_complete_maintenance
1067
+			|| defined('DOING_AJAX')
1068
+			|| ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1069
+		) {
1070
+			return;
1071
+		}
1072
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1073
+		$menu_class = 'espresso_menu_item_class';
1074
+		//we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1075
+		//because they're only defined in each of their respective constructors
1076
+		//and this might be a frontend request, in which case they aren't available
1077
+		$events_admin_url = admin_url("admin.php?page=espresso_events");
1078
+		$reg_admin_url = admin_url("admin.php?page=espresso_registrations");
1079
+		$extensions_admin_url = admin_url("admin.php?page=espresso_packages");
1080
+		//Top Level
1081
+		$admin_bar->add_menu(array(
1082
+			'id'    => 'espresso-toolbar',
1083
+			'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1084
+					   . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1085
+					   . '</span>',
1086
+			'href'  => $events_admin_url,
1087
+			'meta'  => array(
1088
+				'title' => esc_html__('Event Espresso', 'event_espresso'),
1089
+				'class' => $menu_class . 'first',
1090
+			),
1091
+		));
1092
+		//Events
1093
+		if ($this->registry->CAP->current_user_can(
1094
+			'ee_read_events',
1095
+			'ee_admin_bar_menu_espresso-toolbar-events'
1096
+		)) {
1097
+			$admin_bar->add_menu(array(
1098
+				'id'     => 'espresso-toolbar-events',
1099
+				'parent' => 'espresso-toolbar',
1100
+				'title'  => esc_html__('Events', 'event_espresso'),
1101
+				'href'   => $events_admin_url,
1102
+				'meta'   => array(
1103
+					'title'  => esc_html__('Events', 'event_espresso'),
1104
+					'target' => '',
1105
+					'class'  => $menu_class,
1106
+				),
1107
+			));
1108
+		}
1109
+		if ($this->registry->CAP->current_user_can(
1110
+			'ee_edit_events',
1111
+			'ee_admin_bar_menu_espresso-toolbar-events-new'
1112
+		)) {
1113
+			//Events Add New
1114
+			$admin_bar->add_menu(array(
1115
+				'id'     => 'espresso-toolbar-events-new',
1116
+				'parent' => 'espresso-toolbar-events',
1117
+				'title'  => esc_html__('Add New', 'event_espresso'),
1118
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1119
+				'meta'   => array(
1120
+					'title'  => esc_html__('Add New', 'event_espresso'),
1121
+					'target' => '',
1122
+					'class'  => $menu_class,
1123
+				),
1124
+			));
1125
+		}
1126
+		if (is_single() && (get_post_type() == 'espresso_events')) {
1127
+			//Current post
1128
+			global $post;
1129
+			if ($this->registry->CAP->current_user_can('ee_edit_event',
1130
+				'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1131
+			) {
1132
+				//Events Edit Current Event
1133
+				$admin_bar->add_menu(array(
1134
+					'id'     => 'espresso-toolbar-events-edit',
1135
+					'parent' => 'espresso-toolbar-events',
1136
+					'title'  => esc_html__('Edit Event', 'event_espresso'),
1137
+					'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1138
+						$events_admin_url),
1139
+					'meta'   => array(
1140
+						'title'  => esc_html__('Edit Event', 'event_espresso'),
1141
+						'target' => '',
1142
+						'class'  => $menu_class,
1143
+					),
1144
+				));
1145
+			}
1146
+		}
1147
+		//Events View
1148
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1149
+			'ee_admin_bar_menu_espresso-toolbar-events-view')
1150
+		) {
1151
+			$admin_bar->add_menu(array(
1152
+				'id'     => 'espresso-toolbar-events-view',
1153
+				'parent' => 'espresso-toolbar-events',
1154
+				'title'  => esc_html__('View', 'event_espresso'),
1155
+				'href'   => $events_admin_url,
1156
+				'meta'   => array(
1157
+					'title'  => esc_html__('View', 'event_espresso'),
1158
+					'target' => '',
1159
+					'class'  => $menu_class,
1160
+				),
1161
+			));
1162
+		}
1163
+		if ($this->registry->CAP->current_user_can(
1164
+			'ee_read_events',
1165
+			'ee_admin_bar_menu_espresso-toolbar-events-all'
1166
+		)) {
1167
+			//Events View All
1168
+			$admin_bar->add_menu(array(
1169
+				'id'     => 'espresso-toolbar-events-all',
1170
+				'parent' => 'espresso-toolbar-events-view',
1171
+				'title'  => esc_html__('All', 'event_espresso'),
1172
+				'href'   => $events_admin_url,
1173
+				'meta'   => array(
1174
+					'title'  => esc_html__('All', 'event_espresso'),
1175
+					'target' => '',
1176
+					'class'  => $menu_class,
1177
+				),
1178
+			));
1179
+		}
1180
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1181
+			'ee_admin_bar_menu_espresso-toolbar-events-today')
1182
+		) {
1183
+			//Events View Today
1184
+			$admin_bar->add_menu(array(
1185
+				'id'     => 'espresso-toolbar-events-today',
1186
+				'parent' => 'espresso-toolbar-events-view',
1187
+				'title'  => esc_html__('Today', 'event_espresso'),
1188
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1189
+					$events_admin_url),
1190
+				'meta'   => array(
1191
+					'title'  => esc_html__('Today', 'event_espresso'),
1192
+					'target' => '',
1193
+					'class'  => $menu_class,
1194
+				),
1195
+			));
1196
+		}
1197
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1198
+			'ee_admin_bar_menu_espresso-toolbar-events-month')
1199
+		) {
1200
+			//Events View This Month
1201
+			$admin_bar->add_menu(array(
1202
+				'id'     => 'espresso-toolbar-events-month',
1203
+				'parent' => 'espresso-toolbar-events-view',
1204
+				'title'  => esc_html__('This Month', 'event_espresso'),
1205
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1206
+					$events_admin_url),
1207
+				'meta'   => array(
1208
+					'title'  => esc_html__('This Month', 'event_espresso'),
1209
+					'target' => '',
1210
+					'class'  => $menu_class,
1211
+				),
1212
+			));
1213
+		}
1214
+		//Registration Overview
1215
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1216
+			'ee_admin_bar_menu_espresso-toolbar-registrations')
1217
+		) {
1218
+			$admin_bar->add_menu(array(
1219
+				'id'     => 'espresso-toolbar-registrations',
1220
+				'parent' => 'espresso-toolbar',
1221
+				'title'  => esc_html__('Registrations', 'event_espresso'),
1222
+				'href'   => $reg_admin_url,
1223
+				'meta'   => array(
1224
+					'title'  => esc_html__('Registrations', 'event_espresso'),
1225
+					'target' => '',
1226
+					'class'  => $menu_class,
1227
+				),
1228
+			));
1229
+		}
1230
+		//Registration Overview Today
1231
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1232
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1233
+		) {
1234
+			$admin_bar->add_menu(array(
1235
+				'id'     => 'espresso-toolbar-registrations-today',
1236
+				'parent' => 'espresso-toolbar-registrations',
1237
+				'title'  => esc_html__('Today', 'event_espresso'),
1238
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1239
+					$reg_admin_url),
1240
+				'meta'   => array(
1241
+					'title'  => esc_html__('Today', 'event_espresso'),
1242
+					'target' => '',
1243
+					'class'  => $menu_class,
1244
+				),
1245
+			));
1246
+		}
1247
+		//Registration Overview Today Completed
1248
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1249
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1250
+		) {
1251
+			$admin_bar->add_menu(array(
1252
+				'id'     => 'espresso-toolbar-registrations-today-approved',
1253
+				'parent' => 'espresso-toolbar-registrations-today',
1254
+				'title'  => esc_html__('Approved', 'event_espresso'),
1255
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1256
+					'action'      => 'default',
1257
+					'status'      => 'today',
1258
+					'_reg_status' => EEM_Registration::status_id_approved,
1259
+				), $reg_admin_url),
1260
+				'meta'   => array(
1261
+					'title'  => esc_html__('Approved', 'event_espresso'),
1262
+					'target' => '',
1263
+					'class'  => $menu_class,
1264
+				),
1265
+			));
1266
+		}
1267
+		//Registration Overview Today Pending\
1268
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1269
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1270
+		) {
1271
+			$admin_bar->add_menu(array(
1272
+				'id'     => 'espresso-toolbar-registrations-today-pending',
1273
+				'parent' => 'espresso-toolbar-registrations-today',
1274
+				'title'  => esc_html__('Pending', 'event_espresso'),
1275
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1276
+					'action'     => 'default',
1277
+					'status'     => 'today',
1278
+					'reg_status' => EEM_Registration::status_id_pending_payment,
1279
+				), $reg_admin_url),
1280
+				'meta'   => array(
1281
+					'title'  => esc_html__('Pending Payment', 'event_espresso'),
1282
+					'target' => '',
1283
+					'class'  => $menu_class,
1284
+				),
1285
+			));
1286
+		}
1287
+		//Registration Overview Today Incomplete
1288
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1289
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1290
+		) {
1291
+			$admin_bar->add_menu(array(
1292
+				'id'     => 'espresso-toolbar-registrations-today-not-approved',
1293
+				'parent' => 'espresso-toolbar-registrations-today',
1294
+				'title'  => esc_html__('Not Approved', 'event_espresso'),
1295
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1296
+					'action'      => 'default',
1297
+					'status'      => 'today',
1298
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1299
+				), $reg_admin_url),
1300
+				'meta'   => array(
1301
+					'title'  => esc_html__('Not Approved', 'event_espresso'),
1302
+					'target' => '',
1303
+					'class'  => $menu_class,
1304
+				),
1305
+			));
1306
+		}
1307
+		//Registration Overview Today Incomplete
1308
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1309
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1310
+		) {
1311
+			$admin_bar->add_menu(array(
1312
+				'id'     => 'espresso-toolbar-registrations-today-cancelled',
1313
+				'parent' => 'espresso-toolbar-registrations-today',
1314
+				'title'  => esc_html__('Cancelled', 'event_espresso'),
1315
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1316
+					'action'      => 'default',
1317
+					'status'      => 'today',
1318
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1319
+				), $reg_admin_url),
1320
+				'meta'   => array(
1321
+					'title'  => esc_html__('Cancelled', 'event_espresso'),
1322
+					'target' => '',
1323
+					'class'  => $menu_class,
1324
+				),
1325
+			));
1326
+		}
1327
+		//Registration Overview This Month
1328
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1329
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1330
+		) {
1331
+			$admin_bar->add_menu(array(
1332
+				'id'     => 'espresso-toolbar-registrations-month',
1333
+				'parent' => 'espresso-toolbar-registrations',
1334
+				'title'  => esc_html__('This Month', 'event_espresso'),
1335
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1336
+					$reg_admin_url),
1337
+				'meta'   => array(
1338
+					'title'  => esc_html__('This Month', 'event_espresso'),
1339
+					'target' => '',
1340
+					'class'  => $menu_class,
1341
+				),
1342
+			));
1343
+		}
1344
+		//Registration Overview This Month Approved
1345
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1346
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1347
+		) {
1348
+			$admin_bar->add_menu(array(
1349
+				'id'     => 'espresso-toolbar-registrations-month-approved',
1350
+				'parent' => 'espresso-toolbar-registrations-month',
1351
+				'title'  => esc_html__('Approved', 'event_espresso'),
1352
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1353
+					'action'      => 'default',
1354
+					'status'      => 'month',
1355
+					'_reg_status' => EEM_Registration::status_id_approved,
1356
+				), $reg_admin_url),
1357
+				'meta'   => array(
1358
+					'title'  => esc_html__('Approved', 'event_espresso'),
1359
+					'target' => '',
1360
+					'class'  => $menu_class,
1361
+				),
1362
+			));
1363
+		}
1364
+		//Registration Overview This Month Pending
1365
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1366
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1367
+		) {
1368
+			$admin_bar->add_menu(array(
1369
+				'id'     => 'espresso-toolbar-registrations-month-pending',
1370
+				'parent' => 'espresso-toolbar-registrations-month',
1371
+				'title'  => esc_html__('Pending', 'event_espresso'),
1372
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1373
+					'action'      => 'default',
1374
+					'status'      => 'month',
1375
+					'_reg_status' => EEM_Registration::status_id_pending_payment,
1376
+				), $reg_admin_url),
1377
+				'meta'   => array(
1378
+					'title'  => esc_html__('Pending', 'event_espresso'),
1379
+					'target' => '',
1380
+					'class'  => $menu_class,
1381
+				),
1382
+			));
1383
+		}
1384
+		//Registration Overview This Month Not Approved
1385
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1386
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1387
+		) {
1388
+			$admin_bar->add_menu(array(
1389
+				'id'     => 'espresso-toolbar-registrations-month-not-approved',
1390
+				'parent' => 'espresso-toolbar-registrations-month',
1391
+				'title'  => esc_html__('Not Approved', 'event_espresso'),
1392
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1393
+					'action'      => 'default',
1394
+					'status'      => 'month',
1395
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1396
+				), $reg_admin_url),
1397
+				'meta'   => array(
1398
+					'title'  => esc_html__('Not Approved', 'event_espresso'),
1399
+					'target' => '',
1400
+					'class'  => $menu_class,
1401
+				),
1402
+			));
1403
+		}
1404
+		//Registration Overview This Month Cancelled
1405
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1406
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1407
+		) {
1408
+			$admin_bar->add_menu(array(
1409
+				'id'     => 'espresso-toolbar-registrations-month-cancelled',
1410
+				'parent' => 'espresso-toolbar-registrations-month',
1411
+				'title'  => esc_html__('Cancelled', 'event_espresso'),
1412
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1413
+					'action'      => 'default',
1414
+					'status'      => 'month',
1415
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1416
+				), $reg_admin_url),
1417
+				'meta'   => array(
1418
+					'title'  => esc_html__('Cancelled', 'event_espresso'),
1419
+					'target' => '',
1420
+					'class'  => $menu_class,
1421
+				),
1422
+			));
1423
+		}
1424
+		//Extensions & Services
1425
+		if ($this->registry->CAP->current_user_can('ee_read_ee',
1426
+			'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1427
+		) {
1428
+			$admin_bar->add_menu(array(
1429
+				'id'     => 'espresso-toolbar-extensions-and-services',
1430
+				'parent' => 'espresso-toolbar',
1431
+				'title'  => esc_html__('Extensions & Services', 'event_espresso'),
1432
+				'href'   => $extensions_admin_url,
1433
+				'meta'   => array(
1434
+					'title'  => esc_html__('Extensions & Services', 'event_espresso'),
1435
+					'target' => '',
1436
+					'class'  => $menu_class,
1437
+				),
1438
+			));
1439
+		}
1440
+	}
1441
+
1442
+
1443
+
1444
+	/**
1445
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1446
+	 * never returned with the function.
1447
+	 *
1448
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1449
+	 * @return array
1450
+	 */
1451
+	public function remove_pages_from_wp_list_pages($exclude_array)
1452
+	{
1453
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1454
+	}
1455 1455
 
1456 1456
 
1457 1457
 
Please login to merge, or discard this patch.
Spacing   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
     {
190 190
         // set autoloaders for all of the classes implementing EEI_Plugin_API
191 191
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
192
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
192
+        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
193 193
         //load and setup EE_Capabilities
194 194
         $this->registry->load_core('Capabilities');
195 195
 
@@ -210,7 +210,7 @@  discard block
 block discarded – undo
210 210
                 && $_GET['activate'] === 'true'
211 211
             )
212 212
         ) {
213
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
213
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth'.DS.'basic-auth.php';
214 214
         }
215 215
         $this->_maybe_brew_regular();
216 216
         do_action('AHEE__EE_System__load_espresso_addons__complete');
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
         if ($activation_history_for_addon) {
524 524
             //it exists, so this isn't a completely new install
525 525
             //check if this version already in that list of previously installed versions
526
-            if (! isset($activation_history_for_addon[$version_to_upgrade_to])) {
526
+            if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
527 527
                 //it a version we haven't seen before
528 528
                 if ($version_is_higher === 1) {
529 529
                     $req_type = EE_System::req_type_upgrade;
@@ -604,7 +604,7 @@  discard block
 block discarded – undo
604 604
             foreach ($activation_history as $version => $times_activated) {
605 605
                 //check there is a record of when this version was activated. Otherwise,
606 606
                 //mark it as unknown
607
-                if (! $times_activated) {
607
+                if ( ! $times_activated) {
608 608
                     $times_activated = array('unknown-date');
609 609
                 }
610 610
                 if (is_string($times_activated)) {
@@ -633,7 +633,7 @@  discard block
 block discarded – undo
633 633
     {
634 634
         $notices = EE_Error::get_notices(false);
635 635
         //if current user is an admin and it's not an ajax or rest request
636
-        if (! (defined('DOING_AJAX') && DOING_AJAX)
636
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX)
637 637
             && ! (defined('REST_REQUEST') && REST_REQUEST)
638 638
             && ! isset($notices['errors'])
639 639
             && apply_filters(
@@ -698,7 +698,7 @@  discard block
 block discarded – undo
698 698
     private function _parse_model_names()
699 699
     {
700 700
         //get all the files in the EE_MODELS folder that end in .model.php
701
-        $models = glob(EE_MODELS . '*.model.php');
701
+        $models = glob(EE_MODELS.'*.model.php');
702 702
         $model_names = array();
703 703
         $non_abstract_db_models = array();
704 704
         foreach ($models as $model) {
@@ -728,8 +728,8 @@  discard block
 block discarded – undo
728 728
      */
729 729
     private function _maybe_brew_regular()
730 730
     {
731
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
732
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
731
+        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH.'brewing_regular.php')) {
732
+            require_once EE_CAFF_PATH.'brewing_regular.php';
733 733
         }
734 734
     }
735 735
 
@@ -776,7 +776,7 @@  discard block
 block discarded – undo
776 776
         $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
777 777
             'AHEE__EE_System__register_shortcodes_modules_and_addons'
778 778
         );
779
-        if (! empty($class_names)) {
779
+        if ( ! empty($class_names)) {
780 780
             $msg = esc_html__(
781 781
                 'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
782 782
                 'event_espresso'
@@ -853,7 +853,7 @@  discard block
 block discarded – undo
853 853
     private function _deactivate_incompatible_addons()
854 854
     {
855 855
         $incompatible_addons = get_option('ee_incompatible_addons', array());
856
-        if (! empty($incompatible_addons)) {
856
+        if ( ! empty($incompatible_addons)) {
857 857
             $active_plugins = get_option('active_plugins', array());
858 858
             foreach ($active_plugins as $active_plugin) {
859 859
                 foreach ($incompatible_addons as $incompatible_addon) {
@@ -914,10 +914,10 @@  discard block
 block discarded – undo
914 914
     {
915 915
         do_action('AHEE__EE_System__load_controllers__start');
916 916
         // let's get it started
917
-        if (! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
917
+        if ( ! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
918 918
             do_action('AHEE__EE_System__load_controllers__load_front_controllers');
919 919
             $this->registry->load_core('Front_Controller');
920
-        } elseif (! EE_FRONT_AJAX) {
920
+        } elseif ( ! EE_FRONT_AJAX) {
921 921
             do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
922 922
             EE_Registry::instance()->load_core('Admin');
923 923
         }
@@ -937,8 +937,8 @@  discard block
 block discarded – undo
937 937
     {
938 938
         do_action('AHEE__EE_System__core_loaded_and_ready');
939 939
         // load_espresso_template_tags
940
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
941
-            require_once(EE_PUBLIC . 'template_tags.php');
940
+        if (is_readable(EE_PUBLIC.'template_tags.php')) {
941
+            require_once(EE_PUBLIC.'template_tags.php');
942 942
         }
943 943
         do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
944 944
         $this->registry->load_core('Session');
@@ -1002,13 +1002,13 @@  discard block
 block discarded – undo
1002 1002
     public static function do_not_cache()
1003 1003
     {
1004 1004
         // set no cache constants
1005
-        if (! defined('DONOTCACHEPAGE')) {
1005
+        if ( ! defined('DONOTCACHEPAGE')) {
1006 1006
             define('DONOTCACHEPAGE', true);
1007 1007
         }
1008
-        if (! defined('DONOTCACHCEOBJECT')) {
1008
+        if ( ! defined('DONOTCACHCEOBJECT')) {
1009 1009
             define('DONOTCACHCEOBJECT', true);
1010 1010
         }
1011
-        if (! defined('DONOTCACHEDB')) {
1011
+        if ( ! defined('DONOTCACHEDB')) {
1012 1012
             define('DONOTCACHEDB', true);
1013 1013
         }
1014 1014
         // add no cache headers
@@ -1086,7 +1086,7 @@  discard block
 block discarded – undo
1086 1086
             'href'  => $events_admin_url,
1087 1087
             'meta'  => array(
1088 1088
                 'title' => esc_html__('Event Espresso', 'event_espresso'),
1089
-                'class' => $menu_class . 'first',
1089
+                'class' => $menu_class.'first',
1090 1090
             ),
1091 1091
         ));
1092 1092
         //Events
Please login to merge, or discard this patch.
core/EE_Capabilities.core.php 2 patches
Indentation   +1249 added lines, -1249 removed lines patch added patch discarded remove patch
@@ -17,872 +17,872 @@  discard block
 block discarded – undo
17 17
 final class EE_Capabilities extends EE_Base
18 18
 {
19 19
 
20
-    /**
21
-     * the name of the wp option used to store caps previously initialized
22
-     */
23
-    const option_name = 'ee_caps_initialized';
24
-
25
-    /**
26
-     * instance of EE_Capabilities object
27
-     *
28
-     * @var EE_Capabilities
29
-     */
30
-    private static $_instance;
31
-
32
-
33
-    /**
34
-     * This is a map of caps that correspond to a default WP_Role.
35
-     * Array is indexed by Role and values are ee capabilities.
36
-     *
37
-     * @since 4.5.0
38
-     *
39
-     * @var array
40
-     */
41
-    private $_caps_map = array();
42
-
43
-
44
-    /**
45
-     * This used to hold an array of EE_Meta_Capability_Map objects that define the granular capabilities mapped to for
46
-     * a user depending on context.
47
-     *
48
-     * @var EE_Meta_Capability_Map[]
49
-     */
50
-    private $_meta_caps = array();
51
-
52
-
53
-    /**
54
-     * Used to track whether the capabilities have been initialized or not in this request.
55
-     * @var bool
56
-     */
57
-    private $_has_been_initialized = false;
58
-
59
-
60
-
61
-
62
-    /**
63
-     * singleton method used to instantiate class object
64
-     *
65
-     * @since 4.5.0
66
-     *
67
-     * @return EE_Capabilities
68
-     */
69
-    public static function instance()
70
-    {
71
-        //check if instantiated, and if not do so.
72
-        if (! self::$_instance instanceof EE_Capabilities) {
73
-            self::$_instance = new self();
74
-        }
75
-        return self::$_instance;
76
-    }
77
-
78
-
79
-    /**
80
-     * private constructor
81
-     *
82
-     * @since 4.5.0
83
-     *
84
-     * @return \EE_Capabilities
85
-     */
86
-    private function __construct()
87
-    {
88
-    }
89
-
90
-
91
-    /**
92
-     * This delays the initialization of the capabilities class until EE_System core is loaded and ready.
93
-     *
94
-     * @param bool $reset allows for resetting the default capabilities saved on roles.  Note that this doesn't
95
-     *                    actually REMOVE any capabilities from existing roles, it just resaves defaults roles and
96
-     *                    ensures that they are up to date.
97
-     * @return void
98
-     * @throws EE_Error
99
-     * @throws InvalidExecutionPathException
100
-     * @since 4.5.0
101
-     */
102
-    public function init_caps($reset = false)
103
-    {
104
-        if (EE_Maintenance_Mode::instance()->models_can_query()
105
-            && ! $this->has_been_initialized($reset)
106
-        ) {
107
-            do_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call', $this, $reset);
108
-            $this->init_cap_logic($reset);
109
-        }
110
-    }
111
-
112
-
113
-    /**
114
-     * Executes the logic for initializing EE capabilities.
115
-     * It is preferable to go through `init_caps` and this should not be called directly it's only public because of
116
-     * that being a requirement of being a callback on a WordPress hook.
117
-     *
118
-     * @param bool $reset
119
-     * @throws EE_Error
120
-     * @throws InvalidExecutionPathException
121
-     * @since 4.9.41.rc.006
122
-     */
123
-    public function init_cap_logic($reset = false)
124
-    {
125
-        if (! did_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call')) {
126
-            throw new InvalidExecutionPathException(
127
-                esc_html__(
128
-                    '%1$s should not be called before the %2$s hook has fired.  It is recommended to instead use %s',
129
-                    'event_espresso'
130
-                )
131
-            );
132
-        }
133
-        if (! $this->has_been_initialized($reset)) {
134
-            $this->_caps_map = $this->_init_caps_map();
135
-            $this->init_role_caps($reset);
136
-            $this->_set_meta_caps();
137
-            $this->_has_been_initialized = true;
138
-        }
139
-    }
140
-
141
-
142
-    /**
143
-     * Returns whether EE_Capabilities have been initialized or not.
144
-     * @param bool $reset
145
-     * @return bool
146
-     */
147
-    public function has_been_initialized($reset = false)
148
-    {
149
-        return ! $reset ? $this->_has_been_initialized : false;
150
-    }
151
-
152
-
153
-    /**
154
-     * This sets the meta caps property.
155
-     *
156
-     * @since 4.5.0
157
-     * @return void
158
-     * @throws EE_Error
159
-     */
160
-    private function _set_meta_caps()
161
-    {
162
-        //make sure we're only ever initializing the default _meta_caps array once if it's empty.
163
-        $this->_meta_caps = $this->_get_default_meta_caps_array();
164
-        $this->_meta_caps = apply_filters('FHEE__EE_Capabilities___set_meta_caps__meta_caps', $this->_meta_caps);
165
-        //add filter for map_meta_caps but only if models can query.
166
-        if (! has_filter('map_meta_cap', array($this, 'map_meta_caps'))) {
167
-            add_filter('map_meta_cap', array($this, 'map_meta_caps'), 10, 4);
168
-        }
169
-    }
170
-
171
-
172
-    /**
173
-     * This builds and returns the default meta_caps array only once.
174
-     *
175
-     * @since  4.8.28.rc.012
176
-     * @return array
177
-     * @throws \EE_Error
178
-     */
179
-    private function _get_default_meta_caps_array()
180
-    {
181
-        static $default_meta_caps = array();
182
-        if (empty($default_meta_caps)) {
183
-            $default_meta_caps = array(
184
-                //edits
185
-                new EE_Meta_Capability_Map_Edit(
186
-                    'ee_edit_event',
187
-                    array('Event', 'ee_edit_published_events', 'ee_edit_others_events', 'ee_edit_private_events')
188
-                ),
189
-                new EE_Meta_Capability_Map_Edit(
190
-                    'ee_edit_venue',
191
-                    array('Venue', 'ee_edit_published_venues', 'ee_edit_others_venues', 'ee_edit_private_venues')
192
-                ),
193
-                new EE_Meta_Capability_Map_Edit(
194
-                    'ee_edit_registration',
195
-                    array('Registration', '', 'ee_edit_others_registrations', '')
196
-                ),
197
-                new EE_Meta_Capability_Map_Edit(
198
-                    'ee_edit_checkin',
199
-                    array('Registration', '', 'ee_edit_others_checkins', '')
200
-                ),
201
-                new EE_Meta_Capability_Map_Messages_Cap(
202
-                    'ee_edit_message',
203
-                    array('Message_Template_Group', '', 'ee_edit_others_messages', 'ee_edit_global_messages')
204
-                ),
205
-                new EE_Meta_Capability_Map_Edit(
206
-                    'ee_edit_default_ticket',
207
-                    array('Ticket', '', 'ee_edit_others_default_tickets', '')
208
-                ),
209
-                new EE_Meta_Capability_Map_Registration_Form_Cap(
210
-                    'ee_edit_question',
211
-                    array('Question', '', '', 'ee_edit_system_questions')
212
-                ),
213
-                new EE_Meta_Capability_Map_Registration_Form_Cap(
214
-                    'ee_edit_question_group',
215
-                    array('Question_Group', '', '', 'ee_edit_system_question_groups')
216
-                ),
217
-                new EE_Meta_Capability_Map_Edit(
218
-                    'ee_edit_payment_method',
219
-                    array('Payment_Method', '', 'ee_edit_others_payment_methods', '')
220
-                ),
221
-                //reads
222
-                new EE_Meta_Capability_Map_Read(
223
-                    'ee_read_event',
224
-                    array('Event', '', 'ee_read_others_events', 'ee_read_private_events')
225
-                ),
226
-                new EE_Meta_Capability_Map_Read(
227
-                    'ee_read_venue',
228
-                    array('Venue', '', 'ee_read_others_venues', 'ee_read_private_venues')
229
-                ),
230
-                new EE_Meta_Capability_Map_Read(
231
-                    'ee_read_registration',
232
-                    array('Registration', '', '', 'ee_edit_others_registrations')
233
-                ),
234
-                new EE_Meta_Capability_Map_Read(
235
-                    'ee_read_checkin',
236
-                    array('Registration', '', '', 'ee_read_others_checkins')
237
-                ),
238
-                new EE_Meta_Capability_Map_Messages_Cap(
239
-                    'ee_read_message',
240
-                    array('Message_Template_Group', '', 'ee_read_others_messages', 'ee_read_global_messages')
241
-                ),
242
-                new EE_Meta_Capability_Map_Read(
243
-                    'ee_read_default_ticket',
244
-                    array('Ticket', '', '', 'ee_read_others_default_tickets')
245
-                ),
246
-                new EE_Meta_Capability_Map_Read(
247
-                    'ee_read_payment_method',
248
-                    array('Payment_Method', '', '', 'ee_read_others_payment_methods')
249
-                ),
250
-
251
-                //deletes
252
-                new EE_Meta_Capability_Map_Delete(
253
-                    'ee_delete_event',
254
-                    array(
255
-                        'Event',
256
-                        'ee_delete_published_events',
257
-                        'ee_delete_others_events',
258
-                        'ee_delete_private_events',
259
-                    )
260
-                ),
261
-                new EE_Meta_Capability_Map_Delete(
262
-                    'ee_delete_venue',
263
-                    array(
264
-                        'Venue',
265
-                        'ee_delete_published_venues',
266
-                        'ee_delete_others_venues',
267
-                        'ee_delete_private_venues',
268
-                    )
269
-                ),
270
-                new EE_Meta_Capability_Map_Delete(
271
-                    'ee_delete_registration',
272
-                    array('Registration', '', 'ee_delete_others_registrations', '')
273
-                ),
274
-                new EE_Meta_Capability_Map_Delete(
275
-                    'ee_delete_checkin',
276
-                    array('Registration', '', 'ee_delete_others_checkins', '')
277
-                ),
278
-                new EE_Meta_Capability_Map_Messages_Cap(
279
-                    'ee_delete_message',
280
-                    array('Message_Template_Group', '', 'ee_delete_others_messages', 'ee_delete_global_messages')
281
-                ),
282
-                new EE_Meta_Capability_Map_Delete(
283
-                    'ee_delete_default_ticket',
284
-                    array('Ticket', '', 'ee_delete_others_default_tickets', '')
285
-                ),
286
-                new EE_Meta_Capability_Map_Registration_Form_Cap(
287
-                    'ee_delete_question',
288
-                    array('Question', '', '', 'delete_system_questions')
289
-                ),
290
-                new EE_Meta_Capability_Map_Registration_Form_Cap(
291
-                    'ee_delete_question_group',
292
-                    array('Question_Group', '', '', 'delete_system_question_groups')
293
-                ),
294
-                new EE_Meta_Capability_Map_Delete(
295
-                    'ee_delete_payment_method',
296
-                    array('Payment_Method', '', 'ee_delete_others_payment_methods', '')
297
-                ),
298
-            );
299
-        }
300
-        return $default_meta_caps;
301
-    }
302
-
303
-
304
-    /**
305
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
306
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
307
-     *
308
-     * The actual logic is carried out by implementer classes in their definition of _map_meta_caps.
309
-     *
310
-     * @since 4.5.0
311
-     * @see   wp-includes/capabilities.php
312
-     *
313
-     * @param array  $caps    actual users capabilities
314
-     * @param string $cap     initial capability name that is being checked (the "map" key)
315
-     * @param int    $user_id The user id
316
-     * @param array  $args    Adds context to the cap. Typically the object ID.
317
-     * @return array actual users capabilities
318
-     * @throws EE_Error
319
-     */
320
-    public function map_meta_caps($caps, $cap, $user_id, $args)
321
-    {
322
-        if (did_action('AHEE__EE_System__load_espresso_addons__complete')) {
323
-            //loop through our _meta_caps array
324
-            foreach ($this->_meta_caps as $meta_map) {
325
-                if (! $meta_map instanceof EE_Meta_Capability_Map) {
326
-                    continue;
327
-                }
328
-                // don't load models if there is no object ID in the args
329
-                if (! empty($args[0])) {
330
-                    $meta_map->ensure_is_model();
331
-                }
332
-                $caps = $meta_map->map_meta_caps($caps, $cap, $user_id, $args);
333
-            }
334
-        }
335
-        return $caps;
336
-    }
337
-
338
-
339
-    /**
340
-     * This sets up and returns the initial capabilities map for Event Espresso
341
-     *
342
-     * @since   4.5.0
343
-     * @return array
344
-     */
345
-    private function _init_caps_map()
346
-    {
347
-        $caps = array(
348
-            'administrator'           => array(
349
-                //basic access
350
-                'ee_read_ee',
351
-                //gateways
352
-                /**
353
-                 * note that with payment method capabilities, although we've implemented
354
-                 * capability mapping which will be used for accessing payment methods owned by
355
-                 * other users.  This is not fully implemented yet in the payment method ui.
356
-                 * Currently only the "plural" caps are in active use.
357
-                 * (Specific payment method caps are in use as well).
358
-                 **/
359
-                'ee_manage_gateways',
360
-                'ee_read_payment_method',
361
-                'ee_read_payment_methods',
362
-                'ee_read_others_payment_methods',
363
-                'ee_edit_payment_method',
364
-                'ee_edit_payment_methods',
365
-                'ee_edit_others_payment_methods',
366
-                'ee_delete_payment_method',
367
-                'ee_delete_payment_methods',
368
-                //events
369
-                'ee_publish_events',
370
-                'ee_read_private_events',
371
-                'ee_read_others_events',
372
-                'ee_read_event',
373
-                'ee_read_events',
374
-                'ee_edit_event',
375
-                'ee_edit_events',
376
-                'ee_edit_published_events',
377
-                'ee_edit_others_events',
378
-                'ee_edit_private_events',
379
-                'ee_delete_published_events',
380
-                'ee_delete_private_events',
381
-                'ee_delete_event',
382
-                'ee_delete_events',
383
-                'ee_delete_others_events',
384
-                //event categories
385
-                'ee_manage_event_categories',
386
-                'ee_edit_event_category',
387
-                'ee_delete_event_category',
388
-                'ee_assign_event_category',
389
-                //venues
390
-                'ee_publish_venues',
391
-                'ee_read_venue',
392
-                'ee_read_venues',
393
-                'ee_read_others_venues',
394
-                'ee_read_private_venues',
395
-                'ee_edit_venue',
396
-                'ee_edit_venues',
397
-                'ee_edit_others_venues',
398
-                'ee_edit_published_venues',
399
-                'ee_edit_private_venues',
400
-                'ee_delete_venue',
401
-                'ee_delete_venues',
402
-                'ee_delete_others_venues',
403
-                'ee_delete_private_venues',
404
-                'ee_delete_published_venues',
405
-                //venue categories
406
-                'ee_manage_venue_categories',
407
-                'ee_edit_venue_category',
408
-                'ee_delete_venue_category',
409
-                'ee_assign_venue_category',
410
-                //contacts
411
-                'ee_read_contact',
412
-                'ee_read_contacts',
413
-                'ee_edit_contact',
414
-                'ee_edit_contacts',
415
-                'ee_delete_contact',
416
-                'ee_delete_contacts',
417
-                //registrations
418
-                'ee_read_registration',
419
-                'ee_read_registrations',
420
-                'ee_read_others_registrations',
421
-                'ee_edit_registration',
422
-                'ee_edit_registrations',
423
-                'ee_edit_others_registrations',
424
-                'ee_delete_registration',
425
-                'ee_delete_registrations',
426
-                //checkins
427
-                'ee_read_checkin',
428
-                'ee_read_others_checkins',
429
-                'ee_read_checkins',
430
-                'ee_edit_checkin',
431
-                'ee_edit_checkins',
432
-                'ee_edit_others_checkins',
433
-                'ee_delete_checkin',
434
-                'ee_delete_checkins',
435
-                'ee_delete_others_checkins',
436
-                //transactions && payments
437
-                'ee_read_transaction',
438
-                'ee_read_transactions',
439
-                'ee_edit_payments',
440
-                'ee_delete_payments',
441
-                //messages
442
-                'ee_read_message',
443
-                'ee_read_messages',
444
-                'ee_read_others_messages',
445
-                'ee_read_global_messages',
446
-                'ee_edit_global_messages',
447
-                'ee_edit_message',
448
-                'ee_edit_messages',
449
-                'ee_edit_others_messages',
450
-                'ee_delete_message',
451
-                'ee_delete_messages',
452
-                'ee_delete_others_messages',
453
-                'ee_delete_global_messages',
454
-                'ee_send_message',
455
-                //tickets
456
-                'ee_read_default_ticket',
457
-                'ee_read_default_tickets',
458
-                'ee_read_others_default_tickets',
459
-                'ee_edit_default_ticket',
460
-                'ee_edit_default_tickets',
461
-                'ee_edit_others_default_tickets',
462
-                'ee_delete_default_ticket',
463
-                'ee_delete_default_tickets',
464
-                'ee_delete_others_default_tickets',
465
-                //prices
466
-                'ee_edit_default_price',
467
-                'ee_edit_default_prices',
468
-                'ee_delete_default_price',
469
-                'ee_delete_default_prices',
470
-                'ee_edit_default_price_type',
471
-                'ee_edit_default_price_types',
472
-                'ee_delete_default_price_type',
473
-                'ee_delete_default_price_types',
474
-                'ee_read_default_prices',
475
-                'ee_read_default_price_types',
476
-                //registration form
477
-                'ee_edit_question',
478
-                'ee_edit_questions',
479
-                'ee_edit_system_questions',
480
-                'ee_read_questions',
481
-                'ee_delete_question',
482
-                'ee_delete_questions',
483
-                'ee_edit_question_group',
484
-                'ee_edit_question_groups',
485
-                'ee_read_question_groups',
486
-                'ee_edit_system_question_groups',
487
-                'ee_delete_question_group',
488
-                'ee_delete_question_groups',
489
-                //event_type taxonomy
490
-                'ee_assign_event_type',
491
-                'ee_manage_event_types',
492
-                'ee_edit_event_type',
493
-                'ee_delete_event_type',
494
-            ),
495
-            'ee_events_administrator' => array(
496
-                //core wp caps
497
-                'read',
498
-                'read_private_pages',
499
-                'read_private_posts',
500
-                'edit_users',
501
-                'edit_posts',
502
-                'edit_pages',
503
-                'edit_published_posts',
504
-                'edit_published_pages',
505
-                'edit_private_pages',
506
-                'edit_private_posts',
507
-                'edit_others_posts',
508
-                'edit_others_pages',
509
-                'publish_posts',
510
-                'publish_pages',
511
-                'delete_posts',
512
-                'delete_pages',
513
-                'delete_private_pages',
514
-                'delete_private_posts',
515
-                'delete_published_pages',
516
-                'delete_published_posts',
517
-                'delete_others_posts',
518
-                'delete_others_pages',
519
-                'manage_categories',
520
-                'manage_links',
521
-                'moderate_comments',
522
-                'unfiltered_html',
523
-                'upload_files',
524
-                'export',
525
-                'import',
526
-                'list_users',
527
-                'level_1', //required if user with this role shows up in author dropdowns
528
-                //basic ee access
529
-                'ee_read_ee',
530
-                //events
531
-                'ee_publish_events',
532
-                'ee_read_private_events',
533
-                'ee_read_others_events',
534
-                'ee_read_event',
535
-                'ee_read_events',
536
-                'ee_edit_event',
537
-                'ee_edit_events',
538
-                'ee_edit_published_events',
539
-                'ee_edit_others_events',
540
-                'ee_edit_private_events',
541
-                'ee_delete_published_events',
542
-                'ee_delete_private_events',
543
-                'ee_delete_event',
544
-                'ee_delete_events',
545
-                'ee_delete_others_events',
546
-                //event categories
547
-                'ee_manage_event_categories',
548
-                'ee_edit_event_category',
549
-                'ee_delete_event_category',
550
-                'ee_assign_event_category',
551
-                //venues
552
-                'ee_publish_venues',
553
-                'ee_read_venue',
554
-                'ee_read_venues',
555
-                'ee_read_others_venues',
556
-                'ee_read_private_venues',
557
-                'ee_edit_venue',
558
-                'ee_edit_venues',
559
-                'ee_edit_others_venues',
560
-                'ee_edit_published_venues',
561
-                'ee_edit_private_venues',
562
-                'ee_delete_venue',
563
-                'ee_delete_venues',
564
-                'ee_delete_others_venues',
565
-                'ee_delete_private_venues',
566
-                'ee_delete_published_venues',
567
-                //venue categories
568
-                'ee_manage_venue_categories',
569
-                'ee_edit_venue_category',
570
-                'ee_delete_venue_category',
571
-                'ee_assign_venue_category',
572
-                //contacts
573
-                'ee_read_contact',
574
-                'ee_read_contacts',
575
-                'ee_edit_contact',
576
-                'ee_edit_contacts',
577
-                'ee_delete_contact',
578
-                'ee_delete_contacts',
579
-                //registrations
580
-                'ee_read_registration',
581
-                'ee_read_registrations',
582
-                'ee_read_others_registrations',
583
-                'ee_edit_registration',
584
-                'ee_edit_registrations',
585
-                'ee_edit_others_registrations',
586
-                'ee_delete_registration',
587
-                'ee_delete_registrations',
588
-                //checkins
589
-                'ee_read_checkin',
590
-                'ee_read_others_checkins',
591
-                'ee_read_checkins',
592
-                'ee_edit_checkin',
593
-                'ee_edit_checkins',
594
-                'ee_edit_others_checkins',
595
-                'ee_delete_checkin',
596
-                'ee_delete_checkins',
597
-                'ee_delete_others_checkins',
598
-                //transactions && payments
599
-                'ee_read_transaction',
600
-                'ee_read_transactions',
601
-                'ee_edit_payments',
602
-                'ee_delete_payments',
603
-                //messages
604
-                'ee_read_message',
605
-                'ee_read_messages',
606
-                'ee_read_others_messages',
607
-                'ee_read_global_messages',
608
-                'ee_edit_global_messages',
609
-                'ee_edit_message',
610
-                'ee_edit_messages',
611
-                'ee_edit_others_messages',
612
-                'ee_delete_message',
613
-                'ee_delete_messages',
614
-                'ee_delete_others_messages',
615
-                'ee_delete_global_messages',
616
-                'ee_send_message',
617
-                //tickets
618
-                'ee_read_default_ticket',
619
-                'ee_read_default_tickets',
620
-                'ee_read_others_default_tickets',
621
-                'ee_edit_default_ticket',
622
-                'ee_edit_default_tickets',
623
-                'ee_edit_others_default_tickets',
624
-                'ee_delete_default_ticket',
625
-                'ee_delete_default_tickets',
626
-                'ee_delete_others_default_tickets',
627
-                //prices
628
-                'ee_edit_default_price',
629
-                'ee_edit_default_prices',
630
-                'ee_delete_default_price',
631
-                'ee_delete_default_prices',
632
-                'ee_edit_default_price_type',
633
-                'ee_edit_default_price_types',
634
-                'ee_delete_default_price_type',
635
-                'ee_delete_default_price_types',
636
-                'ee_read_default_prices',
637
-                'ee_read_default_price_types',
638
-                //registration form
639
-                'ee_edit_question',
640
-                'ee_edit_questions',
641
-                'ee_edit_system_questions',
642
-                'ee_read_questions',
643
-                'ee_delete_question',
644
-                'ee_delete_questions',
645
-                'ee_edit_question_group',
646
-                'ee_edit_question_groups',
647
-                'ee_read_question_groups',
648
-                'ee_edit_system_question_groups',
649
-                'ee_delete_question_group',
650
-                'ee_delete_question_groups',
651
-                //event_type taxonomy
652
-                'ee_assign_event_type',
653
-                'ee_manage_event_types',
654
-                'ee_edit_event_type',
655
-                'ee_delete_event_type',
656
-            )
657
-        );
658
-        $caps = apply_filters('FHEE__EE_Capabilities__init_caps_map__caps', $caps);
659
-        //add payment method caps.
660
-        EE_Registry::instance()->load_lib('Payment_Method_Manager');
661
-        return EE_Payment_Method_Manager::instance()->add_payment_method_caps($caps);
662
-    }
663
-
664
-
665
-    /**
666
-     * This adds all the default caps to roles as registered in the _caps_map property.
667
-     *
668
-     * @since 4.5.0
669
-     *
670
-     * @param bool  $reset      allows for resetting the default capabilities saved on roles.  Note that this doesn't
671
-     *                          actually REMOVE any capabilities from existing roles, it just resaves defaults roles
672
-     *                          and ensures that they are up to date.
673
-     * @param array $custom_map Optional.  Can be used to send a custom map of roles and capabilities for setting them
674
-     *                          up.  Note that this should ONLY be called on activation hook or some other one-time
675
-     *                          task otherwise the caps will be added on every request.
676
-     *
677
-     * @return void
678
-     */
679
-    public function init_role_caps($reset = false, $custom_map = array())
680
-    {
681
-        //if reset, then completely delete the cache option.
682
-        if ($reset) {
683
-            delete_option(self::option_name);
684
-        }
685
-        $caps_map = empty($custom_map) ? $this->_caps_map : $custom_map;
686
-        //first let's determine if these caps have already been set.
687
-        $caps_set_before = $reset ? array() : get_option(self::option_name, array());
688
-        $update_caps_set_before_option = false;
689
-        //if not reset, see what caps are new for each role. if they're new, add them.
690
-        foreach ($caps_map as $role => $caps_for_role) {
691
-            foreach ($caps_for_role as $cap) {
692
-                //first check we haven't already added this cap before, or it's a reset
693
-                if ($reset || ! isset($caps_set_before[ $role ]) || ! in_array($cap, $caps_set_before[ $role ])) {
694
-                    if ($this->add_cap_to_role($role, $cap)) {
695
-                        $caps_set_before[ $role ][] = $cap;
696
-                        $update_caps_set_before_option = true;
697
-                    }
698
-                }
699
-            }
700
-        }
701
-        //now let's just save the cap that has been set but only if there's been a change.
702
-        if ($update_caps_set_before_option) {
703
-            update_option(self::option_name, $caps_set_before);
704
-        }
705
-        do_action('AHEE__EE_Capabilities__init_role_caps__complete', $caps_set_before);
706
-    }
707
-
708
-
709
-    /**
710
-     * This method sets a capability on a role.  Note this should only be done on activation, or if you have something
711
-     * specific to prevent the cap from being added on every page load (adding caps are persistent to the db). Note.
712
-     * this is a wrapper for $wp_role->add_cap()
713
-     *
714
-     * @see   wp-includes/capabilities.php
715
-     *
716
-     * @since 4.5.0
717
-     *
718
-     * @param string $role  A WordPress role the capability is being added to
719
-     * @param string $cap   The capability being added to the role
720
-     * @param bool   $grant Whether to grant access to this cap on this role.
721
-     *
722
-     * @return bool
723
-     */
724
-    public function add_cap_to_role($role, $cap, $grant = true)
725
-    {
726
-        $role_object = get_role($role);
727
-        //if the role isn't available then we create it.
728
-        if (! $role_object instanceof WP_Role) {
729
-            //if a plugin wants to create a specific role name then they should create the role before
730
-            //EE_Capabilities does.  Otherwise this function will create the role name from the slug:
731
-            // - removes any `ee_` namespacing from the start of the slug.
732
-            // - replaces `_` with ` ` (empty space).
733
-            // - sentence case on the resulting string.
734
-            $role_label = ucwords(str_replace('_', ' ', str_replace('ee_', '', $role)));
735
-            $role_object = add_role($role, $role_label);
736
-        }
737
-        if ($role_object instanceof WP_Role) {
738
-            $role_object->add_cap($cap, $grant);
739
-            return true;
740
-        }
741
-        return false;
742
-    }
743
-
744
-
745
-    /**
746
-     * Functions similarly to add_cap_to_role except removes cap from given role.
747
-     * Wrapper for $wp_role->remove_cap()
748
-     *
749
-     * @see   wp-includes/capabilities.php
750
-     * @since 4.5.0
751
-     *
752
-     * @param string $role A WordPress role the capability is being removed from.
753
-     * @param string $cap  The capability being removed
754
-     *
755
-     * @return void
756
-     */
757
-    public function remove_cap_from_role($role, $cap)
758
-    {
759
-        $role = get_role($role);
760
-        if ($role instanceof WP_Role) {
761
-            $role->remove_cap($cap);
762
-        }
763
-    }
764
-
765
-
766
-    /**
767
-     * Wrapper for the native WP current_user_can() method.
768
-     * This is provided as a handy method for a couple things:
769
-     * 1. Using the context string it allows for targeted filtering by addons for a specific check (without having to
770
-     * write those filters wherever current_user_can is called).
771
-     * 2. Explicit passing of $id from a given context ( useful in the cases of map_meta_cap filters )
772
-     *
773
-     * @since 4.5.0
774
-     *
775
-     * @param string $cap     The cap being checked.
776
-     * @param string $context The context where the current_user_can is being called from.
777
-     * @param int    $id      Optional. Id for item where current_user_can is being called from (used in map_meta_cap()
778
-     *                        filters.
779
-     *
780
-     * @return bool  Whether user can or not.
781
-     */
782
-    public function current_user_can($cap, $context, $id = 0)
783
-    {
784
-        //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
785
-        $filtered_cap = apply_filters('FHEE__EE_Capabilities__current_user_can__cap__' . $context, $cap, $id);
786
-        $filtered_cap = apply_filters(
787
-            'FHEE__EE_Capabilities__current_user_can__cap',
788
-            $filtered_cap,
789
-            $context,
790
-            $cap,
791
-            $id
792
-        );
793
-        return ! empty($id) ? current_user_can($filtered_cap, $id) : current_user_can($filtered_cap);
794
-    }
795
-
796
-
797
-    /**
798
-     * This is a wrapper for the WP user_can() function and follows the same style as the other wrappers in this class.
799
-     *
800
-     * @param int|WP_User $user    Either the user_id or a WP_User object
801
-     * @param string      $cap     The capability string being checked
802
-     * @param string      $context The context where the user_can is being called from (used in filters).
803
-     * @param int         $id      Optional. Id for item where user_can is being called from ( used in map_meta_cap()
804
-     *                             filters)
805
-     *
806
-     * @return bool Whether user can or not.
807
-     */
808
-    public function user_can($user, $cap, $context, $id = 0)
809
-    {
810
-        //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
811
-        $filtered_cap = apply_filters('FHEE__EE_Capabilities__user_can__cap__' . $context, $cap, $user, $id);
812
-        $filtered_cap = apply_filters(
813
-            'FHEE__EE_Capabilities__user_can__cap',
814
-            $filtered_cap,
815
-            $context,
816
-            $cap,
817
-            $user,
818
-            $id
819
-        );
820
-        return ! empty($id) ? user_can($user, $filtered_cap, $id) : user_can($user, $filtered_cap);
821
-    }
822
-
823
-
824
-    /**
825
-     * Wrapper for the native WP current_user_can_for_blog() method.
826
-     * This is provided as a handy method for a couple things:
827
-     * 1. Using the context string it allows for targeted filtering by addons for a specific check (without having to
828
-     * write those filters wherever current_user_can is called).
829
-     * 2. Explicit passing of $id from a given context ( useful in the cases of map_meta_cap filters )
830
-     *
831
-     * @since 4.5.0
832
-     *
833
-     * @param int    $blog_id The blog id that is being checked for.
834
-     * @param string $cap     The cap being checked.
835
-     * @param string $context The context where the current_user_can is being called from.
836
-     * @param int    $id      Optional. Id for item where current_user_can is being called from (used in map_meta_cap()
837
-     *                        filters.
838
-     *
839
-     * @return bool  Whether user can or not.
840
-     */
841
-    public function current_user_can_for_blog($blog_id, $cap, $context, $id = 0)
842
-    {
843
-        $user_can = ! empty($id)
844
-            ? current_user_can_for_blog($blog_id, $cap, $id)
845
-            : current_user_can($blog_id, $cap);
846
-        //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
847
-        $user_can = apply_filters(
848
-            'FHEE__EE_Capabilities__current_user_can_for_blog__user_can__' . $context,
849
-            $user_can,
850
-            $blog_id,
851
-            $cap,
852
-            $id
853
-        );
854
-        $user_can = apply_filters(
855
-            'FHEE__EE_Capabilities__current_user_can_for_blog__user_can',
856
-            $user_can,
857
-            $context,
858
-            $blog_id,
859
-            $cap,
860
-            $id
861
-        );
862
-        return $user_can;
863
-    }
864
-
865
-
866
-    /**
867
-     * This helper method just returns an array of registered EE capabilities.
868
-     * Note this array is filtered.  It is assumed that all available EE capabilities are assigned to the administrator
869
-     * role.
870
-     *
871
-     * @since 4.5.0
872
-     *
873
-     * @param string $role If empty then the entire role/capability map is returned.  Otherwise just the capabilities
874
-     *                     for the given role are returned.
875
-     *
876
-     * @return array
877
-     */
878
-    public function get_ee_capabilities($role = 'administrator')
879
-    {
880
-        $capabilities = $this->_init_caps_map();
881
-        if (empty($role)) {
882
-            return $capabilities;
883
-        }
884
-        return isset($capabilities[ $role ]) ? $capabilities[ $role ] : array();
885
-    }
20
+	/**
21
+	 * the name of the wp option used to store caps previously initialized
22
+	 */
23
+	const option_name = 'ee_caps_initialized';
24
+
25
+	/**
26
+	 * instance of EE_Capabilities object
27
+	 *
28
+	 * @var EE_Capabilities
29
+	 */
30
+	private static $_instance;
31
+
32
+
33
+	/**
34
+	 * This is a map of caps that correspond to a default WP_Role.
35
+	 * Array is indexed by Role and values are ee capabilities.
36
+	 *
37
+	 * @since 4.5.0
38
+	 *
39
+	 * @var array
40
+	 */
41
+	private $_caps_map = array();
42
+
43
+
44
+	/**
45
+	 * This used to hold an array of EE_Meta_Capability_Map objects that define the granular capabilities mapped to for
46
+	 * a user depending on context.
47
+	 *
48
+	 * @var EE_Meta_Capability_Map[]
49
+	 */
50
+	private $_meta_caps = array();
51
+
52
+
53
+	/**
54
+	 * Used to track whether the capabilities have been initialized or not in this request.
55
+	 * @var bool
56
+	 */
57
+	private $_has_been_initialized = false;
58
+
59
+
60
+
61
+
62
+	/**
63
+	 * singleton method used to instantiate class object
64
+	 *
65
+	 * @since 4.5.0
66
+	 *
67
+	 * @return EE_Capabilities
68
+	 */
69
+	public static function instance()
70
+	{
71
+		//check if instantiated, and if not do so.
72
+		if (! self::$_instance instanceof EE_Capabilities) {
73
+			self::$_instance = new self();
74
+		}
75
+		return self::$_instance;
76
+	}
77
+
78
+
79
+	/**
80
+	 * private constructor
81
+	 *
82
+	 * @since 4.5.0
83
+	 *
84
+	 * @return \EE_Capabilities
85
+	 */
86
+	private function __construct()
87
+	{
88
+	}
89
+
90
+
91
+	/**
92
+	 * This delays the initialization of the capabilities class until EE_System core is loaded and ready.
93
+	 *
94
+	 * @param bool $reset allows for resetting the default capabilities saved on roles.  Note that this doesn't
95
+	 *                    actually REMOVE any capabilities from existing roles, it just resaves defaults roles and
96
+	 *                    ensures that they are up to date.
97
+	 * @return void
98
+	 * @throws EE_Error
99
+	 * @throws InvalidExecutionPathException
100
+	 * @since 4.5.0
101
+	 */
102
+	public function init_caps($reset = false)
103
+	{
104
+		if (EE_Maintenance_Mode::instance()->models_can_query()
105
+			&& ! $this->has_been_initialized($reset)
106
+		) {
107
+			do_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call', $this, $reset);
108
+			$this->init_cap_logic($reset);
109
+		}
110
+	}
111
+
112
+
113
+	/**
114
+	 * Executes the logic for initializing EE capabilities.
115
+	 * It is preferable to go through `init_caps` and this should not be called directly it's only public because of
116
+	 * that being a requirement of being a callback on a WordPress hook.
117
+	 *
118
+	 * @param bool $reset
119
+	 * @throws EE_Error
120
+	 * @throws InvalidExecutionPathException
121
+	 * @since 4.9.41.rc.006
122
+	 */
123
+	public function init_cap_logic($reset = false)
124
+	{
125
+		if (! did_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call')) {
126
+			throw new InvalidExecutionPathException(
127
+				esc_html__(
128
+					'%1$s should not be called before the %2$s hook has fired.  It is recommended to instead use %s',
129
+					'event_espresso'
130
+				)
131
+			);
132
+		}
133
+		if (! $this->has_been_initialized($reset)) {
134
+			$this->_caps_map = $this->_init_caps_map();
135
+			$this->init_role_caps($reset);
136
+			$this->_set_meta_caps();
137
+			$this->_has_been_initialized = true;
138
+		}
139
+	}
140
+
141
+
142
+	/**
143
+	 * Returns whether EE_Capabilities have been initialized or not.
144
+	 * @param bool $reset
145
+	 * @return bool
146
+	 */
147
+	public function has_been_initialized($reset = false)
148
+	{
149
+		return ! $reset ? $this->_has_been_initialized : false;
150
+	}
151
+
152
+
153
+	/**
154
+	 * This sets the meta caps property.
155
+	 *
156
+	 * @since 4.5.0
157
+	 * @return void
158
+	 * @throws EE_Error
159
+	 */
160
+	private function _set_meta_caps()
161
+	{
162
+		//make sure we're only ever initializing the default _meta_caps array once if it's empty.
163
+		$this->_meta_caps = $this->_get_default_meta_caps_array();
164
+		$this->_meta_caps = apply_filters('FHEE__EE_Capabilities___set_meta_caps__meta_caps', $this->_meta_caps);
165
+		//add filter for map_meta_caps but only if models can query.
166
+		if (! has_filter('map_meta_cap', array($this, 'map_meta_caps'))) {
167
+			add_filter('map_meta_cap', array($this, 'map_meta_caps'), 10, 4);
168
+		}
169
+	}
170
+
171
+
172
+	/**
173
+	 * This builds and returns the default meta_caps array only once.
174
+	 *
175
+	 * @since  4.8.28.rc.012
176
+	 * @return array
177
+	 * @throws \EE_Error
178
+	 */
179
+	private function _get_default_meta_caps_array()
180
+	{
181
+		static $default_meta_caps = array();
182
+		if (empty($default_meta_caps)) {
183
+			$default_meta_caps = array(
184
+				//edits
185
+				new EE_Meta_Capability_Map_Edit(
186
+					'ee_edit_event',
187
+					array('Event', 'ee_edit_published_events', 'ee_edit_others_events', 'ee_edit_private_events')
188
+				),
189
+				new EE_Meta_Capability_Map_Edit(
190
+					'ee_edit_venue',
191
+					array('Venue', 'ee_edit_published_venues', 'ee_edit_others_venues', 'ee_edit_private_venues')
192
+				),
193
+				new EE_Meta_Capability_Map_Edit(
194
+					'ee_edit_registration',
195
+					array('Registration', '', 'ee_edit_others_registrations', '')
196
+				),
197
+				new EE_Meta_Capability_Map_Edit(
198
+					'ee_edit_checkin',
199
+					array('Registration', '', 'ee_edit_others_checkins', '')
200
+				),
201
+				new EE_Meta_Capability_Map_Messages_Cap(
202
+					'ee_edit_message',
203
+					array('Message_Template_Group', '', 'ee_edit_others_messages', 'ee_edit_global_messages')
204
+				),
205
+				new EE_Meta_Capability_Map_Edit(
206
+					'ee_edit_default_ticket',
207
+					array('Ticket', '', 'ee_edit_others_default_tickets', '')
208
+				),
209
+				new EE_Meta_Capability_Map_Registration_Form_Cap(
210
+					'ee_edit_question',
211
+					array('Question', '', '', 'ee_edit_system_questions')
212
+				),
213
+				new EE_Meta_Capability_Map_Registration_Form_Cap(
214
+					'ee_edit_question_group',
215
+					array('Question_Group', '', '', 'ee_edit_system_question_groups')
216
+				),
217
+				new EE_Meta_Capability_Map_Edit(
218
+					'ee_edit_payment_method',
219
+					array('Payment_Method', '', 'ee_edit_others_payment_methods', '')
220
+				),
221
+				//reads
222
+				new EE_Meta_Capability_Map_Read(
223
+					'ee_read_event',
224
+					array('Event', '', 'ee_read_others_events', 'ee_read_private_events')
225
+				),
226
+				new EE_Meta_Capability_Map_Read(
227
+					'ee_read_venue',
228
+					array('Venue', '', 'ee_read_others_venues', 'ee_read_private_venues')
229
+				),
230
+				new EE_Meta_Capability_Map_Read(
231
+					'ee_read_registration',
232
+					array('Registration', '', '', 'ee_edit_others_registrations')
233
+				),
234
+				new EE_Meta_Capability_Map_Read(
235
+					'ee_read_checkin',
236
+					array('Registration', '', '', 'ee_read_others_checkins')
237
+				),
238
+				new EE_Meta_Capability_Map_Messages_Cap(
239
+					'ee_read_message',
240
+					array('Message_Template_Group', '', 'ee_read_others_messages', 'ee_read_global_messages')
241
+				),
242
+				new EE_Meta_Capability_Map_Read(
243
+					'ee_read_default_ticket',
244
+					array('Ticket', '', '', 'ee_read_others_default_tickets')
245
+				),
246
+				new EE_Meta_Capability_Map_Read(
247
+					'ee_read_payment_method',
248
+					array('Payment_Method', '', '', 'ee_read_others_payment_methods')
249
+				),
250
+
251
+				//deletes
252
+				new EE_Meta_Capability_Map_Delete(
253
+					'ee_delete_event',
254
+					array(
255
+						'Event',
256
+						'ee_delete_published_events',
257
+						'ee_delete_others_events',
258
+						'ee_delete_private_events',
259
+					)
260
+				),
261
+				new EE_Meta_Capability_Map_Delete(
262
+					'ee_delete_venue',
263
+					array(
264
+						'Venue',
265
+						'ee_delete_published_venues',
266
+						'ee_delete_others_venues',
267
+						'ee_delete_private_venues',
268
+					)
269
+				),
270
+				new EE_Meta_Capability_Map_Delete(
271
+					'ee_delete_registration',
272
+					array('Registration', '', 'ee_delete_others_registrations', '')
273
+				),
274
+				new EE_Meta_Capability_Map_Delete(
275
+					'ee_delete_checkin',
276
+					array('Registration', '', 'ee_delete_others_checkins', '')
277
+				),
278
+				new EE_Meta_Capability_Map_Messages_Cap(
279
+					'ee_delete_message',
280
+					array('Message_Template_Group', '', 'ee_delete_others_messages', 'ee_delete_global_messages')
281
+				),
282
+				new EE_Meta_Capability_Map_Delete(
283
+					'ee_delete_default_ticket',
284
+					array('Ticket', '', 'ee_delete_others_default_tickets', '')
285
+				),
286
+				new EE_Meta_Capability_Map_Registration_Form_Cap(
287
+					'ee_delete_question',
288
+					array('Question', '', '', 'delete_system_questions')
289
+				),
290
+				new EE_Meta_Capability_Map_Registration_Form_Cap(
291
+					'ee_delete_question_group',
292
+					array('Question_Group', '', '', 'delete_system_question_groups')
293
+				),
294
+				new EE_Meta_Capability_Map_Delete(
295
+					'ee_delete_payment_method',
296
+					array('Payment_Method', '', 'ee_delete_others_payment_methods', '')
297
+				),
298
+			);
299
+		}
300
+		return $default_meta_caps;
301
+	}
302
+
303
+
304
+	/**
305
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
306
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
307
+	 *
308
+	 * The actual logic is carried out by implementer classes in their definition of _map_meta_caps.
309
+	 *
310
+	 * @since 4.5.0
311
+	 * @see   wp-includes/capabilities.php
312
+	 *
313
+	 * @param array  $caps    actual users capabilities
314
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
315
+	 * @param int    $user_id The user id
316
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
317
+	 * @return array actual users capabilities
318
+	 * @throws EE_Error
319
+	 */
320
+	public function map_meta_caps($caps, $cap, $user_id, $args)
321
+	{
322
+		if (did_action('AHEE__EE_System__load_espresso_addons__complete')) {
323
+			//loop through our _meta_caps array
324
+			foreach ($this->_meta_caps as $meta_map) {
325
+				if (! $meta_map instanceof EE_Meta_Capability_Map) {
326
+					continue;
327
+				}
328
+				// don't load models if there is no object ID in the args
329
+				if (! empty($args[0])) {
330
+					$meta_map->ensure_is_model();
331
+				}
332
+				$caps = $meta_map->map_meta_caps($caps, $cap, $user_id, $args);
333
+			}
334
+		}
335
+		return $caps;
336
+	}
337
+
338
+
339
+	/**
340
+	 * This sets up and returns the initial capabilities map for Event Espresso
341
+	 *
342
+	 * @since   4.5.0
343
+	 * @return array
344
+	 */
345
+	private function _init_caps_map()
346
+	{
347
+		$caps = array(
348
+			'administrator'           => array(
349
+				//basic access
350
+				'ee_read_ee',
351
+				//gateways
352
+				/**
353
+				 * note that with payment method capabilities, although we've implemented
354
+				 * capability mapping which will be used for accessing payment methods owned by
355
+				 * other users.  This is not fully implemented yet in the payment method ui.
356
+				 * Currently only the "plural" caps are in active use.
357
+				 * (Specific payment method caps are in use as well).
358
+				 **/
359
+				'ee_manage_gateways',
360
+				'ee_read_payment_method',
361
+				'ee_read_payment_methods',
362
+				'ee_read_others_payment_methods',
363
+				'ee_edit_payment_method',
364
+				'ee_edit_payment_methods',
365
+				'ee_edit_others_payment_methods',
366
+				'ee_delete_payment_method',
367
+				'ee_delete_payment_methods',
368
+				//events
369
+				'ee_publish_events',
370
+				'ee_read_private_events',
371
+				'ee_read_others_events',
372
+				'ee_read_event',
373
+				'ee_read_events',
374
+				'ee_edit_event',
375
+				'ee_edit_events',
376
+				'ee_edit_published_events',
377
+				'ee_edit_others_events',
378
+				'ee_edit_private_events',
379
+				'ee_delete_published_events',
380
+				'ee_delete_private_events',
381
+				'ee_delete_event',
382
+				'ee_delete_events',
383
+				'ee_delete_others_events',
384
+				//event categories
385
+				'ee_manage_event_categories',
386
+				'ee_edit_event_category',
387
+				'ee_delete_event_category',
388
+				'ee_assign_event_category',
389
+				//venues
390
+				'ee_publish_venues',
391
+				'ee_read_venue',
392
+				'ee_read_venues',
393
+				'ee_read_others_venues',
394
+				'ee_read_private_venues',
395
+				'ee_edit_venue',
396
+				'ee_edit_venues',
397
+				'ee_edit_others_venues',
398
+				'ee_edit_published_venues',
399
+				'ee_edit_private_venues',
400
+				'ee_delete_venue',
401
+				'ee_delete_venues',
402
+				'ee_delete_others_venues',
403
+				'ee_delete_private_venues',
404
+				'ee_delete_published_venues',
405
+				//venue categories
406
+				'ee_manage_venue_categories',
407
+				'ee_edit_venue_category',
408
+				'ee_delete_venue_category',
409
+				'ee_assign_venue_category',
410
+				//contacts
411
+				'ee_read_contact',
412
+				'ee_read_contacts',
413
+				'ee_edit_contact',
414
+				'ee_edit_contacts',
415
+				'ee_delete_contact',
416
+				'ee_delete_contacts',
417
+				//registrations
418
+				'ee_read_registration',
419
+				'ee_read_registrations',
420
+				'ee_read_others_registrations',
421
+				'ee_edit_registration',
422
+				'ee_edit_registrations',
423
+				'ee_edit_others_registrations',
424
+				'ee_delete_registration',
425
+				'ee_delete_registrations',
426
+				//checkins
427
+				'ee_read_checkin',
428
+				'ee_read_others_checkins',
429
+				'ee_read_checkins',
430
+				'ee_edit_checkin',
431
+				'ee_edit_checkins',
432
+				'ee_edit_others_checkins',
433
+				'ee_delete_checkin',
434
+				'ee_delete_checkins',
435
+				'ee_delete_others_checkins',
436
+				//transactions && payments
437
+				'ee_read_transaction',
438
+				'ee_read_transactions',
439
+				'ee_edit_payments',
440
+				'ee_delete_payments',
441
+				//messages
442
+				'ee_read_message',
443
+				'ee_read_messages',
444
+				'ee_read_others_messages',
445
+				'ee_read_global_messages',
446
+				'ee_edit_global_messages',
447
+				'ee_edit_message',
448
+				'ee_edit_messages',
449
+				'ee_edit_others_messages',
450
+				'ee_delete_message',
451
+				'ee_delete_messages',
452
+				'ee_delete_others_messages',
453
+				'ee_delete_global_messages',
454
+				'ee_send_message',
455
+				//tickets
456
+				'ee_read_default_ticket',
457
+				'ee_read_default_tickets',
458
+				'ee_read_others_default_tickets',
459
+				'ee_edit_default_ticket',
460
+				'ee_edit_default_tickets',
461
+				'ee_edit_others_default_tickets',
462
+				'ee_delete_default_ticket',
463
+				'ee_delete_default_tickets',
464
+				'ee_delete_others_default_tickets',
465
+				//prices
466
+				'ee_edit_default_price',
467
+				'ee_edit_default_prices',
468
+				'ee_delete_default_price',
469
+				'ee_delete_default_prices',
470
+				'ee_edit_default_price_type',
471
+				'ee_edit_default_price_types',
472
+				'ee_delete_default_price_type',
473
+				'ee_delete_default_price_types',
474
+				'ee_read_default_prices',
475
+				'ee_read_default_price_types',
476
+				//registration form
477
+				'ee_edit_question',
478
+				'ee_edit_questions',
479
+				'ee_edit_system_questions',
480
+				'ee_read_questions',
481
+				'ee_delete_question',
482
+				'ee_delete_questions',
483
+				'ee_edit_question_group',
484
+				'ee_edit_question_groups',
485
+				'ee_read_question_groups',
486
+				'ee_edit_system_question_groups',
487
+				'ee_delete_question_group',
488
+				'ee_delete_question_groups',
489
+				//event_type taxonomy
490
+				'ee_assign_event_type',
491
+				'ee_manage_event_types',
492
+				'ee_edit_event_type',
493
+				'ee_delete_event_type',
494
+			),
495
+			'ee_events_administrator' => array(
496
+				//core wp caps
497
+				'read',
498
+				'read_private_pages',
499
+				'read_private_posts',
500
+				'edit_users',
501
+				'edit_posts',
502
+				'edit_pages',
503
+				'edit_published_posts',
504
+				'edit_published_pages',
505
+				'edit_private_pages',
506
+				'edit_private_posts',
507
+				'edit_others_posts',
508
+				'edit_others_pages',
509
+				'publish_posts',
510
+				'publish_pages',
511
+				'delete_posts',
512
+				'delete_pages',
513
+				'delete_private_pages',
514
+				'delete_private_posts',
515
+				'delete_published_pages',
516
+				'delete_published_posts',
517
+				'delete_others_posts',
518
+				'delete_others_pages',
519
+				'manage_categories',
520
+				'manage_links',
521
+				'moderate_comments',
522
+				'unfiltered_html',
523
+				'upload_files',
524
+				'export',
525
+				'import',
526
+				'list_users',
527
+				'level_1', //required if user with this role shows up in author dropdowns
528
+				//basic ee access
529
+				'ee_read_ee',
530
+				//events
531
+				'ee_publish_events',
532
+				'ee_read_private_events',
533
+				'ee_read_others_events',
534
+				'ee_read_event',
535
+				'ee_read_events',
536
+				'ee_edit_event',
537
+				'ee_edit_events',
538
+				'ee_edit_published_events',
539
+				'ee_edit_others_events',
540
+				'ee_edit_private_events',
541
+				'ee_delete_published_events',
542
+				'ee_delete_private_events',
543
+				'ee_delete_event',
544
+				'ee_delete_events',
545
+				'ee_delete_others_events',
546
+				//event categories
547
+				'ee_manage_event_categories',
548
+				'ee_edit_event_category',
549
+				'ee_delete_event_category',
550
+				'ee_assign_event_category',
551
+				//venues
552
+				'ee_publish_venues',
553
+				'ee_read_venue',
554
+				'ee_read_venues',
555
+				'ee_read_others_venues',
556
+				'ee_read_private_venues',
557
+				'ee_edit_venue',
558
+				'ee_edit_venues',
559
+				'ee_edit_others_venues',
560
+				'ee_edit_published_venues',
561
+				'ee_edit_private_venues',
562
+				'ee_delete_venue',
563
+				'ee_delete_venues',
564
+				'ee_delete_others_venues',
565
+				'ee_delete_private_venues',
566
+				'ee_delete_published_venues',
567
+				//venue categories
568
+				'ee_manage_venue_categories',
569
+				'ee_edit_venue_category',
570
+				'ee_delete_venue_category',
571
+				'ee_assign_venue_category',
572
+				//contacts
573
+				'ee_read_contact',
574
+				'ee_read_contacts',
575
+				'ee_edit_contact',
576
+				'ee_edit_contacts',
577
+				'ee_delete_contact',
578
+				'ee_delete_contacts',
579
+				//registrations
580
+				'ee_read_registration',
581
+				'ee_read_registrations',
582
+				'ee_read_others_registrations',
583
+				'ee_edit_registration',
584
+				'ee_edit_registrations',
585
+				'ee_edit_others_registrations',
586
+				'ee_delete_registration',
587
+				'ee_delete_registrations',
588
+				//checkins
589
+				'ee_read_checkin',
590
+				'ee_read_others_checkins',
591
+				'ee_read_checkins',
592
+				'ee_edit_checkin',
593
+				'ee_edit_checkins',
594
+				'ee_edit_others_checkins',
595
+				'ee_delete_checkin',
596
+				'ee_delete_checkins',
597
+				'ee_delete_others_checkins',
598
+				//transactions && payments
599
+				'ee_read_transaction',
600
+				'ee_read_transactions',
601
+				'ee_edit_payments',
602
+				'ee_delete_payments',
603
+				//messages
604
+				'ee_read_message',
605
+				'ee_read_messages',
606
+				'ee_read_others_messages',
607
+				'ee_read_global_messages',
608
+				'ee_edit_global_messages',
609
+				'ee_edit_message',
610
+				'ee_edit_messages',
611
+				'ee_edit_others_messages',
612
+				'ee_delete_message',
613
+				'ee_delete_messages',
614
+				'ee_delete_others_messages',
615
+				'ee_delete_global_messages',
616
+				'ee_send_message',
617
+				//tickets
618
+				'ee_read_default_ticket',
619
+				'ee_read_default_tickets',
620
+				'ee_read_others_default_tickets',
621
+				'ee_edit_default_ticket',
622
+				'ee_edit_default_tickets',
623
+				'ee_edit_others_default_tickets',
624
+				'ee_delete_default_ticket',
625
+				'ee_delete_default_tickets',
626
+				'ee_delete_others_default_tickets',
627
+				//prices
628
+				'ee_edit_default_price',
629
+				'ee_edit_default_prices',
630
+				'ee_delete_default_price',
631
+				'ee_delete_default_prices',
632
+				'ee_edit_default_price_type',
633
+				'ee_edit_default_price_types',
634
+				'ee_delete_default_price_type',
635
+				'ee_delete_default_price_types',
636
+				'ee_read_default_prices',
637
+				'ee_read_default_price_types',
638
+				//registration form
639
+				'ee_edit_question',
640
+				'ee_edit_questions',
641
+				'ee_edit_system_questions',
642
+				'ee_read_questions',
643
+				'ee_delete_question',
644
+				'ee_delete_questions',
645
+				'ee_edit_question_group',
646
+				'ee_edit_question_groups',
647
+				'ee_read_question_groups',
648
+				'ee_edit_system_question_groups',
649
+				'ee_delete_question_group',
650
+				'ee_delete_question_groups',
651
+				//event_type taxonomy
652
+				'ee_assign_event_type',
653
+				'ee_manage_event_types',
654
+				'ee_edit_event_type',
655
+				'ee_delete_event_type',
656
+			)
657
+		);
658
+		$caps = apply_filters('FHEE__EE_Capabilities__init_caps_map__caps', $caps);
659
+		//add payment method caps.
660
+		EE_Registry::instance()->load_lib('Payment_Method_Manager');
661
+		return EE_Payment_Method_Manager::instance()->add_payment_method_caps($caps);
662
+	}
663
+
664
+
665
+	/**
666
+	 * This adds all the default caps to roles as registered in the _caps_map property.
667
+	 *
668
+	 * @since 4.5.0
669
+	 *
670
+	 * @param bool  $reset      allows for resetting the default capabilities saved on roles.  Note that this doesn't
671
+	 *                          actually REMOVE any capabilities from existing roles, it just resaves defaults roles
672
+	 *                          and ensures that they are up to date.
673
+	 * @param array $custom_map Optional.  Can be used to send a custom map of roles and capabilities for setting them
674
+	 *                          up.  Note that this should ONLY be called on activation hook or some other one-time
675
+	 *                          task otherwise the caps will be added on every request.
676
+	 *
677
+	 * @return void
678
+	 */
679
+	public function init_role_caps($reset = false, $custom_map = array())
680
+	{
681
+		//if reset, then completely delete the cache option.
682
+		if ($reset) {
683
+			delete_option(self::option_name);
684
+		}
685
+		$caps_map = empty($custom_map) ? $this->_caps_map : $custom_map;
686
+		//first let's determine if these caps have already been set.
687
+		$caps_set_before = $reset ? array() : get_option(self::option_name, array());
688
+		$update_caps_set_before_option = false;
689
+		//if not reset, see what caps are new for each role. if they're new, add them.
690
+		foreach ($caps_map as $role => $caps_for_role) {
691
+			foreach ($caps_for_role as $cap) {
692
+				//first check we haven't already added this cap before, or it's a reset
693
+				if ($reset || ! isset($caps_set_before[ $role ]) || ! in_array($cap, $caps_set_before[ $role ])) {
694
+					if ($this->add_cap_to_role($role, $cap)) {
695
+						$caps_set_before[ $role ][] = $cap;
696
+						$update_caps_set_before_option = true;
697
+					}
698
+				}
699
+			}
700
+		}
701
+		//now let's just save the cap that has been set but only if there's been a change.
702
+		if ($update_caps_set_before_option) {
703
+			update_option(self::option_name, $caps_set_before);
704
+		}
705
+		do_action('AHEE__EE_Capabilities__init_role_caps__complete', $caps_set_before);
706
+	}
707
+
708
+
709
+	/**
710
+	 * This method sets a capability on a role.  Note this should only be done on activation, or if you have something
711
+	 * specific to prevent the cap from being added on every page load (adding caps are persistent to the db). Note.
712
+	 * this is a wrapper for $wp_role->add_cap()
713
+	 *
714
+	 * @see   wp-includes/capabilities.php
715
+	 *
716
+	 * @since 4.5.0
717
+	 *
718
+	 * @param string $role  A WordPress role the capability is being added to
719
+	 * @param string $cap   The capability being added to the role
720
+	 * @param bool   $grant Whether to grant access to this cap on this role.
721
+	 *
722
+	 * @return bool
723
+	 */
724
+	public function add_cap_to_role($role, $cap, $grant = true)
725
+	{
726
+		$role_object = get_role($role);
727
+		//if the role isn't available then we create it.
728
+		if (! $role_object instanceof WP_Role) {
729
+			//if a plugin wants to create a specific role name then they should create the role before
730
+			//EE_Capabilities does.  Otherwise this function will create the role name from the slug:
731
+			// - removes any `ee_` namespacing from the start of the slug.
732
+			// - replaces `_` with ` ` (empty space).
733
+			// - sentence case on the resulting string.
734
+			$role_label = ucwords(str_replace('_', ' ', str_replace('ee_', '', $role)));
735
+			$role_object = add_role($role, $role_label);
736
+		}
737
+		if ($role_object instanceof WP_Role) {
738
+			$role_object->add_cap($cap, $grant);
739
+			return true;
740
+		}
741
+		return false;
742
+	}
743
+
744
+
745
+	/**
746
+	 * Functions similarly to add_cap_to_role except removes cap from given role.
747
+	 * Wrapper for $wp_role->remove_cap()
748
+	 *
749
+	 * @see   wp-includes/capabilities.php
750
+	 * @since 4.5.0
751
+	 *
752
+	 * @param string $role A WordPress role the capability is being removed from.
753
+	 * @param string $cap  The capability being removed
754
+	 *
755
+	 * @return void
756
+	 */
757
+	public function remove_cap_from_role($role, $cap)
758
+	{
759
+		$role = get_role($role);
760
+		if ($role instanceof WP_Role) {
761
+			$role->remove_cap($cap);
762
+		}
763
+	}
764
+
765
+
766
+	/**
767
+	 * Wrapper for the native WP current_user_can() method.
768
+	 * This is provided as a handy method for a couple things:
769
+	 * 1. Using the context string it allows for targeted filtering by addons for a specific check (without having to
770
+	 * write those filters wherever current_user_can is called).
771
+	 * 2. Explicit passing of $id from a given context ( useful in the cases of map_meta_cap filters )
772
+	 *
773
+	 * @since 4.5.0
774
+	 *
775
+	 * @param string $cap     The cap being checked.
776
+	 * @param string $context The context where the current_user_can is being called from.
777
+	 * @param int    $id      Optional. Id for item where current_user_can is being called from (used in map_meta_cap()
778
+	 *                        filters.
779
+	 *
780
+	 * @return bool  Whether user can or not.
781
+	 */
782
+	public function current_user_can($cap, $context, $id = 0)
783
+	{
784
+		//apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
785
+		$filtered_cap = apply_filters('FHEE__EE_Capabilities__current_user_can__cap__' . $context, $cap, $id);
786
+		$filtered_cap = apply_filters(
787
+			'FHEE__EE_Capabilities__current_user_can__cap',
788
+			$filtered_cap,
789
+			$context,
790
+			$cap,
791
+			$id
792
+		);
793
+		return ! empty($id) ? current_user_can($filtered_cap, $id) : current_user_can($filtered_cap);
794
+	}
795
+
796
+
797
+	/**
798
+	 * This is a wrapper for the WP user_can() function and follows the same style as the other wrappers in this class.
799
+	 *
800
+	 * @param int|WP_User $user    Either the user_id or a WP_User object
801
+	 * @param string      $cap     The capability string being checked
802
+	 * @param string      $context The context where the user_can is being called from (used in filters).
803
+	 * @param int         $id      Optional. Id for item where user_can is being called from ( used in map_meta_cap()
804
+	 *                             filters)
805
+	 *
806
+	 * @return bool Whether user can or not.
807
+	 */
808
+	public function user_can($user, $cap, $context, $id = 0)
809
+	{
810
+		//apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
811
+		$filtered_cap = apply_filters('FHEE__EE_Capabilities__user_can__cap__' . $context, $cap, $user, $id);
812
+		$filtered_cap = apply_filters(
813
+			'FHEE__EE_Capabilities__user_can__cap',
814
+			$filtered_cap,
815
+			$context,
816
+			$cap,
817
+			$user,
818
+			$id
819
+		);
820
+		return ! empty($id) ? user_can($user, $filtered_cap, $id) : user_can($user, $filtered_cap);
821
+	}
822
+
823
+
824
+	/**
825
+	 * Wrapper for the native WP current_user_can_for_blog() method.
826
+	 * This is provided as a handy method for a couple things:
827
+	 * 1. Using the context string it allows for targeted filtering by addons for a specific check (without having to
828
+	 * write those filters wherever current_user_can is called).
829
+	 * 2. Explicit passing of $id from a given context ( useful in the cases of map_meta_cap filters )
830
+	 *
831
+	 * @since 4.5.0
832
+	 *
833
+	 * @param int    $blog_id The blog id that is being checked for.
834
+	 * @param string $cap     The cap being checked.
835
+	 * @param string $context The context where the current_user_can is being called from.
836
+	 * @param int    $id      Optional. Id for item where current_user_can is being called from (used in map_meta_cap()
837
+	 *                        filters.
838
+	 *
839
+	 * @return bool  Whether user can or not.
840
+	 */
841
+	public function current_user_can_for_blog($blog_id, $cap, $context, $id = 0)
842
+	{
843
+		$user_can = ! empty($id)
844
+			? current_user_can_for_blog($blog_id, $cap, $id)
845
+			: current_user_can($blog_id, $cap);
846
+		//apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
847
+		$user_can = apply_filters(
848
+			'FHEE__EE_Capabilities__current_user_can_for_blog__user_can__' . $context,
849
+			$user_can,
850
+			$blog_id,
851
+			$cap,
852
+			$id
853
+		);
854
+		$user_can = apply_filters(
855
+			'FHEE__EE_Capabilities__current_user_can_for_blog__user_can',
856
+			$user_can,
857
+			$context,
858
+			$blog_id,
859
+			$cap,
860
+			$id
861
+		);
862
+		return $user_can;
863
+	}
864
+
865
+
866
+	/**
867
+	 * This helper method just returns an array of registered EE capabilities.
868
+	 * Note this array is filtered.  It is assumed that all available EE capabilities are assigned to the administrator
869
+	 * role.
870
+	 *
871
+	 * @since 4.5.0
872
+	 *
873
+	 * @param string $role If empty then the entire role/capability map is returned.  Otherwise just the capabilities
874
+	 *                     for the given role are returned.
875
+	 *
876
+	 * @return array
877
+	 */
878
+	public function get_ee_capabilities($role = 'administrator')
879
+	{
880
+		$capabilities = $this->_init_caps_map();
881
+		if (empty($role)) {
882
+			return $capabilities;
883
+		}
884
+		return isset($capabilities[ $role ]) ? $capabilities[ $role ] : array();
885
+	}
886 886
 }
887 887
 
888 888
 
@@ -899,142 +899,142 @@  discard block
 block discarded – undo
899 899
 abstract class EE_Meta_Capability_Map
900 900
 {
901 901
 
902
-    public $meta_cap;
903
-
904
-    /**
905
-     * @var EEM_Base
906
-     */
907
-    protected $_model;
908
-
909
-    protected $_model_name;
910
-
911
-    public $published_cap = '';
912
-
913
-    public $others_cap = '';
914
-
915
-    public $private_cap = '';
916
-
917
-
918
-    /**
919
-     * constructor.
920
-     * Receives the setup arguments for the map.
921
-     *
922
-     * @since                        4.5.0
923
-     *
924
-     * @param string $meta_cap   What meta capability is this mapping.
925
-     * @param array  $map_values array {
926
-     *                           //array of values that MUST match a count of 4.  It's okay to send an empty string for
927
-     *                           capabilities that don't get mapped to.
928
-     *
929
-     * @type         $map_values [0] string A string representing the model name. Required.  String's
930
-     *                               should always be used when Menu Maps are registered via the
931
-     *                               plugin API as models are not allowed to be instantiated when
932
-     *                               in maintenance mode 2 (migrations).
933
-     * @type         $map_values [1] string represents the capability used for published. Optional.
934
-     * @type         $map_values [2] string represents the capability used for "others". Optional.
935
-     * @type         $map_values [3] string represents the capability used for private. Optional.
936
-     *                               }
937
-     * @throws EE_Error
938
-     */
939
-    public function __construct($meta_cap, $map_values)
940
-    {
941
-        $this->meta_cap = $meta_cap;
942
-        //verify there are four args in the $map_values array;
943
-        if (count($map_values) !== 4) {
944
-            throw new EE_Error(
945
-                sprintf(
946
-                    esc_html__(
947
-                        'Incoming $map_values array should have a count of four values in it.  This is what was given: %s',
948
-                        'event_espresso'
949
-                    ),
950
-                    '<br>' . print_r($map_values, true)
951
-                )
952
-            );
953
-        }
954
-        //set properties
955
-        $this->_model = null;
956
-        $this->_model_name = $map_values[0];
957
-        $this->published_cap = (string)$map_values[1];
958
-        $this->others_cap = (string)$map_values[2];
959
-        $this->private_cap = (string)$map_values[3];
960
-    }
961
-
962
-    /**
963
-     * Makes it so this object stops filtering caps
964
-     */
965
-    public function remove_filters()
966
-    {
967
-        remove_filter('map_meta_cap', array($this, 'map_meta_caps'), 10);
968
-    }
969
-
970
-
971
-    /**
972
-     * This method ensures that the $model property is converted from the model name string to a proper EEM_Base class
973
-     *
974
-     * @since 4.5.0
975
-     * @throws EE_Error
976
-     *
977
-     * @return void
978
-     */
979
-    public function ensure_is_model()
980
-    {
981
-        //is it already instantiated?
982
-        if ($this->_model instanceof EEM_Base) {
983
-            return;
984
-        }
985
-        //ensure model name is string
986
-        $this->_model_name = (string)$this->_model_name;
987
-        //error proof if the name has EEM in it
988
-        $this->_model_name = str_replace('EEM', '', $this->_model_name);
989
-        $this->_model = EE_Registry::instance()->load_model($this->_model_name);
990
-        if (! $this->_model instanceof EEM_Base) {
991
-            throw new EE_Error(
992
-                sprintf(
993
-                    esc_html__(
994
-                        'This string passed in to %s to represent a EEM_Base model class was not able to be used to instantiate the class.   Please ensure that the string is a match for the EEM_Base model name (not including the EEM_ part). This was given: %s',
995
-                        'event_espresso'
996
-                    ),
997
-                    get_class($this),
998
-                    $this->_model
999
-                )
1000
-            );
1001
-        }
1002
-    }
1003
-
1004
-
1005
-    /**
1006
-     *
1007
-     * @see   EE_Meta_Capability_Map::_map_meta_caps() for docs on params.
1008
-     * @since 4.6.x
1009
-     *
1010
-     * @param $caps
1011
-     * @param $cap
1012
-     * @param $user_id
1013
-     * @param $args
1014
-     *
1015
-     * @return array
1016
-     */
1017
-    public function map_meta_caps($caps, $cap, $user_id, $args)
1018
-    {
1019
-        return $this->_map_meta_caps($caps, $cap, $user_id, $args);
1020
-    }
1021
-
1022
-
1023
-    /**
1024
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1025
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1026
-     *
1027
-     * @since 4.5.0
1028
-     * @see   wp-includes/capabilities.php
1029
-     *
1030
-     * @param array  $caps    actual users capabilities
1031
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1032
-     * @param int    $user_id The user id
1033
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1034
-     *
1035
-     * @return array   actual users capabilities
1036
-     */
1037
-    abstract protected function _map_meta_caps($caps, $cap, $user_id, $args);
902
+	public $meta_cap;
903
+
904
+	/**
905
+	 * @var EEM_Base
906
+	 */
907
+	protected $_model;
908
+
909
+	protected $_model_name;
910
+
911
+	public $published_cap = '';
912
+
913
+	public $others_cap = '';
914
+
915
+	public $private_cap = '';
916
+
917
+
918
+	/**
919
+	 * constructor.
920
+	 * Receives the setup arguments for the map.
921
+	 *
922
+	 * @since                        4.5.0
923
+	 *
924
+	 * @param string $meta_cap   What meta capability is this mapping.
925
+	 * @param array  $map_values array {
926
+	 *                           //array of values that MUST match a count of 4.  It's okay to send an empty string for
927
+	 *                           capabilities that don't get mapped to.
928
+	 *
929
+	 * @type         $map_values [0] string A string representing the model name. Required.  String's
930
+	 *                               should always be used when Menu Maps are registered via the
931
+	 *                               plugin API as models are not allowed to be instantiated when
932
+	 *                               in maintenance mode 2 (migrations).
933
+	 * @type         $map_values [1] string represents the capability used for published. Optional.
934
+	 * @type         $map_values [2] string represents the capability used for "others". Optional.
935
+	 * @type         $map_values [3] string represents the capability used for private. Optional.
936
+	 *                               }
937
+	 * @throws EE_Error
938
+	 */
939
+	public function __construct($meta_cap, $map_values)
940
+	{
941
+		$this->meta_cap = $meta_cap;
942
+		//verify there are four args in the $map_values array;
943
+		if (count($map_values) !== 4) {
944
+			throw new EE_Error(
945
+				sprintf(
946
+					esc_html__(
947
+						'Incoming $map_values array should have a count of four values in it.  This is what was given: %s',
948
+						'event_espresso'
949
+					),
950
+					'<br>' . print_r($map_values, true)
951
+				)
952
+			);
953
+		}
954
+		//set properties
955
+		$this->_model = null;
956
+		$this->_model_name = $map_values[0];
957
+		$this->published_cap = (string)$map_values[1];
958
+		$this->others_cap = (string)$map_values[2];
959
+		$this->private_cap = (string)$map_values[3];
960
+	}
961
+
962
+	/**
963
+	 * Makes it so this object stops filtering caps
964
+	 */
965
+	public function remove_filters()
966
+	{
967
+		remove_filter('map_meta_cap', array($this, 'map_meta_caps'), 10);
968
+	}
969
+
970
+
971
+	/**
972
+	 * This method ensures that the $model property is converted from the model name string to a proper EEM_Base class
973
+	 *
974
+	 * @since 4.5.0
975
+	 * @throws EE_Error
976
+	 *
977
+	 * @return void
978
+	 */
979
+	public function ensure_is_model()
980
+	{
981
+		//is it already instantiated?
982
+		if ($this->_model instanceof EEM_Base) {
983
+			return;
984
+		}
985
+		//ensure model name is string
986
+		$this->_model_name = (string)$this->_model_name;
987
+		//error proof if the name has EEM in it
988
+		$this->_model_name = str_replace('EEM', '', $this->_model_name);
989
+		$this->_model = EE_Registry::instance()->load_model($this->_model_name);
990
+		if (! $this->_model instanceof EEM_Base) {
991
+			throw new EE_Error(
992
+				sprintf(
993
+					esc_html__(
994
+						'This string passed in to %s to represent a EEM_Base model class was not able to be used to instantiate the class.   Please ensure that the string is a match for the EEM_Base model name (not including the EEM_ part). This was given: %s',
995
+						'event_espresso'
996
+					),
997
+					get_class($this),
998
+					$this->_model
999
+				)
1000
+			);
1001
+		}
1002
+	}
1003
+
1004
+
1005
+	/**
1006
+	 *
1007
+	 * @see   EE_Meta_Capability_Map::_map_meta_caps() for docs on params.
1008
+	 * @since 4.6.x
1009
+	 *
1010
+	 * @param $caps
1011
+	 * @param $cap
1012
+	 * @param $user_id
1013
+	 * @param $args
1014
+	 *
1015
+	 * @return array
1016
+	 */
1017
+	public function map_meta_caps($caps, $cap, $user_id, $args)
1018
+	{
1019
+		return $this->_map_meta_caps($caps, $cap, $user_id, $args);
1020
+	}
1021
+
1022
+
1023
+	/**
1024
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1025
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1026
+	 *
1027
+	 * @since 4.5.0
1028
+	 * @see   wp-includes/capabilities.php
1029
+	 *
1030
+	 * @param array  $caps    actual users capabilities
1031
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1032
+	 * @param int    $user_id The user id
1033
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1034
+	 *
1035
+	 * @return array   actual users capabilities
1036
+	 */
1037
+	abstract protected function _map_meta_caps($caps, $cap, $user_id, $args);
1038 1038
 }
1039 1039
 
1040 1040
 
@@ -1050,83 +1050,83 @@  discard block
 block discarded – undo
1050 1050
 class EE_Meta_Capability_Map_Edit extends EE_Meta_Capability_Map
1051 1051
 {
1052 1052
 
1053
-    /**
1054
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1055
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1056
-     *
1057
-     * @since 4.5.0
1058
-     * @see   wp-includes/capabilities.php
1059
-     *
1060
-     * @param array  $caps    actual users capabilities
1061
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1062
-     * @param int    $user_id The user id
1063
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1064
-     *
1065
-     * @return array   actual users capabilities
1066
-     */
1067
-    protected function _map_meta_caps($caps, $cap, $user_id, $args)
1068
-    {
1069
-        //only process if we're checking our mapped_cap
1070
-        if ($cap !== $this->meta_cap) {
1071
-            return $caps;
1072
-        }
1073
-
1074
-        //cast $user_id to int for later explicit comparisons
1075
-        $user_id = (int) $user_id;
1076
-
1077
-        /** @var EE_Base_Class $obj */
1078
-        $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1079
-        //if no obj then let's just do cap
1080
-        if (! $obj instanceof EE_Base_Class) {
1081
-            $caps[] = $cap;
1082
-            return $caps;
1083
-        }
1084
-        if ($obj instanceof EE_CPT_Base) {
1085
-            //if the item author is set and the user is the author...
1086
-            if ($obj->wp_user() && $user_id === $obj->wp_user()) {
1087
-                if (empty($this->published_cap)) {
1088
-                    $caps[] = $cap;
1089
-                } else {
1090
-                    //if obj is published...
1091
-                    if ($obj->status() === 'publish') {
1092
-                        $caps[] = $this->published_cap;
1093
-                    } else {
1094
-                        $caps[] = $cap;
1095
-                    }
1096
-                }
1097
-            } else {
1098
-                //the user is trying to edit someone else's obj
1099
-                if (! empty($this->others_cap)) {
1100
-                    $caps[] = $this->others_cap;
1101
-                }
1102
-                if (! empty($this->published_cap) && $obj->status() === 'publish') {
1103
-                    $caps[] = $this->published_cap;
1104
-                } elseif (! empty($this->private_cap) && $obj->status() === 'private') {
1105
-                    $caps[] = $this->private_cap;
1106
-                }
1107
-            }
1108
-        } else {
1109
-            //not a cpt object so handled differently
1110
-            $has_cap = false;
1111
-            try {
1112
-                $has_cap = method_exists($obj, 'wp_user')
1113
-                    && $obj->wp_user()
1114
-                    && $obj->wp_user() === $user_id;
1115
-            } catch (Exception $e) {
1116
-                if (WP_DEBUG) {
1117
-                    EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1118
-                }
1119
-            }
1120
-            if ($has_cap) {
1121
-                $caps[] = $cap;
1122
-            } else {
1123
-                if (! empty($this->others_cap)) {
1124
-                    $caps[] = $this->others_cap;
1125
-                }
1126
-            }
1127
-        }
1128
-        return $caps;
1129
-    }
1053
+	/**
1054
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1055
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1056
+	 *
1057
+	 * @since 4.5.0
1058
+	 * @see   wp-includes/capabilities.php
1059
+	 *
1060
+	 * @param array  $caps    actual users capabilities
1061
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1062
+	 * @param int    $user_id The user id
1063
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1064
+	 *
1065
+	 * @return array   actual users capabilities
1066
+	 */
1067
+	protected function _map_meta_caps($caps, $cap, $user_id, $args)
1068
+	{
1069
+		//only process if we're checking our mapped_cap
1070
+		if ($cap !== $this->meta_cap) {
1071
+			return $caps;
1072
+		}
1073
+
1074
+		//cast $user_id to int for later explicit comparisons
1075
+		$user_id = (int) $user_id;
1076
+
1077
+		/** @var EE_Base_Class $obj */
1078
+		$obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1079
+		//if no obj then let's just do cap
1080
+		if (! $obj instanceof EE_Base_Class) {
1081
+			$caps[] = $cap;
1082
+			return $caps;
1083
+		}
1084
+		if ($obj instanceof EE_CPT_Base) {
1085
+			//if the item author is set and the user is the author...
1086
+			if ($obj->wp_user() && $user_id === $obj->wp_user()) {
1087
+				if (empty($this->published_cap)) {
1088
+					$caps[] = $cap;
1089
+				} else {
1090
+					//if obj is published...
1091
+					if ($obj->status() === 'publish') {
1092
+						$caps[] = $this->published_cap;
1093
+					} else {
1094
+						$caps[] = $cap;
1095
+					}
1096
+				}
1097
+			} else {
1098
+				//the user is trying to edit someone else's obj
1099
+				if (! empty($this->others_cap)) {
1100
+					$caps[] = $this->others_cap;
1101
+				}
1102
+				if (! empty($this->published_cap) && $obj->status() === 'publish') {
1103
+					$caps[] = $this->published_cap;
1104
+				} elseif (! empty($this->private_cap) && $obj->status() === 'private') {
1105
+					$caps[] = $this->private_cap;
1106
+				}
1107
+			}
1108
+		} else {
1109
+			//not a cpt object so handled differently
1110
+			$has_cap = false;
1111
+			try {
1112
+				$has_cap = method_exists($obj, 'wp_user')
1113
+					&& $obj->wp_user()
1114
+					&& $obj->wp_user() === $user_id;
1115
+			} catch (Exception $e) {
1116
+				if (WP_DEBUG) {
1117
+					EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1118
+				}
1119
+			}
1120
+			if ($has_cap) {
1121
+				$caps[] = $cap;
1122
+			} else {
1123
+				if (! empty($this->others_cap)) {
1124
+					$caps[] = $this->others_cap;
1125
+				}
1126
+			}
1127
+		}
1128
+		return $caps;
1129
+	}
1130 1130
 }
1131 1131
 
1132 1132
 
@@ -1143,24 +1143,24 @@  discard block
 block discarded – undo
1143 1143
 class EE_Meta_Capability_Map_Delete extends EE_Meta_Capability_Map_Edit
1144 1144
 {
1145 1145
 
1146
-    /**
1147
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1148
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1149
-     *
1150
-     * @since 4.5.0
1151
-     * @see   wp-includes/capabilities.php
1152
-     *
1153
-     * @param array  $caps    actual users capabilities
1154
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1155
-     * @param int    $user_id The user id
1156
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1157
-     *
1158
-     * @return array   actual users capabilities
1159
-     */
1160
-    protected function _map_meta_caps($caps, $cap, $user_id, $args)
1161
-    {
1162
-        return parent::_map_meta_caps($caps, $cap, $user_id, $args);
1163
-    }
1146
+	/**
1147
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1148
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1149
+	 *
1150
+	 * @since 4.5.0
1151
+	 * @see   wp-includes/capabilities.php
1152
+	 *
1153
+	 * @param array  $caps    actual users capabilities
1154
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1155
+	 * @param int    $user_id The user id
1156
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1157
+	 *
1158
+	 * @return array   actual users capabilities
1159
+	 */
1160
+	protected function _map_meta_caps($caps, $cap, $user_id, $args)
1161
+	{
1162
+		return parent::_map_meta_caps($caps, $cap, $user_id, $args);
1163
+	}
1164 1164
 }
1165 1165
 
1166 1166
 
@@ -1176,77 +1176,77 @@  discard block
 block discarded – undo
1176 1176
 class EE_Meta_Capability_Map_Read extends EE_Meta_Capability_Map
1177 1177
 {
1178 1178
 
1179
-    /**
1180
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1181
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1182
-     *
1183
-     * @since 4.5.0
1184
-     * @see   wp-includes/capabilities.php
1185
-     *
1186
-     * @param array  $caps    actual users capabilities
1187
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1188
-     * @param int    $user_id The user id
1189
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1190
-     *
1191
-     * @return array   actual users capabilities
1192
-     */
1193
-    protected function _map_meta_caps($caps, $cap, $user_id, $args)
1194
-    {
1195
-        //only process if we're checking our mapped cap;
1196
-        if ($cap !== $this->meta_cap) {
1197
-            return $caps;
1198
-        }
1199
-
1200
-        //cast $user_id to int for later explicit comparisons
1201
-        $user_id = (int) $user_id;
1202
-
1203
-        $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1204
-        //if no obj then let's just do cap
1205
-        if (! $obj instanceof EE_Base_Class) {
1206
-            $caps[] = $cap;
1207
-            return $caps;
1208
-        }
1209
-        if ($obj instanceof EE_CPT_Base) {
1210
-            $status_obj = get_post_status_object($obj->status());
1211
-            if ($status_obj->public) {
1212
-                $caps[] = $cap;
1213
-                return $caps;
1214
-            }
1215
-            //if the item author is set and the user is the author...
1216
-            if ($obj->wp_user() && $obj->wp_user() === $user_id) {
1217
-                $caps[] = $cap;
1218
-            } elseif ($status_obj->private && ! empty($this->private_cap)) {
1219
-                //the user is trying to view someone else's obj
1220
-                $caps[] = $this->private_cap;
1221
-            } elseif (! empty($this->others_cap)) {
1222
-                $caps[] = $this->others_cap;
1223
-            } else {
1224
-                $caps[] = $cap;
1225
-            }
1226
-        } else {
1227
-            //not a cpt object so handled differently
1228
-            $has_cap = false;
1229
-            try {
1230
-                $has_cap = method_exists($obj, 'wp_user')
1231
-                           && $obj->wp_user()
1232
-                           && $obj->wp_user() === $user_id;
1233
-            } catch (Exception $e) {
1234
-                if (WP_DEBUG) {
1235
-                    EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1236
-                }
1237
-            }
1238
-            if ($has_cap) {
1239
-                $caps[] = $cap;
1240
-            } elseif (! empty($this->private_cap)) {
1241
-                $caps[] = $this->private_cap;
1242
-            } elseif (! empty($this->others_cap)) {
1243
-                $caps[] = $this->others_cap;
1244
-            } else {
1245
-                $caps[] = $cap;
1246
-            }
1247
-        }
1248
-        return $caps;
1249
-    }
1179
+	/**
1180
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1181
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1182
+	 *
1183
+	 * @since 4.5.0
1184
+	 * @see   wp-includes/capabilities.php
1185
+	 *
1186
+	 * @param array  $caps    actual users capabilities
1187
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1188
+	 * @param int    $user_id The user id
1189
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1190
+	 *
1191
+	 * @return array   actual users capabilities
1192
+	 */
1193
+	protected function _map_meta_caps($caps, $cap, $user_id, $args)
1194
+	{
1195
+		//only process if we're checking our mapped cap;
1196
+		if ($cap !== $this->meta_cap) {
1197
+			return $caps;
1198
+		}
1199
+
1200
+		//cast $user_id to int for later explicit comparisons
1201
+		$user_id = (int) $user_id;
1202
+
1203
+		$obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1204
+		//if no obj then let's just do cap
1205
+		if (! $obj instanceof EE_Base_Class) {
1206
+			$caps[] = $cap;
1207
+			return $caps;
1208
+		}
1209
+		if ($obj instanceof EE_CPT_Base) {
1210
+			$status_obj = get_post_status_object($obj->status());
1211
+			if ($status_obj->public) {
1212
+				$caps[] = $cap;
1213
+				return $caps;
1214
+			}
1215
+			//if the item author is set and the user is the author...
1216
+			if ($obj->wp_user() && $obj->wp_user() === $user_id) {
1217
+				$caps[] = $cap;
1218
+			} elseif ($status_obj->private && ! empty($this->private_cap)) {
1219
+				//the user is trying to view someone else's obj
1220
+				$caps[] = $this->private_cap;
1221
+			} elseif (! empty($this->others_cap)) {
1222
+				$caps[] = $this->others_cap;
1223
+			} else {
1224
+				$caps[] = $cap;
1225
+			}
1226
+		} else {
1227
+			//not a cpt object so handled differently
1228
+			$has_cap = false;
1229
+			try {
1230
+				$has_cap = method_exists($obj, 'wp_user')
1231
+						   && $obj->wp_user()
1232
+						   && $obj->wp_user() === $user_id;
1233
+			} catch (Exception $e) {
1234
+				if (WP_DEBUG) {
1235
+					EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1236
+				}
1237
+			}
1238
+			if ($has_cap) {
1239
+				$caps[] = $cap;
1240
+			} elseif (! empty($this->private_cap)) {
1241
+				$caps[] = $this->private_cap;
1242
+			} elseif (! empty($this->others_cap)) {
1243
+				$caps[] = $this->others_cap;
1244
+			} else {
1245
+				$caps[] = $cap;
1246
+			}
1247
+		}
1248
+		return $caps;
1249
+	}
1250 1250
 }
1251 1251
 
1252 1252
 
@@ -1263,52 +1263,52 @@  discard block
 block discarded – undo
1263 1263
 class EE_Meta_Capability_Map_Messages_Cap extends EE_Meta_Capability_Map
1264 1264
 {
1265 1265
 
1266
-    /**
1267
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1268
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1269
-     *
1270
-     * @since 4.5.0
1271
-     * @see   wp-includes/capabilities.php
1272
-     *
1273
-     * @param array  $caps    actual users capabilities
1274
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1275
-     * @param int    $user_id The user id
1276
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1277
-     *
1278
-     * @return array   actual users capabilities
1279
-     */
1280
-    protected function _map_meta_caps($caps, $cap, $user_id, $args)
1281
-    {
1282
-        //only process if we're checking our mapped_cap
1283
-        if ($cap !== $this->meta_cap) {
1284
-            return $caps;
1285
-        }
1286
-
1287
-        //cast $user_id to int for later explicit comparisons
1288
-        $user_id = (int) $user_id;
1289
-
1290
-        $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1291
-        //if no obj then let's just do cap
1292
-        if (! $obj instanceof EE_Message_Template_Group) {
1293
-            $caps[] = $cap;
1294
-            return $caps;
1295
-        }
1296
-        $is_global = $obj->is_global();
1297
-        if ($obj->wp_user() && $obj->wp_user() === $user_id) {
1298
-            if ($is_global) {
1299
-                $caps[] = $this->private_cap;
1300
-            } else {
1301
-                $caps[] = $cap;
1302
-            }
1303
-        } else {
1304
-            if ($is_global) {
1305
-                $caps[] = $this->private_cap;
1306
-            } else {
1307
-                $caps[] = $this->others_cap;
1308
-            }
1309
-        }
1310
-        return $caps;
1311
-    }
1266
+	/**
1267
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1268
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1269
+	 *
1270
+	 * @since 4.5.0
1271
+	 * @see   wp-includes/capabilities.php
1272
+	 *
1273
+	 * @param array  $caps    actual users capabilities
1274
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1275
+	 * @param int    $user_id The user id
1276
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1277
+	 *
1278
+	 * @return array   actual users capabilities
1279
+	 */
1280
+	protected function _map_meta_caps($caps, $cap, $user_id, $args)
1281
+	{
1282
+		//only process if we're checking our mapped_cap
1283
+		if ($cap !== $this->meta_cap) {
1284
+			return $caps;
1285
+		}
1286
+
1287
+		//cast $user_id to int for later explicit comparisons
1288
+		$user_id = (int) $user_id;
1289
+
1290
+		$obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1291
+		//if no obj then let's just do cap
1292
+		if (! $obj instanceof EE_Message_Template_Group) {
1293
+			$caps[] = $cap;
1294
+			return $caps;
1295
+		}
1296
+		$is_global = $obj->is_global();
1297
+		if ($obj->wp_user() && $obj->wp_user() === $user_id) {
1298
+			if ($is_global) {
1299
+				$caps[] = $this->private_cap;
1300
+			} else {
1301
+				$caps[] = $cap;
1302
+			}
1303
+		} else {
1304
+			if ($is_global) {
1305
+				$caps[] = $this->private_cap;
1306
+			} else {
1307
+				$caps[] = $this->others_cap;
1308
+			}
1309
+		}
1310
+		return $caps;
1311
+	}
1312 1312
 }
1313 1313
 
1314 1314
 
@@ -1325,41 +1325,41 @@  discard block
 block discarded – undo
1325 1325
 class EE_Meta_Capability_Map_Registration_Form_Cap extends EE_Meta_Capability_Map
1326 1326
 {
1327 1327
 
1328
-    /**
1329
-     * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1330
-     * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1331
-     *
1332
-     * @since 4.5.0
1333
-     * @see   wp-includes/capabilities.php
1334
-     *
1335
-     * @param array  $caps    actual users capabilities
1336
-     * @param string $cap     initial capability name that is being checked (the "map" key)
1337
-     * @param int    $user_id The user id
1338
-     * @param array  $args    Adds context to the cap. Typically the object ID.
1339
-     *
1340
-     * @return array   actual users capabilities
1341
-     */
1342
-    protected function _map_meta_caps($caps, $cap, $user_id, $args)
1343
-    {
1344
-        //only process if we're checking our mapped_cap
1345
-        if ($cap !== $this->meta_cap) {
1346
-            return $caps;
1347
-        }
1348
-        $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1349
-        //if no obj then let's just do cap
1350
-        if (! $obj instanceof EE_Base_Class) {
1351
-            $caps[] = $cap;
1352
-            return $caps;
1353
-        }
1354
-        $is_system = $obj instanceof EE_Question_Group ? $obj->system_group() : false;
1355
-        $is_system = $obj instanceof EE_Question ? $obj->is_system_question() : $is_system;
1356
-        if ($is_system) {
1357
-            $caps[] = $this->private_cap;
1358
-        } else {
1359
-            $caps[] = $cap;
1360
-        }
1361
-        return $caps;
1362
-    }
1328
+	/**
1329
+	 * This is the callback for the wp map_meta_caps() function which allows for ensuring certain caps that act as a
1330
+	 * "meta" for other caps ( i.e. ee_edit_event is a meta for ee_edit_others_events ) work as expected.
1331
+	 *
1332
+	 * @since 4.5.0
1333
+	 * @see   wp-includes/capabilities.php
1334
+	 *
1335
+	 * @param array  $caps    actual users capabilities
1336
+	 * @param string $cap     initial capability name that is being checked (the "map" key)
1337
+	 * @param int    $user_id The user id
1338
+	 * @param array  $args    Adds context to the cap. Typically the object ID.
1339
+	 *
1340
+	 * @return array   actual users capabilities
1341
+	 */
1342
+	protected function _map_meta_caps($caps, $cap, $user_id, $args)
1343
+	{
1344
+		//only process if we're checking our mapped_cap
1345
+		if ($cap !== $this->meta_cap) {
1346
+			return $caps;
1347
+		}
1348
+		$obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1349
+		//if no obj then let's just do cap
1350
+		if (! $obj instanceof EE_Base_Class) {
1351
+			$caps[] = $cap;
1352
+			return $caps;
1353
+		}
1354
+		$is_system = $obj instanceof EE_Question_Group ? $obj->system_group() : false;
1355
+		$is_system = $obj instanceof EE_Question ? $obj->is_system_question() : $is_system;
1356
+		if ($is_system) {
1357
+			$caps[] = $this->private_cap;
1358
+		} else {
1359
+			$caps[] = $cap;
1360
+		}
1361
+		return $caps;
1362
+	}
1363 1363
 
1364 1364
 
1365 1365
 }
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
     public static function instance()
70 70
     {
71 71
         //check if instantiated, and if not do so.
72
-        if (! self::$_instance instanceof EE_Capabilities) {
72
+        if ( ! self::$_instance instanceof EE_Capabilities) {
73 73
             self::$_instance = new self();
74 74
         }
75 75
         return self::$_instance;
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
      */
123 123
     public function init_cap_logic($reset = false)
124 124
     {
125
-        if (! did_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call')) {
125
+        if ( ! did_action('AHEE__EE_Capabilities__init_caps__before_init_cap_logic_call')) {
126 126
             throw new InvalidExecutionPathException(
127 127
                 esc_html__(
128 128
                     '%1$s should not be called before the %2$s hook has fired.  It is recommended to instead use %s',
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
                 )
131 131
             );
132 132
         }
133
-        if (! $this->has_been_initialized($reset)) {
133
+        if ( ! $this->has_been_initialized($reset)) {
134 134
             $this->_caps_map = $this->_init_caps_map();
135 135
             $this->init_role_caps($reset);
136 136
             $this->_set_meta_caps();
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
         $this->_meta_caps = $this->_get_default_meta_caps_array();
164 164
         $this->_meta_caps = apply_filters('FHEE__EE_Capabilities___set_meta_caps__meta_caps', $this->_meta_caps);
165 165
         //add filter for map_meta_caps but only if models can query.
166
-        if (! has_filter('map_meta_cap', array($this, 'map_meta_caps'))) {
166
+        if ( ! has_filter('map_meta_cap', array($this, 'map_meta_caps'))) {
167 167
             add_filter('map_meta_cap', array($this, 'map_meta_caps'), 10, 4);
168 168
         }
169 169
     }
@@ -322,11 +322,11 @@  discard block
 block discarded – undo
322 322
         if (did_action('AHEE__EE_System__load_espresso_addons__complete')) {
323 323
             //loop through our _meta_caps array
324 324
             foreach ($this->_meta_caps as $meta_map) {
325
-                if (! $meta_map instanceof EE_Meta_Capability_Map) {
325
+                if ( ! $meta_map instanceof EE_Meta_Capability_Map) {
326 326
                     continue;
327 327
                 }
328 328
                 // don't load models if there is no object ID in the args
329
-                if (! empty($args[0])) {
329
+                if ( ! empty($args[0])) {
330 330
                     $meta_map->ensure_is_model();
331 331
                 }
332 332
                 $caps = $meta_map->map_meta_caps($caps, $cap, $user_id, $args);
@@ -690,9 +690,9 @@  discard block
 block discarded – undo
690 690
         foreach ($caps_map as $role => $caps_for_role) {
691 691
             foreach ($caps_for_role as $cap) {
692 692
                 //first check we haven't already added this cap before, or it's a reset
693
-                if ($reset || ! isset($caps_set_before[ $role ]) || ! in_array($cap, $caps_set_before[ $role ])) {
693
+                if ($reset || ! isset($caps_set_before[$role]) || ! in_array($cap, $caps_set_before[$role])) {
694 694
                     if ($this->add_cap_to_role($role, $cap)) {
695
-                        $caps_set_before[ $role ][] = $cap;
695
+                        $caps_set_before[$role][] = $cap;
696 696
                         $update_caps_set_before_option = true;
697 697
                     }
698 698
                 }
@@ -725,7 +725,7 @@  discard block
 block discarded – undo
725 725
     {
726 726
         $role_object = get_role($role);
727 727
         //if the role isn't available then we create it.
728
-        if (! $role_object instanceof WP_Role) {
728
+        if ( ! $role_object instanceof WP_Role) {
729 729
             //if a plugin wants to create a specific role name then they should create the role before
730 730
             //EE_Capabilities does.  Otherwise this function will create the role name from the slug:
731 731
             // - removes any `ee_` namespacing from the start of the slug.
@@ -782,7 +782,7 @@  discard block
 block discarded – undo
782 782
     public function current_user_can($cap, $context, $id = 0)
783 783
     {
784 784
         //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
785
-        $filtered_cap = apply_filters('FHEE__EE_Capabilities__current_user_can__cap__' . $context, $cap, $id);
785
+        $filtered_cap = apply_filters('FHEE__EE_Capabilities__current_user_can__cap__'.$context, $cap, $id);
786 786
         $filtered_cap = apply_filters(
787 787
             'FHEE__EE_Capabilities__current_user_can__cap',
788 788
             $filtered_cap,
@@ -808,7 +808,7 @@  discard block
 block discarded – undo
808 808
     public function user_can($user, $cap, $context, $id = 0)
809 809
     {
810 810
         //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
811
-        $filtered_cap = apply_filters('FHEE__EE_Capabilities__user_can__cap__' . $context, $cap, $user, $id);
811
+        $filtered_cap = apply_filters('FHEE__EE_Capabilities__user_can__cap__'.$context, $cap, $user, $id);
812 812
         $filtered_cap = apply_filters(
813 813
             'FHEE__EE_Capabilities__user_can__cap',
814 814
             $filtered_cap,
@@ -845,7 +845,7 @@  discard block
 block discarded – undo
845 845
             : current_user_can($blog_id, $cap);
846 846
         //apply filters (both a global on just the cap, and context specific.  Global overrides context specific)
847 847
         $user_can = apply_filters(
848
-            'FHEE__EE_Capabilities__current_user_can_for_blog__user_can__' . $context,
848
+            'FHEE__EE_Capabilities__current_user_can_for_blog__user_can__'.$context,
849 849
             $user_can,
850 850
             $blog_id,
851 851
             $cap,
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
         if (empty($role)) {
882 882
             return $capabilities;
883 883
         }
884
-        return isset($capabilities[ $role ]) ? $capabilities[ $role ] : array();
884
+        return isset($capabilities[$role]) ? $capabilities[$role] : array();
885 885
     }
886 886
 }
887 887
 
@@ -947,16 +947,16 @@  discard block
 block discarded – undo
947 947
                         'Incoming $map_values array should have a count of four values in it.  This is what was given: %s',
948 948
                         'event_espresso'
949 949
                     ),
950
-                    '<br>' . print_r($map_values, true)
950
+                    '<br>'.print_r($map_values, true)
951 951
                 )
952 952
             );
953 953
         }
954 954
         //set properties
955 955
         $this->_model = null;
956 956
         $this->_model_name = $map_values[0];
957
-        $this->published_cap = (string)$map_values[1];
958
-        $this->others_cap = (string)$map_values[2];
959
-        $this->private_cap = (string)$map_values[3];
957
+        $this->published_cap = (string) $map_values[1];
958
+        $this->others_cap = (string) $map_values[2];
959
+        $this->private_cap = (string) $map_values[3];
960 960
     }
961 961
 
962 962
     /**
@@ -983,11 +983,11 @@  discard block
 block discarded – undo
983 983
             return;
984 984
         }
985 985
         //ensure model name is string
986
-        $this->_model_name = (string)$this->_model_name;
986
+        $this->_model_name = (string) $this->_model_name;
987 987
         //error proof if the name has EEM in it
988 988
         $this->_model_name = str_replace('EEM', '', $this->_model_name);
989 989
         $this->_model = EE_Registry::instance()->load_model($this->_model_name);
990
-        if (! $this->_model instanceof EEM_Base) {
990
+        if ( ! $this->_model instanceof EEM_Base) {
991 991
             throw new EE_Error(
992 992
                 sprintf(
993 993
                     esc_html__(
@@ -1077,7 +1077,7 @@  discard block
 block discarded – undo
1077 1077
         /** @var EE_Base_Class $obj */
1078 1078
         $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1079 1079
         //if no obj then let's just do cap
1080
-        if (! $obj instanceof EE_Base_Class) {
1080
+        if ( ! $obj instanceof EE_Base_Class) {
1081 1081
             $caps[] = $cap;
1082 1082
             return $caps;
1083 1083
         }
@@ -1096,12 +1096,12 @@  discard block
 block discarded – undo
1096 1096
                 }
1097 1097
             } else {
1098 1098
                 //the user is trying to edit someone else's obj
1099
-                if (! empty($this->others_cap)) {
1099
+                if ( ! empty($this->others_cap)) {
1100 1100
                     $caps[] = $this->others_cap;
1101 1101
                 }
1102
-                if (! empty($this->published_cap) && $obj->status() === 'publish') {
1102
+                if ( ! empty($this->published_cap) && $obj->status() === 'publish') {
1103 1103
                     $caps[] = $this->published_cap;
1104
-                } elseif (! empty($this->private_cap) && $obj->status() === 'private') {
1104
+                } elseif ( ! empty($this->private_cap) && $obj->status() === 'private') {
1105 1105
                     $caps[] = $this->private_cap;
1106 1106
                 }
1107 1107
             }
@@ -1120,7 +1120,7 @@  discard block
 block discarded – undo
1120 1120
             if ($has_cap) {
1121 1121
                 $caps[] = $cap;
1122 1122
             } else {
1123
-                if (! empty($this->others_cap)) {
1123
+                if ( ! empty($this->others_cap)) {
1124 1124
                     $caps[] = $this->others_cap;
1125 1125
                 }
1126 1126
             }
@@ -1202,7 +1202,7 @@  discard block
 block discarded – undo
1202 1202
 
1203 1203
         $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1204 1204
         //if no obj then let's just do cap
1205
-        if (! $obj instanceof EE_Base_Class) {
1205
+        if ( ! $obj instanceof EE_Base_Class) {
1206 1206
             $caps[] = $cap;
1207 1207
             return $caps;
1208 1208
         }
@@ -1218,7 +1218,7 @@  discard block
 block discarded – undo
1218 1218
             } elseif ($status_obj->private && ! empty($this->private_cap)) {
1219 1219
                 //the user is trying to view someone else's obj
1220 1220
                 $caps[] = $this->private_cap;
1221
-            } elseif (! empty($this->others_cap)) {
1221
+            } elseif ( ! empty($this->others_cap)) {
1222 1222
                 $caps[] = $this->others_cap;
1223 1223
             } else {
1224 1224
                 $caps[] = $cap;
@@ -1237,9 +1237,9 @@  discard block
 block discarded – undo
1237 1237
             }
1238 1238
             if ($has_cap) {
1239 1239
                 $caps[] = $cap;
1240
-            } elseif (! empty($this->private_cap)) {
1240
+            } elseif ( ! empty($this->private_cap)) {
1241 1241
                 $caps[] = $this->private_cap;
1242
-            } elseif (! empty($this->others_cap)) {
1242
+            } elseif ( ! empty($this->others_cap)) {
1243 1243
                 $caps[] = $this->others_cap;
1244 1244
             } else {
1245 1245
                 $caps[] = $cap;
@@ -1289,7 +1289,7 @@  discard block
 block discarded – undo
1289 1289
 
1290 1290
         $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1291 1291
         //if no obj then let's just do cap
1292
-        if (! $obj instanceof EE_Message_Template_Group) {
1292
+        if ( ! $obj instanceof EE_Message_Template_Group) {
1293 1293
             $caps[] = $cap;
1294 1294
             return $caps;
1295 1295
         }
@@ -1347,7 +1347,7 @@  discard block
 block discarded – undo
1347 1347
         }
1348 1348
         $obj = ! empty($args[0]) ? $this->_model->get_one_by_ID($args[0]) : null;
1349 1349
         //if no obj then let's just do cap
1350
-        if (! $obj instanceof EE_Base_Class) {
1350
+        if ( ! $obj instanceof EE_Base_Class) {
1351 1351
             $caps[] = $cap;
1352 1352
             return $caps;
1353 1353
         }
Please login to merge, or discard this patch.