Completed
Pull Request — Gutenberg/master (#637)
by Darren
30:45 queued 16:02
created
core/domain/services/assets/CoreAssetManager.php 1 patch
Indentation   +439 added lines, -439 removed lines patch added patch discarded remove patch
@@ -29,459 +29,459 @@
 block discarded – undo
29 29
 class CoreAssetManager extends AssetManager
30 30
 {
31 31
 
32
-    // WordPress core / Third party JS asset handles
33
-    const JS_HANDLE_JQUERY = 'jquery';
32
+	// WordPress core / Third party JS asset handles
33
+	const JS_HANDLE_JQUERY = 'jquery';
34 34
 
35
-    const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
35
+	const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
36 36
 
37
-    const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
37
+	const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
38 38
 
39
-    const JS_HANDLE_UNDERSCORE = 'underscore';
39
+	const JS_HANDLE_UNDERSCORE = 'underscore';
40 40
 
41
-    const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
41
+	const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
42 42
 
43
-    // EE JS assets handles
44
-    const JS_HANDLE_EE_MANIFEST = 'ee-manifest';
43
+	// EE JS assets handles
44
+	const JS_HANDLE_EE_MANIFEST = 'ee-manifest';
45 45
 
46
-    const JS_HANDLE_EE_JS_CORE = 'eejs-core';
46
+	const JS_HANDLE_EE_JS_CORE = 'eejs-core';
47 47
 
48
-    const JS_HANDLE_EE_VENDOR = 'eventespresso-vendor';
48
+	const JS_HANDLE_EE_VENDOR = 'eventespresso-vendor';
49 49
 
50
-    const JS_HANDLE_EE_DATA_STORES = 'eventespresso-data-stores';
50
+	const JS_HANDLE_EE_DATA_STORES = 'eventespresso-data-stores';
51 51
 
52
-    const JS_HANDLE_EE_HELPERS = 'eventespresso-helpers';
52
+	const JS_HANDLE_EE_HELPERS = 'eventespresso-helpers';
53 53
 
54
-    const JS_HANDLE_EE_MODEL = 'eventespresso-model';
54
+	const JS_HANDLE_EE_MODEL = 'eventespresso-model';
55 55
 
56
-    const JS_HANDLE_EE_VALUE_OBJECTS = 'eventespresso-value-objects';
56
+	const JS_HANDLE_EE_VALUE_OBJECTS = 'eventespresso-value-objects';
57 57
 
58
-    const JS_HANDLE_EE_HOC_COMPONENTS = 'eventespresso-hoc-components';
58
+	const JS_HANDLE_EE_HOC_COMPONENTS = 'eventespresso-hoc-components';
59 59
 
60
-    const JS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
60
+	const JS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
61 61
 
62
-    const JS_HANDLE_EE_JS_API = 'eejs-api';
62
+	const JS_HANDLE_EE_JS_API = 'eejs-api';
63 63
 
64
-    const JS_HANDLE_EE_CORE = 'espresso_core';
64
+	const JS_HANDLE_EE_CORE = 'espresso_core';
65 65
 
66
-    const JS_HANDLE_EE_I18N = 'eei18n';
67
-
68
-    const JS_HANDLE_EE_ACCOUNTING = 'ee-accounting';
69
-
70
-    const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
71
-
72
-    // EE CSS assets handles
73
-    const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
74
-
75
-    const CSS_HANDLE_EE_CUSTOM = 'espresso_custom_css';
76
-
77
-    const CSS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
78
-
79
-    /**
80
-     * @var EE_Currency_Config $currency_config
81
-     */
82
-    protected $currency_config;
83
-
84
-    /**
85
-     * @var EE_Template_Config $template_config
86
-     */
87
-    protected $template_config;
88
-
89
-
90
-    /**
91
-     * CoreAssetRegister constructor.
92
-     *
93
-     * @param AssetCollection    $assets
94
-     * @param EE_Currency_Config $currency_config
95
-     * @param EE_Template_Config $template_config
96
-     * @param DomainInterface    $domain
97
-     * @param Registry           $registry
98
-     */
99
-    public function __construct(
100
-        AssetCollection $assets,
101
-        EE_Currency_Config $currency_config,
102
-        EE_Template_Config $template_config,
103
-        DomainInterface $domain,
104
-        Registry $registry
105
-    ) {
106
-        $this->currency_config = $currency_config;
107
-        $this->template_config = $template_config;
108
-        parent::__construct($domain, $assets, $registry);
109
-    }
110
-
111
-
112
-    /**
113
-     * @since 4.9.62.p
114
-     * @throws DuplicateCollectionIdentifierException
115
-     * @throws InvalidArgumentException
116
-     * @throws InvalidDataTypeException
117
-     * @throws InvalidEntityException
118
-     */
119
-    public function addAssets()
120
-    {
121
-        $this->addJavascriptFiles();
122
-        $this->addStylesheetFiles();
123
-    }
124
-
125
-
126
-    /**
127
-     * @since 4.9.62.p
128
-     * @throws DuplicateCollectionIdentifierException
129
-     * @throws InvalidArgumentException
130
-     * @throws InvalidDataTypeException
131
-     * @throws InvalidEntityException
132
-     */
133
-    public function addJavascriptFiles()
134
-    {
135
-        $this->loadCoreJs();
136
-        $this->loadJqueryValidate();
137
-        $this->loadAccountingJs();
138
-        add_action(
139
-            'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
140
-            array($this, 'loadQtipJs')
141
-        );
142
-        $this->registerAdminAssets();
143
-    }
144
-
145
-
146
-    /**
147
-     * @since 4.9.62.p
148
-     * @throws DuplicateCollectionIdentifierException
149
-     * @throws InvalidDataTypeException
150
-     * @throws InvalidEntityException
151
-     */
152
-    public function addStylesheetFiles()
153
-    {
154
-        $this->loadCoreCss();
155
-    }
156
-
157
-
158
-    /**
159
-     * core default javascript
160
-     *
161
-     * @since 4.9.62.p
162
-     * @throws DuplicateCollectionIdentifierException
163
-     * @throws InvalidArgumentException
164
-     * @throws InvalidDataTypeException
165
-     * @throws InvalidEntityException
166
-     */
167
-    private function loadCoreJs()
168
-    {
169
-        $this->addJavascript(
170
-            CoreAssetManager::JS_HANDLE_EE_MANIFEST,
171
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
172
-        );
173
-
174
-        $this->addJavascript(
175
-            CoreAssetManager::JS_HANDLE_EE_JS_CORE,
176
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
177
-            array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
178
-        )
179
-        ->setHasInlineData();
180
-
181
-        $this->addJavascript(
182
-            CoreAssetManager::JS_HANDLE_EE_VENDOR,
183
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
184
-            array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
185
-        );
186
-
187
-        $this->addJavascript(
188
-            CoreAssetManager::JS_HANDLE_EE_HELPERS,
189
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers')
190
-        )->setRequiresTranslation();
191
-
192
-        $this->addJavascript(
193
-            CoreAssetManager::JS_HANDLE_EE_MODEL,
194
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'model'),
195
-            array(
196
-                CoreAssetManager::JS_HANDLE_EE_HELPERS
197
-            )
198
-        )->setRequiresTranslation();
199
-
200
-        $this->addJavascript(
201
-            CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
202
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'valueObjects'),
203
-            array(
204
-                CoreAssetManager::JS_HANDLE_EE_MODEL
205
-            )
206
-        )->setRequiresTranslation();
207
-
208
-        $this->addJavascript(
209
-            CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
210
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
211
-            array(
212
-                CoreAssetManager::JS_HANDLE_EE_VENDOR,
213
-                'wp-data',
214
-                'wp-api-request',
215
-                CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS
216
-            )
217
-        )
218
-             ->setRequiresTranslation();
219
-
220
-        $this->addJavascript(
221
-            CoreAssetManager::JS_HANDLE_EE_HOC_COMPONENTS,
222
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'hocComponents'),
223
-            array(
224
-                CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
225
-                CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
226
-                'wp-components',
227
-            )
228
-        )->setRequiresTranslation();
229
-
230
-        $this->addJavascript(
231
-            CoreAssetManager::JS_HANDLE_EE_COMPONENTS,
232
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
233
-            array(
234
-                CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
235
-                CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
236
-                'wp-components',
237
-            )
238
-        )
239
-        ->setRequiresTranslation();
240
-
241
-        $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
242
-        $this->registry->addData(
243
-            'paths',
244
-            array(
245
-                'rest_route' => rest_url('ee/v4.8.36/'),
246
-                'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
247
-                'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
248
-                'site_url' => site_url('/'),
249
-                'admin_url' => admin_url('/'),
250
-            )
251
-        );
252
-        /** site formatting values **/
253
-        $this->registry->addData(
254
-            'site_formats',
255
-            array(
256
-                'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
257
-            )
258
-        );
259
-        /** currency data **/
260
-        $this->registry->addData(
261
-            'currency_config',
262
-            $this->getCurrencySettings()
263
-        );
264
-        /** site timezone */
265
-        $this->registry->addData(
266
-            'default_timezone',
267
-            array(
268
-                'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
269
-                'string' => get_option('timezone_string'),
270
-                'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
271
-            )
272
-        );
273
-        /** site locale (user locale if user logged in) */
274
-        $this->registry->addData(
275
-            'locale',
276
-            array(
277
-                'user' => get_user_locale(),
278
-                'site' => get_locale()
279
-            )
280
-        );
281
-
282
-        $this->addJavascript(
283
-            CoreAssetManager::JS_HANDLE_EE_CORE,
284
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
285
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
286
-        )
287
-        ->setInlineDataCallback(
288
-            function () {
289
-                wp_localize_script(
290
-                    CoreAssetManager::JS_HANDLE_EE_CORE,
291
-                    CoreAssetManager::JS_HANDLE_EE_I18N,
292
-                    EE_Registry::$i18n_js_strings
293
-                );
294
-            }
295
-        );
296
-    }
297
-
298
-
299
-    /**
300
-     * Returns configuration data for the accounting-js library.
301
-     * @since $VID:$
302
-     * @return array
303
-     */
304
-    private function getAccountingSettings() {
305
-        return array(
306
-            'currency' => array(
307
-                'symbol'    => $this->currency_config->sign,
308
-                'format'    => array(
309
-                    'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
310
-                    'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
311
-                    'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
312
-                ),
313
-                'decimal'   => $this->currency_config->dec_mrk,
314
-                'thousand'  => $this->currency_config->thsnds,
315
-                'precision' => $this->currency_config->dec_plc,
316
-            ),
317
-            'number'   => array(
318
-                'precision' => $this->currency_config->dec_plc,
319
-                'thousand'  => $this->currency_config->thsnds,
320
-                'decimal'   => $this->currency_config->dec_mrk,
321
-            ),
322
-        );
323
-    }
324
-
325
-
326
-    /**
327
-     * Returns configuration data for the js Currency VO.
328
-     * @sinc $VID:$
329
-     * @return array
330
-     */
331
-    private function getCurrencySettings()
332
-    {
333
-        return array(
334
-            'code' => $this->currency_config->code,
335
-            'singularLabel' => $this->currency_config->name,
336
-            'pluralLabel' => $this->currency_config->plural,
337
-            'sign' => $this->currency_config->sign,
338
-            'signB4' => $this->currency_config->sign_b4,
339
-            'decimalPlaces' => $this->currency_config->dec_plc,
340
-            'decimalMark' => $this->currency_config->dec_mrk,
341
-            'thousandsSeparator' => $this->currency_config->thsnds,
342
-        );
343
-    }
344
-
345
-
346
-    /**
347
-     * @since 4.9.62.p
348
-     * @throws DuplicateCollectionIdentifierException
349
-     * @throws InvalidDataTypeException
350
-     * @throws InvalidEntityException
351
-     */
352
-    private function loadCoreCss()
353
-    {
354
-        if ($this->template_config->enable_default_style && ! is_admin()) {
355
-            $this->addStylesheet(
356
-                CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
357
-                is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
358
-                    ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
359
-                    : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
360
-                array('dashicons')
361
-            );
362
-            //Load custom style sheet if available
363
-            if ($this->template_config->custom_style_sheet !== null) {
364
-                $this->addStylesheet(
365
-                    CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
366
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
367
-                    array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
368
-                );
369
-            }
370
-        }
371
-        $this->addStylesheet(
372
-            CoreAssetManager::CSS_HANDLE_EE_COMPONENTS,
373
-            $this->registry->getCssUrl(
374
-                $this->domain->assetNamespace(),
375
-                'components'
376
-            )
377
-        );
378
-    }
379
-
380
-
381
-    /**
382
-     * jQuery Validate for form validation
383
-     *
384
-     * @since 4.9.62.p
385
-     * @throws DuplicateCollectionIdentifierException
386
-     * @throws InvalidDataTypeException
387
-     * @throws InvalidEntityException
388
-     */
389
-    private function loadJqueryValidate()
390
-    {
391
-        $this->addJavascript(
392
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
393
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
394
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
395
-        )
396
-        ->setVersion('1.15.0');
397
-
398
-        $this->addJavascript(
399
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
400
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
401
-            array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
402
-        )
403
-        ->setVersion('1.15.0');
404
-    }
405
-
406
-
407
-    /**
408
-     * accounting.js for performing client-side calculations
409
-     *
410
-     * @since 4.9.62.p
411
-     * @throws DuplicateCollectionIdentifierException
412
-     * @throws InvalidDataTypeException
413
-     * @throws InvalidEntityException
414
-     */
415
-    private function loadAccountingJs()
416
-    {
417
-        //accounting.js library
418
-        // @link http://josscrowcroft.github.io/accounting.js/
419
-        $this->addJavascript(
420
-            CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
421
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
422
-            array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
423
-        )
424
-        ->setVersion('0.3.2');
425
-
426
-        $this->addJavascript(
427
-            CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
428
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
429
-            array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
430
-        )
431
-        ->setInlineDataCallback(
432
-            function () {
433
-                 wp_localize_script(
434
-                     CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
435
-                     'EE_ACCOUNTING_CFG',
436
-                     $this->getAccountingSettings()
437
-                 );
438
-            }
439
-        )
440
-        ->setVersion();
441
-    }
442
-
443
-
444
-    /**
445
-     * registers assets for cleaning your ears
446
-     *
447
-     * @param JavascriptAsset $script
448
-     */
449
-    public function loadQtipJs(JavascriptAsset $script)
450
-    {
451
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
452
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
453
-        if (
454
-            $script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
455
-            && apply_filters('FHEE_load_qtip', false)
456
-        ) {
457
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
458
-        }
459
-    }
460
-
461
-
462
-    /**
463
-     * assets that are used in the WordPress admin
464
-     *
465
-     * @since 4.9.62.p
466
-     * @throws DuplicateCollectionIdentifierException
467
-     * @throws InvalidDataTypeException
468
-     * @throws InvalidEntityException
469
-     */
470
-    private function registerAdminAssets()
471
-    {
472
-        $this->addJavascript(
473
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
474
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
475
-            array(
476
-                CoreAssetManager::JS_HANDLE_JQUERY,
477
-                CoreAssetManager::JS_HANDLE_EE_VENDOR,
478
-            )
479
-        )
480
-        ->setRequiresTranslation();
481
-
482
-        $this->addStylesheet(
483
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
484
-            $this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
485
-        );
486
-    }
66
+	const JS_HANDLE_EE_I18N = 'eei18n';
67
+
68
+	const JS_HANDLE_EE_ACCOUNTING = 'ee-accounting';
69
+
70
+	const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
71
+
72
+	// EE CSS assets handles
73
+	const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
74
+
75
+	const CSS_HANDLE_EE_CUSTOM = 'espresso_custom_css';
76
+
77
+	const CSS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
78
+
79
+	/**
80
+	 * @var EE_Currency_Config $currency_config
81
+	 */
82
+	protected $currency_config;
83
+
84
+	/**
85
+	 * @var EE_Template_Config $template_config
86
+	 */
87
+	protected $template_config;
88
+
89
+
90
+	/**
91
+	 * CoreAssetRegister constructor.
92
+	 *
93
+	 * @param AssetCollection    $assets
94
+	 * @param EE_Currency_Config $currency_config
95
+	 * @param EE_Template_Config $template_config
96
+	 * @param DomainInterface    $domain
97
+	 * @param Registry           $registry
98
+	 */
99
+	public function __construct(
100
+		AssetCollection $assets,
101
+		EE_Currency_Config $currency_config,
102
+		EE_Template_Config $template_config,
103
+		DomainInterface $domain,
104
+		Registry $registry
105
+	) {
106
+		$this->currency_config = $currency_config;
107
+		$this->template_config = $template_config;
108
+		parent::__construct($domain, $assets, $registry);
109
+	}
110
+
111
+
112
+	/**
113
+	 * @since 4.9.62.p
114
+	 * @throws DuplicateCollectionIdentifierException
115
+	 * @throws InvalidArgumentException
116
+	 * @throws InvalidDataTypeException
117
+	 * @throws InvalidEntityException
118
+	 */
119
+	public function addAssets()
120
+	{
121
+		$this->addJavascriptFiles();
122
+		$this->addStylesheetFiles();
123
+	}
124
+
125
+
126
+	/**
127
+	 * @since 4.9.62.p
128
+	 * @throws DuplicateCollectionIdentifierException
129
+	 * @throws InvalidArgumentException
130
+	 * @throws InvalidDataTypeException
131
+	 * @throws InvalidEntityException
132
+	 */
133
+	public function addJavascriptFiles()
134
+	{
135
+		$this->loadCoreJs();
136
+		$this->loadJqueryValidate();
137
+		$this->loadAccountingJs();
138
+		add_action(
139
+			'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
140
+			array($this, 'loadQtipJs')
141
+		);
142
+		$this->registerAdminAssets();
143
+	}
144
+
145
+
146
+	/**
147
+	 * @since 4.9.62.p
148
+	 * @throws DuplicateCollectionIdentifierException
149
+	 * @throws InvalidDataTypeException
150
+	 * @throws InvalidEntityException
151
+	 */
152
+	public function addStylesheetFiles()
153
+	{
154
+		$this->loadCoreCss();
155
+	}
156
+
157
+
158
+	/**
159
+	 * core default javascript
160
+	 *
161
+	 * @since 4.9.62.p
162
+	 * @throws DuplicateCollectionIdentifierException
163
+	 * @throws InvalidArgumentException
164
+	 * @throws InvalidDataTypeException
165
+	 * @throws InvalidEntityException
166
+	 */
167
+	private function loadCoreJs()
168
+	{
169
+		$this->addJavascript(
170
+			CoreAssetManager::JS_HANDLE_EE_MANIFEST,
171
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
172
+		);
173
+
174
+		$this->addJavascript(
175
+			CoreAssetManager::JS_HANDLE_EE_JS_CORE,
176
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
177
+			array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
178
+		)
179
+		->setHasInlineData();
180
+
181
+		$this->addJavascript(
182
+			CoreAssetManager::JS_HANDLE_EE_VENDOR,
183
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
184
+			array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
185
+		);
186
+
187
+		$this->addJavascript(
188
+			CoreAssetManager::JS_HANDLE_EE_HELPERS,
189
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers')
190
+		)->setRequiresTranslation();
191
+
192
+		$this->addJavascript(
193
+			CoreAssetManager::JS_HANDLE_EE_MODEL,
194
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'model'),
195
+			array(
196
+				CoreAssetManager::JS_HANDLE_EE_HELPERS
197
+			)
198
+		)->setRequiresTranslation();
199
+
200
+		$this->addJavascript(
201
+			CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
202
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'valueObjects'),
203
+			array(
204
+				CoreAssetManager::JS_HANDLE_EE_MODEL
205
+			)
206
+		)->setRequiresTranslation();
207
+
208
+		$this->addJavascript(
209
+			CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
210
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
211
+			array(
212
+				CoreAssetManager::JS_HANDLE_EE_VENDOR,
213
+				'wp-data',
214
+				'wp-api-request',
215
+				CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS
216
+			)
217
+		)
218
+			 ->setRequiresTranslation();
219
+
220
+		$this->addJavascript(
221
+			CoreAssetManager::JS_HANDLE_EE_HOC_COMPONENTS,
222
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'hocComponents'),
223
+			array(
224
+				CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
225
+				CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
226
+				'wp-components',
227
+			)
228
+		)->setRequiresTranslation();
229
+
230
+		$this->addJavascript(
231
+			CoreAssetManager::JS_HANDLE_EE_COMPONENTS,
232
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
233
+			array(
234
+				CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
235
+				CoreAssetManager::JS_HANDLE_EE_VALUE_OBJECTS,
236
+				'wp-components',
237
+			)
238
+		)
239
+		->setRequiresTranslation();
240
+
241
+		$this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
242
+		$this->registry->addData(
243
+			'paths',
244
+			array(
245
+				'rest_route' => rest_url('ee/v4.8.36/'),
246
+				'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
247
+				'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
248
+				'site_url' => site_url('/'),
249
+				'admin_url' => admin_url('/'),
250
+			)
251
+		);
252
+		/** site formatting values **/
253
+		$this->registry->addData(
254
+			'site_formats',
255
+			array(
256
+				'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
257
+			)
258
+		);
259
+		/** currency data **/
260
+		$this->registry->addData(
261
+			'currency_config',
262
+			$this->getCurrencySettings()
263
+		);
264
+		/** site timezone */
265
+		$this->registry->addData(
266
+			'default_timezone',
267
+			array(
268
+				'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
269
+				'string' => get_option('timezone_string'),
270
+				'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
271
+			)
272
+		);
273
+		/** site locale (user locale if user logged in) */
274
+		$this->registry->addData(
275
+			'locale',
276
+			array(
277
+				'user' => get_user_locale(),
278
+				'site' => get_locale()
279
+			)
280
+		);
281
+
282
+		$this->addJavascript(
283
+			CoreAssetManager::JS_HANDLE_EE_CORE,
284
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
285
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
286
+		)
287
+		->setInlineDataCallback(
288
+			function () {
289
+				wp_localize_script(
290
+					CoreAssetManager::JS_HANDLE_EE_CORE,
291
+					CoreAssetManager::JS_HANDLE_EE_I18N,
292
+					EE_Registry::$i18n_js_strings
293
+				);
294
+			}
295
+		);
296
+	}
297
+
298
+
299
+	/**
300
+	 * Returns configuration data for the accounting-js library.
301
+	 * @since $VID:$
302
+	 * @return array
303
+	 */
304
+	private function getAccountingSettings() {
305
+		return array(
306
+			'currency' => array(
307
+				'symbol'    => $this->currency_config->sign,
308
+				'format'    => array(
309
+					'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
310
+					'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
311
+					'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
312
+				),
313
+				'decimal'   => $this->currency_config->dec_mrk,
314
+				'thousand'  => $this->currency_config->thsnds,
315
+				'precision' => $this->currency_config->dec_plc,
316
+			),
317
+			'number'   => array(
318
+				'precision' => $this->currency_config->dec_plc,
319
+				'thousand'  => $this->currency_config->thsnds,
320
+				'decimal'   => $this->currency_config->dec_mrk,
321
+			),
322
+		);
323
+	}
324
+
325
+
326
+	/**
327
+	 * Returns configuration data for the js Currency VO.
328
+	 * @sinc $VID:$
329
+	 * @return array
330
+	 */
331
+	private function getCurrencySettings()
332
+	{
333
+		return array(
334
+			'code' => $this->currency_config->code,
335
+			'singularLabel' => $this->currency_config->name,
336
+			'pluralLabel' => $this->currency_config->plural,
337
+			'sign' => $this->currency_config->sign,
338
+			'signB4' => $this->currency_config->sign_b4,
339
+			'decimalPlaces' => $this->currency_config->dec_plc,
340
+			'decimalMark' => $this->currency_config->dec_mrk,
341
+			'thousandsSeparator' => $this->currency_config->thsnds,
342
+		);
343
+	}
344
+
345
+
346
+	/**
347
+	 * @since 4.9.62.p
348
+	 * @throws DuplicateCollectionIdentifierException
349
+	 * @throws InvalidDataTypeException
350
+	 * @throws InvalidEntityException
351
+	 */
352
+	private function loadCoreCss()
353
+	{
354
+		if ($this->template_config->enable_default_style && ! is_admin()) {
355
+			$this->addStylesheet(
356
+				CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
357
+				is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
358
+					? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
359
+					: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
360
+				array('dashicons')
361
+			);
362
+			//Load custom style sheet if available
363
+			if ($this->template_config->custom_style_sheet !== null) {
364
+				$this->addStylesheet(
365
+					CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
366
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
367
+					array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
368
+				);
369
+			}
370
+		}
371
+		$this->addStylesheet(
372
+			CoreAssetManager::CSS_HANDLE_EE_COMPONENTS,
373
+			$this->registry->getCssUrl(
374
+				$this->domain->assetNamespace(),
375
+				'components'
376
+			)
377
+		);
378
+	}
379
+
380
+
381
+	/**
382
+	 * jQuery Validate for form validation
383
+	 *
384
+	 * @since 4.9.62.p
385
+	 * @throws DuplicateCollectionIdentifierException
386
+	 * @throws InvalidDataTypeException
387
+	 * @throws InvalidEntityException
388
+	 */
389
+	private function loadJqueryValidate()
390
+	{
391
+		$this->addJavascript(
392
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
393
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
394
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
395
+		)
396
+		->setVersion('1.15.0');
397
+
398
+		$this->addJavascript(
399
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
400
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
401
+			array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
402
+		)
403
+		->setVersion('1.15.0');
404
+	}
405
+
406
+
407
+	/**
408
+	 * accounting.js for performing client-side calculations
409
+	 *
410
+	 * @since 4.9.62.p
411
+	 * @throws DuplicateCollectionIdentifierException
412
+	 * @throws InvalidDataTypeException
413
+	 * @throws InvalidEntityException
414
+	 */
415
+	private function loadAccountingJs()
416
+	{
417
+		//accounting.js library
418
+		// @link http://josscrowcroft.github.io/accounting.js/
419
+		$this->addJavascript(
420
+			CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
421
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
422
+			array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
423
+		)
424
+		->setVersion('0.3.2');
425
+
426
+		$this->addJavascript(
427
+			CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
428
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
429
+			array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
430
+		)
431
+		->setInlineDataCallback(
432
+			function () {
433
+				 wp_localize_script(
434
+					 CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
435
+					 'EE_ACCOUNTING_CFG',
436
+					 $this->getAccountingSettings()
437
+				 );
438
+			}
439
+		)
440
+		->setVersion();
441
+	}
442
+
443
+
444
+	/**
445
+	 * registers assets for cleaning your ears
446
+	 *
447
+	 * @param JavascriptAsset $script
448
+	 */
449
+	public function loadQtipJs(JavascriptAsset $script)
450
+	{
451
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
452
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
453
+		if (
454
+			$script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
455
+			&& apply_filters('FHEE_load_qtip', false)
456
+		) {
457
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
458
+		}
459
+	}
460
+
461
+
462
+	/**
463
+	 * assets that are used in the WordPress admin
464
+	 *
465
+	 * @since 4.9.62.p
466
+	 * @throws DuplicateCollectionIdentifierException
467
+	 * @throws InvalidDataTypeException
468
+	 * @throws InvalidEntityException
469
+	 */
470
+	private function registerAdminAssets()
471
+	{
472
+		$this->addJavascript(
473
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
474
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
475
+			array(
476
+				CoreAssetManager::JS_HANDLE_JQUERY,
477
+				CoreAssetManager::JS_HANDLE_EE_VENDOR,
478
+			)
479
+		)
480
+		->setRequiresTranslation();
481
+
482
+		$this->addStylesheet(
483
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
484
+			$this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
485
+		);
486
+	}
487 487
 }
