Completed
Branch FET/asset-manager (433489)
by
unknown
32:42 queued 18:11
created
admin_pages/general_settings/AdminOptionsSettings.php 1 patch
Indentation   +204 added lines, -204 removed lines patch added patch discarded remove patch
@@ -26,219 +26,219 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
modules/invalid_checkout_access/InvalidCheckoutAccess.php 2 patches
Indentation   +168 added lines, -168 removed lines patch added patch discarded remove patch
@@ -13,178 +13,178 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
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
 block discarded – undo
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(
Please login to merge, or discard this patch.
modules/ticket_selector/DisplayTicketSelector.php 2 patches
Indentation   +710 added lines, -710 removed lines patch added patch discarded remove patch
@@ -33,717 +33,717 @@
 block discarded – undo
33 33
 class DisplayTicketSelector
34 34
 {
35 35
 
36
-    /**
37
-     * event that ticket selector is being generated for
38
-     *
39
-     * @access protected
40
-     * @var EE_Event $event
41
-     */
42
-    protected $event;
43
-
44
-    /**
45
-     * Used to flag when the ticket selector is being called from an external iframe.
46
-     *
47
-     * @var bool $iframe
48
-     */
49
-    protected $iframe = false;
50
-
51
-    /**
52
-     * max attendees that can register for event at one time
53
-     *
54
-     * @var int $max_attendees
55
-     */
56
-    private $max_attendees = EE_INF;
57
-
58
-    /**
59
-     * @var string $date_format
60
-     */
61
-    private $date_format;
62
-
63
-    /**
64
-     * @var string $time_format
65
-     */
66
-    private $time_format;
67
-
68
-    /**
69
-     * @var boolean $display_full_ui
70
-     */
71
-    private $display_full_ui;
72
-
73
-
74
-    /**
75
-     * DisplayTicketSelector constructor.
76
-     *
77
-     * @param bool $iframe
78
-     */
79
-    public function __construct($iframe = false)
80
-    {
81
-        $this->iframe = $iframe;
82
-        $this->date_format = apply_filters(
83
-            'FHEE__EED_Ticket_Selector__display_ticket_selector__date_format',
84
-            get_option('date_format')
85
-        );
86
-        $this->time_format = apply_filters(
87
-            'FHEE__EED_Ticket_Selector__display_ticket_selector__time_format',
88
-            get_option('time_format')
89
-        );
90
-    }
91
-
92
-
93
-    /**
94
-     * @return bool
95
-     */
96
-    public function isIframe()
97
-    {
98
-        return $this->iframe;
99
-    }
100
-
101
-
102
-    /**
103
-     * @param boolean $iframe
104
-     */
105
-    public function setIframe($iframe = true)
106
-    {
107
-        $this->iframe = filter_var($iframe, FILTER_VALIDATE_BOOLEAN);
108
-    }
109
-
110
-
111
-    /**
112
-     * finds and sets the \EE_Event object for use throughout class
113
-     *
114
-     * @param mixed $event
115
-     * @return bool
116
-     * @throws EE_Error
117
-     * @throws InvalidDataTypeException
118
-     * @throws InvalidInterfaceException
119
-     * @throws InvalidArgumentException
120
-     */
121
-    protected function setEvent($event = null)
122
-    {
123
-        if ($event === null) {
124
-            global $post;
125
-            $event = $post;
126
-        }
127
-        if ($event instanceof EE_Event) {
128
-            $this->event = $event;
129
-        } elseif ($event instanceof WP_Post) {
130
-            if (isset($event->EE_Event) && $event->EE_Event instanceof EE_Event) {
131
-                $this->event = $event->EE_Event;
132
-            } elseif ($event->post_type === 'espresso_events') {
133
-                $event->EE_Event = EEM_Event::instance()->instantiate_class_from_post_object($event);
134
-                $this->event = $event->EE_Event;
135
-            }
136
-        } else {
137
-            $user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso');
138
-            $dev_msg = $user_msg . __(
139
-                'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.',
140
-                'event_espresso'
141
-            );
142
-            EE_Error::add_error($user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__);
143
-            return false;
144
-        }
145
-        return true;
146
-    }
147
-
148
-
149
-    /**
150
-     * @return int
151
-     */
152
-    public function getMaxAttendees()
153
-    {
154
-        return $this->max_attendees;
155
-    }
156
-
157
-
158
-    /**
159
-     * @param int $max_attendees
160
-     */
161
-    public function setMaxAttendees($max_attendees)
162
-    {
163
-        $this->max_attendees = absint(
164
-            apply_filters(
165
-                'FHEE__EE_Ticket_Selector__display_ticket_selector__max_tickets',
166
-                $max_attendees
167
-            )
168
-        );
169
-    }
170
-
171
-
172
-    /**
173
-     * Returns whether or not the full ticket selector should be shown or not.
174
-     * Currently, it displays on the frontend (including ajax requests) but not the backend
175
-     *
176
-     * @return bool
177
-     */
178
-    private function display_full_ui()
179
-    {
180
-        if ($this->display_full_ui === null) {
181
-            $this->display_full_ui = ! is_admin() || (defined('DOING_AJAX') && DOING_AJAX);
182
-        }
183
-        return $this->display_full_ui;
184
-    }
185
-
186
-
187
-    /**
188
-     * creates buttons for selecting number of attendees for an event
189
-     *
190
-     * @param WP_Post|int $event
191
-     * @param bool        $view_details
192
-     * @return string
193
-     * @throws EE_Error
194
-     * @throws InvalidArgumentException
195
-     * @throws InvalidDataTypeException
196
-     * @throws InvalidInterfaceException
197
-     */
198
-    public function display($event = null, $view_details = false)
199
-    {
200
-        // reset filter for displaying submit button
201
-        remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
202
-        // poke and prod incoming event till it tells us what it is
203
-        if (! $this->setEvent($event)) {
204
-            return false;
205
-        }
206
-        // begin gathering template arguments by getting event status
207
-        $template_args = array('event_status' => $this->event->get_active_status());
208
-        if ($this->activeEventAndShowTicketSelector(
209
-            $event,
210
-            $template_args['event_status'],
211
-            $view_details
212
-        )) {
213
-            return ! is_single() ? $this->displayViewDetailsButton() : '';
214
-        }
215
-        // filter the maximum qty that can appear in the Ticket Selector qty dropdowns
216
-        $this->setMaxAttendees($this->event->additional_limit());
217
-        if ($this->getMaxAttendees() < 1) {
218
-            return $this->ticketSalesClosedMessage();
219
-        }
220
-        // is the event expired ?
221
-        $template_args['event_is_expired'] = $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
 }
Please login to merge, or discard this patch.
Spacing   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -135,11 +135,11 @@  discard block
 block discarded – undo
135 135
             }
136 136
         } else {
137 137
             $user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso');
138
-            $dev_msg = $user_msg . __(
138
+            $dev_msg = $user_msg.__(
139 139
                 'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.',
140 140
                 'event_espresso'
141 141
             );
142
-            EE_Error::add_error($user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__);
142
+            EE_Error::add_error($user_msg.'||'.$dev_msg, __FILE__, __FUNCTION__, __LINE__);
143 143
             return false;
144 144
         }
145 145
         return true;
@@ -200,7 +200,7 @@  discard block
 block discarded – undo
200 200
         // reset filter for displaying submit button
201 201
         remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true');
202 202
         // poke and prod incoming event till it tells us what it is
203
-        if (! $this->setEvent($event)) {
203
+        if ( ! $this->setEvent($event)) {
204 204
             return false;
205 205
         }
206 206
         // begin gathering template arguments by getting event status
@@ -235,7 +235,7 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 
Please login to merge, or discard this patch.
modules/ticket_selector/DatetimeSelector.php 2 patches
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -12,171 +12,171 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -102,10 +102,10 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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(
Please login to merge, or discard this patch.
modules/ticket_selector/TicketDatetimeAvailabilityTracker.php 1 patch
Indentation   +211 added lines, -211 removed lines patch added patch discarded remove patch
@@ -22,215 +22,215 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
caffeinated/modules/recaptcha/ReCaptcha/Response.php 2 patches
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -28,74 +28,74 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@
 block discarded – undo
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
 
Please login to merge, or discard this patch.
core/CPTs/CptQueryModifier.php 2 patches
Indentation   +541 added lines, -541 removed lines patch added patch discarded remove patch
@@ -18,545 +18,545 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -259,8 +259,8 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
         }
Please login to merge, or discard this patch.
core/exceptions/ExceptionStackTraceDisplay.php 2 patches
Indentation   +285 added lines, -285 removed lines patch added patch discarded remove patch
@@ -19,52 +19,52 @@  discard block
 block discarded – undo
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
 block discarded – undo
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 : '&nbsp;';
112
-                $line = ! empty($line) ? $line : '&nbsp;';
113
-                $file = ! empty($file) ? $file : '&nbsp;';
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 : '&nbsp;';
112
+				$line = ! empty($line) ? $line : '&nbsp;';
113
+				$file = ! empty($file) ? $file : '&nbsp;';
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> &nbsp; <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> &nbsp; <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>  &nbsp; <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>  &nbsp; <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
-                           ' &nbsp; <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
+						   ' &nbsp; <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[] = ' &nbsp;&nbsp; ';
255
-            }
256
-            if (is_string($arg)) {
257
-                if (! $array && strlen($arg) > 75) {
258
-                    $args[] = '<br />';
259
-                    for ($i = 0; $i <= $indent; $i++) {
260
-                        $args[] = ' &nbsp;&nbsp; ';
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[] = ' &nbsp;&nbsp; ';
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[] = ' &nbsp;&nbsp; ';
255
+			}
256
+			if (is_string($arg)) {
257
+				if (! $array && strlen($arg) > 75) {
258
+					$args[] = '<br />';
259
+					for ($i = 0; $i <= $indent; $i++) {
260
+						$args[] = ' &nbsp;&nbsp; ';
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[] = ' &nbsp;&nbsp; ';
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
 block discarded – undo
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
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +23 added lines, -23 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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> &nbsp; <sup>'
@@ -165,7 +165,7 @@  discard block
 block discarded – undo
165 165
                            '<strong class="ee-error-dev-msg-str">',
166 166
                            get_class($exception),
167 167
                            '</strong>  &nbsp; <span>',
168
-                           $code . '</span>'
168
+                           $code.'</span>'
169 169
                        )
170 170
                        . '<br />
171 171
 				<span class="big-text">"'
@@ -195,14 +195,14 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
254 254
                 $args[] = ' &nbsp;&nbsp; ';
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[] = ' &nbsp;&nbsp; ';
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
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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 '';
Please login to merge, or discard this patch.
core/services/cache/PostRelatedCacheManager.php 2 patches
Indentation   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -13,121 +13,121 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
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
 block discarded – undo
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
 block discarded – undo
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
 }
Please login to merge, or discard this patch.