Completed
Branch EDTR/master (9495d8)
by
unknown
35:55 queued 27:20
created
modules/ticket_selector/DisplayTicketSelector.php 2 patches
Indentation   +718 added lines, -718 removed lines patch added patch discarded remove patch
@@ -33,725 +33,725 @@
 block discarded – undo
33 33
 class DisplayTicketSelector
34 34
 {
35 35
 
36
-    /**
37
-     * event that ticket selector is being generated for
38
-     *
39
-     * @access protected
40
-     * @var EE_Event $event
41
-     */
42
-    protected $event;
43
-
44
-    /**
45
-     * Used to flag when the ticket selector is being called from an external iframe.
46
-     *
47
-     * @var bool $iframe
48
-     */
49
-    protected $iframe = false;
50
-
51
-    /**
52
-     * max attendees that can register for event at one time
53
-     *
54
-     * @var int $max_attendees
55
-     */
56
-    private $max_attendees = EE_INF;
57
-
58
-    /**
59
-     * @var string $date_format
60
-     */
61
-    private $date_format;
62
-
63
-    /**
64
-     * @var string $time_format
65
-     */
66
-    private $time_format;
67
-
68
-    /**
69
-     * @var boolean $display_full_ui
70
-     */
71
-    private $display_full_ui;
72
-
73
-
74
-    /**
75
-     * DisplayTicketSelector constructor.
76
-     *
77
-     * @param bool $iframe
78
-     */
79
-    public function __construct($iframe = false)
80
-    {
81
-        $this->iframe = $iframe;
82
-        $this->date_format = apply_filters(
83
-            'FHEE__EED_Ticket_Selector__display_ticket_selector__date_format',
84
-            get_option('date_format')
85
-        );
86
-        $this->time_format = apply_filters(
87
-            'FHEE__EED_Ticket_Selector__display_ticket_selector__time_format',
88
-            get_option('time_format')
89
-        );
90
-    }
91
-
92
-
93
-    /**
94
-     * @return bool
95
-     */
96
-    public function isIframe()
97
-    {
98
-        return $this->iframe;
99
-    }
100
-
101
-
102
-    /**
103
-     * @param boolean $iframe
104
-     */
105
-    public function setIframe($iframe = true)
106
-    {
107
-        $this->iframe = filter_var($iframe, FILTER_VALIDATE_BOOLEAN);
108
-    }
109
-
110
-
111
-    /**
112
-     * finds and sets the \EE_Event object for use throughout class
113
-     *
114
-     * @param mixed $event
115
-     * @return bool
116
-     * @throws EE_Error
117
-     * @throws InvalidDataTypeException
118
-     * @throws InvalidInterfaceException
119
-     * @throws InvalidArgumentException
120
-     */
121
-    protected function setEvent($event = null)
122
-    {
123
-        if ($event === null) {
124
-            global $post;
125
-            $event = $post;
126
-        }
127
-        if ($event instanceof EE_Event) {
128
-            $this->event = $event;
129
-        } elseif ($event instanceof WP_Post) {
130
-            if (isset($event->EE_Event) && $event->EE_Event instanceof EE_Event) {
131
-                $this->event = $event->EE_Event;
132
-            } elseif ($event->post_type === 'espresso_events') {
133
-                $event->EE_Event = EEM_Event::instance()->instantiate_class_from_post_object($event);
134
-                $this->event = $event->EE_Event;
135
-            }
136
-        } else {
137
-            $user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso');
138
-            $dev_msg = $user_msg . __(
139
-                'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.',
140
-                'event_espresso'
141
-            );
142
-            EE_Error::add_error($user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__);
143
-            return false;
144
-        }
145
-        return true;
146
-    }
147
-
148
-
149
-    /**
150
-     * @return int
151
-     */
152
-    public function getMaxAttendees()
153
-    {
154
-        return $this->max_attendees;
155
-    }
156
-
157
-
158
-    /**
159
-     * @param int $max_attendees
160
-     */
161
-    public function setMaxAttendees($max_attendees)
162
-    {
163
-        $this->max_attendees = absint(
164
-            apply_filters(
165
-                'FHEE__EE_Ticket_Selector__display_ticket_selector__max_tickets',
166
-                $max_attendees
167
-            )
168
-        );
169
-    }
170
-
171
-
172
-    /**
173
-     * Returns whether or not the full ticket selector should be shown or not.
174
-     * Currently, it displays on the frontend (including ajax requests) but not the backend
175
-     *
176
-     * @return bool
177
-     */
178
-    private function display_full_ui()
179
-    {
180
-        if ($this->display_full_ui === null) {
181
-            $this->display_full_ui = ! is_admin() || (defined('DOING_AJAX') && DOING_AJAX);
182
-        }
183
-        return $this->display_full_ui;
184
-    }
185
-
186
-
187
-    /**
188
-     * creates buttons for selecting number of attendees for an event
189
-     *
190
-     * @param WP_Post|int $event
191
-     * @param bool        $view_details
192
-     * @return string
193
-     * @throws EE_Error
194
-     * @throws InvalidArgumentException
195
-     * @throws InvalidDataTypeException
196
-     * @throws InvalidInterfaceException
197
-     */
198
-    public function display($event = null, $view_details = false)
199
-    {
200
-        // reset filter for displaying submit button
201
-        remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
202
-        // poke and prod incoming event till it tells us what it is
203
-        if (! $this->setEvent($event)) {
204
-            return false;
205
-        }
206
-        // begin gathering template arguments by getting event status
207
-        $template_args = array('event_status' => $this->event->get_active_status());
208
-        if ($this->activeEventAndShowTicketSelector(
209
-            $event,
210
-            $template_args['event_status'],
211
-            $view_details
212
-        )) {
213
-            return ! is_single() ? $this->displayViewDetailsButton() : '';
214
-        }
215
-        // filter the maximum qty that can appear in the Ticket Selector qty dropdowns
216
-        $this->setMaxAttendees($this->event->additional_limit());
217
-        if ($this->getMaxAttendees() < 1) {
218
-            return $this->ticketSalesClosedMessage();
219
-        }
220
-        // is the event expired ?
221
-        $template_args['event_is_expired'] = ! is_admin() ? $this->event->is_expired() : false;
222
-        if ($template_args['event_is_expired']) {
223
-            return $this->expiredEventMessage();
224
-        }
225
-        // get all tickets for this event ordered by the datetime
226
-        $tickets = $this->getTickets();
227
-        if (count($tickets) < 1) {
228
-            return $this->noTicketAvailableMessage();
229
-        }
230
-        // redirecting to another site for registration ??
231
-        $external_url = (string) $this->event->external_url()
232
-            && $this->event->external_url() !== get_the_permalink()
233
-            ? $this->event->external_url()
234
-            : '';
235
-        // if redirecting to another site for registration, then we don't load the TS
236
-        $ticket_selector = $external_url
237
-            ? $this->externalEventRegistration()
238
-            : $this->loadTicketSelector($tickets, $template_args);
239
-        // now set up the form (but not for the admin)
240
-        $ticket_selector = $this->display_full_ui()
241
-            ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector
242
-            : $ticket_selector;
243
-        // submit button and form close tag
244
-        $ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : '';
245
-        return $ticket_selector;
246
-    }
247
-
248
-
249
-    /**
250
-     * displayTicketSelector
251
-     * examines the event properties and determines whether a Ticket Selector should be displayed
252
-     *
253
-     * @param WP_Post|int $event
254
-     * @param string      $_event_active_status
255
-     * @param bool        $view_details
256
-     * @return bool
257
-     * @throws EE_Error
258
-     */
259
-    protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details)
260
-    {
261
-        $event_post = $this->event instanceof EE_Event ? $this->event->ID() : $event;
262
-        return $this->display_full_ui()
263
-               && (
264
-                   ! $this->event->display_ticket_selector()
265
-                   || $view_details
266
-                   || post_password_required($event_post)
267
-                   || (
268
-                       $_event_active_status !== EE_Datetime::active
269
-                       && $_event_active_status !== EE_Datetime::upcoming
270
-                       && $_event_active_status !== EE_Datetime::sold_out
271
-                       && ! (
272
-                           $_event_active_status === EE_Datetime::inactive
273
-                           && is_user_logged_in()
274
-                       )
275
-                   )
276
-               );
277
-    }
278
-
279
-
280
-    /**
281
-     * noTicketAvailableMessage
282
-     * notice displayed if event is expired
283
-     *
284
-     * @return string
285
-     * @throws EE_Error
286
-     */
287
-    protected function expiredEventMessage()
288
-    {
289
-        return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__(
290
-            'We\'re sorry, but all tickets sales have ended because the event is expired.',
291
-            'event_espresso'
292
-        ) . '</span></div><!-- .ee-event-expired-notice -->';
293
-    }
294
-
295
-
296
-    /**
297
-     * noTicketAvailableMessage
298
-     * notice displayed if event has no more tickets available
299
-     *
300
-     * @return string
301
-     * @throws EE_Error
302
-     */
303
-    protected function noTicketAvailableMessage()
304
-    {
305
-        $no_ticket_available_msg = esc_html__('We\'re sorry, but all ticket sales have ended.', 'event_espresso');
306
-        if (current_user_can('edit_post', $this->event->ID())) {
307
-            $no_ticket_available_msg .= sprintf(
308
-                esc_html__(
309
-                    '%1$sNote to Event Admin:%2$sNo tickets were found for this event. This effectively turns off ticket sales. Please ensure that at least one ticket is available for if you want people to be able to register.%3$s(click to edit this event)%4$s',
310
-                    'event_espresso'
311
-                ),
312
-                '<div class="ee-attention" style="text-align: left;"><b>',
313
-                '</b><br />',
314
-                '<span class="edit-link"><a class="post-edit-link" href="'
315
-                . get_edit_post_link($this->event->ID())
316
-                . '">',
317
-                '</a></span></div><!-- .ee-attention noTicketAvailableMessage -->'
318
-            );
319
-        }
320
-        return '
36
+	/**
37
+	 * event that ticket selector is being generated for
38
+	 *
39
+	 * @access protected
40
+	 * @var EE_Event $event
41
+	 */
42
+	protected $event;
43
+
44
+	/**
45
+	 * Used to flag when the ticket selector is being called from an external iframe.
46
+	 *
47
+	 * @var bool $iframe
48
+	 */
49
+	protected $iframe = false;
50
+
51
+	/**
52
+	 * max attendees that can register for event at one time
53
+	 *
54
+	 * @var int $max_attendees
55
+	 */
56
+	private $max_attendees = EE_INF;
57
+
58
+	/**
59
+	 * @var string $date_format
60
+	 */
61
+	private $date_format;
62
+
63
+	/**
64
+	 * @var string $time_format
65
+	 */
66
+	private $time_format;
67
+
68
+	/**
69
+	 * @var boolean $display_full_ui
70
+	 */
71
+	private $display_full_ui;
72
+
73
+
74
+	/**
75
+	 * DisplayTicketSelector constructor.
76
+	 *
77
+	 * @param bool $iframe
78
+	 */
79
+	public function __construct($iframe = false)
80
+	{
81
+		$this->iframe = $iframe;
82
+		$this->date_format = apply_filters(
83
+			'FHEE__EED_Ticket_Selector__display_ticket_selector__date_format',
84
+			get_option('date_format')
85
+		);
86
+		$this->time_format = apply_filters(
87
+			'FHEE__EED_Ticket_Selector__display_ticket_selector__time_format',
88
+			get_option('time_format')
89
+		);
90
+	}
91
+
92
+
93
+	/**
94
+	 * @return bool
95
+	 */
96
+	public function isIframe()
97
+	{
98
+		return $this->iframe;
99
+	}
100
+
101
+
102
+	/**
103
+	 * @param boolean $iframe
104
+	 */
105
+	public function setIframe($iframe = true)
106
+	{
107
+		$this->iframe = filter_var($iframe, FILTER_VALIDATE_BOOLEAN);
108
+	}
109
+
110
+
111
+	/**
112
+	 * finds and sets the \EE_Event object for use throughout class
113
+	 *
114
+	 * @param mixed $event
115
+	 * @return bool
116
+	 * @throws EE_Error
117
+	 * @throws InvalidDataTypeException
118
+	 * @throws InvalidInterfaceException
119
+	 * @throws InvalidArgumentException
120
+	 */
121
+	protected function setEvent($event = null)
122
+	{
123
+		if ($event === null) {
124
+			global $post;
125
+			$event = $post;
126
+		}
127
+		if ($event instanceof EE_Event) {
128
+			$this->event = $event;
129
+		} elseif ($event instanceof WP_Post) {
130
+			if (isset($event->EE_Event) && $event->EE_Event instanceof EE_Event) {
131
+				$this->event = $event->EE_Event;
132
+			} elseif ($event->post_type === 'espresso_events') {
133
+				$event->EE_Event = EEM_Event::instance()->instantiate_class_from_post_object($event);
134
+				$this->event = $event->EE_Event;
135
+			}
136
+		} else {
137
+			$user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso');
138
+			$dev_msg = $user_msg . __(
139
+				'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.',
140
+				'event_espresso'
141
+			);
142
+			EE_Error::add_error($user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__);
143
+			return false;
144
+		}
145
+		return true;
146
+	}
147
+
148
+
149
+	/**
150
+	 * @return int
151
+	 */
152
+	public function getMaxAttendees()
153
+	{
154
+		return $this->max_attendees;
155
+	}
156
+
157
+
158
+	/**
159
+	 * @param int $max_attendees
160
+	 */
161
+	public function setMaxAttendees($max_attendees)
162
+	{
163
+		$this->max_attendees = absint(
164
+			apply_filters(
165
+				'FHEE__EE_Ticket_Selector__display_ticket_selector__max_tickets',
166
+				$max_attendees
167
+			)
168
+		);
169
+	}
170
+
171
+
172
+	/**
173
+	 * Returns whether or not the full ticket selector should be shown or not.
174
+	 * Currently, it displays on the frontend (including ajax requests) but not the backend
175
+	 *
176
+	 * @return bool
177
+	 */
178
+	private function display_full_ui()
179
+	{
180
+		if ($this->display_full_ui === null) {
181
+			$this->display_full_ui = ! is_admin() || (defined('DOING_AJAX') && DOING_AJAX);
182
+		}
183
+		return $this->display_full_ui;
184
+	}
185
+
186
+
187
+	/**
188
+	 * creates buttons for selecting number of attendees for an event
189
+	 *
190
+	 * @param WP_Post|int $event
191
+	 * @param bool        $view_details
192
+	 * @return string
193
+	 * @throws EE_Error
194
+	 * @throws InvalidArgumentException
195
+	 * @throws InvalidDataTypeException
196
+	 * @throws InvalidInterfaceException
197
+	 */
198
+	public function display($event = null, $view_details = false)
199
+	{
200
+		// reset filter for displaying submit button
201
+		remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
202
+		// poke and prod incoming event till it tells us what it is
203
+		if (! $this->setEvent($event)) {
204
+			return false;
205
+		}
206
+		// begin gathering template arguments by getting event status
207
+		$template_args = array('event_status' => $this->event->get_active_status());
208
+		if ($this->activeEventAndShowTicketSelector(
209
+			$event,
210
+			$template_args['event_status'],
211
+			$view_details
212
+		)) {
213
+			return ! is_single() ? $this->displayViewDetailsButton() : '';
214
+		}
215
+		// filter the maximum qty that can appear in the Ticket Selector qty dropdowns
216
+		$this->setMaxAttendees($this->event->additional_limit());
217
+		if ($this->getMaxAttendees() < 1) {
218
+			return $this->ticketSalesClosedMessage();
219
+		}
220
+		// is the event expired ?
221
+		$template_args['event_is_expired'] = ! is_admin() ? $this->event->is_expired() : false;
222
+		if ($template_args['event_is_expired']) {
223
+			return $this->expiredEventMessage();
224
+		}
225
+		// get all tickets for this event ordered by the datetime
226
+		$tickets = $this->getTickets();
227
+		if (count($tickets) < 1) {
228
+			return $this->noTicketAvailableMessage();
229
+		}
230
+		// redirecting to another site for registration ??
231
+		$external_url = (string) $this->event->external_url()
232
+			&& $this->event->external_url() !== get_the_permalink()
233
+			? $this->event->external_url()
234
+			: '';
235
+		// if redirecting to another site for registration, then we don't load the TS
236
+		$ticket_selector = $external_url
237
+			? $this->externalEventRegistration()
238
+			: $this->loadTicketSelector($tickets, $template_args);
239
+		// now set up the form (but not for the admin)
240
+		$ticket_selector = $this->display_full_ui()
241
+			? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector
242
+			: $ticket_selector;
243
+		// submit button and form close tag
244
+		$ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : '';
245
+		return $ticket_selector;
246
+	}
247
+
248
+
249
+	/**
250
+	 * displayTicketSelector
251
+	 * examines the event properties and determines whether a Ticket Selector should be displayed
252
+	 *
253
+	 * @param WP_Post|int $event
254
+	 * @param string      $_event_active_status
255
+	 * @param bool        $view_details
256
+	 * @return bool
257
+	 * @throws EE_Error
258
+	 */
259
+	protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details)
260
+	{
261
+		$event_post = $this->event instanceof EE_Event ? $this->event->ID() : $event;
262
+		return $this->display_full_ui()
263
+			   && (
264
+				   ! $this->event->display_ticket_selector()
265
+				   || $view_details
266
+				   || post_password_required($event_post)
267
+				   || (
268
+					   $_event_active_status !== EE_Datetime::active
269
+					   && $_event_active_status !== EE_Datetime::upcoming
270
+					   && $_event_active_status !== EE_Datetime::sold_out
271
+					   && ! (
272
+						   $_event_active_status === EE_Datetime::inactive
273
+						   && is_user_logged_in()
274
+					   )
275
+				   )
276
+			   );
277
+	}
278
+
279
+
280
+	/**
281
+	 * noTicketAvailableMessage
282
+	 * notice displayed if event is expired
283
+	 *
284
+	 * @return string
285
+	 * @throws EE_Error
286
+	 */
287
+	protected function expiredEventMessage()
288
+	{
289
+		return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__(
290
+			'We\'re sorry, but all tickets sales have ended because the event is expired.',
291
+			'event_espresso'
292
+		) . '</span></div><!-- .ee-event-expired-notice -->';
293
+	}
294
+
295
+
296
+	/**
297
+	 * noTicketAvailableMessage
298
+	 * notice displayed if event has no more tickets available
299
+	 *
300
+	 * @return string
301
+	 * @throws EE_Error
302
+	 */
303
+	protected function noTicketAvailableMessage()
304
+	{
305
+		$no_ticket_available_msg = esc_html__('We\'re sorry, but all ticket sales have ended.', 'event_espresso');
306
+		if (current_user_can('edit_post', $this->event->ID())) {
307
+			$no_ticket_available_msg .= sprintf(
308
+				esc_html__(
309
+					'%1$sNote to Event Admin:%2$sNo tickets were found for this event. This effectively turns off ticket sales. Please ensure that at least one ticket is available for if you want people to be able to register.%3$s(click to edit this event)%4$s',
310
+					'event_espresso'
311
+				),
312
+				'<div class="ee-attention" style="text-align: left;"><b>',
313
+				'</b><br />',
314
+				'<span class="edit-link"><a class="post-edit-link" href="'
315
+				. get_edit_post_link($this->event->ID())
316
+				. '">',
317
+				'</a></span></div><!-- .ee-attention noTicketAvailableMessage -->'
318
+			);
319
+		}
320
+		return '
321 321
             <div class="ee-event-expired-notice">
322 322
                 <span class="important-notice">' . $no_ticket_available_msg . '</span>
323 323
             </div><!-- .ee-event-expired-notice -->';
324
-    }
325
-
326
-
327
-    /**
328
-     * ticketSalesClosed
329
-     * notice displayed if event ticket sales are turned off
330
-     *
331
-     * @return string
332
-     * @throws EE_Error
333
-     */
334
-    protected function ticketSalesClosedMessage()
335
-    {
336
-        $sales_closed_msg = esc_html__(
337
-            'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.',
338
-            'event_espresso'
339
-        );
340
-        if (current_user_can('edit_post', $this->event->ID())) {
341
-            $sales_closed_msg .= sprintf(
342
-                esc_html__(
343
-                    '%sNote to Event Admin:%sThe "Maximum number of tickets allowed per order for this event" in the Event Registration Options has been set to "0". This effectively turns off ticket sales. %s(click to edit this event)%s',
344
-                    'event_espresso'
345
-                ),
346
-                '<div class="ee-attention" style="text-align: left;"><b>',
347
-                '</b><br />',
348
-                '<span class="edit-link"><a class="post-edit-link" href="'
349
-                . get_edit_post_link($this->event->ID())
350
-                . '">',
351
-                '</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->'
352
-            );
353
-        }
354
-        return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>';
355
-    }
356
-
357
-
358
-    /**
359
-     * getTickets
360
-     *
361
-     * @return \EE_Base_Class[]|\EE_Ticket[]
362
-     * @throws EE_Error
363
-     * @throws InvalidDataTypeException
364
-     * @throws InvalidInterfaceException
365
-     * @throws InvalidArgumentException
366
-     */
367
-    protected function getTickets()
368
-    {
369
-        $show_expired_tickets = is_admin() || (
370
-            EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
371
-            && EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets
372
-        );
373
-
374
-        $ticket_query_args = array(
375
-            array('Datetime.EVT_ID' => $this->event->ID()),
376
-            'order_by' => array(
377
-                'TKT_order'              => 'ASC',
378
-                'TKT_required'           => 'DESC',
379
-                'TKT_start_date'         => 'ASC',
380
-                'TKT_end_date'           => 'ASC',
381
-                'Datetime.DTT_EVT_start' => 'DESC',
382
-            ),
383
-        );
384
-        if (! $show_expired_tickets) {
385
-            // use the correct applicable time query depending on what version of core is being run.
386
-            $current_time = method_exists('EEM_Datetime', 'current_time_for_query')
387
-                ? time()
388
-                : current_time('timestamp');
389
-            $ticket_query_args[0]['TKT_end_date'] = array('>', $current_time);
390
-        }
391
-        return EEM_Ticket::instance()->get_all($ticket_query_args);
392
-    }
393
-
394
-
395
-    /**
396
-     * loadTicketSelector
397
-     * begins to assemble template arguments
398
-     * and decides whether to load a "simple" ticket selector, or the standard
399
-     *
400
-     * @param \EE_Ticket[] $tickets
401
-     * @param array        $template_args
402
-     * @return string
403
-     * @throws EE_Error
404
-     */
405
-    protected function loadTicketSelector(array $tickets, array $template_args)
406
-    {
407
-        $template_args['event'] = $this->event;
408
-        $template_args['EVT_ID'] = $this->event->ID();
409
-        $template_args['event_is_expired'] = $this->event->is_expired();
410
-        $template_args['max_atndz'] = $this->getMaxAttendees();
411
-        $template_args['date_format'] = $this->date_format;
412
-        $template_args['time_format'] = $this->time_format;
413
-        /**
414
-         * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected
415
-         *
416
-         * @since 4.9.13
417
-         * @param     string  '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to
418
-         * @param int $EVT_ID The Event ID
419
-         */
420
-        $template_args['anchor_id'] = apply_filters(
421
-            'FHEE__EE_Ticket_Selector__redirect_anchor_id',
422
-            '#tkt-slctr-tbl-' . $this->event->ID(),
423
-            $this->event->ID()
424
-        );
425
-        $template_args['tickets'] = $tickets;
426
-        $template_args['ticket_count'] = count($tickets);
427
-        $ticket_selector = $this->simpleTicketSelector($tickets, $template_args);
428
-        return $ticket_selector instanceof TicketSelectorSimple
429
-            ? $ticket_selector
430
-            : new TicketSelectorStandard(
431
-                $this->event,
432
-                $tickets,
433
-                $this->getMaxAttendees(),
434
-                $template_args,
435
-                $this->date_format,
436
-                $this->time_format
437
-            );
438
-    }
439
-
440
-
441
-    /**
442
-     * simpleTicketSelector
443
-     * there's one ticket, and max attendees is set to one,
444
-     * so if the event is free, then this is a "simple" ticket selector
445
-     * a.k.a. "Dude Where's my Ticket Selector?"
446
-     *
447
-     * @param \EE_Ticket[] $tickets
448
-     * @param array        $template_args
449
-     * @return string
450
-     * @throws EE_Error
451
-     */
452
-    protected function simpleTicketSelector($tickets, array $template_args)
453
-    {
454
-        // if there is only ONE ticket with a max qty of ONE
455
-        if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) {
456
-            return '';
457
-        }
458
-        /** @var \EE_Ticket $ticket */
459
-        $ticket = reset($tickets);
460
-        // if the ticket is free... then not much need for the ticket selector
461
-        if (apply_filters(
462
-            'FHEE__ticket_selector_chart_template__hide_ticket_selector',
463
-            $ticket->is_free(),
464
-            $this->event->ID()
465
-        )) {
466
-            return new TicketSelectorSimple(
467
-                $this->event,
468
-                $ticket,
469
-                $this->getMaxAttendees(),
470
-                $template_args
471
-            );
472
-        }
473
-        return '';
474
-    }
475
-
476
-
477
-    /**
478
-     * externalEventRegistration
479
-     *
480
-     * @return string
481
-     */
482
-    public function externalEventRegistration()
483
-    {
484
-        // if not we still need to trigger the display of the submit button
485
-        add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
486
-        // display notice to admin that registration is external
487
-        return $this->display_full_ui()
488
-            ? esc_html__(
489
-                'Registration is at an external URL for this event.',
490
-                'event_espresso'
491
-            )
492
-            : '';
493
-    }
494
-
495
-
496
-    /**
497
-     * formOpen
498
-     *
499
-     * @param        int    $ID
500
-     * @param        string $external_url
501
-     * @return        string
502
-     */
503
-    public function formOpen($ID = 0, $external_url = '')
504
-    {
505
-        // if redirecting, we don't need any anything else
506
-        if ($external_url) {
507
-            $html = '<form method="GET" ';
508
-            $html .= 'action="' . EEH_URL::refactor_url($external_url) . '" ';
509
-            $html .= 'name="ticket-selector-form-' . $ID . '"';
510
-            // open link in new window ?
511
-            $html .= apply_filters(
512
-                'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank',
513
-                $this->isIframe(),
514
-                $this
515
-            )
516
-                ? ' target="_blank"'
517
-                : '';
518
-            $html .= '>';
519
-            $query_args = EEH_URL::get_query_string($external_url);
520
-            foreach ((array) $query_args as $query_arg => $value) {
521
-                $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">';
522
-            }
523
-            return $html;
524
-        }
525
-        // if there is no submit button, then don't start building a form
526
-        // because the "View Details" button will build its own form
527
-        if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
528
-            return '';
529
-        }
530
-        $checkout_url = EEH_Event_View::event_link_url($ID);
531
-        if (! $checkout_url) {
532
-            EE_Error::add_error(
533
-                esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
534
-                __FILE__,
535
-                __FUNCTION__,
536
-                __LINE__
537
-            );
538
-        }
539
-        // set no cache headers and constants
540
-        EE_System::do_not_cache();
541
-        $html = '<form method="POST" ';
542
-        $html .= 'action="' . $checkout_url . '" ';
543
-        $html .= 'name="ticket-selector-form-' . $ID . '"';
544
-        $html .= $this->iframe ? ' target="_blank"' : '';
545
-        $html .= '>';
546
-        $html .= '<input type="hidden" name="ee" value="process_ticket_selections">';
547
-        $html = apply_filters('FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event);
548
-        return $html;
549
-    }
550
-
551
-
552
-    /**
553
-     * displaySubmitButton
554
-     *
555
-     * @param  string $external_url
556
-     * @return string
557
-     * @throws EE_Error
558
-     */
559
-    public function displaySubmitButton($external_url = '')
560
-    {
561
-        $html = '';
562
-        if ($this->display_full_ui()) {
563
-            // standard TS displayed with submit button, ie: "Register Now"
564
-            if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
565
-                $html .= $this->displayRegisterNowButton();
566
-                $html .= empty($external_url)
567
-                    ? $this->ticketSelectorEndDiv()
568
-                    : $this->clearTicketSelector();
569
-                $html .= '<br/>' . $this->formClose();
570
-            } elseif ($this->getMaxAttendees() === 1) {
571
-                // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1)
572
-                if ($this->event->is_sold_out()) {
573
-                    // then instead of a View Details or Submit button, just display a "Sold Out" message
574
-                    $html .= apply_filters(
575
-                        'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg',
576
-                        sprintf(
577
-                            __(
578
-                                '%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s',
579
-                                'event_espresso'
580
-                            ),
581
-                            '<p class="no-ticket-selector-msg clear-float">',
582
-                            $this->event->name(),
583
-                            '</p>',
584
-                            '<br />'
585
-                        ),
586
-                        $this->event
587
-                    );
588
-                    if (apply_filters(
589
-                        'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button',
590
-                        false,
591
-                        $this->event
592
-                    )) {
593
-                        $html .= $this->displayRegisterNowButton();
594
-                    }
595
-                    // sold out DWMTS event, no TS, no submit or view details button, but has additional content
596
-                    $html .= $this->ticketSelectorEndDiv();
597
-                } elseif (apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false)
598
-                          && ! is_single()
599
-                ) {
600
-                    // this is a "Dude Where's my Ticket Selector?" (DWMTS) type event,
601
-                    // but no tickets are available, so display event's "View Details" button.
602
-                    // it is being viewed via somewhere other than a single post
603
-                    $html .= $this->displayViewDetailsButton(true);
604
-                } else {
605
-                    $html .= $this->ticketSelectorEndDiv();
606
-                }
607
-            } elseif (is_archive()) {
608
-                // event list, no tickets available so display event's "View Details" button
609
-                $html .= $this->ticketSelectorEndDiv();
610
-                $html .= $this->displayViewDetailsButton();
611
-            } else {
612
-                if (apply_filters(
613
-                    'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button',
614
-                    false,
615
-                    $this->event
616
-                )) {
617
-                    $html .= $this->displayRegisterNowButton();
618
-                }
619
-                // no submit or view details button, and no additional content
620
-                $html .= $this->ticketSelectorEndDiv();
621
-            }
622
-            if (! $this->iframe && ! is_archive()) {
623
-                $html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector'));
624
-            }
625
-        }
626
-        return apply_filters(
627
-            'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displaySubmitButton__html',
628
-            $html,
629
-            $this->event,
630
-            $this
631
-        );
632
-    }
633
-
634
-
635
-    /**
636
-     * @return string
637
-     * @throws EE_Error
638
-     */
639
-    public function displayRegisterNowButton()
640
-    {
641
-        $btn_text = apply_filters(
642
-            'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text',
643
-            __('Register Now', 'event_espresso'),
644
-            $this->event
645
-        );
646
-        $external_url = (string) $this->event->external_url()
647
-            && $this->event->external_url() !== get_the_permalink()
648
-            ? $this->event->external_url()
649
-            : '';
650
-        $html = EEH_HTML::div(
651
-            '',
652
-            'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap',
653
-            'ticket-selector-submit-btn-wrap'
654
-        );
655
-        $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"';
656
-        $html .= ' class="ticket-selector-submit-btn ';
657
-        $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"';
658
-        $html .= ' type="submit" value="' . $btn_text . '" />';
659
-        $html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->';
660
-        $html .= apply_filters(
661
-            'FHEE__EE_Ticket_Selector__after_ticket_selector_submit',
662
-            '',
663
-            $this->event,
664
-            $this->iframe
665
-        );
666
-        return $html;
667
-    }
668
-
669
-
670
-    /**
671
-     * displayViewDetailsButton
672
-     *
673
-     * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event
674
-     *                    (ie: $_max_atndz === 1) where there are no available tickets,
675
-     *                    either because they are sold out, expired, or not yet on sale.
676
-     *                    In this case, we need to close the form BEFORE adding any closing divs
677
-     * @return string
678
-     * @throws EE_Error
679
-     */
680
-    public function displayViewDetailsButton($DWMTS = false)
681
-    {
682
-        if (! $this->event->get_permalink()) {
683
-            EE_Error::add_error(
684
-                esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
685
-                __FILE__,
686
-                __FUNCTION__,
687
-                __LINE__
688
-            );
689
-        }
690
-        $view_details_btn = '<form method="POST" action="';
691
-        $view_details_btn .= apply_filters(
692
-            'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url',
693
-            $this->event->get_permalink(),
694
-            $this->event
695
-        );
696
-        $view_details_btn .= '"';
697
-        // open link in new window ?
698
-        $view_details_btn .= apply_filters(
699
-            'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank',
700
-            $this->isIframe(),
701
-            $this
702
-        )
703
-            ? ' target="_blank"'
704
-            : '';
705
-        $view_details_btn .= '>';
706
-        $btn_text = apply_filters(
707
-            'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text',
708
-            esc_html__('View Details', 'event_espresso'),
709
-            $this->event
710
-        );
711
-        $view_details_btn .= '<input id="ticket-selector-submit-'
712
-                             . $this->event->ID()
713
-                             . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="'
714
-                             . $btn_text
715
-                             . '" />';
716
-        $view_details_btn .= apply_filters('FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event);
717
-        if ($DWMTS) {
718
-            $view_details_btn .= $this->formClose();
719
-            $view_details_btn .= $this->ticketSelectorEndDiv();
720
-            $view_details_btn .= '<br/>';
721
-        } else {
722
-            $view_details_btn .= $this->clearTicketSelector();
723
-            $view_details_btn .= '<br/>';
724
-            $view_details_btn .= $this->formClose();
725
-        }
726
-        return $view_details_btn;
727
-    }
728
-
729
-
730
-    /**
731
-     * @return string
732
-     */
733
-    public function ticketSelectorEndDiv()
734
-    {
735
-        return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->';
736
-    }
737
-
738
-
739
-    /**
740
-     * @return string
741
-     */
742
-    public function clearTicketSelector()
743
-    {
744
-        // standard TS displayed, appears after a "Register Now" or "view Details" button
745
-        return '<div class="clear"></div><!-- clearTicketSelector -->';
746
-    }
747
-
748
-
749
-    /**
750
-     * @access        public
751
-     * @return        string
752
-     */
753
-    public function formClose()
754
-    {
755
-        return '</form>';
756
-    }
324
+	}
325
+
326
+
327
+	/**
328
+	 * ticketSalesClosed
329
+	 * notice displayed if event ticket sales are turned off
330
+	 *
331
+	 * @return string
332
+	 * @throws EE_Error
333
+	 */
334
+	protected function ticketSalesClosedMessage()
335
+	{
336
+		$sales_closed_msg = esc_html__(
337
+			'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.',
338
+			'event_espresso'
339
+		);
340
+		if (current_user_can('edit_post', $this->event->ID())) {
341
+			$sales_closed_msg .= sprintf(
342
+				esc_html__(
343
+					'%sNote to Event Admin:%sThe "Maximum number of tickets allowed per order for this event" in the Event Registration Options has been set to "0". This effectively turns off ticket sales. %s(click to edit this event)%s',
344
+					'event_espresso'
345
+				),
346
+				'<div class="ee-attention" style="text-align: left;"><b>',
347
+				'</b><br />',
348
+				'<span class="edit-link"><a class="post-edit-link" href="'
349
+				. get_edit_post_link($this->event->ID())
350
+				. '">',
351
+				'</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->'
352
+			);
353
+		}
354
+		return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>';
355
+	}
356
+
357
+
358
+	/**
359
+	 * getTickets
360
+	 *
361
+	 * @return \EE_Base_Class[]|\EE_Ticket[]
362
+	 * @throws EE_Error
363
+	 * @throws InvalidDataTypeException
364
+	 * @throws InvalidInterfaceException
365
+	 * @throws InvalidArgumentException
366
+	 */
367
+	protected function getTickets()
368
+	{
369
+		$show_expired_tickets = is_admin() || (
370
+			EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
371
+			&& EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets
372
+		);
373
+
374
+		$ticket_query_args = array(
375
+			array('Datetime.EVT_ID' => $this->event->ID()),
376
+			'order_by' => array(
377
+				'TKT_order'              => 'ASC',
378
+				'TKT_required'           => 'DESC',
379
+				'TKT_start_date'         => 'ASC',
380
+				'TKT_end_date'           => 'ASC',
381
+				'Datetime.DTT_EVT_start' => 'DESC',
382
+			),
383
+		);
384
+		if (! $show_expired_tickets) {
385
+			// use the correct applicable time query depending on what version of core is being run.
386
+			$current_time = method_exists('EEM_Datetime', 'current_time_for_query')
387
+				? time()
388
+				: current_time('timestamp');
389
+			$ticket_query_args[0]['TKT_end_date'] = array('>', $current_time);
390
+		}
391
+		return EEM_Ticket::instance()->get_all($ticket_query_args);
392
+	}
393
+
394
+
395
+	/**
396
+	 * loadTicketSelector
397
+	 * begins to assemble template arguments
398
+	 * and decides whether to load a "simple" ticket selector, or the standard
399
+	 *
400
+	 * @param \EE_Ticket[] $tickets
401
+	 * @param array        $template_args
402
+	 * @return string
403
+	 * @throws EE_Error
404
+	 */
405
+	protected function loadTicketSelector(array $tickets, array $template_args)
406
+	{
407
+		$template_args['event'] = $this->event;
408
+		$template_args['EVT_ID'] = $this->event->ID();
409
+		$template_args['event_is_expired'] = $this->event->is_expired();
410
+		$template_args['max_atndz'] = $this->getMaxAttendees();
411
+		$template_args['date_format'] = $this->date_format;
412
+		$template_args['time_format'] = $this->time_format;
413
+		/**
414
+		 * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected
415
+		 *
416
+		 * @since 4.9.13
417
+		 * @param     string  '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to
418
+		 * @param int $EVT_ID The Event ID
419
+		 */
420
+		$template_args['anchor_id'] = apply_filters(
421
+			'FHEE__EE_Ticket_Selector__redirect_anchor_id',
422
+			'#tkt-slctr-tbl-' . $this->event->ID(),
423
+			$this->event->ID()
424
+		);
425
+		$template_args['tickets'] = $tickets;
426
+		$template_args['ticket_count'] = count($tickets);
427
+		$ticket_selector = $this->simpleTicketSelector($tickets, $template_args);
428
+		return $ticket_selector instanceof TicketSelectorSimple
429
+			? $ticket_selector
430
+			: new TicketSelectorStandard(
431
+				$this->event,
432
+				$tickets,
433
+				$this->getMaxAttendees(),
434
+				$template_args,
435
+				$this->date_format,
436
+				$this->time_format
437
+			);
438
+	}
439
+
440
+
441
+	/**
442
+	 * simpleTicketSelector
443
+	 * there's one ticket, and max attendees is set to one,
444
+	 * so if the event is free, then this is a "simple" ticket selector
445
+	 * a.k.a. "Dude Where's my Ticket Selector?"
446
+	 *
447
+	 * @param \EE_Ticket[] $tickets
448
+	 * @param array        $template_args
449
+	 * @return string
450
+	 * @throws EE_Error
451
+	 */
452
+	protected function simpleTicketSelector($tickets, array $template_args)
453
+	{
454
+		// if there is only ONE ticket with a max qty of ONE
455
+		if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) {
456
+			return '';
457
+		}
458
+		/** @var \EE_Ticket $ticket */
459
+		$ticket = reset($tickets);
460
+		// if the ticket is free... then not much need for the ticket selector
461
+		if (apply_filters(
462
+			'FHEE__ticket_selector_chart_template__hide_ticket_selector',
463
+			$ticket->is_free(),
464
+			$this->event->ID()
465
+		)) {
466
+			return new TicketSelectorSimple(
467
+				$this->event,
468
+				$ticket,
469
+				$this->getMaxAttendees(),
470
+				$template_args
471
+			);
472
+		}
473
+		return '';
474
+	}
475
+
476
+
477
+	/**
478
+	 * externalEventRegistration
479
+	 *
480
+	 * @return string
481
+	 */
482
+	public function externalEventRegistration()
483
+	{
484
+		// if not we still need to trigger the display of the submit button
485
+		add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
486
+		// display notice to admin that registration is external
487
+		return $this->display_full_ui()
488
+			? esc_html__(
489
+				'Registration is at an external URL for this event.',
490
+				'event_espresso'
491
+			)
492
+			: '';
493
+	}
494
+
495
+
496
+	/**
497
+	 * formOpen
498
+	 *
499
+	 * @param        int    $ID
500
+	 * @param        string $external_url
501
+	 * @return        string
502
+	 */
503
+	public function formOpen($ID = 0, $external_url = '')
504
+	{
505
+		// if redirecting, we don't need any anything else
506
+		if ($external_url) {
507
+			$html = '<form method="GET" ';
508
+			$html .= 'action="' . EEH_URL::refactor_url($external_url) . '" ';
509
+			$html .= 'name="ticket-selector-form-' . $ID . '"';
510
+			// open link in new window ?
511
+			$html .= apply_filters(
512
+				'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank',
513
+				$this->isIframe(),
514
+				$this
515
+			)
516
+				? ' target="_blank"'
517
+				: '';
518
+			$html .= '>';
519
+			$query_args = EEH_URL::get_query_string($external_url);
520
+			foreach ((array) $query_args as $query_arg => $value) {
521
+				$html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">';
522
+			}
523
+			return $html;
524
+		}
525
+		// if there is no submit button, then don't start building a form
526
+		// because the "View Details" button will build its own form
527
+		if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
528
+			return '';
529
+		}
530
+		$checkout_url = EEH_Event_View::event_link_url($ID);
531
+		if (! $checkout_url) {
532
+			EE_Error::add_error(
533
+				esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
534
+				__FILE__,
535
+				__FUNCTION__,
536
+				__LINE__
537
+			);
538
+		}
539
+		// set no cache headers and constants
540
+		EE_System::do_not_cache();
541
+		$html = '<form method="POST" ';
542
+		$html .= 'action="' . $checkout_url . '" ';
543
+		$html .= 'name="ticket-selector-form-' . $ID . '"';
544
+		$html .= $this->iframe ? ' target="_blank"' : '';
545
+		$html .= '>';
546
+		$html .= '<input type="hidden" name="ee" value="process_ticket_selections">';
547
+		$html = apply_filters('FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event);
548
+		return $html;
549
+	}
550
+
551
+
552
+	/**
553
+	 * displaySubmitButton
554
+	 *
555
+	 * @param  string $external_url
556
+	 * @return string
557
+	 * @throws EE_Error
558
+	 */
559
+	public function displaySubmitButton($external_url = '')
560
+	{
561
+		$html = '';
562
+		if ($this->display_full_ui()) {
563
+			// standard TS displayed with submit button, ie: "Register Now"
564
+			if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
565
+				$html .= $this->displayRegisterNowButton();
566
+				$html .= empty($external_url)
567
+					? $this->ticketSelectorEndDiv()
568
+					: $this->clearTicketSelector();
569
+				$html .= '<br/>' . $this->formClose();
570
+			} elseif ($this->getMaxAttendees() === 1) {
571
+				// its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1)
572
+				if ($this->event->is_sold_out()) {
573
+					// then instead of a View Details or Submit button, just display a "Sold Out" message
574
+					$html .= apply_filters(
575
+						'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg',
576
+						sprintf(
577
+							__(
578
+								'%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s',
579
+								'event_espresso'
580
+							),
581
+							'<p class="no-ticket-selector-msg clear-float">',
582
+							$this->event->name(),
583
+							'</p>',
584
+							'<br />'
585
+						),
586
+						$this->event
587
+					);
588
+					if (apply_filters(
589
+						'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button',
590
+						false,
591
+						$this->event
592
+					)) {
593
+						$html .= $this->displayRegisterNowButton();
594
+					}
595
+					// sold out DWMTS event, no TS, no submit or view details button, but has additional content
596
+					$html .= $this->ticketSelectorEndDiv();
597
+				} elseif (apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false)
598
+						  && ! is_single()
599
+				) {
600
+					// this is a "Dude Where's my Ticket Selector?" (DWMTS) type event,
601
+					// but no tickets are available, so display event's "View Details" button.
602
+					// it is being viewed via somewhere other than a single post
603
+					$html .= $this->displayViewDetailsButton(true);
604
+				} else {
605
+					$html .= $this->ticketSelectorEndDiv();
606
+				}
607
+			} elseif (is_archive()) {
608
+				// event list, no tickets available so display event's "View Details" button
609
+				$html .= $this->ticketSelectorEndDiv();
610
+				$html .= $this->displayViewDetailsButton();
611
+			} else {
612
+				if (apply_filters(
613
+					'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button',
614
+					false,
615
+					$this->event
616
+				)) {
617
+					$html .= $this->displayRegisterNowButton();
618
+				}
619
+				// no submit or view details button, and no additional content
620
+				$html .= $this->ticketSelectorEndDiv();
621
+			}
622
+			if (! $this->iframe && ! is_archive()) {
623
+				$html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector'));
624
+			}
625
+		}
626
+		return apply_filters(
627
+			'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displaySubmitButton__html',
628
+			$html,
629
+			$this->event,
630
+			$this
631
+		);
632
+	}
633
+
634
+
635
+	/**
636
+	 * @return string
637
+	 * @throws EE_Error
638
+	 */
639
+	public function displayRegisterNowButton()
640
+	{
641
+		$btn_text = apply_filters(
642
+			'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text',
643
+			__('Register Now', 'event_espresso'),
644
+			$this->event
645
+		);
646
+		$external_url = (string) $this->event->external_url()
647
+			&& $this->event->external_url() !== get_the_permalink()
648
+			? $this->event->external_url()
649
+			: '';
650
+		$html = EEH_HTML::div(
651
+			'',
652
+			'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap',
653
+			'ticket-selector-submit-btn-wrap'
654
+		);
655
+		$html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"';
656
+		$html .= ' class="ticket-selector-submit-btn ';
657
+		$html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"';
658
+		$html .= ' type="submit" value="' . $btn_text . '" />';
659
+		$html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->';
660
+		$html .= apply_filters(
661
+			'FHEE__EE_Ticket_Selector__after_ticket_selector_submit',
662
+			'',
663
+			$this->event,
664
+			$this->iframe
665
+		);
666
+		return $html;
667
+	}
668
+
669
+
670
+	/**
671
+	 * displayViewDetailsButton
672
+	 *
673
+	 * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event
674
+	 *                    (ie: $_max_atndz === 1) where there are no available tickets,
675
+	 *                    either because they are sold out, expired, or not yet on sale.
676
+	 *                    In this case, we need to close the form BEFORE adding any closing divs
677
+	 * @return string
678
+	 * @throws EE_Error
679
+	 */
680
+	public function displayViewDetailsButton($DWMTS = false)
681
+	{
682
+		if (! $this->event->get_permalink()) {
683
+			EE_Error::add_error(
684
+				esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
685
+				__FILE__,
686
+				__FUNCTION__,
687
+				__LINE__
688
+			);
689
+		}
690
+		$view_details_btn = '<form method="POST" action="';
691
+		$view_details_btn .= apply_filters(
692
+			'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url',
693
+			$this->event->get_permalink(),
694
+			$this->event
695
+		);
696
+		$view_details_btn .= '"';
697
+		// open link in new window ?
698
+		$view_details_btn .= apply_filters(
699
+			'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank',
700
+			$this->isIframe(),
701
+			$this
702
+		)
703
+			? ' target="_blank"'
704
+			: '';
705
+		$view_details_btn .= '>';
706
+		$btn_text = apply_filters(
707
+			'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text',
708
+			esc_html__('View Details', 'event_espresso'),
709
+			$this->event
710
+		);
711
+		$view_details_btn .= '<input id="ticket-selector-submit-'
712
+							 . $this->event->ID()
713
+							 . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="'
714
+							 . $btn_text
715
+							 . '" />';
716
+		$view_details_btn .= apply_filters('FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event);
717
+		if ($DWMTS) {
718
+			$view_details_btn .= $this->formClose();
719
+			$view_details_btn .= $this->ticketSelectorEndDiv();
720
+			$view_details_btn .= '<br/>';
721
+		} else {
722
+			$view_details_btn .= $this->clearTicketSelector();
723
+			$view_details_btn .= '<br/>';
724
+			$view_details_btn .= $this->formClose();
725
+		}
726
+		return $view_details_btn;
727
+	}
728
+
729
+
730
+	/**
731
+	 * @return string
732
+	 */
733
+	public function ticketSelectorEndDiv()
734
+	{
735
+		return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->';
736
+	}
737
+
738
+
739
+	/**
740
+	 * @return string
741
+	 */
742
+	public function clearTicketSelector()
743
+	{
744
+		// standard TS displayed, appears after a "Register Now" or "view Details" button
745
+		return '<div class="clear"></div><!-- clearTicketSelector -->';
746
+	}
747
+
748
+
749
+	/**
750
+	 * @access        public
751
+	 * @return        string
752
+	 */
753
+	public function formClose()
754
+	{
755
+		return '</form>';
756
+	}
757 757
 }