Please login to merge, or discard this patch.
domain/entities/route_match/specifications/frontend/AnyFrontendRequest.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -14,8 +14,8 @@
 block discarded – undo
14 14
  */
15 15
 class AnyFrontendRequest extends RouteMatchSpecification
16 16
 {
17
-    public function isMatchingRoute()
18
-    {
19
-        return $this->request->isFrontend();
20
-    }
17
+	public function isMatchingRoute()
18
+	{
19
+		return $this->request->isFrontend();
20
+	}
21 21
 }
Please login to merge, or discard this patch.
core/domain/entities/editor/blocks/EventAttendees.php 2 patches
Indentation   +222 added lines, -222 removed lines patch added patch discarded remove patch
@@ -24,226 +24,226 @@
 block discarded – undo
24 24
 class EventAttendees extends Block
25 25
 {
26 26
 
27
-    const BLOCK_TYPE = 'event-attendees';
28
-
29
-    /**
30
-     * @var EspressoEventAttendees $shortcode
31
-     */
32
-    protected $shortcode;
33
-
34
-
35
-    /**
36
-     * EventAttendees constructor.
37
-     *
38
-     * @param CoreBlocksAssetManager $block_asset_manager
39
-     * @param RequestInterface       $request
40
-     * @param EspressoEventAttendees $shortcode
41
-     */
42
-    public function __construct(
43
-        CoreBlocksAssetManager $block_asset_manager,
44
-        RequestInterface $request,
45
-        EspressoEventAttendees $shortcode
46
-    ) {
47
-        parent::__construct($block_asset_manager, $request);
48
-        $this->shortcode = $shortcode;
49
-    }
50
-
51
-
52
-    /**
53
-     * Perform any early setup required by the block
54
-     * including setting the block type and supported post types
55
-     *
56
-     * @return void
57
-     */
58
-    public function initialize()
59
-    {
60
-        $this->setBlockType(self::BLOCK_TYPE);
61
-        $this->setSupportedRoutes(
62
-            array(
63
-                'EventEspresso\core\domain\entities\route_match\specifications\admin\EspressoStandardPostTypeEditor',
64
-                'EventEspresso\core\domain\entities\route_match\specifications\admin\WordPressPostTypeEditor',
65
-                'EventEspresso\core\domain\entities\route_match\specifications\frontend\EspressoBlockRenderer',
66
-                'EventEspresso\core\domain\entities\route_match\specifications\frontend\AnyFrontendRequest'
67
-            )
68
-        );
69
-        $EVT_ID = $this->request->getRequestParam('page') === 'espresso_events'
70
-            ? $this->request->getRequestParam('post', 0)
71
-            : 0;
72
-        $this->setAttributes(
73
-            array(
74
-                'eventId'           => array(
75
-                    'type'    => 'number',
76
-                    'default' => $EVT_ID,
77
-                ),
78
-                'datetimeId'        => array(
79
-                    'type'    => 'number',
80
-                    'default' => 0,
81
-                ),
82
-                'ticketId'          => array(
83
-                    'type'    => 'number',
84
-                    'default' => 0,
85
-                ),
86
-                'status'            => array(
87
-                    'type'    => 'string',
88
-                    'default' => EEM_Registration::status_id_approved,
89
-                ),
90
-                'limit'             => array(
91
-                    'type'    => 'number',
92
-                    'default' => 10,
93
-                ),
94
-                'showGravatar'      => array(
95
-                    'type'    => 'boolean',
96
-                    'default' => false,
97
-                ),
98
-                'displayOnArchives' => array(
99
-                    'type'    => 'boolean',
100
-                    'default' => false,
101
-                ),
102
-            )
103
-        );
104
-        $this->setDynamic();
105
-    }
106
-
107
-
108
-    /**
109
-     * returns an array where the key corresponds to the incoming attribute name from the WP block
110
-     * and the value corresponds to the attribute name for the existing EspressoEventAttendees shortcode
111
-     *
112
-     * @since $VID:$
113
-     * @return array
114
-     */
115
-    private function getAttributesMap()
116
-    {
117
-        return array(
118
-            'eventId'           => array('attribute' => 'event_id', 'sanitize' => 'absint'),
119
-            'datetimeId'        => array('attribute' => 'datetime_id', 'sanitize' => 'absint'),
120
-            'ticketId'          => array('attribute' => 'ticket_id', 'sanitize' => 'absint'),
121
-            'status'            => array('attribute' => 'status', 'sanitize' => 'sanitize_text_field'),
122
-            'limit'             => array('attribute' => 'limit', 'sanitize' => 'intval'),
123
-            'showGravatar'      => array('attribute' => 'show_gravatar', 'sanitize' => 'bool'),
124
-            'displayOnArchives' => array('attribute' => 'display_on_archives', 'sanitize' => 'bool'),
125
-        );
126
-    }
127
-
128
-
129
-    /**
130
-     * @param array $attributes
131
-     * @since $VID:$
132
-     * @return array
133
-     */
134
-    private function parseAttributes(array $attributes)
135
-    {
136
-        foreach ($attributes as $attribute => $value) {
137
-            $convert = $this->getAttributesMap();
138
-            if (isset($convert[ $attribute ])) {
139
-                $sanitize = $convert[ $attribute ]['sanitize'];
140
-                $converted_attribute_key = $convert[ $attribute ]['attribute'];
141
-                if ($sanitize === 'bool') {
142
-                    $attributes[ $converted_attribute_key ] = filter_var(
143
-                        $value,
144
-                        FILTER_VALIDATE_BOOLEAN
145
-                    );
146
-                } else {
147
-                    $attributes[ $converted_attribute_key ] = $sanitize($value);
148
-                }
149
-                if ($attribute !== $converted_attribute_key) {
150
-                    unset($attributes[ $attribute ]);
151
-                }
152
-                // don't pass along attributes with a 0 value
153
-                if ($attributes[ $converted_attribute_key ] === 0) {
154
-                    unset($attributes[ $converted_attribute_key ]);
155
-                }
156
-            }
157
-        }
158
-        return $attributes;
159
-    }
160
-
161
-
162
-    /**
163
-     * This ensures we're only sending along the needed attribute for grabbing attendees.
164
-     * In order:
165
-     *
166
-     * - if ticket_id is present then datetime or event id are unneeded.
167
-     * - if datetime_id is present than event_id is not needed.
168
-     *
169
-     * @param array $attributes
170
-     * @return array
171
-     */
172
-    private function includeNecessaryOnly(array $attributes)
173
-    {
174
-        if ($attributes['ticket_id'] > 0) {
175
-            unset($attributes['event_id'], $attributes['datetime_id']);
176
-        }
177
-        if ($attributes['datetime_id'] > 0) {
178
-            unset($attributes['event_id']);
179
-        }
180
-        return $attributes;
181
-    }
182
-
183
-
184
-    /**
185
-     * Returns true when there are no id values in the attributes.
186
-     *
187
-     * @param array $attributes
188
-     * @return bool
189
-     */
190
-    private function hasNoIds(array $attributes)
191
-    {
192
-        return empty($attributes['event_id']) && empty($attributes['datetime_id']) && empty($attributes['ticket_id']);
193
-    }
194
-
195
-    /**
196
-     * Returns the rendered HTML for the block
197
-     *
198
-     * @param array $attributes
199
-     * @return string
200
-     * @throws EE_Error
201
-     * @throws InvalidDataTypeException
202
-     * @throws InvalidInterfaceException
203
-     * @throws InvalidArgumentException
204
-     * @throws DomainException
205
-     */
206
-    public function renderBlock(array $attributes = array())
207
-    {
208
-        $attributes = $this->includeNecessaryOnly($this->parseAttributes($attributes));
209
-        $rendered_content = $this->shortcode->processShortcode($attributes);
210
-        if (empty($rendered_content)) {
211
-            return $this->noContentRender($attributes);
212
-        }
213
-        if ($this->hasNoIds($attributes) && $this->request->isWordPressApi()) {
214
-            $rendered_content = '<p class="components-notice is-success">' . esc_html__(
215
-                'The content displayed is for the most recent active or upcoming event.  You can display attendees from a different event, ticket or datetime via the block settings.',
216
-                'event_espresso'
217
-            ) . '</p>' . $rendered_content;
218
-        }
219
-        return $rendered_content;
220
-    }
221
-
222
-
223
-    /**
224
-     * Returns rendered content for block when there is no content for rendering due to various conditions.
225
-     * This content ONLY appears in the editor context.
226
-     *
227
-     * @param array $attributes
228
-     * @return string
229
-     */
230
-    private function noContentRender(array $attributes)
231
-    {
232
-        $content = '';
233
-        if ($this->request->isWordPressApi()) {
234
-            if (empty($attributes['event_id'])) {
235
-                $content .= esc_html__(
236
-                    'There are no active or selected events to pull attendees from at this moment. This message only appears in the editor.',
237
-                    'event_espresso'
238
-                );
239
-            } else {
240
-                $content .= esc_html__(
241
-                    'There was a problem displaying the content for the selected options. This message only appears in the editor.',
242
-                    'event_espresso'
243
-                );
244
-            }
245
-            $content = $content !== '' ? '<p class="components-notice is-error">' . $content . '</p>' : $content;
246
-        }
247
-        return $content;
248
-    }
27
+	const BLOCK_TYPE = 'event-attendees';
28
+
29
+	/**
30
+	 * @var EspressoEventAttendees $shortcode
31
+	 */
32
+	protected $shortcode;
33
+
34
+
35
+	/**
36
+	 * EventAttendees constructor.
37
+	 *
38
+	 * @param CoreBlocksAssetManager $block_asset_manager
39
+	 * @param RequestInterface       $request
40
+	 * @param EspressoEventAttendees $shortcode
41
+	 */
42
+	public function __construct(
43
+		CoreBlocksAssetManager $block_asset_manager,
44
+		RequestInterface $request,
45
+		EspressoEventAttendees $shortcode
46
+	) {
47
+		parent::__construct($block_asset_manager, $request);
48
+		$this->shortcode = $shortcode;
49
+	}
50
+
51
+
52
+	/**
53
+	 * Perform any early setup required by the block
54
+	 * including setting the block type and supported post types
55
+	 *
56
+	 * @return void
57
+	 */
58
+	public function initialize()
59
+	{
60
+		$this->setBlockType(self::BLOCK_TYPE);
61
+		$this->setSupportedRoutes(
62
+			array(
63
+				'EventEspresso\core\domain\entities\route_match\specifications\admin\EspressoStandardPostTypeEditor',
64
+				'EventEspresso\core\domain\entities\route_match\specifications\admin\WordPressPostTypeEditor',
65
+				'EventEspresso\core\domain\entities\route_match\specifications\frontend\EspressoBlockRenderer',
66
+				'EventEspresso\core\domain\entities\route_match\specifications\frontend\AnyFrontendRequest'
67
+			)
68
+		);
69
+		$EVT_ID = $this->request->getRequestParam('page') === 'espresso_events'
70
+			? $this->request->getRequestParam('post', 0)
71
+			: 0;
72
+		$this->setAttributes(
73
+			array(
74
+				'eventId'           => array(
75
+					'type'    => 'number',
76
+					'default' => $EVT_ID,
77
+				),
78
+				'datetimeId'        => array(
79
+					'type'    => 'number',
80
+					'default' => 0,
81
+				),
82
+				'ticketId'          => array(
83
+					'type'    => 'number',
84
+					'default' => 0,
85
+				),
86
+				'status'            => array(
87
+					'type'    => 'string',
88
+					'default' => EEM_Registration::status_id_approved,
89
+				),
90
+				'limit'             => array(
91
+					'type'    => 'number',
92
+					'default' => 10,
93
+				),
94
+				'showGravatar'      => array(
95
+					'type'    => 'boolean',
96
+					'default' => false,
97
+				),
98
+				'displayOnArchives' => array(
99
+					'type'    => 'boolean',
100
+					'default' => false,
101
+				),
102
+			)
103
+		);
104
+		$this->setDynamic();
105
+	}
106
+
107
+
108
+	/**
109
+	 * returns an array where the key corresponds to the incoming attribute name from the WP block
110
+	 * and the value corresponds to the attribute name for the existing EspressoEventAttendees shortcode
111
+	 *
112
+	 * @since $VID:$
113
+	 * @return array
114
+	 */
115
+	private function getAttributesMap()
116
+	{
117
+		return array(
118
+			'eventId'           => array('attribute' => 'event_id', 'sanitize' => 'absint'),
119
+			'datetimeId'        => array('attribute' => 'datetime_id', 'sanitize' => 'absint'),
120
+			'ticketId'          => array('attribute' => 'ticket_id', 'sanitize' => 'absint'),
121
+			'status'            => array('attribute' => 'status', 'sanitize' => 'sanitize_text_field'),
122
+			'limit'             => array('attribute' => 'limit', 'sanitize' => 'intval'),
123
+			'showGravatar'      => array('attribute' => 'show_gravatar', 'sanitize' => 'bool'),
124
+			'displayOnArchives' => array('attribute' => 'display_on_archives', 'sanitize' => 'bool'),
125
+		);
126
+	}
127
+
128
+
129
+	/**
130
+	 * @param array $attributes
131
+	 * @since $VID:$
132
+	 * @return array
133
+	 */
134
+	private function parseAttributes(array $attributes)
135
+	{
136
+		foreach ($attributes as $attribute => $value) {
137
+			$convert = $this->getAttributesMap();
138
+			if (isset($convert[ $attribute ])) {
139
+				$sanitize = $convert[ $attribute ]['sanitize'];
140
+				$converted_attribute_key = $convert[ $attribute ]['attribute'];
141
+				if ($sanitize === 'bool') {
142
+					$attributes[ $converted_attribute_key ] = filter_var(
143
+						$value,
144
+						FILTER_VALIDATE_BOOLEAN
145
+					);
146
+				} else {
147
+					$attributes[ $converted_attribute_key ] = $sanitize($value);
148
+				}
149
+				if ($attribute !== $converted_attribute_key) {
150
+					unset($attributes[ $attribute ]);
151
+				}
152
+				// don't pass along attributes with a 0 value
153
+				if ($attributes[ $converted_attribute_key ] === 0) {
154
+					unset($attributes[ $converted_attribute_key ]);
155
+				}
156
+			}
157
+		}
158
+		return $attributes;
159
+	}
160
+
161
+
162
+	/**
163
+	 * This ensures we're only sending along the needed attribute for grabbing attendees.
164
+	 * In order:
165
+	 *
166
+	 * - if ticket_id is present then datetime or event id are unneeded.
167
+	 * - if datetime_id is present than event_id is not needed.
168
+	 *
169
+	 * @param array $attributes
170
+	 * @return array
171
+	 */
172
+	private function includeNecessaryOnly(array $attributes)
173
+	{
174
+		if ($attributes['ticket_id'] > 0) {
175
+			unset($attributes['event_id'], $attributes['datetime_id']);
176
+		}
177
+		if ($attributes['datetime_id'] > 0) {
178
+			unset($attributes['event_id']);
179
+		}
180
+		return $attributes;
181
+	}
182
+
183
+
184
+	/**
185
+	 * Returns true when there are no id values in the attributes.
186
+	 *
187
+	 * @param array $attributes
188
+	 * @return bool
189
+	 */
190
+	private function hasNoIds(array $attributes)
191
+	{
192
+		return empty($attributes['event_id']) && empty($attributes['datetime_id']) && empty($attributes['ticket_id']);
193
+	}
194
+
195
+	/**
196
+	 * Returns the rendered HTML for the block
197
+	 *
198
+	 * @param array $attributes
199
+	 * @return string
200
+	 * @throws EE_Error
201
+	 * @throws InvalidDataTypeException
202
+	 * @throws InvalidInterfaceException
203
+	 * @throws InvalidArgumentException
204
+	 * @throws DomainException
205
+	 */
206
+	public function renderBlock(array $attributes = array())
207
+	{
208
+		$attributes = $this->includeNecessaryOnly($this->parseAttributes($attributes));
209
+		$rendered_content = $this->shortcode->processShortcode($attributes);
210
+		if (empty($rendered_content)) {
211
+			return $this->noContentRender($attributes);
212
+		}
213
+		if ($this->hasNoIds($attributes) && $this->request->isWordPressApi()) {
214
+			$rendered_content = '<p class="components-notice is-success">' . esc_html__(
215
+				'The content displayed is for the most recent active or upcoming event.  You can display attendees from a different event, ticket or datetime via the block settings.',
216
+				'event_espresso'
217
+			) . '</p>' . $rendered_content;
218
+		}
219
+		return $rendered_content;
220
+	}
221
+
222
+
223
+	/**
224
+	 * Returns rendered content for block when there is no content for rendering due to various conditions.
225
+	 * This content ONLY appears in the editor context.
226
+	 *
227
+	 * @param array $attributes
228
+	 * @return string
229
+	 */
230
+	private function noContentRender(array $attributes)
231
+	{
232
+		$content = '';
233
+		if ($this->request->isWordPressApi()) {
234
+			if (empty($attributes['event_id'])) {
235
+				$content .= esc_html__(
236
+					'There are no active or selected events to pull attendees from at this moment. This message only appears in the editor.',
237
+					'event_espresso'
238
+				);
239
+			} else {
240
+				$content .= esc_html__(
241
+					'There was a problem displaying the content for the selected options. This message only appears in the editor.',
242
+					'event_espresso'
243
+				);
244
+			}
245
+			$content = $content !== '' ? '<p class="components-notice is-error">' . $content . '</p>' : $content;
246
+		}
247
+		return $content;
248
+	}
249 249
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -135,23 +135,23 @@  discard block
 block discarded – undo
135 135
     {
136 136
         foreach ($attributes as $attribute => $value) {
137 137
             $convert = $this->getAttributesMap();
138
-            if (isset($convert[ $attribute ])) {
139
-                $sanitize = $convert[ $attribute ]['sanitize'];
140
-                $converted_attribute_key = $convert[ $attribute ]['attribute'];
138
+            if (isset($convert[$attribute])) {
139
+                $sanitize = $convert[$attribute]['sanitize'];
140
+                $converted_attribute_key = $convert[$attribute]['attribute'];
141 141
                 if ($sanitize === 'bool') {
142
-                    $attributes[ $converted_attribute_key ] = filter_var(
142
+                    $attributes[$converted_attribute_key] = filter_var(
143 143
                         $value,
144 144
                         FILTER_VALIDATE_BOOLEAN
145 145
                     );
146 146
                 } else {
147
-                    $attributes[ $converted_attribute_key ] = $sanitize($value);
147
+                    $attributes[$converted_attribute_key] = $sanitize($value);
148 148
                 }
149 149
                 if ($attribute !== $converted_attribute_key) {
150
-                    unset($attributes[ $attribute ]);
150
+                    unset($attributes[$attribute]);
151 151
                 }
152 152
                 // don't pass along attributes with a 0 value
153
-                if ($attributes[ $converted_attribute_key ] === 0) {
154
-                    unset($attributes[ $converted_attribute_key ]);
153
+                if ($attributes[$converted_attribute_key] === 0) {
154
+                    unset($attributes[$converted_attribute_key]);
155 155
                 }
156 156
             }
157 157
         }
@@ -211,10 +211,10 @@  discard block
 block discarded – undo
211 211
             return $this->noContentRender($attributes);
212 212
         }
213 213
         if ($this->hasNoIds($attributes) && $this->request->isWordPressApi()) {
214
-            $rendered_content = '<p class="components-notice is-success">' . esc_html__(
214
+            $rendered_content = '<p class="components-notice is-success">'.esc_html__(
215 215
                 'The content displayed is for the most recent active or upcoming event.  You can display attendees from a different event, ticket or datetime via the block settings.',
216 216
                 'event_espresso'
217
-            ) . '</p>' . $rendered_content;
217
+            ).'</p>'.$rendered_content;
218 218
         }
219 219
         return $rendered_content;
220 220
     }
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
                     'event_espresso'
243 243
                 );
244 244
             }
245
-            $content = $content !== '' ? '<p class="components-notice is-error">' . $content . '</p>' : $content;
245
+            $content = $content !== '' ? '<p class="components-notice is-error">'.$content.'</p>' : $content;
246 246
         }
