@@ -26,219 +26,219 @@ |
||
26 | 26 | class AdminOptionsSettings extends FormHandler |
27 | 27 | { |
28 | 28 | |
29 | - protected $template_args = array(); |
|
29 | + protected $template_args = array(); |
|
30 | 30 | |
31 | - /** |
|
32 | - * Form constructor. |
|
33 | - * |
|
34 | - * @param \EE_Registry $registry |
|
35 | - */ |
|
36 | - public function __construct(\EE_Registry $registry) |
|
37 | - { |
|
38 | - parent::__construct( |
|
39 | - esc_html__('Admin Options', 'event_espresso'), |
|
40 | - esc_html__('Admin Options', 'event_espresso'), |
|
41 | - 'admin_option_settings', |
|
42 | - '', |
|
43 | - FormHandler::DO_NOT_SETUP_FORM, |
|
44 | - $registry |
|
45 | - ); |
|
46 | - } |
|
31 | + /** |
|
32 | + * Form constructor. |
|
33 | + * |
|
34 | + * @param \EE_Registry $registry |
|
35 | + */ |
|
36 | + public function __construct(\EE_Registry $registry) |
|
37 | + { |
|
38 | + parent::__construct( |
|
39 | + esc_html__('Admin Options', 'event_espresso'), |
|
40 | + esc_html__('Admin Options', 'event_espresso'), |
|
41 | + 'admin_option_settings', |
|
42 | + '', |
|
43 | + FormHandler::DO_NOT_SETUP_FORM, |
|
44 | + $registry |
|
45 | + ); |
|
46 | + } |
|
47 | 47 | |
48 | 48 | |
49 | - /** |
|
50 | - * @param array $template_args |
|
51 | - */ |
|
52 | - public function setTemplateArgs(array $template_args) |
|
53 | - { |
|
54 | - $this->template_args = $template_args; |
|
55 | - } |
|
49 | + /** |
|
50 | + * @param array $template_args |
|
51 | + */ |
|
52 | + public function setTemplateArgs(array $template_args) |
|
53 | + { |
|
54 | + $this->template_args = $template_args; |
|
55 | + } |
|
56 | 56 | |
57 | 57 | |
58 | - /** |
|
59 | - * creates and returns the actual form |
|
60 | - * |
|
61 | - * @return EE_Form_Section_Proper |
|
62 | - * @throws \EE_Error |
|
63 | - */ |
|
64 | - public function generate() |
|
65 | - { |
|
66 | - $form = new \EE_Form_Section_Proper( |
|
67 | - array( |
|
68 | - 'name' => 'admin_option_settings', |
|
69 | - 'html_id' => 'admin_option_settings', |
|
70 | - 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
71 | - 'subsections' => array( |
|
72 | - 'help_tour_activation_hdr' => new EE_Form_Section_HTML( |
|
73 | - EEH_HTML::h2( |
|
74 | - esc_html__('Help Tour Global Activation', 'event_espresso') |
|
75 | - . ' ' |
|
76 | - . EEH_HTML::span( |
|
77 | - EEH_Template::get_help_tab_link('help_tour_activation_info'), |
|
78 | - 'help_tour_activation' |
|
79 | - ), |
|
80 | - '', |
|
81 | - 'ee-admin-settings-hdr' |
|
82 | - ) |
|
83 | - ), |
|
84 | - 'help_tour_activation' => new EE_Yes_No_Input( |
|
85 | - array( |
|
86 | - 'html_label_text' => esc_html__('Activate Global Help Tours?', 'event_espresso'), |
|
87 | - 'html_help_text' => esc_html__( |
|
88 | - 'This toggles whether the Event Espresso help tours are active globally or not.', |
|
89 | - 'event_espresso' |
|
90 | - ), |
|
91 | - 'default' => isset($this->registry->CFG->admin->help_tour_activation) |
|
92 | - ? filter_var($this->registry->CFG->admin->help_tour_activation, FILTER_VALIDATE_BOOLEAN) |
|
93 | - : true, |
|
94 | - 'required' => false, |
|
95 | - ) |
|
96 | - ), |
|
97 | - 'compatibility_hdr' => new EE_Form_Section_HTML( |
|
98 | - EEH_HTML::h2( |
|
99 | - esc_html__('Compatibility Settings', 'event_espresso'), |
|
100 | - '', |
|
101 | - 'ee-admin-settings-hdr' |
|
102 | - ) |
|
103 | - ), |
|
104 | - 'encode_session_data' => new EE_Yes_No_Input( |
|
105 | - array( |
|
106 | - 'html_label_text' => esc_html__('Encode Session Data?', 'event_espresso'), |
|
107 | - 'html_help_text' => sprintf( |
|
108 | - esc_html__( |
|
109 | - 'Some servers and database configurations can cause problems when saving the Event Espresso session data. Setting this option to "Yes" adds an extra layer of encoding to session data to prevent serialization errors, but can be incompatible with some server configurations.%1$sIf you receive "500 internal server" type errors during registration, try turning this option on.%1$sIf you get fatal PHP errors regarding missing base64 functions, then turn this option off.', |
|
110 | - 'event_espresso' |
|
111 | - ), |
|
112 | - '<br>' |
|
113 | - ), |
|
114 | - 'default' => $this->registry->CFG->admin->encode_session_data(), |
|
115 | - 'required' => false, |
|
116 | - ) |
|
117 | - ), |
|
118 | - ), |
|
119 | - ) |
|
120 | - ); |
|
121 | - if ($this->registry->CAP->current_user_can( |
|
122 | - 'manage_options', |
|
123 | - 'display_admin_settings_options_promote_and_affiliate' |
|
124 | - )) { |
|
125 | - $form->add_subsections( |
|
126 | - array( |
|
127 | - 'promote_ee_hdr' => new EE_Form_Section_HTML( |
|
128 | - EEH_HTML::h2( |
|
129 | - esc_html__('Promote Event Espresso', 'event_espresso') |
|
130 | - . ' ' |
|
131 | - . EEH_HTML::span( |
|
132 | - EEH_Template::get_help_tab_link('affiliate_info'), |
|
133 | - 'affiliate_info' |
|
134 | - ), |
|
135 | - '', |
|
136 | - 'ee-admin-settings-hdr' |
|
137 | - ) |
|
138 | - ), |
|
139 | - 'show_reg_footer' => new EE_Yes_No_Input( |
|
140 | - array( |
|
141 | - 'html_label_text' => esc_html__( |
|
142 | - 'Link to Event Espresso in your Registration Page?', |
|
143 | - 'event_espresso' |
|
144 | - ) |
|
145 | - . EEH_Template::get_help_tab_link('email_validation_info'), |
|
146 | - 'html_help_text' => esc_html__( |
|
147 | - 'adds an unobtrusive link to Event Espresso\'s website in the footer of your registration form. Get an affiliate link (see below) and make money if people click the link and purchase Event Espresso.', |
|
148 | - 'event_espresso' |
|
149 | - ), |
|
150 | - 'default' => isset($this->registry->CFG->admin->show_reg_footer) |
|
151 | - ? filter_var($this->registry->CFG->admin->show_reg_footer, FILTER_VALIDATE_BOOLEAN) |
|
152 | - : true, |
|
153 | - 'required' => false, |
|
154 | - ) |
|
155 | - ), |
|
156 | - 'affiliate_id' => new EE_Text_Input( |
|
157 | - array( |
|
158 | - 'html_label_text' => sprintf( |
|
159 | - esc_html__('Event Espresso %1$sAffiliate%2$s ID', 'event_espresso'), |
|
160 | - '<a href="http://eventespresso.com/affiliates/" target="_blank">', |
|
161 | - '</a>' |
|
162 | - ), |
|
163 | - 'html_help_text' => esc_html__( |
|
164 | - 'Earn cash for promoting Event Espresso.', |
|
165 | - 'event_espresso' |
|
166 | - ), |
|
167 | - 'html_class' => 'regular-text', |
|
168 | - 'default' => isset($this->registry->CFG->admin->affiliate_id) |
|
169 | - ? $this->registry->CFG->admin->get_pretty('affiliate_id') |
|
170 | - : '', |
|
171 | - 'required' => false, |
|
172 | - ) |
|
173 | - ), |
|
174 | - ), |
|
175 | - 'help_tour_activation_hdr' |
|
176 | - ); |
|
177 | - } |
|
178 | - return $form; |
|
179 | - } |
|
58 | + /** |
|
59 | + * creates and returns the actual form |
|
60 | + * |
|
61 | + * @return EE_Form_Section_Proper |
|
62 | + * @throws \EE_Error |
|
63 | + */ |
|
64 | + public function generate() |
|
65 | + { |
|
66 | + $form = new \EE_Form_Section_Proper( |
|
67 | + array( |
|
68 | + 'name' => 'admin_option_settings', |
|
69 | + 'html_id' => 'admin_option_settings', |
|
70 | + 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
71 | + 'subsections' => array( |
|
72 | + 'help_tour_activation_hdr' => new EE_Form_Section_HTML( |
|
73 | + EEH_HTML::h2( |
|
74 | + esc_html__('Help Tour Global Activation', 'event_espresso') |
|
75 | + . ' ' |
|
76 | + . EEH_HTML::span( |
|
77 | + EEH_Template::get_help_tab_link('help_tour_activation_info'), |
|
78 | + 'help_tour_activation' |
|
79 | + ), |
|
80 | + '', |
|
81 | + 'ee-admin-settings-hdr' |
|
82 | + ) |
|
83 | + ), |
|
84 | + 'help_tour_activation' => new EE_Yes_No_Input( |
|
85 | + array( |
|
86 | + 'html_label_text' => esc_html__('Activate Global Help Tours?', 'event_espresso'), |
|
87 | + 'html_help_text' => esc_html__( |
|
88 | + 'This toggles whether the Event Espresso help tours are active globally or not.', |
|
89 | + 'event_espresso' |
|
90 | + ), |
|
91 | + 'default' => isset($this->registry->CFG->admin->help_tour_activation) |
|
92 | + ? filter_var($this->registry->CFG->admin->help_tour_activation, FILTER_VALIDATE_BOOLEAN) |
|
93 | + : true, |
|
94 | + 'required' => false, |
|
95 | + ) |
|
96 | + ), |
|
97 | + 'compatibility_hdr' => new EE_Form_Section_HTML( |
|
98 | + EEH_HTML::h2( |
|
99 | + esc_html__('Compatibility Settings', 'event_espresso'), |
|
100 | + '', |
|
101 | + 'ee-admin-settings-hdr' |
|
102 | + ) |
|
103 | + ), |
|
104 | + 'encode_session_data' => new EE_Yes_No_Input( |
|
105 | + array( |
|
106 | + 'html_label_text' => esc_html__('Encode Session Data?', 'event_espresso'), |
|
107 | + 'html_help_text' => sprintf( |
|
108 | + esc_html__( |
|
109 | + 'Some servers and database configurations can cause problems when saving the Event Espresso session data. Setting this option to "Yes" adds an extra layer of encoding to session data to prevent serialization errors, but can be incompatible with some server configurations.%1$sIf you receive "500 internal server" type errors during registration, try turning this option on.%1$sIf you get fatal PHP errors regarding missing base64 functions, then turn this option off.', |
|
110 | + 'event_espresso' |
|
111 | + ), |
|
112 | + '<br>' |
|
113 | + ), |
|
114 | + 'default' => $this->registry->CFG->admin->encode_session_data(), |
|
115 | + 'required' => false, |
|
116 | + ) |
|
117 | + ), |
|
118 | + ), |
|
119 | + ) |
|
120 | + ); |
|
121 | + if ($this->registry->CAP->current_user_can( |
|
122 | + 'manage_options', |
|
123 | + 'display_admin_settings_options_promote_and_affiliate' |
|
124 | + )) { |
|
125 | + $form->add_subsections( |
|
126 | + array( |
|
127 | + 'promote_ee_hdr' => new EE_Form_Section_HTML( |
|
128 | + EEH_HTML::h2( |
|
129 | + esc_html__('Promote Event Espresso', 'event_espresso') |
|
130 | + . ' ' |
|
131 | + . EEH_HTML::span( |
|
132 | + EEH_Template::get_help_tab_link('affiliate_info'), |
|
133 | + 'affiliate_info' |
|
134 | + ), |
|
135 | + '', |
|
136 | + 'ee-admin-settings-hdr' |
|
137 | + ) |
|
138 | + ), |
|
139 | + 'show_reg_footer' => new EE_Yes_No_Input( |
|
140 | + array( |
|
141 | + 'html_label_text' => esc_html__( |
|
142 | + 'Link to Event Espresso in your Registration Page?', |
|
143 | + 'event_espresso' |
|
144 | + ) |
|
145 | + . EEH_Template::get_help_tab_link('email_validation_info'), |
|
146 | + 'html_help_text' => esc_html__( |
|
147 | + 'adds an unobtrusive link to Event Espresso\'s website in the footer of your registration form. Get an affiliate link (see below) and make money if people click the link and purchase Event Espresso.', |
|
148 | + 'event_espresso' |
|
149 | + ), |
|
150 | + 'default' => isset($this->registry->CFG->admin->show_reg_footer) |
|
151 | + ? filter_var($this->registry->CFG->admin->show_reg_footer, FILTER_VALIDATE_BOOLEAN) |
|
152 | + : true, |
|
153 | + 'required' => false, |
|
154 | + ) |
|
155 | + ), |
|
156 | + 'affiliate_id' => new EE_Text_Input( |
|
157 | + array( |
|
158 | + 'html_label_text' => sprintf( |
|
159 | + esc_html__('Event Espresso %1$sAffiliate%2$s ID', 'event_espresso'), |
|
160 | + '<a href="http://eventespresso.com/affiliates/" target="_blank">', |
|
161 | + '</a>' |
|
162 | + ), |
|
163 | + 'html_help_text' => esc_html__( |
|
164 | + 'Earn cash for promoting Event Espresso.', |
|
165 | + 'event_espresso' |
|
166 | + ), |
|
167 | + 'html_class' => 'regular-text', |
|
168 | + 'default' => isset($this->registry->CFG->admin->affiliate_id) |
|
169 | + ? $this->registry->CFG->admin->get_pretty('affiliate_id') |
|
170 | + : '', |
|
171 | + 'required' => false, |
|
172 | + ) |
|
173 | + ), |
|
174 | + ), |
|
175 | + 'help_tour_activation_hdr' |
|
176 | + ); |
|
177 | + } |
|
178 | + return $form; |
|
179 | + } |
|
180 | 180 | |
181 | 181 | |
182 | - /** |
|
183 | - * takes the generated form and displays it along with ony other non-form HTML that may be required |
|
184 | - * returns a string of HTML that can be directly echoed in a template |
|
185 | - * |
|
186 | - * @return string |
|
187 | - * @throws LogicException |
|
188 | - * @throws \EE_Error |
|
189 | - */ |
|
190 | - public function display() |
|
191 | - { |
|
192 | - add_filter( |
|
193 | - 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form', |
|
194 | - array($this, 'handleOldAdminOptionsSettingsAction') |
|
195 | - ); |
|
196 | - return parent::display(); |
|
197 | - } |
|
182 | + /** |
|
183 | + * takes the generated form and displays it along with ony other non-form HTML that may be required |
|
184 | + * returns a string of HTML that can be directly echoed in a template |
|
185 | + * |
|
186 | + * @return string |
|
187 | + * @throws LogicException |
|
188 | + * @throws \EE_Error |
|
189 | + */ |
|
190 | + public function display() |
|
191 | + { |
|
192 | + add_filter( |
|
193 | + 'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form', |
|
194 | + array($this, 'handleOldAdminOptionsSettingsAction') |
|
195 | + ); |
|
196 | + return parent::display(); |
|
197 | + } |
|
198 | 198 | |
199 | 199 | |
200 | - /** |
|
201 | - * @return string |
|
202 | - */ |
|
203 | - public function handleOldAdminOptionsSettingsAction() |
|
204 | - { |
|
205 | - ob_start(); |
|
206 | - do_action('AHEE__admin_option_settings__template__before', $this->template_args); |
|
207 | - return ob_get_clean(); |
|
208 | - } |
|
200 | + /** |
|
201 | + * @return string |
|
202 | + */ |
|
203 | + public function handleOldAdminOptionsSettingsAction() |
|
204 | + { |
|
205 | + ob_start(); |
|
206 | + do_action('AHEE__admin_option_settings__template__before', $this->template_args); |
|
207 | + return ob_get_clean(); |
|
208 | + } |
|
209 | 209 | |
210 | 210 | |
211 | - /** |
|
212 | - * handles processing the form submission |
|
213 | - * returns true or false depending on whether the form was processed successfully or not |
|
214 | - * |
|
215 | - * @param array $form_data |
|
216 | - * @return bool |
|
217 | - * @throws InvalidFormSubmissionException |
|
218 | - * @throws EE_Error |
|
219 | - * @throws LogicException |
|
220 | - * @throws InvalidArgumentException |
|
221 | - * @throws InvalidDataTypeException |
|
222 | - */ |
|
223 | - public function process($form_data = array()) |
|
224 | - { |
|
225 | - // process form |
|
226 | - $valid_data = (array) parent::process($form_data); |
|
227 | - if (empty($valid_data)) { |
|
228 | - return false; |
|
229 | - } |
|
230 | - $this->registry->CFG->admin->show_reg_footer = isset($form_data['show_reg_footer']) |
|
231 | - ? absint($form_data['show_reg_footer']) |
|
232 | - : $this->registry->CFG->admin->show_reg_footer; |
|
233 | - $this->registry->CFG->admin->affiliate_id = isset($form_data['affiliate_id']) |
|
234 | - ? sanitize_text_field($form_data['affiliate_id']) |
|
235 | - : $this->registry->CFG->admin->affiliate_id; |
|
236 | - $this->registry->CFG->admin->help_tour_activation = isset($form_data['help_tour_activation']) |
|
237 | - ? absint($form_data['help_tour_activation']) |
|
238 | - : $this->registry->CFG->admin->help_tour_activation; |
|
239 | - if (isset($form_data['encode_session_data'])) { |
|
240 | - $this->registry->CFG->admin->set_encode_session_data($form_data['encode_session_data']); |
|
241 | - } |
|
242 | - return false; |
|
243 | - } |
|
211 | + /** |
|
212 | + * handles processing the form submission |
|
213 | + * returns true or false depending on whether the form was processed successfully or not |
|
214 | + * |
|
215 | + * @param array $form_data |
|
216 | + * @return bool |
|
217 | + * @throws InvalidFormSubmissionException |
|
218 | + * @throws EE_Error |
|
219 | + * @throws LogicException |
|
220 | + * @throws InvalidArgumentException |
|
221 | + * @throws InvalidDataTypeException |
|
222 | + */ |
|
223 | + public function process($form_data = array()) |
|
224 | + { |
|
225 | + // process form |
|
226 | + $valid_data = (array) parent::process($form_data); |
|
227 | + if (empty($valid_data)) { |
|
228 | + return false; |
|
229 | + } |
|
230 | + $this->registry->CFG->admin->show_reg_footer = isset($form_data['show_reg_footer']) |
|
231 | + ? absint($form_data['show_reg_footer']) |
|
232 | + : $this->registry->CFG->admin->show_reg_footer; |
|
233 | + $this->registry->CFG->admin->affiliate_id = isset($form_data['affiliate_id']) |
|
234 | + ? sanitize_text_field($form_data['affiliate_id']) |
|
235 | + : $this->registry->CFG->admin->affiliate_id; |
|
236 | + $this->registry->CFG->admin->help_tour_activation = isset($form_data['help_tour_activation']) |
|
237 | + ? absint($form_data['help_tour_activation']) |
|
238 | + : $this->registry->CFG->admin->help_tour_activation; |
|
239 | + if (isset($form_data['encode_session_data'])) { |
|
240 | + $this->registry->CFG->admin->set_encode_session_data($form_data['encode_session_data']); |
|
241 | + } |
|
242 | + return false; |
|
243 | + } |
|
244 | 244 | } |
@@ -13,178 +13,178 @@ |
||
13 | 13 | class InvalidCheckoutAccess |
14 | 14 | { |
15 | 15 | |
16 | - /** |
|
17 | - * key used for saving invalid checkout access data to the wp_options table |
|
18 | - */ |
|
19 | - const OPTION_KEY = 'ee_invalid_checkout_access'; |
|
16 | + /** |
|
17 | + * key used for saving invalid checkout access data to the wp_options table |
|
18 | + */ |
|
19 | + const OPTION_KEY = 'ee_invalid_checkout_access'; |
|
20 | 20 | |
21 | 21 | |
22 | - /** |
|
23 | - * _block_bots |
|
24 | - * checks that the incoming request has either of the following set: |
|
25 | - * a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector |
|
26 | - * a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN |
|
27 | - * so if you're not coming from the Ticket Selector nor returning for a valid IP... |
|
28 | - * then where you coming from man? |
|
29 | - * |
|
30 | - * @param \EE_Checkout $checkout |
|
31 | - * @return bool true if access to registration checkout appears to be invalid |
|
32 | - */ |
|
33 | - public function checkoutAccessIsInvalid(\EE_Checkout $checkout) |
|
34 | - { |
|
35 | - if (! ($checkout->uts || $checkout->reg_url_link) |
|
36 | - && ! (defined('DOING_AJAX') && DOING_AJAX) |
|
37 | - && \EE_Config::instance()->registration->track_invalid_checkout_access() |
|
38 | - ) { |
|
39 | - /** @var \EE_Request $request */ |
|
40 | - $request = \EE_Registry::instance()->load_core('EE_Request'); |
|
41 | - $ip_address = $request->ip_address(); |
|
42 | - $ee_bot_checkout = get_option(InvalidCheckoutAccess::OPTION_KEY); |
|
43 | - if ($ee_bot_checkout === false) { |
|
44 | - $ee_bot_checkout = array(); |
|
45 | - add_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout, '', false); |
|
46 | - } |
|
47 | - if (! isset($ee_bot_checkout[ $ip_address ])) { |
|
48 | - $ee_bot_checkout[ $ip_address ] = array(); |
|
49 | - } |
|
50 | - $http_referer = isset($_SERVER['HTTP_REFERER']) |
|
51 | - ? esc_attr($_SERVER['HTTP_REFERER']) |
|
52 | - : 0; |
|
53 | - if (! isset($ee_bot_checkout[ $ip_address ][ $http_referer ])) { |
|
54 | - $ee_bot_checkout[ $ip_address ][ $http_referer ] = 0; |
|
55 | - } |
|
56 | - $ee_bot_checkout[ $ip_address ][ $http_referer ]++; |
|
57 | - update_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout); |
|
58 | - if (WP_DEBUG) { |
|
59 | - \EE_Error::add_error( |
|
60 | - esc_html__('Direct access to the registration checkout page is not allowed.', 'event_espresso'), |
|
61 | - __FILE__, |
|
62 | - __FUNCTION__, |
|
63 | - __LINE__ |
|
64 | - ); |
|
65 | - } |
|
66 | - return true; |
|
67 | - } |
|
68 | - return false; |
|
69 | - } |
|
22 | + /** |
|
23 | + * _block_bots |
|
24 | + * checks that the incoming request has either of the following set: |
|
25 | + * a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector |
|
26 | + * a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN |
|
27 | + * so if you're not coming from the Ticket Selector nor returning for a valid IP... |
|
28 | + * then where you coming from man? |
|
29 | + * |
|
30 | + * @param \EE_Checkout $checkout |
|
31 | + * @return bool true if access to registration checkout appears to be invalid |
|
32 | + */ |
|
33 | + public function checkoutAccessIsInvalid(\EE_Checkout $checkout) |
|
34 | + { |
|
35 | + if (! ($checkout->uts || $checkout->reg_url_link) |
|
36 | + && ! (defined('DOING_AJAX') && DOING_AJAX) |
|
37 | + && \EE_Config::instance()->registration->track_invalid_checkout_access() |
|
38 | + ) { |
|
39 | + /** @var \EE_Request $request */ |
|
40 | + $request = \EE_Registry::instance()->load_core('EE_Request'); |
|
41 | + $ip_address = $request->ip_address(); |
|
42 | + $ee_bot_checkout = get_option(InvalidCheckoutAccess::OPTION_KEY); |
|
43 | + if ($ee_bot_checkout === false) { |
|
44 | + $ee_bot_checkout = array(); |
|
45 | + add_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout, '', false); |
|
46 | + } |
|
47 | + if (! isset($ee_bot_checkout[ $ip_address ])) { |
|
48 | + $ee_bot_checkout[ $ip_address ] = array(); |
|
49 | + } |
|
50 | + $http_referer = isset($_SERVER['HTTP_REFERER']) |
|
51 | + ? esc_attr($_SERVER['HTTP_REFERER']) |
|
52 | + : 0; |
|
53 | + if (! isset($ee_bot_checkout[ $ip_address ][ $http_referer ])) { |
|
54 | + $ee_bot_checkout[ $ip_address ][ $http_referer ] = 0; |
|
55 | + } |
|
56 | + $ee_bot_checkout[ $ip_address ][ $http_referer ]++; |
|
57 | + update_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout); |
|
58 | + if (WP_DEBUG) { |
|
59 | + \EE_Error::add_error( |
|
60 | + esc_html__('Direct access to the registration checkout page is not allowed.', 'event_espresso'), |
|
61 | + __FILE__, |
|
62 | + __FUNCTION__, |
|
63 | + __LINE__ |
|
64 | + ); |
|
65 | + } |
|
66 | + return true; |
|
67 | + } |
|
68 | + return false; |
|
69 | + } |
|
70 | 70 | |
71 | 71 | |
72 | - /** |
|
73 | - * _invalid_checkout_access_form |
|
74 | - * |
|
75 | - * @return \EE_Form_Section_Proper |
|
76 | - * @throws \EE_Error |
|
77 | - */ |
|
78 | - public function getForm() |
|
79 | - { |
|
80 | - return new \EE_Form_Section_Proper( |
|
81 | - array( |
|
82 | - 'name' => 'invalid_checkout_access', |
|
83 | - 'html_id' => 'invalid_checkout_access', |
|
84 | - 'layout_strategy' => new \EE_Admin_Two_Column_Layout(), |
|
85 | - 'subsections' => array( |
|
86 | - 'invalid_checkout_access_hdr' => new \EE_Form_Section_HTML( |
|
87 | - \EEH_HTML::h2(esc_html__('Invalid Checkout Access', 'event_espresso')) |
|
88 | - ), |
|
89 | - 'ee_bot_checkout_data' => new \EE_Text_Area_Input( |
|
90 | - array( |
|
91 | - 'html_label_text' => esc_html__('Invalid Checkout Data', 'event_espresso'), |
|
92 | - 'default' => var_export( |
|
93 | - get_option(InvalidCheckoutAccess::OPTION_KEY, array()), |
|
94 | - true |
|
95 | - ), |
|
96 | - 'required' => false, |
|
97 | - 'html_help_text' => esc_html__( |
|
98 | - 'Event Espresso blocks any attempt to directly access the registration checkout page, that is NOT from a Ticket Selector or for a return visit for a valid transaction. These are not valid requests accessing your checkout page, so we track the IP addresses, what web page they just came from, and the number of times that they have attempted to access your registration page. This information may help you with protecting your site by other means, such as firewalls, etc, but please note that IP addresses are almost guaranteed to be spoofed by malicious agents.', |
|
99 | - 'event_espresso' |
|
100 | - ), |
|
101 | - ) |
|
102 | - ), |
|
103 | - 'track_invalid_checkout_access' => new \EE_Yes_No_Input( |
|
104 | - array( |
|
105 | - 'html_label_text' => __('Track Invalid Checkout Access?', 'event_espresso'), |
|
106 | - 'html_help_text' => esc_html__( |
|
107 | - 'Controls whether or not invalid attempts to directly access the registration checkout page should be tracked. Setting this to "No" means that the above data will no longer be collected.', |
|
108 | - 'event_espresso' |
|
109 | - ), |
|
110 | - 'default' => \EE_Config::instance() |
|
111 | - ->registration |
|
112 | - ->track_invalid_checkout_access(), |
|
113 | - 'display_html_label_text' => false, |
|
114 | - ) |
|
115 | - ), |
|
116 | - 'delete_invalid_checkout_data' => new \EE_Yes_No_Input( |
|
117 | - array( |
|
118 | - 'html_label_text' => __('Reset Invalid Checkout Data', 'event_espresso'), |
|
119 | - 'html_help_text' => esc_html__( |
|
120 | - 'Setting this to "Yes" will delete all existing invalid checkout access data.', |
|
121 | - 'event_espresso' |
|
122 | - ), |
|
123 | - 'default' => false, |
|
124 | - 'display_html_label_text' => false, |
|
125 | - ) |
|
126 | - ), |
|
127 | - ), |
|
128 | - ) |
|
129 | - ); |
|
130 | - } |
|
72 | + /** |
|
73 | + * _invalid_checkout_access_form |
|
74 | + * |
|
75 | + * @return \EE_Form_Section_Proper |
|
76 | + * @throws \EE_Error |
|
77 | + */ |
|
78 | + public function getForm() |
|
79 | + { |
|
80 | + return new \EE_Form_Section_Proper( |
|
81 | + array( |
|
82 | + 'name' => 'invalid_checkout_access', |
|
83 | + 'html_id' => 'invalid_checkout_access', |
|
84 | + 'layout_strategy' => new \EE_Admin_Two_Column_Layout(), |
|
85 | + 'subsections' => array( |
|
86 | + 'invalid_checkout_access_hdr' => new \EE_Form_Section_HTML( |
|
87 | + \EEH_HTML::h2(esc_html__('Invalid Checkout Access', 'event_espresso')) |
|
88 | + ), |
|
89 | + 'ee_bot_checkout_data' => new \EE_Text_Area_Input( |
|
90 | + array( |
|
91 | + 'html_label_text' => esc_html__('Invalid Checkout Data', 'event_espresso'), |
|
92 | + 'default' => var_export( |
|
93 | + get_option(InvalidCheckoutAccess::OPTION_KEY, array()), |
|
94 | + true |
|
95 | + ), |
|
96 | + 'required' => false, |
|
97 | + 'html_help_text' => esc_html__( |
|
98 | + 'Event Espresso blocks any attempt to directly access the registration checkout page, that is NOT from a Ticket Selector or for a return visit for a valid transaction. These are not valid requests accessing your checkout page, so we track the IP addresses, what web page they just came from, and the number of times that they have attempted to access your registration page. This information may help you with protecting your site by other means, such as firewalls, etc, but please note that IP addresses are almost guaranteed to be spoofed by malicious agents.', |
|
99 | + 'event_espresso' |
|
100 | + ), |
|
101 | + ) |
|
102 | + ), |
|
103 | + 'track_invalid_checkout_access' => new \EE_Yes_No_Input( |
|
104 | + array( |
|
105 | + 'html_label_text' => __('Track Invalid Checkout Access?', 'event_espresso'), |
|
106 | + 'html_help_text' => esc_html__( |
|
107 | + 'Controls whether or not invalid attempts to directly access the registration checkout page should be tracked. Setting this to "No" means that the above data will no longer be collected.', |
|
108 | + 'event_espresso' |
|
109 | + ), |
|
110 | + 'default' => \EE_Config::instance() |
|
111 | + ->registration |
|
112 | + ->track_invalid_checkout_access(), |
|
113 | + 'display_html_label_text' => false, |
|
114 | + ) |
|
115 | + ), |
|
116 | + 'delete_invalid_checkout_data' => new \EE_Yes_No_Input( |
|
117 | + array( |
|
118 | + 'html_label_text' => __('Reset Invalid Checkout Data', 'event_espresso'), |
|
119 | + 'html_help_text' => esc_html__( |
|
120 | + 'Setting this to "Yes" will delete all existing invalid checkout access data.', |
|
121 | + 'event_espresso' |
|
122 | + ), |
|
123 | + 'default' => false, |
|
124 | + 'display_html_label_text' => false, |
|
125 | + ) |
|
126 | + ), |
|
127 | + ), |
|
128 | + ) |
|
129 | + ); |
|
130 | + } |
|
131 | 131 | |
132 | 132 | |
133 | - /** |
|
134 | - * update_invalid_checkout_access_form |
|
135 | - * |
|
136 | - * @param \EE_Registration_Config $EE_Registration_Config |
|
137 | - * @return \EE_Registration_Config |
|
138 | - */ |
|
139 | - public function processForm(\EE_Registration_Config $EE_Registration_Config) |
|
140 | - { |
|
141 | - try { |
|
142 | - $invalid_checkout_access_form = $this->getForm(); |
|
143 | - // if not displaying a form, then check for form submission |
|
144 | - if ($invalid_checkout_access_form->was_submitted()) { |
|
145 | - // capture form data |
|
146 | - $invalid_checkout_access_form->receive_form_submission(); |
|
147 | - // validate form data |
|
148 | - if ($invalid_checkout_access_form->is_valid()) { |
|
149 | - // grab validated data from form |
|
150 | - $valid_data = $invalid_checkout_access_form->valid_data(); |
|
151 | - // ensure form inputs we want are set |
|
152 | - if (isset( |
|
153 | - $valid_data['track_invalid_checkout_access'], |
|
154 | - $valid_data['delete_invalid_checkout_data'] |
|
155 | - )) { |
|
156 | - $EE_Registration_Config->set_track_invalid_checkout_access( |
|
157 | - $valid_data['track_invalid_checkout_access'] |
|
158 | - ); |
|
159 | - // if deleting, then update option with empty array |
|
160 | - if (filter_var($valid_data['delete_invalid_checkout_data'], FILTER_VALIDATE_BOOLEAN)) { |
|
161 | - update_option(InvalidCheckoutAccess::OPTION_KEY, array()); |
|
162 | - } |
|
163 | - } else { |
|
164 | - \EE_Error::add_error( |
|
165 | - esc_html__( |
|
166 | - 'Invalid or missing Invalid Checkout Access form data. Please refresh the form and try again.', |
|
167 | - 'event_espresso' |
|
168 | - ), |
|
169 | - __FILE__, |
|
170 | - __FUNCTION__, |
|
171 | - __LINE__ |
|
172 | - ); |
|
173 | - } |
|
174 | - } else { |
|
175 | - if ($invalid_checkout_access_form->submission_error_message() !== '') { |
|
176 | - \EE_Error::add_error( |
|
177 | - $invalid_checkout_access_form->submission_error_message(), |
|
178 | - __FILE__, |
|
179 | - __FUNCTION__, |
|
180 | - __LINE__ |
|
181 | - ); |
|
182 | - } |
|
183 | - } |
|
184 | - } |
|
185 | - } catch (\EE_Error $e) { |
|
186 | - $e->get_error(); |
|
187 | - } |
|
188 | - return $EE_Registration_Config; |
|
189 | - } |
|
133 | + /** |
|
134 | + * update_invalid_checkout_access_form |
|
135 | + * |
|
136 | + * @param \EE_Registration_Config $EE_Registration_Config |
|
137 | + * @return \EE_Registration_Config |
|
138 | + */ |
|
139 | + public function processForm(\EE_Registration_Config $EE_Registration_Config) |
|
140 | + { |
|
141 | + try { |
|
142 | + $invalid_checkout_access_form = $this->getForm(); |
|
143 | + // if not displaying a form, then check for form submission |
|
144 | + if ($invalid_checkout_access_form->was_submitted()) { |
|
145 | + // capture form data |
|
146 | + $invalid_checkout_access_form->receive_form_submission(); |
|
147 | + // validate form data |
|
148 | + if ($invalid_checkout_access_form->is_valid()) { |
|
149 | + // grab validated data from form |
|
150 | + $valid_data = $invalid_checkout_access_form->valid_data(); |
|
151 | + // ensure form inputs we want are set |
|
152 | + if (isset( |
|
153 | + $valid_data['track_invalid_checkout_access'], |
|
154 | + $valid_data['delete_invalid_checkout_data'] |
|
155 | + )) { |
|
156 | + $EE_Registration_Config->set_track_invalid_checkout_access( |
|
157 | + $valid_data['track_invalid_checkout_access'] |
|
158 | + ); |
|
159 | + // if deleting, then update option with empty array |
|
160 | + if (filter_var($valid_data['delete_invalid_checkout_data'], FILTER_VALIDATE_BOOLEAN)) { |
|
161 | + update_option(InvalidCheckoutAccess::OPTION_KEY, array()); |
|
162 | + } |
|
163 | + } else { |
|
164 | + \EE_Error::add_error( |
|
165 | + esc_html__( |
|
166 | + 'Invalid or missing Invalid Checkout Access form data. Please refresh the form and try again.', |
|
167 | + 'event_espresso' |
|
168 | + ), |
|
169 | + __FILE__, |
|
170 | + __FUNCTION__, |
|
171 | + __LINE__ |
|
172 | + ); |
|
173 | + } |
|
174 | + } else { |
|
175 | + if ($invalid_checkout_access_form->submission_error_message() !== '') { |
|
176 | + \EE_Error::add_error( |
|
177 | + $invalid_checkout_access_form->submission_error_message(), |
|
178 | + __FILE__, |
|
179 | + __FUNCTION__, |
|
180 | + __LINE__ |
|
181 | + ); |
|
182 | + } |
|
183 | + } |
|
184 | + } |
|
185 | + } catch (\EE_Error $e) { |
|
186 | + $e->get_error(); |
|
187 | + } |
|
188 | + return $EE_Registration_Config; |
|
189 | + } |
|
190 | 190 | } |
@@ -32,7 +32,7 @@ discard block |
||
32 | 32 | */ |
33 | 33 | public function checkoutAccessIsInvalid(\EE_Checkout $checkout) |
34 | 34 | { |
35 | - if (! ($checkout->uts || $checkout->reg_url_link) |
|
35 | + if ( ! ($checkout->uts || $checkout->reg_url_link) |
|
36 | 36 | && ! (defined('DOING_AJAX') && DOING_AJAX) |
37 | 37 | && \EE_Config::instance()->registration->track_invalid_checkout_access() |
38 | 38 | ) { |
@@ -44,16 +44,16 @@ discard block |
||
44 | 44 | $ee_bot_checkout = array(); |
45 | 45 | add_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout, '', false); |
46 | 46 | } |
47 | - if (! isset($ee_bot_checkout[ $ip_address ])) { |
|
48 | - $ee_bot_checkout[ $ip_address ] = array(); |
|
47 | + if ( ! isset($ee_bot_checkout[$ip_address])) { |
|
48 | + $ee_bot_checkout[$ip_address] = array(); |
|
49 | 49 | } |
50 | 50 | $http_referer = isset($_SERVER['HTTP_REFERER']) |
51 | 51 | ? esc_attr($_SERVER['HTTP_REFERER']) |
52 | 52 | : 0; |
53 | - if (! isset($ee_bot_checkout[ $ip_address ][ $http_referer ])) { |
|
54 | - $ee_bot_checkout[ $ip_address ][ $http_referer ] = 0; |
|
53 | + if ( ! isset($ee_bot_checkout[$ip_address][$http_referer])) { |
|
54 | + $ee_bot_checkout[$ip_address][$http_referer] = 0; |
|
55 | 55 | } |
56 | - $ee_bot_checkout[ $ip_address ][ $http_referer ]++; |
|
56 | + $ee_bot_checkout[$ip_address][$http_referer]++; |
|
57 | 57 | update_option(InvalidCheckoutAccess::OPTION_KEY, $ee_bot_checkout); |
58 | 58 | if (WP_DEBUG) { |
59 | 59 | \EE_Error::add_error( |
@@ -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 |
@@ -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( |
@@ -22,215 +22,215 @@ |
||
22 | 22 | class TicketDatetimeAvailabilityTracker |
23 | 23 | { |
24 | 24 | |
25 | - /** |
|
26 | - * array of datetimes and the spaces available for them |
|
27 | - * |
|
28 | - * @var array[][] |
|
29 | - */ |
|
30 | - private $available_spaces = array(); |
|
31 | - |
|
32 | - /** |
|
33 | - * @var EEM_Datetime $datetime_model |
|
34 | - */ |
|
35 | - private $datetime_model; |
|
36 | - |
|
37 | - |
|
38 | - /** |
|
39 | - * TicketDatetimeAvailabilityTracker constructor. |
|
40 | - * |
|
41 | - * @param EEM_Datetime $datetime_model |
|
42 | - */ |
|
43 | - public function __construct(EEM_Datetime $datetime_model) |
|
44 | - { |
|
45 | - $this->datetime_model = $datetime_model; |
|
46 | - } |
|
47 | - |
|
48 | - |
|
49 | - /** |
|
50 | - * ticketDatetimeAvailability |
|
51 | - * creates an array of tickets plus all of the datetimes available to each ticket |
|
52 | - * and tracks the spaces remaining for each of those datetimes |
|
53 | - * |
|
54 | - * @param EE_Ticket $ticket - selected ticket |
|
55 | - * @param bool $get_original_ticket_spaces |
|
56 | - * @return int |
|
57 | - * @throws EE_Error |
|
58 | - * @throws InvalidArgumentException |
|
59 | - * @throws InvalidDataTypeException |
|
60 | - * @throws InvalidInterfaceException |
|
61 | - */ |
|
62 | - public function ticketDatetimeAvailability(EE_Ticket $ticket, $get_original_ticket_spaces = false) |
|
63 | - { |
|
64 | - // if the $_available_spaces array has not been set up yet... |
|
65 | - if (! isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
66 | - $this->setInitialTicketDatetimeAvailability($ticket); |
|
67 | - } |
|
68 | - $available_spaces = $ticket->qty() - $ticket->sold(); |
|
69 | - if (isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
70 | - // loop thru tickets, which will ALSO include individual ticket records AND a total |
|
71 | - foreach ($this->available_spaces['tickets'][ $ticket->ID() ] as $DTD_ID => $spaces) { |
|
72 | - // if we want the original datetime availability BEFORE we started subtracting tickets ? |
|
73 | - if ($get_original_ticket_spaces) { |
|
74 | - // then grab the available spaces from the "tickets" array |
|
75 | - // and compare with the above to get the lowest number |
|
76 | - $available_spaces = min( |
|
77 | - $available_spaces, |
|
78 | - $this->available_spaces['tickets'][ $ticket->ID() ][ $DTD_ID ] |
|
79 | - ); |
|
80 | - } else { |
|
81 | - // we want the updated ticket availability as stored in the "datetimes" array |
|
82 | - $available_spaces = min($available_spaces, $this->available_spaces['datetimes'][ $DTD_ID ]); |
|
83 | - } |
|
84 | - } |
|
85 | - } |
|
86 | - return $available_spaces; |
|
87 | - } |
|
88 | - |
|
89 | - |
|
90 | - /** |
|
91 | - * @param EE_Ticket $ticket |
|
92 | - * @return void |
|
93 | - * @throws InvalidArgumentException |
|
94 | - * @throws InvalidInterfaceException |
|
95 | - * @throws InvalidDataTypeException |
|
96 | - * @throws EE_Error |
|
97 | - */ |
|
98 | - private function setInitialTicketDatetimeAvailability(EE_Ticket $ticket) |
|
99 | - { |
|
100 | - // first, get all of the datetimes that are available to this ticket |
|
101 | - $datetimes = $ticket->get_many_related( |
|
102 | - 'Datetime', |
|
103 | - array( |
|
104 | - array( |
|
105 | - 'DTT_EVT_end' => array( |
|
106 | - '>=', |
|
107 | - $this->datetime_model->current_time_for_query('DTT_EVT_end'), |
|
108 | - ), |
|
109 | - ), |
|
110 | - 'order_by' => array('DTT_EVT_start' => 'ASC'), |
|
111 | - ) |
|
112 | - ); |
|
113 | - if (! empty($datetimes)) { |
|
114 | - // now loop thru all of the datetimes |
|
115 | - foreach ($datetimes as $datetime) { |
|
116 | - if ($datetime instanceof EE_Datetime) { |
|
117 | - // the number of spaces available for the datetime without considering individual ticket quantities |
|
118 | - $spaces_remaining = $datetime->spaces_remaining(); |
|
119 | - // save the total available spaces ( the lesser of the ticket qty minus the number of tickets sold |
|
120 | - // or the datetime spaces remaining) to this ticket using the datetime ID as the key |
|
121 | - $this->available_spaces['tickets'][ $ticket->ID() ][ $datetime->ID() ] = min( |
|
122 | - $ticket->qty() - $ticket->sold(), |
|
123 | - $spaces_remaining |
|
124 | - ); |
|
125 | - // if the remaining spaces for this datetime is already set, |
|
126 | - // then compare that against the datetime spaces remaining, and take the lowest number, |
|
127 | - // else just take the datetime spaces remaining, and assign to the datetimes array |
|
128 | - $this->available_spaces['datetimes'][ $datetime->ID() ] = isset( |
|
129 | - $this->available_spaces['datetimes'][ $datetime->ID() ] |
|
130 | - ) |
|
131 | - ? min($this->available_spaces['datetimes'][ $datetime->ID() ], $spaces_remaining) |
|
132 | - : $spaces_remaining; |
|
133 | - } |
|
134 | - } |
|
135 | - } |
|
136 | - } |
|
137 | - |
|
138 | - |
|
139 | - /** |
|
140 | - * @param EE_Ticket $ticket |
|
141 | - * @param int $qty |
|
142 | - * @return void |
|
143 | - * @throws EE_Error |
|
144 | - */ |
|
145 | - public function recalculateTicketDatetimeAvailability(EE_Ticket $ticket, $qty = 0) |
|
146 | - { |
|
147 | - if (isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
148 | - // loop thru tickets, which will ALSO include individual ticket records AND a total |
|
149 | - foreach ($this->available_spaces['tickets'][ $ticket->ID() ] as $DTD_ID => $spaces) { |
|
150 | - // subtract the qty of selected tickets from each datetime's available spaces this ticket has access to, |
|
151 | - $this->available_spaces['datetimes'][ $DTD_ID ] -= $qty; |
|
152 | - } |
|
153 | - } |
|
154 | - } |
|
155 | - |
|
156 | - |
|
157 | - /** |
|
158 | - * @param EE_Ticket $ticket |
|
159 | - * @param $qty |
|
160 | - * @param int $total_ticket_count |
|
161 | - * @throws EE_Error |
|
162 | - * @throws InvalidArgumentException |
|
163 | - * @throws InvalidDataTypeException |
|
164 | - * @throws InvalidInterfaceException |
|
165 | - */ |
|
166 | - public function processAvailabilityError(EE_Ticket $ticket, $qty, $total_ticket_count = 1) |
|
167 | - { |
|
168 | - // tickets can not be purchased but let's find the exact number left |
|
169 | - // for the last ticket selected PRIOR to subtracting tickets |
|
170 | - $available_spaces = $this->ticketDatetimeAvailability($ticket, true); |
|
171 | - // greedy greedy greedy eh? |
|
172 | - if ($available_spaces > 0) { |
|
173 | - if (apply_filters( |
|
174 | - 'FHEE__EE_Ticket_Selector___add_ticket_to_cart__allow_display_availability_error', |
|
175 | - true, |
|
176 | - $ticket, |
|
177 | - $qty, |
|
178 | - $available_spaces |
|
179 | - )) { |
|
180 | - $this->availabilityError( |
|
181 | - $available_spaces, |
|
182 | - $total_ticket_count |
|
183 | - ); |
|
184 | - } |
|
185 | - } else { |
|
186 | - EE_Error::add_error( |
|
187 | - esc_html__( |
|
188 | - 'We\'re sorry, but there are no available spaces left for this event at this particular date and time.', |
|
189 | - 'event_espresso' |
|
190 | - ), |
|
191 | - __FILE__, |
|
192 | - __FUNCTION__, |
|
193 | - __LINE__ |
|
194 | - ); |
|
195 | - } |
|
196 | - } |
|
197 | - |
|
198 | - |
|
199 | - /** |
|
200 | - * @param int $available_spaces |
|
201 | - * @param int $total_ticket_count |
|
202 | - */ |
|
203 | - private function availabilityError($available_spaces = 1, $total_ticket_count = 1) |
|
204 | - { |
|
205 | - // add error messaging - we're using the _n function that will generate |
|
206 | - // the appropriate singular or plural message based on the number of $available_spaces |
|
207 | - if ($total_ticket_count) { |
|
208 | - $msg = sprintf( |
|
209 | - esc_html( |
|
210 | - _n( |
|
211 | - 'We\'re sorry, but there is only %1$s available space left for this event at this particular date and time. Please select a different number (or different combination) of tickets by cancelling the current selection and choosing again, or proceed to registration.', |
|
212 | - 'We\'re sorry, but there are only %1$s available spaces left for this event at this particular date and time. Please select a different number (or different combination) of tickets by cancelling the current selection and choosing again, or proceed to registration.', |
|
213 | - $available_spaces, |
|
214 | - 'event_espresso' |
|
215 | - ) |
|
216 | - ), |
|
217 | - $available_spaces, |
|
218 | - '<br />' |
|
219 | - ); |
|
220 | - } else { |
|
221 | - $msg = sprintf( |
|
222 | - esc_html( |
|
223 | - _n( |
|
224 | - 'We\'re sorry, but there is only %1$s available space left for this event at this particular date and time. Please select a different number (or different combination) of tickets.', |
|
225 | - 'We\'re sorry, but there are only %1$s available spaces left for this event at this particular date and time. Please select a different number (or different combination) of tickets.', |
|
226 | - $available_spaces, |
|
227 | - 'event_espresso' |
|
228 | - ) |
|
229 | - ), |
|
230 | - $available_spaces, |
|
231 | - '<br />' |
|
232 | - ); |
|
233 | - } |
|
234 | - EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__); |
|
235 | - } |
|
25 | + /** |
|
26 | + * array of datetimes and the spaces available for them |
|
27 | + * |
|
28 | + * @var array[][] |
|
29 | + */ |
|
30 | + private $available_spaces = array(); |
|
31 | + |
|
32 | + /** |
|
33 | + * @var EEM_Datetime $datetime_model |
|
34 | + */ |
|
35 | + private $datetime_model; |
|
36 | + |
|
37 | + |
|
38 | + /** |
|
39 | + * TicketDatetimeAvailabilityTracker constructor. |
|
40 | + * |
|
41 | + * @param EEM_Datetime $datetime_model |
|
42 | + */ |
|
43 | + public function __construct(EEM_Datetime $datetime_model) |
|
44 | + { |
|
45 | + $this->datetime_model = $datetime_model; |
|
46 | + } |
|
47 | + |
|
48 | + |
|
49 | + /** |
|
50 | + * ticketDatetimeAvailability |
|
51 | + * creates an array of tickets plus all of the datetimes available to each ticket |
|
52 | + * and tracks the spaces remaining for each of those datetimes |
|
53 | + * |
|
54 | + * @param EE_Ticket $ticket - selected ticket |
|
55 | + * @param bool $get_original_ticket_spaces |
|
56 | + * @return int |
|
57 | + * @throws EE_Error |
|
58 | + * @throws InvalidArgumentException |
|
59 | + * @throws InvalidDataTypeException |
|
60 | + * @throws InvalidInterfaceException |
|
61 | + */ |
|
62 | + public function ticketDatetimeAvailability(EE_Ticket $ticket, $get_original_ticket_spaces = false) |
|
63 | + { |
|
64 | + // if the $_available_spaces array has not been set up yet... |
|
65 | + if (! isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
66 | + $this->setInitialTicketDatetimeAvailability($ticket); |
|
67 | + } |
|
68 | + $available_spaces = $ticket->qty() - $ticket->sold(); |
|
69 | + if (isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
70 | + // loop thru tickets, which will ALSO include individual ticket records AND a total |
|
71 | + foreach ($this->available_spaces['tickets'][ $ticket->ID() ] as $DTD_ID => $spaces) { |
|
72 | + // if we want the original datetime availability BEFORE we started subtracting tickets ? |
|
73 | + if ($get_original_ticket_spaces) { |
|
74 | + // then grab the available spaces from the "tickets" array |
|
75 | + // and compare with the above to get the lowest number |
|
76 | + $available_spaces = min( |
|
77 | + $available_spaces, |
|
78 | + $this->available_spaces['tickets'][ $ticket->ID() ][ $DTD_ID ] |
|
79 | + ); |
|
80 | + } else { |
|
81 | + // we want the updated ticket availability as stored in the "datetimes" array |
|
82 | + $available_spaces = min($available_spaces, $this->available_spaces['datetimes'][ $DTD_ID ]); |
|
83 | + } |
|
84 | + } |
|
85 | + } |
|
86 | + return $available_spaces; |
|
87 | + } |
|
88 | + |
|
89 | + |
|
90 | + /** |
|
91 | + * @param EE_Ticket $ticket |
|
92 | + * @return void |
|
93 | + * @throws InvalidArgumentException |
|
94 | + * @throws InvalidInterfaceException |
|
95 | + * @throws InvalidDataTypeException |
|
96 | + * @throws EE_Error |
|
97 | + */ |
|
98 | + private function setInitialTicketDatetimeAvailability(EE_Ticket $ticket) |
|
99 | + { |
|
100 | + // first, get all of the datetimes that are available to this ticket |
|
101 | + $datetimes = $ticket->get_many_related( |
|
102 | + 'Datetime', |
|
103 | + array( |
|
104 | + array( |
|
105 | + 'DTT_EVT_end' => array( |
|
106 | + '>=', |
|
107 | + $this->datetime_model->current_time_for_query('DTT_EVT_end'), |
|
108 | + ), |
|
109 | + ), |
|
110 | + 'order_by' => array('DTT_EVT_start' => 'ASC'), |
|
111 | + ) |
|
112 | + ); |
|
113 | + if (! empty($datetimes)) { |
|
114 | + // now loop thru all of the datetimes |
|
115 | + foreach ($datetimes as $datetime) { |
|
116 | + if ($datetime instanceof EE_Datetime) { |
|
117 | + // the number of spaces available for the datetime without considering individual ticket quantities |
|
118 | + $spaces_remaining = $datetime->spaces_remaining(); |
|
119 | + // save the total available spaces ( the lesser of the ticket qty minus the number of tickets sold |
|
120 | + // or the datetime spaces remaining) to this ticket using the datetime ID as the key |
|
121 | + $this->available_spaces['tickets'][ $ticket->ID() ][ $datetime->ID() ] = min( |
|
122 | + $ticket->qty() - $ticket->sold(), |
|
123 | + $spaces_remaining |
|
124 | + ); |
|
125 | + // if the remaining spaces for this datetime is already set, |
|
126 | + // then compare that against the datetime spaces remaining, and take the lowest number, |
|
127 | + // else just take the datetime spaces remaining, and assign to the datetimes array |
|
128 | + $this->available_spaces['datetimes'][ $datetime->ID() ] = isset( |
|
129 | + $this->available_spaces['datetimes'][ $datetime->ID() ] |
|
130 | + ) |
|
131 | + ? min($this->available_spaces['datetimes'][ $datetime->ID() ], $spaces_remaining) |
|
132 | + : $spaces_remaining; |
|
133 | + } |
|
134 | + } |
|
135 | + } |
|
136 | + } |
|
137 | + |
|
138 | + |
|
139 | + /** |
|
140 | + * @param EE_Ticket $ticket |
|
141 | + * @param int $qty |
|
142 | + * @return void |
|
143 | + * @throws EE_Error |
|
144 | + */ |
|
145 | + public function recalculateTicketDatetimeAvailability(EE_Ticket $ticket, $qty = 0) |
|
146 | + { |
|
147 | + if (isset($this->available_spaces['tickets'][ $ticket->ID() ])) { |
|
148 | + // loop thru tickets, which will ALSO include individual ticket records AND a total |
|
149 | + foreach ($this->available_spaces['tickets'][ $ticket->ID() ] as $DTD_ID => $spaces) { |
|
150 | + // subtract the qty of selected tickets from each datetime's available spaces this ticket has access to, |
|
151 | + $this->available_spaces['datetimes'][ $DTD_ID ] -= $qty; |
|
152 | + } |
|
153 | + } |
|
154 | + } |
|
155 | + |
|
156 | + |
|
157 | + /** |
|
158 | + * @param EE_Ticket $ticket |
|
159 | + * @param $qty |
|
160 | + * @param int $total_ticket_count |
|
161 | + * @throws EE_Error |
|
162 | + * @throws InvalidArgumentException |
|
163 | + * @throws InvalidDataTypeException |
|
164 | + * @throws InvalidInterfaceException |
|
165 | + */ |
|
166 | + public function processAvailabilityError(EE_Ticket $ticket, $qty, $total_ticket_count = 1) |
|
167 | + { |
|
168 | + // tickets can not be purchased but let's find the exact number left |
|
169 | + // for the last ticket selected PRIOR to subtracting tickets |
|
170 | + $available_spaces = $this->ticketDatetimeAvailability($ticket, true); |
|
171 | + // greedy greedy greedy eh? |
|
172 | + if ($available_spaces > 0) { |
|
173 | + if (apply_filters( |
|
174 | + 'FHEE__EE_Ticket_Selector___add_ticket_to_cart__allow_display_availability_error', |
|
175 | + true, |
|
176 | + $ticket, |
|
177 | + $qty, |
|
178 | + $available_spaces |
|
179 | + )) { |
|
180 | + $this->availabilityError( |
|
181 | + $available_spaces, |
|
182 | + $total_ticket_count |
|
183 | + ); |
|
184 | + } |
|
185 | + } else { |
|
186 | + EE_Error::add_error( |
|
187 | + esc_html__( |
|
188 | + 'We\'re sorry, but there are no available spaces left for this event at this particular date and time.', |
|
189 | + 'event_espresso' |
|
190 | + ), |
|
191 | + __FILE__, |
|
192 | + __FUNCTION__, |
|
193 | + __LINE__ |
|
194 | + ); |
|
195 | + } |
|
196 | + } |
|
197 | + |
|
198 | + |
|
199 | + /** |
|
200 | + * @param int $available_spaces |
|
201 | + * @param int $total_ticket_count |
|
202 | + */ |
|
203 | + private function availabilityError($available_spaces = 1, $total_ticket_count = 1) |
|
204 | + { |
|
205 | + // add error messaging - we're using the _n function that will generate |
|
206 | + // the appropriate singular or plural message based on the number of $available_spaces |
|
207 | + if ($total_ticket_count) { |
|
208 | + $msg = sprintf( |
|
209 | + esc_html( |
|
210 | + _n( |
|
211 | + 'We\'re sorry, but there is only %1$s available space left for this event at this particular date and time. Please select a different number (or different combination) of tickets by cancelling the current selection and choosing again, or proceed to registration.', |
|
212 | + 'We\'re sorry, but there are only %1$s available spaces left for this event at this particular date and time. Please select a different number (or different combination) of tickets by cancelling the current selection and choosing again, or proceed to registration.', |
|
213 | + $available_spaces, |
|
214 | + 'event_espresso' |
|
215 | + ) |
|
216 | + ), |
|
217 | + $available_spaces, |
|
218 | + '<br />' |
|
219 | + ); |
|
220 | + } else { |
|
221 | + $msg = sprintf( |
|
222 | + esc_html( |
|
223 | + _n( |
|
224 | + 'We\'re sorry, but there is only %1$s available space left for this event at this particular date and time. Please select a different number (or different combination) of tickets.', |
|
225 | + 'We\'re sorry, but there are only %1$s available spaces left for this event at this particular date and time. Please select a different number (or different combination) of tickets.', |
|
226 | + $available_spaces, |
|
227 | + 'event_espresso' |
|
228 | + ) |
|
229 | + ), |
|
230 | + $available_spaces, |
|
231 | + '<br />' |
|
232 | + ); |
|
233 | + } |
|
234 | + EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__); |
|
235 | + } |
|
236 | 236 | } |
@@ -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 |
@@ -18,545 +18,545 @@ |
||
18 | 18 | class CptQueryModifier |
19 | 19 | { |
20 | 20 | |
21 | - /** |
|
22 | - * @var string $post_type |
|
23 | - */ |
|
24 | - protected $post_type = ''; |
|
25 | - |
|
26 | - /** |
|
27 | - * CPT details from CustomPostTypeDefinitions for specific post type |
|
28 | - * |
|
29 | - * @var array $cpt_details |
|
30 | - */ |
|
31 | - protected $cpt_details = array(); |
|
32 | - |
|
33 | - /** |
|
34 | - * @var \EE_Table_Base[] $model_tables |
|
35 | - */ |
|
36 | - protected $model_tables = array(); |
|
37 | - |
|
38 | - /** |
|
39 | - * @var array $taxonomies |
|
40 | - */ |
|
41 | - protected $taxonomies = array(); |
|
42 | - |
|
43 | - /** |
|
44 | - * meta table for the related CPT |
|
45 | - * |
|
46 | - * @var \EE_Secondary_Table $meta_table |
|
47 | - */ |
|
48 | - protected $meta_table; |
|
49 | - |
|
50 | - /** |
|
51 | - * EEM_CPT_Base model for the related CPT |
|
52 | - * |
|
53 | - * @var \EEM_CPT_Base $model |
|
54 | - */ |
|
55 | - protected $model; |
|
56 | - |
|
57 | - /** |
|
58 | - * @var \EE_Request_Handler $request |
|
59 | - */ |
|
60 | - protected $request; |
|
61 | - |
|
62 | - /** |
|
63 | - * @var \WP_Query $wp_query |
|
64 | - */ |
|
65 | - protected $wp_query; |
|
66 | - |
|
67 | - |
|
68 | - /** |
|
69 | - * CptQueryModifier constructor |
|
70 | - * |
|
71 | - * @param string $post_type |
|
72 | - * @param array $cpt_details |
|
73 | - * @param \WP_Query $WP_Query |
|
74 | - * @param \EE_Request_Handler $request |
|
75 | - */ |
|
76 | - public function __construct( |
|
77 | - $post_type, |
|
78 | - array $cpt_details, |
|
79 | - \WP_Query $WP_Query, |
|
80 | - \EE_Request_Handler $request |
|
81 | - ) { |
|
82 | - $this->setRequest($request); |
|
83 | - $this->setWpQuery($WP_Query); |
|
84 | - $this->setPostType($post_type); |
|
85 | - $this->setCptDetails($cpt_details); |
|
86 | - $this->init(); |
|
87 | - } |
|
88 | - |
|
89 | - |
|
90 | - /** |
|
91 | - * @return string |
|
92 | - */ |
|
93 | - public function postType() |
|
94 | - { |
|
95 | - return $this->post_type; |
|
96 | - } |
|
97 | - |
|
98 | - |
|
99 | - /** |
|
100 | - * @param string $post_type |
|
101 | - */ |
|
102 | - protected function setPostType($post_type) |
|
103 | - { |
|
104 | - $this->post_type = $post_type; |
|
105 | - } |
|
106 | - |
|
107 | - |
|
108 | - /** |
|
109 | - * @return array |
|
110 | - */ |
|
111 | - public function cptDetails() |
|
112 | - { |
|
113 | - return $this->cpt_details; |
|
114 | - } |
|
115 | - |
|
116 | - |
|
117 | - /** |
|
118 | - * @param array $cpt_details |
|
119 | - */ |
|
120 | - protected function setCptDetails($cpt_details) |
|
121 | - { |
|
122 | - $this->cpt_details = $cpt_details; |
|
123 | - } |
|
124 | - |
|
125 | - |
|
126 | - /** |
|
127 | - * @return \EE_Table_Base[] |
|
128 | - */ |
|
129 | - public function modelTables() |
|
130 | - { |
|
131 | - return $this->model_tables; |
|
132 | - } |
|
133 | - |
|
134 | - |
|
135 | - /** |
|
136 | - * @param \EE_Table_Base[] $model_tables |
|
137 | - */ |
|
138 | - protected function setModelTables($model_tables) |
|
139 | - { |
|
140 | - $this->model_tables = $model_tables; |
|
141 | - } |
|
142 | - |
|
143 | - |
|
144 | - /** |
|
145 | - * @return array |
|
146 | - */ |
|
147 | - public function taxonomies() |
|
148 | - { |
|
149 | - if (empty($this->taxonomies)) { |
|
150 | - $this->initializeTaxonomies(); |
|
151 | - } |
|
152 | - return $this->taxonomies; |
|
153 | - } |
|
154 | - |
|
155 | - |
|
156 | - /** |
|
157 | - * @param array $taxonomies |
|
158 | - */ |
|
159 | - protected function setTaxonomies(array $taxonomies) |
|
160 | - { |
|
161 | - $this->taxonomies = $taxonomies; |
|
162 | - } |
|
163 | - |
|
164 | - |
|
165 | - /** |
|
166 | - * @return \EE_Secondary_Table |
|
167 | - */ |
|
168 | - public function metaTable() |
|
169 | - { |
|
170 | - return $this->meta_table; |
|
171 | - } |
|
172 | - |
|
173 | - |
|
174 | - /** |
|
175 | - * @param \EE_Secondary_Table $meta_table |
|
176 | - */ |
|
177 | - public function setMetaTable(\EE_Secondary_Table $meta_table) |
|
178 | - { |
|
179 | - $this->meta_table = $meta_table; |
|
180 | - } |
|
181 | - |
|
182 | - |
|
183 | - /** |
|
184 | - * @return \EEM_Base |
|
185 | - */ |
|
186 | - public function model() |
|
187 | - { |
|
188 | - return $this->model; |
|
189 | - } |
|
190 | - |
|
191 | - |
|
192 | - /** |
|
193 | - * @param \EEM_Base $CPT_model |
|
194 | - */ |
|
195 | - protected function setModel(\EEM_Base $CPT_model) |
|
196 | - { |
|
197 | - $this->model = $CPT_model; |
|
198 | - } |
|
199 | - |
|
200 | - |
|
201 | - /** |
|
202 | - * @return \EE_Request_Handler |
|
203 | - */ |
|
204 | - public function request() |
|
205 | - { |
|
206 | - return $this->request; |
|
207 | - } |
|
208 | - |
|
209 | - |
|
210 | - /** |
|
211 | - * @param \EE_Request_Handler $request |
|
212 | - */ |
|
213 | - protected function setRequest(\EE_Request_Handler $request) |
|
214 | - { |
|
215 | - $this->request = $request; |
|
216 | - } |
|
217 | - |
|
218 | - // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps |
|
219 | - |
|
220 | - /** |
|
221 | - * @return \WP_Query |
|
222 | - */ |
|
223 | - public function WpQuery() |
|
224 | - { |
|
225 | - return $this->wp_query; |
|
226 | - } |
|
227 | - // phpcs:enable |
|
228 | - |
|
229 | - /** |
|
230 | - * @param \WP_Query $wp_query |
|
231 | - */ |
|
232 | - public function setWpQuery(\WP_Query $wp_query) |
|
233 | - { |
|
234 | - $this->wp_query = $wp_query; |
|
235 | - } |
|
236 | - |
|
237 | - |
|
238 | - /** |
|
239 | - * @return void |
|
240 | - * @throws InvalidDataTypeException |
|
241 | - * @throws InvalidInterfaceException |
|
242 | - * @throws InvalidArgumentException |
|
243 | - */ |
|
244 | - protected function initializeTaxonomies() |
|
245 | - { |
|
246 | - // check if taxonomies have already been set and that this CPT has taxonomies registered for it |
|
247 | - if (empty($this->taxonomies) |
|
248 | - && isset($this->cpt_details['args']['taxonomies']) |
|
249 | - ) { |
|
250 | - // if so then grab them, but we want the taxonomy name as the key |
|
251 | - $taxonomies = array_flip($this->cpt_details['args']['taxonomies']); |
|
252 | - // then grab the list of ALL taxonomies |
|
253 | - /** @var \EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions |
|
254 | - * $taxonomy_definitions |
|
255 | - */ |
|
256 | - $taxonomy_definitions = LoaderFactory::getLoader()->getShared( |
|
257 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' |
|
258 | - ); |
|
259 | - $all_taxonomies = $taxonomy_definitions->getCustomTaxonomyDefinitions(); |
|
260 | - foreach ($taxonomies as $taxonomy => &$details) { |
|
261 | - // add details to our taxonomies if they exist |
|
262 | - $details = isset($all_taxonomies[ $taxonomy ]) |
|
263 | - ? $all_taxonomies[ $taxonomy ] |
|
264 | - : array(); |
|
265 | - } |
|
266 | - // ALWAYS unset() variables that were passed by reference |
|
267 | - unset($details); |
|
268 | - $this->setTaxonomies($taxonomies); |
|
269 | - } |
|
270 | - } |
|
271 | - |
|
272 | - |
|
273 | - protected function init() |
|
274 | - { |
|
275 | - $this->setAdditionalCptDetails(); |
|
276 | - $this->setRequestVarsIfCpt(); |
|
277 | - // convert post_type to model name |
|
278 | - $model_name = str_replace('EE_', '', $this->cpt_details['class_name']); |
|
279 | - // load all tables related to CPT |
|
280 | - $this->setupModelsAndTables($model_name); |
|
281 | - // load and instantiate CPT_*_Strategy |
|
282 | - $CPT_Strategy = $this->cptStrategyClass($model_name); |
|
283 | - // !!!!!!!!!! IMPORTANT !!!!!!!!!!!! |
|
284 | - // here's the list of available filters in the WP_Query object |
|
285 | - // 'posts_where_paged' |
|
286 | - // 'posts_groupby' |
|
287 | - // 'posts_join_paged' |
|
288 | - // 'posts_orderby' |
|
289 | - // 'posts_distinct' |
|
290 | - // 'post_limits' |
|
291 | - // 'posts_fields' |
|
292 | - // 'posts_join' |
|
293 | - add_filter('posts_fields', array($this, 'postsFields')); |
|
294 | - add_filter('posts_join', array($this, 'postsJoin')); |
|
295 | - add_filter( |
|
296 | - 'get_' . $this->post_type . '_metadata', |
|
297 | - array($CPT_Strategy, 'get_EE_post_type_metadata'), |
|
298 | - 1, |
|
299 | - 4 |
|
300 | - ); |
|
301 | - add_filter('the_posts', array($this, 'thePosts'), 1, 1); |
|
302 | - if ($this->wp_query->is_main_query()) { |
|
303 | - add_filter('get_edit_post_link', array($this, 'getEditPostLink'), 10, 2); |
|
304 | - $this->addTemplateFilters(); |
|
305 | - } |
|
306 | - } |
|
307 | - |
|
308 | - |
|
309 | - /** |
|
310 | - * sets some basic query vars that pertain to the CPT |
|
311 | - * |
|
312 | - * @access protected |
|
313 | - * @return void |
|
314 | - */ |
|
315 | - protected function setAdditionalCptDetails() |
|
316 | - { |
|
317 | - // the post or category or term that is triggering EE |
|
318 | - $this->cpt_details['espresso_page'] = $this->request->is_espresso_page(); |
|
319 | - // requested post name |
|
320 | - $this->cpt_details['post_name'] = $this->request->get('post_name'); |
|
321 | - // add support for viewing 'private', 'draft', or 'pending' posts |
|
322 | - if (isset($this->wp_query->query_vars['p']) |
|
323 | - && $this->wp_query->query_vars['p'] !== 0 |
|
324 | - && is_user_logged_in() |
|
325 | - && current_user_can('edit_post', $this->wp_query->query_vars['p']) |
|
326 | - ) { |
|
327 | - // we can just inject directly into the WP_Query object |
|
328 | - $this->wp_query->query['post_status'] = array('publish', 'private', 'draft', 'pending'); |
|
329 | - // now set the main 'ee' request var so that the appropriate module can load the appropriate template(s) |
|
330 | - $this->request->set('ee', $this->cpt_details['singular_slug']); |
|
331 | - } |
|
332 | - } |
|
333 | - |
|
334 | - |
|
335 | - /** |
|
336 | - * Checks if we're on a EE-CPT archive-or-single page, and if we've never set the EE request var. |
|
337 | - * If so, sets the 'ee' request variable |
|
338 | - * so other parts of EE can know what CPT is getting queried. |
|
339 | - * To Mike's knowledge, this must be called from during or after the pre_get_posts hook |
|
340 | - * in order for is_archive() and is_single() methods to work properly. |
|
341 | - * |
|
342 | - * @return void |
|
343 | - */ |
|
344 | - public function setRequestVarsIfCpt() |
|
345 | - { |
|
346 | - // check if ee action var has been set |
|
347 | - if (! $this->request->is_set('ee')) { |
|
348 | - // check that route exists for CPT archive slug |
|
349 | - if (is_archive() && \EE_Config::get_route($this->cpt_details['plural_slug'])) { |
|
350 | - // ie: set "ee" to "events" |
|
351 | - $this->request->set('ee', $this->cpt_details['plural_slug']); |
|
352 | - // or does it match a single page CPT like /event/ |
|
353 | - } elseif (is_single() && \EE_Config::get_route($this->cpt_details['singular_slug'])) { |
|
354 | - // ie: set "ee" to "event" |
|
355 | - $this->request->set('ee', $this->cpt_details['singular_slug']); |
|
356 | - } |
|
357 | - } |
|
358 | - } |
|
359 | - |
|
360 | - |
|
361 | - /** |
|
362 | - * setupModelsAndTables |
|
363 | - * |
|
364 | - * @access protected |
|
365 | - * @param string $model_name |
|
366 | - * @throws \EE_Error |
|
367 | - */ |
|
368 | - protected function setupModelsAndTables($model_name) |
|
369 | - { |
|
370 | - // get CPT table data via CPT Model |
|
371 | - $model = \EE_Registry::instance()->load_model($model_name); |
|
372 | - if (! $model instanceof \EEM_Base) { |
|
373 | - throw new \EE_Error( |
|
374 | - sprintf( |
|
375 | - __( |
|
376 | - 'The "%1$s" model could not be loaded.', |
|
377 | - 'event_espresso' |
|
378 | - ), |
|
379 | - $model_name |
|
380 | - ) |
|
381 | - ); |
|
382 | - } |
|
383 | - $this->setModel($model); |
|
384 | - $this->setModelTables($this->model->get_tables()); |
|
385 | - // is there a Meta Table for this CPT? |
|
386 | - if (isset($this->cpt_details['tables'][ $model_name . '_Meta' ]) |
|
387 | - && $this->cpt_details['tables'][ $model_name . '_Meta' ] instanceof \EE_Secondary_Table |
|
388 | - ) { |
|
389 | - $this->setMetaTable($this->cpt_details['tables'][ $model_name . '_Meta' ]); |
|
390 | - } |
|
391 | - } |
|
392 | - |
|
393 | - |
|
394 | - /** |
|
395 | - * cptStrategyClass |
|
396 | - * |
|
397 | - * @access protected |
|
398 | - * @param string $model_name |
|
399 | - * @return string |
|
400 | - */ |
|
401 | - protected function cptStrategyClass($model_name) |
|
402 | - { |
|
403 | - // creates classname like: CPT_Event_Strategy |
|
404 | - $CPT_Strategy_class_name = 'CPT_' . $model_name . '_Strategy'; |
|
405 | - // load and instantiate |
|
406 | - $CPT_Strategy = \EE_Registry::instance()->load_core( |
|
407 | - $CPT_Strategy_class_name, |
|
408 | - array('WP_Query' => $this->wp_query, 'CPT' => $this->cpt_details) |
|
409 | - ); |
|
410 | - if ($CPT_Strategy === null) { |
|
411 | - $CPT_Strategy = \EE_Registry::instance()->load_core( |
|
412 | - 'CPT_Default_Strategy', |
|
413 | - array('WP_Query' => $this->wp_query, 'CPT' => $this->cpt_details) |
|
414 | - ); |
|
415 | - } |
|
416 | - return $CPT_Strategy; |
|
417 | - } |
|
418 | - |
|
419 | - |
|
420 | - /** |
|
421 | - * postsFields |
|
422 | - * |
|
423 | - * @access public |
|
424 | - * @param $SQL |
|
425 | - * @return string |
|
426 | - */ |
|
427 | - public function postsFields($SQL) |
|
428 | - { |
|
429 | - // does this CPT have a meta table ? |
|
430 | - if ($this->meta_table instanceof \EE_Secondary_Table) { |
|
431 | - // adds something like ", wp_esp_event_meta.* " to WP Query SELECT statement |
|
432 | - $SQL .= ', ' . $this->meta_table->get_table_name() . '.* '; |
|
433 | - } |
|
434 | - remove_filter('posts_fields', array($this, 'postsFields')); |
|
435 | - return $SQL; |
|
436 | - } |
|
437 | - |
|
438 | - |
|
439 | - /** |
|
440 | - * postsJoin |
|
441 | - * |
|
442 | - * @access public |
|
443 | - * @param $SQL |
|
444 | - * @return string |
|
445 | - */ |
|
446 | - public function postsJoin($SQL) |
|
447 | - { |
|
448 | - // does this CPT have a meta table ? |
|
449 | - if ($this->meta_table instanceof \EE_Secondary_Table) { |
|
450 | - global $wpdb; |
|
451 | - // adds something like " LEFT JOIN wp_esp_event_meta ON ( wp_esp_event_meta.EVT_ID = wp_posts.ID ) " to WP Query JOIN statement |
|
452 | - $SQL .= ' LEFT JOIN ' |
|
453 | - . $this->meta_table->get_table_name() |
|
454 | - . ' ON ( ' |
|
455 | - . $this->meta_table->get_table_name() |
|
456 | - . '.' |
|
457 | - . $this->meta_table->get_fk_on_table() |
|
458 | - . ' = ' |
|
459 | - . $wpdb->posts |
|
460 | - . '.ID ) '; |
|
461 | - } |
|
462 | - remove_filter('posts_join', array($this, 'postsJoin')); |
|
463 | - return $SQL; |
|
464 | - } |
|
465 | - |
|
466 | - |
|
467 | - /** |
|
468 | - * thePosts |
|
469 | - * |
|
470 | - * @access public |
|
471 | - * @param \WP_Post[] $posts |
|
472 | - * @return \WP_Post[] |
|
473 | - */ |
|
474 | - public function thePosts($posts) |
|
475 | - { |
|
476 | - $CPT_class = $this->cpt_details['class_name']; |
|
477 | - // loop thru posts |
|
478 | - if (is_array($posts) && $this->model instanceof \EEM_CPT_Base) { |
|
479 | - foreach ($posts as $key => $post) { |
|
480 | - if ($post->post_type === $this->post_type) { |
|
481 | - $post->{$CPT_class} = $this->model->instantiate_class_from_post_object($post); |
|
482 | - } |
|
483 | - } |
|
484 | - } |
|
485 | - remove_filter('the_posts', array($this, 'thePosts'), 1); |
|
486 | - return $posts; |
|
487 | - } |
|
488 | - |
|
489 | - |
|
490 | - /** |
|
491 | - * @param $url |
|
492 | - * @param $ID |
|
493 | - * @return string |
|
494 | - */ |
|
495 | - public function getEditPostLink($url, $ID) |
|
496 | - { |
|
497 | - // need to make sure we only edit links if our cpt |
|
498 | - global $post; |
|
499 | - // notice if the cpt is registered with `show_ee_ui` set to false, we take that to mean that the WordPress core ui |
|
500 | - // for interacting with the CPT is desired and there is no EE UI for interacting with the CPT in the admin. |
|
501 | - if (! $post instanceof \WP_Post |
|
502 | - || $post->post_type !== $this->post_type |
|
503 | - || ( |
|
504 | - isset($this->cpt_details['args']['show_ee_ui']) |
|
505 | - && ! $this->cpt_details['args']['show_ee_ui'] |
|
506 | - ) |
|
507 | - ) { |
|
508 | - return $url; |
|
509 | - } |
|
510 | - // k made it here so all is good. |
|
511 | - return wp_nonce_url( |
|
512 | - add_query_arg( |
|
513 | - array('page' => $this->post_type, 'post' => $ID, 'action' => 'edit'), |
|
514 | - admin_url('admin.php') |
|
515 | - ), |
|
516 | - 'edit', |
|
517 | - 'edit_nonce' |
|
518 | - ); |
|
519 | - } |
|
520 | - |
|
521 | - |
|
522 | - /** |
|
523 | - * Execute any template filters. |
|
524 | - * This method is only called if in main query. |
|
525 | - * |
|
526 | - * @return void |
|
527 | - */ |
|
528 | - public function addTemplateFilters() |
|
529 | - { |
|
530 | - // if requested cpt supports page_templates and it's the main query |
|
531 | - if (! empty($this->cpt_details['args']['page_templates']) && $this->wp_query->is_main_query()) { |
|
532 | - // then let's hook into the appropriate query_template hook |
|
533 | - add_filter('single_template', array($this, 'singleCptTemplate')); |
|
534 | - } |
|
535 | - } |
|
536 | - |
|
537 | - |
|
538 | - /** |
|
539 | - * Callback for single_template wp filter. |
|
540 | - * This is used to load the set page_template for a single ee cpt if its set. If "default" then we load the normal |
|
541 | - * hierarchy. |
|
542 | - * |
|
543 | - * @access public |
|
544 | - * @param string $current_template Existing default template path derived for this page call. |
|
545 | - * @return string the path to the full template file. |
|
546 | - */ |
|
547 | - public function singleCptTemplate($current_template) |
|
548 | - { |
|
549 | - $object = get_queried_object(); |
|
550 | - // does this called object HAVE a page template set that is something other than the default. |
|
551 | - $template = get_post_meta($object->ID, '_wp_page_template', true); |
|
552 | - // exit early if default or not set or invalid path (accounts for theme changes) |
|
553 | - if ($template === 'default' |
|
554 | - || empty($template) |
|
555 | - || ! is_readable(get_stylesheet_directory() . '/' . $template) |
|
556 | - ) { |
|
557 | - return $current_template; |
|
558 | - } |
|
559 | - // made it here so we SHOULD be able to just locate the template and then return it. |
|
560 | - return locate_template(array($template)); |
|
561 | - } |
|
21 | + /** |
|
22 | + * @var string $post_type |
|
23 | + */ |
|
24 | + protected $post_type = ''; |
|
25 | + |
|
26 | + /** |
|
27 | + * CPT details from CustomPostTypeDefinitions for specific post type |
|
28 | + * |
|
29 | + * @var array $cpt_details |
|
30 | + */ |
|
31 | + protected $cpt_details = array(); |
|
32 | + |
|
33 | + /** |
|
34 | + * @var \EE_Table_Base[] $model_tables |
|
35 | + */ |
|
36 | + protected $model_tables = array(); |
|
37 | + |
|
38 | + /** |
|
39 | + * @var array $taxonomies |
|
40 | + */ |
|
41 | + protected $taxonomies = array(); |
|
42 | + |
|
43 | + /** |
|
44 | + * meta table for the related CPT |
|
45 | + * |
|
46 | + * @var \EE_Secondary_Table $meta_table |
|
47 | + */ |
|
48 | + protected $meta_table; |
|
49 | + |
|
50 | + /** |
|
51 | + * EEM_CPT_Base model for the related CPT |
|
52 | + * |
|
53 | + * @var \EEM_CPT_Base $model |
|
54 | + */ |
|
55 | + protected $model; |
|
56 | + |
|
57 | + /** |
|
58 | + * @var \EE_Request_Handler $request |
|
59 | + */ |
|
60 | + protected $request; |
|
61 | + |
|
62 | + /** |
|
63 | + * @var \WP_Query $wp_query |
|
64 | + */ |
|
65 | + protected $wp_query; |
|
66 | + |
|
67 | + |
|
68 | + /** |
|
69 | + * CptQueryModifier constructor |
|
70 | + * |
|
71 | + * @param string $post_type |
|
72 | + * @param array $cpt_details |
|
73 | + * @param \WP_Query $WP_Query |
|
74 | + * @param \EE_Request_Handler $request |
|
75 | + */ |
|
76 | + public function __construct( |
|
77 | + $post_type, |
|
78 | + array $cpt_details, |
|
79 | + \WP_Query $WP_Query, |
|
80 | + \EE_Request_Handler $request |
|
81 | + ) { |
|
82 | + $this->setRequest($request); |
|
83 | + $this->setWpQuery($WP_Query); |
|
84 | + $this->setPostType($post_type); |
|
85 | + $this->setCptDetails($cpt_details); |
|
86 | + $this->init(); |
|
87 | + } |
|
88 | + |
|
89 | + |
|
90 | + /** |
|
91 | + * @return string |
|
92 | + */ |
|
93 | + public function postType() |
|
94 | + { |
|
95 | + return $this->post_type; |
|
96 | + } |
|
97 | + |
|
98 | + |
|
99 | + /** |
|
100 | + * @param string $post_type |
|
101 | + */ |
|
102 | + protected function setPostType($post_type) |
|
103 | + { |
|
104 | + $this->post_type = $post_type; |
|
105 | + } |
|
106 | + |
|
107 | + |
|
108 | + /** |
|
109 | + * @return array |
|
110 | + */ |
|
111 | + public function cptDetails() |
|
112 | + { |
|
113 | + return $this->cpt_details; |
|
114 | + } |
|
115 | + |
|
116 | + |
|
117 | + /** |
|
118 | + * @param array $cpt_details |
|
119 | + */ |
|
120 | + protected function setCptDetails($cpt_details) |
|
121 | + { |
|
122 | + $this->cpt_details = $cpt_details; |
|
123 | + } |
|
124 | + |
|
125 | + |
|
126 | + /** |
|
127 | + * @return \EE_Table_Base[] |
|
128 | + */ |
|
129 | + public function modelTables() |
|
130 | + { |
|
131 | + return $this->model_tables; |
|
132 | + } |
|
133 | + |
|
134 | + |
|
135 | + /** |
|
136 | + * @param \EE_Table_Base[] $model_tables |
|
137 | + */ |
|
138 | + protected function setModelTables($model_tables) |
|
139 | + { |
|
140 | + $this->model_tables = $model_tables; |
|
141 | + } |
|
142 | + |
|
143 | + |
|
144 | + /** |
|
145 | + * @return array |
|
146 | + */ |
|
147 | + public function taxonomies() |
|
148 | + { |
|
149 | + if (empty($this->taxonomies)) { |
|
150 | + $this->initializeTaxonomies(); |
|
151 | + } |
|
152 | + return $this->taxonomies; |
|
153 | + } |
|
154 | + |
|
155 | + |
|
156 | + /** |
|
157 | + * @param array $taxonomies |
|
158 | + */ |
|
159 | + protected function setTaxonomies(array $taxonomies) |
|
160 | + { |
|
161 | + $this->taxonomies = $taxonomies; |
|
162 | + } |
|
163 | + |
|
164 | + |
|
165 | + /** |
|
166 | + * @return \EE_Secondary_Table |
|
167 | + */ |
|
168 | + public function metaTable() |
|
169 | + { |
|
170 | + return $this->meta_table; |
|
171 | + } |
|
172 | + |
|
173 | + |
|
174 | + /** |
|
175 | + * @param \EE_Secondary_Table $meta_table |
|
176 | + */ |
|
177 | + public function setMetaTable(\EE_Secondary_Table $meta_table) |
|
178 | + { |
|
179 | + $this->meta_table = $meta_table; |
|
180 | + } |
|
181 | + |
|
182 | + |
|
183 | + /** |
|
184 | + * @return \EEM_Base |
|
185 | + */ |
|
186 | + public function model() |
|
187 | + { |
|
188 | + return $this->model; |
|
189 | + } |
|
190 | + |
|
191 | + |
|
192 | + /** |
|
193 | + * @param \EEM_Base $CPT_model |
|
194 | + */ |
|
195 | + protected function setModel(\EEM_Base $CPT_model) |
|
196 | + { |
|
197 | + $this->model = $CPT_model; |
|
198 | + } |
|
199 | + |
|
200 | + |
|
201 | + /** |
|
202 | + * @return \EE_Request_Handler |
|
203 | + */ |
|
204 | + public function request() |
|
205 | + { |
|
206 | + return $this->request; |
|
207 | + } |
|
208 | + |
|
209 | + |
|
210 | + /** |
|
211 | + * @param \EE_Request_Handler $request |
|
212 | + */ |
|
213 | + protected function setRequest(\EE_Request_Handler $request) |
|
214 | + { |
|
215 | + $this->request = $request; |
|
216 | + } |
|
217 | + |
|
218 | + // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps |
|
219 | + |
|
220 | + /** |
|
221 | + * @return \WP_Query |
|
222 | + */ |
|
223 | + public function WpQuery() |
|
224 | + { |
|
225 | + return $this->wp_query; |
|
226 | + } |
|
227 | + // phpcs:enable |
|
228 | + |
|
229 | + /** |
|
230 | + * @param \WP_Query $wp_query |
|
231 | + */ |
|
232 | + public function setWpQuery(\WP_Query $wp_query) |
|
233 | + { |
|
234 | + $this->wp_query = $wp_query; |
|
235 | + } |
|
236 | + |
|
237 | + |
|
238 | + /** |
|
239 | + * @return void |
|
240 | + * @throws InvalidDataTypeException |
|
241 | + * @throws InvalidInterfaceException |
|
242 | + * @throws InvalidArgumentException |
|
243 | + */ |
|
244 | + protected function initializeTaxonomies() |
|
245 | + { |
|
246 | + // check if taxonomies have already been set and that this CPT has taxonomies registered for it |
|
247 | + if (empty($this->taxonomies) |
|
248 | + && isset($this->cpt_details['args']['taxonomies']) |
|
249 | + ) { |
|
250 | + // if so then grab them, but we want the taxonomy name as the key |
|
251 | + $taxonomies = array_flip($this->cpt_details['args']['taxonomies']); |
|
252 | + // then grab the list of ALL taxonomies |
|
253 | + /** @var \EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions |
|
254 | + * $taxonomy_definitions |
|
255 | + */ |
|
256 | + $taxonomy_definitions = LoaderFactory::getLoader()->getShared( |
|
257 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' |
|
258 | + ); |
|
259 | + $all_taxonomies = $taxonomy_definitions->getCustomTaxonomyDefinitions(); |
|
260 | + foreach ($taxonomies as $taxonomy => &$details) { |
|
261 | + // add details to our taxonomies if they exist |
|
262 | + $details = isset($all_taxonomies[ $taxonomy ]) |
|
263 | + ? $all_taxonomies[ $taxonomy ] |
|
264 | + : array(); |
|
265 | + } |
|
266 | + // ALWAYS unset() variables that were passed by reference |
|
267 | + unset($details); |
|
268 | + $this->setTaxonomies($taxonomies); |
|
269 | + } |
|
270 | + } |
|
271 | + |
|
272 | + |
|
273 | + protected function init() |
|
274 | + { |
|
275 | + $this->setAdditionalCptDetails(); |
|
276 | + $this->setRequestVarsIfCpt(); |
|
277 | + // convert post_type to model name |
|
278 | + $model_name = str_replace('EE_', '', $this->cpt_details['class_name']); |
|
279 | + // load all tables related to CPT |
|
280 | + $this->setupModelsAndTables($model_name); |
|
281 | + // load and instantiate CPT_*_Strategy |
|
282 | + $CPT_Strategy = $this->cptStrategyClass($model_name); |
|
283 | + // !!!!!!!!!! IMPORTANT !!!!!!!!!!!! |
|
284 | + // here's the list of available filters in the WP_Query object |
|
285 | + // 'posts_where_paged' |
|
286 | + // 'posts_groupby' |
|
287 | + // 'posts_join_paged' |
|
288 | + // 'posts_orderby' |
|
289 | + // 'posts_distinct' |
|
290 | + // 'post_limits' |
|
291 | + // 'posts_fields' |
|
292 | + // 'posts_join' |
|
293 | + add_filter('posts_fields', array($this, 'postsFields')); |
|
294 | + add_filter('posts_join', array($this, 'postsJoin')); |
|
295 | + add_filter( |
|
296 | + 'get_' . $this->post_type . '_metadata', |
|
297 | + array($CPT_Strategy, 'get_EE_post_type_metadata'), |
|
298 | + 1, |
|
299 | + 4 |
|
300 | + ); |
|
301 | + add_filter('the_posts', array($this, 'thePosts'), 1, 1); |
|
302 | + if ($this->wp_query->is_main_query()) { |
|
303 | + add_filter('get_edit_post_link', array($this, 'getEditPostLink'), 10, 2); |
|
304 | + $this->addTemplateFilters(); |
|
305 | + } |
|
306 | + } |
|
307 | + |
|
308 | + |
|
309 | + /** |
|
310 | + * sets some basic query vars that pertain to the CPT |
|
311 | + * |
|
312 | + * @access protected |
|
313 | + * @return void |
|
314 | + */ |
|
315 | + protected function setAdditionalCptDetails() |
|
316 | + { |
|
317 | + // the post or category or term that is triggering EE |
|
318 | + $this->cpt_details['espresso_page'] = $this->request->is_espresso_page(); |
|
319 | + // requested post name |
|
320 | + $this->cpt_details['post_name'] = $this->request->get('post_name'); |
|
321 | + // add support for viewing 'private', 'draft', or 'pending' posts |
|
322 | + if (isset($this->wp_query->query_vars['p']) |
|
323 | + && $this->wp_query->query_vars['p'] !== 0 |
|
324 | + && is_user_logged_in() |
|
325 | + && current_user_can('edit_post', $this->wp_query->query_vars['p']) |
|
326 | + ) { |
|
327 | + // we can just inject directly into the WP_Query object |
|
328 | + $this->wp_query->query['post_status'] = array('publish', 'private', 'draft', 'pending'); |
|
329 | + // now set the main 'ee' request var so that the appropriate module can load the appropriate template(s) |
|
330 | + $this->request->set('ee', $this->cpt_details['singular_slug']); |
|
331 | + } |
|
332 | + } |
|
333 | + |
|
334 | + |
|
335 | + /** |
|
336 | + * Checks if we're on a EE-CPT archive-or-single page, and if we've never set the EE request var. |
|
337 | + * If so, sets the 'ee' request variable |
|
338 | + * so other parts of EE can know what CPT is getting queried. |
|
339 | + * To Mike's knowledge, this must be called from during or after the pre_get_posts hook |
|
340 | + * in order for is_archive() and is_single() methods to work properly. |
|
341 | + * |
|
342 | + * @return void |
|
343 | + */ |
|
344 | + public function setRequestVarsIfCpt() |
|
345 | + { |
|
346 | + // check if ee action var has been set |
|
347 | + if (! $this->request->is_set('ee')) { |
|
348 | + // check that route exists for CPT archive slug |
|
349 | + if (is_archive() && \EE_Config::get_route($this->cpt_details['plural_slug'])) { |
|
350 | + // ie: set "ee" to "events" |
|
351 | + $this->request->set('ee', $this->cpt_details['plural_slug']); |
|
352 | + // or does it match a single page CPT like /event/ |
|
353 | + } elseif (is_single() && \EE_Config::get_route($this->cpt_details['singular_slug'])) { |
|
354 | + // ie: set "ee" to "event" |
|
355 | + $this->request->set('ee', $this->cpt_details['singular_slug']); |
|
356 | + } |
|
357 | + } |
|
358 | + } |
|
359 | + |
|
360 | + |
|
361 | + /** |
|
362 | + * setupModelsAndTables |
|
363 | + * |
|
364 | + * @access protected |
|
365 | + * @param string $model_name |
|
366 | + * @throws \EE_Error |
|
367 | + */ |
|
368 | + protected function setupModelsAndTables($model_name) |
|
369 | + { |
|
370 | + // get CPT table data via CPT Model |
|
371 | + $model = \EE_Registry::instance()->load_model($model_name); |
|
372 | + if (! $model instanceof \EEM_Base) { |
|
373 | + throw new \EE_Error( |
|
374 | + sprintf( |
|
375 | + __( |
|
376 | + 'The "%1$s" model could not be loaded.', |
|
377 | + 'event_espresso' |
|
378 | + ), |
|
379 | + $model_name |
|
380 | + ) |
|
381 | + ); |
|
382 | + } |
|
383 | + $this->setModel($model); |
|
384 | + $this->setModelTables($this->model->get_tables()); |
|
385 | + // is there a Meta Table for this CPT? |
|
386 | + if (isset($this->cpt_details['tables'][ $model_name . '_Meta' ]) |
|
387 | + && $this->cpt_details['tables'][ $model_name . '_Meta' ] instanceof \EE_Secondary_Table |
|
388 | + ) { |
|
389 | + $this->setMetaTable($this->cpt_details['tables'][ $model_name . '_Meta' ]); |
|
390 | + } |
|
391 | + } |
|
392 | + |
|
393 | + |
|
394 | + /** |
|
395 | + * cptStrategyClass |
|
396 | + * |
|
397 | + * @access protected |
|
398 | + * @param string $model_name |
|
399 | + * @return string |
|
400 | + */ |
|
401 | + protected function cptStrategyClass($model_name) |
|
402 | + { |
|
403 | + // creates classname like: CPT_Event_Strategy |
|
404 | + $CPT_Strategy_class_name = 'CPT_' . $model_name . '_Strategy'; |
|
405 | + // load and instantiate |
|
406 | + $CPT_Strategy = \EE_Registry::instance()->load_core( |
|
407 | + $CPT_Strategy_class_name, |
|
408 | + array('WP_Query' => $this->wp_query, 'CPT' => $this->cpt_details) |
|
409 | + ); |
|
410 | + if ($CPT_Strategy === null) { |
|
411 | + $CPT_Strategy = \EE_Registry::instance()->load_core( |
|
412 | + 'CPT_Default_Strategy', |
|
413 | + array('WP_Query' => $this->wp_query, 'CPT' => $this->cpt_details) |
|
414 | + ); |
|
415 | + } |
|
416 | + return $CPT_Strategy; |
|
417 | + } |
|
418 | + |
|
419 | + |
|
420 | + /** |
|
421 | + * postsFields |
|
422 | + * |
|
423 | + * @access public |
|
424 | + * @param $SQL |
|
425 | + * @return string |
|
426 | + */ |
|
427 | + public function postsFields($SQL) |
|
428 | + { |
|
429 | + // does this CPT have a meta table ? |
|
430 | + if ($this->meta_table instanceof \EE_Secondary_Table) { |
|
431 | + // adds something like ", wp_esp_event_meta.* " to WP Query SELECT statement |
|
432 | + $SQL .= ', ' . $this->meta_table->get_table_name() . '.* '; |
|
433 | + } |
|
434 | + remove_filter('posts_fields', array($this, 'postsFields')); |
|
435 | + return $SQL; |
|
436 | + } |
|
437 | + |
|
438 | + |
|
439 | + /** |
|
440 | + * postsJoin |
|
441 | + * |
|
442 | + * @access public |
|
443 | + * @param $SQL |
|
444 | + * @return string |
|
445 | + */ |
|
446 | + public function postsJoin($SQL) |
|
447 | + { |
|
448 | + // does this CPT have a meta table ? |
|
449 | + if ($this->meta_table instanceof \EE_Secondary_Table) { |
|
450 | + global $wpdb; |
|
451 | + // adds something like " LEFT JOIN wp_esp_event_meta ON ( wp_esp_event_meta.EVT_ID = wp_posts.ID ) " to WP Query JOIN statement |
|
452 | + $SQL .= ' LEFT JOIN ' |
|
453 | + . $this->meta_table->get_table_name() |
|
454 | + . ' ON ( ' |
|
455 | + . $this->meta_table->get_table_name() |
|
456 | + . '.' |
|
457 | + . $this->meta_table->get_fk_on_table() |
|
458 | + . ' = ' |
|
459 | + . $wpdb->posts |
|
460 | + . '.ID ) '; |
|
461 | + } |
|
462 | + remove_filter('posts_join', array($this, 'postsJoin')); |
|
463 | + return $SQL; |
|
464 | + } |
|
465 | + |
|
466 | + |
|
467 | + /** |
|
468 | + * thePosts |
|
469 | + * |
|
470 | + * @access public |
|
471 | + * @param \WP_Post[] $posts |
|
472 | + * @return \WP_Post[] |
|
473 | + */ |
|
474 | + public function thePosts($posts) |
|
475 | + { |
|
476 | + $CPT_class = $this->cpt_details['class_name']; |
|
477 | + // loop thru posts |
|
478 | + if (is_array($posts) && $this->model instanceof \EEM_CPT_Base) { |
|
479 | + foreach ($posts as $key => $post) { |
|
480 | + if ($post->post_type === $this->post_type) { |
|
481 | + $post->{$CPT_class} = $this->model->instantiate_class_from_post_object($post); |
|
482 | + } |
|
483 | + } |
|
484 | + } |
|
485 | + remove_filter('the_posts', array($this, 'thePosts'), 1); |
|
486 | + return $posts; |
|
487 | + } |
|
488 | + |
|
489 | + |
|
490 | + /** |
|
491 | + * @param $url |
|
492 | + * @param $ID |
|
493 | + * @return string |
|
494 | + */ |
|
495 | + public function getEditPostLink($url, $ID) |
|
496 | + { |
|
497 | + // need to make sure we only edit links if our cpt |
|
498 | + global $post; |
|
499 | + // notice if the cpt is registered with `show_ee_ui` set to false, we take that to mean that the WordPress core ui |
|
500 | + // for interacting with the CPT is desired and there is no EE UI for interacting with the CPT in the admin. |
|
501 | + if (! $post instanceof \WP_Post |
|
502 | + || $post->post_type !== $this->post_type |
|
503 | + || ( |
|
504 | + isset($this->cpt_details['args']['show_ee_ui']) |
|
505 | + && ! $this->cpt_details['args']['show_ee_ui'] |
|
506 | + ) |
|
507 | + ) { |
|
508 | + return $url; |
|
509 | + } |
|
510 | + // k made it here so all is good. |
|
511 | + return wp_nonce_url( |
|
512 | + add_query_arg( |
|
513 | + array('page' => $this->post_type, 'post' => $ID, 'action' => 'edit'), |
|
514 | + admin_url('admin.php') |
|
515 | + ), |
|
516 | + 'edit', |
|
517 | + 'edit_nonce' |
|
518 | + ); |
|
519 | + } |
|
520 | + |
|
521 | + |
|
522 | + /** |
|
523 | + * Execute any template filters. |
|
524 | + * This method is only called if in main query. |
|
525 | + * |
|
526 | + * @return void |
|
527 | + */ |
|
528 | + public function addTemplateFilters() |
|
529 | + { |
|
530 | + // if requested cpt supports page_templates and it's the main query |
|
531 | + if (! empty($this->cpt_details['args']['page_templates']) && $this->wp_query->is_main_query()) { |
|
532 | + // then let's hook into the appropriate query_template hook |
|
533 | + add_filter('single_template', array($this, 'singleCptTemplate')); |
|
534 | + } |
|
535 | + } |
|
536 | + |
|
537 | + |
|
538 | + /** |
|
539 | + * Callback for single_template wp filter. |
|
540 | + * This is used to load the set page_template for a single ee cpt if its set. If "default" then we load the normal |
|
541 | + * hierarchy. |
|
542 | + * |
|
543 | + * @access public |
|
544 | + * @param string $current_template Existing default template path derived for this page call. |
|
545 | + * @return string the path to the full template file. |
|
546 | + */ |
|
547 | + public function singleCptTemplate($current_template) |
|
548 | + { |
|
549 | + $object = get_queried_object(); |
|
550 | + // does this called object HAVE a page template set that is something other than the default. |
|
551 | + $template = get_post_meta($object->ID, '_wp_page_template', true); |
|
552 | + // exit early if default or not set or invalid path (accounts for theme changes) |
|
553 | + if ($template === 'default' |
|
554 | + || empty($template) |
|
555 | + || ! is_readable(get_stylesheet_directory() . '/' . $template) |
|
556 | + ) { |
|
557 | + return $current_template; |
|
558 | + } |
|
559 | + // made it here so we SHOULD be able to just locate the template and then return it. |
|
560 | + return locate_template(array($template)); |
|
561 | + } |
|
562 | 562 | } |
@@ -259,8 +259,8 @@ discard block |
||
259 | 259 | $all_taxonomies = $taxonomy_definitions->getCustomTaxonomyDefinitions(); |
260 | 260 | foreach ($taxonomies as $taxonomy => &$details) { |
261 | 261 | // add details to our taxonomies if they exist |
262 | - $details = isset($all_taxonomies[ $taxonomy ]) |
|
263 | - ? $all_taxonomies[ $taxonomy ] |
|
262 | + $details = isset($all_taxonomies[$taxonomy]) |
|
263 | + ? $all_taxonomies[$taxonomy] |
|
264 | 264 | : array(); |
265 | 265 | } |
266 | 266 | // ALWAYS unset() variables that were passed by reference |
@@ -293,7 +293,7 @@ discard block |
||
293 | 293 | add_filter('posts_fields', array($this, 'postsFields')); |
294 | 294 | add_filter('posts_join', array($this, 'postsJoin')); |
295 | 295 | add_filter( |
296 | - 'get_' . $this->post_type . '_metadata', |
|
296 | + 'get_'.$this->post_type.'_metadata', |
|
297 | 297 | array($CPT_Strategy, 'get_EE_post_type_metadata'), |
298 | 298 | 1, |
299 | 299 | 4 |
@@ -344,7 +344,7 @@ discard block |
||
344 | 344 | public function setRequestVarsIfCpt() |
345 | 345 | { |
346 | 346 | // check if ee action var has been set |
347 | - if (! $this->request->is_set('ee')) { |
|
347 | + if ( ! $this->request->is_set('ee')) { |
|
348 | 348 | // check that route exists for CPT archive slug |
349 | 349 | if (is_archive() && \EE_Config::get_route($this->cpt_details['plural_slug'])) { |
350 | 350 | // ie: set "ee" to "events" |
@@ -369,7 +369,7 @@ discard block |
||
369 | 369 | { |
370 | 370 | // get CPT table data via CPT Model |
371 | 371 | $model = \EE_Registry::instance()->load_model($model_name); |
372 | - if (! $model instanceof \EEM_Base) { |
|
372 | + if ( ! $model instanceof \EEM_Base) { |
|
373 | 373 | throw new \EE_Error( |
374 | 374 | sprintf( |
375 | 375 | __( |
@@ -383,10 +383,10 @@ discard block |
||
383 | 383 | $this->setModel($model); |
384 | 384 | $this->setModelTables($this->model->get_tables()); |
385 | 385 | // is there a Meta Table for this CPT? |
386 | - if (isset($this->cpt_details['tables'][ $model_name . '_Meta' ]) |
|
387 | - && $this->cpt_details['tables'][ $model_name . '_Meta' ] instanceof \EE_Secondary_Table |
|
386 | + if (isset($this->cpt_details['tables'][$model_name.'_Meta']) |
|
387 | + && $this->cpt_details['tables'][$model_name.'_Meta'] instanceof \EE_Secondary_Table |
|
388 | 388 | ) { |
389 | - $this->setMetaTable($this->cpt_details['tables'][ $model_name . '_Meta' ]); |
|
389 | + $this->setMetaTable($this->cpt_details['tables'][$model_name.'_Meta']); |
|
390 | 390 | } |
391 | 391 | } |
392 | 392 | |
@@ -401,7 +401,7 @@ discard block |
||
401 | 401 | protected function cptStrategyClass($model_name) |
402 | 402 | { |
403 | 403 | // creates classname like: CPT_Event_Strategy |
404 | - $CPT_Strategy_class_name = 'CPT_' . $model_name . '_Strategy'; |
|
404 | + $CPT_Strategy_class_name = 'CPT_'.$model_name.'_Strategy'; |
|
405 | 405 | // load and instantiate |
406 | 406 | $CPT_Strategy = \EE_Registry::instance()->load_core( |
407 | 407 | $CPT_Strategy_class_name, |
@@ -429,7 +429,7 @@ discard block |
||
429 | 429 | // does this CPT have a meta table ? |
430 | 430 | if ($this->meta_table instanceof \EE_Secondary_Table) { |
431 | 431 | // adds something like ", wp_esp_event_meta.* " to WP Query SELECT statement |
432 | - $SQL .= ', ' . $this->meta_table->get_table_name() . '.* '; |
|
432 | + $SQL .= ', '.$this->meta_table->get_table_name().'.* '; |
|
433 | 433 | } |
434 | 434 | remove_filter('posts_fields', array($this, 'postsFields')); |
435 | 435 | return $SQL; |
@@ -498,7 +498,7 @@ discard block |
||
498 | 498 | global $post; |
499 | 499 | // notice if the cpt is registered with `show_ee_ui` set to false, we take that to mean that the WordPress core ui |
500 | 500 | // for interacting with the CPT is desired and there is no EE UI for interacting with the CPT in the admin. |
501 | - if (! $post instanceof \WP_Post |
|
501 | + if ( ! $post instanceof \WP_Post |
|
502 | 502 | || $post->post_type !== $this->post_type |
503 | 503 | || ( |
504 | 504 | isset($this->cpt_details['args']['show_ee_ui']) |
@@ -528,7 +528,7 @@ discard block |
||
528 | 528 | public function addTemplateFilters() |
529 | 529 | { |
530 | 530 | // if requested cpt supports page_templates and it's the main query |
531 | - if (! empty($this->cpt_details['args']['page_templates']) && $this->wp_query->is_main_query()) { |
|
531 | + if ( ! empty($this->cpt_details['args']['page_templates']) && $this->wp_query->is_main_query()) { |
|
532 | 532 | // then let's hook into the appropriate query_template hook |
533 | 533 | add_filter('single_template', array($this, 'singleCptTemplate')); |
534 | 534 | } |
@@ -552,7 +552,7 @@ discard block |
||
552 | 552 | // exit early if default or not set or invalid path (accounts for theme changes) |
553 | 553 | if ($template === 'default' |
554 | 554 | || empty($template) |
555 | - || ! is_readable(get_stylesheet_directory() . '/' . $template) |
|
555 | + || ! is_readable(get_stylesheet_directory().'/'.$template) |
|
556 | 556 | ) { |
557 | 557 | return $current_template; |
558 | 558 | } |
@@ -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 ''; |
@@ -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 | } |