@@ -33,717 +33,717 @@ |
||
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'] = $this->event->is_expired(); |
|
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 | - // if redirecting to another site for registration, then we don't load the TS |
|
233 | - $ticket_selector = $external_url |
|
234 | - ? $this->externalEventRegistration() |
|
235 | - : $this->loadTicketSelector($tickets, $template_args); |
|
236 | - // now set up the form (but not for the admin) |
|
237 | - $ticket_selector = $this->display_full_ui() |
|
238 | - ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
239 | - : $ticket_selector; |
|
240 | - // submit button and form close tag |
|
241 | - $ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : ''; |
|
242 | - return $ticket_selector; |
|
243 | - } |
|
244 | - |
|
245 | - |
|
246 | - /** |
|
247 | - * displayTicketSelector |
|
248 | - * examines the event properties and determines whether a Ticket Selector should be displayed |
|
249 | - * |
|
250 | - * @param WP_Post|int $event |
|
251 | - * @param string $_event_active_status |
|
252 | - * @param bool $view_details |
|
253 | - * @return bool |
|
254 | - * @throws EE_Error |
|
255 | - */ |
|
256 | - protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details) |
|
257 | - { |
|
258 | - $event_post = $this->event instanceof EE_Event ? $this->event->ID() : $event; |
|
259 | - return $this->display_full_ui() |
|
260 | - && ( |
|
261 | - ! $this->event->display_ticket_selector() |
|
262 | - || $view_details |
|
263 | - || post_password_required($event_post) |
|
264 | - || ( |
|
265 | - $_event_active_status !== EE_Datetime::active |
|
266 | - && $_event_active_status !== EE_Datetime::upcoming |
|
267 | - && $_event_active_status !== EE_Datetime::sold_out |
|
268 | - && ! ( |
|
269 | - $_event_active_status === EE_Datetime::inactive |
|
270 | - && is_user_logged_in() |
|
271 | - ) |
|
272 | - ) |
|
273 | - ); |
|
274 | - } |
|
275 | - |
|
276 | - |
|
277 | - /** |
|
278 | - * noTicketAvailableMessage |
|
279 | - * notice displayed if event is expired |
|
280 | - * |
|
281 | - * @return string |
|
282 | - * @throws EE_Error |
|
283 | - */ |
|
284 | - protected function expiredEventMessage() |
|
285 | - { |
|
286 | - return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
287 | - 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
|
288 | - 'event_espresso' |
|
289 | - ) . '</span></div><!-- .ee-event-expired-notice -->'; |
|
290 | - } |
|
291 | - |
|
292 | - |
|
293 | - /** |
|
294 | - * noTicketAvailableMessage |
|
295 | - * notice displayed if event has no more tickets available |
|
296 | - * |
|
297 | - * @return string |
|
298 | - * @throws EE_Error |
|
299 | - */ |
|
300 | - protected function noTicketAvailableMessage() |
|
301 | - { |
|
302 | - $no_ticket_available_msg = esc_html__('We\'re sorry, but all ticket sales have ended.', 'event_espresso'); |
|
303 | - if (current_user_can('edit_post', $this->event->ID())) { |
|
304 | - $no_ticket_available_msg .= sprintf( |
|
305 | - esc_html__( |
|
306 | - '%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', |
|
307 | - 'event_espresso' |
|
308 | - ), |
|
309 | - '<div class="ee-attention" style="text-align: left;"><b>', |
|
310 | - '</b><br />', |
|
311 | - '<span class="edit-link"><a class="post-edit-link" href="' |
|
312 | - . get_edit_post_link($this->event->ID()) |
|
313 | - . '">', |
|
314 | - '</a></span></div><!-- .ee-attention noTicketAvailableMessage -->' |
|
315 | - ); |
|
316 | - } |
|
317 | - 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'] = $this->event->is_expired(); |
|
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 | + // if redirecting to another site for registration, then we don't load the TS |
|
233 | + $ticket_selector = $external_url |
|
234 | + ? $this->externalEventRegistration() |
|
235 | + : $this->loadTicketSelector($tickets, $template_args); |
|
236 | + // now set up the form (but not for the admin) |
|
237 | + $ticket_selector = $this->display_full_ui() |
|
238 | + ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
239 | + : $ticket_selector; |
|
240 | + // submit button and form close tag |
|
241 | + $ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : ''; |
|
242 | + return $ticket_selector; |
|
243 | + } |
|
244 | + |
|
245 | + |
|
246 | + /** |
|
247 | + * displayTicketSelector |
|
248 | + * examines the event properties and determines whether a Ticket Selector should be displayed |
|
249 | + * |
|
250 | + * @param WP_Post|int $event |
|
251 | + * @param string $_event_active_status |
|
252 | + * @param bool $view_details |
|
253 | + * @return bool |
|
254 | + * @throws EE_Error |
|
255 | + */ |
|
256 | + protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details) |
|
257 | + { |
|
258 | + $event_post = $this->event instanceof EE_Event ? $this->event->ID() : $event; |
|
259 | + return $this->display_full_ui() |
|
260 | + && ( |
|
261 | + ! $this->event->display_ticket_selector() |
|
262 | + || $view_details |
|
263 | + || post_password_required($event_post) |
|
264 | + || ( |
|
265 | + $_event_active_status !== EE_Datetime::active |
|
266 | + && $_event_active_status !== EE_Datetime::upcoming |
|
267 | + && $_event_active_status !== EE_Datetime::sold_out |
|
268 | + && ! ( |
|
269 | + $_event_active_status === EE_Datetime::inactive |
|
270 | + && is_user_logged_in() |
|
271 | + ) |
|
272 | + ) |
|
273 | + ); |
|
274 | + } |
|
275 | + |
|
276 | + |
|
277 | + /** |
|
278 | + * noTicketAvailableMessage |
|
279 | + * notice displayed if event is expired |
|
280 | + * |
|
281 | + * @return string |
|
282 | + * @throws EE_Error |
|
283 | + */ |
|
284 | + protected function expiredEventMessage() |
|
285 | + { |
|
286 | + return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
287 | + 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
|
288 | + 'event_espresso' |
|
289 | + ) . '</span></div><!-- .ee-event-expired-notice -->'; |
|
290 | + } |
|
291 | + |
|
292 | + |
|
293 | + /** |
|
294 | + * noTicketAvailableMessage |
|
295 | + * notice displayed if event has no more tickets available |
|
296 | + * |
|
297 | + * @return string |
|
298 | + * @throws EE_Error |
|
299 | + */ |
|
300 | + protected function noTicketAvailableMessage() |
|
301 | + { |
|
302 | + $no_ticket_available_msg = esc_html__('We\'re sorry, but all ticket sales have ended.', 'event_espresso'); |
|
303 | + if (current_user_can('edit_post', $this->event->ID())) { |
|
304 | + $no_ticket_available_msg .= sprintf( |
|
305 | + esc_html__( |
|
306 | + '%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', |
|
307 | + 'event_espresso' |
|
308 | + ), |
|
309 | + '<div class="ee-attention" style="text-align: left;"><b>', |
|
310 | + '</b><br />', |
|
311 | + '<span class="edit-link"><a class="post-edit-link" href="' |
|
312 | + . get_edit_post_link($this->event->ID()) |
|
313 | + . '">', |
|
314 | + '</a></span></div><!-- .ee-attention noTicketAvailableMessage -->' |
|
315 | + ); |
|
316 | + } |
|
317 | + return ' |
|
318 | 318 | <div class="ee-event-expired-notice"> |
319 | 319 | <span class="important-notice">' . $no_ticket_available_msg . '</span> |
320 | 320 | </div><!-- .ee-event-expired-notice -->'; |
321 | - } |
|
322 | - |
|
323 | - |
|
324 | - /** |
|
325 | - * ticketSalesClosed |
|
326 | - * notice displayed if event ticket sales are turned off |
|
327 | - * |
|
328 | - * @return string |
|
329 | - * @throws EE_Error |
|
330 | - */ |
|
331 | - protected function ticketSalesClosedMessage() |
|
332 | - { |
|
333 | - $sales_closed_msg = esc_html__( |
|
334 | - 'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.', |
|
335 | - 'event_espresso' |
|
336 | - ); |
|
337 | - if (current_user_can('edit_post', $this->event->ID())) { |
|
338 | - $sales_closed_msg .= sprintf( |
|
339 | - esc_html__( |
|
340 | - '%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', |
|
341 | - 'event_espresso' |
|
342 | - ), |
|
343 | - '<div class="ee-attention" style="text-align: left;"><b>', |
|
344 | - '</b><br />', |
|
345 | - '<span class="edit-link"><a class="post-edit-link" href="' |
|
346 | - . get_edit_post_link($this->event->ID()) |
|
347 | - . '">', |
|
348 | - '</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->' |
|
349 | - ); |
|
350 | - } |
|
351 | - return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
352 | - } |
|
353 | - |
|
354 | - |
|
355 | - /** |
|
356 | - * getTickets |
|
357 | - * |
|
358 | - * @return \EE_Base_Class[]|\EE_Ticket[] |
|
359 | - * @throws EE_Error |
|
360 | - * @throws InvalidDataTypeException |
|
361 | - * @throws InvalidInterfaceException |
|
362 | - * @throws InvalidArgumentException |
|
363 | - */ |
|
364 | - protected function getTickets() |
|
365 | - { |
|
366 | - $ticket_query_args = array( |
|
367 | - array('Datetime.EVT_ID' => $this->event->ID()), |
|
368 | - 'order_by' => array( |
|
369 | - 'TKT_order' => 'ASC', |
|
370 | - 'TKT_required' => 'DESC', |
|
371 | - 'TKT_start_date' => 'ASC', |
|
372 | - 'TKT_end_date' => 'ASC', |
|
373 | - 'Datetime.DTT_EVT_start' => 'DESC', |
|
374 | - ), |
|
375 | - ); |
|
376 | - if (! ( |
|
377 | - EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config |
|
378 | - && EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets |
|
379 | - )) { |
|
380 | - // use the correct applicable time query depending on what version of core is being run. |
|
381 | - $current_time = method_exists('EEM_Datetime', 'current_time_for_query') |
|
382 | - ? time() |
|
383 | - : current_time('timestamp'); |
|
384 | - $ticket_query_args[0]['TKT_end_date'] = array('>', $current_time); |
|
385 | - } |
|
386 | - return EEM_Ticket::instance()->get_all($ticket_query_args); |
|
387 | - } |
|
388 | - |
|
389 | - |
|
390 | - /** |
|
391 | - * loadTicketSelector |
|
392 | - * begins to assemble template arguments |
|
393 | - * and decides whether to load a "simple" ticket selector, or the standard |
|
394 | - * |
|
395 | - * @param \EE_Ticket[] $tickets |
|
396 | - * @param array $template_args |
|
397 | - * @return string |
|
398 | - * @throws EE_Error |
|
399 | - */ |
|
400 | - protected function loadTicketSelector(array $tickets, array $template_args) |
|
401 | - { |
|
402 | - $template_args['event'] = $this->event; |
|
403 | - $template_args['EVT_ID'] = $this->event->ID(); |
|
404 | - $template_args['event_is_expired'] = $this->event->is_expired(); |
|
405 | - $template_args['max_atndz'] = $this->getMaxAttendees(); |
|
406 | - $template_args['date_format'] = $this->date_format; |
|
407 | - $template_args['time_format'] = $this->time_format; |
|
408 | - /** |
|
409 | - * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected |
|
410 | - * |
|
411 | - * @since 4.9.13 |
|
412 | - * @param string '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to |
|
413 | - * @param int $EVT_ID The Event ID |
|
414 | - */ |
|
415 | - $template_args['anchor_id'] = apply_filters( |
|
416 | - 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
|
417 | - '#tkt-slctr-tbl-' . $this->event->ID(), |
|
418 | - $this->event->ID() |
|
419 | - ); |
|
420 | - $template_args['tickets'] = $tickets; |
|
421 | - $template_args['ticket_count'] = count($tickets); |
|
422 | - $ticket_selector = $this->simpleTicketSelector($tickets, $template_args); |
|
423 | - return $ticket_selector instanceof TicketSelectorSimple |
|
424 | - ? $ticket_selector |
|
425 | - : new TicketSelectorStandard( |
|
426 | - $this->event, |
|
427 | - $tickets, |
|
428 | - $this->getMaxAttendees(), |
|
429 | - $template_args, |
|
430 | - $this->date_format, |
|
431 | - $this->time_format |
|
432 | - ); |
|
433 | - } |
|
434 | - |
|
435 | - |
|
436 | - /** |
|
437 | - * simpleTicketSelector |
|
438 | - * there's one ticket, and max attendees is set to one, |
|
439 | - * so if the event is free, then this is a "simple" ticket selector |
|
440 | - * a.k.a. "Dude Where's my Ticket Selector?" |
|
441 | - * |
|
442 | - * @param \EE_Ticket[] $tickets |
|
443 | - * @param array $template_args |
|
444 | - * @return string |
|
445 | - * @throws EE_Error |
|
446 | - */ |
|
447 | - protected function simpleTicketSelector($tickets, array $template_args) |
|
448 | - { |
|
449 | - // if there is only ONE ticket with a max qty of ONE |
|
450 | - if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) { |
|
451 | - return ''; |
|
452 | - } |
|
453 | - /** @var \EE_Ticket $ticket */ |
|
454 | - $ticket = reset($tickets); |
|
455 | - // if the ticket is free... then not much need for the ticket selector |
|
456 | - if (apply_filters( |
|
457 | - 'FHEE__ticket_selector_chart_template__hide_ticket_selector', |
|
458 | - $ticket->is_free(), |
|
459 | - $this->event->ID() |
|
460 | - )) { |
|
461 | - return new TicketSelectorSimple( |
|
462 | - $this->event, |
|
463 | - $ticket, |
|
464 | - $this->getMaxAttendees(), |
|
465 | - $template_args |
|
466 | - ); |
|
467 | - } |
|
468 | - return ''; |
|
469 | - } |
|
470 | - |
|
471 | - |
|
472 | - /** |
|
473 | - * externalEventRegistration |
|
474 | - * |
|
475 | - * @return string |
|
476 | - */ |
|
477 | - public function externalEventRegistration() |
|
478 | - { |
|
479 | - // if not we still need to trigger the display of the submit button |
|
480 | - add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true'); |
|
481 | - // display notice to admin that registration is external |
|
482 | - return $this->display_full_ui() |
|
483 | - ? esc_html__( |
|
484 | - 'Registration is at an external URL for this event.', |
|
485 | - 'event_espresso' |
|
486 | - ) |
|
487 | - : ''; |
|
488 | - } |
|
489 | - |
|
490 | - |
|
491 | - /** |
|
492 | - * formOpen |
|
493 | - * |
|
494 | - * @param int $ID |
|
495 | - * @param string $external_url |
|
496 | - * @return string |
|
497 | - */ |
|
498 | - public function formOpen($ID = 0, $external_url = '') |
|
499 | - { |
|
500 | - // if redirecting, we don't need any anything else |
|
501 | - if ($external_url) { |
|
502 | - $html = '<form method="GET" '; |
|
503 | - $html .= 'action="' . EEH_URL::refactor_url($external_url) . '" '; |
|
504 | - $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
505 | - // open link in new window ? |
|
506 | - $html .= apply_filters( |
|
507 | - 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
|
508 | - $this->isIframe(), |
|
509 | - $this |
|
510 | - ) |
|
511 | - ? ' target="_blank"' |
|
512 | - : ''; |
|
513 | - $html .= '>'; |
|
514 | - $query_args = EEH_URL::get_query_string($external_url); |
|
515 | - foreach ((array) $query_args as $query_arg => $value) { |
|
516 | - $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
517 | - } |
|
518 | - return $html; |
|
519 | - } |
|
520 | - // if there is no submit button, then don't start building a form |
|
521 | - // because the "View Details" button will build its own form |
|
522 | - if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
523 | - return ''; |
|
524 | - } |
|
525 | - $checkout_url = EEH_Event_View::event_link_url($ID); |
|
526 | - if (! $checkout_url) { |
|
527 | - EE_Error::add_error( |
|
528 | - esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
529 | - __FILE__, |
|
530 | - __FUNCTION__, |
|
531 | - __LINE__ |
|
532 | - ); |
|
533 | - } |
|
534 | - // set no cache headers and constants |
|
535 | - EE_System::do_not_cache(); |
|
536 | - $html = '<form method="POST" '; |
|
537 | - $html .= 'action="' . $checkout_url . '" '; |
|
538 | - $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
539 | - $html .= $this->iframe ? ' target="_blank"' : ''; |
|
540 | - $html .= '>'; |
|
541 | - $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
|
542 | - $html = apply_filters('FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event); |
|
543 | - return $html; |
|
544 | - } |
|
545 | - |
|
546 | - |
|
547 | - /** |
|
548 | - * displaySubmitButton |
|
549 | - * |
|
550 | - * @param string $external_url |
|
551 | - * @return string |
|
552 | - * @throws EE_Error |
|
553 | - */ |
|
554 | - public function displaySubmitButton($external_url = '') |
|
555 | - { |
|
556 | - $html = ''; |
|
557 | - if ($this->display_full_ui()) { |
|
558 | - // standard TS displayed with submit button, ie: "Register Now" |
|
559 | - if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
560 | - $html .= $this->displayRegisterNowButton(); |
|
561 | - $html .= empty($external_url) |
|
562 | - ? $this->ticketSelectorEndDiv() |
|
563 | - : $this->clearTicketSelector(); |
|
564 | - $html .= '<br/>' . $this->formClose(); |
|
565 | - } elseif ($this->getMaxAttendees() === 1) { |
|
566 | - // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
|
567 | - if ($this->event->is_sold_out()) { |
|
568 | - // then instead of a View Details or Submit button, just display a "Sold Out" message |
|
569 | - $html .= apply_filters( |
|
570 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg', |
|
571 | - sprintf( |
|
572 | - __( |
|
573 | - '%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s', |
|
574 | - 'event_espresso' |
|
575 | - ), |
|
576 | - '<p class="no-ticket-selector-msg clear-float">', |
|
577 | - $this->event->name(), |
|
578 | - '</p>', |
|
579 | - '<br />' |
|
580 | - ), |
|
581 | - $this->event |
|
582 | - ); |
|
583 | - if (apply_filters( |
|
584 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
585 | - false, |
|
586 | - $this->event |
|
587 | - )) { |
|
588 | - $html .= $this->displayRegisterNowButton(); |
|
589 | - } |
|
590 | - // sold out DWMTS event, no TS, no submit or view details button, but has additional content |
|
591 | - $html .= $this->ticketSelectorEndDiv(); |
|
592 | - } elseif (apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false) |
|
593 | - && ! is_single() |
|
594 | - ) { |
|
595 | - // this is a "Dude Where's my Ticket Selector?" (DWMTS) type event, |
|
596 | - // but no tickets are available, so display event's "View Details" button. |
|
597 | - // it is being viewed via somewhere other than a single post |
|
598 | - $html .= $this->displayViewDetailsButton(true); |
|
599 | - } else { |
|
600 | - $html .= $this->ticketSelectorEndDiv(); |
|
601 | - } |
|
602 | - } elseif (is_archive()) { |
|
603 | - // event list, no tickets available so display event's "View Details" button |
|
604 | - $html .= $this->ticketSelectorEndDiv(); |
|
605 | - $html .= $this->displayViewDetailsButton(); |
|
606 | - } else { |
|
607 | - if (apply_filters( |
|
608 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
609 | - false, |
|
610 | - $this->event |
|
611 | - )) { |
|
612 | - $html .= $this->displayRegisterNowButton(); |
|
613 | - } |
|
614 | - // no submit or view details button, and no additional content |
|
615 | - $html .= $this->ticketSelectorEndDiv(); |
|
616 | - } |
|
617 | - if (! $this->iframe && ! is_archive()) { |
|
618 | - $html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector')); |
|
619 | - } |
|
620 | - } |
|
621 | - return apply_filters( |
|
622 | - 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displaySubmitButton__html', |
|
623 | - $html, |
|
624 | - $this->event, |
|
625 | - $this |
|
626 | - ); |
|
627 | - } |
|
628 | - |
|
629 | - |
|
630 | - /** |
|
631 | - * @return string |
|
632 | - * @throws EE_Error |
|
633 | - */ |
|
634 | - public function displayRegisterNowButton() |
|
635 | - { |
|
636 | - $btn_text = apply_filters( |
|
637 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text', |
|
638 | - __('Register Now', 'event_espresso'), |
|
639 | - $this->event |
|
640 | - ); |
|
641 | - $external_url = $this->event->external_url(); |
|
642 | - $html = EEH_HTML::div( |
|
643 | - '', |
|
644 | - 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', |
|
645 | - 'ticket-selector-submit-btn-wrap' |
|
646 | - ); |
|
647 | - $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
648 | - $html .= ' class="ticket-selector-submit-btn '; |
|
649 | - $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
|
650 | - $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
651 | - $html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->'; |
|
652 | - $html .= apply_filters( |
|
653 | - 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
|
654 | - '', |
|
655 | - $this->event, |
|
656 | - $this->iframe |
|
657 | - ); |
|
658 | - return $html; |
|
659 | - } |
|
660 | - |
|
661 | - |
|
662 | - /** |
|
663 | - * displayViewDetailsButton |
|
664 | - * |
|
665 | - * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event |
|
666 | - * (ie: $_max_atndz === 1) where there are no available tickets, |
|
667 | - * either because they are sold out, expired, or not yet on sale. |
|
668 | - * In this case, we need to close the form BEFORE adding any closing divs |
|
669 | - * @return string |
|
670 | - * @throws EE_Error |
|
671 | - */ |
|
672 | - public function displayViewDetailsButton($DWMTS = false) |
|
673 | - { |
|
674 | - if (! $this->event->get_permalink()) { |
|
675 | - EE_Error::add_error( |
|
676 | - esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
677 | - __FILE__, |
|
678 | - __FUNCTION__, |
|
679 | - __LINE__ |
|
680 | - ); |
|
681 | - } |
|
682 | - $view_details_btn = '<form method="POST" action="'; |
|
683 | - $view_details_btn .= apply_filters( |
|
684 | - 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url', |
|
685 | - $this->event->get_permalink(), |
|
686 | - $this->event |
|
687 | - ); |
|
688 | - $view_details_btn .= '"'; |
|
689 | - // open link in new window ? |
|
690 | - $view_details_btn .= apply_filters( |
|
691 | - 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank', |
|
692 | - $this->isIframe(), |
|
693 | - $this |
|
694 | - ) |
|
695 | - ? ' target="_blank"' |
|
696 | - : ''; |
|
697 | - $view_details_btn .= '>'; |
|
698 | - $btn_text = apply_filters( |
|
699 | - 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text', |
|
700 | - esc_html__('View Details', 'event_espresso'), |
|
701 | - $this->event |
|
702 | - ); |
|
703 | - $view_details_btn .= '<input id="ticket-selector-submit-' |
|
704 | - . $this->event->ID() |
|
705 | - . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="' |
|
706 | - . $btn_text |
|
707 | - . '" />'; |
|
708 | - $view_details_btn .= apply_filters('FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event); |
|
709 | - if ($DWMTS) { |
|
710 | - $view_details_btn .= $this->formClose(); |
|
711 | - $view_details_btn .= $this->ticketSelectorEndDiv(); |
|
712 | - $view_details_btn .= '<br/>'; |
|
713 | - } else { |
|
714 | - $view_details_btn .= $this->clearTicketSelector(); |
|
715 | - $view_details_btn .= '<br/>'; |
|
716 | - $view_details_btn .= $this->formClose(); |
|
717 | - } |
|
718 | - return $view_details_btn; |
|
719 | - } |
|
720 | - |
|
721 | - |
|
722 | - /** |
|
723 | - * @return string |
|
724 | - */ |
|
725 | - public function ticketSelectorEndDiv() |
|
726 | - { |
|
727 | - return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->'; |
|
728 | - } |
|
729 | - |
|
730 | - |
|
731 | - /** |
|
732 | - * @return string |
|
733 | - */ |
|
734 | - public function clearTicketSelector() |
|
735 | - { |
|
736 | - // standard TS displayed, appears after a "Register Now" or "view Details" button |
|
737 | - return '<div class="clear"></div><!-- clearTicketSelector -->'; |
|
738 | - } |
|
739 | - |
|
740 | - |
|
741 | - /** |
|
742 | - * @access public |
|
743 | - * @return string |
|
744 | - */ |
|
745 | - public function formClose() |
|
746 | - { |
|
747 | - return '</form>'; |
|
748 | - } |
|
321 | + } |
|
322 | + |
|
323 | + |
|
324 | + /** |
|
325 | + * ticketSalesClosed |
|
326 | + * notice displayed if event ticket sales are turned off |
|
327 | + * |
|
328 | + * @return string |
|
329 | + * @throws EE_Error |
|
330 | + */ |
|
331 | + protected function ticketSalesClosedMessage() |
|
332 | + { |
|
333 | + $sales_closed_msg = esc_html__( |
|
334 | + 'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.', |
|
335 | + 'event_espresso' |
|
336 | + ); |
|
337 | + if (current_user_can('edit_post', $this->event->ID())) { |
|
338 | + $sales_closed_msg .= sprintf( |
|
339 | + esc_html__( |
|
340 | + '%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', |
|
341 | + 'event_espresso' |
|
342 | + ), |
|
343 | + '<div class="ee-attention" style="text-align: left;"><b>', |
|
344 | + '</b><br />', |
|
345 | + '<span class="edit-link"><a class="post-edit-link" href="' |
|
346 | + . get_edit_post_link($this->event->ID()) |
|
347 | + . '">', |
|
348 | + '</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->' |
|
349 | + ); |
|
350 | + } |
|
351 | + return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
352 | + } |
|
353 | + |
|
354 | + |
|
355 | + /** |
|
356 | + * getTickets |
|
357 | + * |
|
358 | + * @return \EE_Base_Class[]|\EE_Ticket[] |
|
359 | + * @throws EE_Error |
|
360 | + * @throws InvalidDataTypeException |
|
361 | + * @throws InvalidInterfaceException |
|
362 | + * @throws InvalidArgumentException |
|
363 | + */ |
|
364 | + protected function getTickets() |
|
365 | + { |
|
366 | + $ticket_query_args = array( |
|
367 | + array('Datetime.EVT_ID' => $this->event->ID()), |
|
368 | + 'order_by' => array( |
|
369 | + 'TKT_order' => 'ASC', |
|
370 | + 'TKT_required' => 'DESC', |
|
371 | + 'TKT_start_date' => 'ASC', |
|
372 | + 'TKT_end_date' => 'ASC', |
|
373 | + 'Datetime.DTT_EVT_start' => 'DESC', |
|
374 | + ), |
|
375 | + ); |
|
376 | + if (! ( |
|
377 | + EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config |
|
378 | + && EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets |
|
379 | + )) { |
|
380 | + // use the correct applicable time query depending on what version of core is being run. |
|
381 | + $current_time = method_exists('EEM_Datetime', 'current_time_for_query') |
|
382 | + ? time() |
|
383 | + : current_time('timestamp'); |
|
384 | + $ticket_query_args[0]['TKT_end_date'] = array('>', $current_time); |
|
385 | + } |
|
386 | + return EEM_Ticket::instance()->get_all($ticket_query_args); |
|
387 | + } |
|
388 | + |
|
389 | + |
|
390 | + /** |
|
391 | + * loadTicketSelector |
|
392 | + * begins to assemble template arguments |
|
393 | + * and decides whether to load a "simple" ticket selector, or the standard |
|
394 | + * |
|
395 | + * @param \EE_Ticket[] $tickets |
|
396 | + * @param array $template_args |
|
397 | + * @return string |
|
398 | + * @throws EE_Error |
|
399 | + */ |
|
400 | + protected function loadTicketSelector(array $tickets, array $template_args) |
|
401 | + { |
|
402 | + $template_args['event'] = $this->event; |
|
403 | + $template_args['EVT_ID'] = $this->event->ID(); |
|
404 | + $template_args['event_is_expired'] = $this->event->is_expired(); |
|
405 | + $template_args['max_atndz'] = $this->getMaxAttendees(); |
|
406 | + $template_args['date_format'] = $this->date_format; |
|
407 | + $template_args['time_format'] = $this->time_format; |
|
408 | + /** |
|
409 | + * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected |
|
410 | + * |
|
411 | + * @since 4.9.13 |
|
412 | + * @param string '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to |
|
413 | + * @param int $EVT_ID The Event ID |
|
414 | + */ |
|
415 | + $template_args['anchor_id'] = apply_filters( |
|
416 | + 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
|
417 | + '#tkt-slctr-tbl-' . $this->event->ID(), |
|
418 | + $this->event->ID() |
|
419 | + ); |
|
420 | + $template_args['tickets'] = $tickets; |
|
421 | + $template_args['ticket_count'] = count($tickets); |
|
422 | + $ticket_selector = $this->simpleTicketSelector($tickets, $template_args); |
|
423 | + return $ticket_selector instanceof TicketSelectorSimple |
|
424 | + ? $ticket_selector |
|
425 | + : new TicketSelectorStandard( |
|
426 | + $this->event, |
|
427 | + $tickets, |
|
428 | + $this->getMaxAttendees(), |
|
429 | + $template_args, |
|
430 | + $this->date_format, |
|
431 | + $this->time_format |
|
432 | + ); |
|
433 | + } |
|
434 | + |
|
435 | + |
|
436 | + /** |
|
437 | + * simpleTicketSelector |
|
438 | + * there's one ticket, and max attendees is set to one, |
|
439 | + * so if the event is free, then this is a "simple" ticket selector |
|
440 | + * a.k.a. "Dude Where's my Ticket Selector?" |
|
441 | + * |
|
442 | + * @param \EE_Ticket[] $tickets |
|
443 | + * @param array $template_args |
|
444 | + * @return string |
|
445 | + * @throws EE_Error |
|
446 | + */ |
|
447 | + protected function simpleTicketSelector($tickets, array $template_args) |
|
448 | + { |
|
449 | + // if there is only ONE ticket with a max qty of ONE |
|
450 | + if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) { |
|
451 | + return ''; |
|
452 | + } |
|
453 | + /** @var \EE_Ticket $ticket */ |
|
454 | + $ticket = reset($tickets); |
|
455 | + // if the ticket is free... then not much need for the ticket selector |
|
456 | + if (apply_filters( |
|
457 | + 'FHEE__ticket_selector_chart_template__hide_ticket_selector', |
|
458 | + $ticket->is_free(), |
|
459 | + $this->event->ID() |
|
460 | + )) { |
|
461 | + return new TicketSelectorSimple( |
|
462 | + $this->event, |
|
463 | + $ticket, |
|
464 | + $this->getMaxAttendees(), |
|
465 | + $template_args |
|
466 | + ); |
|
467 | + } |
|
468 | + return ''; |
|
469 | + } |
|
470 | + |
|
471 | + |
|
472 | + /** |
|
473 | + * externalEventRegistration |
|
474 | + * |
|
475 | + * @return string |
|
476 | + */ |
|
477 | + public function externalEventRegistration() |
|
478 | + { |
|
479 | + // if not we still need to trigger the display of the submit button |
|
480 | + add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true'); |
|
481 | + // display notice to admin that registration is external |
|
482 | + return $this->display_full_ui() |
|
483 | + ? esc_html__( |
|
484 | + 'Registration is at an external URL for this event.', |
|
485 | + 'event_espresso' |
|
486 | + ) |
|
487 | + : ''; |
|
488 | + } |
|
489 | + |
|
490 | + |
|
491 | + /** |
|
492 | + * formOpen |
|
493 | + * |
|
494 | + * @param int $ID |
|
495 | + * @param string $external_url |
|
496 | + * @return string |
|
497 | + */ |
|
498 | + public function formOpen($ID = 0, $external_url = '') |
|
499 | + { |
|
500 | + // if redirecting, we don't need any anything else |
|
501 | + if ($external_url) { |
|
502 | + $html = '<form method="GET" '; |
|
503 | + $html .= 'action="' . EEH_URL::refactor_url($external_url) . '" '; |
|
504 | + $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
505 | + // open link in new window ? |
|
506 | + $html .= apply_filters( |
|
507 | + 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
|
508 | + $this->isIframe(), |
|
509 | + $this |
|
510 | + ) |
|
511 | + ? ' target="_blank"' |
|
512 | + : ''; |
|
513 | + $html .= '>'; |
|
514 | + $query_args = EEH_URL::get_query_string($external_url); |
|
515 | + foreach ((array) $query_args as $query_arg => $value) { |
|
516 | + $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
517 | + } |
|
518 | + return $html; |
|
519 | + } |
|
520 | + // if there is no submit button, then don't start building a form |
|
521 | + // because the "View Details" button will build its own form |
|
522 | + if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
523 | + return ''; |
|
524 | + } |
|
525 | + $checkout_url = EEH_Event_View::event_link_url($ID); |
|
526 | + if (! $checkout_url) { |
|
527 | + EE_Error::add_error( |
|
528 | + esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
529 | + __FILE__, |
|
530 | + __FUNCTION__, |
|
531 | + __LINE__ |
|
532 | + ); |
|
533 | + } |
|
534 | + // set no cache headers and constants |
|
535 | + EE_System::do_not_cache(); |
|
536 | + $html = '<form method="POST" '; |
|
537 | + $html .= 'action="' . $checkout_url . '" '; |
|
538 | + $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
539 | + $html .= $this->iframe ? ' target="_blank"' : ''; |
|
540 | + $html .= '>'; |
|
541 | + $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
|
542 | + $html = apply_filters('FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event); |
|
543 | + return $html; |
|
544 | + } |
|
545 | + |
|
546 | + |
|
547 | + /** |
|
548 | + * displaySubmitButton |
|
549 | + * |
|
550 | + * @param string $external_url |
|
551 | + * @return string |
|
552 | + * @throws EE_Error |
|
553 | + */ |
|
554 | + public function displaySubmitButton($external_url = '') |
|
555 | + { |
|
556 | + $html = ''; |
|
557 | + if ($this->display_full_ui()) { |
|
558 | + // standard TS displayed with submit button, ie: "Register Now" |
|
559 | + if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
560 | + $html .= $this->displayRegisterNowButton(); |
|
561 | + $html .= empty($external_url) |
|
562 | + ? $this->ticketSelectorEndDiv() |
|
563 | + : $this->clearTicketSelector(); |
|
564 | + $html .= '<br/>' . $this->formClose(); |
|
565 | + } elseif ($this->getMaxAttendees() === 1) { |
|
566 | + // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
|
567 | + if ($this->event->is_sold_out()) { |
|
568 | + // then instead of a View Details or Submit button, just display a "Sold Out" message |
|
569 | + $html .= apply_filters( |
|
570 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg', |
|
571 | + sprintf( |
|
572 | + __( |
|
573 | + '%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s', |
|
574 | + 'event_espresso' |
|
575 | + ), |
|
576 | + '<p class="no-ticket-selector-msg clear-float">', |
|
577 | + $this->event->name(), |
|
578 | + '</p>', |
|
579 | + '<br />' |
|
580 | + ), |
|
581 | + $this->event |
|
582 | + ); |
|
583 | + if (apply_filters( |
|
584 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
585 | + false, |
|
586 | + $this->event |
|
587 | + )) { |
|
588 | + $html .= $this->displayRegisterNowButton(); |
|
589 | + } |
|
590 | + // sold out DWMTS event, no TS, no submit or view details button, but has additional content |
|
591 | + $html .= $this->ticketSelectorEndDiv(); |
|
592 | + } elseif (apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false) |
|
593 | + && ! is_single() |
|
594 | + ) { |
|
595 | + // this is a "Dude Where's my Ticket Selector?" (DWMTS) type event, |
|
596 | + // but no tickets are available, so display event's "View Details" button. |
|
597 | + // it is being viewed via somewhere other than a single post |
|
598 | + $html .= $this->displayViewDetailsButton(true); |
|
599 | + } else { |
|
600 | + $html .= $this->ticketSelectorEndDiv(); |
|
601 | + } |
|
602 | + } elseif (is_archive()) { |
|
603 | + // event list, no tickets available so display event's "View Details" button |
|
604 | + $html .= $this->ticketSelectorEndDiv(); |
|
605 | + $html .= $this->displayViewDetailsButton(); |
|
606 | + } else { |
|
607 | + if (apply_filters( |
|
608 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
609 | + false, |
|
610 | + $this->event |
|
611 | + )) { |
|
612 | + $html .= $this->displayRegisterNowButton(); |
|
613 | + } |
|
614 | + // no submit or view details button, and no additional content |
|
615 | + $html .= $this->ticketSelectorEndDiv(); |
|
616 | + } |
|
617 | + if (! $this->iframe && ! is_archive()) { |
|
618 | + $html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector')); |
|
619 | + } |
|
620 | + } |
|
621 | + return apply_filters( |
|
622 | + 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displaySubmitButton__html', |
|
623 | + $html, |
|
624 | + $this->event, |
|
625 | + $this |
|
626 | + ); |
|
627 | + } |
|
628 | + |
|
629 | + |
|
630 | + /** |
|
631 | + * @return string |
|
632 | + * @throws EE_Error |
|
633 | + */ |
|
634 | + public function displayRegisterNowButton() |
|
635 | + { |
|
636 | + $btn_text = apply_filters( |
|
637 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text', |
|
638 | + __('Register Now', 'event_espresso'), |
|
639 | + $this->event |
|
640 | + ); |
|
641 | + $external_url = $this->event->external_url(); |
|
642 | + $html = EEH_HTML::div( |
|
643 | + '', |
|
644 | + 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', |
|
645 | + 'ticket-selector-submit-btn-wrap' |
|
646 | + ); |
|
647 | + $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
648 | + $html .= ' class="ticket-selector-submit-btn '; |
|
649 | + $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
|
650 | + $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
651 | + $html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->'; |
|
652 | + $html .= apply_filters( |
|
653 | + 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
|
654 | + '', |
|
655 | + $this->event, |
|
656 | + $this->iframe |
|
657 | + ); |
|
658 | + return $html; |
|
659 | + } |
|
660 | + |
|
661 | + |
|
662 | + /** |
|
663 | + * displayViewDetailsButton |
|
664 | + * |
|
665 | + * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event |
|
666 | + * (ie: $_max_atndz === 1) where there are no available tickets, |
|
667 | + * either because they are sold out, expired, or not yet on sale. |
|
668 | + * In this case, we need to close the form BEFORE adding any closing divs |
|
669 | + * @return string |
|
670 | + * @throws EE_Error |
|
671 | + */ |
|
672 | + public function displayViewDetailsButton($DWMTS = false) |
|
673 | + { |
|
674 | + if (! $this->event->get_permalink()) { |
|
675 | + EE_Error::add_error( |
|
676 | + esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
677 | + __FILE__, |
|
678 | + __FUNCTION__, |
|
679 | + __LINE__ |
|
680 | + ); |
|
681 | + } |
|
682 | + $view_details_btn = '<form method="POST" action="'; |
|
683 | + $view_details_btn .= apply_filters( |
|
684 | + 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url', |
|
685 | + $this->event->get_permalink(), |
|
686 | + $this->event |
|
687 | + ); |
|
688 | + $view_details_btn .= '"'; |
|
689 | + // open link in new window ? |
|
690 | + $view_details_btn .= apply_filters( |
|
691 | + 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank', |
|
692 | + $this->isIframe(), |
|
693 | + $this |
|
694 | + ) |
|
695 | + ? ' target="_blank"' |
|
696 | + : ''; |
|
697 | + $view_details_btn .= '>'; |
|
698 | + $btn_text = apply_filters( |
|
699 | + 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text', |
|
700 | + esc_html__('View Details', 'event_espresso'), |
|
701 | + $this->event |
|
702 | + ); |
|
703 | + $view_details_btn .= '<input id="ticket-selector-submit-' |
|
704 | + . $this->event->ID() |
|
705 | + . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="' |
|
706 | + . $btn_text |
|
707 | + . '" />'; |
|
708 | + $view_details_btn .= apply_filters('FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event); |
|
709 | + if ($DWMTS) { |
|
710 | + $view_details_btn .= $this->formClose(); |
|
711 | + $view_details_btn .= $this->ticketSelectorEndDiv(); |
|
712 | + $view_details_btn .= '<br/>'; |
|
713 | + } else { |
|
714 | + $view_details_btn .= $this->clearTicketSelector(); |
|
715 | + $view_details_btn .= '<br/>'; |
|
716 | + $view_details_btn .= $this->formClose(); |
|
717 | + } |
|
718 | + return $view_details_btn; |
|
719 | + } |
|
720 | + |
|
721 | + |
|
722 | + /** |
|
723 | + * @return string |
|
724 | + */ |
|
725 | + public function ticketSelectorEndDiv() |
|
726 | + { |
|
727 | + return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->'; |
|
728 | + } |
|
729 | + |
|
730 | + |
|
731 | + /** |
|
732 | + * @return string |
|
733 | + */ |
|
734 | + public function clearTicketSelector() |
|
735 | + { |
|
736 | + // standard TS displayed, appears after a "Register Now" or "view Details" button |
|
737 | + return '<div class="clear"></div><!-- clearTicketSelector -->'; |
|
738 | + } |
|
739 | + |
|
740 | + |
|
741 | + /** |
|
742 | + * @access public |
|
743 | + * @return string |
|
744 | + */ |
|
745 | + public function formClose() |
|
746 | + { |
|
747 | + return '</form>'; |
|
748 | + } |
|
749 | 749 | } |
@@ -135,11 +135,11 @@ discard block |
||
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 |
||
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 |
@@ -235,7 +235,7 @@ discard block |
||
235 | 235 | : $this->loadTicketSelector($tickets, $template_args); |
236 | 236 | // now set up the form (but not for the admin) |
237 | 237 | $ticket_selector = $this->display_full_ui() |
238 | - ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
238 | + ? $this->formOpen($this->event->ID(), $external_url).$ticket_selector |
|
239 | 239 | : $ticket_selector; |
240 | 240 | // submit button and form close tag |
241 | 241 | $ticket_selector .= $this->display_full_ui() ? $this->displaySubmitButton($external_url) : ''; |
@@ -283,10 +283,10 @@ discard block |
||
283 | 283 | */ |
284 | 284 | protected function expiredEventMessage() |
285 | 285 | { |
286 | - return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
286 | + return '<div class="ee-event-expired-notice"><span class="important-notice">'.esc_html__( |
|
287 | 287 | 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
288 | 288 | 'event_espresso' |
289 | - ) . '</span></div><!-- .ee-event-expired-notice -->'; |
|
289 | + ).'</span></div><!-- .ee-event-expired-notice -->'; |
|
290 | 290 | } |
291 | 291 | |
292 | 292 | |
@@ -316,7 +316,7 @@ discard block |
||
316 | 316 | } |
317 | 317 | return ' |
318 | 318 | <div class="ee-event-expired-notice"> |
319 | - <span class="important-notice">' . $no_ticket_available_msg . '</span> |
|
319 | + <span class="important-notice">' . $no_ticket_available_msg.'</span> |
|
320 | 320 | </div><!-- .ee-event-expired-notice -->'; |
321 | 321 | } |
322 | 322 | |
@@ -348,7 +348,7 @@ discard block |
||
348 | 348 | '</a></span></div><!-- .ee-attention ticketSalesClosedMessage -->' |
349 | 349 | ); |
350 | 350 | } |
351 | - return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
351 | + return '<p><span class="important-notice">'.$sales_closed_msg.'</span></p>'; |
|
352 | 352 | } |
353 | 353 | |
354 | 354 | |
@@ -373,7 +373,7 @@ discard block |
||
373 | 373 | 'Datetime.DTT_EVT_start' => 'DESC', |
374 | 374 | ), |
375 | 375 | ); |
376 | - if (! ( |
|
376 | + if ( ! ( |
|
377 | 377 | EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config |
378 | 378 | && EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets |
379 | 379 | )) { |
@@ -414,7 +414,7 @@ discard block |
||
414 | 414 | */ |
415 | 415 | $template_args['anchor_id'] = apply_filters( |
416 | 416 | 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
417 | - '#tkt-slctr-tbl-' . $this->event->ID(), |
|
417 | + '#tkt-slctr-tbl-'.$this->event->ID(), |
|
418 | 418 | $this->event->ID() |
419 | 419 | ); |
420 | 420 | $template_args['tickets'] = $tickets; |
@@ -500,8 +500,8 @@ discard block |
||
500 | 500 | // if redirecting, we don't need any anything else |
501 | 501 | if ($external_url) { |
502 | 502 | $html = '<form method="GET" '; |
503 | - $html .= 'action="' . EEH_URL::refactor_url($external_url) . '" '; |
|
504 | - $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
503 | + $html .= 'action="'.EEH_URL::refactor_url($external_url).'" '; |
|
504 | + $html .= 'name="ticket-selector-form-'.$ID.'"'; |
|
505 | 505 | // open link in new window ? |
506 | 506 | $html .= apply_filters( |
507 | 507 | 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
@@ -513,17 +513,17 @@ discard block |
||
513 | 513 | $html .= '>'; |
514 | 514 | $query_args = EEH_URL::get_query_string($external_url); |
515 | 515 | foreach ((array) $query_args as $query_arg => $value) { |
516 | - $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
516 | + $html .= '<input type="hidden" name="'.$query_arg.'" value="'.$value.'">'; |
|
517 | 517 | } |
518 | 518 | return $html; |
519 | 519 | } |
520 | 520 | // if there is no submit button, then don't start building a form |
521 | 521 | // because the "View Details" button will build its own form |
522 | - if (! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
522 | + if ( ! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
523 | 523 | return ''; |
524 | 524 | } |
525 | 525 | $checkout_url = EEH_Event_View::event_link_url($ID); |
526 | - if (! $checkout_url) { |
|
526 | + if ( ! $checkout_url) { |
|
527 | 527 | EE_Error::add_error( |
528 | 528 | esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
529 | 529 | __FILE__, |
@@ -534,8 +534,8 @@ discard block |
||
534 | 534 | // set no cache headers and constants |
535 | 535 | EE_System::do_not_cache(); |
536 | 536 | $html = '<form method="POST" '; |
537 | - $html .= 'action="' . $checkout_url . '" '; |
|
538 | - $html .= 'name="ticket-selector-form-' . $ID . '"'; |
|
537 | + $html .= 'action="'.$checkout_url.'" '; |
|
538 | + $html .= 'name="ticket-selector-form-'.$ID.'"'; |
|
539 | 539 | $html .= $this->iframe ? ' target="_blank"' : ''; |
540 | 540 | $html .= '>'; |
541 | 541 | $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
@@ -561,7 +561,7 @@ discard block |
||
561 | 561 | $html .= empty($external_url) |
562 | 562 | ? $this->ticketSelectorEndDiv() |
563 | 563 | : $this->clearTicketSelector(); |
564 | - $html .= '<br/>' . $this->formClose(); |
|
564 | + $html .= '<br/>'.$this->formClose(); |
|
565 | 565 | } elseif ($this->getMaxAttendees() === 1) { |
566 | 566 | // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
567 | 567 | if ($this->event->is_sold_out()) { |
@@ -614,7 +614,7 @@ discard block |
||
614 | 614 | // no submit or view details button, and no additional content |
615 | 615 | $html .= $this->ticketSelectorEndDiv(); |
616 | 616 | } |
617 | - if (! $this->iframe && ! is_archive()) { |
|
617 | + if ( ! $this->iframe && ! is_archive()) { |
|
618 | 618 | $html .= EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector')); |
619 | 619 | } |
620 | 620 | } |
@@ -641,14 +641,14 @@ discard block |
||
641 | 641 | $external_url = $this->event->external_url(); |
642 | 642 | $html = EEH_HTML::div( |
643 | 643 | '', |
644 | - 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', |
|
644 | + 'ticket-selector-submit-'.$this->event->ID().'-btn-wrap', |
|
645 | 645 | 'ticket-selector-submit-btn-wrap' |
646 | 646 | ); |
647 | - $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
647 | + $html .= '<input id="ticket-selector-submit-'.$this->event->ID().'-btn"'; |
|
648 | 648 | $html .= ' class="ticket-selector-submit-btn '; |
649 | 649 | $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
650 | - $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
651 | - $html .= EEH_HTML::divx() . '<!-- .ticket-selector-submit-btn-wrap -->'; |
|
650 | + $html .= ' type="submit" value="'.$btn_text.'" />'; |
|
651 | + $html .= EEH_HTML::divx().'<!-- .ticket-selector-submit-btn-wrap -->'; |
|
652 | 652 | $html .= apply_filters( |
653 | 653 | 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
654 | 654 | '', |
@@ -671,7 +671,7 @@ discard block |
||
671 | 671 | */ |
672 | 672 | public function displayViewDetailsButton($DWMTS = false) |
673 | 673 | { |
674 | - if (! $this->event->get_permalink()) { |
|
674 | + if ( ! $this->event->get_permalink()) { |
|
675 | 675 | EE_Error::add_error( |
676 | 676 | esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
677 | 677 | __FILE__, |
@@ -724,7 +724,7 @@ discard block |
||
724 | 724 | */ |
725 | 725 | public function ticketSelectorEndDiv() |
726 | 726 | { |
727 | - return $this->clearTicketSelector() . '</div><!-- ticketSelectorEndDiv -->'; |
|
727 | + return $this->clearTicketSelector().'</div><!-- ticketSelectorEndDiv -->'; |
|
728 | 728 | } |
729 | 729 | |
730 | 730 |
@@ -33,526 +33,526 @@ |
||
33 | 33 | class ProcessTicketSelector |
34 | 34 | { |
35 | 35 | |
36 | - /** |
|
37 | - * @var EE_Cart $cart |
|
38 | - */ |
|
39 | - private $cart; |
|
36 | + /** |
|
37 | + * @var EE_Cart $cart |
|
38 | + */ |
|
39 | + private $cart; |
|
40 | 40 | |
41 | - /** |
|
42 | - * @var EE_Core_Config $core_config |
|
43 | - */ |
|
44 | - private $core_config; |
|
41 | + /** |
|
42 | + * @var EE_Core_Config $core_config |
|
43 | + */ |
|
44 | + private $core_config; |
|
45 | 45 | |
46 | - /** |
|
47 | - * @var Request $request |
|
48 | - */ |
|
49 | - private $request; |
|
46 | + /** |
|
47 | + * @var Request $request |
|
48 | + */ |
|
49 | + private $request; |
|
50 | 50 | |
51 | - /** |
|
52 | - * @var EE_Session $session |
|
53 | - */ |
|
54 | - private $session; |
|
51 | + /** |
|
52 | + * @var EE_Session $session |
|
53 | + */ |
|
54 | + private $session; |
|
55 | 55 | |
56 | - /** |
|
57 | - * @var EEM_Ticket $ticket_model |
|
58 | - */ |
|
59 | - private $ticket_model; |
|
56 | + /** |
|
57 | + * @var EEM_Ticket $ticket_model |
|
58 | + */ |
|
59 | + private $ticket_model; |
|
60 | 60 | |
61 | - /** |
|
62 | - * @var TicketDatetimeAvailabilityTracker $tracker |
|
63 | - */ |
|
64 | - private $tracker; |
|
61 | + /** |
|
62 | + * @var TicketDatetimeAvailabilityTracker $tracker |
|
63 | + */ |
|
64 | + private $tracker; |
|
65 | 65 | |
66 | 66 | |
67 | - /** |
|
68 | - * ProcessTicketSelector constructor. |
|
69 | - * NOTE: PLZ use the Loader to instantiate this class if need be |
|
70 | - * so that all dependencies get injected correctly (which will happen automatically) |
|
71 | - * Null values for parameters are only for backwards compatibility but will be removed later on. |
|
72 | - * |
|
73 | - * @param EE_Core_Config $core_config |
|
74 | - * @param Request $request |
|
75 | - * @param EE_Session $session |
|
76 | - * @param EEM_Ticket $ticket_model |
|
77 | - * @param TicketDatetimeAvailabilityTracker $tracker |
|
78 | - * @throws InvalidArgumentException |
|
79 | - * @throws InvalidDataTypeException |
|
80 | - * @throws InvalidInterfaceException |
|
81 | - */ |
|
82 | - public function __construct( |
|
83 | - EE_Core_Config $core_config = null, |
|
84 | - Request $request = null, |
|
85 | - EE_Session $session = null, |
|
86 | - EEM_Ticket $ticket_model = null, |
|
87 | - TicketDatetimeAvailabilityTracker $tracker = null |
|
88 | - ) { |
|
89 | - /** @var LoaderInterface $loader */ |
|
90 | - $loader = LoaderFactory::getLoader(); |
|
91 | - $this->core_config = $core_config instanceof EE_Core_Config |
|
92 | - ? $core_config |
|
93 | - : $loader->getShared('EE_Core_Config'); |
|
94 | - $this->request = $request instanceof Request |
|
95 | - ? $request |
|
96 | - : $loader->getShared('EventEspresso\core\services\request\Request'); |
|
97 | - $this->session = $session instanceof EE_Session |
|
98 | - ? $session |
|
99 | - : $loader->getShared('EE_Session'); |
|
100 | - $this->ticket_model = $ticket_model instanceof EEM_Ticket |
|
101 | - ? $ticket_model |
|
102 | - : $loader->getShared('EEM_Ticket'); |
|
103 | - $this->tracker = $tracker instanceof TicketDatetimeAvailabilityTracker |
|
104 | - ? $tracker |
|
105 | - : $loader->getShared('EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'); |
|
106 | - } |
|
67 | + /** |
|
68 | + * ProcessTicketSelector constructor. |
|
69 | + * NOTE: PLZ use the Loader to instantiate this class if need be |
|
70 | + * so that all dependencies get injected correctly (which will happen automatically) |
|
71 | + * Null values for parameters are only for backwards compatibility but will be removed later on. |
|
72 | + * |
|
73 | + * @param EE_Core_Config $core_config |
|
74 | + * @param Request $request |
|
75 | + * @param EE_Session $session |
|
76 | + * @param EEM_Ticket $ticket_model |
|
77 | + * @param TicketDatetimeAvailabilityTracker $tracker |
|
78 | + * @throws InvalidArgumentException |
|
79 | + * @throws InvalidDataTypeException |
|
80 | + * @throws InvalidInterfaceException |
|
81 | + */ |
|
82 | + public function __construct( |
|
83 | + EE_Core_Config $core_config = null, |
|
84 | + Request $request = null, |
|
85 | + EE_Session $session = null, |
|
86 | + EEM_Ticket $ticket_model = null, |
|
87 | + TicketDatetimeAvailabilityTracker $tracker = null |
|
88 | + ) { |
|
89 | + /** @var LoaderInterface $loader */ |
|
90 | + $loader = LoaderFactory::getLoader(); |
|
91 | + $this->core_config = $core_config instanceof EE_Core_Config |
|
92 | + ? $core_config |
|
93 | + : $loader->getShared('EE_Core_Config'); |
|
94 | + $this->request = $request instanceof Request |
|
95 | + ? $request |
|
96 | + : $loader->getShared('EventEspresso\core\services\request\Request'); |
|
97 | + $this->session = $session instanceof EE_Session |
|
98 | + ? $session |
|
99 | + : $loader->getShared('EE_Session'); |
|
100 | + $this->ticket_model = $ticket_model instanceof EEM_Ticket |
|
101 | + ? $ticket_model |
|
102 | + : $loader->getShared('EEM_Ticket'); |
|
103 | + $this->tracker = $tracker instanceof TicketDatetimeAvailabilityTracker |
|
104 | + ? $tracker |
|
105 | + : $loader->getShared('EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker'); |
|
106 | + } |
|
107 | 107 | |
108 | 108 | |
109 | - /** |
|
110 | - * cancelTicketSelections |
|
111 | - * |
|
112 | - * @return bool |
|
113 | - * @throws EE_Error |
|
114 | - * @throws InvalidArgumentException |
|
115 | - * @throws InvalidInterfaceException |
|
116 | - * @throws InvalidDataTypeException |
|
117 | - */ |
|
118 | - public function cancelTicketSelections() |
|
119 | - { |
|
120 | - // check nonce |
|
121 | - if (! $this->processTicketSelectorNonce('cancel_ticket_selections')) { |
|
122 | - return false; |
|
123 | - } |
|
124 | - $this->session->clear_session(__CLASS__, __FUNCTION__); |
|
125 | - if ($this->request->requestParamIsSet('event_id')) { |
|
126 | - EEH_URL::safeRedirectAndExit( |
|
127 | - EEH_Event_View::event_link_url( |
|
128 | - $this->request->getRequestParam('event_id') |
|
129 | - ) |
|
130 | - ); |
|
131 | - } |
|
132 | - EEH_URL::safeRedirectAndExit( |
|
133 | - site_url('/' . $this->core_config->event_cpt_slug . '/') |
|
134 | - ); |
|
135 | - return true; |
|
136 | - } |
|
109 | + /** |
|
110 | + * cancelTicketSelections |
|
111 | + * |
|
112 | + * @return bool |
|
113 | + * @throws EE_Error |
|
114 | + * @throws InvalidArgumentException |
|
115 | + * @throws InvalidInterfaceException |
|
116 | + * @throws InvalidDataTypeException |
|
117 | + */ |
|
118 | + public function cancelTicketSelections() |
|
119 | + { |
|
120 | + // check nonce |
|
121 | + if (! $this->processTicketSelectorNonce('cancel_ticket_selections')) { |
|
122 | + return false; |
|
123 | + } |
|
124 | + $this->session->clear_session(__CLASS__, __FUNCTION__); |
|
125 | + if ($this->request->requestParamIsSet('event_id')) { |
|
126 | + EEH_URL::safeRedirectAndExit( |
|
127 | + EEH_Event_View::event_link_url( |
|
128 | + $this->request->getRequestParam('event_id') |
|
129 | + ) |
|
130 | + ); |
|
131 | + } |
|
132 | + EEH_URL::safeRedirectAndExit( |
|
133 | + site_url('/' . $this->core_config->event_cpt_slug . '/') |
|
134 | + ); |
|
135 | + return true; |
|
136 | + } |
|
137 | 137 | |
138 | 138 | |
139 | - /** |
|
140 | - * processTicketSelectorNonce |
|
141 | - * |
|
142 | - * @param string $nonce_name |
|
143 | - * @param string $id |
|
144 | - * @return bool |
|
145 | - */ |
|
146 | - private function processTicketSelectorNonce($nonce_name, $id = '') |
|
147 | - { |
|
148 | - $nonce_name_with_id = ! empty($id) ? "{$nonce_name}_nonce_{$id}" : "{$nonce_name}_nonce"; |
|
149 | - if (! $this->request->isAdmin() |
|
150 | - && ( |
|
151 | - ! $this->request->is_set($nonce_name_with_id) |
|
152 | - || ! wp_verify_nonce( |
|
153 | - $this->request->get($nonce_name_with_id), |
|
154 | - $nonce_name |
|
155 | - ) |
|
156 | - ) |
|
157 | - ) { |
|
158 | - EE_Error::add_error( |
|
159 | - sprintf( |
|
160 | - esc_html__( |
|
161 | - 'We\'re sorry but your request failed to pass a security check.%sPlease click the back button on your browser and try again.', |
|
162 | - 'event_espresso' |
|
163 | - ), |
|
164 | - '<br/>' |
|
165 | - ), |
|
166 | - __FILE__, |
|
167 | - __FUNCTION__, |
|
168 | - __LINE__ |
|
169 | - ); |
|
170 | - return false; |
|
171 | - } |
|
172 | - return true; |
|
173 | - } |
|
139 | + /** |
|
140 | + * processTicketSelectorNonce |
|
141 | + * |
|
142 | + * @param string $nonce_name |
|
143 | + * @param string $id |
|
144 | + * @return bool |
|
145 | + */ |
|
146 | + private function processTicketSelectorNonce($nonce_name, $id = '') |
|
147 | + { |
|
148 | + $nonce_name_with_id = ! empty($id) ? "{$nonce_name}_nonce_{$id}" : "{$nonce_name}_nonce"; |
|
149 | + if (! $this->request->isAdmin() |
|
150 | + && ( |
|
151 | + ! $this->request->is_set($nonce_name_with_id) |
|
152 | + || ! wp_verify_nonce( |
|
153 | + $this->request->get($nonce_name_with_id), |
|
154 | + $nonce_name |
|
155 | + ) |
|
156 | + ) |
|
157 | + ) { |
|
158 | + EE_Error::add_error( |
|
159 | + sprintf( |
|
160 | + esc_html__( |
|
161 | + 'We\'re sorry but your request failed to pass a security check.%sPlease click the back button on your browser and try again.', |
|
162 | + 'event_espresso' |
|
163 | + ), |
|
164 | + '<br/>' |
|
165 | + ), |
|
166 | + __FILE__, |
|
167 | + __FUNCTION__, |
|
168 | + __LINE__ |
|
169 | + ); |
|
170 | + return false; |
|
171 | + } |
|
172 | + return true; |
|
173 | + } |
|
174 | 174 | |
175 | 175 | |
176 | - /** |
|
177 | - * process_ticket_selections |
|
178 | - * |
|
179 | - * @return array|bool |
|
180 | - * @throws EE_Error |
|
181 | - * @throws InvalidArgumentException |
|
182 | - * @throws InvalidDataTypeException |
|
183 | - * @throws InvalidInterfaceException |
|
184 | - */ |
|
185 | - public function processTicketSelections() |
|
186 | - { |
|
187 | - do_action('EED_Ticket_Selector__process_ticket_selections__before'); |
|
188 | - if ($this->request->isBot()) { |
|
189 | - EEH_URL::safeRedirectAndExit( |
|
190 | - apply_filters( |
|
191 | - 'FHEE__EE_Ticket_Selector__process_ticket_selections__bot_redirect_url', |
|
192 | - site_url() |
|
193 | - ) |
|
194 | - ); |
|
195 | - } |
|
196 | - // do we have an event id? |
|
197 | - $id = $this->getEventId(); |
|
198 | - // we should really only have 1 registration in the works now |
|
199 | - // (ie, no MER) so unless otherwise requested, clear the session |
|
200 | - if (apply_filters('FHEE__EE_Ticket_Selector__process_ticket_selections__clear_session', true)) { |
|
201 | - $this->session->clear_session(__CLASS__, __FUNCTION__); |
|
202 | - } |
|
203 | - // validate/sanitize/filter data |
|
204 | - $valid = apply_filters( |
|
205 | - 'FHEE__EED_Ticket_Selector__process_ticket_selections__valid_post_data', |
|
206 | - $this->validatePostData($id) |
|
207 | - ); |
|
208 | - // check total tickets ordered vs max number of attendees that can register |
|
209 | - if ($valid['total_tickets'] > $valid['max_atndz']) { |
|
210 | - $this->maxAttendeesViolation($valid); |
|
211 | - } else { |
|
212 | - // all data appears to be valid |
|
213 | - if ($this->processSuccessfulCart($this->addTicketsToCart($valid))) { |
|
214 | - return true; |
|
215 | - } |
|
216 | - } |
|
217 | - // die(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< KILL BEFORE REDIRECT |
|
218 | - // at this point, just return if registration is being made from admin |
|
219 | - if ($this->request->isAdmin() || $this->request->isFrontAjax()) { |
|
220 | - return false; |
|
221 | - } |
|
222 | - if ($valid['return_url']) { |
|
223 | - EEH_URL::safeRedirectAndExit($valid['return_url']); |
|
224 | - } |
|
225 | - if ($id) { |
|
226 | - EEH_URL::safeRedirectAndExit(get_permalink($id)); |
|
227 | - } |
|
228 | - echo EE_Error::get_notices(); |
|
229 | - return false; |
|
230 | - } |
|
176 | + /** |
|
177 | + * process_ticket_selections |
|
178 | + * |
|
179 | + * @return array|bool |
|
180 | + * @throws EE_Error |
|
181 | + * @throws InvalidArgumentException |
|
182 | + * @throws InvalidDataTypeException |
|
183 | + * @throws InvalidInterfaceException |
|
184 | + */ |
|
185 | + public function processTicketSelections() |
|
186 | + { |
|
187 | + do_action('EED_Ticket_Selector__process_ticket_selections__before'); |
|
188 | + if ($this->request->isBot()) { |
|
189 | + EEH_URL::safeRedirectAndExit( |
|
190 | + apply_filters( |
|
191 | + 'FHEE__EE_Ticket_Selector__process_ticket_selections__bot_redirect_url', |
|
192 | + site_url() |
|
193 | + ) |
|
194 | + ); |
|
195 | + } |
|
196 | + // do we have an event id? |
|
197 | + $id = $this->getEventId(); |
|
198 | + // we should really only have 1 registration in the works now |
|
199 | + // (ie, no MER) so unless otherwise requested, clear the session |
|
200 | + if (apply_filters('FHEE__EE_Ticket_Selector__process_ticket_selections__clear_session', true)) { |
|
201 | + $this->session->clear_session(__CLASS__, __FUNCTION__); |
|
202 | + } |
|
203 | + // validate/sanitize/filter data |
|
204 | + $valid = apply_filters( |
|
205 | + 'FHEE__EED_Ticket_Selector__process_ticket_selections__valid_post_data', |
|
206 | + $this->validatePostData($id) |
|
207 | + ); |
|
208 | + // check total tickets ordered vs max number of attendees that can register |
|
209 | + if ($valid['total_tickets'] > $valid['max_atndz']) { |
|
210 | + $this->maxAttendeesViolation($valid); |
|
211 | + } else { |
|
212 | + // all data appears to be valid |
|
213 | + if ($this->processSuccessfulCart($this->addTicketsToCart($valid))) { |
|
214 | + return true; |
|
215 | + } |
|
216 | + } |
|
217 | + // die(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< KILL BEFORE REDIRECT |
|
218 | + // at this point, just return if registration is being made from admin |
|
219 | + if ($this->request->isAdmin() || $this->request->isFrontAjax()) { |
|
220 | + return false; |
|
221 | + } |
|
222 | + if ($valid['return_url']) { |
|
223 | + EEH_URL::safeRedirectAndExit($valid['return_url']); |
|
224 | + } |
|
225 | + if ($id) { |
|
226 | + EEH_URL::safeRedirectAndExit(get_permalink($id)); |
|
227 | + } |
|
228 | + echo EE_Error::get_notices(); |
|
229 | + return false; |
|
230 | + } |
|
231 | 231 | |
232 | 232 | |
233 | - /** |
|
234 | - * @return int |
|
235 | - */ |
|
236 | - private function getEventId() |
|
237 | - { |
|
238 | - // do we have an event id? |
|
239 | - if (! $this->request->requestParamIsSet('tkt-slctr-event-id')) { |
|
240 | - // $_POST['tkt-slctr-event-id'] was not set ?!?!?!? |
|
241 | - EE_Error::add_error( |
|
242 | - sprintf( |
|
243 | - esc_html__( |
|
244 | - 'An event id was not provided or was not received.%sPlease click the back button on your browser and try again.', |
|
245 | - 'event_espresso' |
|
246 | - ), |
|
247 | - '<br/>' |
|
248 | - ), |
|
249 | - __FILE__, |
|
250 | - __FUNCTION__, |
|
251 | - __LINE__ |
|
252 | - ); |
|
253 | - } |
|
254 | - // if event id is valid |
|
255 | - return absint($this->request->getRequestParam('tkt-slctr-event-id')); |
|
256 | - } |
|
233 | + /** |
|
234 | + * @return int |
|
235 | + */ |
|
236 | + private function getEventId() |
|
237 | + { |
|
238 | + // do we have an event id? |
|
239 | + if (! $this->request->requestParamIsSet('tkt-slctr-event-id')) { |
|
240 | + // $_POST['tkt-slctr-event-id'] was not set ?!?!?!? |
|
241 | + EE_Error::add_error( |
|
242 | + sprintf( |
|
243 | + esc_html__( |
|
244 | + 'An event id was not provided or was not received.%sPlease click the back button on your browser and try again.', |
|
245 | + 'event_espresso' |
|
246 | + ), |
|
247 | + '<br/>' |
|
248 | + ), |
|
249 | + __FILE__, |
|
250 | + __FUNCTION__, |
|
251 | + __LINE__ |
|
252 | + ); |
|
253 | + } |
|
254 | + // if event id is valid |
|
255 | + return absint($this->request->getRequestParam('tkt-slctr-event-id')); |
|
256 | + } |
|
257 | 257 | |
258 | 258 | |
259 | - /** |
|
260 | - * validate_post_data |
|
261 | - * |
|
262 | - * @param int $id |
|
263 | - * @return array|FALSE |
|
264 | - */ |
|
265 | - private function validatePostData($id = 0) |
|
266 | - { |
|
267 | - if (! $id) { |
|
268 | - EE_Error::add_error( |
|
269 | - esc_html__('The event id provided was not valid.', 'event_espresso'), |
|
270 | - __FILE__, |
|
271 | - __FUNCTION__, |
|
272 | - __LINE__ |
|
273 | - ); |
|
274 | - return false; |
|
275 | - } |
|
276 | - // start with an empty array() |
|
277 | - $valid_data = array(); |
|
278 | - // grab valid id |
|
279 | - $valid_data['id'] = $id; |
|
280 | - // array of other form names |
|
281 | - $inputs_to_clean = array( |
|
282 | - 'event_id' => 'tkt-slctr-event-id', |
|
283 | - 'max_atndz' => 'tkt-slctr-max-atndz-', |
|
284 | - 'rows' => 'tkt-slctr-rows-', |
|
285 | - 'qty' => 'tkt-slctr-qty-', |
|
286 | - 'ticket_id' => 'tkt-slctr-ticket-id-', |
|
287 | - 'return_url' => 'tkt-slctr-return-url-', |
|
288 | - ); |
|
289 | - // let's track the total number of tickets ordered.' |
|
290 | - $valid_data['total_tickets'] = 0; |
|
291 | - // cycle through $inputs_to_clean array |
|
292 | - foreach ($inputs_to_clean as $what => $input_to_clean) { |
|
293 | - // check for POST data |
|
294 | - if ($this->request->requestParamIsSet($input_to_clean . $id)) { |
|
295 | - // grab value |
|
296 | - $input_value = $this->request->getRequestParam($input_to_clean . $id); |
|
297 | - switch ($what) { |
|
298 | - // integers |
|
299 | - case 'event_id': |
|
300 | - $valid_data[ $what ] = absint($input_value); |
|
301 | - // get event via the event id we put in the form |
|
302 | - break; |
|
303 | - case 'rows': |
|
304 | - case 'max_atndz': |
|
305 | - $valid_data[ $what ] = absint($input_value); |
|
306 | - break; |
|
307 | - // arrays of integers |
|
308 | - case 'qty': |
|
309 | - /** @var array $row_qty */ |
|
310 | - $row_qty = $input_value; |
|
311 | - // if qty is coming from a radio button input, then we need to assemble an array of rows |
|
312 | - if (! is_array($row_qty)) { |
|
313 | - /** @var string $row_qty */ |
|
314 | - // get number of rows |
|
315 | - $rows = $this->request->requestParamIsSet('tkt-slctr-rows-' . $id) |
|
316 | - ? absint($this->request->getRequestParam('tkt-slctr-rows-' . $id)) |
|
317 | - : 1; |
|
318 | - // explode integers by the dash |
|
319 | - $row_qty = explode('-', $row_qty); |
|
320 | - $row = isset($row_qty[0]) ? absint($row_qty[0]) : 1; |
|
321 | - $qty = isset($row_qty[1]) ? absint($row_qty[1]) : 0; |
|
322 | - $row_qty = array($row => $qty); |
|
323 | - for ($x = 1; $x <= $rows; $x++) { |
|
324 | - if (! isset($row_qty[ $x ])) { |
|
325 | - $row_qty[ $x ] = 0; |
|
326 | - } |
|
327 | - } |
|
328 | - } |
|
329 | - ksort($row_qty); |
|
330 | - // cycle thru values |
|
331 | - foreach ($row_qty as $qty) { |
|
332 | - $qty = absint($qty); |
|
333 | - // sanitize as integers |
|
334 | - $valid_data[ $what ][] = $qty; |
|
335 | - $valid_data['total_tickets'] += $qty; |
|
336 | - } |
|
337 | - break; |
|
338 | - // array of integers |
|
339 | - case 'ticket_id': |
|
340 | - // cycle thru values |
|
341 | - foreach ((array) $input_value as $key => $value) { |
|
342 | - // allow only integers |
|
343 | - $valid_data[ $what ][ $key ] = absint($value); |
|
344 | - } |
|
345 | - break; |
|
346 | - case 'return_url': |
|
347 | - // grab and sanitize return-url |
|
348 | - $input_value = esc_url_raw($input_value); |
|
349 | - // was the request coming from an iframe ? if so, then: |
|
350 | - if (strpos($input_value, 'event_list=iframe')) { |
|
351 | - // get anchor fragment |
|
352 | - $input_value = explode('#', $input_value); |
|
353 | - $input_value = end($input_value); |
|
354 | - // use event list url instead, but append anchor |
|
355 | - $input_value = EEH_Event_View::event_archive_url() . '#' . $input_value; |
|
356 | - } |
|
357 | - $valid_data[ $what ] = $input_value; |
|
358 | - break; |
|
359 | - } // end switch $what |
|
360 | - } |
|
361 | - } // end foreach $inputs_to_clean |
|
362 | - return $valid_data; |
|
363 | - } |
|
259 | + /** |
|
260 | + * validate_post_data |
|
261 | + * |
|
262 | + * @param int $id |
|
263 | + * @return array|FALSE |
|
264 | + */ |
|
265 | + private function validatePostData($id = 0) |
|
266 | + { |
|
267 | + if (! $id) { |
|
268 | + EE_Error::add_error( |
|
269 | + esc_html__('The event id provided was not valid.', 'event_espresso'), |
|
270 | + __FILE__, |
|
271 | + __FUNCTION__, |
|
272 | + __LINE__ |
|
273 | + ); |
|
274 | + return false; |
|
275 | + } |
|
276 | + // start with an empty array() |
|
277 | + $valid_data = array(); |
|
278 | + // grab valid id |
|
279 | + $valid_data['id'] = $id; |
|
280 | + // array of other form names |
|
281 | + $inputs_to_clean = array( |
|
282 | + 'event_id' => 'tkt-slctr-event-id', |
|
283 | + 'max_atndz' => 'tkt-slctr-max-atndz-', |
|
284 | + 'rows' => 'tkt-slctr-rows-', |
|
285 | + 'qty' => 'tkt-slctr-qty-', |
|
286 | + 'ticket_id' => 'tkt-slctr-ticket-id-', |
|
287 | + 'return_url' => 'tkt-slctr-return-url-', |
|
288 | + ); |
|
289 | + // let's track the total number of tickets ordered.' |
|
290 | + $valid_data['total_tickets'] = 0; |
|
291 | + // cycle through $inputs_to_clean array |
|
292 | + foreach ($inputs_to_clean as $what => $input_to_clean) { |
|
293 | + // check for POST data |
|
294 | + if ($this->request->requestParamIsSet($input_to_clean . $id)) { |
|
295 | + // grab value |
|
296 | + $input_value = $this->request->getRequestParam($input_to_clean . $id); |
|
297 | + switch ($what) { |
|
298 | + // integers |
|
299 | + case 'event_id': |
|
300 | + $valid_data[ $what ] = absint($input_value); |
|
301 | + // get event via the event id we put in the form |
|
302 | + break; |
|
303 | + case 'rows': |
|
304 | + case 'max_atndz': |
|
305 | + $valid_data[ $what ] = absint($input_value); |
|
306 | + break; |
|
307 | + // arrays of integers |
|
308 | + case 'qty': |
|
309 | + /** @var array $row_qty */ |
|
310 | + $row_qty = $input_value; |
|
311 | + // if qty is coming from a radio button input, then we need to assemble an array of rows |
|
312 | + if (! is_array($row_qty)) { |
|
313 | + /** @var string $row_qty */ |
|
314 | + // get number of rows |
|
315 | + $rows = $this->request->requestParamIsSet('tkt-slctr-rows-' . $id) |
|
316 | + ? absint($this->request->getRequestParam('tkt-slctr-rows-' . $id)) |
|
317 | + : 1; |
|
318 | + // explode integers by the dash |
|
319 | + $row_qty = explode('-', $row_qty); |
|
320 | + $row = isset($row_qty[0]) ? absint($row_qty[0]) : 1; |
|
321 | + $qty = isset($row_qty[1]) ? absint($row_qty[1]) : 0; |
|
322 | + $row_qty = array($row => $qty); |
|
323 | + for ($x = 1; $x <= $rows; $x++) { |
|
324 | + if (! isset($row_qty[ $x ])) { |
|
325 | + $row_qty[ $x ] = 0; |
|
326 | + } |
|
327 | + } |
|
328 | + } |
|
329 | + ksort($row_qty); |
|
330 | + // cycle thru values |
|
331 | + foreach ($row_qty as $qty) { |
|
332 | + $qty = absint($qty); |
|
333 | + // sanitize as integers |
|
334 | + $valid_data[ $what ][] = $qty; |
|
335 | + $valid_data['total_tickets'] += $qty; |
|
336 | + } |
|
337 | + break; |
|
338 | + // array of integers |
|
339 | + case 'ticket_id': |
|
340 | + // cycle thru values |
|
341 | + foreach ((array) $input_value as $key => $value) { |
|
342 | + // allow only integers |
|
343 | + $valid_data[ $what ][ $key ] = absint($value); |
|
344 | + } |
|
345 | + break; |
|
346 | + case 'return_url': |
|
347 | + // grab and sanitize return-url |
|
348 | + $input_value = esc_url_raw($input_value); |
|
349 | + // was the request coming from an iframe ? if so, then: |
|
350 | + if (strpos($input_value, 'event_list=iframe')) { |
|
351 | + // get anchor fragment |
|
352 | + $input_value = explode('#', $input_value); |
|
353 | + $input_value = end($input_value); |
|
354 | + // use event list url instead, but append anchor |
|
355 | + $input_value = EEH_Event_View::event_archive_url() . '#' . $input_value; |
|
356 | + } |
|
357 | + $valid_data[ $what ] = $input_value; |
|
358 | + break; |
|
359 | + } // end switch $what |
|
360 | + } |
|
361 | + } // end foreach $inputs_to_clean |
|
362 | + return $valid_data; |
|
363 | + } |
|
364 | 364 | |
365 | 365 | |
366 | - /** |
|
367 | - * @param array $valid |
|
368 | - */ |
|
369 | - private function maxAttendeesViolation(array $valid) |
|
370 | - { |
|
371 | - // ordering too many tickets !!! |
|
372 | - $total_tickets_string = esc_html( |
|
373 | - _n( |
|
374 | - 'You have attempted to purchase %s ticket.', |
|
375 | - 'You have attempted to purchase %s tickets.', |
|
376 | - $valid['total_tickets'], |
|
377 | - 'event_espresso' |
|
378 | - ) |
|
379 | - ); |
|
380 | - $limit_error_1 = sprintf($total_tickets_string, $valid['total_tickets']); |
|
381 | - // dev only message |
|
382 | - $max_attendees_string = esc_html( |
|
383 | - _n( |
|
384 | - 'The registration limit for this event is %s ticket per registration, therefore the total number of tickets you may purchase at a time can not exceed %s.', |
|
385 | - 'The registration limit for this event is %s tickets per registration, therefore the total number of tickets you may purchase at a time can not exceed %s.', |
|
386 | - $valid['max_atndz'], |
|
387 | - 'event_espresso' |
|
388 | - ) |
|
389 | - ); |
|
390 | - $limit_error_2 = sprintf($max_attendees_string, $valid['max_atndz'], $valid['max_atndz']); |
|
391 | - EE_Error::add_error($limit_error_1 . '<br/>' . $limit_error_2, __FILE__, __FUNCTION__, __LINE__); |
|
392 | - } |
|
366 | + /** |
|
367 | + * @param array $valid |
|
368 | + */ |
|
369 | + private function maxAttendeesViolation(array $valid) |
|
370 | + { |
|
371 | + // ordering too many tickets !!! |
|
372 | + $total_tickets_string = esc_html( |
|
373 | + _n( |
|
374 | + 'You have attempted to purchase %s ticket.', |
|
375 | + 'You have attempted to purchase %s tickets.', |
|
376 | + $valid['total_tickets'], |
|
377 | + 'event_espresso' |
|
378 | + ) |
|
379 | + ); |
|
380 | + $limit_error_1 = sprintf($total_tickets_string, $valid['total_tickets']); |
|
381 | + // dev only message |
|
382 | + $max_attendees_string = esc_html( |
|
383 | + _n( |
|
384 | + 'The registration limit for this event is %s ticket per registration, therefore the total number of tickets you may purchase at a time can not exceed %s.', |
|
385 | + 'The registration limit for this event is %s tickets per registration, therefore the total number of tickets you may purchase at a time can not exceed %s.', |
|
386 | + $valid['max_atndz'], |
|
387 | + 'event_espresso' |
|
388 | + ) |
|
389 | + ); |
|
390 | + $limit_error_2 = sprintf($max_attendees_string, $valid['max_atndz'], $valid['max_atndz']); |
|
391 | + EE_Error::add_error($limit_error_1 . '<br/>' . $limit_error_2, __FILE__, __FUNCTION__, __LINE__); |
|
392 | + } |
|
393 | 393 | |
394 | 394 | |
395 | - /** |
|
396 | - * @param array $valid |
|
397 | - * @return int|TRUE |
|
398 | - * @throws EE_Error |
|
399 | - * @throws InvalidArgumentException |
|
400 | - * @throws InvalidDataTypeException |
|
401 | - * @throws InvalidInterfaceException |
|
402 | - */ |
|
403 | - private function addTicketsToCart(array $valid) |
|
404 | - { |
|
405 | - $tickets_added = 0; |
|
406 | - $tickets_selected = false; |
|
407 | - if ($valid['total_tickets'] > 0) { |
|
408 | - // load cart using factory because we don't want to do so until actually needed |
|
409 | - $this->cart = CartFactory::getCart(); |
|
410 | - // cycle thru the number of data rows sent from the event listing |
|
411 | - for ($x = 0; $x < $valid['rows']; $x++) { |
|
412 | - // does this row actually contain a ticket quantity? |
|
413 | - if (isset($valid['qty'][ $x ]) && $valid['qty'][ $x ] > 0) { |
|
414 | - // YES we have a ticket quantity |
|
415 | - $tickets_selected = true; |
|
416 | - $valid_ticket = false; |
|
417 | - // \EEH_Debug_Tools::printr( |
|
418 | - // $valid['ticket_id'][ $x ], |
|
419 | - // '$valid[\'ticket_id\'][ $x ]', |
|
420 | - // __FILE__, __LINE__ |
|
421 | - // ); |
|
422 | - if (isset($valid['ticket_id'][ $x ])) { |
|
423 | - // get ticket via the ticket id we put in the form |
|
424 | - $ticket = $this->ticket_model->get_one_by_ID($valid['ticket_id'][ $x ]); |
|
425 | - if ($ticket instanceof EE_Ticket) { |
|
426 | - $valid_ticket = true; |
|
427 | - $tickets_added += $this->addTicketToCart( |
|
428 | - $ticket, |
|
429 | - $valid['qty'][ $x ] |
|
430 | - ); |
|
431 | - } |
|
432 | - } |
|
433 | - if ($valid_ticket !== true) { |
|
434 | - // nothing added to cart retrieved |
|
435 | - EE_Error::add_error( |
|
436 | - sprintf( |
|
437 | - esc_html__( |
|
438 | - 'A valid ticket could not be retrieved for the event.%sPlease click the back button on your browser and try again.', |
|
439 | - 'event_espresso' |
|
440 | - ), |
|
441 | - '<br/>' |
|
442 | - ), |
|
443 | - __FILE__, |
|
444 | - __FUNCTION__, |
|
445 | - __LINE__ |
|
446 | - ); |
|
447 | - } |
|
448 | - if (EE_Error::has_error()) { |
|
449 | - break; |
|
450 | - } |
|
451 | - } |
|
452 | - } |
|
453 | - } |
|
454 | - do_action( |
|
455 | - 'AHEE__EE_Ticket_Selector__process_ticket_selections__after_tickets_added_to_cart', |
|
456 | - $this->cart, |
|
457 | - $this |
|
458 | - ); |
|
459 | - if (! apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', $tickets_selected)) { |
|
460 | - // no ticket quantities were selected |
|
461 | - EE_Error::add_error( |
|
462 | - esc_html__('You need to select a ticket quantity before you can proceed.', 'event_espresso'), |
|
463 | - __FILE__, |
|
464 | - __FUNCTION__, |
|
465 | - __LINE__ |
|
466 | - ); |
|
467 | - } |
|
468 | - return $tickets_added; |
|
469 | - } |
|
395 | + /** |
|
396 | + * @param array $valid |
|
397 | + * @return int|TRUE |
|
398 | + * @throws EE_Error |
|
399 | + * @throws InvalidArgumentException |
|
400 | + * @throws InvalidDataTypeException |
|
401 | + * @throws InvalidInterfaceException |
|
402 | + */ |
|
403 | + private function addTicketsToCart(array $valid) |
|
404 | + { |
|
405 | + $tickets_added = 0; |
|
406 | + $tickets_selected = false; |
|
407 | + if ($valid['total_tickets'] > 0) { |
|
408 | + // load cart using factory because we don't want to do so until actually needed |
|
409 | + $this->cart = CartFactory::getCart(); |
|
410 | + // cycle thru the number of data rows sent from the event listing |
|
411 | + for ($x = 0; $x < $valid['rows']; $x++) { |
|
412 | + // does this row actually contain a ticket quantity? |
|
413 | + if (isset($valid['qty'][ $x ]) && $valid['qty'][ $x ] > 0) { |
|
414 | + // YES we have a ticket quantity |
|
415 | + $tickets_selected = true; |
|
416 | + $valid_ticket = false; |
|
417 | + // \EEH_Debug_Tools::printr( |
|
418 | + // $valid['ticket_id'][ $x ], |
|
419 | + // '$valid[\'ticket_id\'][ $x ]', |
|
420 | + // __FILE__, __LINE__ |
|
421 | + // ); |
|
422 | + if (isset($valid['ticket_id'][ $x ])) { |
|
423 | + // get ticket via the ticket id we put in the form |
|
424 | + $ticket = $this->ticket_model->get_one_by_ID($valid['ticket_id'][ $x ]); |
|
425 | + if ($ticket instanceof EE_Ticket) { |
|
426 | + $valid_ticket = true; |
|
427 | + $tickets_added += $this->addTicketToCart( |
|
428 | + $ticket, |
|
429 | + $valid['qty'][ $x ] |
|
430 | + ); |
|
431 | + } |
|
432 | + } |
|
433 | + if ($valid_ticket !== true) { |
|
434 | + // nothing added to cart retrieved |
|
435 | + EE_Error::add_error( |
|
436 | + sprintf( |
|
437 | + esc_html__( |
|
438 | + 'A valid ticket could not be retrieved for the event.%sPlease click the back button on your browser and try again.', |
|
439 | + 'event_espresso' |
|
440 | + ), |
|
441 | + '<br/>' |
|
442 | + ), |
|
443 | + __FILE__, |
|
444 | + __FUNCTION__, |
|
445 | + __LINE__ |
|
446 | + ); |
|
447 | + } |
|
448 | + if (EE_Error::has_error()) { |
|
449 | + break; |
|
450 | + } |
|
451 | + } |
|
452 | + } |
|
453 | + } |
|
454 | + do_action( |
|
455 | + 'AHEE__EE_Ticket_Selector__process_ticket_selections__after_tickets_added_to_cart', |
|
456 | + $this->cart, |
|
457 | + $this |
|
458 | + ); |
|
459 | + if (! apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', $tickets_selected)) { |
|
460 | + // no ticket quantities were selected |
|
461 | + EE_Error::add_error( |
|
462 | + esc_html__('You need to select a ticket quantity before you can proceed.', 'event_espresso'), |
|
463 | + __FILE__, |
|
464 | + __FUNCTION__, |
|
465 | + __LINE__ |
|
466 | + ); |
|
467 | + } |
|
468 | + return $tickets_added; |
|
469 | + } |
|
470 | 470 | |
471 | 471 | |
472 | - /** |
|
473 | - * adds a ticket to the cart |
|
474 | - * |
|
475 | - * @param EE_Ticket $ticket |
|
476 | - * @param int $qty |
|
477 | - * @return TRUE on success, FALSE on fail |
|
478 | - * @throws InvalidArgumentException |
|
479 | - * @throws InvalidInterfaceException |
|
480 | - * @throws InvalidDataTypeException |
|
481 | - * @throws EE_Error |
|
482 | - */ |
|
483 | - private function addTicketToCart(EE_Ticket $ticket, $qty = 1) |
|
484 | - { |
|
485 | - // get the number of spaces left for this datetime ticket |
|
486 | - $available_spaces = $this->tracker->ticketDatetimeAvailability($ticket); |
|
487 | - // compare available spaces against the number of tickets being purchased |
|
488 | - if ($available_spaces >= $qty) { |
|
489 | - // allow addons to prevent a ticket from being added to cart |
|
490 | - if (! apply_filters( |
|
491 | - 'FHEE__EE_Ticket_Selector___add_ticket_to_cart__allow_add_to_cart', |
|
492 | - true, |
|
493 | - $ticket, |
|
494 | - $qty, |
|
495 | - $available_spaces |
|
496 | - )) { |
|
497 | - return false; |
|
498 | - } |
|
499 | - $qty = absint(apply_filters('FHEE__EE_Ticket_Selector___add_ticket_to_cart__ticket_qty', $qty, $ticket)); |
|
500 | - // add event to cart |
|
501 | - if ($this->cart->add_ticket_to_cart($ticket, $qty)) { |
|
502 | - $this->tracker->recalculateTicketDatetimeAvailability($ticket, $qty); |
|
503 | - return true; |
|
504 | - } |
|
505 | - return false; |
|
506 | - } |
|
507 | - $this->tracker->processAvailabilityError($ticket, $qty, $this->cart->all_ticket_quantity_count()); |
|
508 | - return false; |
|
509 | - } |
|
472 | + /** |
|
473 | + * adds a ticket to the cart |
|
474 | + * |
|
475 | + * @param EE_Ticket $ticket |
|
476 | + * @param int $qty |
|
477 | + * @return TRUE on success, FALSE on fail |
|
478 | + * @throws InvalidArgumentException |
|
479 | + * @throws InvalidInterfaceException |
|
480 | + * @throws InvalidDataTypeException |
|
481 | + * @throws EE_Error |
|
482 | + */ |
|
483 | + private function addTicketToCart(EE_Ticket $ticket, $qty = 1) |
|
484 | + { |
|
485 | + // get the number of spaces left for this datetime ticket |
|
486 | + $available_spaces = $this->tracker->ticketDatetimeAvailability($ticket); |
|
487 | + // compare available spaces against the number of tickets being purchased |
|
488 | + if ($available_spaces >= $qty) { |
|
489 | + // allow addons to prevent a ticket from being added to cart |
|
490 | + if (! apply_filters( |
|
491 | + 'FHEE__EE_Ticket_Selector___add_ticket_to_cart__allow_add_to_cart', |
|
492 | + true, |
|
493 | + $ticket, |
|
494 | + $qty, |
|
495 | + $available_spaces |
|
496 | + )) { |
|
497 | + return false; |
|
498 | + } |
|
499 | + $qty = absint(apply_filters('FHEE__EE_Ticket_Selector___add_ticket_to_cart__ticket_qty', $qty, $ticket)); |
|
500 | + // add event to cart |
|
501 | + if ($this->cart->add_ticket_to_cart($ticket, $qty)) { |
|
502 | + $this->tracker->recalculateTicketDatetimeAvailability($ticket, $qty); |
|
503 | + return true; |
|
504 | + } |
|
505 | + return false; |
|
506 | + } |
|
507 | + $this->tracker->processAvailabilityError($ticket, $qty, $this->cart->all_ticket_quantity_count()); |
|
508 | + return false; |
|
509 | + } |
|
510 | 510 | |
511 | 511 | |
512 | - /** |
|
513 | - * @param $tickets_added |
|
514 | - * @return bool |
|
515 | - * @throws InvalidInterfaceException |
|
516 | - * @throws InvalidDataTypeException |
|
517 | - * @throws EE_Error |
|
518 | - * @throws InvalidArgumentException |
|
519 | - */ |
|
520 | - private function processSuccessfulCart($tickets_added) |
|
521 | - { |
|
522 | - // exit('KILL REDIRECT BEFORE CART UPDATE'); // <<<<<<<<<<<<<<<<< KILL REDIRECT HERE BEFORE CART UPDATE |
|
523 | - if (apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__success', $tickets_added)) { |
|
524 | - // make sure cart is loaded |
|
525 | - if (! $this->cart instanceof EE_Cart) { |
|
526 | - $this->cart = CartFactory::getCart(); |
|
527 | - } |
|
528 | - do_action( |
|
529 | - 'FHEE__EE_Ticket_Selector__process_ticket_selections__before_redirecting_to_checkout', |
|
530 | - $this->cart, |
|
531 | - $this |
|
532 | - ); |
|
533 | - $this->cart->recalculate_all_cart_totals(); |
|
534 | - $this->cart->save_cart(false); |
|
535 | - // exit('KILL REDIRECT AFTER CART UPDATE'); // <<<<<<<< OR HERE TO KILL REDIRECT AFTER CART UPDATE |
|
536 | - // just return TRUE for registrations being made from admin |
|
537 | - if ($this->request->isAdmin() || $this->request->isFrontAjax()) { |
|
538 | - return true; |
|
539 | - } |
|
540 | - EEH_URL::safeRedirectAndExit( |
|
541 | - apply_filters( |
|
542 | - 'FHEE__EE_Ticket_Selector__process_ticket_selections__success_redirect_url', |
|
543 | - $this->core_config->reg_page_url() |
|
544 | - ) |
|
545 | - ); |
|
546 | - } |
|
547 | - if (! EE_Error::has_error() && ! EE_Error::has_error(true, 'attention')) { |
|
548 | - // nothing added to cart |
|
549 | - EE_Error::add_attention( |
|
550 | - esc_html__('No tickets were added for the event', 'event_espresso'), |
|
551 | - __FILE__, |
|
552 | - __FUNCTION__, |
|
553 | - __LINE__ |
|
554 | - ); |
|
555 | - } |
|
556 | - return false; |
|
557 | - } |
|
512 | + /** |
|
513 | + * @param $tickets_added |
|
514 | + * @return bool |
|
515 | + * @throws InvalidInterfaceException |
|
516 | + * @throws InvalidDataTypeException |
|
517 | + * @throws EE_Error |
|
518 | + * @throws InvalidArgumentException |
|
519 | + */ |
|
520 | + private function processSuccessfulCart($tickets_added) |
|
521 | + { |
|
522 | + // exit('KILL REDIRECT BEFORE CART UPDATE'); // <<<<<<<<<<<<<<<<< KILL REDIRECT HERE BEFORE CART UPDATE |
|
523 | + if (apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__success', $tickets_added)) { |
|
524 | + // make sure cart is loaded |
|
525 | + if (! $this->cart instanceof EE_Cart) { |
|
526 | + $this->cart = CartFactory::getCart(); |
|
527 | + } |
|
528 | + do_action( |
|
529 | + 'FHEE__EE_Ticket_Selector__process_ticket_selections__before_redirecting_to_checkout', |
|
530 | + $this->cart, |
|
531 | + $this |
|
532 | + ); |
|
533 | + $this->cart->recalculate_all_cart_totals(); |
|
534 | + $this->cart->save_cart(false); |
|
535 | + // exit('KILL REDIRECT AFTER CART UPDATE'); // <<<<<<<< OR HERE TO KILL REDIRECT AFTER CART UPDATE |
|
536 | + // just return TRUE for registrations being made from admin |
|
537 | + if ($this->request->isAdmin() || $this->request->isFrontAjax()) { |
|
538 | + return true; |
|
539 | + } |
|
540 | + EEH_URL::safeRedirectAndExit( |
|
541 | + apply_filters( |
|
542 | + 'FHEE__EE_Ticket_Selector__process_ticket_selections__success_redirect_url', |
|
543 | + $this->core_config->reg_page_url() |
|
544 | + ) |
|
545 | + ); |
|
546 | + } |
|
547 | + if (! EE_Error::has_error() && ! EE_Error::has_error(true, 'attention')) { |
|
548 | + // nothing added to cart |
|
549 | + EE_Error::add_attention( |
|
550 | + esc_html__('No tickets were added for the event', 'event_espresso'), |
|
551 | + __FILE__, |
|
552 | + __FUNCTION__, |
|
553 | + __LINE__ |
|
554 | + ); |
|
555 | + } |
|
556 | + return false; |
|
557 | + } |
|
558 | 558 | } |
@@ -118,7 +118,7 @@ discard block |
||
118 | 118 | public function cancelTicketSelections() |
119 | 119 | { |
120 | 120 | // check nonce |
121 | - if (! $this->processTicketSelectorNonce('cancel_ticket_selections')) { |
|
121 | + if ( ! $this->processTicketSelectorNonce('cancel_ticket_selections')) { |
|
122 | 122 | return false; |
123 | 123 | } |
124 | 124 | $this->session->clear_session(__CLASS__, __FUNCTION__); |
@@ -130,7 +130,7 @@ discard block |
||
130 | 130 | ); |
131 | 131 | } |
132 | 132 | EEH_URL::safeRedirectAndExit( |
133 | - site_url('/' . $this->core_config->event_cpt_slug . '/') |
|
133 | + site_url('/'.$this->core_config->event_cpt_slug.'/') |
|
134 | 134 | ); |
135 | 135 | return true; |
136 | 136 | } |
@@ -146,7 +146,7 @@ discard block |
||
146 | 146 | private function processTicketSelectorNonce($nonce_name, $id = '') |
147 | 147 | { |
148 | 148 | $nonce_name_with_id = ! empty($id) ? "{$nonce_name}_nonce_{$id}" : "{$nonce_name}_nonce"; |
149 | - if (! $this->request->isAdmin() |
|
149 | + if ( ! $this->request->isAdmin() |
|
150 | 150 | && ( |
151 | 151 | ! $this->request->is_set($nonce_name_with_id) |
152 | 152 | || ! wp_verify_nonce( |
@@ -236,7 +236,7 @@ discard block |
||
236 | 236 | private function getEventId() |
237 | 237 | { |
238 | 238 | // do we have an event id? |
239 | - if (! $this->request->requestParamIsSet('tkt-slctr-event-id')) { |
|
239 | + if ( ! $this->request->requestParamIsSet('tkt-slctr-event-id')) { |
|
240 | 240 | // $_POST['tkt-slctr-event-id'] was not set ?!?!?!? |
241 | 241 | EE_Error::add_error( |
242 | 242 | sprintf( |
@@ -264,7 +264,7 @@ discard block |
||
264 | 264 | */ |
265 | 265 | private function validatePostData($id = 0) |
266 | 266 | { |
267 | - if (! $id) { |
|
267 | + if ( ! $id) { |
|
268 | 268 | EE_Error::add_error( |
269 | 269 | esc_html__('The event id provided was not valid.', 'event_espresso'), |
270 | 270 | __FILE__, |
@@ -291,29 +291,29 @@ discard block |
||
291 | 291 | // cycle through $inputs_to_clean array |
292 | 292 | foreach ($inputs_to_clean as $what => $input_to_clean) { |
293 | 293 | // check for POST data |
294 | - if ($this->request->requestParamIsSet($input_to_clean . $id)) { |
|
294 | + if ($this->request->requestParamIsSet($input_to_clean.$id)) { |
|
295 | 295 | // grab value |
296 | - $input_value = $this->request->getRequestParam($input_to_clean . $id); |
|
296 | + $input_value = $this->request->getRequestParam($input_to_clean.$id); |
|
297 | 297 | switch ($what) { |
298 | 298 | // integers |
299 | 299 | case 'event_id': |
300 | - $valid_data[ $what ] = absint($input_value); |
|
300 | + $valid_data[$what] = absint($input_value); |
|
301 | 301 | // get event via the event id we put in the form |
302 | 302 | break; |
303 | 303 | case 'rows': |
304 | 304 | case 'max_atndz': |
305 | - $valid_data[ $what ] = absint($input_value); |
|
305 | + $valid_data[$what] = absint($input_value); |
|
306 | 306 | break; |
307 | 307 | // arrays of integers |
308 | 308 | case 'qty': |
309 | 309 | /** @var array $row_qty */ |
310 | 310 | $row_qty = $input_value; |
311 | 311 | // if qty is coming from a radio button input, then we need to assemble an array of rows |
312 | - if (! is_array($row_qty)) { |
|
312 | + if ( ! is_array($row_qty)) { |
|
313 | 313 | /** @var string $row_qty */ |
314 | 314 | // get number of rows |
315 | - $rows = $this->request->requestParamIsSet('tkt-slctr-rows-' . $id) |
|
316 | - ? absint($this->request->getRequestParam('tkt-slctr-rows-' . $id)) |
|
315 | + $rows = $this->request->requestParamIsSet('tkt-slctr-rows-'.$id) |
|
316 | + ? absint($this->request->getRequestParam('tkt-slctr-rows-'.$id)) |
|
317 | 317 | : 1; |
318 | 318 | // explode integers by the dash |
319 | 319 | $row_qty = explode('-', $row_qty); |
@@ -321,8 +321,8 @@ discard block |
||
321 | 321 | $qty = isset($row_qty[1]) ? absint($row_qty[1]) : 0; |
322 | 322 | $row_qty = array($row => $qty); |
323 | 323 | for ($x = 1; $x <= $rows; $x++) { |
324 | - if (! isset($row_qty[ $x ])) { |
|
325 | - $row_qty[ $x ] = 0; |
|
324 | + if ( ! isset($row_qty[$x])) { |
|
325 | + $row_qty[$x] = 0; |
|
326 | 326 | } |
327 | 327 | } |
328 | 328 | } |
@@ -331,7 +331,7 @@ discard block |
||
331 | 331 | foreach ($row_qty as $qty) { |
332 | 332 | $qty = absint($qty); |
333 | 333 | // sanitize as integers |
334 | - $valid_data[ $what ][] = $qty; |
|
334 | + $valid_data[$what][] = $qty; |
|
335 | 335 | $valid_data['total_tickets'] += $qty; |
336 | 336 | } |
337 | 337 | break; |
@@ -340,7 +340,7 @@ discard block |
||
340 | 340 | // cycle thru values |
341 | 341 | foreach ((array) $input_value as $key => $value) { |
342 | 342 | // allow only integers |
343 | - $valid_data[ $what ][ $key ] = absint($value); |
|
343 | + $valid_data[$what][$key] = absint($value); |
|
344 | 344 | } |
345 | 345 | break; |
346 | 346 | case 'return_url': |
@@ -352,9 +352,9 @@ discard block |
||
352 | 352 | $input_value = explode('#', $input_value); |
353 | 353 | $input_value = end($input_value); |
354 | 354 | // use event list url instead, but append anchor |
355 | - $input_value = EEH_Event_View::event_archive_url() . '#' . $input_value; |
|
355 | + $input_value = EEH_Event_View::event_archive_url().'#'.$input_value; |
|
356 | 356 | } |
357 | - $valid_data[ $what ] = $input_value; |
|
357 | + $valid_data[$what] = $input_value; |
|
358 | 358 | break; |
359 | 359 | } // end switch $what |
360 | 360 | } |
@@ -388,7 +388,7 @@ discard block |
||
388 | 388 | ) |
389 | 389 | ); |
390 | 390 | $limit_error_2 = sprintf($max_attendees_string, $valid['max_atndz'], $valid['max_atndz']); |
391 | - EE_Error::add_error($limit_error_1 . '<br/>' . $limit_error_2, __FILE__, __FUNCTION__, __LINE__); |
|
391 | + EE_Error::add_error($limit_error_1.'<br/>'.$limit_error_2, __FILE__, __FUNCTION__, __LINE__); |
|
392 | 392 | } |
393 | 393 | |
394 | 394 | |
@@ -410,7 +410,7 @@ discard block |
||
410 | 410 | // cycle thru the number of data rows sent from the event listing |
411 | 411 | for ($x = 0; $x < $valid['rows']; $x++) { |
412 | 412 | // does this row actually contain a ticket quantity? |
413 | - if (isset($valid['qty'][ $x ]) && $valid['qty'][ $x ] > 0) { |
|
413 | + if (isset($valid['qty'][$x]) && $valid['qty'][$x] > 0) { |
|
414 | 414 | // YES we have a ticket quantity |
415 | 415 | $tickets_selected = true; |
416 | 416 | $valid_ticket = false; |
@@ -419,14 +419,14 @@ discard block |
||
419 | 419 | // '$valid[\'ticket_id\'][ $x ]', |
420 | 420 | // __FILE__, __LINE__ |
421 | 421 | // ); |
422 | - if (isset($valid['ticket_id'][ $x ])) { |
|
422 | + if (isset($valid['ticket_id'][$x])) { |
|
423 | 423 | // get ticket via the ticket id we put in the form |
424 | - $ticket = $this->ticket_model->get_one_by_ID($valid['ticket_id'][ $x ]); |
|
424 | + $ticket = $this->ticket_model->get_one_by_ID($valid['ticket_id'][$x]); |
|
425 | 425 | if ($ticket instanceof EE_Ticket) { |
426 | 426 | $valid_ticket = true; |
427 | 427 | $tickets_added += $this->addTicketToCart( |
428 | 428 | $ticket, |
429 | - $valid['qty'][ $x ] |
|
429 | + $valid['qty'][$x] |
|
430 | 430 | ); |
431 | 431 | } |
432 | 432 | } |
@@ -456,7 +456,7 @@ discard block |
||
456 | 456 | $this->cart, |
457 | 457 | $this |
458 | 458 | ); |
459 | - if (! apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', $tickets_selected)) { |
|
459 | + if ( ! apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__tckts_slctd', $tickets_selected)) { |
|
460 | 460 | // no ticket quantities were selected |
461 | 461 | EE_Error::add_error( |
462 | 462 | esc_html__('You need to select a ticket quantity before you can proceed.', 'event_espresso'), |
@@ -487,7 +487,7 @@ discard block |
||
487 | 487 | // compare available spaces against the number of tickets being purchased |
488 | 488 | if ($available_spaces >= $qty) { |
489 | 489 | // allow addons to prevent a ticket from being added to cart |
490 | - if (! apply_filters( |
|
490 | + if ( ! apply_filters( |
|
491 | 491 | 'FHEE__EE_Ticket_Selector___add_ticket_to_cart__allow_add_to_cart', |
492 | 492 | true, |
493 | 493 | $ticket, |
@@ -522,7 +522,7 @@ discard block |
||
522 | 522 | // exit('KILL REDIRECT BEFORE CART UPDATE'); // <<<<<<<<<<<<<<<<< KILL REDIRECT HERE BEFORE CART UPDATE |
523 | 523 | if (apply_filters('FHEE__EED_Ticket_Selector__process_ticket_selections__success', $tickets_added)) { |
524 | 524 | // make sure cart is loaded |
525 | - if (! $this->cart instanceof EE_Cart) { |
|
525 | + if ( ! $this->cart instanceof EE_Cart) { |
|
526 | 526 | $this->cart = CartFactory::getCart(); |
527 | 527 | } |
528 | 528 | do_action( |
@@ -544,7 +544,7 @@ discard block |
||
544 | 544 | ) |
545 | 545 | ); |
546 | 546 | } |
547 | - if (! EE_Error::has_error() && ! EE_Error::has_error(true, 'attention')) { |
|
547 | + if ( ! EE_Error::has_error() && ! EE_Error::has_error(true, 'attention')) { |
|
548 | 548 | // nothing added to cart |
549 | 549 | EE_Error::add_attention( |
550 | 550 | esc_html__('No tickets were added for the event', 'event_espresso'), |
@@ -12,171 +12,171 @@ |
||
12 | 12 | class DatetimeSelector |
13 | 13 | { |
14 | 14 | |
15 | - /** |
|
16 | - * @var \EE_Event $event |
|
17 | - */ |
|
18 | - protected $event; |
|
19 | - |
|
20 | - /** |
|
21 | - * @var \EE_Ticket[] $tickets |
|
22 | - */ |
|
23 | - protected $tickets; |
|
24 | - |
|
25 | - /** |
|
26 | - * @var \EE_Datetime[] $datetimes |
|
27 | - */ |
|
28 | - protected $datetimes; |
|
29 | - |
|
30 | - /** |
|
31 | - * @var \EE_Datetime[] $unique_dates |
|
32 | - */ |
|
33 | - protected $unique_dates; |
|
34 | - |
|
35 | - /** |
|
36 | - * @var \EE_Ticket_Selector_Config $template_settings |
|
37 | - */ |
|
38 | - protected $template_settings; |
|
39 | - |
|
40 | - /** |
|
41 | - * @var boolean $active |
|
42 | - */ |
|
43 | - protected $active = false; |
|
44 | - |
|
45 | - |
|
46 | - /** |
|
47 | - * DatetimeSelector constructor. |
|
48 | - * |
|
49 | - * @param \EE_Event $event |
|
50 | - * @param \EE_Ticket[] $tickets |
|
51 | - * @param \EE_Ticket_Selector_Config $template_settings |
|
52 | - * @param string $date_format |
|
53 | - * @param string $time_format |
|
54 | - * @throws \EE_Error |
|
55 | - */ |
|
56 | - public function __construct( |
|
57 | - \EE_Event $event, |
|
58 | - array $tickets, |
|
59 | - \EE_Ticket_Selector_Config $template_settings, |
|
60 | - $date_format = 'Y-m-d', |
|
61 | - $time_format = 'g:i a' |
|
62 | - ) { |
|
63 | - $this->event = $event; |
|
64 | - $this->tickets = $tickets; |
|
65 | - $this->template_settings = $template_settings; |
|
66 | - $this->datetimes = $this->getAllDatetimesForAllTicket($tickets); |
|
67 | - $this->unique_dates = $this->getUniqueDatetimeOptions($date_format, $time_format); |
|
68 | - $this->active = $this->template_settings->showDatetimeSelector($this->unique_dates); |
|
69 | - } |
|
70 | - |
|
71 | - |
|
72 | - /** |
|
73 | - * @param \EE_Ticket[] $tickets |
|
74 | - * @return array |
|
75 | - * @throws \EE_Error |
|
76 | - */ |
|
77 | - protected function getAllDatetimesForAllTicket($tickets = array()) |
|
78 | - { |
|
79 | - $datetimes = array(); |
|
80 | - foreach ($tickets as $ticket) { |
|
81 | - $datetimes = $this->getTicketDatetimes($ticket, $datetimes); |
|
82 | - } |
|
83 | - return $datetimes; |
|
84 | - } |
|
85 | - |
|
86 | - |
|
87 | - /** |
|
88 | - * @param \EE_Ticket $ticket |
|
89 | - * @param \EE_Datetime[] $datetimes |
|
90 | - * @return \EE_Datetime[] |
|
91 | - * @throws \EE_Error |
|
92 | - */ |
|
93 | - protected function getTicketDatetimes(\EE_Ticket $ticket, $datetimes = array()) |
|
94 | - { |
|
95 | - $ticket_datetimes = $ticket->datetimes( |
|
96 | - array( |
|
97 | - 'order_by' => array( |
|
98 | - 'DTT_order' => 'ASC', |
|
99 | - 'DTT_EVT_start' => 'ASC', |
|
100 | - ), |
|
101 | - 'default_where_conditions' => 'none', |
|
102 | - ) |
|
103 | - ); |
|
104 | - foreach ($ticket_datetimes as $ticket_datetime) { |
|
105 | - if (! $ticket_datetime instanceof \EE_Datetime) { |
|
106 | - continue; |
|
107 | - } |
|
108 | - $datetimes[ $ticket_datetime->ID() ] = $ticket_datetime; |
|
109 | - } |
|
110 | - return $datetimes; |
|
111 | - } |
|
112 | - |
|
113 | - |
|
114 | - /** |
|
115 | - * @param \EE_Ticket $ticket |
|
116 | - * @return string |
|
117 | - * @throws \EE_Error |
|
118 | - */ |
|
119 | - public function getTicketDatetimeClasses(\EE_Ticket $ticket) |
|
120 | - { |
|
121 | - if (! $this->active) { |
|
122 | - return ''; |
|
123 | - } |
|
124 | - $ticket_datetimes = $this->getTicketDatetimes($ticket); |
|
125 | - $classes = ''; |
|
126 | - foreach ($this->datetimes as $datetime) { |
|
127 | - if (! $datetime instanceof \EE_Datetime || ! in_array($datetime, $ticket_datetimes, true)) { |
|
128 | - continue; |
|
129 | - } |
|
130 | - $classes .= ' ee-ticket-datetimes-' . $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_'); |
|
131 | - } |
|
132 | - return $classes; |
|
133 | - } |
|
134 | - |
|
135 | - |
|
136 | - /** |
|
137 | - * @param string $date_format |
|
138 | - * @param string $time_format |
|
139 | - * @return array |
|
140 | - * @throws \EE_Error |
|
141 | - */ |
|
142 | - public function getUniqueDatetimeOptions($date_format = 'Y-m-d', $time_format = 'g:i a') |
|
143 | - { |
|
144 | - $datetime_options = array(); |
|
145 | - foreach ($this->datetimes as $datetime) { |
|
146 | - if (! $datetime instanceof \EE_Datetime) { |
|
147 | - continue; |
|
148 | - } |
|
149 | - $datetime_options[ $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_') ] = |
|
150 | - $datetime->date_and_time_range($date_format, $time_format, ' - '); |
|
151 | - } |
|
152 | - return $datetime_options; |
|
153 | - } |
|
154 | - |
|
155 | - |
|
156 | - /** |
|
157 | - * @return string |
|
158 | - * @throws \EE_Error |
|
159 | - */ |
|
160 | - public function getDatetimeSelector() |
|
161 | - { |
|
162 | - if (! $this->active) { |
|
163 | - return ''; |
|
164 | - } |
|
165 | - $dropdown_selector = new \EE_Checkbox_Dropdown_Selector_Input( |
|
166 | - $this->unique_dates, |
|
167 | - array( |
|
168 | - 'html_id' => 'datetime-selector-' . $this->event->ID(), |
|
169 | - 'html_name' => 'datetime_selector_' . $this->event->ID(), |
|
170 | - 'html_class' => 'datetime-selector', |
|
171 | - 'select_button_text' => '<span class="dashicons dashicons-calendar-alt"></span> ' |
|
172 | - . esc_html__('Filter by Date', 'event_espresso'), |
|
173 | - 'other_html_attributes' => ' data-tkt_slctr_evt="' . $this->event->ID() . '"', |
|
174 | - ) |
|
175 | - ); |
|
176 | - return \EEH_HTML::div( |
|
177 | - $dropdown_selector->get_html_for_input(), |
|
178 | - '', |
|
179 | - 'datetime_selector-dv' |
|
180 | - ); |
|
181 | - } |
|
15 | + /** |
|
16 | + * @var \EE_Event $event |
|
17 | + */ |
|
18 | + protected $event; |
|
19 | + |
|
20 | + /** |
|
21 | + * @var \EE_Ticket[] $tickets |
|
22 | + */ |
|
23 | + protected $tickets; |
|
24 | + |
|
25 | + /** |
|
26 | + * @var \EE_Datetime[] $datetimes |
|
27 | + */ |
|
28 | + protected $datetimes; |
|
29 | + |
|
30 | + /** |
|
31 | + * @var \EE_Datetime[] $unique_dates |
|
32 | + */ |
|
33 | + protected $unique_dates; |
|
34 | + |
|
35 | + /** |
|
36 | + * @var \EE_Ticket_Selector_Config $template_settings |
|
37 | + */ |
|
38 | + protected $template_settings; |
|
39 | + |
|
40 | + /** |
|
41 | + * @var boolean $active |
|
42 | + */ |
|
43 | + protected $active = false; |
|
44 | + |
|
45 | + |
|
46 | + /** |
|
47 | + * DatetimeSelector constructor. |
|
48 | + * |
|
49 | + * @param \EE_Event $event |
|
50 | + * @param \EE_Ticket[] $tickets |
|
51 | + * @param \EE_Ticket_Selector_Config $template_settings |
|
52 | + * @param string $date_format |
|
53 | + * @param string $time_format |
|
54 | + * @throws \EE_Error |
|
55 | + */ |
|
56 | + public function __construct( |
|
57 | + \EE_Event $event, |
|
58 | + array $tickets, |
|
59 | + \EE_Ticket_Selector_Config $template_settings, |
|
60 | + $date_format = 'Y-m-d', |
|
61 | + $time_format = 'g:i a' |
|
62 | + ) { |
|
63 | + $this->event = $event; |
|
64 | + $this->tickets = $tickets; |
|
65 | + $this->template_settings = $template_settings; |
|
66 | + $this->datetimes = $this->getAllDatetimesForAllTicket($tickets); |
|
67 | + $this->unique_dates = $this->getUniqueDatetimeOptions($date_format, $time_format); |
|
68 | + $this->active = $this->template_settings->showDatetimeSelector($this->unique_dates); |
|
69 | + } |
|
70 | + |
|
71 | + |
|
72 | + /** |
|
73 | + * @param \EE_Ticket[] $tickets |
|
74 | + * @return array |
|
75 | + * @throws \EE_Error |
|
76 | + */ |
|
77 | + protected function getAllDatetimesForAllTicket($tickets = array()) |
|
78 | + { |
|
79 | + $datetimes = array(); |
|
80 | + foreach ($tickets as $ticket) { |
|
81 | + $datetimes = $this->getTicketDatetimes($ticket, $datetimes); |
|
82 | + } |
|
83 | + return $datetimes; |
|
84 | + } |
|
85 | + |
|
86 | + |
|
87 | + /** |
|
88 | + * @param \EE_Ticket $ticket |
|
89 | + * @param \EE_Datetime[] $datetimes |
|
90 | + * @return \EE_Datetime[] |
|
91 | + * @throws \EE_Error |
|
92 | + */ |
|
93 | + protected function getTicketDatetimes(\EE_Ticket $ticket, $datetimes = array()) |
|
94 | + { |
|
95 | + $ticket_datetimes = $ticket->datetimes( |
|
96 | + array( |
|
97 | + 'order_by' => array( |
|
98 | + 'DTT_order' => 'ASC', |
|
99 | + 'DTT_EVT_start' => 'ASC', |
|
100 | + ), |
|
101 | + 'default_where_conditions' => 'none', |
|
102 | + ) |
|
103 | + ); |
|
104 | + foreach ($ticket_datetimes as $ticket_datetime) { |
|
105 | + if (! $ticket_datetime instanceof \EE_Datetime) { |
|
106 | + continue; |
|
107 | + } |
|
108 | + $datetimes[ $ticket_datetime->ID() ] = $ticket_datetime; |
|
109 | + } |
|
110 | + return $datetimes; |
|
111 | + } |
|
112 | + |
|
113 | + |
|
114 | + /** |
|
115 | + * @param \EE_Ticket $ticket |
|
116 | + * @return string |
|
117 | + * @throws \EE_Error |
|
118 | + */ |
|
119 | + public function getTicketDatetimeClasses(\EE_Ticket $ticket) |
|
120 | + { |
|
121 | + if (! $this->active) { |
|
122 | + return ''; |
|
123 | + } |
|
124 | + $ticket_datetimes = $this->getTicketDatetimes($ticket); |
|
125 | + $classes = ''; |
|
126 | + foreach ($this->datetimes as $datetime) { |
|
127 | + if (! $datetime instanceof \EE_Datetime || ! in_array($datetime, $ticket_datetimes, true)) { |
|
128 | + continue; |
|
129 | + } |
|
130 | + $classes .= ' ee-ticket-datetimes-' . $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_'); |
|
131 | + } |
|
132 | + return $classes; |
|
133 | + } |
|
134 | + |
|
135 | + |
|
136 | + /** |
|
137 | + * @param string $date_format |
|
138 | + * @param string $time_format |
|
139 | + * @return array |
|
140 | + * @throws \EE_Error |
|
141 | + */ |
|
142 | + public function getUniqueDatetimeOptions($date_format = 'Y-m-d', $time_format = 'g:i a') |
|
143 | + { |
|
144 | + $datetime_options = array(); |
|
145 | + foreach ($this->datetimes as $datetime) { |
|
146 | + if (! $datetime instanceof \EE_Datetime) { |
|
147 | + continue; |
|
148 | + } |
|
149 | + $datetime_options[ $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_') ] = |
|
150 | + $datetime->date_and_time_range($date_format, $time_format, ' - '); |
|
151 | + } |
|
152 | + return $datetime_options; |
|
153 | + } |
|
154 | + |
|
155 | + |
|
156 | + /** |
|
157 | + * @return string |
|
158 | + * @throws \EE_Error |
|
159 | + */ |
|
160 | + public function getDatetimeSelector() |
|
161 | + { |
|
162 | + if (! $this->active) { |
|
163 | + return ''; |
|
164 | + } |
|
165 | + $dropdown_selector = new \EE_Checkbox_Dropdown_Selector_Input( |
|
166 | + $this->unique_dates, |
|
167 | + array( |
|
168 | + 'html_id' => 'datetime-selector-' . $this->event->ID(), |
|
169 | + 'html_name' => 'datetime_selector_' . $this->event->ID(), |
|
170 | + 'html_class' => 'datetime-selector', |
|
171 | + 'select_button_text' => '<span class="dashicons dashicons-calendar-alt"></span> ' |
|
172 | + . esc_html__('Filter by Date', 'event_espresso'), |
|
173 | + 'other_html_attributes' => ' data-tkt_slctr_evt="' . $this->event->ID() . '"', |
|
174 | + ) |
|
175 | + ); |
|
176 | + return \EEH_HTML::div( |
|
177 | + $dropdown_selector->get_html_for_input(), |
|
178 | + '', |
|
179 | + 'datetime_selector-dv' |
|
180 | + ); |
|
181 | + } |
|
182 | 182 | } |
@@ -102,10 +102,10 @@ discard block |
||
102 | 102 | ) |
103 | 103 | ); |
104 | 104 | foreach ($ticket_datetimes as $ticket_datetime) { |
105 | - if (! $ticket_datetime instanceof \EE_Datetime) { |
|
105 | + if ( ! $ticket_datetime instanceof \EE_Datetime) { |
|
106 | 106 | continue; |
107 | 107 | } |
108 | - $datetimes[ $ticket_datetime->ID() ] = $ticket_datetime; |
|
108 | + $datetimes[$ticket_datetime->ID()] = $ticket_datetime; |
|
109 | 109 | } |
110 | 110 | return $datetimes; |
111 | 111 | } |
@@ -118,16 +118,16 @@ discard block |
||
118 | 118 | */ |
119 | 119 | public function getTicketDatetimeClasses(\EE_Ticket $ticket) |
120 | 120 | { |
121 | - if (! $this->active) { |
|
121 | + if ( ! $this->active) { |
|
122 | 122 | return ''; |
123 | 123 | } |
124 | 124 | $ticket_datetimes = $this->getTicketDatetimes($ticket); |
125 | 125 | $classes = ''; |
126 | 126 | foreach ($this->datetimes as $datetime) { |
127 | - if (! $datetime instanceof \EE_Datetime || ! in_array($datetime, $ticket_datetimes, true)) { |
|
127 | + if ( ! $datetime instanceof \EE_Datetime || ! in_array($datetime, $ticket_datetimes, true)) { |
|
128 | 128 | continue; |
129 | 129 | } |
130 | - $classes .= ' ee-ticket-datetimes-' . $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_'); |
|
130 | + $classes .= ' ee-ticket-datetimes-'.$datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_'); |
|
131 | 131 | } |
132 | 132 | return $classes; |
133 | 133 | } |
@@ -143,10 +143,10 @@ discard block |
||
143 | 143 | { |
144 | 144 | $datetime_options = array(); |
145 | 145 | foreach ($this->datetimes as $datetime) { |
146 | - if (! $datetime instanceof \EE_Datetime) { |
|
146 | + if ( ! $datetime instanceof \EE_Datetime) { |
|
147 | 147 | continue; |
148 | 148 | } |
149 | - $datetime_options[ $datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_') ] = |
|
149 | + $datetime_options[$datetime->date_and_time_range('Y_m_d', 'H_i', '-', '_')] = |
|
150 | 150 | $datetime->date_and_time_range($date_format, $time_format, ' - '); |
151 | 151 | } |
152 | 152 | return $datetime_options; |
@@ -159,18 +159,18 @@ discard block |
||
159 | 159 | */ |
160 | 160 | public function getDatetimeSelector() |
161 | 161 | { |
162 | - if (! $this->active) { |
|
162 | + if ( ! $this->active) { |
|
163 | 163 | return ''; |
164 | 164 | } |
165 | 165 | $dropdown_selector = new \EE_Checkbox_Dropdown_Selector_Input( |
166 | 166 | $this->unique_dates, |
167 | 167 | array( |
168 | - 'html_id' => 'datetime-selector-' . $this->event->ID(), |
|
169 | - 'html_name' => 'datetime_selector_' . $this->event->ID(), |
|
168 | + 'html_id' => 'datetime-selector-'.$this->event->ID(), |
|
169 | + 'html_name' => 'datetime_selector_'.$this->event->ID(), |
|
170 | 170 | 'html_class' => 'datetime-selector', |
171 | 171 | 'select_button_text' => '<span class="dashicons dashicons-calendar-alt"></span> ' |
172 | 172 | . esc_html__('Filter by Date', 'event_espresso'), |
173 | - 'other_html_attributes' => ' data-tkt_slctr_evt="' . $this->event->ID() . '"', |
|
173 | + 'other_html_attributes' => ' data-tkt_slctr_evt="'.$this->event->ID().'"', |
|
174 | 174 | ) |
175 | 175 | ); |
176 | 176 | return \EEH_HTML::div( |
@@ -28,74 +28,74 @@ |
||
28 | 28 | */ |
29 | 29 | class Response |
30 | 30 | { |
31 | - /** |
|
32 | - * Succes or failure. |
|
33 | - * |
|
34 | - * @var boolean |
|
35 | - */ |
|
36 | - private $success = false; |
|
31 | + /** |
|
32 | + * Succes or failure. |
|
33 | + * |
|
34 | + * @var boolean |
|
35 | + */ |
|
36 | + private $success = false; |
|
37 | 37 | |
38 | - /** |
|
39 | - * Error code strings. |
|
40 | - * |
|
41 | - * @var array |
|
42 | - */ |
|
43 | - private $errorCodes = array(); |
|
38 | + /** |
|
39 | + * Error code strings. |
|
40 | + * |
|
41 | + * @var array |
|
42 | + */ |
|
43 | + private $errorCodes = array(); |
|
44 | 44 | |
45 | - /** |
|
46 | - * Build the response from the expected JSON returned by the service. |
|
47 | - * |
|
48 | - * @param string $json |
|
49 | - * @return \ReCaptcha\Response |
|
50 | - */ |
|
51 | - public static function fromJson($json) |
|
52 | - { |
|
53 | - $responseData = json_decode($json, true); |
|
45 | + /** |
|
46 | + * Build the response from the expected JSON returned by the service. |
|
47 | + * |
|
48 | + * @param string $json |
|
49 | + * @return \ReCaptcha\Response |
|
50 | + */ |
|
51 | + public static function fromJson($json) |
|
52 | + { |
|
53 | + $responseData = json_decode($json, true); |
|
54 | 54 | |
55 | - if (! $responseData) { |
|
56 | - return new Response(false, array('invalid-json')); |
|
57 | - } |
|
55 | + if (! $responseData) { |
|
56 | + return new Response(false, array('invalid-json')); |
|
57 | + } |
|
58 | 58 | |
59 | - if (isset($responseData['success']) && $responseData['success'] == true) { |
|
60 | - return new Response(true); |
|
61 | - } |
|
59 | + if (isset($responseData['success']) && $responseData['success'] == true) { |
|
60 | + return new Response(true); |
|
61 | + } |
|
62 | 62 | |
63 | - if (isset($responseData['error-codes']) && is_array($responseData['error-codes'])) { |
|
64 | - return new Response(false, $responseData['error-codes']); |
|
65 | - } |
|
63 | + if (isset($responseData['error-codes']) && is_array($responseData['error-codes'])) { |
|
64 | + return new Response(false, $responseData['error-codes']); |
|
65 | + } |
|
66 | 66 | |
67 | - return new Response(false); |
|
68 | - } |
|
67 | + return new Response(false); |
|
68 | + } |
|
69 | 69 | |
70 | - /** |
|
71 | - * Constructor. |
|
72 | - * |
|
73 | - * @param boolean $success |
|
74 | - * @param array $errorCodes |
|
75 | - */ |
|
76 | - public function __construct($success, array $errorCodes = array()) |
|
77 | - { |
|
78 | - $this->success = $success; |
|
79 | - $this->errorCodes = $errorCodes; |
|
80 | - } |
|
70 | + /** |
|
71 | + * Constructor. |
|
72 | + * |
|
73 | + * @param boolean $success |
|
74 | + * @param array $errorCodes |
|
75 | + */ |
|
76 | + public function __construct($success, array $errorCodes = array()) |
|
77 | + { |
|
78 | + $this->success = $success; |
|
79 | + $this->errorCodes = $errorCodes; |
|
80 | + } |
|
81 | 81 | |
82 | - /** |
|
83 | - * Is success? |
|
84 | - * |
|
85 | - * @return boolean |
|
86 | - */ |
|
87 | - public function isSuccess() |
|
88 | - { |
|
89 | - return $this->success; |
|
90 | - } |
|
82 | + /** |
|
83 | + * Is success? |
|
84 | + * |
|
85 | + * @return boolean |
|
86 | + */ |
|
87 | + public function isSuccess() |
|
88 | + { |
|
89 | + return $this->success; |
|
90 | + } |
|
91 | 91 | |
92 | - /** |
|
93 | - * Get error codes. |
|
94 | - * |
|
95 | - * @return array |
|
96 | - */ |
|
97 | - public function getErrorCodes() |
|
98 | - { |
|
99 | - return $this->errorCodes; |
|
100 | - } |
|
92 | + /** |
|
93 | + * Get error codes. |
|
94 | + * |
|
95 | + * @return array |
|
96 | + */ |
|
97 | + public function getErrorCodes() |
|
98 | + { |
|
99 | + return $this->errorCodes; |
|
100 | + } |
|
101 | 101 | } |
@@ -52,7 +52,7 @@ |
||
52 | 52 | { |
53 | 53 | $responseData = json_decode($json, true); |
54 | 54 | |
55 | - if (! $responseData) { |
|
55 | + if ( ! $responseData) { |
|
56 | 56 | return new Response(false, array('invalid-json')); |
57 | 57 | } |
58 | 58 |
@@ -19,52 +19,52 @@ discard block |
||
19 | 19 | { |
20 | 20 | |
21 | 21 | |
22 | - /** |
|
23 | - * @param Exception $exception |
|
24 | - * @throws Exception |
|
25 | - */ |
|
26 | - public function __construct(Exception $exception) |
|
27 | - { |
|
28 | - if (WP_DEBUG && ! defined('EE_TESTS_DIR')) { |
|
29 | - $this->displayException($exception); |
|
30 | - } else { |
|
31 | - throw $exception; |
|
32 | - } |
|
33 | - } |
|
22 | + /** |
|
23 | + * @param Exception $exception |
|
24 | + * @throws Exception |
|
25 | + */ |
|
26 | + public function __construct(Exception $exception) |
|
27 | + { |
|
28 | + if (WP_DEBUG && ! defined('EE_TESTS_DIR')) { |
|
29 | + $this->displayException($exception); |
|
30 | + } else { |
|
31 | + throw $exception; |
|
32 | + } |
|
33 | + } |
|
34 | 34 | |
35 | 35 | |
36 | - /** |
|
37 | - * @access protected |
|
38 | - * @param Exception $exception |
|
39 | - * @throws ReflectionException |
|
40 | - */ |
|
41 | - protected function displayException(Exception $exception) |
|
42 | - { |
|
43 | - $error_code = ''; |
|
44 | - $trace_details = ''; |
|
45 | - $time = time(); |
|
46 | - $trace = $exception->getTrace(); |
|
47 | - // get separate user and developer messages if they exist |
|
48 | - $msg = explode('||', $exception->getMessage()); |
|
49 | - $user_msg = $msg[0]; |
|
50 | - $dev_msg = isset($msg[1]) ? $msg[1] : $msg[0]; |
|
51 | - $msg = WP_DEBUG ? $dev_msg : $user_msg; |
|
52 | - // start gathering output |
|
53 | - $output = $this->exceptionStyles(); |
|
54 | - $output .= ' |
|
36 | + /** |
|
37 | + * @access protected |
|
38 | + * @param Exception $exception |
|
39 | + * @throws ReflectionException |
|
40 | + */ |
|
41 | + protected function displayException(Exception $exception) |
|
42 | + { |
|
43 | + $error_code = ''; |
|
44 | + $trace_details = ''; |
|
45 | + $time = time(); |
|
46 | + $trace = $exception->getTrace(); |
|
47 | + // get separate user and developer messages if they exist |
|
48 | + $msg = explode('||', $exception->getMessage()); |
|
49 | + $user_msg = $msg[0]; |
|
50 | + $dev_msg = isset($msg[1]) ? $msg[1] : $msg[0]; |
|
51 | + $msg = WP_DEBUG ? $dev_msg : $user_msg; |
|
52 | + // start gathering output |
|
53 | + $output = $this->exceptionStyles(); |
|
54 | + $output .= ' |
|
55 | 55 | <div id="ee-error-message" class="error">'; |
56 | - if (! WP_DEBUG) { |
|
57 | - $output .= ' |
|
56 | + if (! WP_DEBUG) { |
|
57 | + $output .= ' |
|
58 | 58 | <p>'; |
59 | - } |
|
60 | - // process trace info |
|
61 | - if (empty($trace)) { |
|
62 | - $trace_details .= __( |
|
63 | - 'Sorry, but no trace information was available for this exception.', |
|
64 | - 'event_espresso' |
|
65 | - ); |
|
66 | - } else { |
|
67 | - $trace_details .= ' |
|
59 | + } |
|
60 | + // process trace info |
|
61 | + if (empty($trace)) { |
|
62 | + $trace_details .= __( |
|
63 | + 'Sorry, but no trace information was available for this exception.', |
|
64 | + 'event_espresso' |
|
65 | + ); |
|
66 | + } else { |
|
67 | + $trace_details .= ' |
|
68 | 68 | <div id="ee-trace-details"> |
69 | 69 | <table width="100%" border="0" cellpadding="5" cellspacing="0"> |
70 | 70 | <tr> |
@@ -72,263 +72,263 @@ discard block |
||
72 | 72 | <th scope="col" align="right" style="width:3.5%;">Line</th> |
73 | 73 | <th scope="col" align="left" style="width:40%;">File</th> |
74 | 74 | <th scope="col" align="left">' . __('Class', 'event_espresso') . '->' |
75 | - . __( |
|
76 | - 'Method( arguments )', |
|
77 | - 'event_espresso' |
|
78 | - ) . '</th> |
|
75 | + . __( |
|
76 | + 'Method( arguments )', |
|
77 | + 'event_espresso' |
|
78 | + ) . '</th> |
|
79 | 79 | </tr>'; |
80 | - $last_on_stack = count($trace) - 1; |
|
81 | - // reverse array so that stack is in proper chronological order |
|
82 | - $sorted_trace = array_reverse($trace); |
|
83 | - foreach ($sorted_trace as $nmbr => $trace) { |
|
84 | - $file = isset($trace['file']) ? $trace['file'] : ''; |
|
85 | - $class = isset($trace['class']) ? $trace['class'] : ''; |
|
86 | - $type = isset($trace['type']) ? $trace['type'] : ''; |
|
87 | - $function = isset($trace['function']) ? $trace['function'] : ''; |
|
88 | - $args = isset($trace['args']) ? $this->_convert_args_to_string($trace['args']) : ''; |
|
89 | - $args = isset($trace['args']) && count($trace['args']) > 4 ? ' <br />' . $args . '<br />' : $args; |
|
90 | - $line = isset($trace['line']) ? $trace['line'] : ''; |
|
91 | - $zebra = $nmbr % 2 !== 0 ? ' odd' : ''; |
|
92 | - if (empty($file) && ! empty($class)) { |
|
93 | - $a = new ReflectionClass($class); |
|
94 | - $file = $a->getFileName(); |
|
95 | - if (empty($line) && ! empty($function)) { |
|
96 | - try { |
|
97 | - // if $function is a closure, this throws an exception |
|
98 | - $b = new ReflectionMethod($class, $function); |
|
99 | - $line = $b->getStartLine(); |
|
100 | - } catch (Exception $closure_exception) { |
|
101 | - $line = 'unknown'; |
|
102 | - } |
|
103 | - } |
|
104 | - } |
|
105 | - if ($nmbr === $last_on_stack) { |
|
106 | - $file = $exception->getFile() !== '' ? $exception->getFile() : $file; |
|
107 | - $line = $exception->getLine() !== '' ? $exception->getLine() : $line; |
|
108 | - $error_code = $this->generate_error_code($file, $trace['function'], $line); |
|
109 | - } |
|
110 | - $file = \EEH_File::standardise_directory_separators($file); |
|
111 | - $nmbr = ! empty($nmbr) ? $nmbr : ' '; |
|
112 | - $line = ! empty($line) ? $line : ' '; |
|
113 | - $file = ! empty($file) ? $file : ' '; |
|
114 | - $class_display = ! empty($class) ? $class : ''; |
|
115 | - $type = ! empty($type) ? $type : ''; |
|
116 | - $function = ! empty($function) ? $function : ''; |
|
117 | - $args = ! empty($args) ? '( ' . $args . ' )' : '()'; |
|
118 | - $trace_details .= ' |
|
80 | + $last_on_stack = count($trace) - 1; |
|
81 | + // reverse array so that stack is in proper chronological order |
|
82 | + $sorted_trace = array_reverse($trace); |
|
83 | + foreach ($sorted_trace as $nmbr => $trace) { |
|
84 | + $file = isset($trace['file']) ? $trace['file'] : ''; |
|
85 | + $class = isset($trace['class']) ? $trace['class'] : ''; |
|
86 | + $type = isset($trace['type']) ? $trace['type'] : ''; |
|
87 | + $function = isset($trace['function']) ? $trace['function'] : ''; |
|
88 | + $args = isset($trace['args']) ? $this->_convert_args_to_string($trace['args']) : ''; |
|
89 | + $args = isset($trace['args']) && count($trace['args']) > 4 ? ' <br />' . $args . '<br />' : $args; |
|
90 | + $line = isset($trace['line']) ? $trace['line'] : ''; |
|
91 | + $zebra = $nmbr % 2 !== 0 ? ' odd' : ''; |
|
92 | + if (empty($file) && ! empty($class)) { |
|
93 | + $a = new ReflectionClass($class); |
|
94 | + $file = $a->getFileName(); |
|
95 | + if (empty($line) && ! empty($function)) { |
|
96 | + try { |
|
97 | + // if $function is a closure, this throws an exception |
|
98 | + $b = new ReflectionMethod($class, $function); |
|
99 | + $line = $b->getStartLine(); |
|
100 | + } catch (Exception $closure_exception) { |
|
101 | + $line = 'unknown'; |
|
102 | + } |
|
103 | + } |
|
104 | + } |
|
105 | + if ($nmbr === $last_on_stack) { |
|
106 | + $file = $exception->getFile() !== '' ? $exception->getFile() : $file; |
|
107 | + $line = $exception->getLine() !== '' ? $exception->getLine() : $line; |
|
108 | + $error_code = $this->generate_error_code($file, $trace['function'], $line); |
|
109 | + } |
|
110 | + $file = \EEH_File::standardise_directory_separators($file); |
|
111 | + $nmbr = ! empty($nmbr) ? $nmbr : ' '; |
|
112 | + $line = ! empty($line) ? $line : ' '; |
|
113 | + $file = ! empty($file) ? $file : ' '; |
|
114 | + $class_display = ! empty($class) ? $class : ''; |
|
115 | + $type = ! empty($type) ? $type : ''; |
|
116 | + $function = ! empty($function) ? $function : ''; |
|
117 | + $args = ! empty($args) ? '( ' . $args . ' )' : '()'; |
|
118 | + $trace_details .= ' |
|
119 | 119 | <tr> |
120 | 120 | <td align="right" valign="top" class="' |
121 | - . $zebra |
|
122 | - . '">' |
|
123 | - . $nmbr |
|
124 | - . '</td> |
|
121 | + . $zebra |
|
122 | + . '">' |
|
123 | + . $nmbr |
|
124 | + . '</td> |
|
125 | 125 | <td align="right" valign="top" class="' |
126 | - . $zebra |
|
127 | - . '">' |
|
128 | - . $line |
|
129 | - . '</td> |
|
126 | + . $zebra |
|
127 | + . '">' |
|
128 | + . $line |
|
129 | + . '</td> |
|
130 | 130 | <td align="left" valign="top" class="' |
131 | - . $zebra |
|
132 | - . '">' |
|
133 | - . $file |
|
134 | - . '</td> |
|
131 | + . $zebra |
|
132 | + . '">' |
|
133 | + . $file |
|
134 | + . '</td> |
|
135 | 135 | <td align="left" valign="top" class="' |
136 | - . $zebra |
|
137 | - . '">' |
|
138 | - . $class_display |
|
139 | - . $type |
|
140 | - . $function |
|
141 | - . $args |
|
142 | - . '</td> |
|
136 | + . $zebra |
|
137 | + . '">' |
|
138 | + . $class_display |
|
139 | + . $type |
|
140 | + . $function |
|
141 | + . $args |
|
142 | + . '</td> |
|
143 | 143 | </tr>'; |
144 | - } |
|
145 | - $trace_details .= ' |
|
144 | + } |
|
145 | + $trace_details .= ' |
|
146 | 146 | </table> |
147 | 147 | </div>'; |
148 | - } |
|
149 | - $code = $exception->getCode() ? $exception->getCode() : $error_code; |
|
150 | - // add generic non-identifying messages for non-privileged users |
|
151 | - if (! WP_DEBUG) { |
|
152 | - $output .= '<span class="ee-error-user-msg-spn">' |
|
153 | - . trim($msg) |
|
154 | - . '</span> <sup>' |
|
155 | - . $code |
|
156 | - . '</sup><br />'; |
|
157 | - } else { |
|
158 | - // or helpful developer messages if debugging is on |
|
159 | - $output .= ' |
|
148 | + } |
|
149 | + $code = $exception->getCode() ? $exception->getCode() : $error_code; |
|
150 | + // add generic non-identifying messages for non-privileged users |
|
151 | + if (! WP_DEBUG) { |
|
152 | + $output .= '<span class="ee-error-user-msg-spn">' |
|
153 | + . trim($msg) |
|
154 | + . '</span> <sup>' |
|
155 | + . $code |
|
156 | + . '</sup><br />'; |
|
157 | + } else { |
|
158 | + // or helpful developer messages if debugging is on |
|
159 | + $output .= ' |
|
160 | 160 | <div class="ee-error-dev-msg-dv"> |
161 | 161 | <p class="ee-error-dev-msg-pg"> |
162 | 162 | ' |
163 | - . sprintf( |
|
164 | - __('%1$sAn %2$s was thrown!%3$s code: %4$s', 'event_espresso'), |
|
165 | - '<strong class="ee-error-dev-msg-str">', |
|
166 | - get_class($exception), |
|
167 | - '</strong> <span>', |
|
168 | - $code . '</span>' |
|
169 | - ) |
|
170 | - . '<br /> |
|
163 | + . sprintf( |
|
164 | + __('%1$sAn %2$s was thrown!%3$s code: %4$s', 'event_espresso'), |
|
165 | + '<strong class="ee-error-dev-msg-str">', |
|
166 | + get_class($exception), |
|
167 | + '</strong> <span>', |
|
168 | + $code . '</span>' |
|
169 | + ) |
|
170 | + . '<br /> |
|
171 | 171 | <span class="big-text">"' |
172 | - . trim($msg) |
|
173 | - . '"</span><br/> |
|
172 | + . trim($msg) |
|
173 | + . '"</span><br/> |
|
174 | 174 | <a id="display-ee-error-trace-1' |
175 | - . $time |
|
176 | - . '" class="display-ee-error-trace-lnk small-text" rel="ee-error-trace-1' |
|
177 | - . $time |
|
178 | - . '"> |
|
175 | + . $time |
|
176 | + . '" class="display-ee-error-trace-lnk small-text" rel="ee-error-trace-1' |
|
177 | + . $time |
|
178 | + . '"> |
|
179 | 179 | ' |
180 | - . __('click to view backtrace and class/method details', 'event_espresso') |
|
181 | - . ' |
|
180 | + . __('click to view backtrace and class/method details', 'event_espresso') |
|
181 | + . ' |
|
182 | 182 | </a><br /> |
183 | 183 | ' |
184 | - . $exception->getFile() |
|
185 | - . sprintf( |
|
186 | - __('%1$s( line no: %2$s )%3$s', 'event_espresso'), |
|
187 | - ' <span class="small-text lt-grey-text">', |
|
188 | - $exception->getLine(), |
|
189 | - '</span>' |
|
190 | - ) |
|
191 | - . ' |
|
184 | + . $exception->getFile() |
|
185 | + . sprintf( |
|
186 | + __('%1$s( line no: %2$s )%3$s', 'event_espresso'), |
|
187 | + ' <span class="small-text lt-grey-text">', |
|
188 | + $exception->getLine(), |
|
189 | + '</span>' |
|
190 | + ) |
|
191 | + . ' |
|
192 | 192 | </p> |
193 | 193 | <div id="ee-error-trace-1' |
194 | - . $time |
|
195 | - . '-dv" class="ee-error-trace-dv" style="display: none;"> |
|
194 | + . $time |
|
195 | + . '-dv" class="ee-error-trace-dv" style="display: none;"> |
|
196 | 196 | ' |
197 | - . $trace_details; |
|
198 | - if (! empty($class)) { |
|
199 | - $output .= ' |
|
197 | + . $trace_details; |
|
198 | + if (! empty($class)) { |
|
199 | + $output .= ' |
|
200 | 200 | <div style="padding:3px; margin:0 0 1em; border:1px solid #999; background:#fff; border-radius:3px;"> |
201 | 201 | <div style="padding:1em 2em; border:1px solid #999; background:#fcfcfc;"> |
202 | 202 | <h3>' . __('Class Details', 'event_espresso') . '</h3>'; |
203 | - $a = new ReflectionClass($class); |
|
204 | - $output .= ' |
|
203 | + $a = new ReflectionClass($class); |
|
204 | + $output .= ' |
|
205 | 205 | <pre>' . $a . '</pre> |
206 | 206 | </div> |
207 | 207 | </div>'; |
208 | - } |
|
209 | - $output .= ' |
|
208 | + } |
|
209 | + $output .= ' |
|
210 | 210 | </div> |
211 | 211 | </div> |
212 | 212 | <br />'; |
213 | - } |
|
214 | - // remove last linebreak |
|
215 | - $output = substr($output, 0, -6); |
|
216 | - if (! WP_DEBUG) { |
|
217 | - $output .= ' |
|
213 | + } |
|
214 | + // remove last linebreak |
|
215 | + $output = substr($output, 0, -6); |
|
216 | + if (! WP_DEBUG) { |
|
217 | + $output .= ' |
|
218 | 218 | </p>'; |
219 | - } |
|
220 | - $output .= ' |
|
219 | + } |
|
220 | + $output .= ' |
|
221 | 221 | </div>'; |
222 | - $output .= $this->printScripts(true); |
|
223 | - if (defined('DOING_AJAX')) { |
|
224 | - echo wp_json_encode(array('error' => $output)); |
|
225 | - exit(); |
|
226 | - } |
|
227 | - echo $output; |
|
228 | - } |
|
222 | + $output .= $this->printScripts(true); |
|
223 | + if (defined('DOING_AJAX')) { |
|
224 | + echo wp_json_encode(array('error' => $output)); |
|
225 | + exit(); |
|
226 | + } |
|
227 | + echo $output; |
|
228 | + } |
|
229 | 229 | |
230 | 230 | |
231 | - // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps |
|
232 | - // phpcs:disable PSR2.Methods.MethodDeclaration.Underscore |
|
231 | + // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps |
|
232 | + // phpcs:disable PSR2.Methods.MethodDeclaration.Underscore |
|
233 | 233 | |
234 | - /** |
|
235 | - * generate string from exception trace args |
|
236 | - * |
|
237 | - * @param array $arguments |
|
238 | - * @param int $indent |
|
239 | - * @param bool $array |
|
240 | - * @return string |
|
241 | - */ |
|
242 | - private function _convert_args_to_string($arguments = array(), $indent = 0, $array = false) |
|
243 | - { |
|
244 | - $args = array(); |
|
245 | - $args_count = count($arguments); |
|
246 | - if ($args_count > 2) { |
|
247 | - $indent++; |
|
248 | - $args[] = '<br />'; |
|
249 | - } |
|
250 | - $x = 0; |
|
251 | - foreach ($arguments as $arg) { |
|
252 | - $x++; |
|
253 | - for ($i = 0; $i < $indent; $i++) { |
|
254 | - $args[] = ' '; |
|
255 | - } |
|
256 | - if (is_string($arg)) { |
|
257 | - if (! $array && strlen($arg) > 75) { |
|
258 | - $args[] = '<br />'; |
|
259 | - for ($i = 0; $i <= $indent; $i++) { |
|
260 | - $args[] = ' '; |
|
261 | - } |
|
262 | - $args[] = "'" . $arg . "'<br />"; |
|
263 | - } else { |
|
264 | - $args[] = " '" . $arg . "'"; |
|
265 | - } |
|
266 | - } elseif (is_array($arg)) { |
|
267 | - $arg_count = count($arg); |
|
268 | - if ($arg_count > 2) { |
|
269 | - $indent++; |
|
270 | - $args[] = ' array(' . $this->_convert_args_to_string($arg, $indent, true) . ')'; |
|
271 | - $indent--; |
|
272 | - } elseif ($arg_count === 0) { |
|
273 | - $args[] = ' array()'; |
|
274 | - } else { |
|
275 | - $args[] = ' array( ' . $this->_convert_args_to_string($arg) . ' )'; |
|
276 | - } |
|
277 | - } elseif ($arg === null) { |
|
278 | - $args[] = ' null'; |
|
279 | - } elseif (is_bool($arg)) { |
|
280 | - $args[] = $arg ? ' true' : ' false'; |
|
281 | - } elseif (is_object($arg)) { |
|
282 | - $args[] = get_class($arg); |
|
283 | - } elseif (is_resource($arg)) { |
|
284 | - $args[] = get_resource_type($arg); |
|
285 | - } else { |
|
286 | - $args[] = $arg; |
|
287 | - } |
|
288 | - if ($x === $args_count) { |
|
289 | - if ($args_count > 2) { |
|
290 | - $args[] = '<br />'; |
|
291 | - $indent--; |
|
292 | - for ($i = 1; $i < $indent; $i++) { |
|
293 | - $args[] = ' '; |
|
294 | - } |
|
295 | - } |
|
296 | - } else { |
|
297 | - $args[] = $args_count > 2 ? ',<br />' : ', '; |
|
298 | - } |
|
299 | - } |
|
300 | - return implode('', $args); |
|
301 | - } |
|
234 | + /** |
|
235 | + * generate string from exception trace args |
|
236 | + * |
|
237 | + * @param array $arguments |
|
238 | + * @param int $indent |
|
239 | + * @param bool $array |
|
240 | + * @return string |
|
241 | + */ |
|
242 | + private function _convert_args_to_string($arguments = array(), $indent = 0, $array = false) |
|
243 | + { |
|
244 | + $args = array(); |
|
245 | + $args_count = count($arguments); |
|
246 | + if ($args_count > 2) { |
|
247 | + $indent++; |
|
248 | + $args[] = '<br />'; |
|
249 | + } |
|
250 | + $x = 0; |
|
251 | + foreach ($arguments as $arg) { |
|
252 | + $x++; |
|
253 | + for ($i = 0; $i < $indent; $i++) { |
|
254 | + $args[] = ' '; |
|
255 | + } |
|
256 | + if (is_string($arg)) { |
|
257 | + if (! $array && strlen($arg) > 75) { |
|
258 | + $args[] = '<br />'; |
|
259 | + for ($i = 0; $i <= $indent; $i++) { |
|
260 | + $args[] = ' '; |
|
261 | + } |
|
262 | + $args[] = "'" . $arg . "'<br />"; |
|
263 | + } else { |
|
264 | + $args[] = " '" . $arg . "'"; |
|
265 | + } |
|
266 | + } elseif (is_array($arg)) { |
|
267 | + $arg_count = count($arg); |
|
268 | + if ($arg_count > 2) { |
|
269 | + $indent++; |
|
270 | + $args[] = ' array(' . $this->_convert_args_to_string($arg, $indent, true) . ')'; |
|
271 | + $indent--; |
|
272 | + } elseif ($arg_count === 0) { |
|
273 | + $args[] = ' array()'; |
|
274 | + } else { |
|
275 | + $args[] = ' array( ' . $this->_convert_args_to_string($arg) . ' )'; |
|
276 | + } |
|
277 | + } elseif ($arg === null) { |
|
278 | + $args[] = ' null'; |
|
279 | + } elseif (is_bool($arg)) { |
|
280 | + $args[] = $arg ? ' true' : ' false'; |
|
281 | + } elseif (is_object($arg)) { |
|
282 | + $args[] = get_class($arg); |
|
283 | + } elseif (is_resource($arg)) { |
|
284 | + $args[] = get_resource_type($arg); |
|
285 | + } else { |
|
286 | + $args[] = $arg; |
|
287 | + } |
|
288 | + if ($x === $args_count) { |
|
289 | + if ($args_count > 2) { |
|
290 | + $args[] = '<br />'; |
|
291 | + $indent--; |
|
292 | + for ($i = 1; $i < $indent; $i++) { |
|
293 | + $args[] = ' '; |
|
294 | + } |
|
295 | + } |
|
296 | + } else { |
|
297 | + $args[] = $args_count > 2 ? ',<br />' : ', '; |
|
298 | + } |
|
299 | + } |
|
300 | + return implode('', $args); |
|
301 | + } |
|
302 | 302 | |
303 | 303 | |
304 | - /** |
|
305 | - * create error code from filepath, function name, |
|
306 | - * and line number where exception or error was thrown |
|
307 | - * |
|
308 | - * @access protected |
|
309 | - * @param string $file |
|
310 | - * @param string $func |
|
311 | - * @param string $line |
|
312 | - * @return string |
|
313 | - */ |
|
314 | - protected function generate_error_code($file = '', $func = '', $line = '') |
|
315 | - { |
|
316 | - $file_bits = explode('.', basename($file)); |
|
317 | - $error_code = ! empty($file_bits[0]) ? $file_bits[0] : ''; |
|
318 | - $error_code .= ! empty($func) ? ' - ' . $func : ''; |
|
319 | - $error_code .= ! empty($line) ? ' - ' . $line : ''; |
|
320 | - return $error_code; |
|
321 | - } |
|
304 | + /** |
|
305 | + * create error code from filepath, function name, |
|
306 | + * and line number where exception or error was thrown |
|
307 | + * |
|
308 | + * @access protected |
|
309 | + * @param string $file |
|
310 | + * @param string $func |
|
311 | + * @param string $line |
|
312 | + * @return string |
|
313 | + */ |
|
314 | + protected function generate_error_code($file = '', $func = '', $line = '') |
|
315 | + { |
|
316 | + $file_bits = explode('.', basename($file)); |
|
317 | + $error_code = ! empty($file_bits[0]) ? $file_bits[0] : ''; |
|
318 | + $error_code .= ! empty($func) ? ' - ' . $func : ''; |
|
319 | + $error_code .= ! empty($line) ? ' - ' . $line : ''; |
|
320 | + return $error_code; |
|
321 | + } |
|
322 | 322 | |
323 | 323 | |
324 | - /** |
|
325 | - * _exception_styles |
|
326 | - * |
|
327 | - * @return string |
|
328 | - */ |
|
329 | - private function exceptionStyles() |
|
330 | - { |
|
331 | - return ' |
|
324 | + /** |
|
325 | + * _exception_styles |
|
326 | + * |
|
327 | + * @return string |
|
328 | + */ |
|
329 | + private function exceptionStyles() |
|
330 | + { |
|
331 | + return ' |
|
332 | 332 | <style type="text/css"> |
333 | 333 | #ee-error-message { |
334 | 334 | max-width:90% !important; |
@@ -385,29 +385,29 @@ discard block |
||
385 | 385 | color: #999; |
386 | 386 | } |
387 | 387 | </style>'; |
388 | - } |
|
388 | + } |
|
389 | 389 | |
390 | 390 | |
391 | - /** |
|
392 | - * _print_scripts |
|
393 | - * |
|
394 | - * @param bool $force_print |
|
395 | - * @return string |
|
396 | - */ |
|
397 | - private function printScripts($force_print = false) |
|
398 | - { |
|
399 | - if (! $force_print && (did_action('admin_enqueue_scripts') || did_action('wp_enqueue_scripts'))) { |
|
400 | - if (wp_script_is('ee_error_js', 'enqueued')) { |
|
401 | - return ''; |
|
402 | - } |
|
403 | - if (wp_script_is('ee_error_js', 'registered')) { |
|
404 | - wp_enqueue_style('espresso_default'); |
|
405 | - wp_enqueue_style('espresso_custom_css'); |
|
406 | - wp_enqueue_script('ee_error_js'); |
|
407 | - wp_localize_script('ee_error_js', 'ee_settings', array('wp_debug' => WP_DEBUG)); |
|
408 | - } |
|
409 | - } else { |
|
410 | - return ' |
|
391 | + /** |
|
392 | + * _print_scripts |
|
393 | + * |
|
394 | + * @param bool $force_print |
|
395 | + * @return string |
|
396 | + */ |
|
397 | + private function printScripts($force_print = false) |
|
398 | + { |
|
399 | + if (! $force_print && (did_action('admin_enqueue_scripts') || did_action('wp_enqueue_scripts'))) { |
|
400 | + if (wp_script_is('ee_error_js', 'enqueued')) { |
|
401 | + return ''; |
|
402 | + } |
|
403 | + if (wp_script_is('ee_error_js', 'registered')) { |
|
404 | + wp_enqueue_style('espresso_default'); |
|
405 | + wp_enqueue_style('espresso_custom_css'); |
|
406 | + wp_enqueue_script('ee_error_js'); |
|
407 | + wp_localize_script('ee_error_js', 'ee_settings', array('wp_debug' => WP_DEBUG)); |
|
408 | + } |
|
409 | + } else { |
|
410 | + return ' |
|
411 | 411 | <script> |
412 | 412 | /* <![CDATA[ */ |
413 | 413 | var ee_settings = {"wp_debug":"' . WP_DEBUG . '"}; |
@@ -417,7 +417,7 @@ discard block |
||
417 | 417 | <script src="' . EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js' . '?ver=' . espresso_version() . '" type="text/javascript"></script> |
418 | 418 | <script src="' . EE_GLOBAL_ASSETS_URL . 'scripts/EE_Error.js' . '?ver=' . espresso_version() . '" type="text/javascript"></script> |
419 | 419 | '; |
420 | - } |
|
421 | - return ''; |
|
422 | - } |
|
420 | + } |
|
421 | + return ''; |
|
422 | + } |
|
423 | 423 | } |
@@ -53,7 +53,7 @@ discard block |
||
53 | 53 | $output = $this->exceptionStyles(); |
54 | 54 | $output .= ' |
55 | 55 | <div id="ee-error-message" class="error">'; |
56 | - if (! WP_DEBUG) { |
|
56 | + if ( ! WP_DEBUG) { |
|
57 | 57 | $output .= ' |
58 | 58 | <p>'; |
59 | 59 | } |
@@ -71,11 +71,11 @@ discard block |
||
71 | 71 | <th scope="col" align="right" style="width:2.5%;">#</th> |
72 | 72 | <th scope="col" align="right" style="width:3.5%;">Line</th> |
73 | 73 | <th scope="col" align="left" style="width:40%;">File</th> |
74 | - <th scope="col" align="left">' . __('Class', 'event_espresso') . '->' |
|
74 | + <th scope="col" align="left">' . __('Class', 'event_espresso').'->' |
|
75 | 75 | . __( |
76 | 76 | 'Method( arguments )', |
77 | 77 | 'event_espresso' |
78 | - ) . '</th> |
|
78 | + ).'</th> |
|
79 | 79 | </tr>'; |
80 | 80 | $last_on_stack = count($trace) - 1; |
81 | 81 | // reverse array so that stack is in proper chronological order |
@@ -86,7 +86,7 @@ discard block |
||
86 | 86 | $type = isset($trace['type']) ? $trace['type'] : ''; |
87 | 87 | $function = isset($trace['function']) ? $trace['function'] : ''; |
88 | 88 | $args = isset($trace['args']) ? $this->_convert_args_to_string($trace['args']) : ''; |
89 | - $args = isset($trace['args']) && count($trace['args']) > 4 ? ' <br />' . $args . '<br />' : $args; |
|
89 | + $args = isset($trace['args']) && count($trace['args']) > 4 ? ' <br />'.$args.'<br />' : $args; |
|
90 | 90 | $line = isset($trace['line']) ? $trace['line'] : ''; |
91 | 91 | $zebra = $nmbr % 2 !== 0 ? ' odd' : ''; |
92 | 92 | if (empty($file) && ! empty($class)) { |
@@ -114,7 +114,7 @@ discard block |
||
114 | 114 | $class_display = ! empty($class) ? $class : ''; |
115 | 115 | $type = ! empty($type) ? $type : ''; |
116 | 116 | $function = ! empty($function) ? $function : ''; |
117 | - $args = ! empty($args) ? '( ' . $args . ' )' : '()'; |
|
117 | + $args = ! empty($args) ? '( '.$args.' )' : '()'; |
|
118 | 118 | $trace_details .= ' |
119 | 119 | <tr> |
120 | 120 | <td align="right" valign="top" class="' |
@@ -148,7 +148,7 @@ discard block |
||
148 | 148 | } |
149 | 149 | $code = $exception->getCode() ? $exception->getCode() : $error_code; |
150 | 150 | // add generic non-identifying messages for non-privileged users |
151 | - if (! WP_DEBUG) { |
|
151 | + if ( ! WP_DEBUG) { |
|
152 | 152 | $output .= '<span class="ee-error-user-msg-spn">' |
153 | 153 | . trim($msg) |
154 | 154 | . '</span> <sup>' |
@@ -165,7 +165,7 @@ discard block |
||
165 | 165 | '<strong class="ee-error-dev-msg-str">', |
166 | 166 | get_class($exception), |
167 | 167 | '</strong> <span>', |
168 | - $code . '</span>' |
|
168 | + $code.'</span>' |
|
169 | 169 | ) |
170 | 170 | . '<br /> |
171 | 171 | <span class="big-text">"' |
@@ -195,14 +195,14 @@ discard block |
||
195 | 195 | . '-dv" class="ee-error-trace-dv" style="display: none;"> |
196 | 196 | ' |
197 | 197 | . $trace_details; |
198 | - if (! empty($class)) { |
|
198 | + if ( ! empty($class)) { |
|
199 | 199 | $output .= ' |
200 | 200 | <div style="padding:3px; margin:0 0 1em; border:1px solid #999; background:#fff; border-radius:3px;"> |
201 | 201 | <div style="padding:1em 2em; border:1px solid #999; background:#fcfcfc;"> |
202 | - <h3>' . __('Class Details', 'event_espresso') . '</h3>'; |
|
202 | + <h3>' . __('Class Details', 'event_espresso').'</h3>'; |
|
203 | 203 | $a = new ReflectionClass($class); |
204 | 204 | $output .= ' |
205 | - <pre>' . $a . '</pre> |
|
205 | + <pre>' . $a.'</pre> |
|
206 | 206 | </div> |
207 | 207 | </div>'; |
208 | 208 | } |
@@ -213,7 +213,7 @@ discard block |
||
213 | 213 | } |
214 | 214 | // remove last linebreak |
215 | 215 | $output = substr($output, 0, -6); |
216 | - if (! WP_DEBUG) { |
|
216 | + if ( ! WP_DEBUG) { |
|
217 | 217 | $output .= ' |
218 | 218 | </p>'; |
219 | 219 | } |
@@ -254,25 +254,25 @@ discard block |
||
254 | 254 | $args[] = ' '; |
255 | 255 | } |
256 | 256 | if (is_string($arg)) { |
257 | - if (! $array && strlen($arg) > 75) { |
|
257 | + if ( ! $array && strlen($arg) > 75) { |
|
258 | 258 | $args[] = '<br />'; |
259 | 259 | for ($i = 0; $i <= $indent; $i++) { |
260 | 260 | $args[] = ' '; |
261 | 261 | } |
262 | - $args[] = "'" . $arg . "'<br />"; |
|
262 | + $args[] = "'".$arg."'<br />"; |
|
263 | 263 | } else { |
264 | - $args[] = " '" . $arg . "'"; |
|
264 | + $args[] = " '".$arg."'"; |
|
265 | 265 | } |
266 | 266 | } elseif (is_array($arg)) { |
267 | 267 | $arg_count = count($arg); |
268 | 268 | if ($arg_count > 2) { |
269 | 269 | $indent++; |
270 | - $args[] = ' array(' . $this->_convert_args_to_string($arg, $indent, true) . ')'; |
|
270 | + $args[] = ' array('.$this->_convert_args_to_string($arg, $indent, true).')'; |
|
271 | 271 | $indent--; |
272 | 272 | } elseif ($arg_count === 0) { |
273 | 273 | $args[] = ' array()'; |
274 | 274 | } else { |
275 | - $args[] = ' array( ' . $this->_convert_args_to_string($arg) . ' )'; |
|
275 | + $args[] = ' array( '.$this->_convert_args_to_string($arg).' )'; |
|
276 | 276 | } |
277 | 277 | } elseif ($arg === null) { |
278 | 278 | $args[] = ' null'; |
@@ -315,8 +315,8 @@ discard block |
||
315 | 315 | { |
316 | 316 | $file_bits = explode('.', basename($file)); |
317 | 317 | $error_code = ! empty($file_bits[0]) ? $file_bits[0] : ''; |
318 | - $error_code .= ! empty($func) ? ' - ' . $func : ''; |
|
319 | - $error_code .= ! empty($line) ? ' - ' . $line : ''; |
|
318 | + $error_code .= ! empty($func) ? ' - '.$func : ''; |
|
319 | + $error_code .= ! empty($line) ? ' - '.$line : ''; |
|
320 | 320 | return $error_code; |
321 | 321 | } |
322 | 322 | |
@@ -396,7 +396,7 @@ discard block |
||
396 | 396 | */ |
397 | 397 | private function printScripts($force_print = false) |
398 | 398 | { |
399 | - if (! $force_print && (did_action('admin_enqueue_scripts') || did_action('wp_enqueue_scripts'))) { |
|
399 | + if ( ! $force_print && (did_action('admin_enqueue_scripts') || did_action('wp_enqueue_scripts'))) { |
|
400 | 400 | if (wp_script_is('ee_error_js', 'enqueued')) { |
401 | 401 | return ''; |
402 | 402 | } |
@@ -410,12 +410,12 @@ discard block |
||
410 | 410 | return ' |
411 | 411 | <script> |
412 | 412 | /* <![CDATA[ */ |
413 | -var ee_settings = {"wp_debug":"' . WP_DEBUG . '"}; |
|
413 | +var ee_settings = {"wp_debug":"' . WP_DEBUG.'"}; |
|
414 | 414 | /* ]]> */ |
415 | 415 | </script> |
416 | -<script src="' . includes_url() . 'js/jquery/jquery.js" type="text/javascript"></script> |
|
417 | -<script src="' . EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js' . '?ver=' . espresso_version() . '" type="text/javascript"></script> |
|
418 | -<script src="' . EE_GLOBAL_ASSETS_URL . 'scripts/EE_Error.js' . '?ver=' . espresso_version() . '" type="text/javascript"></script> |
|
416 | +<script src="' . includes_url().'js/jquery/jquery.js" type="text/javascript"></script> |
|
417 | +<script src="' . EE_GLOBAL_ASSETS_URL.'scripts/espresso_core.js'.'?ver='.espresso_version().'" type="text/javascript"></script> |
|
418 | +<script src="' . EE_GLOBAL_ASSETS_URL.'scripts/EE_Error.js'.'?ver='.espresso_version().'" type="text/javascript"></script> |
|
419 | 419 | '; |
420 | 420 | } |
421 | 421 | return ''; |
@@ -45,150 +45,150 @@ |
||
45 | 45 | class Psr4Autoloader |
46 | 46 | { |
47 | 47 | |
48 | - /** |
|
49 | - * namespace separator |
|
50 | - */ |
|
51 | - const NS = '\\'; |
|
52 | - |
|
53 | - /** |
|
54 | - * An associative array where the key is a namespace prefix and the value |
|
55 | - * is an array of base directories for classes in that namespace. |
|
56 | - * |
|
57 | - * @var array |
|
58 | - */ |
|
59 | - protected $prefixes = array(); |
|
60 | - |
|
61 | - |
|
62 | - /** |
|
63 | - * returns an array of registered namespace prefixes |
|
64 | - * |
|
65 | - * @param string $prefix |
|
66 | - * @return array |
|
67 | - */ |
|
68 | - public function prefixes($prefix = '') |
|
69 | - { |
|
70 | - if (! empty($prefix)) { |
|
71 | - // are there any base directories for this namespace prefix? |
|
72 | - return isset($this->prefixes[ $prefix ]) ? $this->prefixes[ $prefix ] : array(); |
|
73 | - } |
|
74 | - return $this->prefixes; |
|
75 | - } |
|
76 | - |
|
77 | - |
|
78 | - /** |
|
79 | - * Register loader with SPL autoloader stack. |
|
80 | - * |
|
81 | - * @return void |
|
82 | - */ |
|
83 | - public function register() |
|
84 | - { |
|
85 | - spl_autoload_register(array($this, 'loadClass')); |
|
86 | - } |
|
87 | - |
|
88 | - |
|
89 | - /** |
|
90 | - * Adds a base directory for a namespace prefix. |
|
91 | - * |
|
92 | - * @param string $prefix The namespace prefix. |
|
93 | - * @param string $base_dir A base directory for class files in the |
|
94 | - * namespace. |
|
95 | - * @param bool $prepend If true, prepend the base directory to the stack |
|
96 | - * instead of appending it; this causes it to be searched first rather |
|
97 | - * than last. |
|
98 | - * @return void |
|
99 | - */ |
|
100 | - public function addNamespace($prefix, $base_dir, $prepend = false) |
|
101 | - { |
|
102 | - // normalize namespace prefix |
|
103 | - $prefix = trim($prefix, Psr4Autoloader::NS) . Psr4Autoloader::NS; |
|
104 | - // normalize the base directory with a trailing separator |
|
105 | - $base_dir = \EEH_File::standardise_and_end_with_directory_separator($base_dir); |
|
106 | - // initialize the namespace prefix array |
|
107 | - if (isset($this->prefixes[ $prefix ]) === false) { |
|
108 | - $this->prefixes[ $prefix ] = array(); |
|
109 | - } |
|
110 | - // retain the base directory for the namespace prefix |
|
111 | - if ($prepend) { |
|
112 | - array_unshift($this->prefixes[ $prefix ], $base_dir); |
|
113 | - } else { |
|
114 | - $this->prefixes[ $prefix ][] = $base_dir; |
|
115 | - } |
|
116 | - } |
|
117 | - |
|
118 | - |
|
119 | - /** |
|
120 | - * Loads the class file for a given class name. |
|
121 | - * |
|
122 | - * @param string $class The fully-qualified class name. |
|
123 | - * @return mixed The mapped file name on success, or boolean false on |
|
124 | - * failure. |
|
125 | - */ |
|
126 | - public function loadClass($class) |
|
127 | - { |
|
128 | - // the current namespace prefix |
|
129 | - $prefix = $class; |
|
130 | - // work backwards through the namespace names of the fully-qualified |
|
131 | - // class name to find a mapped file name |
|
132 | - while (false !== $pos = strrpos($prefix, Psr4Autoloader::NS)) { |
|
133 | - // retain the trailing namespace separator in the prefix |
|
134 | - $prefix = substr($class, 0, $pos + 1); |
|
135 | - // the rest is the relative class name |
|
136 | - $relative_class = substr($class, $pos + 1); |
|
137 | - // try to load a mapped file for the prefix and relative class |
|
138 | - $mapped_file = $this->loadMappedFile($prefix, $relative_class); |
|
139 | - if ($mapped_file) { |
|
140 | - return $mapped_file; |
|
141 | - } |
|
142 | - // remove the trailing namespace separator for the next iteration |
|
143 | - // of strrpos() |
|
144 | - $prefix = rtrim($prefix, Psr4Autoloader::NS); |
|
145 | - } |
|
146 | - // never found a mapped file |
|
147 | - return false; |
|
148 | - } |
|
149 | - |
|
150 | - |
|
151 | - /** |
|
152 | - * Load the mapped file for a namespace prefix and relative class. |
|
153 | - * |
|
154 | - * @param string $prefix The namespace prefix. |
|
155 | - * @param string $relative_class The relative class name. |
|
156 | - * @return mixed Boolean false if no mapped file can be loaded, or the |
|
157 | - * name of the mapped file that was loaded. |
|
158 | - */ |
|
159 | - protected function loadMappedFile($prefix, $relative_class) |
|
160 | - { |
|
161 | - // look through base directories for this namespace prefix |
|
162 | - foreach ($this->prefixes($prefix) as $base_dir) { |
|
163 | - // replace the namespace prefix with the base directory, |
|
164 | - // replace namespace separators with directory separators |
|
165 | - // in the relative class name, append with .php |
|
166 | - $file = $base_dir |
|
167 | - . str_replace(Psr4Autoloader::NS, DS, $relative_class) |
|
168 | - . '.php'; |
|
169 | - // if the mapped file exists, require it |
|
170 | - if ($this->requireFile($file)) { |
|
171 | - // yes, we're done |
|
172 | - return $file; |
|
173 | - } |
|
174 | - } |
|
175 | - // never found it |
|
176 | - return false; |
|
177 | - } |
|
178 | - |
|
179 | - |
|
180 | - /** |
|
181 | - * If a file exists, require it from the file system. |
|
182 | - * |
|
183 | - * @param string $file The file to require. |
|
184 | - * @return bool True if the file exists, false if not. |
|
185 | - */ |
|
186 | - protected function requireFile($file) |
|
187 | - { |
|
188 | - if (file_exists($file)) { |
|
189 | - require $file; |
|
190 | - return true; |
|
191 | - } |
|
192 | - return false; |
|
193 | - } |
|
48 | + /** |
|
49 | + * namespace separator |
|
50 | + */ |
|
51 | + const NS = '\\'; |
|
52 | + |
|
53 | + /** |
|
54 | + * An associative array where the key is a namespace prefix and the value |
|
55 | + * is an array of base directories for classes in that namespace. |
|
56 | + * |
|
57 | + * @var array |
|
58 | + */ |
|
59 | + protected $prefixes = array(); |
|
60 | + |
|
61 | + |
|
62 | + /** |
|
63 | + * returns an array of registered namespace prefixes |
|
64 | + * |
|
65 | + * @param string $prefix |
|
66 | + * @return array |
|
67 | + */ |
|
68 | + public function prefixes($prefix = '') |
|
69 | + { |
|
70 | + if (! empty($prefix)) { |
|
71 | + // are there any base directories for this namespace prefix? |
|
72 | + return isset($this->prefixes[ $prefix ]) ? $this->prefixes[ $prefix ] : array(); |
|
73 | + } |
|
74 | + return $this->prefixes; |
|
75 | + } |
|
76 | + |
|
77 | + |
|
78 | + /** |
|
79 | + * Register loader with SPL autoloader stack. |
|
80 | + * |
|
81 | + * @return void |
|
82 | + */ |
|
83 | + public function register() |
|
84 | + { |
|
85 | + spl_autoload_register(array($this, 'loadClass')); |
|
86 | + } |
|
87 | + |
|
88 | + |
|
89 | + /** |
|
90 | + * Adds a base directory for a namespace prefix. |
|
91 | + * |
|
92 | + * @param string $prefix The namespace prefix. |
|
93 | + * @param string $base_dir A base directory for class files in the |
|
94 | + * namespace. |
|
95 | + * @param bool $prepend If true, prepend the base directory to the stack |
|
96 | + * instead of appending it; this causes it to be searched first rather |
|
97 | + * than last. |
|
98 | + * @return void |
|
99 | + */ |
|
100 | + public function addNamespace($prefix, $base_dir, $prepend = false) |
|
101 | + { |
|
102 | + // normalize namespace prefix |
|
103 | + $prefix = trim($prefix, Psr4Autoloader::NS) . Psr4Autoloader::NS; |
|
104 | + // normalize the base directory with a trailing separator |
|
105 | + $base_dir = \EEH_File::standardise_and_end_with_directory_separator($base_dir); |
|
106 | + // initialize the namespace prefix array |
|
107 | + if (isset($this->prefixes[ $prefix ]) === false) { |
|
108 | + $this->prefixes[ $prefix ] = array(); |
|
109 | + } |
|
110 | + // retain the base directory for the namespace prefix |
|
111 | + if ($prepend) { |
|
112 | + array_unshift($this->prefixes[ $prefix ], $base_dir); |
|
113 | + } else { |
|
114 | + $this->prefixes[ $prefix ][] = $base_dir; |
|
115 | + } |
|
116 | + } |
|
117 | + |
|
118 | + |
|
119 | + /** |
|
120 | + * Loads the class file for a given class name. |
|
121 | + * |
|
122 | + * @param string $class The fully-qualified class name. |
|
123 | + * @return mixed The mapped file name on success, or boolean false on |
|
124 | + * failure. |
|
125 | + */ |
|
126 | + public function loadClass($class) |
|
127 | + { |
|
128 | + // the current namespace prefix |
|
129 | + $prefix = $class; |
|
130 | + // work backwards through the namespace names of the fully-qualified |
|
131 | + // class name to find a mapped file name |
|
132 | + while (false !== $pos = strrpos($prefix, Psr4Autoloader::NS)) { |
|
133 | + // retain the trailing namespace separator in the prefix |
|
134 | + $prefix = substr($class, 0, $pos + 1); |
|
135 | + // the rest is the relative class name |
|
136 | + $relative_class = substr($class, $pos + 1); |
|
137 | + // try to load a mapped file for the prefix and relative class |
|
138 | + $mapped_file = $this->loadMappedFile($prefix, $relative_class); |
|
139 | + if ($mapped_file) { |
|
140 | + return $mapped_file; |
|
141 | + } |
|
142 | + // remove the trailing namespace separator for the next iteration |
|
143 | + // of strrpos() |
|
144 | + $prefix = rtrim($prefix, Psr4Autoloader::NS); |
|
145 | + } |
|
146 | + // never found a mapped file |
|
147 | + return false; |
|
148 | + } |
|
149 | + |
|
150 | + |
|
151 | + /** |
|
152 | + * Load the mapped file for a namespace prefix and relative class. |
|
153 | + * |
|
154 | + * @param string $prefix The namespace prefix. |
|
155 | + * @param string $relative_class The relative class name. |
|
156 | + * @return mixed Boolean false if no mapped file can be loaded, or the |
|
157 | + * name of the mapped file that was loaded. |
|
158 | + */ |
|
159 | + protected function loadMappedFile($prefix, $relative_class) |
|
160 | + { |
|
161 | + // look through base directories for this namespace prefix |
|
162 | + foreach ($this->prefixes($prefix) as $base_dir) { |
|
163 | + // replace the namespace prefix with the base directory, |
|
164 | + // replace namespace separators with directory separators |
|
165 | + // in the relative class name, append with .php |
|
166 | + $file = $base_dir |
|
167 | + . str_replace(Psr4Autoloader::NS, DS, $relative_class) |
|
168 | + . '.php'; |
|
169 | + // if the mapped file exists, require it |
|
170 | + if ($this->requireFile($file)) { |
|
171 | + // yes, we're done |
|
172 | + return $file; |
|
173 | + } |
|
174 | + } |
|
175 | + // never found it |
|
176 | + return false; |
|
177 | + } |
|
178 | + |
|
179 | + |
|
180 | + /** |
|
181 | + * If a file exists, require it from the file system. |
|
182 | + * |
|
183 | + * @param string $file The file to require. |
|
184 | + * @return bool True if the file exists, false if not. |
|
185 | + */ |
|
186 | + protected function requireFile($file) |
|
187 | + { |
|
188 | + if (file_exists($file)) { |
|
189 | + require $file; |
|
190 | + return true; |
|
191 | + } |
|
192 | + return false; |
|
193 | + } |
|
194 | 194 | } |
@@ -67,9 +67,9 @@ discard block |
||
67 | 67 | */ |
68 | 68 | public function prefixes($prefix = '') |
69 | 69 | { |
70 | - if (! empty($prefix)) { |
|
70 | + if ( ! empty($prefix)) { |
|
71 | 71 | // are there any base directories for this namespace prefix? |
72 | - return isset($this->prefixes[ $prefix ]) ? $this->prefixes[ $prefix ] : array(); |
|
72 | + return isset($this->prefixes[$prefix]) ? $this->prefixes[$prefix] : array(); |
|
73 | 73 | } |
74 | 74 | return $this->prefixes; |
75 | 75 | } |
@@ -100,18 +100,18 @@ discard block |
||
100 | 100 | public function addNamespace($prefix, $base_dir, $prepend = false) |
101 | 101 | { |
102 | 102 | // normalize namespace prefix |
103 | - $prefix = trim($prefix, Psr4Autoloader::NS) . Psr4Autoloader::NS; |
|
103 | + $prefix = trim($prefix, Psr4Autoloader::NS).Psr4Autoloader::NS; |
|
104 | 104 | // normalize the base directory with a trailing separator |
105 | 105 | $base_dir = \EEH_File::standardise_and_end_with_directory_separator($base_dir); |
106 | 106 | // initialize the namespace prefix array |
107 | - if (isset($this->prefixes[ $prefix ]) === false) { |
|
108 | - $this->prefixes[ $prefix ] = array(); |
|
107 | + if (isset($this->prefixes[$prefix]) === false) { |
|
108 | + $this->prefixes[$prefix] = array(); |
|
109 | 109 | } |
110 | 110 | // retain the base directory for the namespace prefix |
111 | 111 | if ($prepend) { |
112 | - array_unshift($this->prefixes[ $prefix ], $base_dir); |
|
112 | + array_unshift($this->prefixes[$prefix], $base_dir); |
|
113 | 113 | } else { |
114 | - $this->prefixes[ $prefix ][] = $base_dir; |
|
114 | + $this->prefixes[$prefix][] = $base_dir; |
|
115 | 115 | } |
116 | 116 | } |
117 | 117 |
@@ -13,121 +13,121 @@ |
||
13 | 13 | class PostRelatedCacheManager extends BasicCacheManager |
14 | 14 | { |
15 | 15 | |
16 | - /** |
|
17 | - * @type string |
|
18 | - */ |
|
19 | - const POST_CACHE_PREFIX = 'ee_cache_post_'; |
|
20 | - |
|
21 | - /** |
|
22 | - * wp-option option_name for tracking post related cache |
|
23 | - * |
|
24 | - * @type string |
|
25 | - */ |
|
26 | - const POST_CACHE_OPTIONS_KEY = 'ee_post_cache'; |
|
27 | - |
|
28 | - |
|
29 | - /** |
|
30 | - * PostRelatedCacheManager constructor. |
|
31 | - * |
|
32 | - * @param CacheStorageInterface $cache_storage |
|
33 | - */ |
|
34 | - public function __construct(CacheStorageInterface $cache_storage) |
|
35 | - { |
|
36 | - parent::__construct($cache_storage); |
|
37 | - add_action('save_post', array($this, 'clearPostRelatedCache')); |
|
38 | - } |
|
39 | - |
|
40 | - |
|
41 | - /** |
|
42 | - * returns a string that will be prepended to all cache identifiers |
|
43 | - * |
|
44 | - * @return string |
|
45 | - */ |
|
46 | - public function cachePrefix() |
|
47 | - { |
|
48 | - return PostRelatedCacheManager::POST_CACHE_PREFIX; |
|
49 | - } |
|
50 | - |
|
51 | - |
|
52 | - /** |
|
53 | - * @return array |
|
54 | - */ |
|
55 | - protected function getPostRelatedCache() |
|
56 | - { |
|
57 | - $post_related_cache = get_option(PostRelatedCacheManager::POST_CACHE_OPTIONS_KEY, array()); |
|
58 | - // verify that cached data was not truncated or corrupted and no longer an array |
|
59 | - if (! is_array($post_related_cache)) { |
|
60 | - // uh-oh... let's get rid of any transients using our cache prefix |
|
61 | - $this->clear(PostRelatedCacheManager::CACHE_PREFIX); |
|
62 | - // then update the post related cache tracking option |
|
63 | - $post_related_cache = array(); |
|
64 | - $this->updatePostRelatedCache($post_related_cache); |
|
65 | - } |
|
66 | - return $post_related_cache; |
|
67 | - } |
|
68 | - |
|
69 | - |
|
70 | - /** |
|
71 | - * @param array $post_related_cache |
|
72 | - */ |
|
73 | - protected function updatePostRelatedCache(array $post_related_cache = array()) |
|
74 | - { |
|
75 | - update_option(PostRelatedCacheManager::POST_CACHE_OPTIONS_KEY, $post_related_cache); |
|
76 | - } |
|
77 | - |
|
78 | - |
|
79 | - /** |
|
80 | - * If you are caching content that pertains to a Post of any type, |
|
81 | - * then it is recommended to pass the post id and cache id prefix to this method |
|
82 | - * so that it can be added to the post related cache tracking. |
|
83 | - * Then, whenever that post is updated, the cache will automatically be deleted, |
|
84 | - * which helps to ensure that outdated cache content will not be served |
|
85 | - * |
|
86 | - * @param int $post_ID [required] |
|
87 | - * @param string $id_prefix [required] Appended to all cache IDs. Can be helpful in finding specific cache types. |
|
88 | - * May also be helpful to include an additional specific identifier, |
|
89 | - * such as a post ID as part of the $id_prefix so that individual caches |
|
90 | - * can be found and/or cleared. ex: "venue-28", or "shortcode-156". |
|
91 | - * BasicCacheManager::CACHE_PREFIX will also be prepended to the cache id. |
|
92 | - */ |
|
93 | - public function clearPostRelatedCacheOnUpdate($post_ID, $id_prefix) |
|
94 | - { |
|
95 | - $post_related_cache = $this->getPostRelatedCache(); |
|
96 | - // if post is not already being tracked |
|
97 | - if (! isset($post_related_cache[ $post_ID ])) { |
|
98 | - // add array to add cache ids to |
|
99 | - $post_related_cache[ $post_ID ] = array(); |
|
100 | - } |
|
101 | - if (! in_array($id_prefix, $post_related_cache[ $post_ID ], true)) { |
|
102 | - // add cache id to be tracked |
|
103 | - $post_related_cache[ $post_ID ][] = $id_prefix; |
|
104 | - $this->updatePostRelatedCache($post_related_cache); |
|
105 | - } |
|
106 | - } |
|
107 | - |
|
108 | - |
|
109 | - /** |
|
110 | - * callback hooked into the WordPress "save_post" action |
|
111 | - * deletes any cache content associated with the post |
|
112 | - * |
|
113 | - * @param int $post_ID [required] |
|
114 | - */ |
|
115 | - public function clearPostRelatedCache($post_ID) |
|
116 | - { |
|
117 | - $post_related_cache = $this->getPostRelatedCache(); |
|
118 | - // if post is not being tracked |
|
119 | - if (! isset($post_related_cache[ $post_ID ])) { |
|
120 | - // let's clean up some of the duplicate IDs that were getting added |
|
121 | - foreach ($post_related_cache as $other_post_ID => $cache_IDs) { |
|
122 | - // remove duplicates |
|
123 | - $post_related_cache[ $other_post_ID ] = array_unique($post_related_cache[ $other_post_ID ]); |
|
124 | - } |
|
125 | - $this->updatePostRelatedCache($post_related_cache); |
|
126 | - return; |
|
127 | - } |
|
128 | - // get cache id prefixes for post, and delete their corresponding transients |
|
129 | - $this->clear($post_related_cache[ $post_ID ]); |
|
130 | - unset($post_related_cache[ $post_ID ]); |
|
131 | - $this->updatePostRelatedCache($post_related_cache); |
|
132 | - } |
|
16 | + /** |
|
17 | + * @type string |
|
18 | + */ |
|
19 | + const POST_CACHE_PREFIX = 'ee_cache_post_'; |
|
20 | + |
|
21 | + /** |
|
22 | + * wp-option option_name for tracking post related cache |
|
23 | + * |
|
24 | + * @type string |
|
25 | + */ |
|
26 | + const POST_CACHE_OPTIONS_KEY = 'ee_post_cache'; |
|
27 | + |
|
28 | + |
|
29 | + /** |
|
30 | + * PostRelatedCacheManager constructor. |
|
31 | + * |
|
32 | + * @param CacheStorageInterface $cache_storage |
|
33 | + */ |
|
34 | + public function __construct(CacheStorageInterface $cache_storage) |
|
35 | + { |
|
36 | + parent::__construct($cache_storage); |
|
37 | + add_action('save_post', array($this, 'clearPostRelatedCache')); |
|
38 | + } |
|
39 | + |
|
40 | + |
|
41 | + /** |
|
42 | + * returns a string that will be prepended to all cache identifiers |
|
43 | + * |
|
44 | + * @return string |
|
45 | + */ |
|
46 | + public function cachePrefix() |
|
47 | + { |
|
48 | + return PostRelatedCacheManager::POST_CACHE_PREFIX; |
|
49 | + } |
|
50 | + |
|
51 | + |
|
52 | + /** |
|
53 | + * @return array |
|
54 | + */ |
|
55 | + protected function getPostRelatedCache() |
|
56 | + { |
|
57 | + $post_related_cache = get_option(PostRelatedCacheManager::POST_CACHE_OPTIONS_KEY, array()); |
|
58 | + // verify that cached data was not truncated or corrupted and no longer an array |
|
59 | + if (! is_array($post_related_cache)) { |
|
60 | + // uh-oh... let's get rid of any transients using our cache prefix |
|
61 | + $this->clear(PostRelatedCacheManager::CACHE_PREFIX); |
|
62 | + // then update the post related cache tracking option |
|
63 | + $post_related_cache = array(); |
|
64 | + $this->updatePostRelatedCache($post_related_cache); |
|
65 | + } |
|
66 | + return $post_related_cache; |
|
67 | + } |
|
68 | + |
|
69 | + |
|
70 | + /** |
|
71 | + * @param array $post_related_cache |
|
72 | + */ |
|
73 | + protected function updatePostRelatedCache(array $post_related_cache = array()) |
|
74 | + { |
|
75 | + update_option(PostRelatedCacheManager::POST_CACHE_OPTIONS_KEY, $post_related_cache); |
|
76 | + } |
|
77 | + |
|
78 | + |
|
79 | + /** |
|
80 | + * If you are caching content that pertains to a Post of any type, |
|
81 | + * then it is recommended to pass the post id and cache id prefix to this method |
|
82 | + * so that it can be added to the post related cache tracking. |
|
83 | + * Then, whenever that post is updated, the cache will automatically be deleted, |
|
84 | + * which helps to ensure that outdated cache content will not be served |
|
85 | + * |
|
86 | + * @param int $post_ID [required] |
|
87 | + * @param string $id_prefix [required] Appended to all cache IDs. Can be helpful in finding specific cache types. |
|
88 | + * May also be helpful to include an additional specific identifier, |
|
89 | + * such as a post ID as part of the $id_prefix so that individual caches |
|
90 | + * can be found and/or cleared. ex: "venue-28", or "shortcode-156". |
|
91 | + * BasicCacheManager::CACHE_PREFIX will also be prepended to the cache id. |
|
92 | + */ |
|
93 | + public function clearPostRelatedCacheOnUpdate($post_ID, $id_prefix) |
|
94 | + { |
|
95 | + $post_related_cache = $this->getPostRelatedCache(); |
|
96 | + // if post is not already being tracked |
|
97 | + if (! isset($post_related_cache[ $post_ID ])) { |
|
98 | + // add array to add cache ids to |
|
99 | + $post_related_cache[ $post_ID ] = array(); |
|
100 | + } |
|
101 | + if (! in_array($id_prefix, $post_related_cache[ $post_ID ], true)) { |
|
102 | + // add cache id to be tracked |
|
103 | + $post_related_cache[ $post_ID ][] = $id_prefix; |
|
104 | + $this->updatePostRelatedCache($post_related_cache); |
|
105 | + } |
|
106 | + } |
|
107 | + |
|
108 | + |
|
109 | + /** |
|
110 | + * callback hooked into the WordPress "save_post" action |
|
111 | + * deletes any cache content associated with the post |
|
112 | + * |
|
113 | + * @param int $post_ID [required] |
|
114 | + */ |
|
115 | + public function clearPostRelatedCache($post_ID) |
|
116 | + { |
|
117 | + $post_related_cache = $this->getPostRelatedCache(); |
|
118 | + // if post is not being tracked |
|
119 | + if (! isset($post_related_cache[ $post_ID ])) { |
|
120 | + // let's clean up some of the duplicate IDs that were getting added |
|
121 | + foreach ($post_related_cache as $other_post_ID => $cache_IDs) { |
|
122 | + // remove duplicates |
|
123 | + $post_related_cache[ $other_post_ID ] = array_unique($post_related_cache[ $other_post_ID ]); |
|
124 | + } |
|
125 | + $this->updatePostRelatedCache($post_related_cache); |
|
126 | + return; |
|
127 | + } |
|
128 | + // get cache id prefixes for post, and delete their corresponding transients |
|
129 | + $this->clear($post_related_cache[ $post_ID ]); |
|
130 | + unset($post_related_cache[ $post_ID ]); |
|
131 | + $this->updatePostRelatedCache($post_related_cache); |
|
132 | + } |
|
133 | 133 | } |
@@ -56,7 +56,7 @@ discard block |
||
56 | 56 | { |
57 | 57 | $post_related_cache = get_option(PostRelatedCacheManager::POST_CACHE_OPTIONS_KEY, array()); |
58 | 58 | // verify that cached data was not truncated or corrupted and no longer an array |
59 | - if (! is_array($post_related_cache)) { |
|
59 | + if ( ! is_array($post_related_cache)) { |
|
60 | 60 | // uh-oh... let's get rid of any transients using our cache prefix |
61 | 61 | $this->clear(PostRelatedCacheManager::CACHE_PREFIX); |
62 | 62 | // then update the post related cache tracking option |
@@ -94,13 +94,13 @@ discard block |
||
94 | 94 | { |
95 | 95 | $post_related_cache = $this->getPostRelatedCache(); |
96 | 96 | // if post is not already being tracked |
97 | - if (! isset($post_related_cache[ $post_ID ])) { |
|
97 | + if ( ! isset($post_related_cache[$post_ID])) { |
|
98 | 98 | // add array to add cache ids to |
99 | - $post_related_cache[ $post_ID ] = array(); |
|
99 | + $post_related_cache[$post_ID] = array(); |
|
100 | 100 | } |
101 | - if (! in_array($id_prefix, $post_related_cache[ $post_ID ], true)) { |
|
101 | + if ( ! in_array($id_prefix, $post_related_cache[$post_ID], true)) { |
|
102 | 102 | // add cache id to be tracked |
103 | - $post_related_cache[ $post_ID ][] = $id_prefix; |
|
103 | + $post_related_cache[$post_ID][] = $id_prefix; |
|
104 | 104 | $this->updatePostRelatedCache($post_related_cache); |
105 | 105 | } |
106 | 106 | } |
@@ -116,18 +116,18 @@ discard block |
||
116 | 116 | { |
117 | 117 | $post_related_cache = $this->getPostRelatedCache(); |
118 | 118 | // if post is not being tracked |
119 | - if (! isset($post_related_cache[ $post_ID ])) { |
|
119 | + if ( ! isset($post_related_cache[$post_ID])) { |
|
120 | 120 | // let's clean up some of the duplicate IDs that were getting added |
121 | 121 | foreach ($post_related_cache as $other_post_ID => $cache_IDs) { |
122 | 122 | // remove duplicates |
123 | - $post_related_cache[ $other_post_ID ] = array_unique($post_related_cache[ $other_post_ID ]); |
|
123 | + $post_related_cache[$other_post_ID] = array_unique($post_related_cache[$other_post_ID]); |
|
124 | 124 | } |
125 | 125 | $this->updatePostRelatedCache($post_related_cache); |
126 | 126 | return; |
127 | 127 | } |
128 | 128 | // get cache id prefixes for post, and delete their corresponding transients |
129 | - $this->clear($post_related_cache[ $post_ID ]); |
|
130 | - unset($post_related_cache[ $post_ID ]); |
|
129 | + $this->clear($post_related_cache[$post_ID]); |
|
130 | + unset($post_related_cache[$post_ID]); |
|
131 | 131 | $this->updatePostRelatedCache($post_related_cache); |
132 | 132 | } |
133 | 133 | } |
@@ -16,366 +16,366 @@ |
||
16 | 16 | class TransientCacheStorage implements CacheStorageInterface |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * wp-option option_name for tracking transients |
|
21 | - * |
|
22 | - * @type string |
|
23 | - */ |
|
24 | - const TRANSIENT_SCHEDULE_OPTIONS_KEY = 'ee_transient_schedule'; |
|
25 | - |
|
26 | - /** |
|
27 | - * @var int $current_time |
|
28 | - */ |
|
29 | - private $current_time; |
|
30 | - |
|
31 | - /** |
|
32 | - * how often to perform transient cleanup |
|
33 | - * |
|
34 | - * @var string $transient_cleanup_frequency |
|
35 | - */ |
|
36 | - private $transient_cleanup_frequency; |
|
37 | - |
|
38 | - /** |
|
39 | - * options for how often to perform transient cleanup |
|
40 | - * |
|
41 | - * @var array $transient_cleanup_frequency_options |
|
42 | - */ |
|
43 | - private $transient_cleanup_frequency_options = array(); |
|
44 | - |
|
45 | - /** |
|
46 | - * @var array $transients |
|
47 | - */ |
|
48 | - private $transients; |
|
49 | - |
|
50 | - |
|
51 | - /** |
|
52 | - * TransientCacheStorage constructor. |
|
53 | - */ |
|
54 | - public function __construct() |
|
55 | - { |
|
56 | - $this->transient_cleanup_frequency = $this->setTransientCleanupFrequency(); |
|
57 | - // round current time down to closest 5 minutes to simplify scheduling |
|
58 | - $this->current_time = $this->roundTimestamp(time(), '5-minutes', false); |
|
59 | - $this->transients = (array) get_option(TransientCacheStorage::TRANSIENT_SCHEDULE_OPTIONS_KEY, array()); |
|
60 | - if (! (defined('DOING_AJAX') && DOING_AJAX) && $this->transient_cleanup_frequency !== 'off') { |
|
61 | - add_action('shutdown', array($this, 'checkTransientCleanupSchedule'), 999); |
|
62 | - } |
|
63 | - } |
|
64 | - |
|
65 | - |
|
66 | - /** |
|
67 | - * Sets how often transient cleanup occurs |
|
68 | - * |
|
69 | - * @return string |
|
70 | - */ |
|
71 | - private function setTransientCleanupFrequency() |
|
72 | - { |
|
73 | - // sets how often transients are cleaned up |
|
74 | - $this->transient_cleanup_frequency_options = apply_filters( |
|
75 | - 'FHEE__TransientCacheStorage__transient_cleanup_schedule_options', |
|
76 | - array( |
|
77 | - 'off', |
|
78 | - '15-minutes', |
|
79 | - 'hour', |
|
80 | - '12-hours', |
|
81 | - 'day', |
|
82 | - ) |
|
83 | - ); |
|
84 | - $transient_cleanup_frequency = apply_filters( |
|
85 | - 'FHEE__TransientCacheStorage__transient_cleanup_schedule', |
|
86 | - 'hour' |
|
87 | - ); |
|
88 | - return in_array( |
|
89 | - $transient_cleanup_frequency, |
|
90 | - $this->transient_cleanup_frequency_options, |
|
91 | - true |
|
92 | - ) |
|
93 | - ? $transient_cleanup_frequency |
|
94 | - : 'hour'; |
|
95 | - } |
|
96 | - |
|
97 | - |
|
98 | - /** |
|
99 | - * we need to be able to round timestamps off to match the set transient cleanup frequency |
|
100 | - * so if a transient is set to expire at 1:17 pm for example, and our cleanup schedule is every hour, |
|
101 | - * then that timestamp needs to be rounded up to 2:00 pm so that it is removed |
|
102 | - * during the next scheduled cleanup after its expiration. |
|
103 | - * We also round off the current time timestamp to the closest 5 minutes |
|
104 | - * just to make the timestamps a little easier to round which helps with debugging. |
|
105 | - * |
|
106 | - * @param int $timestamp [required] |
|
107 | - * @param string $cleanup_frequency |
|
108 | - * @param bool $round_up |
|
109 | - * @return int |
|
110 | - */ |
|
111 | - private function roundTimestamp($timestamp, $cleanup_frequency = 'hour', $round_up = true) |
|
112 | - { |
|
113 | - $cleanup_frequency = $cleanup_frequency ? $cleanup_frequency : $this->transient_cleanup_frequency; |
|
114 | - // in order to round the time to the closest xx minutes (or hours), |
|
115 | - // we take the minutes (or hours) portion of the timestamp and divide it by xx, |
|
116 | - // round down to a whole number, then multiply by xx to bring us almost back up to where we were |
|
117 | - // why round down ? so the minutes (or hours) don't go over 60 (or 24) |
|
118 | - // and bump the hour, which could bump the day, which could bump the month, etc, |
|
119 | - // which would be bad because we don't always want to round up, |
|
120 | - // but when we do we can easily achieve that by simply adding the desired offset, |
|
121 | - $minutes = '00'; |
|
122 | - $hours = 'H'; |
|
123 | - switch ($cleanup_frequency) { |
|
124 | - case '5-minutes': |
|
125 | - $minutes = floor((int) date('i', $timestamp) / 5) * 5; |
|
126 | - $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); |
|
127 | - $offset = MINUTE_IN_SECONDS * 5; |
|
128 | - break; |
|
129 | - case '15-minutes': |
|
130 | - $minutes = floor((int) date('i', $timestamp) / 15) * 15; |
|
131 | - $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); |
|
132 | - $offset = MINUTE_IN_SECONDS * 15; |
|
133 | - break; |
|
134 | - case '12-hours': |
|
135 | - $hours = floor((int) date('H', $timestamp) / 12) * 12; |
|
136 | - $hours = str_pad($hours, 2, '0', STR_PAD_LEFT); |
|
137 | - $offset = HOUR_IN_SECONDS * 12; |
|
138 | - break; |
|
139 | - case 'day': |
|
140 | - $hours = '03'; // run cleanup at 3:00 am (or first site hit after that) |
|
141 | - $offset = DAY_IN_SECONDS; |
|
142 | - break; |
|
143 | - case 'hour': |
|
144 | - default: |
|
145 | - $offset = HOUR_IN_SECONDS; |
|
146 | - break; |
|
147 | - } |
|
148 | - $rounded_timestamp = (int) strtotime(date("Y-m-d {$hours}:{$minutes}:00", $timestamp)); |
|
149 | - $rounded_timestamp += $round_up ? $offset : 0; |
|
150 | - return apply_filters( |
|
151 | - 'FHEE__TransientCacheStorage__roundTimestamp__timestamp', |
|
152 | - $rounded_timestamp, |
|
153 | - $timestamp, |
|
154 | - $cleanup_frequency, |
|
155 | - $round_up |
|
156 | - ); |
|
157 | - } |
|
158 | - |
|
159 | - |
|
160 | - /** |
|
161 | - * Saves supplied data to a transient |
|
162 | - * if an expiration is set, then it automatically schedules the transient for cleanup |
|
163 | - * |
|
164 | - * @param string $transient_key [required] |
|
165 | - * @param string $data [required] |
|
166 | - * @param int $expiration number of seconds until the cache expires |
|
167 | - * @return bool |
|
168 | - */ |
|
169 | - public function add($transient_key, $data, $expiration = 0) |
|
170 | - { |
|
171 | - $expiration = (int) abs($expiration); |
|
172 | - $saved = set_transient($transient_key, $data, $expiration); |
|
173 | - if ($saved && $expiration) { |
|
174 | - $this->scheduleTransientCleanup($transient_key, $expiration); |
|
175 | - } |
|
176 | - return $saved; |
|
177 | - } |
|
178 | - |
|
179 | - |
|
180 | - /** |
|
181 | - * retrieves transient data |
|
182 | - * automatically triggers early cache refresh for standard cache items |
|
183 | - * in order to avoid cache stampedes on busy sites. |
|
184 | - * For non-standard cache items like PHP Session data where early refreshing is not wanted, |
|
185 | - * the $standard_cache parameter should be set to false when retrieving data |
|
186 | - * |
|
187 | - * @param string $transient_key [required] |
|
188 | - * @param bool $standard_cache |
|
189 | - * @return mixed|null |
|
190 | - */ |
|
191 | - public function get($transient_key, $standard_cache = true) |
|
192 | - { |
|
193 | - if (isset($this->transients[ $transient_key ])) { |
|
194 | - // to avoid cache stampedes (AKA:dogpiles) for standard cache items, |
|
195 | - // check if known cache expires within the next minute, |
|
196 | - // and if so, remove it from our tracking and and return nothing. |
|
197 | - // this should trigger the cache content to be regenerated during this request, |
|
198 | - // while allowing any following requests to still access the existing cache |
|
199 | - // until it gets replaced with the refreshed content |
|
200 | - if ($standard_cache |
|
201 | - && $this->transients[ $transient_key ] - time() <= MINUTE_IN_SECONDS |
|
202 | - ) { |
|
203 | - unset($this->transients[ $transient_key ]); |
|
204 | - $this->updateTransients(); |
|
205 | - return null; |
|
206 | - } |
|
207 | - |
|
208 | - // for non standard cache items, remove the key from our tracking, |
|
209 | - // but proceed to retrieve the transient so that it also gets removed from the db |
|
210 | - if ($this->transients[ $transient_key ] <= time()) { |
|
211 | - unset($this->transients[ $transient_key ]); |
|
212 | - $this->updateTransients(); |
|
213 | - } |
|
214 | - } |
|
215 | - |
|
216 | - $content = get_transient($transient_key); |
|
217 | - return $content !== false ? $content : null; |
|
218 | - } |
|
219 | - |
|
220 | - |
|
221 | - /** |
|
222 | - * delete a single transient and remove tracking |
|
223 | - * |
|
224 | - * @param string $transient_key [required] full or partial transient key to be deleted |
|
225 | - */ |
|
226 | - public function delete($transient_key) |
|
227 | - { |
|
228 | - $this->deleteMany(array($transient_key)); |
|
229 | - } |
|
230 | - |
|
231 | - |
|
232 | - /** |
|
233 | - * delete multiple transients and remove tracking |
|
234 | - * |
|
235 | - * @param array $transient_keys [required] array of full or partial transient keys to be deleted |
|
236 | - * @param bool $force_delete [optional] if true, then will not check incoming keys against those being tracked |
|
237 | - * and proceed directly to deleting those entries from the cache storage |
|
238 | - */ |
|
239 | - public function deleteMany(array $transient_keys, $force_delete = false) |
|
240 | - { |
|
241 | - $full_transient_keys = $force_delete ? $transient_keys : array(); |
|
242 | - if (empty($full_transient_keys)) { |
|
243 | - foreach ($this->transients as $transient_key => $expiration) { |
|
244 | - foreach ($transient_keys as $transient_key_to_delete) { |
|
245 | - if (strpos($transient_key, $transient_key_to_delete) !== false) { |
|
246 | - $full_transient_keys[] = $transient_key; |
|
247 | - } |
|
248 | - } |
|
249 | - } |
|
250 | - } |
|
251 | - if ($this->deleteTransientKeys($full_transient_keys)) { |
|
252 | - $this->updateTransients(); |
|
253 | - } |
|
254 | - } |
|
255 | - |
|
256 | - |
|
257 | - /** |
|
258 | - * sorts transients numerically by timestamp |
|
259 | - * then saves the transient schedule to a WP option |
|
260 | - */ |
|
261 | - private function updateTransients() |
|
262 | - { |
|
263 | - asort($this->transients, SORT_NUMERIC); |
|
264 | - update_option( |
|
265 | - TransientCacheStorage::TRANSIENT_SCHEDULE_OPTIONS_KEY, |
|
266 | - $this->transients |
|
267 | - ); |
|
268 | - } |
|
269 | - |
|
270 | - |
|
271 | - /** |
|
272 | - * schedules a transient for cleanup by adding it to the transient tracking |
|
273 | - * |
|
274 | - * @param string $transient_key [required] |
|
275 | - * @param int $expiration [required] |
|
276 | - */ |
|
277 | - private function scheduleTransientCleanup($transient_key, $expiration) |
|
278 | - { |
|
279 | - // make sure a valid future timestamp is set |
|
280 | - $expiration += $expiration < time() ? time() : 0; |
|
281 | - // and round to the closest 15 minutes |
|
282 | - $expiration = $this->roundTimestamp($expiration); |
|
283 | - // save transients to clear using their ID as the key to avoid duplicates |
|
284 | - $this->transients[ $transient_key ] = $expiration; |
|
285 | - $this->updateTransients(); |
|
286 | - } |
|
287 | - |
|
288 | - |
|
289 | - /** |
|
290 | - * Since our tracked transients are sorted by their timestamps |
|
291 | - * we can grab the first transient and see when it is scheduled for cleanup. |
|
292 | - * If that timestamp is less than or equal to the current time, |
|
293 | - * then cleanup is triggered |
|
294 | - */ |
|
295 | - public function checkTransientCleanupSchedule() |
|
296 | - { |
|
297 | - if (empty($this->transients)) { |
|
298 | - return; |
|
299 | - } |
|
300 | - // when do we run the next cleanup job? |
|
301 | - reset($this->transients); |
|
302 | - $next_scheduled_cleanup = current($this->transients); |
|
303 | - // if the next cleanup job is scheduled for the current hour |
|
304 | - if ($next_scheduled_cleanup <= $this->current_time) { |
|
305 | - if ($this->cleanupExpiredTransients()) { |
|
306 | - $this->updateTransients(); |
|
307 | - } |
|
308 | - } |
|
309 | - } |
|
310 | - |
|
311 | - |
|
312 | - /** |
|
313 | - * loops through the array of tracked transients, |
|
314 | - * compiles a list of those that have expired, and sends that list off for deletion. |
|
315 | - * Also removes any bad records from the transients array |
|
316 | - * |
|
317 | - * @return bool |
|
318 | - */ |
|
319 | - private function cleanupExpiredTransients() |
|
320 | - { |
|
321 | - $update = false; |
|
322 | - // filter the query limit. Set to 0 to turn off garbage collection |
|
323 | - $limit = (int) abs( |
|
324 | - apply_filters( |
|
325 | - 'FHEE__TransientCacheStorage__clearExpiredTransients__limit', |
|
326 | - 50 |
|
327 | - ) |
|
328 | - ); |
|
329 | - // non-zero LIMIT means take out the trash |
|
330 | - if ($limit) { |
|
331 | - $transient_keys = array(); |
|
332 | - foreach ($this->transients as $transient_key => $expiration) { |
|
333 | - if ($expiration > $this->current_time) { |
|
334 | - continue; |
|
335 | - } |
|
336 | - if (! $expiration || ! $transient_key) { |
|
337 | - unset($this->transients[ $transient_key ]); |
|
338 | - $update = true; |
|
339 | - continue; |
|
340 | - } |
|
341 | - $transient_keys[] = $transient_key; |
|
342 | - } |
|
343 | - // delete expired keys, but maintain value of $update if nothing is deleted |
|
344 | - $update = $this->deleteTransientKeys($transient_keys, $limit) ? true : $update; |
|
345 | - do_action('FHEE__TransientCacheStorage__clearExpiredTransients__end', $this); |
|
346 | - } |
|
347 | - return $update; |
|
348 | - } |
|
349 | - |
|
350 | - |
|
351 | - /** |
|
352 | - * calls delete_transient() on each transient key provided, up to the specified limit |
|
353 | - * |
|
354 | - * @param array $transient_keys [required] |
|
355 | - * @param int $limit |
|
356 | - * @return bool |
|
357 | - */ |
|
358 | - private function deleteTransientKeys(array $transient_keys, $limit = 50) |
|
359 | - { |
|
360 | - if (empty($transient_keys)) { |
|
361 | - return false; |
|
362 | - } |
|
363 | - $counter = 0; |
|
364 | - foreach ($transient_keys as $transient_key) { |
|
365 | - if ($counter === $limit) { |
|
366 | - break; |
|
367 | - } |
|
368 | - // remove any transient prefixes |
|
369 | - $transient_key = strpos($transient_key, '_transient_timeout_') === 0 |
|
370 | - ? str_replace('_transient_timeout_', '', $transient_key) |
|
371 | - : $transient_key; |
|
372 | - $transient_key = strpos($transient_key, '_transient_') === 0 |
|
373 | - ? str_replace('_transient_', '', $transient_key) |
|
374 | - : $transient_key; |
|
375 | - delete_transient($transient_key); |
|
376 | - unset($this->transients[ $transient_key ]); |
|
377 | - $counter++; |
|
378 | - } |
|
379 | - return $counter > 0; |
|
380 | - } |
|
19 | + /** |
|
20 | + * wp-option option_name for tracking transients |
|
21 | + * |
|
22 | + * @type string |
|
23 | + */ |
|
24 | + const TRANSIENT_SCHEDULE_OPTIONS_KEY = 'ee_transient_schedule'; |
|
25 | + |
|
26 | + /** |
|
27 | + * @var int $current_time |
|
28 | + */ |
|
29 | + private $current_time; |
|
30 | + |
|
31 | + /** |
|
32 | + * how often to perform transient cleanup |
|
33 | + * |
|
34 | + * @var string $transient_cleanup_frequency |
|
35 | + */ |
|
36 | + private $transient_cleanup_frequency; |
|
37 | + |
|
38 | + /** |
|
39 | + * options for how often to perform transient cleanup |
|
40 | + * |
|
41 | + * @var array $transient_cleanup_frequency_options |
|
42 | + */ |
|
43 | + private $transient_cleanup_frequency_options = array(); |
|
44 | + |
|
45 | + /** |
|
46 | + * @var array $transients |
|
47 | + */ |
|
48 | + private $transients; |
|
49 | + |
|
50 | + |
|
51 | + /** |
|
52 | + * TransientCacheStorage constructor. |
|
53 | + */ |
|
54 | + public function __construct() |
|
55 | + { |
|
56 | + $this->transient_cleanup_frequency = $this->setTransientCleanupFrequency(); |
|
57 | + // round current time down to closest 5 minutes to simplify scheduling |
|
58 | + $this->current_time = $this->roundTimestamp(time(), '5-minutes', false); |
|
59 | + $this->transients = (array) get_option(TransientCacheStorage::TRANSIENT_SCHEDULE_OPTIONS_KEY, array()); |
|
60 | + if (! (defined('DOING_AJAX') && DOING_AJAX) && $this->transient_cleanup_frequency !== 'off') { |
|
61 | + add_action('shutdown', array($this, 'checkTransientCleanupSchedule'), 999); |
|
62 | + } |
|
63 | + } |
|
64 | + |
|
65 | + |
|
66 | + /** |
|
67 | + * Sets how often transient cleanup occurs |
|
68 | + * |
|
69 | + * @return string |
|
70 | + */ |
|
71 | + private function setTransientCleanupFrequency() |
|
72 | + { |
|
73 | + // sets how often transients are cleaned up |
|
74 | + $this->transient_cleanup_frequency_options = apply_filters( |
|
75 | + 'FHEE__TransientCacheStorage__transient_cleanup_schedule_options', |
|
76 | + array( |
|
77 | + 'off', |
|
78 | + '15-minutes', |
|
79 | + 'hour', |
|
80 | + '12-hours', |
|
81 | + 'day', |
|
82 | + ) |
|
83 | + ); |
|
84 | + $transient_cleanup_frequency = apply_filters( |
|
85 | + 'FHEE__TransientCacheStorage__transient_cleanup_schedule', |
|
86 | + 'hour' |
|
87 | + ); |
|
88 | + return in_array( |
|
89 | + $transient_cleanup_frequency, |
|
90 | + $this->transient_cleanup_frequency_options, |
|
91 | + true |
|
92 | + ) |
|
93 | + ? $transient_cleanup_frequency |
|
94 | + : 'hour'; |
|
95 | + } |
|
96 | + |
|
97 | + |
|
98 | + /** |
|
99 | + * we need to be able to round timestamps off to match the set transient cleanup frequency |
|
100 | + * so if a transient is set to expire at 1:17 pm for example, and our cleanup schedule is every hour, |
|
101 | + * then that timestamp needs to be rounded up to 2:00 pm so that it is removed |
|
102 | + * during the next scheduled cleanup after its expiration. |
|
103 | + * We also round off the current time timestamp to the closest 5 minutes |
|
104 | + * just to make the timestamps a little easier to round which helps with debugging. |
|
105 | + * |
|
106 | + * @param int $timestamp [required] |
|
107 | + * @param string $cleanup_frequency |
|
108 | + * @param bool $round_up |
|
109 | + * @return int |
|
110 | + */ |
|
111 | + private function roundTimestamp($timestamp, $cleanup_frequency = 'hour', $round_up = true) |
|
112 | + { |
|
113 | + $cleanup_frequency = $cleanup_frequency ? $cleanup_frequency : $this->transient_cleanup_frequency; |
|
114 | + // in order to round the time to the closest xx minutes (or hours), |
|
115 | + // we take the minutes (or hours) portion of the timestamp and divide it by xx, |
|
116 | + // round down to a whole number, then multiply by xx to bring us almost back up to where we were |
|
117 | + // why round down ? so the minutes (or hours) don't go over 60 (or 24) |
|
118 | + // and bump the hour, which could bump the day, which could bump the month, etc, |
|
119 | + // which would be bad because we don't always want to round up, |
|
120 | + // but when we do we can easily achieve that by simply adding the desired offset, |
|
121 | + $minutes = '00'; |
|
122 | + $hours = 'H'; |
|
123 | + switch ($cleanup_frequency) { |
|
124 | + case '5-minutes': |
|
125 | + $minutes = floor((int) date('i', $timestamp) / 5) * 5; |
|
126 | + $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); |
|
127 | + $offset = MINUTE_IN_SECONDS * 5; |
|
128 | + break; |
|
129 | + case '15-minutes': |
|
130 | + $minutes = floor((int) date('i', $timestamp) / 15) * 15; |
|
131 | + $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT); |
|
132 | + $offset = MINUTE_IN_SECONDS * 15; |
|
133 | + break; |
|
134 | + case '12-hours': |
|
135 | + $hours = floor((int) date('H', $timestamp) / 12) * 12; |
|
136 | + $hours = str_pad($hours, 2, '0', STR_PAD_LEFT); |
|
137 | + $offset = HOUR_IN_SECONDS * 12; |
|
138 | + break; |
|
139 | + case 'day': |
|
140 | + $hours = '03'; // run cleanup at 3:00 am (or first site hit after that) |
|
141 | + $offset = DAY_IN_SECONDS; |
|
142 | + break; |
|
143 | + case 'hour': |
|
144 | + default: |
|
145 | + $offset = HOUR_IN_SECONDS; |
|
146 | + break; |
|
147 | + } |
|
148 | + $rounded_timestamp = (int) strtotime(date("Y-m-d {$hours}:{$minutes}:00", $timestamp)); |
|
149 | + $rounded_timestamp += $round_up ? $offset : 0; |
|
150 | + return apply_filters( |
|
151 | + 'FHEE__TransientCacheStorage__roundTimestamp__timestamp', |
|
152 | + $rounded_timestamp, |
|
153 | + $timestamp, |
|
154 | + $cleanup_frequency, |
|
155 | + $round_up |
|
156 | + ); |
|
157 | + } |
|
158 | + |
|
159 | + |
|
160 | + /** |
|
161 | + * Saves supplied data to a transient |
|
162 | + * if an expiration is set, then it automatically schedules the transient for cleanup |
|
163 | + * |
|
164 | + * @param string $transient_key [required] |
|
165 | + * @param string $data [required] |
|
166 | + * @param int $expiration number of seconds until the cache expires |
|
167 | + * @return bool |
|
168 | + */ |
|
169 | + public function add($transient_key, $data, $expiration = 0) |
|
170 | + { |
|
171 | + $expiration = (int) abs($expiration); |
|
172 | + $saved = set_transient($transient_key, $data, $expiration); |
|
173 | + if ($saved && $expiration) { |
|
174 | + $this->scheduleTransientCleanup($transient_key, $expiration); |
|
175 | + } |
|
176 | + return $saved; |
|
177 | + } |
|
178 | + |
|
179 | + |
|
180 | + /** |
|
181 | + * retrieves transient data |
|
182 | + * automatically triggers early cache refresh for standard cache items |
|
183 | + * in order to avoid cache stampedes on busy sites. |
|
184 | + * For non-standard cache items like PHP Session data where early refreshing is not wanted, |
|
185 | + * the $standard_cache parameter should be set to false when retrieving data |
|
186 | + * |
|
187 | + * @param string $transient_key [required] |
|
188 | + * @param bool $standard_cache |
|
189 | + * @return mixed|null |
|
190 | + */ |
|
191 | + public function get($transient_key, $standard_cache = true) |
|
192 | + { |
|
193 | + if (isset($this->transients[ $transient_key ])) { |
|
194 | + // to avoid cache stampedes (AKA:dogpiles) for standard cache items, |
|
195 | + // check if known cache expires within the next minute, |
|
196 | + // and if so, remove it from our tracking and and return nothing. |
|
197 | + // this should trigger the cache content to be regenerated during this request, |
|
198 | + // while allowing any following requests to still access the existing cache |
|
199 | + // until it gets replaced with the refreshed content |
|
200 | + if ($standard_cache |
|
201 | + && $this->transients[ $transient_key ] - time() <= MINUTE_IN_SECONDS |
|
202 | + ) { |
|
203 | + unset($this->transients[ $transient_key ]); |
|
204 | + $this->updateTransients(); |
|
205 | + return null; |
|
206 | + } |
|
207 | + |
|
208 | + // for non standard cache items, remove the key from our tracking, |
|
209 | + // but proceed to retrieve the transient so that it also gets removed from the db |
|
210 | + if ($this->transients[ $transient_key ] <= time()) { |
|
211 | + unset($this->transients[ $transient_key ]); |
|
212 | + $this->updateTransients(); |
|
213 | + } |
|
214 | + } |
|
215 | + |
|
216 | + $content = get_transient($transient_key); |
|
217 | + return $content !== false ? $content : null; |
|
218 | + } |
|
219 | + |
|
220 | + |
|
221 | + /** |
|
222 | + * delete a single transient and remove tracking |
|
223 | + * |
|
224 | + * @param string $transient_key [required] full or partial transient key to be deleted |
|
225 | + */ |
|
226 | + public function delete($transient_key) |
|
227 | + { |
|
228 | + $this->deleteMany(array($transient_key)); |
|
229 | + } |
|
230 | + |
|
231 | + |
|
232 | + /** |
|
233 | + * delete multiple transients and remove tracking |
|
234 | + * |
|
235 | + * @param array $transient_keys [required] array of full or partial transient keys to be deleted |
|
236 | + * @param bool $force_delete [optional] if true, then will not check incoming keys against those being tracked |
|
237 | + * and proceed directly to deleting those entries from the cache storage |
|
238 | + */ |
|
239 | + public function deleteMany(array $transient_keys, $force_delete = false) |
|
240 | + { |
|
241 | + $full_transient_keys = $force_delete ? $transient_keys : array(); |
|
242 | + if (empty($full_transient_keys)) { |
|
243 | + foreach ($this->transients as $transient_key => $expiration) { |
|
244 | + foreach ($transient_keys as $transient_key_to_delete) { |
|
245 | + if (strpos($transient_key, $transient_key_to_delete) !== false) { |
|
246 | + $full_transient_keys[] = $transient_key; |
|
247 | + } |
|
248 | + } |
|
249 | + } |
|
250 | + } |
|
251 | + if ($this->deleteTransientKeys($full_transient_keys)) { |
|
252 | + $this->updateTransients(); |
|
253 | + } |
|
254 | + } |
|
255 | + |
|
256 | + |
|
257 | + /** |
|
258 | + * sorts transients numerically by timestamp |
|
259 | + * then saves the transient schedule to a WP option |
|
260 | + */ |
|
261 | + private function updateTransients() |
|
262 | + { |
|
263 | + asort($this->transients, SORT_NUMERIC); |
|
264 | + update_option( |
|
265 | + TransientCacheStorage::TRANSIENT_SCHEDULE_OPTIONS_KEY, |
|
266 | + $this->transients |
|
267 | + ); |
|
268 | + } |
|
269 | + |
|
270 | + |
|
271 | + /** |
|
272 | + * schedules a transient for cleanup by adding it to the transient tracking |
|
273 | + * |
|
274 | + * @param string $transient_key [required] |
|
275 | + * @param int $expiration [required] |
|
276 | + */ |
|
277 | + private function scheduleTransientCleanup($transient_key, $expiration) |
|
278 | + { |
|
279 | + // make sure a valid future timestamp is set |
|
280 | + $expiration += $expiration < time() ? time() : 0; |
|
281 | + // and round to the closest 15 minutes |
|
282 | + $expiration = $this->roundTimestamp($expiration); |
|
283 | + // save transients to clear using their ID as the key to avoid duplicates |
|
284 | + $this->transients[ $transient_key ] = $expiration; |
|
285 | + $this->updateTransients(); |
|
286 | + } |
|
287 | + |
|
288 | + |
|
289 | + /** |
|
290 | + * Since our tracked transients are sorted by their timestamps |
|
291 | + * we can grab the first transient and see when it is scheduled for cleanup. |
|
292 | + * If that timestamp is less than or equal to the current time, |
|
293 | + * then cleanup is triggered |
|
294 | + */ |
|
295 | + public function checkTransientCleanupSchedule() |
|
296 | + { |
|
297 | + if (empty($this->transients)) { |
|
298 | + return; |
|
299 | + } |
|
300 | + // when do we run the next cleanup job? |
|
301 | + reset($this->transients); |
|
302 | + $next_scheduled_cleanup = current($this->transients); |
|
303 | + // if the next cleanup job is scheduled for the current hour |
|
304 | + if ($next_scheduled_cleanup <= $this->current_time) { |
|
305 | + if ($this->cleanupExpiredTransients()) { |
|
306 | + $this->updateTransients(); |
|
307 | + } |
|
308 | + } |
|
309 | + } |
|
310 | + |
|
311 | + |
|
312 | + /** |
|
313 | + * loops through the array of tracked transients, |
|
314 | + * compiles a list of those that have expired, and sends that list off for deletion. |
|
315 | + * Also removes any bad records from the transients array |
|
316 | + * |
|
317 | + * @return bool |
|
318 | + */ |
|
319 | + private function cleanupExpiredTransients() |
|
320 | + { |
|
321 | + $update = false; |
|
322 | + // filter the query limit. Set to 0 to turn off garbage collection |
|
323 | + $limit = (int) abs( |
|
324 | + apply_filters( |
|
325 | + 'FHEE__TransientCacheStorage__clearExpiredTransients__limit', |
|
326 | + 50 |
|
327 | + ) |
|
328 | + ); |
|
329 | + // non-zero LIMIT means take out the trash |
|
330 | + if ($limit) { |
|
331 | + $transient_keys = array(); |
|
332 | + foreach ($this->transients as $transient_key => $expiration) { |
|
333 | + if ($expiration > $this->current_time) { |
|
334 | + continue; |
|
335 | + } |
|
336 | + if (! $expiration || ! $transient_key) { |
|
337 | + unset($this->transients[ $transient_key ]); |
|
338 | + $update = true; |
|
339 | + continue; |
|
340 | + } |
|
341 | + $transient_keys[] = $transient_key; |
|
342 | + } |
|
343 | + // delete expired keys, but maintain value of $update if nothing is deleted |
|
344 | + $update = $this->deleteTransientKeys($transient_keys, $limit) ? true : $update; |
|
345 | + do_action('FHEE__TransientCacheStorage__clearExpiredTransients__end', $this); |
|
346 | + } |
|
347 | + return $update; |
|
348 | + } |
|
349 | + |
|
350 | + |
|
351 | + /** |
|
352 | + * calls delete_transient() on each transient key provided, up to the specified limit |
|
353 | + * |
|
354 | + * @param array $transient_keys [required] |
|
355 | + * @param int $limit |
|
356 | + * @return bool |
|
357 | + */ |
|
358 | + private function deleteTransientKeys(array $transient_keys, $limit = 50) |
|
359 | + { |
|
360 | + if (empty($transient_keys)) { |
|
361 | + return false; |
|
362 | + } |
|
363 | + $counter = 0; |
|
364 | + foreach ($transient_keys as $transient_key) { |
|
365 | + if ($counter === $limit) { |
|
366 | + break; |
|
367 | + } |
|
368 | + // remove any transient prefixes |
|
369 | + $transient_key = strpos($transient_key, '_transient_timeout_') === 0 |
|
370 | + ? str_replace('_transient_timeout_', '', $transient_key) |
|
371 | + : $transient_key; |
|
372 | + $transient_key = strpos($transient_key, '_transient_') === 0 |
|
373 | + ? str_replace('_transient_', '', $transient_key) |
|
374 | + : $transient_key; |
|
375 | + delete_transient($transient_key); |
|
376 | + unset($this->transients[ $transient_key ]); |
|
377 | + $counter++; |
|
378 | + } |
|
379 | + return $counter > 0; |
|
380 | + } |
|
381 | 381 | } |
@@ -57,7 +57,7 @@ discard block |
||
57 | 57 | // round current time down to closest 5 minutes to simplify scheduling |
58 | 58 | $this->current_time = $this->roundTimestamp(time(), '5-minutes', false); |
59 | 59 | $this->transients = (array) get_option(TransientCacheStorage::TRANSIENT_SCHEDULE_OPTIONS_KEY, array()); |
60 | - if (! (defined('DOING_AJAX') && DOING_AJAX) && $this->transient_cleanup_frequency !== 'off') { |
|
60 | + if ( ! (defined('DOING_AJAX') && DOING_AJAX) && $this->transient_cleanup_frequency !== 'off') { |
|
61 | 61 | add_action('shutdown', array($this, 'checkTransientCleanupSchedule'), 999); |
62 | 62 | } |
63 | 63 | } |
@@ -190,7 +190,7 @@ discard block |
||
190 | 190 | */ |
191 | 191 | public function get($transient_key, $standard_cache = true) |
192 | 192 | { |
193 | - if (isset($this->transients[ $transient_key ])) { |
|
193 | + if (isset($this->transients[$transient_key])) { |
|
194 | 194 | // to avoid cache stampedes (AKA:dogpiles) for standard cache items, |
195 | 195 | // check if known cache expires within the next minute, |
196 | 196 | // and if so, remove it from our tracking and and return nothing. |
@@ -198,17 +198,17 @@ discard block |
||
198 | 198 | // while allowing any following requests to still access the existing cache |
199 | 199 | // until it gets replaced with the refreshed content |
200 | 200 | if ($standard_cache |
201 | - && $this->transients[ $transient_key ] - time() <= MINUTE_IN_SECONDS |
|
201 | + && $this->transients[$transient_key] - time() <= MINUTE_IN_SECONDS |
|
202 | 202 | ) { |
203 | - unset($this->transients[ $transient_key ]); |
|
203 | + unset($this->transients[$transient_key]); |
|
204 | 204 | $this->updateTransients(); |
205 | 205 | return null; |
206 | 206 | } |
207 | 207 | |
208 | 208 | // for non standard cache items, remove the key from our tracking, |
209 | 209 | // but proceed to retrieve the transient so that it also gets removed from the db |
210 | - if ($this->transients[ $transient_key ] <= time()) { |
|
211 | - unset($this->transients[ $transient_key ]); |
|
210 | + if ($this->transients[$transient_key] <= time()) { |
|
211 | + unset($this->transients[$transient_key]); |
|
212 | 212 | $this->updateTransients(); |
213 | 213 | } |
214 | 214 | } |
@@ -281,7 +281,7 @@ discard block |
||
281 | 281 | // and round to the closest 15 minutes |
282 | 282 | $expiration = $this->roundTimestamp($expiration); |
283 | 283 | // save transients to clear using their ID as the key to avoid duplicates |
284 | - $this->transients[ $transient_key ] = $expiration; |
|
284 | + $this->transients[$transient_key] = $expiration; |
|
285 | 285 | $this->updateTransients(); |
286 | 286 | } |
287 | 287 | |
@@ -333,8 +333,8 @@ discard block |
||
333 | 333 | if ($expiration > $this->current_time) { |
334 | 334 | continue; |
335 | 335 | } |
336 | - if (! $expiration || ! $transient_key) { |
|
337 | - unset($this->transients[ $transient_key ]); |
|
336 | + if ( ! $expiration || ! $transient_key) { |
|
337 | + unset($this->transients[$transient_key]); |
|
338 | 338 | $update = true; |
339 | 339 | continue; |
340 | 340 | } |
@@ -373,7 +373,7 @@ discard block |
||
373 | 373 | ? str_replace('_transient_', '', $transient_key) |
374 | 374 | : $transient_key; |
375 | 375 | delete_transient($transient_key); |
376 | - unset($this->transients[ $transient_key ]); |
|
376 | + unset($this->transients[$transient_key]); |
|
377 | 377 | $counter++; |
378 | 378 | } |
379 | 379 | return $counter > 0; |
@@ -15,324 +15,324 @@ |
||
15 | 15 | class Benchmark |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * @var string $output |
|
20 | - */ |
|
21 | - private static $output; |
|
22 | - |
|
23 | - /** |
|
24 | - * @var array $start_times array containing the start time for the timers |
|
25 | - */ |
|
26 | - private static $start_times; |
|
27 | - |
|
28 | - /** |
|
29 | - * @var array $times array containing all the timer'd times, which can be outputted via show_times() |
|
30 | - */ |
|
31 | - private static $times = array(); |
|
32 | - |
|
33 | - /** |
|
34 | - * @var array $memory_usage |
|
35 | - */ |
|
36 | - protected static $memory_usage = array(); |
|
37 | - |
|
38 | - |
|
39 | - /** |
|
40 | - * @param string $output |
|
41 | - * @param bool $formatted |
|
42 | - */ |
|
43 | - public static function addOutput($output, $formatted = true) |
|
44 | - { |
|
45 | - Benchmark::$output .= $formatted |
|
46 | - ? "<br />{$output}" |
|
47 | - : "\n{$output}"; |
|
48 | - } |
|
49 | - |
|
50 | - |
|
51 | - /** |
|
52 | - * @return void |
|
53 | - */ |
|
54 | - public static function resetOutput() |
|
55 | - { |
|
56 | - Benchmark::$output = ''; |
|
57 | - } |
|
58 | - |
|
59 | - /** |
|
60 | - * whether to benchmark code or not |
|
61 | - */ |
|
62 | - public static function doNotRun() |
|
63 | - { |
|
64 | - return ! WP_DEBUG || (defined('DOING_AJAX') && DOING_AJAX); |
|
65 | - } |
|
66 | - |
|
67 | - |
|
68 | - /** |
|
69 | - * resetTimes |
|
70 | - */ |
|
71 | - public static function resetTimes() |
|
72 | - { |
|
73 | - Benchmark::$times = array(); |
|
74 | - } |
|
75 | - |
|
76 | - |
|
77 | - /** |
|
78 | - * Add Benchmark::startTimer() before a block of code you want to measure the performance of |
|
79 | - * |
|
80 | - * @param null $timer_name |
|
81 | - */ |
|
82 | - public static function startTimer($timer_name = null) |
|
83 | - { |
|
84 | - if (Benchmark::doNotRun()) { |
|
85 | - return; |
|
86 | - } |
|
87 | - $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
|
88 | - Benchmark::$start_times[ $timer_name ] = microtime(true); |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * Add Benchmark::stopTimer() after a block of code you want to measure the performance of |
|
94 | - * |
|
95 | - * @param string $timer_name |
|
96 | - */ |
|
97 | - public static function stopTimer($timer_name = '') |
|
98 | - { |
|
99 | - if (Benchmark::doNotRun()) { |
|
100 | - return; |
|
101 | - } |
|
102 | - $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
|
103 | - if (isset(Benchmark::$start_times[ $timer_name ])) { |
|
104 | - $start_time = Benchmark::$start_times[ $timer_name ]; |
|
105 | - unset(Benchmark::$start_times[ $timer_name ]); |
|
106 | - } else { |
|
107 | - $start_time = array_pop(Benchmark::$start_times); |
|
108 | - } |
|
109 | - Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8); |
|
110 | - } |
|
111 | - |
|
112 | - |
|
113 | - /** |
|
114 | - * Measure the memory usage by PHP so far. |
|
115 | - * |
|
116 | - * @param string $label The label to show for this time eg "Start of calling Some_Class::some_function" |
|
117 | - * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called |
|
118 | - * @param bool $formatted |
|
119 | - * @return void |
|
120 | - */ |
|
121 | - public static function measureMemory($label = 'memory usage', $output_now = false, $formatted = true) |
|
122 | - { |
|
123 | - if (Benchmark::doNotRun()) { |
|
124 | - return; |
|
125 | - } |
|
126 | - $memory_used = Benchmark::convert(memory_get_usage(true)); |
|
127 | - Benchmark::$memory_usage[ $label ] = $memory_used; |
|
128 | - if ($output_now) { |
|
129 | - echo $formatted |
|
130 | - ? "<br>{$label} : {$memory_used}" |
|
131 | - : "\n {$label} : {$memory_used}"; |
|
132 | - } |
|
133 | - } |
|
134 | - |
|
135 | - |
|
136 | - /** |
|
137 | - * will display the benchmarking results at shutdown |
|
138 | - * |
|
139 | - * @param bool $formatted |
|
140 | - * @return void |
|
141 | - */ |
|
142 | - public static function displayResultsAtShutdown($formatted = true) |
|
143 | - { |
|
144 | - Benchmark::resetOutput(); |
|
145 | - add_action( |
|
146 | - 'shutdown', |
|
147 | - function () use ($formatted) { |
|
148 | - Benchmark::displayResults(true, $formatted); |
|
149 | - }, |
|
150 | - 999999 |
|
151 | - ); |
|
152 | - } |
|
153 | - |
|
154 | - |
|
155 | - /** |
|
156 | - * will display the benchmarking results at shutdown |
|
157 | - * |
|
158 | - * @param string $filepath |
|
159 | - * @param bool $formatted |
|
160 | - * @param bool $append |
|
161 | - * @return void |
|
162 | - */ |
|
163 | - public static function writeResultsAtShutdown($filepath = '', $formatted = true, $append = true) |
|
164 | - { |
|
165 | - Benchmark::resetOutput(); |
|
166 | - add_action( |
|
167 | - 'shutdown', |
|
168 | - function () use ($filepath, $formatted, $append) { |
|
169 | - Benchmark::writeResultsToFile($filepath, $formatted, $append); |
|
170 | - }, |
|
171 | - 999999 |
|
172 | - ); |
|
173 | - } |
|
174 | - |
|
175 | - |
|
176 | - /** |
|
177 | - * @param bool $formatted |
|
178 | - * @return string |
|
179 | - */ |
|
180 | - private static function generateResults($formatted = true) |
|
181 | - { |
|
182 | - if (Benchmark::doNotRun()) { |
|
183 | - return ''; |
|
184 | - } |
|
185 | - if (! empty(Benchmark::$times)) { |
|
186 | - $total = 0; |
|
187 | - Benchmark::$output .= $formatted |
|
188 | - ? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />' |
|
189 | - : ''; |
|
190 | - foreach (Benchmark::$times as $timer_name => $total_time) { |
|
191 | - Benchmark::$output .= Benchmark::formatTime($timer_name, $total_time, $formatted); |
|
192 | - Benchmark::$output .= $formatted ? '<br />' : "\n"; |
|
193 | - $total += $total_time; |
|
194 | - } |
|
195 | - if ($formatted) { |
|
196 | - Benchmark::$output .= '<br />'; |
|
197 | - Benchmark::$output .= '<h4>TOTAL TIME</h4>'; |
|
198 | - Benchmark::$output .= Benchmark::formatTime('', $total, $formatted); |
|
199 | - Benchmark::$output .= '<span style="color:#999999; font-size:.8em;"> milliseconds</span><br />'; |
|
200 | - Benchmark::$output .= '<br />'; |
|
201 | - Benchmark::$output .= '<h5>Performance scale (from best to worse)</h5>'; |
|
202 | - Benchmark::$output .= '<span style="color:mediumpurple">Like wow! How about a Scooby snack?</span><br />'; |
|
203 | - Benchmark::$output .= '<span style="color:deepskyblue">Like...no way man!</span><br />'; |
|
204 | - Benchmark::$output .= '<span style="color:limegreen">Like...groovy!</span><br />'; |
|
205 | - Benchmark::$output .= '<span style="color:gold">Ruh Oh</span><br />'; |
|
206 | - Benchmark::$output .= '<span style="color:darkorange">Zoinks!</span><br />'; |
|
207 | - Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />'; |
|
208 | - } |
|
209 | - } |
|
210 | - if (! empty(Benchmark::$memory_usage)) { |
|
211 | - Benchmark::$output .= $formatted |
|
212 | - ? '<h5>Memory</h5>' |
|
213 | - : "\nMemory"; |
|
214 | - foreach (Benchmark::$memory_usage as $label => $memory_usage) { |
|
215 | - Benchmark::$output .= $formatted |
|
216 | - ? "<br />{$memory_usage} : {$label}" |
|
217 | - : "\n{$memory_usage} : {$label}"; |
|
218 | - } |
|
219 | - } |
|
220 | - if (empty(Benchmark::$output)) { |
|
221 | - return ''; |
|
222 | - } |
|
223 | - Benchmark::$output = $formatted |
|
224 | - ? '<div style="border:1px solid #dddddd; background-color:#ffffff;' |
|
225 | - . (is_admin() |
|
226 | - ? ' margin:2em 2em 2em 180px;' |
|
227 | - : ' margin:2em;') |
|
228 | - . ' padding:2em;">' |
|
229 | - . '<h4>BENCHMARKING</h4>' |
|
230 | - . Benchmark::$output |
|
231 | - . '</div>' |
|
232 | - : Benchmark::$output; |
|
233 | - return Benchmark::$output; |
|
234 | - } |
|
235 | - |
|
236 | - |
|
237 | - /** |
|
238 | - * @param bool $echo |
|
239 | - * @param bool $formatted |
|
240 | - * @return string |
|
241 | - */ |
|
242 | - public static function displayResults($echo = true, $formatted = true) |
|
243 | - { |
|
244 | - $results = Benchmark::generateResults($formatted); |
|
245 | - if ($echo) { |
|
246 | - echo $results; |
|
247 | - $results = ''; |
|
248 | - } |
|
249 | - return $results; |
|
250 | - } |
|
251 | - |
|
252 | - |
|
253 | - /** |
|
254 | - * @param string $filepath |
|
255 | - * @param bool $formatted |
|
256 | - * @param bool $append |
|
257 | - * @throws EE_Error |
|
258 | - */ |
|
259 | - public static function writeResultsToFile($filepath = '', $formatted = true, $append = true) |
|
260 | - { |
|
261 | - $filepath = ! empty($filepath) && is_readable(dirname($filepath)) |
|
262 | - ? $filepath |
|
263 | - : ''; |
|
264 | - if (empty($filepath)) { |
|
265 | - $filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html'; |
|
266 | - } |
|
267 | - EEH_File::ensure_file_exists_and_is_writable($filepath); |
|
268 | - file_put_contents( |
|
269 | - $filepath, |
|
270 | - "\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted), |
|
271 | - $append ? FILE_APPEND | LOCK_EX : LOCK_EX |
|
272 | - ); |
|
273 | - } |
|
274 | - |
|
275 | - |
|
276 | - /** |
|
277 | - * Converts a measure of memory bytes into the most logical units (eg kb, mb, etc) |
|
278 | - * |
|
279 | - * @param int $size |
|
280 | - * @return string |
|
281 | - */ |
|
282 | - public static function convert($size) |
|
283 | - { |
|
284 | - $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb'); |
|
285 | - return round( |
|
286 | - $size / pow(1024, $i = floor(log($size, 1024))), |
|
287 | - 2 |
|
288 | - ) . ' ' . $unit[ absint($i) ]; |
|
289 | - } |
|
290 | - |
|
291 | - |
|
292 | - /** |
|
293 | - * @param string $timer_name |
|
294 | - * @param float $total_time |
|
295 | - * @param bool $formatted |
|
296 | - * @return string |
|
297 | - */ |
|
298 | - public static function formatTime($timer_name, $total_time, $formatted = true) |
|
299 | - { |
|
300 | - $total_time *= 1000; |
|
301 | - switch ($total_time) { |
|
302 | - case $total_time > 12500: |
|
303 | - $color = 'red'; |
|
304 | - $bold = 'bold'; |
|
305 | - break; |
|
306 | - case $total_time > 2500: |
|
307 | - $color = 'darkorange'; |
|
308 | - $bold = 'bold'; |
|
309 | - break; |
|
310 | - case $total_time > 500: |
|
311 | - $color = 'gold'; |
|
312 | - $bold = 'bold'; |
|
313 | - break; |
|
314 | - case $total_time > 100: |
|
315 | - $color = 'limegreen'; |
|
316 | - $bold = 'normal'; |
|
317 | - break; |
|
318 | - case $total_time > 20: |
|
319 | - $color = 'deepskyblue'; |
|
320 | - $bold = 'normal'; |
|
321 | - break; |
|
322 | - default: |
|
323 | - $color = 'mediumpurple'; |
|
324 | - $bold = 'normal'; |
|
325 | - break; |
|
326 | - } |
|
327 | - return $formatted |
|
328 | - ? '<span style="min-width: 10px; margin:0 1em; color:' |
|
329 | - . $color |
|
330 | - . '; font-weight:' |
|
331 | - . $bold |
|
332 | - . '; font-size:1.2em;">' |
|
333 | - . str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT) |
|
334 | - . '</span> ' |
|
335 | - . $timer_name |
|
336 | - : str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT); |
|
337 | - } |
|
18 | + /** |
|
19 | + * @var string $output |
|
20 | + */ |
|
21 | + private static $output; |
|
22 | + |
|
23 | + /** |
|
24 | + * @var array $start_times array containing the start time for the timers |
|
25 | + */ |
|
26 | + private static $start_times; |
|
27 | + |
|
28 | + /** |
|
29 | + * @var array $times array containing all the timer'd times, which can be outputted via show_times() |
|
30 | + */ |
|
31 | + private static $times = array(); |
|
32 | + |
|
33 | + /** |
|
34 | + * @var array $memory_usage |
|
35 | + */ |
|
36 | + protected static $memory_usage = array(); |
|
37 | + |
|
38 | + |
|
39 | + /** |
|
40 | + * @param string $output |
|
41 | + * @param bool $formatted |
|
42 | + */ |
|
43 | + public static function addOutput($output, $formatted = true) |
|
44 | + { |
|
45 | + Benchmark::$output .= $formatted |
|
46 | + ? "<br />{$output}" |
|
47 | + : "\n{$output}"; |
|
48 | + } |
|
49 | + |
|
50 | + |
|
51 | + /** |
|
52 | + * @return void |
|
53 | + */ |
|
54 | + public static function resetOutput() |
|
55 | + { |
|
56 | + Benchmark::$output = ''; |
|
57 | + } |
|
58 | + |
|
59 | + /** |
|
60 | + * whether to benchmark code or not |
|
61 | + */ |
|
62 | + public static function doNotRun() |
|
63 | + { |
|
64 | + return ! WP_DEBUG || (defined('DOING_AJAX') && DOING_AJAX); |
|
65 | + } |
|
66 | + |
|
67 | + |
|
68 | + /** |
|
69 | + * resetTimes |
|
70 | + */ |
|
71 | + public static function resetTimes() |
|
72 | + { |
|
73 | + Benchmark::$times = array(); |
|
74 | + } |
|
75 | + |
|
76 | + |
|
77 | + /** |
|
78 | + * Add Benchmark::startTimer() before a block of code you want to measure the performance of |
|
79 | + * |
|
80 | + * @param null $timer_name |
|
81 | + */ |
|
82 | + public static function startTimer($timer_name = null) |
|
83 | + { |
|
84 | + if (Benchmark::doNotRun()) { |
|
85 | + return; |
|
86 | + } |
|
87 | + $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
|
88 | + Benchmark::$start_times[ $timer_name ] = microtime(true); |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * Add Benchmark::stopTimer() after a block of code you want to measure the performance of |
|
94 | + * |
|
95 | + * @param string $timer_name |
|
96 | + */ |
|
97 | + public static function stopTimer($timer_name = '') |
|
98 | + { |
|
99 | + if (Benchmark::doNotRun()) { |
|
100 | + return; |
|
101 | + } |
|
102 | + $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
|
103 | + if (isset(Benchmark::$start_times[ $timer_name ])) { |
|
104 | + $start_time = Benchmark::$start_times[ $timer_name ]; |
|
105 | + unset(Benchmark::$start_times[ $timer_name ]); |
|
106 | + } else { |
|
107 | + $start_time = array_pop(Benchmark::$start_times); |
|
108 | + } |
|
109 | + Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8); |
|
110 | + } |
|
111 | + |
|
112 | + |
|
113 | + /** |
|
114 | + * Measure the memory usage by PHP so far. |
|
115 | + * |
|
116 | + * @param string $label The label to show for this time eg "Start of calling Some_Class::some_function" |
|
117 | + * @param boolean $output_now whether to echo now, or wait until EEH_Debug_Tools::show_times() is called |
|
118 | + * @param bool $formatted |
|
119 | + * @return void |
|
120 | + */ |
|
121 | + public static function measureMemory($label = 'memory usage', $output_now = false, $formatted = true) |
|
122 | + { |
|
123 | + if (Benchmark::doNotRun()) { |
|
124 | + return; |
|
125 | + } |
|
126 | + $memory_used = Benchmark::convert(memory_get_usage(true)); |
|
127 | + Benchmark::$memory_usage[ $label ] = $memory_used; |
|
128 | + if ($output_now) { |
|
129 | + echo $formatted |
|
130 | + ? "<br>{$label} : {$memory_used}" |
|
131 | + : "\n {$label} : {$memory_used}"; |
|
132 | + } |
|
133 | + } |
|
134 | + |
|
135 | + |
|
136 | + /** |
|
137 | + * will display the benchmarking results at shutdown |
|
138 | + * |
|
139 | + * @param bool $formatted |
|
140 | + * @return void |
|
141 | + */ |
|
142 | + public static function displayResultsAtShutdown($formatted = true) |
|
143 | + { |
|
144 | + Benchmark::resetOutput(); |
|
145 | + add_action( |
|
146 | + 'shutdown', |
|
147 | + function () use ($formatted) { |
|
148 | + Benchmark::displayResults(true, $formatted); |
|
149 | + }, |
|
150 | + 999999 |
|
151 | + ); |
|
152 | + } |
|
153 | + |
|
154 | + |
|
155 | + /** |
|
156 | + * will display the benchmarking results at shutdown |
|
157 | + * |
|
158 | + * @param string $filepath |
|
159 | + * @param bool $formatted |
|
160 | + * @param bool $append |
|
161 | + * @return void |
|
162 | + */ |
|
163 | + public static function writeResultsAtShutdown($filepath = '', $formatted = true, $append = true) |
|
164 | + { |
|
165 | + Benchmark::resetOutput(); |
|
166 | + add_action( |
|
167 | + 'shutdown', |
|
168 | + function () use ($filepath, $formatted, $append) { |
|
169 | + Benchmark::writeResultsToFile($filepath, $formatted, $append); |
|
170 | + }, |
|
171 | + 999999 |
|
172 | + ); |
|
173 | + } |
|
174 | + |
|
175 | + |
|
176 | + /** |
|
177 | + * @param bool $formatted |
|
178 | + * @return string |
|
179 | + */ |
|
180 | + private static function generateResults($formatted = true) |
|
181 | + { |
|
182 | + if (Benchmark::doNotRun()) { |
|
183 | + return ''; |
|
184 | + } |
|
185 | + if (! empty(Benchmark::$times)) { |
|
186 | + $total = 0; |
|
187 | + Benchmark::$output .= $formatted |
|
188 | + ? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />' |
|
189 | + : ''; |
|
190 | + foreach (Benchmark::$times as $timer_name => $total_time) { |
|
191 | + Benchmark::$output .= Benchmark::formatTime($timer_name, $total_time, $formatted); |
|
192 | + Benchmark::$output .= $formatted ? '<br />' : "\n"; |
|
193 | + $total += $total_time; |
|
194 | + } |
|
195 | + if ($formatted) { |
|
196 | + Benchmark::$output .= '<br />'; |
|
197 | + Benchmark::$output .= '<h4>TOTAL TIME</h4>'; |
|
198 | + Benchmark::$output .= Benchmark::formatTime('', $total, $formatted); |
|
199 | + Benchmark::$output .= '<span style="color:#999999; font-size:.8em;"> milliseconds</span><br />'; |
|
200 | + Benchmark::$output .= '<br />'; |
|
201 | + Benchmark::$output .= '<h5>Performance scale (from best to worse)</h5>'; |
|
202 | + Benchmark::$output .= '<span style="color:mediumpurple">Like wow! How about a Scooby snack?</span><br />'; |
|
203 | + Benchmark::$output .= '<span style="color:deepskyblue">Like...no way man!</span><br />'; |
|
204 | + Benchmark::$output .= '<span style="color:limegreen">Like...groovy!</span><br />'; |
|
205 | + Benchmark::$output .= '<span style="color:gold">Ruh Oh</span><br />'; |
|
206 | + Benchmark::$output .= '<span style="color:darkorange">Zoinks!</span><br />'; |
|
207 | + Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />'; |
|
208 | + } |
|
209 | + } |
|
210 | + if (! empty(Benchmark::$memory_usage)) { |
|
211 | + Benchmark::$output .= $formatted |
|
212 | + ? '<h5>Memory</h5>' |
|
213 | + : "\nMemory"; |
|
214 | + foreach (Benchmark::$memory_usage as $label => $memory_usage) { |
|
215 | + Benchmark::$output .= $formatted |
|
216 | + ? "<br />{$memory_usage} : {$label}" |
|
217 | + : "\n{$memory_usage} : {$label}"; |
|
218 | + } |
|
219 | + } |
|
220 | + if (empty(Benchmark::$output)) { |
|
221 | + return ''; |
|
222 | + } |
|
223 | + Benchmark::$output = $formatted |
|
224 | + ? '<div style="border:1px solid #dddddd; background-color:#ffffff;' |
|
225 | + . (is_admin() |
|
226 | + ? ' margin:2em 2em 2em 180px;' |
|
227 | + : ' margin:2em;') |
|
228 | + . ' padding:2em;">' |
|
229 | + . '<h4>BENCHMARKING</h4>' |
|
230 | + . Benchmark::$output |
|
231 | + . '</div>' |
|
232 | + : Benchmark::$output; |
|
233 | + return Benchmark::$output; |
|
234 | + } |
|
235 | + |
|
236 | + |
|
237 | + /** |
|
238 | + * @param bool $echo |
|
239 | + * @param bool $formatted |
|
240 | + * @return string |
|
241 | + */ |
|
242 | + public static function displayResults($echo = true, $formatted = true) |
|
243 | + { |
|
244 | + $results = Benchmark::generateResults($formatted); |
|
245 | + if ($echo) { |
|
246 | + echo $results; |
|
247 | + $results = ''; |
|
248 | + } |
|
249 | + return $results; |
|
250 | + } |
|
251 | + |
|
252 | + |
|
253 | + /** |
|
254 | + * @param string $filepath |
|
255 | + * @param bool $formatted |
|
256 | + * @param bool $append |
|
257 | + * @throws EE_Error |
|
258 | + */ |
|
259 | + public static function writeResultsToFile($filepath = '', $formatted = true, $append = true) |
|
260 | + { |
|
261 | + $filepath = ! empty($filepath) && is_readable(dirname($filepath)) |
|
262 | + ? $filepath |
|
263 | + : ''; |
|
264 | + if (empty($filepath)) { |
|
265 | + $filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html'; |
|
266 | + } |
|
267 | + EEH_File::ensure_file_exists_and_is_writable($filepath); |
|
268 | + file_put_contents( |
|
269 | + $filepath, |
|
270 | + "\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted), |
|
271 | + $append ? FILE_APPEND | LOCK_EX : LOCK_EX |
|
272 | + ); |
|
273 | + } |
|
274 | + |
|
275 | + |
|
276 | + /** |
|
277 | + * Converts a measure of memory bytes into the most logical units (eg kb, mb, etc) |
|
278 | + * |
|
279 | + * @param int $size |
|
280 | + * @return string |
|
281 | + */ |
|
282 | + public static function convert($size) |
|
283 | + { |
|
284 | + $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb'); |
|
285 | + return round( |
|
286 | + $size / pow(1024, $i = floor(log($size, 1024))), |
|
287 | + 2 |
|
288 | + ) . ' ' . $unit[ absint($i) ]; |
|
289 | + } |
|
290 | + |
|
291 | + |
|
292 | + /** |
|
293 | + * @param string $timer_name |
|
294 | + * @param float $total_time |
|
295 | + * @param bool $formatted |
|
296 | + * @return string |
|
297 | + */ |
|
298 | + public static function formatTime($timer_name, $total_time, $formatted = true) |
|
299 | + { |
|
300 | + $total_time *= 1000; |
|
301 | + switch ($total_time) { |
|
302 | + case $total_time > 12500: |
|
303 | + $color = 'red'; |
|
304 | + $bold = 'bold'; |
|
305 | + break; |
|
306 | + case $total_time > 2500: |
|
307 | + $color = 'darkorange'; |
|
308 | + $bold = 'bold'; |
|
309 | + break; |
|
310 | + case $total_time > 500: |
|
311 | + $color = 'gold'; |
|
312 | + $bold = 'bold'; |
|
313 | + break; |
|
314 | + case $total_time > 100: |
|
315 | + $color = 'limegreen'; |
|
316 | + $bold = 'normal'; |
|
317 | + break; |
|
318 | + case $total_time > 20: |
|
319 | + $color = 'deepskyblue'; |
|
320 | + $bold = 'normal'; |
|
321 | + break; |
|
322 | + default: |
|
323 | + $color = 'mediumpurple'; |
|
324 | + $bold = 'normal'; |
|
325 | + break; |
|
326 | + } |
|
327 | + return $formatted |
|
328 | + ? '<span style="min-width: 10px; margin:0 1em; color:' |
|
329 | + . $color |
|
330 | + . '; font-weight:' |
|
331 | + . $bold |
|
332 | + . '; font-size:1.2em;">' |
|
333 | + . str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT) |
|
334 | + . '</span> ' |
|
335 | + . $timer_name |
|
336 | + : str_pad(number_format($total_time, 3), 9, '0', STR_PAD_LEFT); |
|
337 | + } |
|
338 | 338 | } |
@@ -85,7 +85,7 @@ discard block |
||
85 | 85 | return; |
86 | 86 | } |
87 | 87 | $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
88 | - Benchmark::$start_times[ $timer_name ] = microtime(true); |
|
88 | + Benchmark::$start_times[$timer_name] = microtime(true); |
|
89 | 89 | } |
90 | 90 | |
91 | 91 | |
@@ -100,13 +100,13 @@ discard block |
||
100 | 100 | return; |
101 | 101 | } |
102 | 102 | $timer_name = $timer_name !== '' ? $timer_name : get_called_class(); |
103 | - if (isset(Benchmark::$start_times[ $timer_name ])) { |
|
104 | - $start_time = Benchmark::$start_times[ $timer_name ]; |
|
105 | - unset(Benchmark::$start_times[ $timer_name ]); |
|
103 | + if (isset(Benchmark::$start_times[$timer_name])) { |
|
104 | + $start_time = Benchmark::$start_times[$timer_name]; |
|
105 | + unset(Benchmark::$start_times[$timer_name]); |
|
106 | 106 | } else { |
107 | 107 | $start_time = array_pop(Benchmark::$start_times); |
108 | 108 | } |
109 | - Benchmark::$times[ $timer_name ] = number_format(microtime(true) - $start_time, 8); |
|
109 | + Benchmark::$times[$timer_name] = number_format(microtime(true) - $start_time, 8); |
|
110 | 110 | } |
111 | 111 | |
112 | 112 | |
@@ -124,7 +124,7 @@ discard block |
||
124 | 124 | return; |
125 | 125 | } |
126 | 126 | $memory_used = Benchmark::convert(memory_get_usage(true)); |
127 | - Benchmark::$memory_usage[ $label ] = $memory_used; |
|
127 | + Benchmark::$memory_usage[$label] = $memory_used; |
|
128 | 128 | if ($output_now) { |
129 | 129 | echo $formatted |
130 | 130 | ? "<br>{$label} : {$memory_used}" |
@@ -144,7 +144,7 @@ discard block |
||
144 | 144 | Benchmark::resetOutput(); |
145 | 145 | add_action( |
146 | 146 | 'shutdown', |
147 | - function () use ($formatted) { |
|
147 | + function() use ($formatted) { |
|
148 | 148 | Benchmark::displayResults(true, $formatted); |
149 | 149 | }, |
150 | 150 | 999999 |
@@ -165,7 +165,7 @@ discard block |
||
165 | 165 | Benchmark::resetOutput(); |
166 | 166 | add_action( |
167 | 167 | 'shutdown', |
168 | - function () use ($filepath, $formatted, $append) { |
|
168 | + function() use ($filepath, $formatted, $append) { |
|
169 | 169 | Benchmark::writeResultsToFile($filepath, $formatted, $append); |
170 | 170 | }, |
171 | 171 | 999999 |
@@ -182,7 +182,7 @@ discard block |
||
182 | 182 | if (Benchmark::doNotRun()) { |
183 | 183 | return ''; |
184 | 184 | } |
185 | - if (! empty(Benchmark::$times)) { |
|
185 | + if ( ! empty(Benchmark::$times)) { |
|
186 | 186 | $total = 0; |
187 | 187 | Benchmark::$output .= $formatted |
188 | 188 | ? '<span style="color:#999999; font-size:.8em;">( time in milliseconds )</span><br />' |
@@ -207,7 +207,7 @@ discard block |
||
207 | 207 | Benchmark::$output .= '<span style="color:red">Like...HEEELLLP</span><br />'; |
208 | 208 | } |
209 | 209 | } |
210 | - if (! empty(Benchmark::$memory_usage)) { |
|
210 | + if ( ! empty(Benchmark::$memory_usage)) { |
|
211 | 211 | Benchmark::$output .= $formatted |
212 | 212 | ? '<h5>Memory</h5>' |
213 | 213 | : "\nMemory"; |
@@ -262,12 +262,12 @@ discard block |
||
262 | 262 | ? $filepath |
263 | 263 | : ''; |
264 | 264 | if (empty($filepath)) { |
265 | - $filepath = EVENT_ESPRESSO_UPLOAD_DIR . 'logs/benchmarking-' . date('Y-m-d') . '.html'; |
|
265 | + $filepath = EVENT_ESPRESSO_UPLOAD_DIR.'logs/benchmarking-'.date('Y-m-d').'.html'; |
|
266 | 266 | } |
267 | 267 | EEH_File::ensure_file_exists_and_is_writable($filepath); |
268 | 268 | file_put_contents( |
269 | 269 | $filepath, |
270 | - "\n" . date('Y-m-d H:i:s') . Benchmark::generateResults($formatted), |
|
270 | + "\n".date('Y-m-d H:i:s').Benchmark::generateResults($formatted), |
|
271 | 271 | $append ? FILE_APPEND | LOCK_EX : LOCK_EX |
272 | 272 | ); |
273 | 273 | } |
@@ -285,7 +285,7 @@ discard block |
||
285 | 285 | return round( |
286 | 286 | $size / pow(1024, $i = floor(log($size, 1024))), |
287 | 287 | 2 |
288 | - ) . ' ' . $unit[ absint($i) ]; |
|
288 | + ).' '.$unit[absint($i)]; |
|
289 | 289 | } |
290 | 290 | |
291 | 291 |