247 247
         return $content;
248 248
     }
Please login to merge, or discard this patch.
core/EE_System.core.php 1 patch
Indentation   +1292 added lines, -1292 removed lines patch added patch discarded remove patch
@@ -27,1296 +27,1296 @@
 block discarded – undo
27 27
 final class EE_System implements ResettableInterface
28 28
 {
29 29
 
30
-    /**
31
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
-     */
34
-    const req_type_normal = 0;
35
-
36
-    /**
37
-     * Indicates this is a brand new installation of EE so we should install
38
-     * tables and default data etc
39
-     */
40
-    const req_type_new_activation = 1;
41
-
42
-    /**
43
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
-     * and we just exited maintenance mode). We MUST check the database is setup properly
45
-     * and that default data is setup too
46
-     */
47
-    const req_type_reactivation = 2;
48
-
49
-    /**
50
-     * indicates that EE has been upgraded since its previous request.
51
-     * We may have data migration scripts to call and will want to trigger maintenance mode
52
-     */
53
-    const req_type_upgrade = 3;
54
-
55
-    /**
56
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
-     */
58
-    const req_type_downgrade = 4;
59
-
60
-    /**
61
-     * @deprecated since version 4.6.0.dev.006
62
-     * Now whenever a new_activation is detected the request type is still just
63
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
-     * (Specifically, when the migration manager indicates migrations are finished
67
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
-     */
69
-    const req_type_activation_but_not_installed = 5;
70
-
71
-    /**
72
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
-     */
74
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
-
76
-    /**
77
-     * @var EE_System $_instance
78
-     */
79
-    private static $_instance;
80
-
81
-    /**
82
-     * @var EE_Registry $registry
83
-     */
84
-    private $registry;
85
-
86
-    /**
87
-     * @var LoaderInterface $loader
88
-     */
89
-    private $loader;
90
-
91
-    /**
92
-     * @var EE_Capabilities $capabilities
93
-     */
94
-    private $capabilities;
95
-
96
-    /**
97
-     * @var RequestInterface $request
98
-     */
99
-    private $request;
100
-
101
-    /**
102
-     * @var EE_Maintenance_Mode $maintenance_mode
103
-     */
104
-    private $maintenance_mode;
105
-
106
-    /**
107
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
-     *
110
-     * @var int $_req_type
111
-     */
112
-    private $_req_type;
113
-
114
-    /**
115
-     * Whether or not there was a non-micro version change in EE core version during this request
116
-     *
117
-     * @var boolean $_major_version_change
118
-     */
119
-    private $_major_version_change = false;
120
-
121
-    /**
122
-     * A Context DTO dedicated solely to identifying the current request type.
123
-     *
124
-     * @var RequestTypeContextCheckerInterface $request_type
125
-     */
126
-    private $request_type;
127
-
128
-
129
-    /**
130
-     * @singleton method used to instantiate class object
131
-     * @param EE_Registry|null         $registry
132
-     * @param LoaderInterface|null     $loader
133
-     * @param RequestInterface|null    $request
134
-     * @param EE_Maintenance_Mode|null $maintenance_mode
135
-     * @return EE_System
136
-     */
137
-    public static function instance(
138
-        EE_Registry $registry = null,
139
-        LoaderInterface $loader = null,
140
-        RequestInterface $request = null,
141
-        EE_Maintenance_Mode $maintenance_mode = null
142
-    ) {
143
-        // check if class object is instantiated
144
-        if (! self::$_instance instanceof EE_System) {
145
-            self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
-        }
147
-        return self::$_instance;
148
-    }
149
-
150
-
151
-    /**
152
-     * resets the instance and returns it
153
-     *
154
-     * @return EE_System
155
-     */
156
-    public static function reset()
157
-    {
158
-        self::$_instance->_req_type = null;
159
-        // make sure none of the old hooks are left hanging around
160
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
-        // we need to reset the migration manager in order for it to detect DMSs properly
162
-        EE_Data_Migration_Manager::reset();
163
-        self::instance()->detect_activations_or_upgrades();
164
-        self::instance()->perform_activations_upgrades_and_migrations();
165
-        return self::instance();
166
-    }
167
-
168
-
169
-    /**
170
-     * sets hooks for running rest of system
171
-     * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
-     * starting EE Addons from any other point may lead to problems
173
-     *
174
-     * @param EE_Registry         $registry
175
-     * @param LoaderInterface     $loader
176
-     * @param RequestInterface    $request
177
-     * @param EE_Maintenance_Mode $maintenance_mode
178
-     */
179
-    private function __construct(
180
-        EE_Registry $registry,
181
-        LoaderInterface $loader,
182
-        RequestInterface $request,
183
-        EE_Maintenance_Mode $maintenance_mode
184
-    ) {
185
-        $this->registry = $registry;
186
-        $this->loader = $loader;
187
-        $this->request = $request;
188
-        $this->maintenance_mode = $maintenance_mode;
189
-        do_action('AHEE__EE_System__construct__begin', $this);
190
-        add_action(
191
-            'AHEE__EE_Bootstrap__load_espresso_addons',
192
-            array($this, 'loadCapabilities'),
193
-            5
194
-        );
195
-        add_action(
196
-            'AHEE__EE_Bootstrap__load_espresso_addons',
197
-            array($this, 'loadCommandBus'),
198
-            7
199
-        );
200
-        add_action(
201
-            'AHEE__EE_Bootstrap__load_espresso_addons',
202
-            array($this, 'loadPluginApi'),
203
-            9
204
-        );
205
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
-        add_action(
207
-            'AHEE__EE_Bootstrap__load_espresso_addons',
208
-            array($this, 'load_espresso_addons')
209
-        );
210
-        // when an ee addon is activated, we want to call the core hook(s) again
211
-        // because the newly-activated addon didn't get a chance to run at all
212
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
-        // detect whether install or upgrade
214
-        add_action(
215
-            'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
-            array($this, 'detect_activations_or_upgrades'),
217
-            3
218
-        );
219
-        // load EE_Config, EE_Textdomain, etc
220
-        add_action(
221
-            'AHEE__EE_Bootstrap__load_core_configuration',
222
-            array($this, 'load_core_configuration'),
223
-            5
224
-        );
225
-        // load specifications for matching routes to current request
226
-        add_action(
227
-            'AHEE__EE_Bootstrap__load_core_configuration',
228
-            array($this, 'loadRouteMatchSpecifications')
229
-        );
230
-        // load EE_Config, EE_Textdomain, etc
231
-        add_action(
232
-            'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
233
-            array($this, 'register_shortcodes_modules_and_widgets'),
234
-            7
235
-        );
236
-        // you wanna get going? I wanna get going... let's get going!
237
-        add_action(
238
-            'AHEE__EE_Bootstrap__brew_espresso',
239
-            array($this, 'brew_espresso'),
240
-            9
241
-        );
242
-        // other housekeeping
243
-        // exclude EE critical pages from wp_list_pages
244
-        add_filter(
245
-            'wp_list_pages_excludes',
246
-            array($this, 'remove_pages_from_wp_list_pages'),
247
-            10
248
-        );
249
-        // ALL EE Addons should use the following hook point to attach their initial setup too
250
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
251
-        do_action('AHEE__EE_System__construct__complete', $this);
252
-    }
253
-
254
-
255
-    /**
256
-     * load and setup EE_Capabilities
257
-     *
258
-     * @return void
259
-     * @throws EE_Error
260
-     */
261
-    public function loadCapabilities()
262
-    {
263
-        $this->capabilities = $this->loader->getShared('EE_Capabilities');
264
-        add_action(
265
-            'AHEE__EE_Capabilities__init_caps__before_initialization',
266
-            function () {
267
-                LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
268
-            }
269
-        );
270
-    }
271
-
272
-
273
-    /**
274
-     * create and cache the CommandBus, and also add middleware
275
-     * The CapChecker middleware requires the use of EE_Capabilities
276
-     * which is why we need to load the CommandBus after Caps are set up
277
-     *
278
-     * @return void
279
-     * @throws EE_Error
280
-     */
281
-    public function loadCommandBus()
282
-    {
283
-        $this->loader->getShared(
284
-            'CommandBusInterface',
285
-            array(
286
-                null,
287
-                apply_filters(
288
-                    'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
289
-                    array(
290
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
291
-                        $this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
292
-                    )
293
-                ),
294
-            )
295
-        );
296
-    }
297
-
298
-
299
-    /**
300
-     * @return void
301
-     * @throws EE_Error
302
-     */
303
-    public function loadPluginApi()
304
-    {
305
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
306
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
307
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
308
-        $this->loader->getShared('EE_Request_Handler');
309
-    }
310
-
311
-
312
-    /**
313
-     * @param string $addon_name
314
-     * @param string $version_constant
315
-     * @param string $min_version_required
316
-     * @param string $load_callback
317
-     * @param string $plugin_file_constant
318
-     * @return void
319
-     */
320
-    private function deactivateIncompatibleAddon(
321
-        $addon_name,
322
-        $version_constant,
323
-        $min_version_required,
324
-        $load_callback,
325
-        $plugin_file_constant
326
-    ) {
327
-        if (! defined($version_constant)) {
328
-            return;
329
-        }
330
-        $addon_version = constant($version_constant);
331
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
332
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
333
-            if (! function_exists('deactivate_plugins')) {
334
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
335
-            }
336
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
337
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
338
-            EE_Error::add_error(
339
-                sprintf(
340
-                    esc_html__(
341
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
342
-                        'event_espresso'
343
-                    ),
344
-                    $addon_name,
345
-                    $min_version_required
346
-                ),
347
-                __FILE__,
348
-                __FUNCTION__ . "({$addon_name})",
349
-                __LINE__
350
-            );
351
-            EE_Error::get_notices(false, true);
352
-        }
353
-    }
354
-
355
-
356
-    /**
357
-     * load_espresso_addons
358
-     * allow addons to load first so that they can set hooks for running DMS's, etc
359
-     * this is hooked into both:
360
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
361
-     *        which runs during the WP 'plugins_loaded' action at priority 5
362
-     *    and the WP 'activate_plugin' hook point
363
-     *
364
-     * @access public
365
-     * @return void
366
-     */
367
-    public function load_espresso_addons()
368
-    {
369
-        $this->deactivateIncompatibleAddon(
370
-            'Wait Lists',
371
-            'EE_WAIT_LISTS_VERSION',
372
-            '1.0.0.beta.074',
373
-            'load_espresso_wait_lists',
374
-            'EE_WAIT_LISTS_PLUGIN_FILE'
375
-        );
376
-        $this->deactivateIncompatibleAddon(
377
-            'Automated Upcoming Event Notifications',
378
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
379
-            '1.0.0.beta.091',
380
-            'load_espresso_automated_upcoming_event_notification',
381
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
382
-        );
383
-        do_action('AHEE__EE_System__load_espresso_addons');
384
-        // if the WP API basic auth plugin isn't already loaded, load it now.
385
-        // We want it for mobile apps. Just include the entire plugin
386
-        // also, don't load the basic auth when a plugin is getting activated, because
387
-        // it could be the basic auth plugin, and it doesn't check if its methods are already defined
388
-        // and causes a fatal error
389
-        if ($this->request->getRequestParam('activate') !== 'true'
390
-            && ! function_exists('json_basic_auth_handler')
391
-            && ! function_exists('json_basic_auth_error')
392
-            && ! in_array(
393
-                $this->request->getRequestParam('action'),
394
-                array('activate', 'activate-selected'),
395
-                true
396
-            )
397
-        ) {
398
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
399
-        }
400
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
401
-    }
402
-
403
-
404
-    /**
405
-     * detect_activations_or_upgrades
406
-     * Checks for activation or upgrade of core first;
407
-     * then also checks if any registered addons have been activated or upgraded
408
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
409
-     * which runs during the WP 'plugins_loaded' action at priority 3
410
-     *
411
-     * @access public
412
-     * @return void
413
-     */
414
-    public function detect_activations_or_upgrades()
415
-    {
416
-        // first off: let's make sure to handle core
417
-        $this->detect_if_activation_or_upgrade();
418
-        foreach ($this->registry->addons as $addon) {
419
-            if ($addon instanceof EE_Addon) {
420
-                // detect teh request type for that addon
421
-                $addon->detect_activation_or_upgrade();
422
-            }
423
-        }
424
-    }
425
-
426
-
427
-    /**
428
-     * detect_if_activation_or_upgrade
429
-     * Takes care of detecting whether this is a brand new install or code upgrade,
430
-     * and either setting up the DB or setting up maintenance mode etc.
431
-     *
432
-     * @access public
433
-     * @return void
434
-     */
435
-    public function detect_if_activation_or_upgrade()
436
-    {
437
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
438
-        // check if db has been updated, or if its a brand-new installation
439
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
440
-        $request_type = $this->detect_req_type($espresso_db_update);
441
-        // EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
442
-        switch ($request_type) {
443
-            case EE_System::req_type_new_activation:
444
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
445
-                $this->_handle_core_version_change($espresso_db_update);
446
-                break;
447
-            case EE_System::req_type_reactivation:
448
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
449
-                $this->_handle_core_version_change($espresso_db_update);
450
-                break;
451
-            case EE_System::req_type_upgrade:
452
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
453
-                // migrations may be required now that we've upgraded
454
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
455
-                $this->_handle_core_version_change($espresso_db_update);
456
-                break;
457
-            case EE_System::req_type_downgrade:
458
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
459
-                // its possible migrations are no longer required
460
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
461
-                $this->_handle_core_version_change($espresso_db_update);
462
-                break;
463
-            case EE_System::req_type_normal:
464
-            default:
465
-                break;
466
-        }
467
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
468
-    }
469
-
470
-
471
-    /**
472
-     * Updates the list of installed versions and sets hooks for
473
-     * initializing the database later during the request
474
-     *
475
-     * @param array $espresso_db_update
476
-     */
477
-    private function _handle_core_version_change($espresso_db_update)
478
-    {
479
-        $this->update_list_of_installed_versions($espresso_db_update);
480
-        // get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
481
-        add_action(
482
-            'AHEE__EE_System__perform_activations_upgrades_and_migrations',
483
-            array($this, 'initialize_db_if_no_migrations_required')
484
-        );
485
-    }
486
-
487
-
488
-    /**
489
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
490
-     * information about what versions of EE have been installed and activated,
491
-     * NOT necessarily the state of the database
492
-     *
493
-     * @param mixed $espresso_db_update           the value of the WordPress option.
494
-     *                                            If not supplied, fetches it from the options table
495
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
496
-     */
497
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
498
-    {
499
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
500
-        if (! $espresso_db_update) {
501
-            $espresso_db_update = get_option('espresso_db_update');
502
-        }
503
-        // check that option is an array
504
-        if (! is_array($espresso_db_update)) {
505
-            // if option is FALSE, then it never existed
506
-            if ($espresso_db_update === false) {
507
-                // make $espresso_db_update an array and save option with autoload OFF
508
-                $espresso_db_update = array();
509
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
510
-            } else {
511
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
512
-                $espresso_db_update = array($espresso_db_update => array());
513
-                update_option('espresso_db_update', $espresso_db_update);
514
-            }
515
-        } else {
516
-            $corrected_db_update = array();
517
-            // if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
518
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
519
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
520
-                    // the key is an int, and the value IS NOT an array
521
-                    // so it must be numerically-indexed, where values are versions installed...
522
-                    // fix it!
523
-                    $version_string = $should_be_array;
524
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
525
-                } else {
526
-                    // ok it checks out
527
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
528
-                }
529
-            }
530
-            $espresso_db_update = $corrected_db_update;
531
-            update_option('espresso_db_update', $espresso_db_update);
532
-        }
533
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
534
-        return $espresso_db_update;
535
-    }
536
-
537
-
538
-    /**
539
-     * Does the traditional work of setting up the plugin's database and adding default data.
540
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
541
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
542
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
543
-     * so that it will be done when migrations are finished
544
-     *
545
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
546
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
547
-     *                                       This is a resource-intensive job
548
-     *                                       so we prefer to only do it when necessary
549
-     * @return void
550
-     * @throws EE_Error
551
-     */
552
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
553
-    {
554
-        $request_type = $this->detect_req_type();
555
-        // only initialize system if we're not in maintenance mode.
556
-        if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
557
-            /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
558
-            $rewrite_rules = $this->loader->getShared(
559
-                'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
560
-            );
561
-            $rewrite_rules->flush();
562
-            if ($verify_schema) {
563
-                EEH_Activation::initialize_db_and_folders();
564
-            }
565
-            EEH_Activation::initialize_db_content();
566
-            EEH_Activation::system_initialization();
567
-            if ($initialize_addons_too) {
568
-                $this->initialize_addons();
569
-            }
570
-        } else {
571
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
572
-        }
573
-        if ($request_type === EE_System::req_type_new_activation
574
-            || $request_type === EE_System::req_type_reactivation
575
-            || (
576
-                $request_type === EE_System::req_type_upgrade
577
-                && $this->is_major_version_change()
578
-            )
579
-        ) {
580
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
581
-        }
582
-    }
583
-
584
-
585
-    /**
586
-     * Initializes the db for all registered addons
587
-     *
588
-     * @throws EE_Error
589
-     */
590
-    public function initialize_addons()
591
-    {
592
-        // foreach registered addon, make sure its db is up-to-date too
593
-        foreach ($this->registry->addons as $addon) {
594
-            if ($addon instanceof EE_Addon) {
595
-                $addon->initialize_db_if_no_migrations_required();
596
-            }
597
-        }
598
-    }
599
-
600
-
601
-    /**
602
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
603
-     *
604
-     * @param    array  $version_history
605
-     * @param    string $current_version_to_add version to be added to the version history
606
-     * @return    boolean success as to whether or not this option was changed
607
-     */
608
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
609
-    {
610
-        if (! $version_history) {
611
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
612
-        }
613
-        if ($current_version_to_add === null) {
614
-            $current_version_to_add = espresso_version();
615
-        }
616
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
617
-        // re-save
618
-        return update_option('espresso_db_update', $version_history);
619
-    }
620
-
621
-
622
-    /**
623
-     * Detects if the current version indicated in the has existed in the list of
624
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
625
-     *
626
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
627
-     *                                  If not supplied, fetches it from the options table.
628
-     *                                  Also, caches its result so later parts of the code can also know whether
629
-     *                                  there's been an update or not. This way we can add the current version to
630
-     *                                  espresso_db_update, but still know if this is a new install or not
631
-     * @return int one of the constants on EE_System::req_type_
632
-     */
633
-    public function detect_req_type($espresso_db_update = null)
634
-    {
635
-        if ($this->_req_type === null) {
636
-            $espresso_db_update = ! empty($espresso_db_update)
637
-                ? $espresso_db_update
638
-                : $this->fix_espresso_db_upgrade_option();
639
-            $this->_req_type = EE_System::detect_req_type_given_activation_history(
640
-                $espresso_db_update,
641
-                'ee_espresso_activation',
642
-                espresso_version()
643
-            );
644
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
645
-            $this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
646
-        }
647
-        return $this->_req_type;
648
-    }
649
-
650
-
651
-    /**
652
-     * Returns whether or not there was a non-micro version change (ie, change in either
653
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
654
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
655
-     *
656
-     * @param $activation_history
657
-     * @return bool
658
-     */
659
-    private function _detect_major_version_change($activation_history)
660
-    {
661
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
662
-        $previous_version_parts = explode('.', $previous_version);
663
-        $current_version_parts = explode('.', espresso_version());
664
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
665
-               && ($previous_version_parts[0] !== $current_version_parts[0]
666
-                   || $previous_version_parts[1] !== $current_version_parts[1]
667
-               );
668
-    }
669
-
670
-
671
-    /**
672
-     * Returns true if either the major or minor version of EE changed during this request.
673
-     * 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
674
-     *
675
-     * @return bool
676
-     */
677
-    public function is_major_version_change()
678
-    {
679
-        return $this->_major_version_change;
680
-    }
681
-
682
-
683
-    /**
684
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
685
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
686
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
687
-     * just activated to (for core that will always be espresso_version())
688
-     *
689
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
690
-     *                                                 ee plugin. for core that's 'espresso_db_update'
691
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
692
-     *                                                 indicate that this plugin was just activated
693
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
694
-     *                                                 espresso_version())
695
-     * @return int one of the constants on EE_System::req_type_*
696
-     */
697
-    public static function detect_req_type_given_activation_history(
698
-        $activation_history_for_addon,
699
-        $activation_indicator_option_name,
700
-        $version_to_upgrade_to
701
-    ) {
702
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
703
-        if ($activation_history_for_addon) {
704
-            // it exists, so this isn't a completely new install
705
-            // check if this version already in that list of previously installed versions
706
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
707
-                // it a version we haven't seen before
708
-                if ($version_is_higher === 1) {
709
-                    $req_type = EE_System::req_type_upgrade;
710
-                } else {
711
-                    $req_type = EE_System::req_type_downgrade;
712
-                }
713
-                delete_option($activation_indicator_option_name);
714
-            } else {
715
-                // its not an update. maybe a reactivation?
716
-                if (get_option($activation_indicator_option_name, false)) {
717
-                    if ($version_is_higher === -1) {
718
-                        $req_type = EE_System::req_type_downgrade;
719
-                    } elseif ($version_is_higher === 0) {
720
-                        // we've seen this version before, but it's an activation. must be a reactivation
721
-                        $req_type = EE_System::req_type_reactivation;
722
-                    } else {// $version_is_higher === 1
723
-                        $req_type = EE_System::req_type_upgrade;
724
-                    }
725
-                    delete_option($activation_indicator_option_name);
726
-                } else {
727
-                    // we've seen this version before and the activation indicate doesn't show it was just activated
728
-                    if ($version_is_higher === -1) {
729
-                        $req_type = EE_System::req_type_downgrade;
730
-                    } elseif ($version_is_higher === 0) {
731
-                        // we've seen this version before and it's not an activation. its normal request
732
-                        $req_type = EE_System::req_type_normal;
733
-                    } else {// $version_is_higher === 1
734
-                        $req_type = EE_System::req_type_upgrade;
735
-                    }
736
-                }
737
-            }
738
-        } else {
739
-            // brand new install
740
-            $req_type = EE_System::req_type_new_activation;
741
-            delete_option($activation_indicator_option_name);
742
-        }
743
-        return $req_type;
744
-    }
745
-
746
-
747
-    /**
748
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
749
-     * the $activation_history_for_addon
750
-     *
751
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
752
-     *                                             sometimes containing 'unknown-date'
753
-     * @param string $version_to_upgrade_to        (current version)
754
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
755
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
756
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
757
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
758
-     */
759
-    private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
760
-    {
761
-        // find the most recently-activated version
762
-        $most_recently_active_version =
763
-            EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
764
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
765
-    }
766
-
767
-
768
-    /**
769
-     * Gets the most recently active version listed in the activation history,
770
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
771
-     *
772
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
773
-     *                                   sometimes containing 'unknown-date'
774
-     * @return string
775
-     */
776
-    private static function _get_most_recently_active_version_from_activation_history($activation_history)
777
-    {
778
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
779
-        $most_recently_active_version = '0.0.0.dev.000';
780
-        if (is_array($activation_history)) {
781
-            foreach ($activation_history as $version => $times_activated) {
782
-                // check there is a record of when this version was activated. Otherwise,
783
-                // mark it as unknown
784
-                if (! $times_activated) {
785
-                    $times_activated = array('unknown-date');
786
-                }
787
-                if (is_string($times_activated)) {
788
-                    $times_activated = array($times_activated);
789
-                }
790
-                foreach ($times_activated as $an_activation) {
791
-                    if ($an_activation !== 'unknown-date'
792
-                        && $an_activation
793
-                           > $most_recently_active_version_activation) {
794
-                        $most_recently_active_version = $version;
795
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
796
-                            ? '1970-01-01 00:00:00'
797
-                            : $an_activation;
798
-                    }
799
-                }
800
-            }
801
-        }
802
-        return $most_recently_active_version;
803
-    }
804
-
805
-
806
-    /**
807
-     * This redirects to the about EE page after activation
808
-     *
809
-     * @return void
810
-     */
811
-    public function redirect_to_about_ee()
812
-    {
813
-        $notices = EE_Error::get_notices(false);
814
-        // if current user is an admin and it's not an ajax or rest request
815
-        if (! isset($notices['errors'])
816
-            && $this->request->isAdmin()
817
-            && apply_filters(
818
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
819
-                $this->capabilities->current_user_can('manage_options', 'espresso_about_default')
820
-            )
821
-        ) {
822
-            $query_params = array('page' => 'espresso_about');
823
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
824
-                $query_params['new_activation'] = true;
825
-            }
826
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
827
-                $query_params['reactivation'] = true;
828
-            }
829
-            $url = add_query_arg($query_params, admin_url('admin.php'));
830
-            wp_safe_redirect($url);
831
-            exit();
832
-        }
833
-    }
834
-
835
-
836
-    /**
837
-     * load_core_configuration
838
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
839
-     * which runs during the WP 'plugins_loaded' action at priority 5
840
-     *
841
-     * @return void
842
-     * @throws ReflectionException
843
-     * @throws Exception
844
-     */
845
-    public function load_core_configuration()
846
-    {
847
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
848
-        $this->loader->getShared('EE_Load_Textdomain');
849
-        // load textdomain
850
-        EE_Load_Textdomain::load_textdomain();
851
-        // load and setup EE_Config and EE_Network_Config
852
-        $config = $this->loader->getShared('EE_Config');
853
-        $this->loader->getShared('EE_Network_Config');
854
-        // setup autoloaders
855
-        // enable logging?
856
-        if ($config->admin->use_full_logging) {
857
-            $this->loader->getShared('EE_Log');
858
-        }
859
-        // check for activation errors
860
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
861
-        if ($activation_errors) {
862
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
863
-            update_option('ee_plugin_activation_errors', false);
864
-        }
865
-        // get model names
866
-        $this->_parse_model_names();
867
-        // load caf stuff a chance to play during the activation process too.
868
-        $this->_maybe_brew_regular();
869
-        // configure custom post type definitions
870
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
871
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
872
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
873
-    }
874
-
875
-
876
-    /**
877
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
878
-     *
879
-     * @return void
880
-     * @throws ReflectionException
881
-     */
882
-    private function _parse_model_names()
883
-    {
884
-        // get all the files in the EE_MODELS folder that end in .model.php
885
-        $models = glob(EE_MODELS . '*.model.php');
886
-        $model_names = array();
887
-        $non_abstract_db_models = array();
888
-        foreach ($models as $model) {
889
-            // get model classname
890
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
891
-            $short_name = str_replace('EEM_', '', $classname);
892
-            $reflectionClass = new ReflectionClass($classname);
893
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
894
-                $non_abstract_db_models[ $short_name ] = $classname;
895
-            }
896
-            $model_names[ $short_name ] = $classname;
897
-        }
898
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
899
-        $this->registry->non_abstract_db_models = apply_filters(
900
-            'FHEE__EE_System__parse_implemented_model_names',
901
-            $non_abstract_db_models
902
-        );
903
-    }
904
-
905
-
906
-    /**
907
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
908
-     * that need to be setup before our EE_System launches.
909
-     *
910
-     * @return void
911
-     * @throws DomainException
912
-     * @throws InvalidArgumentException
913
-     * @throws InvalidDataTypeException
914
-     * @throws InvalidInterfaceException
915
-     * @throws InvalidClassException
916
-     * @throws InvalidFilePathException
917
-     */
918
-    private function _maybe_brew_regular()
919
-    {
920
-        /** @var Domain $domain */
921
-        $domain = DomainFactory::getShared(
922
-            new FullyQualifiedName(
923
-                'EventEspresso\core\domain\Domain'
924
-            ),
925
-            array(
926
-                new FilePath(EVENT_ESPRESSO_MAIN_FILE),
927
-                Version::fromString(espresso_version()),
928
-            )
929
-        );
930
-        if ($domain->isCaffeinated()) {
931
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
932
-        }
933
-    }
934
-
935
-
936
-    /**
937
-     * @since $VID:$
938
-     * @throws Exception
939
-     */
940
-    public function loadRouteMatchSpecifications()
941
-    {
942
-        try {
943
-            $this->loader->getShared(
944
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationManager'
945
-            );
946
-        } catch (Exception $exception) {
947
-            new ExceptionStackTraceDisplay($exception);
948
-        }
949
-        do_action('AHEE__EE_System__loadRouteMatchSpecifications');
950
-    }
951
-
952
-
953
-    /**
954
-     * register_shortcodes_modules_and_widgets
955
-     * generate lists of shortcodes and modules, then verify paths and classes
956
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
957
-     * which runs during the WP 'plugins_loaded' action at priority 7
958
-     *
959
-     * @access public
960
-     * @return void
961
-     * @throws Exception
962
-     */
963
-    public function register_shortcodes_modules_and_widgets()
964
-    {
965
-        if ($this->request->isFrontend() || $this->request->isIframe() || $this->request->isAjax()) {
966
-            try {
967
-                // load, register, and add shortcodes the new way
968
-                $this->loader->getShared(
969
-                    'EventEspresso\core\services\shortcodes\ShortcodesManager',
970
-                    array(
971
-                        // and the old way, but we'll put it under control of the new system
972
-                        EE_Config::getLegacyShortcodesManager(),
973
-                    )
974
-                );
975
-            } catch (Exception $exception) {
976
-                new ExceptionStackTraceDisplay($exception);
977
-            }
978
-        }
979
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
980
-        // check for addons using old hook point
981
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
982
-            $this->_incompatible_addon_error();
983
-        }
984
-    }
985
-
986
-
987
-    /**
988
-     * _incompatible_addon_error
989
-     *
990
-     * @access public
991
-     * @return void
992
-     */
993
-    private function _incompatible_addon_error()
994
-    {
995
-        // get array of classes hooking into here
996
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
997
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
998
-        );
999
-        if (! empty($class_names)) {
1000
-            $msg = __(
1001
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
1002
-                'event_espresso'
1003
-            );
1004
-            $msg .= '<ul>';
1005
-            foreach ($class_names as $class_name) {
1006
-                $msg .= '<li><b>Event Espresso - '
1007
-                        . str_replace(
1008
-                            array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1009
-                            '',
1010
-                            $class_name
1011
-                        ) . '</b></li>';
1012
-            }
1013
-            $msg .= '</ul>';
1014
-            $msg .= __(
1015
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
1016
-                'event_espresso'
1017
-            );
1018
-            // save list of incompatible addons to wp-options for later use
1019
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
1020
-            if (is_admin()) {
1021
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1022
-            }
1023
-        }
1024
-    }
1025
-
1026
-
1027
-    /**
1028
-     * brew_espresso
1029
-     * begins the process of setting hooks for initializing EE in the correct order
1030
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1031
-     * which runs during the WP 'plugins_loaded' action at priority 9
1032
-     *
1033
-     * @return void
1034
-     */
1035
-    public function brew_espresso()
1036
-    {
1037
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
1038
-        // load some final core systems
1039
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
1040
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1041
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
1042
-        add_action('init', array($this, 'load_controllers'), 7);
1043
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
1044
-        add_action('init', array($this, 'initialize'), 10);
1045
-        add_action('init', array($this, 'initialize_last'), 100);
1046
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1047
-            // pew pew pew
1048
-            $this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1049
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1050
-        }
1051
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
1052
-    }
1053
-
1054
-
1055
-    /**
1056
-     *    set_hooks_for_core
1057
-     *
1058
-     * @access public
1059
-     * @return    void
1060
-     * @throws EE_Error
1061
-     */
1062
-    public function set_hooks_for_core()
1063
-    {
1064
-        $this->_deactivate_incompatible_addons();
1065
-        do_action('AHEE__EE_System__set_hooks_for_core');
1066
-        $this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1067
-        // caps need to be initialized on every request so that capability maps are set.
1068
-        // @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1069
-        $this->registry->CAP->init_caps();
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * Using the information gathered in EE_System::_incompatible_addon_error,
1075
-     * deactivates any addons considered incompatible with the current version of EE
1076
-     */
1077
-    private function _deactivate_incompatible_addons()
1078
-    {
1079
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
1080
-        if (! empty($incompatible_addons)) {
1081
-            $active_plugins = get_option('active_plugins', array());
1082
-            foreach ($active_plugins as $active_plugin) {
1083
-                foreach ($incompatible_addons as $incompatible_addon) {
1084
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
1085
-                        unset($_GET['activate']);
1086
-                        espresso_deactivate_plugin($active_plugin);
1087
-                    }
1088
-                }
1089
-            }
1090
-        }
1091
-    }
1092
-
1093
-
1094
-    /**
1095
-     *    perform_activations_upgrades_and_migrations
1096
-     *
1097
-     * @access public
1098
-     * @return    void
1099
-     */
1100
-    public function perform_activations_upgrades_and_migrations()
1101
-    {
1102
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1103
-    }
1104
-
1105
-
1106
-    /**
1107
-     * @return void
1108
-     * @throws DomainException
1109
-     */
1110
-    public function load_CPTs_and_session()
1111
-    {
1112
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
1113
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1114
-        $register_custom_taxonomies = $this->loader->getShared(
1115
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1116
-        );
1117
-        $register_custom_taxonomies->registerCustomTaxonomies();
1118
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1119
-        $register_custom_post_types = $this->loader->getShared(
1120
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1121
-        );
1122
-        $register_custom_post_types->registerCustomPostTypes();
1123
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1124
-        $register_custom_taxonomy_terms = $this->loader->getShared(
1125
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1126
-        );
1127
-        $register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1128
-        // load legacy Custom Post Types and Taxonomies
1129
-        $this->loader->getShared('EE_Register_CPTs');
1130
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1131
-    }
1132
-
1133
-
1134
-    /**
1135
-     * load_controllers
1136
-     * this is the best place to load any additional controllers that needs access to EE core.
1137
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1138
-     * time
1139
-     *
1140
-     * @access public
1141
-     * @return void
1142
-     */
1143
-    public function load_controllers()
1144
-    {
1145
-        do_action('AHEE__EE_System__load_controllers__start');
1146
-        // let's get it started
1147
-        if (! $this->maintenance_mode->level()
1148
-            && ($this->request->isFrontend() || $this->request->isFrontAjax())
1149
-        ) {
1150
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1151
-            $this->loader->getShared('EE_Front_Controller');
1152
-        } elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1153
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1154
-            $this->loader->getShared('EE_Admin');
1155
-        }
1156
-        do_action('AHEE__EE_System__load_controllers__complete');
1157
-    }
1158
-
1159
-
1160
-    /**
1161
-     * core_loaded_and_ready
1162
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1163
-     *
1164
-     * @access public
1165
-     * @return void
1166
-     * @throws Exception
1167
-     */
1168
-    public function core_loaded_and_ready()
1169
-    {
1170
-        if ($this->request->isAdmin()
1171
-            || $this->request->isFrontend()
1172
-            || $this->request->isIframe()
1173
-            || $this->request->isWordPressApi()
1174
-        ) {
1175
-            try {
1176
-                $this->loader->getShared('EventEspresso\core\services\assets\Registry');
1177
-                $this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1178
-                if (function_exists('register_block_type')) {
1179
-                    $this->loader->getShared(
1180
-                        'EventEspresso\core\services\editor\BlockRegistrationManager'
1181
-                    );
1182
-                }
1183
-            } catch (Exception $exception) {
1184
-                new ExceptionStackTraceDisplay($exception);
1185
-            }
1186
-        }
1187
-        if ($this->request->isAdmin()
1188
-            || $this->request->isEeAjax()
1189
-            || $this->request->isFrontend()
1190
-        ) {
1191
-            $this->loader->getShared('EE_Session');
1192
-        }
1193
-        // integrate WP_Query with the EE models
1194
-        $this->loader->getShared('EE_CPT_Strategy');
1195
-        do_action('AHEE__EE_System__core_loaded_and_ready');
1196
-        // always load template tags, because it's faster than checking if it's a front-end request, and many page
1197
-        // builders require these even on the front-end
1198
-        require_once EE_PUBLIC . 'template_tags.php';
1199
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1200
-    }
1201
-
1202
-
1203
-    /**
1204
-     * initialize
1205
-     * this is the best place to begin initializing client code
1206
-     *
1207
-     * @access public
1208
-     * @return void
1209
-     */
1210
-    public function initialize()
1211
-    {
1212
-        do_action('AHEE__EE_System__initialize');
1213
-    }
1214
-
1215
-
1216
-    /**
1217
-     * initialize_last
1218
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1219
-     * initialize has done so
1220
-     *
1221
-     * @access public
1222
-     * @return void
1223
-     */
1224
-    public function initialize_last()
1225
-    {
1226
-        do_action('AHEE__EE_System__initialize_last');
1227
-        /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1228
-        $rewrite_rules = $this->loader->getShared(
1229
-            'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1230
-        );
1231
-        $rewrite_rules->flushRewriteRules();
1232
-        add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1233
-        if (($this->request->isAjax() || $this->request->isAdmin())
1234
-            && $this->maintenance_mode->models_can_query()) {
1235
-            $this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1236
-            $this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1237
-        }
1238
-    }
1239
-
1240
-
1241
-    /**
1242
-     * @return void
1243
-     * @throws EE_Error
1244
-     */
1245
-    public function addEspressoToolbar()
1246
-    {
1247
-        $this->loader->getShared(
1248
-            'EventEspresso\core\domain\services\admin\AdminToolBar',
1249
-            array($this->registry->CAP)
1250
-        );
1251
-    }
1252
-
1253
-
1254
-    /**
1255
-     * do_not_cache
1256
-     * sets no cache headers and defines no cache constants for WP plugins
1257
-     *
1258
-     * @access public
1259
-     * @return void
1260
-     */
1261
-    public static function do_not_cache()
1262
-    {
1263
-        // set no cache constants
1264
-        if (! defined('DONOTCACHEPAGE')) {
1265
-            define('DONOTCACHEPAGE', true);
1266
-        }
1267
-        if (! defined('DONOTCACHCEOBJECT')) {
1268
-            define('DONOTCACHCEOBJECT', true);
1269
-        }
1270
-        if (! defined('DONOTCACHEDB')) {
1271
-            define('DONOTCACHEDB', true);
1272
-        }
1273
-        // add no cache headers
1274
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1275
-        // plus a little extra for nginx and Google Chrome
1276
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1277
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1278
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1279
-    }
1280
-
1281
-
1282
-    /**
1283
-     *    extra_nocache_headers
1284
-     *
1285
-     * @access    public
1286
-     * @param $headers
1287
-     * @return    array
1288
-     */
1289
-    public static function extra_nocache_headers($headers)
1290
-    {
1291
-        // for NGINX
1292
-        $headers['X-Accel-Expires'] = 0;
1293
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1294
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1295
-        return $headers;
1296
-    }
1297
-
1298
-
1299
-    /**
1300
-     *    nocache_headers
1301
-     *
1302
-     * @access    public
1303
-     * @return    void
1304
-     */
1305
-    public static function nocache_headers()
1306
-    {
1307
-        nocache_headers();
1308
-    }
1309
-
1310
-
1311
-    /**
1312
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1313
-     * never returned with the function.
1314
-     *
1315
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1316
-     * @return array
1317
-     */
1318
-    public function remove_pages_from_wp_list_pages($exclude_array)
1319
-    {
1320
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1321
-    }
30
+	/**
31
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
32
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
33
+	 */
34
+	const req_type_normal = 0;
35
+
36
+	/**
37
+	 * Indicates this is a brand new installation of EE so we should install
38
+	 * tables and default data etc
39
+	 */
40
+	const req_type_new_activation = 1;
41
+
42
+	/**
43
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
44
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
45
+	 * and that default data is setup too
46
+	 */
47
+	const req_type_reactivation = 2;
48
+
49
+	/**
50
+	 * indicates that EE has been upgraded since its previous request.
51
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
52
+	 */
53
+	const req_type_upgrade = 3;
54
+
55
+	/**
56
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
57
+	 */
58
+	const req_type_downgrade = 4;
59
+
60
+	/**
61
+	 * @deprecated since version 4.6.0.dev.006
62
+	 * Now whenever a new_activation is detected the request type is still just
63
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
64
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
65
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
66
+	 * (Specifically, when the migration manager indicates migrations are finished
67
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
68
+	 */
69
+	const req_type_activation_but_not_installed = 5;
70
+
71
+	/**
72
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
73
+	 */
74
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
75
+
76
+	/**
77
+	 * @var EE_System $_instance
78
+	 */
79
+	private static $_instance;
80
+
81
+	/**
82
+	 * @var EE_Registry $registry
83
+	 */
84
+	private $registry;
85
+
86
+	/**
87
+	 * @var LoaderInterface $loader
88
+	 */
89
+	private $loader;
90
+
91
+	/**
92
+	 * @var EE_Capabilities $capabilities
93
+	 */
94
+	private $capabilities;
95
+
96
+	/**
97
+	 * @var RequestInterface $request
98
+	 */
99
+	private $request;
100
+
101
+	/**
102
+	 * @var EE_Maintenance_Mode $maintenance_mode
103
+	 */
104
+	private $maintenance_mode;
105
+
106
+	/**
107
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
108
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
109
+	 *
110
+	 * @var int $_req_type
111
+	 */
112
+	private $_req_type;
113
+
114
+	/**
115
+	 * Whether or not there was a non-micro version change in EE core version during this request
116
+	 *
117
+	 * @var boolean $_major_version_change
118
+	 */
119
+	private $_major_version_change = false;
120
+
121
+	/**
122
+	 * A Context DTO dedicated solely to identifying the current request type.
123
+	 *
124
+	 * @var RequestTypeContextCheckerInterface $request_type
125
+	 */
126
+	private $request_type;
127
+
128
+
129
+	/**
130
+	 * @singleton method used to instantiate class object
131
+	 * @param EE_Registry|null         $registry
132
+	 * @param LoaderInterface|null     $loader
133
+	 * @param RequestInterface|null    $request
134
+	 * @param EE_Maintenance_Mode|null $maintenance_mode
135
+	 * @return EE_System
136
+	 */
137
+	public static function instance(
138
+		EE_Registry $registry = null,
139
+		LoaderInterface $loader = null,
140
+		RequestInterface $request = null,
141
+		EE_Maintenance_Mode $maintenance_mode = null
142
+	) {
143
+		// check if class object is instantiated
144
+		if (! self::$_instance instanceof EE_System) {
145
+			self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146
+		}
147
+		return self::$_instance;
148
+	}
149
+
150
+
151
+	/**
152
+	 * resets the instance and returns it
153
+	 *
154
+	 * @return EE_System
155
+	 */
156
+	public static function reset()
157
+	{
158
+		self::$_instance->_req_type = null;
159
+		// make sure none of the old hooks are left hanging around
160
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
161
+		// we need to reset the migration manager in order for it to detect DMSs properly
162
+		EE_Data_Migration_Manager::reset();
163
+		self::instance()->detect_activations_or_upgrades();
164
+		self::instance()->perform_activations_upgrades_and_migrations();
165
+		return self::instance();
166
+	}
167
+
168
+
169
+	/**
170
+	 * sets hooks for running rest of system
171
+	 * provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
172
+	 * starting EE Addons from any other point may lead to problems
173
+	 *
174
+	 * @param EE_Registry         $registry
175
+	 * @param LoaderInterface     $loader
176
+	 * @param RequestInterface    $request
177
+	 * @param EE_Maintenance_Mode $maintenance_mode
178
+	 */
179
+	private function __construct(
180
+		EE_Registry $registry,
181
+		LoaderInterface $loader,
182
+		RequestInterface $request,
183
+		EE_Maintenance_Mode $maintenance_mode
184
+	) {
185
+		$this->registry = $registry;
186
+		$this->loader = $loader;
187
+		$this->request = $request;
188
+		$this->maintenance_mode = $maintenance_mode;
189
+		do_action('AHEE__EE_System__construct__begin', $this);
190
+		add_action(
191
+			'AHEE__EE_Bootstrap__load_espresso_addons',
192
+			array($this, 'loadCapabilities'),
193
+			5
194
+		);
195
+		add_action(
196
+			'AHEE__EE_Bootstrap__load_espresso_addons',
197
+			array($this, 'loadCommandBus'),
198
+			7
199
+		);
200
+		add_action(
201
+			'AHEE__EE_Bootstrap__load_espresso_addons',
202
+			array($this, 'loadPluginApi'),
203
+			9
204
+		);
205
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
206
+		add_action(
207
+			'AHEE__EE_Bootstrap__load_espresso_addons',
208
+			array($this, 'load_espresso_addons')
209
+		);
210
+		// when an ee addon is activated, we want to call the core hook(s) again
211
+		// because the newly-activated addon didn't get a chance to run at all
212
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
213
+		// detect whether install or upgrade
214
+		add_action(
215
+			'AHEE__EE_Bootstrap__detect_activations_or_upgrades',
216
+			array($this, 'detect_activations_or_upgrades'),
217
+			3
218
+		);
219
+		// load EE_Config, EE_Textdomain, etc
220
+		add_action(
221
+			'AHEE__EE_Bootstrap__load_core_configuration',
222
+			array($this, 'load_core_configuration'),
223
+			5
224
+		);
225
+		// load specifications for matching routes to current request
226
+		add_action(
227
+			'AHEE__EE_Bootstrap__load_core_configuration',
228
+			array($this, 'loadRouteMatchSpecifications')
229
+		);
230
+		// load EE_Config, EE_Textdomain, etc
231
+		add_action(
232
+			'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
233
+			array($this, 'register_shortcodes_modules_and_widgets'),
234
+			7
235
+		);
236
+		// you wanna get going? I wanna get going... let's get going!
237
+		add_action(
238
+			'AHEE__EE_Bootstrap__brew_espresso',
239
+			array($this, 'brew_espresso'),
240
+			9
241
+		);
242
+		// other housekeeping
243
+		// exclude EE critical pages from wp_list_pages
244
+		add_filter(
245
+			'wp_list_pages_excludes',
246
+			array($this, 'remove_pages_from_wp_list_pages'),
247
+			10
248
+		);
249
+		// ALL EE Addons should use the following hook point to attach their initial setup too
250
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
251
+		do_action('AHEE__EE_System__construct__complete', $this);
252
+	}
253
+
254
+
255
+	/**
256
+	 * load and setup EE_Capabilities
257
+	 *
258
+	 * @return void
259
+	 * @throws EE_Error
260
+	 */
261
+	public function loadCapabilities()
262
+	{
263
+		$this->capabilities = $this->loader->getShared('EE_Capabilities');
264
+		add_action(
265
+			'AHEE__EE_Capabilities__init_caps__before_initialization',
266
+			function () {
267
+				LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
268
+			}
269
+		);
270
+	}
271
+
272
+
273
+	/**
274
+	 * create and cache the CommandBus, and also add middleware
275
+	 * The CapChecker middleware requires the use of EE_Capabilities
276
+	 * which is why we need to load the CommandBus after Caps are set up
277
+	 *
278
+	 * @return void
279
+	 * @throws EE_Error
280
+	 */
281
+	public function loadCommandBus()
282
+	{
283
+		$this->loader->getShared(
284
+			'CommandBusInterface',
285
+			array(
286
+				null,
287
+				apply_filters(
288
+					'FHEE__EE_Load_Espresso_Core__handle_request__CommandBus_middleware',
289
+					array(
290
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\CapChecker'),
291
+						$this->loader->getShared('EventEspresso\core\services\commands\middleware\AddActionHook'),
292
+					)
293
+				),
294
+			)
295
+		);
296
+	}
297
+
298
+
299
+	/**
300
+	 * @return void
301
+	 * @throws EE_Error
302
+	 */
303
+	public function loadPluginApi()
304
+	{
305
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
306
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
307
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
308
+		$this->loader->getShared('EE_Request_Handler');
309
+	}
310
+
311
+
312
+	/**
313
+	 * @param string $addon_name
314
+	 * @param string $version_constant
315
+	 * @param string $min_version_required
316
+	 * @param string $load_callback
317
+	 * @param string $plugin_file_constant
318
+	 * @return void
319
+	 */
320
+	private function deactivateIncompatibleAddon(
321
+		$addon_name,
322
+		$version_constant,
323
+		$min_version_required,
324
+		$load_callback,
325
+		$plugin_file_constant
326
+	) {
327
+		if (! defined($version_constant)) {
328
+			return;
329
+		}
330
+		$addon_version = constant($version_constant);
331
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
332
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
333
+			if (! function_exists('deactivate_plugins')) {
334
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
335
+			}
336
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
337
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
338
+			EE_Error::add_error(
339
+				sprintf(
340
+					esc_html__(
341
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
342
+						'event_espresso'
343
+					),
344
+					$addon_name,
345
+					$min_version_required
346
+				),
347
+				__FILE__,
348
+				__FUNCTION__ . "({$addon_name})",
349
+				__LINE__
350
+			);
351
+			EE_Error::get_notices(false, true);
352
+		}
353
+	}
354
+
355
+
356
+	/**
357
+	 * load_espresso_addons
358
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
359
+	 * this is hooked into both:
360
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
361
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
362
+	 *    and the WP 'activate_plugin' hook point
363
+	 *
364
+	 * @access public
365
+	 * @return void
366
+	 */
367
+	public function load_espresso_addons()
368
+	{
369
+		$this->deactivateIncompatibleAddon(
370
+			'Wait Lists',
371
+			'EE_WAIT_LISTS_VERSION',
372
+			'1.0.0.beta.074',
373
+			'load_espresso_wait_lists',
374
+			'EE_WAIT_LISTS_PLUGIN_FILE'
375
+		);
376
+		$this->deactivateIncompatibleAddon(
377
+			'Automated Upcoming Event Notifications',
378
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
379
+			'1.0.0.beta.091',
380
+			'load_espresso_automated_upcoming_event_notification',
381
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
382
+		);
383
+		do_action('AHEE__EE_System__load_espresso_addons');
384
+		// if the WP API basic auth plugin isn't already loaded, load it now.
385
+		// We want it for mobile apps. Just include the entire plugin
386
+		// also, don't load the basic auth when a plugin is getting activated, because
387
+		// it could be the basic auth plugin, and it doesn't check if its methods are already defined
388
+		// and causes a fatal error
389
+		if ($this->request->getRequestParam('activate') !== 'true'
390
+			&& ! function_exists('json_basic_auth_handler')
391
+			&& ! function_exists('json_basic_auth_error')
392
+			&& ! in_array(
393
+				$this->request->getRequestParam('action'),
394
+				array('activate', 'activate-selected'),
395
+				true
396
+			)
397
+		) {
398
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
399
+		}
400
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
401
+	}
402
+
403
+
404
+	/**
405
+	 * detect_activations_or_upgrades
406
+	 * Checks for activation or upgrade of core first;
407
+	 * then also checks if any registered addons have been activated or upgraded
408
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
409
+	 * which runs during the WP 'plugins_loaded' action at priority 3
410
+	 *
411
+	 * @access public
412
+	 * @return void
413
+	 */
414
+	public function detect_activations_or_upgrades()
415
+	{
416
+		// first off: let's make sure to handle core
417
+		$this->detect_if_activation_or_upgrade();
418
+		foreach ($this->registry->addons as $addon) {
419
+			if ($addon instanceof EE_Addon) {
420
+				// detect teh request type for that addon
421
+				$addon->detect_activation_or_upgrade();
422
+			}
423
+		}
424
+	}
425
+
426
+
427
+	/**
428
+	 * detect_if_activation_or_upgrade
429
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
430
+	 * and either setting up the DB or setting up maintenance mode etc.
431
+	 *
432
+	 * @access public
433
+	 * @return void
434
+	 */
435
+	public function detect_if_activation_or_upgrade()
436
+	{
437
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
438
+		// check if db has been updated, or if its a brand-new installation
439
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
440
+		$request_type = $this->detect_req_type($espresso_db_update);
441
+		// EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
442
+		switch ($request_type) {
443
+			case EE_System::req_type_new_activation:
444
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
445
+				$this->_handle_core_version_change($espresso_db_update);
446
+				break;
447
+			case EE_System::req_type_reactivation:
448
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
449
+				$this->_handle_core_version_change($espresso_db_update);
450
+				break;
451
+			case EE_System::req_type_upgrade:
452
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
453
+				// migrations may be required now that we've upgraded
454
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
455
+				$this->_handle_core_version_change($espresso_db_update);
456
+				break;
457
+			case EE_System::req_type_downgrade:
458
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
459
+				// its possible migrations are no longer required
460
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
461
+				$this->_handle_core_version_change($espresso_db_update);
462
+				break;
463
+			case EE_System::req_type_normal:
464
+			default:
465
+				break;
466
+		}
467
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
468
+	}
469
+
470
+
471
+	/**
472
+	 * Updates the list of installed versions and sets hooks for
473
+	 * initializing the database later during the request
474
+	 *
475
+	 * @param array $espresso_db_update
476
+	 */
477
+	private function _handle_core_version_change($espresso_db_update)
478
+	{
479
+		$this->update_list_of_installed_versions($espresso_db_update);
480
+		// get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
481
+		add_action(
482
+			'AHEE__EE_System__perform_activations_upgrades_and_migrations',
483
+			array($this, 'initialize_db_if_no_migrations_required')
484
+		);
485
+	}
486
+
487
+
488
+	/**
489
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
490
+	 * information about what versions of EE have been installed and activated,
491
+	 * NOT necessarily the state of the database
492
+	 *
493
+	 * @param mixed $espresso_db_update           the value of the WordPress option.
494
+	 *                                            If not supplied, fetches it from the options table
495
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
496
+	 */
497
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
498
+	{
499
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
500
+		if (! $espresso_db_update) {
501
+			$espresso_db_update = get_option('espresso_db_update');
502
+		}
503
+		// check that option is an array
504
+		if (! is_array($espresso_db_update)) {
505
+			// if option is FALSE, then it never existed
506
+			if ($espresso_db_update === false) {
507
+				// make $espresso_db_update an array and save option with autoload OFF
508
+				$espresso_db_update = array();
509
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
510
+			} else {
511
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
512
+				$espresso_db_update = array($espresso_db_update => array());
513
+				update_option('espresso_db_update', $espresso_db_update);
514
+			}
515
+		} else {
516
+			$corrected_db_update = array();
517
+			// if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
518
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
519
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
520
+					// the key is an int, and the value IS NOT an array
521
+					// so it must be numerically-indexed, where values are versions installed...
522
+					// fix it!
523
+					$version_string = $should_be_array;
524
+					$corrected_db_update[ $version_string ] = array('unknown-date');
525
+				} else {
526
+					// ok it checks out
527
+					$corrected_db_update[ $should_be_version_string ] = $should_be_array;
528
+				}
529
+			}
530
+			$espresso_db_update = $corrected_db_update;
531
+			update_option('espresso_db_update', $espresso_db_update);
532
+		}
533
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
534
+		return $espresso_db_update;
535
+	}
536
+
537
+
538
+	/**
539
+	 * Does the traditional work of setting up the plugin's database and adding default data.
540
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
541
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
542
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
543
+	 * so that it will be done when migrations are finished
544
+	 *
545
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
546
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
547
+	 *                                       This is a resource-intensive job
548
+	 *                                       so we prefer to only do it when necessary
549
+	 * @return void
550
+	 * @throws EE_Error
551
+	 */
552
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
553
+	{
554
+		$request_type = $this->detect_req_type();
555
+		// only initialize system if we're not in maintenance mode.
556
+		if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
557
+			/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
558
+			$rewrite_rules = $this->loader->getShared(
559
+				'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
560
+			);
561
+			$rewrite_rules->flush();
562
+			if ($verify_schema) {
563
+				EEH_Activation::initialize_db_and_folders();
564
+			}
565
+			EEH_Activation::initialize_db_content();
566
+			EEH_Activation::system_initialization();
567
+			if ($initialize_addons_too) {
568
+				$this->initialize_addons();
569
+			}
570
+		} else {
571
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
572
+		}
573
+		if ($request_type === EE_System::req_type_new_activation
574
+			|| $request_type === EE_System::req_type_reactivation
575
+			|| (
576
+				$request_type === EE_System::req_type_upgrade
577
+				&& $this->is_major_version_change()
578
+			)
579
+		) {
580
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
581
+		}
582
+	}
583
+
584
+
585
+	/**
586
+	 * Initializes the db for all registered addons
587
+	 *
588
+	 * @throws EE_Error
589
+	 */
590
+	public function initialize_addons()
591
+	{
592
+		// foreach registered addon, make sure its db is up-to-date too
593
+		foreach ($this->registry->addons as $addon) {
594
+			if ($addon instanceof EE_Addon) {
595
+				$addon->initialize_db_if_no_migrations_required();
596
+			}
597
+		}
598
+	}
599
+
600
+
601
+	/**
602
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
603
+	 *
604
+	 * @param    array  $version_history
605
+	 * @param    string $current_version_to_add version to be added to the version history
606
+	 * @return    boolean success as to whether or not this option was changed
607
+	 */
608
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
609
+	{
610
+		if (! $version_history) {
611
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
612
+		}
613
+		if ($current_version_to_add === null) {
614
+			$current_version_to_add = espresso_version();
615
+		}
616
+		$version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
617
+		// re-save
618
+		return update_option('espresso_db_update', $version_history);
619
+	}
620
+
621
+
622
+	/**
623
+	 * Detects if the current version indicated in the has existed in the list of
624
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
625
+	 *
626
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
627
+	 *                                  If not supplied, fetches it from the options table.
628
+	 *                                  Also, caches its result so later parts of the code can also know whether
629
+	 *                                  there's been an update or not. This way we can add the current version to
630
+	 *                                  espresso_db_update, but still know if this is a new install or not
631
+	 * @return int one of the constants on EE_System::req_type_
632
+	 */
633
+	public function detect_req_type($espresso_db_update = null)
634
+	{
635
+		if ($this->_req_type === null) {
636
+			$espresso_db_update = ! empty($espresso_db_update)
637
+				? $espresso_db_update
638
+				: $this->fix_espresso_db_upgrade_option();
639
+			$this->_req_type = EE_System::detect_req_type_given_activation_history(
640
+				$espresso_db_update,
641
+				'ee_espresso_activation',
642
+				espresso_version()
643
+			);
644
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
645
+			$this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
646
+		}
647
+		return $this->_req_type;
648
+	}
649
+
650
+
651
+	/**
652
+	 * Returns whether or not there was a non-micro version change (ie, change in either
653
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
654
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
655
+	 *
656
+	 * @param $activation_history
657
+	 * @return bool
658
+	 */
659
+	private function _detect_major_version_change($activation_history)
660
+	{
661
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
662
+		$previous_version_parts = explode('.', $previous_version);
663
+		$current_version_parts = explode('.', espresso_version());
664
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
665
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
666
+				   || $previous_version_parts[1] !== $current_version_parts[1]
667
+			   );
668
+	}
669
+
670
+
671
+	/**
672
+	 * Returns true if either the major or minor version of EE changed during this request.
673
+	 * 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
674
+	 *
675
+	 * @return bool
676
+	 */
677
+	public function is_major_version_change()
678
+	{
679
+		return $this->_major_version_change;
680
+	}
681
+
682
+
683
+	/**
684
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
685
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
686
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
687
+	 * just activated to (for core that will always be espresso_version())
688
+	 *
689
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
690
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
691
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
692
+	 *                                                 indicate that this plugin was just activated
693
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
694
+	 *                                                 espresso_version())
695
+	 * @return int one of the constants on EE_System::req_type_*
696
+	 */
697
+	public static function detect_req_type_given_activation_history(
698
+		$activation_history_for_addon,
699
+		$activation_indicator_option_name,
700
+		$version_to_upgrade_to
701
+	) {
702
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
703
+		if ($activation_history_for_addon) {
704
+			// it exists, so this isn't a completely new install
705
+			// check if this version already in that list of previously installed versions
706
+			if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
707
+				// it a version we haven't seen before
708
+				if ($version_is_higher === 1) {
709
+					$req_type = EE_System::req_type_upgrade;
710
+				} else {
711
+					$req_type = EE_System::req_type_downgrade;
712
+				}
713
+				delete_option($activation_indicator_option_name);
714
+			} else {
715
+				// its not an update. maybe a reactivation?
716
+				if (get_option($activation_indicator_option_name, false)) {
717
+					if ($version_is_higher === -1) {
718
+						$req_type = EE_System::req_type_downgrade;
719
+					} elseif ($version_is_higher === 0) {
720
+						// we've seen this version before, but it's an activation. must be a reactivation
721
+						$req_type = EE_System::req_type_reactivation;
722
+					} else {// $version_is_higher === 1
723
+						$req_type = EE_System::req_type_upgrade;
724
+					}
725
+					delete_option($activation_indicator_option_name);
726
+				} else {
727
+					// we've seen this version before and the activation indicate doesn't show it was just activated
728
+					if ($version_is_higher === -1) {
729
+						$req_type = EE_System::req_type_downgrade;
730
+					} elseif ($version_is_higher === 0) {
731
+						// we've seen this version before and it's not an activation. its normal request
732
+						$req_type = EE_System::req_type_normal;
733
+					} else {// $version_is_higher === 1
734
+						$req_type = EE_System::req_type_upgrade;
735
+					}
736
+				}
737
+			}
738
+		} else {
739
+			// brand new install
740
+			$req_type = EE_System::req_type_new_activation;
741
+			delete_option($activation_indicator_option_name);
742
+		}
743
+		return $req_type;
744
+	}
745
+
746
+
747
+	/**
748
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
749
+	 * the $activation_history_for_addon
750
+	 *
751
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
752
+	 *                                             sometimes containing 'unknown-date'
753
+	 * @param string $version_to_upgrade_to        (current version)
754
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
755
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
756
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
757
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
758
+	 */
759
+	private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
760
+	{
761
+		// find the most recently-activated version
762
+		$most_recently_active_version =
763
+			EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
764
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
765
+	}
766
+
767
+
768
+	/**
769
+	 * Gets the most recently active version listed in the activation history,
770
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
771
+	 *
772
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
773
+	 *                                   sometimes containing 'unknown-date'
774
+	 * @return string
775
+	 */
776
+	private static function _get_most_recently_active_version_from_activation_history($activation_history)
777
+	{
778
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
779
+		$most_recently_active_version = '0.0.0.dev.000';
780
+		if (is_array($activation_history)) {
781
+			foreach ($activation_history as $version => $times_activated) {
782
+				// check there is a record of when this version was activated. Otherwise,
783
+				// mark it as unknown
784
+				if (! $times_activated) {
785
+					$times_activated = array('unknown-date');
786
+				}
787
+				if (is_string($times_activated)) {
788
+					$times_activated = array($times_activated);
789
+				}
790
+				foreach ($times_activated as $an_activation) {
791
+					if ($an_activation !== 'unknown-date'
792
+						&& $an_activation
793
+						   > $most_recently_active_version_activation) {
794
+						$most_recently_active_version = $version;
795
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
796
+							? '1970-01-01 00:00:00'
797
+							: $an_activation;
798
+					}
799
+				}
800
+			}
801
+		}
802
+		return $most_recently_active_version;
803
+	}
804
+
805
+
806
+	/**
807
+	 * This redirects to the about EE page after activation
808
+	 *
809
+	 * @return void
810
+	 */
811
+	public function redirect_to_about_ee()
812
+	{
813
+		$notices = EE_Error::get_notices(false);
814
+		// if current user is an admin and it's not an ajax or rest request
815
+		if (! isset($notices['errors'])
816
+			&& $this->request->isAdmin()
817
+			&& apply_filters(
818
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
819
+				$this->capabilities->current_user_can('manage_options', 'espresso_about_default')
820
+			)
821
+		) {
822
+			$query_params = array('page' => 'espresso_about');
823
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
824
+				$query_params['new_activation'] = true;
825
+			}
826
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
827
+				$query_params['reactivation'] = true;
828
+			}
829
+			$url = add_query_arg($query_params, admin_url('admin.php'));
830
+			wp_safe_redirect($url);
831
+			exit();
832
+		}
833
+	}
834
+
835
+
836
+	/**
837
+	 * load_core_configuration
838
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
839
+	 * which runs during the WP 'plugins_loaded' action at priority 5
840
+	 *
841
+	 * @return void
842
+	 * @throws ReflectionException
843
+	 * @throws Exception
844
+	 */
845
+	public function load_core_configuration()
846
+	{
847
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
848
+		$this->loader->getShared('EE_Load_Textdomain');
849
+		// load textdomain
850
+		EE_Load_Textdomain::load_textdomain();
851
+		// load and setup EE_Config and EE_Network_Config
852
+		$config = $this->loader->getShared('EE_Config');
853
+		$this->loader->getShared('EE_Network_Config');
854
+		// setup autoloaders
855
+		// enable logging?
856
+		if ($config->admin->use_full_logging) {
857
+			$this->loader->getShared('EE_Log');
858
+		}
859
+		// check for activation errors
860
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
861
+		if ($activation_errors) {
862
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
863
+			update_option('ee_plugin_activation_errors', false);
864
+		}
865
+		// get model names
866
+		$this->_parse_model_names();
867
+		// load caf stuff a chance to play during the activation process too.
868
+		$this->_maybe_brew_regular();
869
+		// configure custom post type definitions
870
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
871
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
872
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
873
+	}
874
+
875
+
876
+	/**
877
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
878
+	 *
879
+	 * @return void
880
+	 * @throws ReflectionException
881
+	 */
882
+	private function _parse_model_names()
883
+	{
884
+		// get all the files in the EE_MODELS folder that end in .model.php
885
+		$models = glob(EE_MODELS . '*.model.php');
886
+		$model_names = array();
887
+		$non_abstract_db_models = array();
888
+		foreach ($models as $model) {
889
+			// get model classname
890
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
891
+			$short_name = str_replace('EEM_', '', $classname);
892
+			$reflectionClass = new ReflectionClass($classname);
893
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
894
+				$non_abstract_db_models[ $short_name ] = $classname;
895
+			}
896
+			$model_names[ $short_name ] = $classname;
897
+		}
898
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
899
+		$this->registry->non_abstract_db_models = apply_filters(
900
+			'FHEE__EE_System__parse_implemented_model_names',
901
+			$non_abstract_db_models
902
+		);
903
+	}
904
+
905
+
906
+	/**
907
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
908
+	 * that need to be setup before our EE_System launches.
909
+	 *
910
+	 * @return void
911
+	 * @throws DomainException
912
+	 * @throws InvalidArgumentException
913
+	 * @throws InvalidDataTypeException
914
+	 * @throws InvalidInterfaceException
915
+	 * @throws InvalidClassException
916
+	 * @throws InvalidFilePathException
917
+	 */
918
+	private function _maybe_brew_regular()
919
+	{
920
+		/** @var Domain $domain */
921
+		$domain = DomainFactory::getShared(
922
+			new FullyQualifiedName(
923
+				'EventEspresso\core\domain\Domain'
924
+			),
925
+			array(
926
+				new FilePath(EVENT_ESPRESSO_MAIN_FILE),
927
+				Version::fromString(espresso_version()),
928
+			)
929
+		);
930
+		if ($domain->isCaffeinated()) {
931
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
932
+		}
933
+	}
934
+
935
+
936
+	/**
937
+	 * @since $VID:$
938
+	 * @throws Exception
939
+	 */
940
+	public function loadRouteMatchSpecifications()
941
+	{
942
+		try {
943
+			$this->loader->getShared(
944
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationManager'
945
+			);
946
+		} catch (Exception $exception) {
947
+			new ExceptionStackTraceDisplay($exception);
948
+		}
949
+		do_action('AHEE__EE_System__loadRouteMatchSpecifications');
950
+	}
951
+
952
+
953
+	/**
954
+	 * register_shortcodes_modules_and_widgets
955
+	 * generate lists of shortcodes and modules, then verify paths and classes
956
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
957
+	 * which runs during the WP 'plugins_loaded' action at priority 7
958
+	 *
959
+	 * @access public
960
+	 * @return void
961
+	 * @throws Exception
962
+	 */
963
+	public function register_shortcodes_modules_and_widgets()
964
+	{
965
+		if ($this->request->isFrontend() || $this->request->isIframe() || $this->request->isAjax()) {
966
+			try {
967
+				// load, register, and add shortcodes the new way
968
+				$this->loader->getShared(
969
+					'EventEspresso\core\services\shortcodes\ShortcodesManager',
970
+					array(
971
+						// and the old way, but we'll put it under control of the new system
972
+						EE_Config::getLegacyShortcodesManager(),
973
+					)
974
+				);
975
+			} catch (Exception $exception) {
976
+				new ExceptionStackTraceDisplay($exception);
977
+			}
978
+		}
979
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
980
+		// check for addons using old hook point
981
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
982
+			$this->_incompatible_addon_error();
983
+		}
984
+	}
985
+
986
+
987
+	/**
988
+	 * _incompatible_addon_error
989
+	 *
990
+	 * @access public
991
+	 * @return void
992
+	 */
993
+	private function _incompatible_addon_error()
994
+	{
995
+		// get array of classes hooking into here
996
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
997
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
998
+		);
999
+		if (! empty($class_names)) {
1000
+			$msg = __(
1001
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
1002
+				'event_espresso'
1003
+			);
1004
+			$msg .= '<ul>';
1005
+			foreach ($class_names as $class_name) {
1006
+				$msg .= '<li><b>Event Espresso - '
1007
+						. str_replace(
1008
+							array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1009
+							'',
1010
+							$class_name
1011
+						) . '</b></li>';
1012
+			}
1013
+			$msg .= '</ul>';
1014
+			$msg .= __(
1015
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
1016
+				'event_espresso'
1017
+			);
1018
+			// save list of incompatible addons to wp-options for later use
1019
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
1020
+			if (is_admin()) {
1021
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1022
+			}
1023
+		}
1024
+	}
1025
+
1026
+
1027
+	/**
1028
+	 * brew_espresso
1029
+	 * begins the process of setting hooks for initializing EE in the correct order
1030
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1031
+	 * which runs during the WP 'plugins_loaded' action at priority 9
1032
+	 *
1033
+	 * @return void
1034
+	 */
1035
+	public function brew_espresso()
1036
+	{
1037
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
1038
+		// load some final core systems
1039
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
1040
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1041
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
1042
+		add_action('init', array($this, 'load_controllers'), 7);
1043
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
1044
+		add_action('init', array($this, 'initialize'), 10);
1045
+		add_action('init', array($this, 'initialize_last'), 100);
1046
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1047
+			// pew pew pew
1048
+			$this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1049
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1050
+		}
1051
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
1052
+	}
1053
+
1054
+
1055
+	/**
1056
+	 *    set_hooks_for_core
1057
+	 *
1058
+	 * @access public
1059
+	 * @return    void
1060
+	 * @throws EE_Error
1061
+	 */
1062
+	public function set_hooks_for_core()
1063
+	{
1064
+		$this->_deactivate_incompatible_addons();
1065
+		do_action('AHEE__EE_System__set_hooks_for_core');
1066
+		$this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1067
+		// caps need to be initialized on every request so that capability maps are set.
1068
+		// @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1069
+		$this->registry->CAP->init_caps();
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
1075
+	 * deactivates any addons considered incompatible with the current version of EE
1076
+	 */
1077
+	private function _deactivate_incompatible_addons()
1078
+	{
1079
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
1080
+		if (! empty($incompatible_addons)) {
1081
+			$active_plugins = get_option('active_plugins', array());
1082
+			foreach ($active_plugins as $active_plugin) {
1083
+				foreach ($incompatible_addons as $incompatible_addon) {
1084
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
1085
+						unset($_GET['activate']);
1086
+						espresso_deactivate_plugin($active_plugin);
1087
+					}
1088
+				}
1089
+			}
1090
+		}
1091
+	}
1092
+
1093
+
1094
+	/**
1095
+	 *    perform_activations_upgrades_and_migrations
1096
+	 *
1097
+	 * @access public
1098
+	 * @return    void
1099
+	 */
1100
+	public function perform_activations_upgrades_and_migrations()
1101
+	{
1102
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1103
+	}
1104
+
1105
+
1106
+	/**
1107
+	 * @return void
1108
+	 * @throws DomainException
1109
+	 */
1110
+	public function load_CPTs_and_session()
1111
+	{
1112
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
1113
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1114
+		$register_custom_taxonomies = $this->loader->getShared(
1115
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1116
+		);
1117
+		$register_custom_taxonomies->registerCustomTaxonomies();
1118
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1119
+		$register_custom_post_types = $this->loader->getShared(
1120
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1121
+		);
1122
+		$register_custom_post_types->registerCustomPostTypes();
1123
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1124
+		$register_custom_taxonomy_terms = $this->loader->getShared(
1125
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1126
+		);
1127
+		$register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1128
+		// load legacy Custom Post Types and Taxonomies
1129
+		$this->loader->getShared('EE_Register_CPTs');
1130
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1131
+	}
1132
+
1133
+
1134
+	/**
1135
+	 * load_controllers
1136
+	 * this is the best place to load any additional controllers that needs access to EE core.
1137
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1138
+	 * time
1139
+	 *
1140
+	 * @access public
1141
+	 * @return void
1142
+	 */
1143
+	public function load_controllers()
1144
+	{
1145
+		do_action('AHEE__EE_System__load_controllers__start');
1146
+		// let's get it started
1147
+		if (! $this->maintenance_mode->level()
1148
+			&& ($this->request->isFrontend() || $this->request->isFrontAjax())
1149
+		) {
1150
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1151
+			$this->loader->getShared('EE_Front_Controller');
1152
+		} elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1153
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1154
+			$this->loader->getShared('EE_Admin');
1155
+		}
1156
+		do_action('AHEE__EE_System__load_controllers__complete');
1157
+	}
1158
+
1159
+
1160
+	/**
1161
+	 * core_loaded_and_ready
1162
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1163
+	 *
1164
+	 * @access public
1165
+	 * @return void
1166
+	 * @throws Exception
1167
+	 */
1168
+	public function core_loaded_and_ready()
1169
+	{
1170
+		if ($this->request->isAdmin()
1171
+			|| $this->request->isFrontend()
1172
+			|| $this->request->isIframe()
1173
+			|| $this->request->isWordPressApi()
1174
+		) {
1175
+			try {
1176
+				$this->loader->getShared('EventEspresso\core\services\assets\Registry');
1177
+				$this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1178
+				if (function_exists('register_block_type')) {
1179
+					$this->loader->getShared(
1180
+						'EventEspresso\core\services\editor\BlockRegistrationManager'
1181
+					);
1182
+				}
1183
+			} catch (Exception $exception) {
1184
+				new ExceptionStackTraceDisplay($exception);
1185
+			}
1186
+		}
1187
+		if ($this->request->isAdmin()
1188
+			|| $this->request->isEeAjax()
1189
+			|| $this->request->isFrontend()
1190
+		) {
1191
+			$this->loader->getShared('EE_Session');
1192
+		}
1193
+		// integrate WP_Query with the EE models
1194
+		$this->loader->getShared('EE_CPT_Strategy');
1195
+		do_action('AHEE__EE_System__core_loaded_and_ready');
1196
+		// always load template tags, because it's faster than checking if it's a front-end request, and many page
1197
+		// builders require these even on the front-end
1198
+		require_once EE_PUBLIC . 'template_tags.php';
1199
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1200
+	}
1201
+
1202
+
1203
+	/**
1204
+	 * initialize
1205
+	 * this is the best place to begin initializing client code
1206
+	 *
1207
+	 * @access public
1208
+	 * @return void
1209
+	 */
1210
+	public function initialize()
1211
+	{
1212
+		do_action('AHEE__EE_System__initialize');
1213
+	}
1214
+
1215
+
1216
+	/**
1217
+	 * initialize_last
1218
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1219
+	 * initialize has done so
1220
+	 *
1221
+	 * @access public
1222
+	 * @return void
1223
+	 */
1224
+	public function initialize_last()
1225
+	{
1226
+		do_action('AHEE__EE_System__initialize_last');
1227
+		/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1228
+		$rewrite_rules = $this->loader->getShared(
1229
+			'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1230
+		);
1231
+		$rewrite_rules->flushRewriteRules();
1232
+		add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1233
+		if (($this->request->isAjax() || $this->request->isAdmin())
1234
+			&& $this->maintenance_mode->models_can_query()) {
1235
+			$this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1236
+			$this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1237
+		}
1238
+	}
1239
+
1240
+
1241
+	/**
1242
+	 * @return void
1243
+	 * @throws EE_Error
1244
+	 */
1245
+	public function addEspressoToolbar()
1246
+	{
1247
+		$this->loader->getShared(
1248
+			'EventEspresso\core\domain\services\admin\AdminToolBar',
1249
+			array($this->registry->CAP)
1250
+		);
1251
+	}
1252
+
1253
+
1254
+	/**
1255
+	 * do_not_cache
1256
+	 * sets no cache headers and defines no cache constants for WP plugins
1257
+	 *
1258
+	 * @access public
1259
+	 * @return void
1260
+	 */
1261
+	public static function do_not_cache()
1262
+	{
1263
+		// set no cache constants
1264
+		if (! defined('DONOTCACHEPAGE')) {
1265
+			define('DONOTCACHEPAGE', true);
1266
+		}
1267
+		if (! defined('DONOTCACHCEOBJECT')) {
1268
+			define('DONOTCACHCEOBJECT', true);
1269
+		}
1270
+		if (! defined('DONOTCACHEDB')) {
1271
+			define('DONOTCACHEDB', true);
1272
+		}
1273
+		// add no cache headers
1274
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1275
+		// plus a little extra for nginx and Google Chrome
1276
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1277
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1278
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1279
+	}
1280
+
1281
+
1282
+	/**
1283
+	 *    extra_nocache_headers
1284
+	 *
1285
+	 * @access    public
1286
+	 * @param $headers
1287
+	 * @return    array
1288
+	 */
1289
+	public static function extra_nocache_headers($headers)
1290
+	{
1291
+		// for NGINX
1292
+		$headers['X-Accel-Expires'] = 0;
1293
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1294
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1295
+		return $headers;
1296
+	}
1297
+
1298
+
1299
+	/**
1300
+	 *    nocache_headers
1301
+	 *
1302
+	 * @access    public
1303
+	 * @return    void
1304
+	 */
1305
+	public static function nocache_headers()
1306
+	{
1307
+		nocache_headers();
1308
+	}
1309
+
1310
+
1311
+	/**
1312
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1313
+	 * never returned with the function.
1314
+	 *
1315
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1316
+	 * @return array
1317
+	 */
1318
+	public function remove_pages_from_wp_list_pages($exclude_array)
1319
+	{
1320
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1321
+	}
1322 1322
 }
Please login to merge, or discard this patch.