Please login to merge, or discard this patch.
Spacing   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -135,11 +135,11 @@  discard block
 block discarded – undo
135 135
             }
136 136
         } else {
137 137
             $user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso');
138
-            $dev_msg = $user_msg . __(
138
+            $dev_msg = $user_msg.__(
139 139
                 'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.',
140 140
                 'event_espresso'
141 141
             );
142
-            EE_Error::add_error($user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__);
142
+            EE_Error::add_error($user_msg.'||'.$dev_msg, __FILE__, __FUNCTION__, __LINE__);
143 143
             return false;
144 144
         }
145 145
         return true;
@@ -200,7 +200,7 @@  discard block
 block discarded – undo
200 200
         // reset filter for displaying submit button
201 201
         remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
202 202
         // poke and prod incoming event till it tells us what it is
203
-        if (! $this->setEvent($event)) {
203
+        if ( ! $this->setEvent($event)) {
204 204
             return false;
205 205
         }
206 206
         // begin gathering template arguments by getting event status
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
             : $this->loadTicketSelector($tickets, $template_args);
239 239
         // now set up the form (but not for the admin)
240 240
         $ticket_selector = $this->display_full_ui()
241
-            ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector
241
+            ? $this->formOpen($this->event->ID(), $external_url).$ticket_selector
242 242
             : $ticket_selector;
243 243
         // submit button and form close tag
244 244
         $ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : '';
@@ -286,10 +286,10 @@  discard block
 block discarded – undo
286 286
      */
287 287
     protected function expiredEventMessage()
288 288
     {
289
-        return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__(
289
+        return '<div class="ee-event-expired-notice"><span class="important-notice">'.esc_html__(
290 290
             'We\'re sorry, but all tickets sales have ended because the event is expired.',
291 291
             'event_espresso'
292
-        ) . '</span></div><!-- .ee-event-expired-notice -->';
292
+        ).'</span></div><!-- .ee-event-expired-notice -->';
293 293
     }
294 294
 
295 295
 
@@ -319,7 +319,7 @@  discard block
 block discarded – undo
319 319
         }
320 320
         return '
321 321
             <div class="ee-event-expired-notice">
322
-                <span class="important-notice">' . $no_ticket_available_msg . '</span>
322
+                <span class="important-notice">' . $no_ticket_available_msg.'</span>
323 323
             </div><!-- .ee-event-expired-notice -->';
324 324
     }
325 325
 
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
                 '</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->'
352 352
             );
353 353
         }
354
-        return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>';
354
+        return '<p><span class="important-notice">'.$sales_closed_msg.'</span></p>';
355 355
     }
356 356
 
357 357
 
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
                 'Datetime.DTT_EVT_start' => 'DESC',
382 382
             ),
383 383
         );
384
-        if (! $show_expired_tickets) {
384
+        if ( ! $show_expired_tickets) {
385 385
             // use the correct applicable time query depending on what version of core is being run.
386 386
             $current_time = method_exists('EEM_Datetime', 'current_time_for_query')
387 387
                 ? time()
@@ -419,7 +419,7 @@  discard block
 block discarded – undo
419 419
          */
420 420
         $template_args['anchor_id'] = apply_filters(
421 421
             'FHEE__EE_Ticket_Selector__redirect_anchor_id',
422
-            '#tkt-slctr-tbl-' . $this->event->ID(),
422
+            '#tkt-slctr-tbl-'.$this->event->ID(),
423 423
             $this->event->ID()
424 424
         );
425 425
         $template_args['tickets'] = $tickets;
@@ -505,8 +505,8 @@  discard block
 block discarded – undo
505 505
         // if redirecting, we don't need any anything else
506 506
         if ($external_url) {
507 507
             $html = '<form method="GET" ';
508
-            $html .= 'action="' . EEH_URL::refactor_url($external_url) . '" ';
509
-            $html .= 'name="ticket-selector-form-' . $ID . '"';
508
+            $html .= 'action="'.EEH_URL::refactor_url($external_url).'" ';
509
+            $html .= 'name="ticket-selector-form-'.$ID.'"';
510 510
             // open link in new window ?
511 511
             $html .= apply_filters(
512 512
                 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank',
@@ -518,17 +518,17 @@  discard block
 block discarded – undo
518 518
             $html .= '>';
519 519
             $query_args = EEH_URL::get_query_string($external_url);
520 520
             foreach ((array) $query_args as $query_arg => $value) {
521
-                $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">';
521
+                $html .= '<input type="hidden" name="'.$query_arg.'" value="'.$value.'">';
522 522
             }
523 523
             return $html;
524 524
         }
525 525
         // if there is no submit button, then don't start building a form
526 526
         // because the "View Details" button will build its own form
527
-        if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
527
+        if ( ! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) {
528 528
             return '';
529 529
         }
530 530
         $checkout_url = EEH_Event_View::event_link_url($ID);
531
-        if (! $checkout_url) {
531
+        if ( ! $checkout_url) {
532 532
             EE_Error::add_error(
533 533
                 esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
534 534
                 __FILE__,
@@ -539,8 +539,8 @@  discard block
 block discarded – undo
539 539
         // set no cache headers and constants
540 540
         EE_System::do_not_cache();
541 541
         $html = '<form method="POST" ';
542
-        $html .= 'action="' . $checkout_url . '" ';
543
-        $html .= 'name="ticket-selector-form-' . $ID . '"';
542
+        $html .= 'action="'.$checkout_url.'" ';
543
+        $html .= 'name="ticket-selector-form-'.$ID.'"';
544 544
         $html .= $this->iframe ? ' target="_blank"' : '';
545 545
         $html .= '>';
546 546
         $html .= '<input type="hidden" name="ee" value="process_ticket_selections">';
@@ -566,7 +566,7 @@  discard block
 block discarded – undo
566 566
                 $html .= empty($external_url)
567 567
                     ? $this->ticketSelectorEndDiv()
568 568
                     : $this->clearTicketSelector();
569
-                $html .= '<br/>' . $this->formClose();
569
+                $html .= '<br/>'.$this->formClose();
570 570
             } elseif ($this->getMaxAttendees() === 1) {
571 571
                 // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1)
572 572
                 if ($this->event->is_sold_out()) {
@@ -619,7 +619,7 @@  discard block
 block discarded – undo
619 619
                 // no submit or view details button, and no additional content
620 620
                 $html .= $this->ticketSelectorEndDiv();
621 621
             }
622
-            if (! $this->iframe && ! is_archive()) {
622
+            if ( ! $this->iframe && ! is_archive()) {
623 623
                 $html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector'));
624 624
             }
625 625
         }
@@ -649,14 +649,14 @@  discard block
 block discarded – undo
649 649
             : '';
650 650
         $html = EEH_HTML::div(
651 651
             '',
652
-            'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap',
652
+            'ticket-selector-submit-'.$this->event->ID().'-btn-wrap',
653 653
             'ticket-selector-submit-btn-wrap'
654 654
         );
655
-        $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"';
655
+        $html .= '<input id="ticket-selector-submit-'.$this->event->ID().'-btn"';
656 656
         $html .= ' class="ticket-selector-submit-btn ';
657 657
         $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"';
658
-        $html .= ' type="submit" value="' . $btn_text . '" />';
659
-        $html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->';
658
+        $html .= ' type="submit" value="'.$btn_text.'" />';
659
+        $html .= EEH_HTML::divx().'<!-- .ticket-selector-submit-btn-wrap -->';
660 660
         $html .= apply_filters(
661 661
             'FHEE__EE_Ticket_Selector__after_ticket_selector_submit',
662 662
             '',
@@ -679,7 +679,7 @@  discard block
 block discarded – undo
679 679
      */
680 680
     public function displayViewDetailsButton($DWMTS = false)
681 681
     {
682
-        if (! $this->event->get_permalink()) {
682
+        if ( ! $this->event->get_permalink()) {
683 683
             EE_Error::add_error(
684 684
                 esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'),
685 685
                 __FILE__,
@@ -732,7 +732,7 @@  discard block
 block discarded – undo
732 732
      */
733 733
     public function ticketSelectorEndDiv()
734 734
     {
735
-        return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->';
735
+        return $this->clearTicketSelector().'</div><!-- ticketSelectorEndDiv -->';
736 736
     }
737 737
 
738 738
 
Please login to merge, or discard this patch.
core/domain/services/admin/events/editor/AdvancedEditorEntityData.php 3 patches
Doc Comments   -4 removed lines patch added patch discarded remove patch
@@ -489,10 +489,6 @@
 block discarded – undo
489 489
 
490 490
 
491 491
     /**
492
-     * @param mixed       $source  The source that's passed down the GraphQL queries
493
-     * @param array       $args    The inputArgs on the field
494
-     * @param AppContext  $context The AppContext passed down the GraphQL tree
495
-     * @param ResolveInfo $info    The ResolveInfo passed down the GraphQL tree
496 492
      * @return string
497 493
      * @throws EE_Error
498 494
      * @throws Exception
Please login to merge, or discard this patch.
Indentation   +592 added lines, -592 removed lines patch added patch discarded remove patch
@@ -40,260 +40,260 @@  discard block
 block discarded – undo
40 40
 class AdvancedEditorEntityData
41 41
 {
42 42
 
43
-    /**
44
-     * @var EE_Event
45
-     */
46
-    protected $event;
47
-
48
-    /**
49
-     * @var RestApiSpoofer
50
-     */
51
-    protected $spoofer;
52
-
53
-    /**
54
-     * @var EE_Admin_Config
55
-     */
56
-    protected $admin_config;
57
-
58
-    /**
59
-     * @var EEM_Datetime $datetime_model
60
-     */
61
-    protected $datetime_model;
62
-
63
-    /**
64
-     * @var EEM_Event $event_model
65
-     */
66
-    protected $event_model;
67
-
68
-    /**
69
-     * @var EEM_Price $price_model
70
-     */
71
-    protected $price_model;
72
-
73
-    /**
74
-     * @var EEM_Price_Type $price_type_model
75
-     */
76
-    protected $price_type_model;
77
-
78
-    /**
79
-     * @var EEM_Ticket $ticket_model
80
-     */
81
-    protected $ticket_model;
82
-    /**
83
-     * @var EEM_Venue $venue_model
84
-     */
85
-    protected $venue_model;
86
-
87
-
88
-    /**
89
-     * AdvancedEditorAdminForm constructor.
90
-     *
91
-     * @param EE_Event        $event
92
-     * @param RestApiSpoofer  $spoofer
93
-     * @param EE_Admin_Config $admin_config
94
-     * @param EEM_Datetime    $datetime_model
95
-     * @param EEM_Event       $event_model
96
-     * @param EEM_Price       $price_model
97
-     * @param EEM_Price_Type  $price_type_model
98
-     * @param EEM_Ticket      $ticket_model
99
-     * @param EEM_Venue       $venue_model
100
-     */
101
-    public function __construct(
102
-        EE_Event $event,
103
-        RestApiSpoofer $spoofer,
104
-        EE_Admin_Config $admin_config,
105
-        EEM_Datetime $datetime_model,
106
-        EEM_Event $event_model,
107
-        EEM_Price $price_model,
108
-        EEM_Price_Type $price_type_model,
109
-        EEM_Ticket $ticket_model,
110
-        EEM_Venue $venue_model
111
-    ) {
112
-        $this->event = $event;
113
-        $this->admin_config = $admin_config;
114
-        $this->spoofer = $spoofer;
115
-        $this->datetime_model = $datetime_model;
116
-        $this->event_model = $event_model;
117
-        $this->price_model = $price_model;
118
-        $this->price_type_model = $price_type_model;
119
-        $this->ticket_model = $ticket_model;
120
-        $this->venue_model = $venue_model;
121
-        add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']);
122
-    }
123
-
124
-
125
-    /**
126
-     * @throws EE_Error
127
-     * @throws InvalidArgumentException
128
-     * @throws InvalidDataTypeException
129
-     * @throws InvalidInterfaceException
130
-     * @throws ModelConfigurationException
131
-     * @throws ReflectionException
132
-     * @throws RestException
133
-     * @throws RestPasswordIncorrectException
134
-     * @throws RestPasswordRequiredException
135
-     * @throws UnexpectedEntityException
136
-     * @throws DomainException
137
-     * @since $VID:$
138
-     */
139
-    public function loadScriptsStyles()
140
-    {
141
-        if ($this->admin_config->useAdvancedEditor()) {
142
-            $eventId = $this->event instanceof EE_Event ? $this->event->ID() : 0;
143
-            if (! $eventId) {
144
-                global $post;
145
-                $eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0;
146
-                $eventId = $eventId === 0 && $post instanceof WP_Post && $post->post_type === 'espresso_events'
147
-                    ? $post->ID
148
-                    : $eventId;
149
-            }
150
-            $graphqlEndpoint = class_exists('WPGraphQL') ? trailingslashit(site_url()) . Router::$route : '';
151
-            $graphqlEndpoint = esc_url($graphqlEndpoint);
152
-            if ($eventId) {
153
-                $data = $this->getAllEventData($eventId);
154
-                $data = wp_json_encode($data);
155
-                $GQLdata = $this->getGraphQLData($eventId);
156
-                $GQLdata = wp_json_encode($GQLdata);
157
-                add_action(
158
-                    'admin_footer',
159
-                    static function () use ($data, $graphqlEndpoint) {
160
-                        wp_add_inline_script(
161
-                            EspressoEditorAssetManager::JS_HANDLE_EDITOR,
162
-                            "
43
+	/**
44
+	 * @var EE_Event
45
+	 */
46
+	protected $event;
47
+
48
+	/**
49
+	 * @var RestApiSpoofer
50
+	 */
51
+	protected $spoofer;
52
+
53
+	/**
54
+	 * @var EE_Admin_Config
55
+	 */
56
+	protected $admin_config;
57
+
58
+	/**
59
+	 * @var EEM_Datetime $datetime_model
60
+	 */
61
+	protected $datetime_model;
62
+
63
+	/**
64
+	 * @var EEM_Event $event_model
65
+	 */
66
+	protected $event_model;
67
+
68
+	/**
69
+	 * @var EEM_Price $price_model
70
+	 */
71
+	protected $price_model;
72
+
73
+	/**
74
+	 * @var EEM_Price_Type $price_type_model
75
+	 */
76
+	protected $price_type_model;
77
+
78
+	/**
79
+	 * @var EEM_Ticket $ticket_model
80
+	 */
81
+	protected $ticket_model;
82
+	/**
83
+	 * @var EEM_Venue $venue_model
84
+	 */
85
+	protected $venue_model;
86
+
87
+
88
+	/**
89
+	 * AdvancedEditorAdminForm constructor.
90
+	 *
91
+	 * @param EE_Event        $event
92
+	 * @param RestApiSpoofer  $spoofer
93
+	 * @param EE_Admin_Config $admin_config
94
+	 * @param EEM_Datetime    $datetime_model
95
+	 * @param EEM_Event       $event_model
96
+	 * @param EEM_Price       $price_model
97
+	 * @param EEM_Price_Type  $price_type_model
98
+	 * @param EEM_Ticket      $ticket_model
99
+	 * @param EEM_Venue       $venue_model
100
+	 */
101
+	public function __construct(
102
+		EE_Event $event,
103
+		RestApiSpoofer $spoofer,
104
+		EE_Admin_Config $admin_config,
105
+		EEM_Datetime $datetime_model,
106
+		EEM_Event $event_model,
107
+		EEM_Price $price_model,
108
+		EEM_Price_Type $price_type_model,
109
+		EEM_Ticket $ticket_model,
110
+		EEM_Venue $venue_model
111
+	) {
112
+		$this->event = $event;
113
+		$this->admin_config = $admin_config;
114
+		$this->spoofer = $spoofer;
115
+		$this->datetime_model = $datetime_model;
116
+		$this->event_model = $event_model;
117
+		$this->price_model = $price_model;
118
+		$this->price_type_model = $price_type_model;
119
+		$this->ticket_model = $ticket_model;
120
+		$this->venue_model = $venue_model;
121
+		add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']);
122
+	}
123
+
124
+
125
+	/**
126
+	 * @throws EE_Error
127
+	 * @throws InvalidArgumentException
128
+	 * @throws InvalidDataTypeException
129
+	 * @throws InvalidInterfaceException
130
+	 * @throws ModelConfigurationException
131
+	 * @throws ReflectionException
132
+	 * @throws RestException
133
+	 * @throws RestPasswordIncorrectException
134
+	 * @throws RestPasswordRequiredException
135
+	 * @throws UnexpectedEntityException
136
+	 * @throws DomainException
137
+	 * @since $VID:$
138
+	 */
139
+	public function loadScriptsStyles()
140
+	{
141
+		if ($this->admin_config->useAdvancedEditor()) {
142
+			$eventId = $this->event instanceof EE_Event ? $this->event->ID() : 0;
143
+			if (! $eventId) {
144
+				global $post;
145
+				$eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0;
146
+				$eventId = $eventId === 0 && $post instanceof WP_Post && $post->post_type === 'espresso_events'
147
+					? $post->ID
148
+					: $eventId;
149
+			}
150
+			$graphqlEndpoint = class_exists('WPGraphQL') ? trailingslashit(site_url()) . Router::$route : '';
151
+			$graphqlEndpoint = esc_url($graphqlEndpoint);
152
+			if ($eventId) {
153
+				$data = $this->getAllEventData($eventId);
154
+				$data = wp_json_encode($data);
155
+				$GQLdata = $this->getGraphQLData($eventId);
156
+				$GQLdata = wp_json_encode($GQLdata);
157
+				add_action(
158
+					'admin_footer',
159
+					static function () use ($data, $graphqlEndpoint) {
160
+						wp_add_inline_script(
161
+							EspressoEditorAssetManager::JS_HANDLE_EDITOR,
162
+							"
163 163
 var eeEditorEventData={$data};
164 164
 var graphqlEndpoint='{$graphqlEndpoint}';
165 165
 ",
166
-                            'before'
167
-                        );
168
-                    }
169
-                );
170
-                add_action(
171
-                    'admin_footer',
172
-                    static function () use ($data, $GQLdata, $graphqlEndpoint) {
173
-                        wp_add_inline_script(
174
-                            EspressoEditorAssetManager::JS_HANDLE_EDITOR_PROTOTYPE,
175
-                            "
166
+							'before'
167
+						);
168
+					}
169
+				);
170
+				add_action(
171
+					'admin_footer',
172
+					static function () use ($data, $GQLdata, $graphqlEndpoint) {
173
+						wp_add_inline_script(
174
+							EspressoEditorAssetManager::JS_HANDLE_EDITOR_PROTOTYPE,
175
+							"
176 176
 var eeEditorEventData={$data};
177 177
 var eeEditorGQLData={$GQLdata};
178 178
 var graphqlEndpoint='{$graphqlEndpoint}';
179 179
 ",
180
-                            'before'
181
-                        );
182
-                    }
183
-                );
184
-            }
185
-        }
186
-    }
187
-
188
-
189
-    /**
190
-     * @param int $eventId
191
-     * @return array
192
-     * @throws DomainException
193
-     * @throws EE_Error
194
-     * @throws InvalidArgumentException
195
-     * @throws InvalidDataTypeException
196
-     * @throws InvalidInterfaceException
197
-     * @throws ModelConfigurationException
198
-     * @throws ReflectionException
199
-     * @throws RestException
200
-     * @throws RestPasswordIncorrectException
201
-     * @throws RestPasswordRequiredException
202
-     * @throws UnexpectedEntityException
203
-     * @since $VID:$
204
-     */
205
-    protected function getEventDates($eventId)
206
-    {
207
-        return $this->spoofer->getApiResults(
208
-            $this->datetime_model,
209
-            [
210
-                [
211
-                    'EVT_ID'      => $eventId,
212
-                    'DTT_deleted' => ['IN', [true, false]]
213
-                ]
214
-            ]
215
-        );
216
-    }
217
-
218
-
219
-    /**
220
-     * @param int $eventId
221
-     * @param array $eventDates
222
-     * @throws DomainException
223
-     * @throws EE_Error
224
-     * @throws InvalidArgumentException
225
-     * @throws InvalidDataTypeException
226
-     * @throws InvalidInterfaceException
227
-     * @throws ModelConfigurationException
228
-     * @throws ReflectionException
229
-     * @throws RestException
230
-     * @throws RestPasswordIncorrectException
231
-     * @throws RestPasswordRequiredException
232
-     * @throws UnexpectedEntityException
233
-     * @since $VID:$
234
-     */
235
-    protected function addDefaultEntities($eventId, array $eventDates = [])
236
-    {
237
-        $default_dates = $this->datetime_model->create_new_blank_datetime();
238
-        if (is_array($default_dates) && isset($default_dates[0]) && $default_dates[0] instanceof EE_Datetime) {
239
-            $default_date = $default_dates[0];
240
-            $default_date->save();
241
-            $default_date->_add_relation_to($eventId, 'Event');
242
-            $default_tickets = $this->ticket_model->get_all_default_tickets();
243
-            $default_prices = $this->price_model->get_all_default_prices();
244
-            foreach ($default_tickets as $default_ticket) {
245
-                $default_ticket->save();
246
-                $default_ticket->_add_relation_to($default_date, 'Datetime');
247
-                foreach ($default_prices as $default_price) {
248
-                    $default_price->save();
249
-                    $default_price->_add_relation_to($default_ticket, 'Ticket');
250
-                }
251
-            }
252
-        }
253
-    }
254
-
255
-
256
-    /**
257
-     * @param int $eventId
258
-     * @return array
259
-     * @since $VID:$
260
-     */
261
-    protected function getGraphQLData($eventId)
262
-    {
263
-        $datetimes = $this->getGraphQLDatetimes($eventId);
264
-
265
-        if (! empty($datetimes['nodes'])) {
266
-            $datetimeIn = wp_list_pluck($datetimes['nodes'], 'id');
267
-
268
-            if (! empty($datetimeIn)) {
269
-                $tickets = $this->getGraphQLTickets($datetimeIn);
270
-            }
271
-        }
272
-
273
-        if (! empty($tickets['nodes'])) {
274
-            $ticketIn = wp_list_pluck($tickets['nodes'], 'id');
275
-
276
-            if (! empty($ticketIn)) {
277
-                $prices = $this->getGraphQLPrices($ticketIn);
278
-            }
279
-        }
280
-
281
-        $priceTypes = $this->getGraphQLPriceTypes();
282
-
283
-        $relations = $this->getRelationalData($eventId);
284
-
285
-        return compact('datetimes', 'tickets', 'prices', 'priceTypes', 'relations');
286
-    }
287
-
288
-
289
-    /**
290
-     * @param int $eventId
291
-     * @return array|null
292
-     * @since $VID:$
293
-     */
294
-    protected function getGraphQLDatetimes($eventId)
295
-    {
296
-        $query = <<<QUERY
180
+							'before'
181
+						);
182
+					}
183
+				);
184
+			}
185
+		}
186
+	}
187
+
188
+
189
+	/**
190
+	 * @param int $eventId
191
+	 * @return array
192
+	 * @throws DomainException
193
+	 * @throws EE_Error
194
+	 * @throws InvalidArgumentException
195
+	 * @throws InvalidDataTypeException
196
+	 * @throws InvalidInterfaceException
197
+	 * @throws ModelConfigurationException
198
+	 * @throws ReflectionException
199
+	 * @throws RestException
200
+	 * @throws RestPasswordIncorrectException
201
+	 * @throws RestPasswordRequiredException
202
+	 * @throws UnexpectedEntityException
203
+	 * @since $VID:$
204
+	 */
205
+	protected function getEventDates($eventId)
206
+	{
207
+		return $this->spoofer->getApiResults(
208
+			$this->datetime_model,
209
+			[
210
+				[
211
+					'EVT_ID'      => $eventId,
212
+					'DTT_deleted' => ['IN', [true, false]]
213
+				]
214
+			]
215
+		);
216
+	}
217
+
218
+
219
+	/**
220
+	 * @param int $eventId
221
+	 * @param array $eventDates
222
+	 * @throws DomainException
223
+	 * @throws EE_Error
224
+	 * @throws InvalidArgumentException
225
+	 * @throws InvalidDataTypeException
226
+	 * @throws InvalidInterfaceException
227
+	 * @throws ModelConfigurationException
228
+	 * @throws ReflectionException
229
+	 * @throws RestException
230
+	 * @throws RestPasswordIncorrectException
231
+	 * @throws RestPasswordRequiredException
232
+	 * @throws UnexpectedEntityException
233
+	 * @since $VID:$
234
+	 */
235
+	protected function addDefaultEntities($eventId, array $eventDates = [])
236
+	{
237
+		$default_dates = $this->datetime_model->create_new_blank_datetime();
238
+		if (is_array($default_dates) && isset($default_dates[0]) && $default_dates[0] instanceof EE_Datetime) {
239
+			$default_date = $default_dates[0];
240
+			$default_date->save();
241
+			$default_date->_add_relation_to($eventId, 'Event');
242
+			$default_tickets = $this->ticket_model->get_all_default_tickets();
243
+			$default_prices = $this->price_model->get_all_default_prices();
244
+			foreach ($default_tickets as $default_ticket) {
245
+				$default_ticket->save();
246
+				$default_ticket->_add_relation_to($default_date, 'Datetime');
247
+				foreach ($default_prices as $default_price) {
248
+					$default_price->save();
249
+					$default_price->_add_relation_to($default_ticket, 'Ticket');
250
+				}
251
+			}
252
+		}
253
+	}
254
+
255
+
256
+	/**
257
+	 * @param int $eventId
258
+	 * @return array
259
+	 * @since $VID:$
260
+	 */
261
+	protected function getGraphQLData($eventId)
262
+	{
263
+		$datetimes = $this->getGraphQLDatetimes($eventId);
264
+
265
+		if (! empty($datetimes['nodes'])) {
266
+			$datetimeIn = wp_list_pluck($datetimes['nodes'], 'id');
267
+
268
+			if (! empty($datetimeIn)) {
269
+				$tickets = $this->getGraphQLTickets($datetimeIn);
270
+			}
271
+		}
272
+
273
+		if (! empty($tickets['nodes'])) {
274
+			$ticketIn = wp_list_pluck($tickets['nodes'], 'id');
275
+
276
+			if (! empty($ticketIn)) {
277
+				$prices = $this->getGraphQLPrices($ticketIn);
278
+			}
279
+		}
280
+
281
+		$priceTypes = $this->getGraphQLPriceTypes();
282
+
283
+		$relations = $this->getRelationalData($eventId);
284
+
285
+		return compact('datetimes', 'tickets', 'prices', 'priceTypes', 'relations');
286
+	}
287
+
288
+
289
+	/**
290
+	 * @param int $eventId
291
+	 * @return array|null
292
+	 * @since $VID:$
293
+	 */
294
+	protected function getGraphQLDatetimes($eventId)
295
+	{
296
+		$query = <<<QUERY
297 297
         query GET_DATETIMES(\$where: RootQueryDatetimesConnectionWhereArgs) {
298 298
             datetimes(where: \$where) {
299 299
                 nodes {
@@ -319,30 +319,30 @@  discard block
 block discarded – undo
319 319
             }
320 320
         }
321 321
 QUERY;
322
-            $data = [
323
-                'operation_name' => 'GET_DATETIMES',
324
-                'variables' => [
325
-                    'first' => 50,
326
-                    'where' => [
327
-                        'eventId' => $eventId,
328
-                    ],
329
-                ],
330
-                'query' => $query,
331
-            ];
332
-
333
-            $responseData = $this->makeGraphQLRequest($data);
334
-            return !empty($responseData['datetimes']) ? $responseData['datetimes'] : null;
335
-    }
336
-
337
-
338
-    /**
339
-     * @param array $datetimeIn
340
-     * @return array|null
341
-     * @since $VID:$
342
-     */
343
-    protected function getGraphQLTickets(array $datetimeIn)
344
-    {
345
-        $query = <<<QUERY
322
+			$data = [
323
+				'operation_name' => 'GET_DATETIMES',
324
+				'variables' => [
325
+					'first' => 50,
326
+					'where' => [
327
+						'eventId' => $eventId,
328
+					],
329
+				],
330
+				'query' => $query,
331
+			];
332
+
333
+			$responseData = $this->makeGraphQLRequest($data);
334
+			return !empty($responseData['datetimes']) ? $responseData['datetimes'] : null;
335
+	}
336
+
337
+
338
+	/**
339
+	 * @param array $datetimeIn
340
+	 * @return array|null
341
+	 * @since $VID:$
342
+	 */
343
+	protected function getGraphQLTickets(array $datetimeIn)
344
+	{
345
+		$query = <<<QUERY
346 346
         query GET_TICKETS(\$where: RootQueryTicketsConnectionWhereArgs) {
347 347
             tickets(where: \$where) {
348 348
                 nodes {
@@ -371,29 +371,29 @@  discard block
 block discarded – undo
371 371
             }
372 372
         }
373 373
 QUERY;
374
-            $data = [
375
-                'operation_name' => 'GET_TICKETS',
376
-                'variables' => [
377
-                    'where' => [
378
-                        'datetimeIn' => $datetimeIn,
379
-                    ],
380
-                ],
381
-                'query' => $query,
382
-            ];
383
-
384
-            $responseData = $this->makeGraphQLRequest($data);
385
-            return !empty($responseData['tickets']) ? $responseData['tickets'] : null;
386
-    }
387
-
388
-
389
-    /**
390
-     * @param array $ticketIn
391
-     * @return array|null
392
-     * @since $VID:$
393
-     */
394
-    protected function getGraphQLPrices(array $ticketIn)
395
-    {
396
-        $query = <<<QUERY
374
+			$data = [
375
+				'operation_name' => 'GET_TICKETS',
376
+				'variables' => [
377
+					'where' => [
378
+						'datetimeIn' => $datetimeIn,
379
+					],
380
+				],
381
+				'query' => $query,
382
+			];
383
+
384
+			$responseData = $this->makeGraphQLRequest($data);
385
+			return !empty($responseData['tickets']) ? $responseData['tickets'] : null;
386
+	}
387
+
388
+
389
+	/**
390
+	 * @param array $ticketIn
391
+	 * @return array|null
392
+	 * @since $VID:$
393
+	 */
394
+	protected function getGraphQLPrices(array $ticketIn)
395
+	{
396
+		$query = <<<QUERY
397 397
         query getPrices(\$where: RootQueryPricesConnectionWhereArgs) {
398 398
             prices(where: \$where) {
399 399
                 nodes {
@@ -417,28 +417,28 @@  discard block
 block discarded – undo
417 417
             }
418 418
         }
419 419
 QUERY;
420
-            $data = [
421
-                'operation_name' => 'GET_PRICES',
422
-                'variables' => [
423
-                    'where' => [
424
-                        'ticketIn' => $ticketIn,
425
-                    ],
426
-                ],
427
-                'query' => $query,
428
-            ];
429
-
430
-            $responseData = $this->makeGraphQLRequest($data);
431
-            return !empty($responseData['prices']) ? $responseData['prices'] : null;
432
-    }
433
-
434
-
435
-    /**
436
-     * @return array|null
437
-     * @since $VID:$
438
-     */
439
-    protected function getGraphQLPriceTypes()
440
-    {
441
-        $query = <<<QUERY
420
+			$data = [
421
+				'operation_name' => 'GET_PRICES',
422
+				'variables' => [
423
+					'where' => [
424
+						'ticketIn' => $ticketIn,
425
+					],
426
+				],
427
+				'query' => $query,
428
+			];
429
+
430
+			$responseData = $this->makeGraphQLRequest($data);
431
+			return !empty($responseData['prices']) ? $responseData['prices'] : null;
432
+	}
433
+
434
+
435
+	/**
436
+	 * @return array|null
437
+	 * @since $VID:$
438
+	 */
439
+	protected function getGraphQLPriceTypes()
440
+	{
441
+		$query = <<<QUERY
442 442
         query getPriceTypes {
443 443
             priceTypes {
444 444
                 nodes {
@@ -458,280 +458,280 @@  discard block
 block discarded – undo
458 458
             }
459 459
         }
460 460
 QUERY;
461
-            $data = [
462
-                'operation_name' => 'GET_PRICES',
463
-                'query' => $query,
464
-            ];
465
-
466
-            $responseData = $this->makeGraphQLRequest($data);
467
-            return !empty($responseData['priceTypes']) ? $responseData['priceTypes'] : null;
468
-    }
469
-
470
-
471
-    /**
472
-     * @param array $data
473
-     * @return array
474
-     * @since $VID:$
475
-     */
476
-    protected function makeGraphQLRequest($data)
477
-    {
478
-        try {
479
-            $response = graphql($data);
480
-            if (!empty($response['data'])) {
481
-                return $response['data'];
482
-            }
483
-            return null;
484
-        } catch (\Exception $e) {
485
-            // do something with the errors thrown
486
-            return null;
487
-        }
488
-    }
489
-
490
-
491
-    /**
492
-     * @param mixed       $source  The source that's passed down the GraphQL queries
493
-     * @param array       $args    The inputArgs on the field
494
-     * @param AppContext  $context The AppContext passed down the GraphQL tree
495
-     * @param ResolveInfo $info    The ResolveInfo passed down the GraphQL tree
496
-     * @return string
497
-     * @throws EE_Error
498
-     * @throws Exception
499
-     * @throws InvalidArgumentException
500
-     * @throws InvalidDataTypeException
501
-     * @throws InvalidInterfaceException
502
-     * @throws ReflectionException
503
-     * @throws UserError
504
-     * @throws UnexpectedEntityException
505
-     * @since $VID:$
506
-     */
507
-    public static function getRelationalData($eventId)
508
-    {
509
-
510
-        $data = [
511
-            'datetimes'  => [],
512
-            'tickets'    => [],
513
-            'prices'     => [],
514
-        ];
515
-
516
-        $eem_datetime   = EEM_Datetime::instance();
517
-        $eem_ticket     = EEM_Ticket::instance();
518
-        $eem_price      = EEM_Price::instance();
519
-        $eem_price_type = EEM_Price_Type::instance();
520
-
521
-        // PROCESS DATETIMES
522
-        $related_models = [
523
-            'tickets' => $eem_ticket,
524
-        ];
525
-        // Get the IDs of event datetimes.
526
-        $datetimeIds = $eem_datetime->get_col([['EVT_ID' => $eventId]]);
527
-        foreach ($datetimeIds as $datetimeId) {
528
-            $GID = self::convertToGlobalId($eem_datetime->item_name(), $datetimeId);
529
-            foreach ($related_models as $key => $model) {
530
-                // Get the IDs of related entities for the datetime ID.
531
-                $Ids = $model->get_col([['Datetime.DTT_ID' => $datetimeId]]);
532
-                if (! empty($Ids)) {
533
-                    $data['datetimes'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
534
-                }
535
-            }
536
-        }
537
-
538
-        // PROCESS TICKETS
539
-        $related_models = [
540
-            'datetimes' => $eem_datetime,
541
-            'prices'    => $eem_price,
542
-        ];
543
-        // Get the IDs of all datetime tickets.
544
-        $ticketIds = $eem_ticket->get_col([['Datetime.DTT_ID' => ['in', $datetimeIds]]]);
545
-        foreach ($ticketIds as $ticketId) {
546
-            $GID = self::convertToGlobalId($eem_ticket->item_name(), $ticketId);
547
-
548
-            foreach ($related_models as $key => $model) {
549
-                // Get the IDs of related entities for the ticket ID.
550
-                $Ids = $model->get_col([['Ticket.TKT_ID' => $ticketId]]);
551
-                if (! empty($Ids)) {
552
-                    $data['tickets'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
553
-                }
554
-            }
555
-        }
556
-
557
-        // PROCESS PRICES
558
-        $related_models = [
559
-            'tickets'    => $eem_ticket,
560
-            'priceTypes' => $eem_price_type,
561
-        ];
562
-        // Get the IDs of all ticket prices.
563
-        $priceIds = $eem_price->get_col([['Ticket.TKT_ID' => ['in', $ticketIds]]]);
564
-        foreach ($priceIds as $priceId) {
565
-            $GID = self::convertToGlobalId($eem_price->item_name(), $priceId);
566
-
567
-            foreach ($related_models as $key => $model) {
568
-                // Get the IDs of related entities for the price ID.
569
-                $Ids = $model->get_col([['Price.PRC_ID' => $priceId]]);
570
-                if (! empty($Ids)) {
571
-                    $data['prices'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
572
-                }
573
-            }
574
-        }
575
-
576
-        return $data;
577
-    }
578
-
579
-    /**
580
-     * Convert the DB ID into GID
581
-     *
582
-     * @param string    $type
583
-     * @param int|int[] $ID
584
-     * @return mixed
585
-     */
586
-    public static function convertToGlobalId($type, $ID)
587
-    {
588
-        if (is_array($ID)) {
589
-            return array_map(function ($id) use ($type) {
590
-                return self::convertToGlobalId($type, $id);
591
-            }, $ID);
592
-        }
593
-        return Relay::toGlobalId($type, $ID);
594
-    }
595
-
596
-
597
-    /**
598
-     * @param int $eventId
599
-     * @return array
600
-     * @throws EE_Error
601
-     * @throws InvalidDataTypeException
602
-     * @throws InvalidInterfaceException
603
-     * @throws ModelConfigurationException
604
-     * @throws RestPasswordIncorrectException
605
-     * @throws RestPasswordRequiredException
606
-     * @throws UnexpectedEntityException
607
-     * @throws RestException
608
-     * @throws InvalidArgumentException
609
-     * @throws ReflectionException
610
-     * @throws DomainException
611
-     * @since $VID:$
612
-     */
613
-    protected function getAllEventData($eventId)
614
-    {
615
-        // these should ultimately be extracted out into their own classes (one per model)
616
-        $event = $this->spoofer->getOneApiResult(
617
-            $this->event_model,
618
-            [['EVT_ID' => $eventId]]
619
-        );
620
-        if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
621
-            return [];
622
-        }
623
-        $eventDates = $this->getEventDates($eventId);
624
-        if ((! is_array($eventDates) || empty($eventDates))
625
-            || (isset($_REQUEST['action']) && $_REQUEST['action'] === 'create_new')
626
-        ) {
627
-            $this->addDefaultEntities($eventId);
628
-            $eventDates = $this->getEventDates($eventId);
629
-        }
630
-
631
-        $event = [$eventId => $event];
632
-        $relations = [
633
-            'event'    => [
634
-                $eventId => [
635
-                    'datetime' => []
636
-                ]
637
-            ],
638
-            'datetime' => [],
639
-            'ticket'   => [],
640
-            'price'    => [],
641
-        ];
642
-
643
-        $datetimes = [];
644
-        $eventDateTickets = [];
645
-        if (is_array($eventDates)) {
646
-            foreach ($eventDates as $eventDate) {
647
-                if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
648
-                    $DTT_ID = $eventDate['DTT_ID'];
649
-                    $datetimes[ $DTT_ID ] = $eventDate;
650
-                    $relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
651
-                    $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
652
-                        $this->ticket_model,
653
-                        [[
654
-                            'Datetime.DTT_ID' => $DTT_ID,
655
-                            'TKT_deleted' => ['IN', [true, false]]
656
-                        ]]
657
-                    );
658
-                }
659
-            }
660
-        }
661
-
662
-        $prices = [];
663
-        $tickets = [];
664
-        if (is_array($eventDateTickets)) {
665
-            foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
666
-                if (is_array($dateTickets)) {
667
-                    $relations['datetime'][ $DTT_ID ]['ticket'] = [];
668
-                    foreach ($dateTickets as $ticket) {
669
-                        if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
670
-                            $TKT_ID = $ticket['TKT_ID'];
671
-                            $tickets[ $TKT_ID ] = $ticket;
672
-                            $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
673
-                            $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
674
-                                $this->price_model,
675
-                                [['Ticket.TKT_ID' => $TKT_ID]]
676
-                            );
677
-                            if (is_array($ticketPrices[ $TKT_ID ])) {
678
-                                $relations['ticket'][ $TKT_ID ]['price'] = [];
679
-                                foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
680
-                                    $PRC_ID = $ticketPrice['PRC_ID'];
681
-                                    $prices[ $PRC_ID ] = $ticketPrice;
682
-                                    $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
683
-                                }
684
-                            }
685
-                        }
686
-                    }
687
-                }
688
-            }
689
-        }
690
-        $price_type_results = $this->spoofer->getApiResults(
691
-            $this->price_type_model,
692
-            [['PRT_deleted' => false]]
693
-        );
694
-        $price_types = [];
695
-        foreach ($price_type_results as $price_type) {
696
-            $price_types[ $price_type['PRT_ID'] ] = $price_type;
697
-        }
698
-        $venue = $this->spoofer->getOneApiResult(
699
-            $this->venue_model,
700
-            [['Event.EVT_ID' => $eventId]]
701
-        );
702
-        if (is_array($venue) && isset($venue['VNU_ID'])) {
703
-            $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
704
-            $venue = [$venue['VNU_ID'] => $venue];
705
-        }
706
-
707
-        $schemas = [
708
-            'event'      => $this->spoofer->getModelSchema('events'),
709
-            'datetime'   => $this->spoofer->getModelSchema('datetimes'),
710
-            'ticket'     => $this->spoofer->getModelSchema('tickets'),
711
-            'price'      => $this->spoofer->getModelSchema('prices'),
712
-            'price_type' => $this->spoofer->getModelSchema('price_types'),
713
-            'venue'      => $this->spoofer->getModelSchema('venues'),
714
-        ];
715
-
716
-        $tktRegCount = [];
717
-        foreach ($tickets as $ticket) {
718
-            $tkt_instance = $this->ticket_model->get_one_by_ID($ticket['TKT_ID']);
719
-
720
-            $tktRegCount[ $ticket['TKT_ID'] ] = $tkt_instance instanceof EE_Ticket ?
721
-            $tkt_instance->count_registrations()
722
-            : 0;
723
-        }
724
-        return [
725
-            'eventId'         => $eventId,
726
-            'event'           => $event,
727
-            'datetime'        => $datetimes,
728
-            'ticket'          => $tickets,
729
-            'price'           => $prices,
730
-            'price_type'      => $price_types,
731
-            'venue'           => $venue,
732
-            'schemas'         => $schemas,
733
-            'relations'       => $relations,
734
-            'tktRegCount'     => $tktRegCount,
735
-        ];
736
-    }
461
+			$data = [
462
+				'operation_name' => 'GET_PRICES',
463
+				'query' => $query,
464
+			];
465
+
466
+			$responseData = $this->makeGraphQLRequest($data);
467
+			return !empty($responseData['priceTypes']) ? $responseData['priceTypes'] : null;
468
+	}
469
+
470
+
471
+	/**
472
+	 * @param array $data
473
+	 * @return array
474
+	 * @since $VID:$
475
+	 */
476
+	protected function makeGraphQLRequest($data)
477
+	{
478
+		try {
479
+			$response = graphql($data);
480
+			if (!empty($response['data'])) {
481
+				return $response['data'];
482
+			}
483
+			return null;
484
+		} catch (\Exception $e) {
485
+			// do something with the errors thrown
486
+			return null;
487
+		}
488
+	}
489
+
490
+
491
+	/**
492
+	 * @param mixed       $source  The source that's passed down the GraphQL queries
493
+	 * @param array       $args    The inputArgs on the field
494
+	 * @param AppContext  $context The AppContext passed down the GraphQL tree
495
+	 * @param ResolveInfo $info    The ResolveInfo passed down the GraphQL tree
496
+	 * @return string
497
+	 * @throws EE_Error
498
+	 * @throws Exception
499
+	 * @throws InvalidArgumentException
500
+	 * @throws InvalidDataTypeException
501
+	 * @throws InvalidInterfaceException
502
+	 * @throws ReflectionException
503
+	 * @throws UserError
504
+	 * @throws UnexpectedEntityException
505
+	 * @since $VID:$
506
+	 */
507
+	public static function getRelationalData($eventId)
508
+	{
509
+
510
+		$data = [
511
+			'datetimes'  => [],
512
+			'tickets'    => [],
513
+			'prices'     => [],
514
+		];
515
+
516
+		$eem_datetime   = EEM_Datetime::instance();
517
+		$eem_ticket     = EEM_Ticket::instance();
518
+		$eem_price      = EEM_Price::instance();
519
+		$eem_price_type = EEM_Price_Type::instance();
520
+
521
+		// PROCESS DATETIMES
522
+		$related_models = [
523
+			'tickets' => $eem_ticket,
524
+		];
525
+		// Get the IDs of event datetimes.
526
+		$datetimeIds = $eem_datetime->get_col([['EVT_ID' => $eventId]]);
527
+		foreach ($datetimeIds as $datetimeId) {
528
+			$GID = self::convertToGlobalId($eem_datetime->item_name(), $datetimeId);
529
+			foreach ($related_models as $key => $model) {
530
+				// Get the IDs of related entities for the datetime ID.
531
+				$Ids = $model->get_col([['Datetime.DTT_ID' => $datetimeId]]);
532
+				if (! empty($Ids)) {
533
+					$data['datetimes'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
534
+				}
535
+			}
536
+		}
537
+
538
+		// PROCESS TICKETS
539
+		$related_models = [
540
+			'datetimes' => $eem_datetime,
541
+			'prices'    => $eem_price,
542
+		];
543
+		// Get the IDs of all datetime tickets.
544
+		$ticketIds = $eem_ticket->get_col([['Datetime.DTT_ID' => ['in', $datetimeIds]]]);
545
+		foreach ($ticketIds as $ticketId) {
546
+			$GID = self::convertToGlobalId($eem_ticket->item_name(), $ticketId);
547
+
548
+			foreach ($related_models as $key => $model) {
549
+				// Get the IDs of related entities for the ticket ID.
550
+				$Ids = $model->get_col([['Ticket.TKT_ID' => $ticketId]]);
551
+				if (! empty($Ids)) {
552
+					$data['tickets'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
553
+				}
554
+			}
555
+		}
556
+
557
+		// PROCESS PRICES
558
+		$related_models = [
559
+			'tickets'    => $eem_ticket,
560
+			'priceTypes' => $eem_price_type,
561
+		];
562
+		// Get the IDs of all ticket prices.
563
+		$priceIds = $eem_price->get_col([['Ticket.TKT_ID' => ['in', $ticketIds]]]);
564
+		foreach ($priceIds as $priceId) {
565
+			$GID = self::convertToGlobalId($eem_price->item_name(), $priceId);
566
+
567
+			foreach ($related_models as $key => $model) {
568
+				// Get the IDs of related entities for the price ID.
569
+				$Ids = $model->get_col([['Price.PRC_ID' => $priceId]]);
570
+				if (! empty($Ids)) {
571
+					$data['prices'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
572
+				}
573
+			}
574
+		}
575
+
576
+		return $data;
577
+	}
578
+
579
+	/**
580
+	 * Convert the DB ID into GID
581
+	 *
582
+	 * @param string    $type
583
+	 * @param int|int[] $ID
584
+	 * @return mixed
585
+	 */
586
+	public static function convertToGlobalId($type, $ID)
587
+	{
588
+		if (is_array($ID)) {
589
+			return array_map(function ($id) use ($type) {
590
+				return self::convertToGlobalId($type, $id);
591
+			}, $ID);
592
+		}
593
+		return Relay::toGlobalId($type, $ID);
594
+	}
595
+
596
+
597
+	/**
598
+	 * @param int $eventId
599
+	 * @return array
600
+	 * @throws EE_Error
601
+	 * @throws InvalidDataTypeException
602
+	 * @throws InvalidInterfaceException
603
+	 * @throws ModelConfigurationException
604
+	 * @throws RestPasswordIncorrectException
605
+	 * @throws RestPasswordRequiredException
606
+	 * @throws UnexpectedEntityException
607
+	 * @throws RestException
608
+	 * @throws InvalidArgumentException
609
+	 * @throws ReflectionException
610
+	 * @throws DomainException
611
+	 * @since $VID:$
612
+	 */
613
+	protected function getAllEventData($eventId)
614
+	{
615
+		// these should ultimately be extracted out into their own classes (one per model)
616
+		$event = $this->spoofer->getOneApiResult(
617
+			$this->event_model,
618
+			[['EVT_ID' => $eventId]]
619
+		);
620
+		if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
621
+			return [];
622
+		}
623
+		$eventDates = $this->getEventDates($eventId);
624
+		if ((! is_array($eventDates) || empty($eventDates))
625
+			|| (isset($_REQUEST['action']) && $_REQUEST['action'] === 'create_new')
626
+		) {
627
+			$this->addDefaultEntities($eventId);
628
+			$eventDates = $this->getEventDates($eventId);
629
+		}
630
+
631
+		$event = [$eventId => $event];
632
+		$relations = [
633
+			'event'    => [
634
+				$eventId => [
635
+					'datetime' => []
636
+				]
637
+			],
638
+			'datetime' => [],
639
+			'ticket'   => [],
640
+			'price'    => [],
641
+		];
642
+
643
+		$datetimes = [];
644
+		$eventDateTickets = [];
645
+		if (is_array($eventDates)) {
646
+			foreach ($eventDates as $eventDate) {
647
+				if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
648
+					$DTT_ID = $eventDate['DTT_ID'];
649
+					$datetimes[ $DTT_ID ] = $eventDate;
650
+					$relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
651
+					$eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
652
+						$this->ticket_model,
653
+						[[
654
+							'Datetime.DTT_ID' => $DTT_ID,
655
+							'TKT_deleted' => ['IN', [true, false]]
656
+						]]
657
+					);
658
+				}
659
+			}
660
+		}
661
+
662
+		$prices = [];
663
+		$tickets = [];
664
+		if (is_array($eventDateTickets)) {
665
+			foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
666
+				if (is_array($dateTickets)) {
667
+					$relations['datetime'][ $DTT_ID ]['ticket'] = [];
668
+					foreach ($dateTickets as $ticket) {
669
+						if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
670
+							$TKT_ID = $ticket['TKT_ID'];
671
+							$tickets[ $TKT_ID ] = $ticket;
672
+							$relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
673
+							$ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
674
+								$this->price_model,
675
+								[['Ticket.TKT_ID' => $TKT_ID]]
676
+							);
677
+							if (is_array($ticketPrices[ $TKT_ID ])) {
678
+								$relations['ticket'][ $TKT_ID ]['price'] = [];
679
+								foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
680
+									$PRC_ID = $ticketPrice['PRC_ID'];
681
+									$prices[ $PRC_ID ] = $ticketPrice;
682
+									$relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
683
+								}
684
+							}
685
+						}
686
+					}
687
+				}
688
+			}
689
+		}
690
+		$price_type_results = $this->spoofer->getApiResults(
691
+			$this->price_type_model,
692
+			[['PRT_deleted' => false]]
693
+		);
694
+		$price_types = [];
695
+		foreach ($price_type_results as $price_type) {
696
+			$price_types[ $price_type['PRT_ID'] ] = $price_type;
697
+		}
698
+		$venue = $this->spoofer->getOneApiResult(
699
+			$this->venue_model,
700
+			[['Event.EVT_ID' => $eventId]]
701
+		);
702
+		if (is_array($venue) && isset($venue['VNU_ID'])) {
703
+			$relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
704
+			$venue = [$venue['VNU_ID'] => $venue];
705
+		}
706
+
707
+		$schemas = [
708
+			'event'      => $this->spoofer->getModelSchema('events'),
709
+			'datetime'   => $this->spoofer->getModelSchema('datetimes'),
710
+			'ticket'     => $this->spoofer->getModelSchema('tickets'),
711
+			'price'      => $this->spoofer->getModelSchema('prices'),
712
+			'price_type' => $this->spoofer->getModelSchema('price_types'),
713
+			'venue'      => $this->spoofer->getModelSchema('venues'),
714
+		];
715
+
716
+		$tktRegCount = [];
717
+		foreach ($tickets as $ticket) {
718
+			$tkt_instance = $this->ticket_model->get_one_by_ID($ticket['TKT_ID']);
719
+
720
+			$tktRegCount[ $ticket['TKT_ID'] ] = $tkt_instance instanceof EE_Ticket ?
721
+			$tkt_instance->count_registrations()
722
+			: 0;
723
+		}
724
+		return [
725
+			'eventId'         => $eventId,
726
+			'event'           => $event,
727
+			'datetime'        => $datetimes,
728
+			'ticket'          => $tickets,
729
+			'price'           => $prices,
730
+			'price_type'      => $price_types,
731
+			'venue'           => $venue,
732
+			'schemas'         => $schemas,
733
+			'relations'       => $relations,
734
+			'tktRegCount'     => $tktRegCount,
735
+		];
736
+	}
737 737
 }
Please login to merge, or discard this patch.
Spacing   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -140,14 +140,14 @@  discard block
 block discarded – undo
140 140
     {
141 141
         if ($this->admin_config->useAdvancedEditor()) {
142 142
             $eventId = $this->event instanceof EE_Event ? $this->event->ID() : 0;
143
-            if (! $eventId) {
143
+            if ( ! $eventId) {
144 144
                 global $post;
145 145
                 $eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0;
146 146
                 $eventId = $eventId === 0 && $post instanceof WP_Post && $post->post_type === 'espresso_events'
147 147
                     ? $post->ID
148 148
                     : $eventId;
149 149
             }
150
-            $graphqlEndpoint = class_exists('WPGraphQL') ? trailingslashit(site_url()) . Router::$route : '';
150
+            $graphqlEndpoint = class_exists('WPGraphQL') ? trailingslashit(site_url()).Router::$route : '';
151 151
             $graphqlEndpoint = esc_url($graphqlEndpoint);
152 152
             if ($eventId) {
153 153
                 $data = $this->getAllEventData($eventId);
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
                 $GQLdata = wp_json_encode($GQLdata);
157 157
                 add_action(
158 158
                     'admin_footer',
159
-                    static function () use ($data, $graphqlEndpoint) {
159
+                    static function() use ($data, $graphqlEndpoint) {
160 160
                         wp_add_inline_script(
161 161
                             EspressoEditorAssetManager::JS_HANDLE_EDITOR,
162 162
                             "
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
                 );
170 170
                 add_action(
171 171
                     'admin_footer',
172
-                    static function () use ($data, $GQLdata, $graphqlEndpoint) {
172
+                    static function() use ($data, $GQLdata, $graphqlEndpoint) {
173 173
                         wp_add_inline_script(
174 174
                             EspressoEditorAssetManager::JS_HANDLE_EDITOR_PROTOTYPE,
175 175
                             "
@@ -262,18 +262,18 @@  discard block
 block discarded – undo
262 262
     {
263 263
         $datetimes = $this->getGraphQLDatetimes($eventId);
264 264
 
265
-        if (! empty($datetimes['nodes'])) {
265
+        if ( ! empty($datetimes['nodes'])) {
266 266
             $datetimeIn = wp_list_pluck($datetimes['nodes'], 'id');
267 267
 
268
-            if (! empty($datetimeIn)) {
268
+            if ( ! empty($datetimeIn)) {
269 269
                 $tickets = $this->getGraphQLTickets($datetimeIn);
270 270
             }
271 271
         }
272 272
 
273
-        if (! empty($tickets['nodes'])) {
273
+        if ( ! empty($tickets['nodes'])) {
274 274
             $ticketIn = wp_list_pluck($tickets['nodes'], 'id');
275 275
 
276
-            if (! empty($ticketIn)) {
276
+            if ( ! empty($ticketIn)) {
277 277
                 $prices = $this->getGraphQLPrices($ticketIn);
278 278
             }
279 279
         }
@@ -331,7 +331,7 @@  discard block
 block discarded – undo
331 331
             ];
332 332
 
333 333
             $responseData = $this->makeGraphQLRequest($data);
334
-            return !empty($responseData['datetimes']) ? $responseData['datetimes'] : null;
334
+            return ! empty($responseData['datetimes']) ? $responseData['datetimes'] : null;
335 335
     }
336 336
 
337 337
 
@@ -382,7 +382,7 @@  discard block
 block discarded – undo
382 382
             ];
383 383
 
384 384
             $responseData = $this->makeGraphQLRequest($data);
385
-            return !empty($responseData['tickets']) ? $responseData['tickets'] : null;
385
+            return ! empty($responseData['tickets']) ? $responseData['tickets'] : null;
386 386
     }
387 387
 
388 388
 
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
             ];
429 429
 
430 430
             $responseData = $this->makeGraphQLRequest($data);
431
-            return !empty($responseData['prices']) ? $responseData['prices'] : null;
431
+            return ! empty($responseData['prices']) ? $responseData['prices'] : null;
432 432
     }
433 433
 
434 434
 
@@ -464,7 +464,7 @@  discard block
 block discarded – undo
464 464
             ];
465 465
 
466 466
             $responseData = $this->makeGraphQLRequest($data);
467
-            return !empty($responseData['priceTypes']) ? $responseData['priceTypes'] : null;
467
+            return ! empty($responseData['priceTypes']) ? $responseData['priceTypes'] : null;
468 468
     }
469 469
 
470 470
 
@@ -477,7 +477,7 @@  discard block
 block discarded – undo
477 477
     {
478 478
         try {
479 479
             $response = graphql($data);
480
-            if (!empty($response['data'])) {
480
+            if ( ! empty($response['data'])) {
481 481
                 return $response['data'];
482 482
             }
483 483
             return null;
@@ -529,8 +529,8 @@  discard block
 block discarded – undo
529 529
             foreach ($related_models as $key => $model) {
530 530
                 // Get the IDs of related entities for the datetime ID.
531 531
                 $Ids = $model->get_col([['Datetime.DTT_ID' => $datetimeId]]);
532
-                if (! empty($Ids)) {
533
-                    $data['datetimes'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
532
+                if ( ! empty($Ids)) {
533
+                    $data['datetimes'][$GID][$key] = self::convertToGlobalId($model->item_name(), $Ids);
534 534
                 }
535 535
             }
536 536
         }
@@ -548,8 +548,8 @@  discard block
 block discarded – undo
548 548
             foreach ($related_models as $key => $model) {
549 549
                 // Get the IDs of related entities for the ticket ID.
550 550
                 $Ids = $model->get_col([['Ticket.TKT_ID' => $ticketId]]);
551
-                if (! empty($Ids)) {
552
-                    $data['tickets'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
551
+                if ( ! empty($Ids)) {
552
+                    $data['tickets'][$GID][$key] = self::convertToGlobalId($model->item_name(), $Ids);
553 553
                 }
554 554
             }
555 555
         }
@@ -567,8 +567,8 @@  discard block
 block discarded – undo
567 567
             foreach ($related_models as $key => $model) {
568 568
                 // Get the IDs of related entities for the price ID.
569 569
                 $Ids = $model->get_col([['Price.PRC_ID' => $priceId]]);
570
-                if (! empty($Ids)) {
571
-                    $data['prices'][ $GID ][ $key ] = self::convertToGlobalId($model->item_name(), $Ids);
570
+                if ( ! empty($Ids)) {
571
+                    $data['prices'][$GID][$key] = self::convertToGlobalId($model->item_name(), $Ids);
572 572
                 }
573 573
             }
574 574
         }
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
     public static function convertToGlobalId($type, $ID)
587 587
     {
588 588
         if (is_array($ID)) {
589
-            return array_map(function ($id) use ($type) {
589
+            return array_map(function($id) use ($type) {
590 590
                 return self::convertToGlobalId($type, $id);
591 591
             }, $ID);
592 592
         }
@@ -617,11 +617,11 @@  discard block
 block discarded – undo
617 617
             $this->event_model,
618 618
             [['EVT_ID' => $eventId]]
619 619
         );
620
-        if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
620
+        if ( ! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) {
621 621
             return [];
622 622
         }
623 623
         $eventDates = $this->getEventDates($eventId);
624
-        if ((! is_array($eventDates) || empty($eventDates))
624
+        if (( ! is_array($eventDates) || empty($eventDates))
625 625
             || (isset($_REQUEST['action']) && $_REQUEST['action'] === 'create_new')
626 626
         ) {
627 627
             $this->addDefaultEntities($eventId);
@@ -646,9 +646,9 @@  discard block
 block discarded – undo
646 646
             foreach ($eventDates as $eventDate) {
647 647
                 if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) {
648 648
                     $DTT_ID = $eventDate['DTT_ID'];
649
-                    $datetimes[ $DTT_ID ] = $eventDate;
650
-                    $relations['event'][ $eventId ]['datetime'][] = $DTT_ID;
651
-                    $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults(
649
+                    $datetimes[$DTT_ID] = $eventDate;
650
+                    $relations['event'][$eventId]['datetime'][] = $DTT_ID;
651
+                    $eventDateTickets[$DTT_ID] = $this->spoofer->getApiResults(
652 652
                         $this->ticket_model,
653 653
                         [[
654 654
                             'Datetime.DTT_ID' => $DTT_ID,
@@ -664,22 +664,22 @@  discard block
 block discarded – undo
664 664
         if (is_array($eventDateTickets)) {
665 665
             foreach ($eventDateTickets as $DTT_ID => $dateTickets) {
666 666
                 if (is_array($dateTickets)) {
667
-                    $relations['datetime'][ $DTT_ID ]['ticket'] = [];
667
+                    $relations['datetime'][$DTT_ID]['ticket'] = [];
668 668
                     foreach ($dateTickets as $ticket) {
669 669
                         if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) {
670 670
                             $TKT_ID = $ticket['TKT_ID'];
671
-                            $tickets[ $TKT_ID ] = $ticket;
672
-                            $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID;
673
-                            $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults(
671
+                            $tickets[$TKT_ID] = $ticket;
672
+                            $relations['datetime'][$DTT_ID]['ticket'][] = $TKT_ID;
673
+                            $ticketPrices[$TKT_ID] = $this->spoofer->getApiResults(
674 674
                                 $this->price_model,
675 675
                                 [['Ticket.TKT_ID' => $TKT_ID]]
676 676
                             );
677
-                            if (is_array($ticketPrices[ $TKT_ID ])) {
678
-                                $relations['ticket'][ $TKT_ID ]['price'] = [];
679
-                                foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) {
677
+                            if (is_array($ticketPrices[$TKT_ID])) {
678
+                                $relations['ticket'][$TKT_ID]['price'] = [];
679
+                                foreach ($ticketPrices[$TKT_ID] as $ticketPrice) {
680 680
                                     $PRC_ID = $ticketPrice['PRC_ID'];
681
-                                    $prices[ $PRC_ID ] = $ticketPrice;
682
-                                    $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID;
681
+                                    $prices[$PRC_ID] = $ticketPrice;
682
+                                    $relations['ticket'][$TKT_ID]['price'][] = $PRC_ID;
683 683
                                 }
684 684
                             }
685 685
                         }
@@ -693,14 +693,14 @@  discard block
 block discarded – undo
693 693
         );
694 694
         $price_types = [];
695 695
         foreach ($price_type_results as $price_type) {
696
-            $price_types[ $price_type['PRT_ID'] ] = $price_type;
696
+            $price_types[$price_type['PRT_ID']] = $price_type;
697 697
         }
698 698
         $venue = $this->spoofer->getOneApiResult(
699 699
             $this->venue_model,
700 700
             [['Event.EVT_ID' => $eventId]]
701 701
         );
702 702
         if (is_array($venue) && isset($venue['VNU_ID'])) {
703
-            $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ];
703
+            $relations['event'][$eventId]['venue'] = [$venue['VNU_ID']];
704 704
             $venue = [$venue['VNU_ID'] => $venue];
705 705
         }
706 706
 
@@ -717,7 +717,7 @@  discard block
 block discarded – undo
717 717
         foreach ($tickets as $ticket) {
718 718
             $tkt_instance = $this->ticket_model->get_one_by_ID($ticket['TKT_ID']);
719 719
 
720
-            $tktRegCount[ $ticket['TKT_ID'] ] = $tkt_instance instanceof EE_Ticket ?
720
+            $tktRegCount[$ticket['TKT_ID']] = $tkt_instance instanceof EE_Ticket ?
721 721
             $tkt_instance->count_registrations()
722 722
             : 0;
723 723
         }
Please login to merge, or discard this patch.
core/EE_System.core.php 2 patches
Indentation   +1320 added lines, -1320 removed lines patch added patch discarded remove patch
@@ -27,1324 +27,1324 @@
 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->isWordPressApi() || $this->request->isApi())
390
-            && $this->request->getRequestParam('activate') !== 'true'
391
-            && ! function_exists('json_basic_auth_handler')
392
-            && ! function_exists('json_basic_auth_error')
393
-            && ! in_array(
394
-                $this->request->getRequestParam('action'),
395
-                array('activate', 'activate-selected'),
396
-                true
397
-            )
398
-        ) {
399
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
400
-        }
401
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
402
-    }
403
-
404
-
405
-    /**
406
-     * detect_activations_or_upgrades
407
-     * Checks for activation or upgrade of core first;
408
-     * then also checks if any registered addons have been activated or upgraded
409
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
410
-     * which runs during the WP 'plugins_loaded' action at priority 3
411
-     *
412
-     * @access public
413
-     * @return void
414
-     */
415
-    public function detect_activations_or_upgrades()
416
-    {
417
-        // first off: let's make sure to handle core
418
-        $this->detect_if_activation_or_upgrade();
419
-        foreach ($this->registry->addons as $addon) {
420
-            if ($addon instanceof EE_Addon) {
421
-                // detect teh request type for that addon
422
-                $addon->detect_activation_or_upgrade();
423
-            }
424
-        }
425
-    }
426
-
427
-
428
-    /**
429
-     * detect_if_activation_or_upgrade
430
-     * Takes care of detecting whether this is a brand new install or code upgrade,
431
-     * and either setting up the DB or setting up maintenance mode etc.
432
-     *
433
-     * @access public
434
-     * @return void
435
-     */
436
-    public function detect_if_activation_or_upgrade()
437
-    {
438
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
439
-        // check if db has been updated, or if its a brand-new installation
440
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
441
-        $request_type = $this->detect_req_type($espresso_db_update);
442
-        // EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
443
-        switch ($request_type) {
444
-            case EE_System::req_type_new_activation:
445
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
446
-                $this->_handle_core_version_change($espresso_db_update);
447
-                break;
448
-            case EE_System::req_type_reactivation:
449
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
450
-                $this->_handle_core_version_change($espresso_db_update);
451
-                break;
452
-            case EE_System::req_type_upgrade:
453
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
454
-                // migrations may be required now that we've upgraded
455
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
456
-                $this->_handle_core_version_change($espresso_db_update);
457
-                break;
458
-            case EE_System::req_type_downgrade:
459
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
460
-                // its possible migrations are no longer required
461
-                $this->maintenance_mode->set_maintenance_mode_if_db_old();
462
-                $this->_handle_core_version_change($espresso_db_update);
463
-                break;
464
-            case EE_System::req_type_normal:
465
-            default:
466
-                break;
467
-        }
468
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
469
-    }
470
-
471
-
472
-    /**
473
-     * Updates the list of installed versions and sets hooks for
474
-     * initializing the database later during the request
475
-     *
476
-     * @param array $espresso_db_update
477
-     */
478
-    private function _handle_core_version_change($espresso_db_update)
479
-    {
480
-        $this->update_list_of_installed_versions($espresso_db_update);
481
-        // get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
482
-        add_action(
483
-            'AHEE__EE_System__perform_activations_upgrades_and_migrations',
484
-            array($this, 'initialize_db_if_no_migrations_required')
485
-        );
486
-    }
487
-
488
-
489
-    /**
490
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
491
-     * information about what versions of EE have been installed and activated,
492
-     * NOT necessarily the state of the database
493
-     *
494
-     * @param mixed $espresso_db_update           the value of the WordPress option.
495
-     *                                            If not supplied, fetches it from the options table
496
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
497
-     */
498
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
499
-    {
500
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
501
-        if (! $espresso_db_update) {
502
-            $espresso_db_update = get_option('espresso_db_update');
503
-        }
504
-        // check that option is an array
505
-        if (! is_array($espresso_db_update)) {
506
-            // if option is FALSE, then it never existed
507
-            if ($espresso_db_update === false) {
508
-                // make $espresso_db_update an array and save option with autoload OFF
509
-                $espresso_db_update = array();
510
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
511
-            } else {
512
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
513
-                $espresso_db_update = array($espresso_db_update => array());
514
-                update_option('espresso_db_update', $espresso_db_update);
515
-            }
516
-        } else {
517
-            $corrected_db_update = array();
518
-            // if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
519
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
520
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
521
-                    // the key is an int, and the value IS NOT an array
522
-                    // so it must be numerically-indexed, where values are versions installed...
523
-                    // fix it!
524
-                    $version_string = $should_be_array;
525
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
526
-                } else {
527
-                    // ok it checks out
528
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
529
-                }
530
-            }
531
-            $espresso_db_update = $corrected_db_update;
532
-            update_option('espresso_db_update', $espresso_db_update);
533
-        }
534
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
535
-        return $espresso_db_update;
536
-    }
537
-
538
-
539
-    /**
540
-     * Does the traditional work of setting up the plugin's database and adding default data.
541
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
542
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
543
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
544
-     * so that it will be done when migrations are finished
545
-     *
546
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
547
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
548
-     *                                       This is a resource-intensive job
549
-     *                                       so we prefer to only do it when necessary
550
-     * @return void
551
-     * @throws EE_Error
552
-     */
553
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
554
-    {
555
-        $request_type = $this->detect_req_type();
556
-        // only initialize system if we're not in maintenance mode.
557
-        if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
558
-            /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
559
-            $rewrite_rules = $this->loader->getShared(
560
-                'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
561
-            );
562
-            $rewrite_rules->flush();
563
-            if ($verify_schema) {
564
-                EEH_Activation::initialize_db_and_folders();
565
-            }
566
-            EEH_Activation::initialize_db_content();
567
-            EEH_Activation::system_initialization();
568
-            if ($initialize_addons_too) {
569
-                $this->initialize_addons();
570
-            }
571
-        } else {
572
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
573
-        }
574
-        if ($request_type === EE_System::req_type_new_activation
575
-            || $request_type === EE_System::req_type_reactivation
576
-            || (
577
-                $request_type === EE_System::req_type_upgrade
578
-                && $this->is_major_version_change()
579
-            )
580
-        ) {
581
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
582
-        }
583
-    }
584
-
585
-
586
-    /**
587
-     * Initializes the db for all registered addons
588
-     *
589
-     * @throws EE_Error
590
-     */
591
-    public function initialize_addons()
592
-    {
593
-        // foreach registered addon, make sure its db is up-to-date too
594
-        foreach ($this->registry->addons as $addon) {
595
-            if ($addon instanceof EE_Addon) {
596
-                $addon->initialize_db_if_no_migrations_required();
597
-            }
598
-        }
599
-    }
600
-
601
-
602
-    /**
603
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
604
-     *
605
-     * @param    array  $version_history
606
-     * @param    string $current_version_to_add version to be added to the version history
607
-     * @return    boolean success as to whether or not this option was changed
608
-     */
609
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
610
-    {
611
-        if (! $version_history) {
612
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
613
-        }
614
-        if ($current_version_to_add === null) {
615
-            $current_version_to_add = espresso_version();
616
-        }
617
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
618
-        // re-save
619
-        return update_option('espresso_db_update', $version_history);
620
-    }
621
-
622
-
623
-    /**
624
-     * Detects if the current version indicated in the has existed in the list of
625
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
626
-     *
627
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
628
-     *                                  If not supplied, fetches it from the options table.
629
-     *                                  Also, caches its result so later parts of the code can also know whether
630
-     *                                  there's been an update or not. This way we can add the current version to
631
-     *                                  espresso_db_update, but still know if this is a new install or not
632
-     * @return int one of the constants on EE_System::req_type_
633
-     */
634
-    public function detect_req_type($espresso_db_update = null)
635
-    {
636
-        if ($this->_req_type === null) {
637
-            $espresso_db_update = ! empty($espresso_db_update)
638
-                ? $espresso_db_update
639
-                : $this->fix_espresso_db_upgrade_option();
640
-            $this->_req_type = EE_System::detect_req_type_given_activation_history(
641
-                $espresso_db_update,
642
-                'ee_espresso_activation',
643
-                espresso_version()
644
-            );
645
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
646
-            $this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
647
-        }
648
-        return $this->_req_type;
649
-    }
650
-
651
-
652
-    /**
653
-     * Returns whether or not there was a non-micro version change (ie, change in either
654
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
655
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
656
-     *
657
-     * @param $activation_history
658
-     * @return bool
659
-     */
660
-    private function _detect_major_version_change($activation_history)
661
-    {
662
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
663
-        $previous_version_parts = explode('.', $previous_version);
664
-        $current_version_parts = explode('.', espresso_version());
665
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
666
-               && ($previous_version_parts[0] !== $current_version_parts[0]
667
-                   || $previous_version_parts[1] !== $current_version_parts[1]
668
-               );
669
-    }
670
-
671
-
672
-    /**
673
-     * Returns true if either the major or minor version of EE changed during this request.
674
-     * 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
675
-     *
676
-     * @return bool
677
-     */
678
-    public function is_major_version_change()
679
-    {
680
-        return $this->_major_version_change;
681
-    }
682
-
683
-
684
-    /**
685
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
686
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
687
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
688
-     * just activated to (for core that will always be espresso_version())
689
-     *
690
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
691
-     *                                                 ee plugin. for core that's 'espresso_db_update'
692
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
693
-     *                                                 indicate that this plugin was just activated
694
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
695
-     *                                                 espresso_version())
696
-     * @return int one of the constants on EE_System::req_type_*
697
-     */
698
-    public static function detect_req_type_given_activation_history(
699
-        $activation_history_for_addon,
700
-        $activation_indicator_option_name,
701
-        $version_to_upgrade_to
702
-    ) {
703
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
704
-        if ($activation_history_for_addon) {
705
-            // it exists, so this isn't a completely new install
706
-            // check if this version already in that list of previously installed versions
707
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
708
-                // it a version we haven't seen before
709
-                if ($version_is_higher === 1) {
710
-                    $req_type = EE_System::req_type_upgrade;
711
-                } else {
712
-                    $req_type = EE_System::req_type_downgrade;
713
-                }
714
-                delete_option($activation_indicator_option_name);
715
-            } else {
716
-                // its not an update. maybe a reactivation?
717
-                if (get_option($activation_indicator_option_name, false)) {
718
-                    if ($version_is_higher === -1) {
719
-                        $req_type = EE_System::req_type_downgrade;
720
-                    } elseif ($version_is_higher === 0) {
721
-                        // we've seen this version before, but it's an activation. must be a reactivation
722
-                        $req_type = EE_System::req_type_reactivation;
723
-                    } else {// $version_is_higher === 1
724
-                        $req_type = EE_System::req_type_upgrade;
725
-                    }
726
-                    delete_option($activation_indicator_option_name);
727
-                } else {
728
-                    // we've seen this version before and the activation indicate doesn't show it was just activated
729
-                    if ($version_is_higher === -1) {
730
-                        $req_type = EE_System::req_type_downgrade;
731
-                    } elseif ($version_is_higher === 0) {
732
-                        // we've seen this version before and it's not an activation. its normal request
733
-                        $req_type = EE_System::req_type_normal;
734
-                    } else {// $version_is_higher === 1
735
-                        $req_type = EE_System::req_type_upgrade;
736
-                    }
737
-                }
738
-            }
739
-        } else {
740
-            // brand new install
741
-            $req_type = EE_System::req_type_new_activation;
742
-            delete_option($activation_indicator_option_name);
743
-        }
744
-        return $req_type;
745
-    }
746
-
747
-
748
-    /**
749
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
750
-     * the $activation_history_for_addon
751
-     *
752
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
753
-     *                                             sometimes containing 'unknown-date'
754
-     * @param string $version_to_upgrade_to        (current version)
755
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
756
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
757
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
758
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
759
-     */
760
-    private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
761
-    {
762
-        // find the most recently-activated version
763
-        $most_recently_active_version =
764
-            EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
765
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
766
-    }
767
-
768
-
769
-    /**
770
-     * Gets the most recently active version listed in the activation history,
771
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
772
-     *
773
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
774
-     *                                   sometimes containing 'unknown-date'
775
-     * @return string
776
-     */
777
-    private static function _get_most_recently_active_version_from_activation_history($activation_history)
778
-    {
779
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
780
-        $most_recently_active_version = '0.0.0.dev.000';
781
-        if (is_array($activation_history)) {
782
-            foreach ($activation_history as $version => $times_activated) {
783
-                // check there is a record of when this version was activated. Otherwise,
784
-                // mark it as unknown
785
-                if (! $times_activated) {
786
-                    $times_activated = array('unknown-date');
787
-                }
788
-                if (is_string($times_activated)) {
789
-                    $times_activated = array($times_activated);
790
-                }
791
-                foreach ($times_activated as $an_activation) {
792
-                    if ($an_activation !== 'unknown-date'
793
-                        && $an_activation
794
-                           > $most_recently_active_version_activation) {
795
-                        $most_recently_active_version = $version;
796
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
797
-                            ? '1970-01-01 00:00:00'
798
-                            : $an_activation;
799
-                    }
800
-                }
801
-            }
802
-        }
803
-        return $most_recently_active_version;
804
-    }
805
-
806
-
807
-    /**
808
-     * This redirects to the about EE page after activation
809
-     *
810
-     * @return void
811
-     */
812
-    public function redirect_to_about_ee()
813
-    {
814
-        $notices = EE_Error::get_notices(false);
815
-        // if current user is an admin and it's not an ajax or rest request
816
-        if (! isset($notices['errors'])
817
-            && $this->request->isAdmin()
818
-            && apply_filters(
819
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
820
-                $this->capabilities->current_user_can('manage_options', 'espresso_about_default')
821
-            )
822
-        ) {
823
-            $query_params = array('page' => 'espresso_about');
824
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
825
-                $query_params['new_activation'] = true;
826
-            }
827
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
828
-                $query_params['reactivation'] = true;
829
-            }
830
-            $url = add_query_arg($query_params, admin_url('admin.php'));
831
-            wp_safe_redirect($url);
832
-            exit();
833
-        }
834
-    }
835
-
836
-
837
-    /**
838
-     * load_core_configuration
839
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
840
-     * which runs during the WP 'plugins_loaded' action at priority 5
841
-     *
842
-     * @return void
843
-     * @throws ReflectionException
844
-     * @throws Exception
845
-     */
846
-    public function load_core_configuration()
847
-    {
848
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
849
-        $this->loader->getShared('EE_Load_Textdomain');
850
-        // load textdomain
851
-        EE_Load_Textdomain::load_textdomain();
852
-        // load caf stuff a chance to play during the activation process too.
853
-        $this->_maybe_brew_regular();
854
-        // load and setup EE_Config and EE_Network_Config
855
-        $config = $this->loader->getShared('EE_Config');
856
-        $this->loader->getShared('EE_Network_Config');
857
-        // setup autoloaders
858
-        // enable logging?
859
-        if ($config->admin->use_remote_logging) {
860
-            $this->loader->getShared('EE_Log');
861
-        }
862
-        // check for activation errors
863
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
864
-        if ($activation_errors) {
865
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
866
-            update_option('ee_plugin_activation_errors', false);
867
-        }
868
-        // get model names
869
-        $this->_parse_model_names();
870
-        // configure custom post type definitions
871
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
872
-        $this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
873
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
874
-    }
875
-
876
-
877
-    /**
878
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
879
-     *
880
-     * @return void
881
-     * @throws ReflectionException
882
-     */
883
-    private function _parse_model_names()
884
-    {
885
-        // get all the files in the EE_MODELS folder that end in .model.php
886
-        $models = glob(EE_MODELS . '*.model.php');
887
-        $model_names = array();
888
-        $non_abstract_db_models = array();
889
-        foreach ($models as $model) {
890
-            // get model classname
891
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
892
-            $short_name = str_replace('EEM_', '', $classname);
893
-            $reflectionClass = new ReflectionClass($classname);
894
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
895
-                $non_abstract_db_models[ $short_name ] = $classname;
896
-            }
897
-            $model_names[ $short_name ] = $classname;
898
-        }
899
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
900
-        $this->registry->non_abstract_db_models = apply_filters(
901
-            'FHEE__EE_System__parse_implemented_model_names',
902
-            $non_abstract_db_models
903
-        );
904
-    }
905
-
906
-
907
-    /**
908
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
909
-     * that need to be setup before our EE_System launches.
910
-     *
911
-     * @return void
912
-     * @throws DomainException
913
-     * @throws InvalidArgumentException
914
-     * @throws InvalidDataTypeException
915
-     * @throws InvalidInterfaceException
916
-     * @throws InvalidClassException
917
-     * @throws InvalidFilePathException
918
-     */
919
-    private function _maybe_brew_regular()
920
-    {
921
-        /** @var Domain $domain */
922
-        $domain = DomainFactory::getShared(
923
-            new FullyQualifiedName(
924
-                'EventEspresso\core\domain\Domain'
925
-            ),
926
-            array(
927
-                new FilePath(EVENT_ESPRESSO_MAIN_FILE),
928
-                Version::fromString(espresso_version()),
929
-            )
930
-        );
931
-        if ($domain->isCaffeinated()) {
932
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
933
-        }
934
-    }
935
-
936
-
937
-    /**
938
-     * @since 4.9.71.p
939
-     * @throws Exception
940
-     */
941
-    public function loadRouteMatchSpecifications()
942
-    {
943
-        try {
944
-            $this->loader->getShared(
945
-                'EventEspresso\core\services\route_match\RouteMatchSpecificationManager'
946
-            );
947
-        } catch (Exception $exception) {
948
-            new ExceptionStackTraceDisplay($exception);
949
-        }
950
-        do_action('AHEE__EE_System__loadRouteMatchSpecifications');
951
-    }
952
-
953
-
954
-    /**
955
-     * register_shortcodes_modules_and_widgets
956
-     * generate lists of shortcodes and modules, then verify paths and classes
957
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
958
-     * which runs during the WP 'plugins_loaded' action at priority 7
959
-     *
960
-     * @access public
961
-     * @return void
962
-     * @throws Exception
963
-     */
964
-    public function register_shortcodes_modules_and_widgets()
965
-    {
966
-        if ($this->request->isFrontend() || $this->request->isIframe() || $this->request->isAjax()) {
967
-            try {
968
-                // load, register, and add shortcodes the new way
969
-                $this->loader->getShared(
970
-                    'EventEspresso\core\services\shortcodes\ShortcodesManager',
971
-                    array(
972
-                        // and the old way, but we'll put it under control of the new system
973
-                        EE_Config::getLegacyShortcodesManager(),
974
-                    )
975
-                );
976
-            } catch (Exception $exception) {
977
-                new ExceptionStackTraceDisplay($exception);
978
-            }
979
-        }
980
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
981
-        // check for addons using old hook point
982
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
983
-            $this->_incompatible_addon_error();
984
-        }
985
-    }
986
-
987
-
988
-    /**
989
-     * _incompatible_addon_error
990
-     *
991
-     * @access public
992
-     * @return void
993
-     */
994
-    private function _incompatible_addon_error()
995
-    {
996
-        // get array of classes hooking into here
997
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
998
-            'AHEE__EE_System__register_shortcodes_modules_and_addons'
999
-        );
1000
-        if (! empty($class_names)) {
1001
-            $msg = __(
1002
-                'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
1003
-                'event_espresso'
1004
-            );
1005
-            $msg .= '<ul>';
1006
-            foreach ($class_names as $class_name) {
1007
-                $msg .= '<li><b>Event Espresso - '
1008
-                        . str_replace(
1009
-                            array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1010
-                            '',
1011
-                            $class_name
1012
-                        ) . '</b></li>';
1013
-            }
1014
-            $msg .= '</ul>';
1015
-            $msg .= __(
1016
-                'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
1017
-                'event_espresso'
1018
-            );
1019
-            // save list of incompatible addons to wp-options for later use
1020
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
1021
-            if (is_admin()) {
1022
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1023
-            }
1024
-        }
1025
-    }
1026
-
1027
-
1028
-    /**
1029
-     * brew_espresso
1030
-     * begins the process of setting hooks for initializing EE in the correct order
1031
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1032
-     * which runs during the WP 'plugins_loaded' action at priority 9
1033
-     *
1034
-     * @return void
1035
-     */
1036
-    public function brew_espresso()
1037
-    {
1038
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
1039
-        // load some final core systems
1040
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
1041
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1042
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
1043
-        add_action('init', array($this, 'load_controllers'), 7);
1044
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
1045
-        add_action('init', array($this, 'initialize'), 10);
1046
-        add_action('init', array($this, 'initialize_last'), 100);
1047
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1048
-            // pew pew pew
1049
-            $this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1050
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1051
-        }
1052
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
1053
-    }
1054
-
1055
-
1056
-    /**
1057
-     *    set_hooks_for_core
1058
-     *
1059
-     * @access public
1060
-     * @return    void
1061
-     * @throws EE_Error
1062
-     */
1063
-    public function set_hooks_for_core()
1064
-    {
1065
-        $this->_deactivate_incompatible_addons();
1066
-        do_action('AHEE__EE_System__set_hooks_for_core');
1067
-        $this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1068
-        // caps need to be initialized on every request so that capability maps are set.
1069
-        // @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1070
-        $this->registry->CAP->init_caps();
1071
-    }
1072
-
1073
-
1074
-    /**
1075
-     * Using the information gathered in EE_System::_incompatible_addon_error,
1076
-     * deactivates any addons considered incompatible with the current version of EE
1077
-     */
1078
-    private function _deactivate_incompatible_addons()
1079
-    {
1080
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
1081
-        if (! empty($incompatible_addons)) {
1082
-            $active_plugins = get_option('active_plugins', array());
1083
-            foreach ($active_plugins as $active_plugin) {
1084
-                foreach ($incompatible_addons as $incompatible_addon) {
1085
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
1086
-                        unset($_GET['activate']);
1087
-                        espresso_deactivate_plugin($active_plugin);
1088
-                    }
1089
-                }
1090
-            }
1091
-        }
1092
-    }
1093
-
1094
-
1095
-    /**
1096
-     *    perform_activations_upgrades_and_migrations
1097
-     *
1098
-     * @access public
1099
-     * @return    void
1100
-     */
1101
-    public function perform_activations_upgrades_and_migrations()
1102
-    {
1103
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1104
-    }
1105
-
1106
-
1107
-    /**
1108
-     * @return void
1109
-     * @throws DomainException
1110
-     */
1111
-    public function load_CPTs_and_session()
1112
-    {
1113
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
1114
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1115
-        $register_custom_taxonomies = $this->loader->getShared(
1116
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1117
-        );
1118
-        $register_custom_taxonomies->registerCustomTaxonomies();
1119
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1120
-        $register_custom_post_types = $this->loader->getShared(
1121
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1122
-        );
1123
-        $register_custom_post_types->registerCustomPostTypes();
1124
-        /** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1125
-        $register_custom_taxonomy_terms = $this->loader->getShared(
1126
-            'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1127
-        );
1128
-        $register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1129
-        // load legacy Custom Post Types and Taxonomies
1130
-        $this->loader->getShared('EE_Register_CPTs');
1131
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1132
-    }
1133
-
1134
-
1135
-    /**
1136
-     * load_controllers
1137
-     * this is the best place to load any additional controllers that needs access to EE core.
1138
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1139
-     * time
1140
-     *
1141
-     * @access public
1142
-     * @return void
1143
-     */
1144
-    public function load_controllers()
1145
-    {
1146
-        do_action('AHEE__EE_System__load_controllers__start');
1147
-        // let's get it started
1148
-        if (! $this->maintenance_mode->level()
1149
-            && ($this->request->isFrontend() || $this->request->isFrontAjax())
1150
-        ) {
1151
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1152
-            $this->loader->getShared('EE_Front_Controller');
1153
-        } elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1154
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1155
-            $this->loader->getShared('EE_Admin');
1156
-        } elseif ($this->request->isWordPressHeartbeat()) {
1157
-            $this->loader->getShared('EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat');
1158
-        }
1159
-        do_action('AHEE__EE_System__load_controllers__complete');
1160
-    }
1161
-
1162
-
1163
-    /**
1164
-     * core_loaded_and_ready
1165
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1166
-     *
1167
-     * @access public
1168
-     * @return void
1169
-     * @throws Exception
1170
-     */
1171
-    public function core_loaded_and_ready()
1172
-    {
1173
-        if ($this->request->isAdmin()
1174
-            || $this->request->isFrontend()
1175
-            || $this->request->isIframe()
1176
-            || $this->request->isWordPressApi()
1177
-        ) {
1178
-            try {
1179
-                $this->loader->getShared('EventEspresso\core\services\assets\Registry');
1180
-                $this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1181
-                if ($this->canLoadBlocks()) {
1182
-                    $this->loader->getShared(
1183
-                        'EventEspresso\core\services\editor\BlockRegistrationManager'
1184
-                    );
1185
-                }
1186
-            } catch (Exception $exception) {
1187
-                new ExceptionStackTraceDisplay($exception);
1188
-            }
1189
-        }
1190
-        if ($this->request->isAdmin()
1191
-            || $this->request->isEeAjax()
1192
-            || $this->request->isFrontend()
1193
-        ) {
1194
-            $this->loader->getShared('EE_Session');
1195
-        }
1196
-        // integrate WP_Query with the EE models
1197
-        $this->loader->getShared('EE_CPT_Strategy');
1198
-        do_action('AHEE__EE_System__core_loaded_and_ready');
1199
-        // always load template tags, because it's faster than checking if it's a front-end request, and many page
1200
-        // builders require these even on the front-end
1201
-        require_once EE_PUBLIC . 'template_tags.php';
1202
-        // load handler for GraphQL requests
1203
-        if (class_exists('WPGraphQL') /* && $this->request->isGQL() */) {
1204
-            try {
1205
-                $graphQL_manager = $this->loader->getShared(
1206
-                    'EventEspresso\core\services\graphql\GraphQLManager'
1207
-                );
1208
-                $graphQL_manager->init();
1209
-            } catch (Exception $exception) {
1210
-                new ExceptionStackTraceDisplay($exception);
1211
-            }
1212
-        }
1213
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1214
-    }
1215
-
1216
-
1217
-    /**
1218
-     * initialize
1219
-     * this is the best place to begin initializing client code
1220
-     *
1221
-     * @access public
1222
-     * @return void
1223
-     */
1224
-    public function initialize()
1225
-    {
1226
-        do_action('AHEE__EE_System__initialize');
1227
-    }
1228
-
1229
-
1230
-    /**
1231
-     * initialize_last
1232
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1233
-     * initialize has done so
1234
-     *
1235
-     * @access public
1236
-     * @return void
1237
-     */
1238
-    public function initialize_last()
1239
-    {
1240
-        do_action('AHEE__EE_System__initialize_last');
1241
-        /** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1242
-        $rewrite_rules = $this->loader->getShared(
1243
-            'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1244
-        );
1245
-        $rewrite_rules->flushRewriteRules();
1246
-        add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1247
-        if (($this->request->isAjax() || $this->request->isAdmin())
1248
-            && $this->maintenance_mode->models_can_query()) {
1249
-            $this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1250
-            $this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1251
-        }
1252
-    }
1253
-
1254
-
1255
-    /**
1256
-     * @return void
1257
-     * @throws EE_Error
1258
-     */
1259
-    public function addEspressoToolbar()
1260
-    {
1261
-        $this->loader->getShared(
1262
-            'EventEspresso\core\domain\services\admin\AdminToolBar',
1263
-            array($this->registry->CAP)
1264
-        );
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * do_not_cache
1270
-     * sets no cache headers and defines no cache constants for WP plugins
1271
-     *
1272
-     * @access public
1273
-     * @return void
1274
-     */
1275
-    public static function do_not_cache()
1276
-    {
1277
-        // set no cache constants
1278
-        if (! defined('DONOTCACHEPAGE')) {
1279
-            define('DONOTCACHEPAGE', true);
1280
-        }
1281
-        if (! defined('DONOTCACHCEOBJECT')) {
1282
-            define('DONOTCACHCEOBJECT', true);
1283
-        }
1284
-        if (! defined('DONOTCACHEDB')) {
1285
-            define('DONOTCACHEDB', true);
1286
-        }
1287
-        // add no cache headers
1288
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1289
-        // plus a little extra for nginx and Google Chrome
1290
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1291
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1292
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1293
-    }
1294
-
1295
-
1296
-    /**
1297
-     *    extra_nocache_headers
1298
-     *
1299
-     * @access    public
1300
-     * @param $headers
1301
-     * @return    array
1302
-     */
1303
-    public static function extra_nocache_headers($headers)
1304
-    {
1305
-        // for NGINX
1306
-        $headers['X-Accel-Expires'] = 0;
1307
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1308
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1309
-        return $headers;
1310
-    }
1311
-
1312
-
1313
-    /**
1314
-     *    nocache_headers
1315
-     *
1316
-     * @access    public
1317
-     * @return    void
1318
-     */
1319
-    public static function nocache_headers()
1320
-    {
1321
-        nocache_headers();
1322
-    }
1323
-
1324
-
1325
-    /**
1326
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1327
-     * never returned with the function.
1328
-     *
1329
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1330
-     * @return array
1331
-     */
1332
-    public function remove_pages_from_wp_list_pages($exclude_array)
1333
-    {
1334
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1335
-    }
1336
-
1337
-
1338
-    /**
1339
-     * Return whether blocks can be registered/loaded or not.
1340
-     * @return bool
1341
-     */
1342
-    private function canLoadBlocks()
1343
-    {
1344
-        return apply_filters('FHEE__EE_System__canLoadBlocks', true)
1345
-               && function_exists('register_block_type')
1346
-               // don't load blocks if in the Divi page builder editor context
1347
-               // @see https://github.com/eventespresso/event-espresso-core/issues/814
1348
-               && ! $this->request->getRequestParam('et_fb', false);
1349
-    }
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->isWordPressApi() || $this->request->isApi())
390
+			&& $this->request->getRequestParam('activate') !== 'true'
391
+			&& ! function_exists('json_basic_auth_handler')
392
+			&& ! function_exists('json_basic_auth_error')
393
+			&& ! in_array(
394
+				$this->request->getRequestParam('action'),
395
+				array('activate', 'activate-selected'),
396
+				true
397
+			)
398
+		) {
399
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
400
+		}
401
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
402
+	}
403
+
404
+
405
+	/**
406
+	 * detect_activations_or_upgrades
407
+	 * Checks for activation or upgrade of core first;
408
+	 * then also checks if any registered addons have been activated or upgraded
409
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
410
+	 * which runs during the WP 'plugins_loaded' action at priority 3
411
+	 *
412
+	 * @access public
413
+	 * @return void
414
+	 */
415
+	public function detect_activations_or_upgrades()
416
+	{
417
+		// first off: let's make sure to handle core
418
+		$this->detect_if_activation_or_upgrade();
419
+		foreach ($this->registry->addons as $addon) {
420
+			if ($addon instanceof EE_Addon) {
421
+				// detect teh request type for that addon
422
+				$addon->detect_activation_or_upgrade();
423
+			}
424
+		}
425
+	}
426
+
427
+
428
+	/**
429
+	 * detect_if_activation_or_upgrade
430
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
431
+	 * and either setting up the DB or setting up maintenance mode etc.
432
+	 *
433
+	 * @access public
434
+	 * @return void
435
+	 */
436
+	public function detect_if_activation_or_upgrade()
437
+	{
438
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
439
+		// check if db has been updated, or if its a brand-new installation
440
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
441
+		$request_type = $this->detect_req_type($espresso_db_update);
442
+		// EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
443
+		switch ($request_type) {
444
+			case EE_System::req_type_new_activation:
445
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
446
+				$this->_handle_core_version_change($espresso_db_update);
447
+				break;
448
+			case EE_System::req_type_reactivation:
449
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
450
+				$this->_handle_core_version_change($espresso_db_update);
451
+				break;
452
+			case EE_System::req_type_upgrade:
453
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
454
+				// migrations may be required now that we've upgraded
455
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
456
+				$this->_handle_core_version_change($espresso_db_update);
457
+				break;
458
+			case EE_System::req_type_downgrade:
459
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
460
+				// its possible migrations are no longer required
461
+				$this->maintenance_mode->set_maintenance_mode_if_db_old();
462
+				$this->_handle_core_version_change($espresso_db_update);
463
+				break;
464
+			case EE_System::req_type_normal:
465
+			default:
466
+				break;
467
+		}
468
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
469
+	}
470
+
471
+
472
+	/**
473
+	 * Updates the list of installed versions and sets hooks for
474
+	 * initializing the database later during the request
475
+	 *
476
+	 * @param array $espresso_db_update
477
+	 */
478
+	private function _handle_core_version_change($espresso_db_update)
479
+	{
480
+		$this->update_list_of_installed_versions($espresso_db_update);
481
+		// get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
482
+		add_action(
483
+			'AHEE__EE_System__perform_activations_upgrades_and_migrations',
484
+			array($this, 'initialize_db_if_no_migrations_required')
485
+		);
486
+	}
487
+
488
+
489
+	/**
490
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
491
+	 * information about what versions of EE have been installed and activated,
492
+	 * NOT necessarily the state of the database
493
+	 *
494
+	 * @param mixed $espresso_db_update           the value of the WordPress option.
495
+	 *                                            If not supplied, fetches it from the options table
496
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
497
+	 */
498
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
499
+	{
500
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
501
+		if (! $espresso_db_update) {
502
+			$espresso_db_update = get_option('espresso_db_update');
503
+		}
504
+		// check that option is an array
505
+		if (! is_array($espresso_db_update)) {
506
+			// if option is FALSE, then it never existed
507
+			if ($espresso_db_update === false) {
508
+				// make $espresso_db_update an array and save option with autoload OFF
509
+				$espresso_db_update = array();
510
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
511
+			} else {
512
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
513
+				$espresso_db_update = array($espresso_db_update => array());
514
+				update_option('espresso_db_update', $espresso_db_update);
515
+			}
516
+		} else {
517
+			$corrected_db_update = array();
518
+			// if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
519
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
520
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
521
+					// the key is an int, and the value IS NOT an array
522
+					// so it must be numerically-indexed, where values are versions installed...
523
+					// fix it!
524
+					$version_string = $should_be_array;
525
+					$corrected_db_update[ $version_string ] = array('unknown-date');
526
+				} else {
527
+					// ok it checks out
528
+					$corrected_db_update[ $should_be_version_string ] = $should_be_array;
529
+				}
530
+			}
531
+			$espresso_db_update = $corrected_db_update;
532
+			update_option('espresso_db_update', $espresso_db_update);
533
+		}
534
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
535
+		return $espresso_db_update;
536
+	}
537
+
538
+
539
+	/**
540
+	 * Does the traditional work of setting up the plugin's database and adding default data.
541
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
542
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
543
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
544
+	 * so that it will be done when migrations are finished
545
+	 *
546
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
547
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
548
+	 *                                       This is a resource-intensive job
549
+	 *                                       so we prefer to only do it when necessary
550
+	 * @return void
551
+	 * @throws EE_Error
552
+	 */
553
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
554
+	{
555
+		$request_type = $this->detect_req_type();
556
+		// only initialize system if we're not in maintenance mode.
557
+		if ($this->maintenance_mode->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
558
+			/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
559
+			$rewrite_rules = $this->loader->getShared(
560
+				'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
561
+			);
562
+			$rewrite_rules->flush();
563
+			if ($verify_schema) {
564
+				EEH_Activation::initialize_db_and_folders();
565
+			}
566
+			EEH_Activation::initialize_db_content();
567
+			EEH_Activation::system_initialization();
568
+			if ($initialize_addons_too) {
569
+				$this->initialize_addons();
570
+			}
571
+		} else {
572
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
573
+		}
574
+		if ($request_type === EE_System::req_type_new_activation
575
+			|| $request_type === EE_System::req_type_reactivation
576
+			|| (
577
+				$request_type === EE_System::req_type_upgrade
578
+				&& $this->is_major_version_change()
579
+			)
580
+		) {
581
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
582
+		}
583
+	}
584
+
585
+
586
+	/**
587
+	 * Initializes the db for all registered addons
588
+	 *
589
+	 * @throws EE_Error
590
+	 */
591
+	public function initialize_addons()
592
+	{
593
+		// foreach registered addon, make sure its db is up-to-date too
594
+		foreach ($this->registry->addons as $addon) {
595
+			if ($addon instanceof EE_Addon) {
596
+				$addon->initialize_db_if_no_migrations_required();
597
+			}
598
+		}
599
+	}
600
+
601
+
602
+	/**
603
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
604
+	 *
605
+	 * @param    array  $version_history
606
+	 * @param    string $current_version_to_add version to be added to the version history
607
+	 * @return    boolean success as to whether or not this option was changed
608
+	 */
609
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
610
+	{
611
+		if (! $version_history) {
612
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
613
+		}
614
+		if ($current_version_to_add === null) {
615
+			$current_version_to_add = espresso_version();
616
+		}
617
+		$version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
618
+		// re-save
619
+		return update_option('espresso_db_update', $version_history);
620
+	}
621
+
622
+
623
+	/**
624
+	 * Detects if the current version indicated in the has existed in the list of
625
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
626
+	 *
627
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
628
+	 *                                  If not supplied, fetches it from the options table.
629
+	 *                                  Also, caches its result so later parts of the code can also know whether
630
+	 *                                  there's been an update or not. This way we can add the current version to
631
+	 *                                  espresso_db_update, but still know if this is a new install or not
632
+	 * @return int one of the constants on EE_System::req_type_
633
+	 */
634
+	public function detect_req_type($espresso_db_update = null)
635
+	{
636
+		if ($this->_req_type === null) {
637
+			$espresso_db_update = ! empty($espresso_db_update)
638
+				? $espresso_db_update
639
+				: $this->fix_espresso_db_upgrade_option();
640
+			$this->_req_type = EE_System::detect_req_type_given_activation_history(
641
+				$espresso_db_update,
642
+				'ee_espresso_activation',
643
+				espresso_version()
644
+			);
645
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
646
+			$this->request->setIsActivation($this->_req_type !== EE_System::req_type_normal);
647
+		}
648
+		return $this->_req_type;
649
+	}
650
+
651
+
652
+	/**
653
+	 * Returns whether or not there was a non-micro version change (ie, change in either
654
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
655
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
656
+	 *
657
+	 * @param $activation_history
658
+	 * @return bool
659
+	 */
660
+	private function _detect_major_version_change($activation_history)
661
+	{
662
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
663
+		$previous_version_parts = explode('.', $previous_version);
664
+		$current_version_parts = explode('.', espresso_version());
665
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
666
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
667
+				   || $previous_version_parts[1] !== $current_version_parts[1]
668
+			   );
669
+	}
670
+
671
+
672
+	/**
673
+	 * Returns true if either the major or minor version of EE changed during this request.
674
+	 * 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
675
+	 *
676
+	 * @return bool
677
+	 */
678
+	public function is_major_version_change()
679
+	{
680
+		return $this->_major_version_change;
681
+	}
682
+
683
+
684
+	/**
685
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
686
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
687
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
688
+	 * just activated to (for core that will always be espresso_version())
689
+	 *
690
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
691
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
692
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
693
+	 *                                                 indicate that this plugin was just activated
694
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
695
+	 *                                                 espresso_version())
696
+	 * @return int one of the constants on EE_System::req_type_*
697
+	 */
698
+	public static function detect_req_type_given_activation_history(
699
+		$activation_history_for_addon,
700
+		$activation_indicator_option_name,
701
+		$version_to_upgrade_to
702
+	) {
703
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
704
+		if ($activation_history_for_addon) {
705
+			// it exists, so this isn't a completely new install
706
+			// check if this version already in that list of previously installed versions
707
+			if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
708
+				// it a version we haven't seen before
709
+				if ($version_is_higher === 1) {
710
+					$req_type = EE_System::req_type_upgrade;
711
+				} else {
712
+					$req_type = EE_System::req_type_downgrade;
713
+				}
714
+				delete_option($activation_indicator_option_name);
715
+			} else {
716
+				// its not an update. maybe a reactivation?
717
+				if (get_option($activation_indicator_option_name, false)) {
718
+					if ($version_is_higher === -1) {
719
+						$req_type = EE_System::req_type_downgrade;
720
+					} elseif ($version_is_higher === 0) {
721
+						// we've seen this version before, but it's an activation. must be a reactivation
722
+						$req_type = EE_System::req_type_reactivation;
723
+					} else {// $version_is_higher === 1
724
+						$req_type = EE_System::req_type_upgrade;
725
+					}
726
+					delete_option($activation_indicator_option_name);
727
+				} else {
728
+					// we've seen this version before and the activation indicate doesn't show it was just activated
729
+					if ($version_is_higher === -1) {
730
+						$req_type = EE_System::req_type_downgrade;
731
+					} elseif ($version_is_higher === 0) {
732
+						// we've seen this version before and it's not an activation. its normal request
733
+						$req_type = EE_System::req_type_normal;
734
+					} else {// $version_is_higher === 1
735
+						$req_type = EE_System::req_type_upgrade;
736
+					}
737
+				}
738
+			}
739
+		} else {
740
+			// brand new install
741
+			$req_type = EE_System::req_type_new_activation;
742
+			delete_option($activation_indicator_option_name);
743
+		}
744
+		return $req_type;
745
+	}
746
+
747
+
748
+	/**
749
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
750
+	 * the $activation_history_for_addon
751
+	 *
752
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
753
+	 *                                             sometimes containing 'unknown-date'
754
+	 * @param string $version_to_upgrade_to        (current version)
755
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
756
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
757
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
758
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
759
+	 */
760
+	private static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
761
+	{
762
+		// find the most recently-activated version
763
+		$most_recently_active_version =
764
+			EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
765
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
766
+	}
767
+
768
+
769
+	/**
770
+	 * Gets the most recently active version listed in the activation history,
771
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
772
+	 *
773
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
774
+	 *                                   sometimes containing 'unknown-date'
775
+	 * @return string
776
+	 */
777
+	private static function _get_most_recently_active_version_from_activation_history($activation_history)
778
+	{
779
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
780
+		$most_recently_active_version = '0.0.0.dev.000';
781
+		if (is_array($activation_history)) {
782
+			foreach ($activation_history as $version => $times_activated) {
783
+				// check there is a record of when this version was activated. Otherwise,
784
+				// mark it as unknown
785
+				if (! $times_activated) {
786
+					$times_activated = array('unknown-date');
787
+				}
788
+				if (is_string($times_activated)) {
789
+					$times_activated = array($times_activated);
790
+				}
791
+				foreach ($times_activated as $an_activation) {
792
+					if ($an_activation !== 'unknown-date'
793
+						&& $an_activation
794
+						   > $most_recently_active_version_activation) {
795
+						$most_recently_active_version = $version;
796
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
797
+							? '1970-01-01 00:00:00'
798
+							: $an_activation;
799
+					}
800
+				}
801
+			}
802
+		}
803
+		return $most_recently_active_version;
804
+	}
805
+
806
+
807
+	/**
808
+	 * This redirects to the about EE page after activation
809
+	 *
810
+	 * @return void
811
+	 */
812
+	public function redirect_to_about_ee()
813
+	{
814
+		$notices = EE_Error::get_notices(false);
815
+		// if current user is an admin and it's not an ajax or rest request
816
+		if (! isset($notices['errors'])
817
+			&& $this->request->isAdmin()
818
+			&& apply_filters(
819
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
820
+				$this->capabilities->current_user_can('manage_options', 'espresso_about_default')
821
+			)
822
+		) {
823
+			$query_params = array('page' => 'espresso_about');
824
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
825
+				$query_params['new_activation'] = true;
826
+			}
827
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
828
+				$query_params['reactivation'] = true;
829
+			}
830
+			$url = add_query_arg($query_params, admin_url('admin.php'));
831
+			wp_safe_redirect($url);
832
+			exit();
833
+		}
834
+	}
835
+
836
+
837
+	/**
838
+	 * load_core_configuration
839
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
840
+	 * which runs during the WP 'plugins_loaded' action at priority 5
841
+	 *
842
+	 * @return void
843
+	 * @throws ReflectionException
844
+	 * @throws Exception
845
+	 */
846
+	public function load_core_configuration()
847
+	{
848
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
849
+		$this->loader->getShared('EE_Load_Textdomain');
850
+		// load textdomain
851
+		EE_Load_Textdomain::load_textdomain();
852
+		// load caf stuff a chance to play during the activation process too.
853
+		$this->_maybe_brew_regular();
854
+		// load and setup EE_Config and EE_Network_Config
855
+		$config = $this->loader->getShared('EE_Config');
856
+		$this->loader->getShared('EE_Network_Config');
857
+		// setup autoloaders
858
+		// enable logging?
859
+		if ($config->admin->use_remote_logging) {
860
+			$this->loader->getShared('EE_Log');
861
+		}
862
+		// check for activation errors
863
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
864
+		if ($activation_errors) {
865
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
866
+			update_option('ee_plugin_activation_errors', false);
867
+		}
868
+		// get model names
869
+		$this->_parse_model_names();
870
+		// configure custom post type definitions
871
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions');
872
+		$this->loader->getShared('EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions');
873
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
874
+	}
875
+
876
+
877
+	/**
878
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
879
+	 *
880
+	 * @return void
881
+	 * @throws ReflectionException
882
+	 */
883
+	private function _parse_model_names()
884
+	{
885
+		// get all the files in the EE_MODELS folder that end in .model.php
886
+		$models = glob(EE_MODELS . '*.model.php');
887
+		$model_names = array();
888
+		$non_abstract_db_models = array();
889
+		foreach ($models as $model) {
890
+			// get model classname
891
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
892
+			$short_name = str_replace('EEM_', '', $classname);
893
+			$reflectionClass = new ReflectionClass($classname);
894
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
895
+				$non_abstract_db_models[ $short_name ] = $classname;
896
+			}
897
+			$model_names[ $short_name ] = $classname;
898
+		}
899
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
900
+		$this->registry->non_abstract_db_models = apply_filters(
901
+			'FHEE__EE_System__parse_implemented_model_names',
902
+			$non_abstract_db_models
903
+		);
904
+	}
905
+
906
+
907
+	/**
908
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
909
+	 * that need to be setup before our EE_System launches.
910
+	 *
911
+	 * @return void
912
+	 * @throws DomainException
913
+	 * @throws InvalidArgumentException
914
+	 * @throws InvalidDataTypeException
915
+	 * @throws InvalidInterfaceException
916
+	 * @throws InvalidClassException
917
+	 * @throws InvalidFilePathException
918
+	 */
919
+	private function _maybe_brew_regular()
920
+	{
921
+		/** @var Domain $domain */
922
+		$domain = DomainFactory::getShared(
923
+			new FullyQualifiedName(
924
+				'EventEspresso\core\domain\Domain'
925
+			),
926
+			array(
927
+				new FilePath(EVENT_ESPRESSO_MAIN_FILE),
928
+				Version::fromString(espresso_version()),
929
+			)
930
+		);
931
+		if ($domain->isCaffeinated()) {
932
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
933
+		}
934
+	}
935
+
936
+
937
+	/**
938
+	 * @since 4.9.71.p
939
+	 * @throws Exception
940
+	 */
941
+	public function loadRouteMatchSpecifications()
942
+	{
943
+		try {
944
+			$this->loader->getShared(
945
+				'EventEspresso\core\services\route_match\RouteMatchSpecificationManager'
946
+			);
947
+		} catch (Exception $exception) {
948
+			new ExceptionStackTraceDisplay($exception);
949
+		}
950
+		do_action('AHEE__EE_System__loadRouteMatchSpecifications');
951
+	}
952
+
953
+
954
+	/**
955
+	 * register_shortcodes_modules_and_widgets
956
+	 * generate lists of shortcodes and modules, then verify paths and classes
957
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
958
+	 * which runs during the WP 'plugins_loaded' action at priority 7
959
+	 *
960
+	 * @access public
961
+	 * @return void
962
+	 * @throws Exception
963
+	 */
964
+	public function register_shortcodes_modules_and_widgets()
965
+	{
966
+		if ($this->request->isFrontend() || $this->request->isIframe() || $this->request->isAjax()) {
967
+			try {
968
+				// load, register, and add shortcodes the new way
969
+				$this->loader->getShared(
970
+					'EventEspresso\core\services\shortcodes\ShortcodesManager',
971
+					array(
972
+						// and the old way, but we'll put it under control of the new system
973
+						EE_Config::getLegacyShortcodesManager(),
974
+					)
975
+				);
976
+			} catch (Exception $exception) {
977
+				new ExceptionStackTraceDisplay($exception);
978
+			}
979
+		}
980
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
981
+		// check for addons using old hook point
982
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
983
+			$this->_incompatible_addon_error();
984
+		}
985
+	}
986
+
987
+
988
+	/**
989
+	 * _incompatible_addon_error
990
+	 *
991
+	 * @access public
992
+	 * @return void
993
+	 */
994
+	private function _incompatible_addon_error()
995
+	{
996
+		// get array of classes hooking into here
997
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
998
+			'AHEE__EE_System__register_shortcodes_modules_and_addons'
999
+		);
1000
+		if (! empty($class_names)) {
1001
+			$msg = __(
1002
+				'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
1003
+				'event_espresso'
1004
+			);
1005
+			$msg .= '<ul>';
1006
+			foreach ($class_names as $class_name) {
1007
+				$msg .= '<li><b>Event Espresso - '
1008
+						. str_replace(
1009
+							array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1010
+							'',
1011
+							$class_name
1012
+						) . '</b></li>';
1013
+			}
1014
+			$msg .= '</ul>';
1015
+			$msg .= __(
1016
+				'Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
1017
+				'event_espresso'
1018
+			);
1019
+			// save list of incompatible addons to wp-options for later use
1020
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
1021
+			if (is_admin()) {
1022
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1023
+			}
1024
+		}
1025
+	}
1026
+
1027
+
1028
+	/**
1029
+	 * brew_espresso
1030
+	 * begins the process of setting hooks for initializing EE in the correct order
1031
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
1032
+	 * which runs during the WP 'plugins_loaded' action at priority 9
1033
+	 *
1034
+	 * @return void
1035
+	 */
1036
+	public function brew_espresso()
1037
+	{
1038
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
1039
+		// load some final core systems
1040
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
1041
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
1042
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
1043
+		add_action('init', array($this, 'load_controllers'), 7);
1044
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
1045
+		add_action('init', array($this, 'initialize'), 10);
1046
+		add_action('init', array($this, 'initialize_last'), 100);
1047
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
1048
+			// pew pew pew
1049
+			$this->loader->getShared('EventEspresso\core\services\licensing\LicenseService');
1050
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
1051
+		}
1052
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
1053
+	}
1054
+
1055
+
1056
+	/**
1057
+	 *    set_hooks_for_core
1058
+	 *
1059
+	 * @access public
1060
+	 * @return    void
1061
+	 * @throws EE_Error
1062
+	 */
1063
+	public function set_hooks_for_core()
1064
+	{
1065
+		$this->_deactivate_incompatible_addons();
1066
+		do_action('AHEE__EE_System__set_hooks_for_core');
1067
+		$this->loader->getShared('EventEspresso\core\domain\values\session\SessionLifespan');
1068
+		// caps need to be initialized on every request so that capability maps are set.
1069
+		// @see https://events.codebasehq.com/projects/event-espresso/tickets/8674
1070
+		$this->registry->CAP->init_caps();
1071
+	}
1072
+
1073
+
1074
+	/**
1075
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
1076
+	 * deactivates any addons considered incompatible with the current version of EE
1077
+	 */
1078
+	private function _deactivate_incompatible_addons()
1079
+	{
1080
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
1081
+		if (! empty($incompatible_addons)) {
1082
+			$active_plugins = get_option('active_plugins', array());
1083
+			foreach ($active_plugins as $active_plugin) {
1084
+				foreach ($incompatible_addons as $incompatible_addon) {
1085
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
1086
+						unset($_GET['activate']);
1087
+						espresso_deactivate_plugin($active_plugin);
1088
+					}
1089
+				}
1090
+			}
1091
+		}
1092
+	}
1093
+
1094
+
1095
+	/**
1096
+	 *    perform_activations_upgrades_and_migrations
1097
+	 *
1098
+	 * @access public
1099
+	 * @return    void
1100
+	 */
1101
+	public function perform_activations_upgrades_and_migrations()
1102
+	{
1103
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
1104
+	}
1105
+
1106
+
1107
+	/**
1108
+	 * @return void
1109
+	 * @throws DomainException
1110
+	 */
1111
+	public function load_CPTs_and_session()
1112
+	{
1113
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
1114
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies $register_custom_taxonomies */
1115
+		$register_custom_taxonomies = $this->loader->getShared(
1116
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies'
1117
+		);
1118
+		$register_custom_taxonomies->registerCustomTaxonomies();
1119
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes $register_custom_post_types */
1120
+		$register_custom_post_types = $this->loader->getShared(
1121
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes'
1122
+		);
1123
+		$register_custom_post_types->registerCustomPostTypes();
1124
+		/** @var EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms $register_custom_taxonomy_terms */
1125
+		$register_custom_taxonomy_terms = $this->loader->getShared(
1126
+			'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomyTerms'
1127
+		);
1128
+		$register_custom_taxonomy_terms->registerCustomTaxonomyTerms();
1129
+		// load legacy Custom Post Types and Taxonomies
1130
+		$this->loader->getShared('EE_Register_CPTs');
1131
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
1132
+	}
1133
+
1134
+
1135
+	/**
1136
+	 * load_controllers
1137
+	 * this is the best place to load any additional controllers that needs access to EE core.
1138
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
1139
+	 * time
1140
+	 *
1141
+	 * @access public
1142
+	 * @return void
1143
+	 */
1144
+	public function load_controllers()
1145
+	{
1146
+		do_action('AHEE__EE_System__load_controllers__start');
1147
+		// let's get it started
1148
+		if (! $this->maintenance_mode->level()
1149
+			&& ($this->request->isFrontend() || $this->request->isFrontAjax())
1150
+		) {
1151
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
1152
+			$this->loader->getShared('EE_Front_Controller');
1153
+		} elseif ($this->request->isAdmin() || $this->request->isAdminAjax()) {
1154
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
1155
+			$this->loader->getShared('EE_Admin');
1156
+		} elseif ($this->request->isWordPressHeartbeat()) {
1157
+			$this->loader->getShared('EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat');
1158
+		}
1159
+		do_action('AHEE__EE_System__load_controllers__complete');
1160
+	}
1161
+
1162
+
1163
+	/**
1164
+	 * core_loaded_and_ready
1165
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
1166
+	 *
1167
+	 * @access public
1168
+	 * @return void
1169
+	 * @throws Exception
1170
+	 */
1171
+	public function core_loaded_and_ready()
1172
+	{
1173
+		if ($this->request->isAdmin()
1174
+			|| $this->request->isFrontend()
1175
+			|| $this->request->isIframe()
1176
+			|| $this->request->isWordPressApi()
1177
+		) {
1178
+			try {
1179
+				$this->loader->getShared('EventEspresso\core\services\assets\Registry');
1180
+				$this->loader->getShared('EventEspresso\core\domain\services\assets\CoreAssetManager');
1181
+				if ($this->canLoadBlocks()) {
1182
+					$this->loader->getShared(
1183
+						'EventEspresso\core\services\editor\BlockRegistrationManager'
1184
+					);
1185
+				}
1186
+			} catch (Exception $exception) {
1187
+				new ExceptionStackTraceDisplay($exception);
1188
+			}
1189
+		}
1190
+		if ($this->request->isAdmin()
1191
+			|| $this->request->isEeAjax()
1192
+			|| $this->request->isFrontend()
1193
+		) {
1194
+			$this->loader->getShared('EE_Session');
1195
+		}
1196
+		// integrate WP_Query with the EE models
1197
+		$this->loader->getShared('EE_CPT_Strategy');
1198
+		do_action('AHEE__EE_System__core_loaded_and_ready');
1199
+		// always load template tags, because it's faster than checking if it's a front-end request, and many page
1200
+		// builders require these even on the front-end
1201
+		require_once EE_PUBLIC . 'template_tags.php';
1202
+		// load handler for GraphQL requests
1203
+		if (class_exists('WPGraphQL') /* && $this->request->isGQL() */) {
1204
+			try {
1205
+				$graphQL_manager = $this->loader->getShared(
1206
+					'EventEspresso\core\services\graphql\GraphQLManager'
1207
+				);
1208
+				$graphQL_manager->init();
1209
+			} catch (Exception $exception) {
1210
+				new ExceptionStackTraceDisplay($exception);
1211
+			}
1212
+		}
1213
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
1214
+	}
1215
+
1216
+
1217
+	/**
1218
+	 * initialize
1219
+	 * this is the best place to begin initializing client code
1220
+	 *
1221
+	 * @access public
1222
+	 * @return void
1223
+	 */
1224
+	public function initialize()
1225
+	{
1226
+		do_action('AHEE__EE_System__initialize');
1227
+	}
1228
+
1229
+
1230
+	/**
1231
+	 * initialize_last
1232
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
1233
+	 * initialize has done so
1234
+	 *
1235
+	 * @access public
1236
+	 * @return void
1237
+	 */
1238
+	public function initialize_last()
1239
+	{
1240
+		do_action('AHEE__EE_System__initialize_last');
1241
+		/** @var EventEspresso\core\domain\services\custom_post_types\RewriteRules $rewrite_rules */
1242
+		$rewrite_rules = $this->loader->getShared(
1243
+			'EventEspresso\core\domain\services\custom_post_types\RewriteRules'
1244
+		);
1245
+		$rewrite_rules->flushRewriteRules();
1246
+		add_action('admin_bar_init', array($this, 'addEspressoToolbar'));
1247
+		if (($this->request->isAjax() || $this->request->isAdmin())
1248
+			&& $this->maintenance_mode->models_can_query()) {
1249
+			$this->loader->getShared('EventEspresso\core\services\privacy\export\PersonalDataExporterManager');
1250
+			$this->loader->getShared('EventEspresso\core\services\privacy\erasure\PersonalDataEraserManager');
1251
+		}
1252
+	}
1253
+
1254
+
1255
+	/**
1256
+	 * @return void
1257
+	 * @throws EE_Error
1258
+	 */
1259
+	public function addEspressoToolbar()
1260
+	{
1261
+		$this->loader->getShared(
1262
+			'EventEspresso\core\domain\services\admin\AdminToolBar',
1263
+			array($this->registry->CAP)
1264
+		);
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * do_not_cache
1270
+	 * sets no cache headers and defines no cache constants for WP plugins
1271
+	 *
1272
+	 * @access public
1273
+	 * @return void
1274
+	 */
1275
+	public static function do_not_cache()
1276
+	{
1277
+		// set no cache constants
1278
+		if (! defined('DONOTCACHEPAGE')) {
1279
+			define('DONOTCACHEPAGE', true);
1280
+		}
1281
+		if (! defined('DONOTCACHCEOBJECT')) {
1282
+			define('DONOTCACHCEOBJECT', true);
1283
+		}
1284
+		if (! defined('DONOTCACHEDB')) {
1285
+			define('DONOTCACHEDB', true);
1286
+		}
1287
+		// add no cache headers
1288
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1289
+		// plus a little extra for nginx and Google Chrome
1290
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1291
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1292
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1293
+	}
1294
+
1295
+
1296
+	/**
1297
+	 *    extra_nocache_headers
1298
+	 *
1299
+	 * @access    public
1300
+	 * @param $headers
1301
+	 * @return    array
1302
+	 */
1303
+	public static function extra_nocache_headers($headers)
1304
+	{
1305
+		// for NGINX
1306
+		$headers['X-Accel-Expires'] = 0;
1307
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1308
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1309
+		return $headers;
1310
+	}
1311
+
1312
+
1313
+	/**
1314
+	 *    nocache_headers
1315
+	 *
1316
+	 * @access    public
1317
+	 * @return    void
1318
+	 */
1319
+	public static function nocache_headers()
1320
+	{
1321
+		nocache_headers();
1322
+	}
1323
+
1324
+
1325
+	/**
1326
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1327
+	 * never returned with the function.
1328
+	 *
1329
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1330
+	 * @return array
1331
+	 */
1332
+	public function remove_pages_from_wp_list_pages($exclude_array)
1333
+	{
1334
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1335
+	}
1336
+
1337
+
1338
+	/**
1339
+	 * Return whether blocks can be registered/loaded or not.
1340
+	 * @return bool
1341
+	 */
1342
+	private function canLoadBlocks()
1343
+	{
1344
+		return apply_filters('FHEE__EE_System__canLoadBlocks', true)
1345
+			   && function_exists('register_block_type')
1346
+			   // don't load blocks if in the Divi page builder editor context
1347
+			   // @see https://github.com/eventespresso/event-espresso-core/issues/814
1348
+			   && ! $this->request->getRequestParam('et_fb', false);
1349
+	}
1350 1350
 }
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
         EE_Maintenance_Mode $maintenance_mode = null
142 142
     ) {
143 143
         // check if class object is instantiated
144
-        if (! self::$_instance instanceof EE_System) {
144
+        if ( ! self::$_instance instanceof EE_System) {
145 145
             self::$_instance = new self($registry, $loader, $request, $maintenance_mode);
146 146
         }
147 147
         return self::$_instance;
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
         $this->capabilities = $this->loader->getShared('EE_Capabilities');
264 264
         add_action(
265 265
             'AHEE__EE_Capabilities__init_caps__before_initialization',
266
-            function () {
266
+            function() {
267 267
                 LoaderFactory::getLoader()->getShared('EE_Payment_Method_Manager');
268 268
             }
269 269
         );
@@ -304,7 +304,7 @@  discard block
 block discarded – undo
304 304
     {
305 305
         // set autoloaders for all of the classes implementing EEI_Plugin_API
306 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');
307
+        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
308 308
         $this->loader->getShared('EE_Request_Handler');
309 309
     }
310 310
 
@@ -324,14 +324,14 @@  discard block
 block discarded – undo
324 324
         $load_callback,
325 325
         $plugin_file_constant
326 326
     ) {
327
-        if (! defined($version_constant)) {
327
+        if ( ! defined($version_constant)) {
328 328
             return;
329 329
         }
330 330
         $addon_version = constant($version_constant);
331 331
         if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
332 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';
333
+            if ( ! function_exists('deactivate_plugins')) {
334
+                require_once ABSPATH.'wp-admin/includes/plugin.php';
335 335
             }
336 336
             deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
337 337
             unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
                     $min_version_required
346 346
                 ),
347 347
                 __FILE__,
348
-                __FUNCTION__ . "({$addon_name})",
348
+                __FUNCTION__."({$addon_name})",
349 349
                 __LINE__
350 350
             );
351 351
             EE_Error::get_notices(false, true);
@@ -396,7 +396,7 @@  discard block
 block discarded – undo
396 396
                 true
397 397
             )
398 398
         ) {
399
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
399
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth/basic-auth.php';
400 400
         }
401 401
         do_action('AHEE__EE_System__load_espresso_addons__complete');
402 402
     }
@@ -498,11 +498,11 @@  discard block
 block discarded – undo
498 498
     private function fix_espresso_db_upgrade_option($espresso_db_update = null)
499 499
     {
500 500
         do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
501
-        if (! $espresso_db_update) {
501
+        if ( ! $espresso_db_update) {
502 502
             $espresso_db_update = get_option('espresso_db_update');
503 503
         }
504 504
         // check that option is an array
505
-        if (! is_array($espresso_db_update)) {
505
+        if ( ! is_array($espresso_db_update)) {
506 506
             // if option is FALSE, then it never existed
507 507
             if ($espresso_db_update === false) {
508 508
                 // make $espresso_db_update an array and save option with autoload OFF
@@ -522,10 +522,10 @@  discard block
 block discarded – undo
522 522
                     // so it must be numerically-indexed, where values are versions installed...
523 523
                     // fix it!
524 524
                     $version_string = $should_be_array;
525
-                    $corrected_db_update[ $version_string ] = array('unknown-date');
525
+                    $corrected_db_update[$version_string] = array('unknown-date');
526 526
                 } else {
527 527
                     // ok it checks out
528
-                    $corrected_db_update[ $should_be_version_string ] = $should_be_array;
528
+                    $corrected_db_update[$should_be_version_string] = $should_be_array;
529 529
                 }
530 530
             }
531 531
             $espresso_db_update = $corrected_db_update;
@@ -608,13 +608,13 @@  discard block
 block discarded – undo
608 608
      */
609 609
     public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
610 610
     {
611
-        if (! $version_history) {
611
+        if ( ! $version_history) {
612 612
             $version_history = $this->fix_espresso_db_upgrade_option($version_history);
613 613
         }
614 614
         if ($current_version_to_add === null) {
615 615
             $current_version_to_add = espresso_version();
616 616
         }
617
-        $version_history[ $current_version_to_add ][] = date('Y-m-d H:i:s', time());
617
+        $version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
618 618
         // re-save
619 619
         return update_option('espresso_db_update', $version_history);
620 620
     }
@@ -704,7 +704,7 @@  discard block
 block discarded – undo
704 704
         if ($activation_history_for_addon) {
705 705
             // it exists, so this isn't a completely new install
706 706
             // check if this version already in that list of previously installed versions
707
-            if (! isset($activation_history_for_addon[ $version_to_upgrade_to ])) {
707
+            if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
708 708
                 // it a version we haven't seen before
709 709
                 if ($version_is_higher === 1) {
710 710
                     $req_type = EE_System::req_type_upgrade;
@@ -782,7 +782,7 @@  discard block
 block discarded – undo
782 782
             foreach ($activation_history as $version => $times_activated) {
783 783
                 // check there is a record of when this version was activated. Otherwise,
784 784
                 // mark it as unknown
785
-                if (! $times_activated) {
785
+                if ( ! $times_activated) {
786 786
                     $times_activated = array('unknown-date');
787 787
                 }
788 788
                 if (is_string($times_activated)) {
@@ -813,7 +813,7 @@  discard block
 block discarded – undo
813 813
     {
814 814
         $notices = EE_Error::get_notices(false);
815 815
         // if current user is an admin and it's not an ajax or rest request
816
-        if (! isset($notices['errors'])
816
+        if ( ! isset($notices['errors'])
817 817
             && $this->request->isAdmin()
818 818
             && apply_filters(
819 819
                 'FHEE__EE_System__redirect_to_about_ee__do_redirect',
@@ -883,7 +883,7 @@  discard block
 block discarded – undo
883 883
     private function _parse_model_names()
884 884
     {
885 885
         // get all the files in the EE_MODELS folder that end in .model.php
886
-        $models = glob(EE_MODELS . '*.model.php');
886
+        $models = glob(EE_MODELS.'*.model.php');
887 887
         $model_names = array();
888 888
         $non_abstract_db_models = array();
889 889
         foreach ($models as $model) {
@@ -892,9 +892,9 @@  discard block
 block discarded – undo
892 892
             $short_name = str_replace('EEM_', '', $classname);
893 893
             $reflectionClass = new ReflectionClass($classname);
894 894
             if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
895
-                $non_abstract_db_models[ $short_name ] = $classname;
895
+                $non_abstract_db_models[$short_name] = $classname;
896 896
             }
897
-            $model_names[ $short_name ] = $classname;
897
+            $model_names[$short_name] = $classname;
898 898
         }
899 899
         $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
900 900
         $this->registry->non_abstract_db_models = apply_filters(
@@ -929,7 +929,7 @@  discard block
 block discarded – undo
929 929
             )
930 930
         );
931 931
         if ($domain->isCaffeinated()) {
932
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
932
+            require_once EE_CAFF_PATH.'brewing_regular.php';
933 933
         }
934 934
     }
935 935
 
@@ -997,7 +997,7 @@  discard block
 block discarded – undo
997 997
         $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook(
998 998
             'AHEE__EE_System__register_shortcodes_modules_and_addons'
999 999
         );
1000
-        if (! empty($class_names)) {
1000
+        if ( ! empty($class_names)) {
1001 1001
             $msg = __(
1002 1002
                 'The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
1003 1003
                 'event_espresso'
@@ -1009,7 +1009,7 @@  discard block
 block discarded – undo
1009 1009
                             array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'),
1010 1010
                             '',
1011 1011
                             $class_name
1012
-                        ) . '</b></li>';
1012
+                        ).'</b></li>';
1013 1013
             }
1014 1014
             $msg .= '</ul>';
1015 1015
             $msg .= __(
@@ -1078,7 +1078,7 @@  discard block
 block discarded – undo
1078 1078
     private function _deactivate_incompatible_addons()
1079 1079
     {
1080 1080
         $incompatible_addons = get_option('ee_incompatible_addons', array());
1081
-        if (! empty($incompatible_addons)) {
1081
+        if ( ! empty($incompatible_addons)) {
1082 1082
             $active_plugins = get_option('active_plugins', array());
1083 1083
             foreach ($active_plugins as $active_plugin) {
1084 1084
                 foreach ($incompatible_addons as $incompatible_addon) {
@@ -1145,7 +1145,7 @@  discard block
 block discarded – undo
1145 1145
     {
1146 1146
         do_action('AHEE__EE_System__load_controllers__start');
1147 1147
         // let's get it started
1148
-        if (! $this->maintenance_mode->level()
1148
+        if ( ! $this->maintenance_mode->level()
1149 1149
             && ($this->request->isFrontend() || $this->request->isFrontAjax())
1150 1150
         ) {
1151 1151
             do_action('AHEE__EE_System__load_controllers__load_front_controllers');
@@ -1198,7 +1198,7 @@  discard block
 block discarded – undo
1198 1198
         do_action('AHEE__EE_System__core_loaded_and_ready');
1199 1199
         // always load template tags, because it's faster than checking if it's a front-end request, and many page
1200 1200
         // builders require these even on the front-end
1201
-        require_once EE_PUBLIC . 'template_tags.php';
1201
+        require_once EE_PUBLIC.'template_tags.php';
1202 1202
         // load handler for GraphQL requests
1203 1203
         if (class_exists('WPGraphQL') /* && $this->request->isGQL() */) {
1204 1204
             try {
@@ -1275,13 +1275,13 @@  discard block
 block discarded – undo
1275 1275
     public static function do_not_cache()
1276 1276
     {
1277 1277
         // set no cache constants
1278
-        if (! defined('DONOTCACHEPAGE')) {
1278
+        if ( ! defined('DONOTCACHEPAGE')) {
1279 1279
             define('DONOTCACHEPAGE', true);
1280 1280
         }
1281
-        if (! defined('DONOTCACHCEOBJECT')) {
1281
+        if ( ! defined('DONOTCACHCEOBJECT')) {
1282 1282
             define('DONOTCACHCEOBJECT', true);
1283 1283
         }
1284
-        if (! defined('DONOTCACHEDB')) {
1284
+        if ( ! defined('DONOTCACHEDB')) {
1285 1285
             define('DONOTCACHEDB', true);
1286 1286
         }
1287 1287
         // add no cache headers
Please login to merge, or discard this patch.
core/domain/services/graphql/types/RootQuery.php 1 patch
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -28,71 +28,71 @@
 block discarded – undo
28 28
 class RootQuery extends TypeBase
29 29
 {
30 30
 
31
-    /**
32
-     * RootQuery constructor.
33
-     */
34
-    public function __construct()
35
-    {
36
-        $this->setName('RootQuery');
37
-        $this->setIsCustomPostType(true);
38
-        parent::__construct();
39
-    }
31
+	/**
32
+	 * RootQuery constructor.
33
+	 */
34
+	public function __construct()
35
+	{
36
+		$this->setName('RootQuery');
37
+		$this->setIsCustomPostType(true);
38
+		parent::__construct();
39
+	}
40 40
 
41 41
 
42
-    /**
43
-     * @return GraphQLFieldInterface[]
44
-     * @since $VID:$
45
-     */
46
-    public function getFields()
47
-    {
48
-        return [
49
-            new GraphQLOutputField(
50
-                'eventRelations',
51
-                'String',
52
-                null,
53
-                esc_html__('JSON encoded relational data of the models', 'event_espresso'),
54
-                null,
55
-                [$this, 'getEventRelationalData'],
56
-                [
57
-                    'eventId' => [
58
-                        'type'        => ['non_null' => 'Int'],
59
-                        'description' => esc_html__('The event ID to get the relational data for.', 'event_espresso'),
60
-                    ],
61
-                ]
62
-            ),
63
-        ];
64
-    }
42
+	/**
43
+	 * @return GraphQLFieldInterface[]
44
+	 * @since $VID:$
45
+	 */
46
+	public function getFields()
47
+	{
48
+		return [
49
+			new GraphQLOutputField(
50
+				'eventRelations',
51
+				'String',
52
+				null,
53
+				esc_html__('JSON encoded relational data of the models', 'event_espresso'),
54
+				null,
55
+				[$this, 'getEventRelationalData'],
56
+				[
57
+					'eventId' => [
58
+						'type'        => ['non_null' => 'Int'],
59
+						'description' => esc_html__('The event ID to get the relational data for.', 'event_espresso'),
60
+					],
61
+				]
62
+			),
63
+		];
64
+	}
65 65
 
66 66
 
67
-    /**
68
-     * @param mixed       $source  The source that's passed down the GraphQL queries
69
-     * @param array       $args    The inputArgs on the field
70
-     * @param AppContext  $context The AppContext passed down the GraphQL tree
71
-     * @param ResolveInfo $info    The ResolveInfo passed down the GraphQL tree
72
-     * @return string
73
-     * @throws Exception
74
-     * @throws InvalidArgumentException
75
-     * @throws InvalidDataTypeException
76
-     * @throws InvalidInterfaceException
77
-     * @throws ReflectionException
78
-     * @throws UserError
79
-     * @throws UnexpectedEntityException
80
-     * @since $VID:$
81
-     */
82
-    public function getEventRelationalData($source, array $args, AppContext $context, ResolveInfo $info)
83
-    {
84
-        /**
85
-         * Throw an exception if there's no event ID
86
-         */
87
-        if (empty($args['eventId']) || ! absint($args['eventId'])) {
88
-            throw new UserError(esc_html__(
89
-                'No event ID was provided to get the relational data for',
90
-                'event_espresso'
91
-            ));
92
-        }
67
+	/**
68
+	 * @param mixed       $source  The source that's passed down the GraphQL queries
69
+	 * @param array       $args    The inputArgs on the field
70
+	 * @param AppContext  $context The AppContext passed down the GraphQL tree
71
+	 * @param ResolveInfo $info    The ResolveInfo passed down the GraphQL tree
72
+	 * @return string
73
+	 * @throws Exception
74
+	 * @throws InvalidArgumentException
75
+	 * @throws InvalidDataTypeException
76
+	 * @throws InvalidInterfaceException
77
+	 * @throws ReflectionException
78
+	 * @throws UserError
79
+	 * @throws UnexpectedEntityException
80
+	 * @since $VID:$
81
+	 */
82
+	public function getEventRelationalData($source, array $args, AppContext $context, ResolveInfo $info)
83
+	{
84
+		/**
85
+		 * Throw an exception if there's no event ID
86
+		 */
87
+		if (empty($args['eventId']) || ! absint($args['eventId'])) {
88
+			throw new UserError(esc_html__(
89
+				'No event ID was provided to get the relational data for',
90
+				'event_espresso'
91
+			));
92
+		}
93 93
 
94
-        $eventId = absint($args['eventId']);
94
+		$eventId = absint($args['eventId']);
95 95
 
96
-        return json_encode(AdvancedEditorEntityData::getRelationalData($eventId));
97
-    }
96
+		return json_encode(AdvancedEditorEntityData::getRelationalData($eventId));
97
+	}
98 98
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.10.3.rc.003');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.10.3.rc.003');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.