PluginProbe
Booking Calendar / 10.15.6
Booking Calendar v10.15.6
11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 10.11.2 All 203 releases
booking / includes / _front_end / class-fe-render.php

class-fe-render.php in Booking Calendar 10.15.6, at includes/_front_end/class-fe-render.php

341 lines 14.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Front-End Render (Booking form, Calendar)
4 *
5 * File: /wp-content/plugins/booking/includes/_front_end/class-fe-render.php
6 */
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit;
10 }
11
12 class WPBC_FE_Render {
13
14 /**
15 * Echo or return helper (to preserve legacy API behavior).
16 *
17 * @param string $html - already escaped/sanitizing HTML content.
18 * @param bool $is_echo - do we need to echo it?.
19 *
20 * @return string|void
21 */
22 private static function echo_or_return( $html, $is_echo ) {
23
24 if ( $is_echo ) {
25
26 echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
27
28 return;
29 }
30
31 return $html;
32 }
33
34 // -----------------------------------------------------------------------------------------------------------------
35
36 /**
37 * Render Booking Form (Calendar + Form).
38 *
39 * @param array $params_arr
40 *
41 * @return string|void
42 */
43 public static function render_booking_form( $params_arr = array() ) {
44
45 // Default parameters (keep identical to legacy).
46 $default_params = array(
47 'resource_id' => 1,
48 'cal_count' => 1,
49 'is_echo' => 1,
50 'custom_booking_form' => 'standard',
51 'selected_dates_without_calendar' => '',
52 'start_month_calendar' => false,
53 'shortcode_param__options' => '',
54 'calendar_dates_start' => '',
55 'calendar_dates_end' => '',
56 'form_status' => 'published',
57 );
58 $params_arr = wp_parse_args( $params_arr, $default_params );
59 $is_echo = ( ! empty( $params_arr['is_echo'] ) );
60
61 // ---------------------------------------------------------------------
62 // Hash resolution, e.g. $_GET['booking_hash'] for Booking Form rendering.
63 // ---------------------------------------------------------------------
64 $hash_res = WPBC_FE_Attr_Postprocessor::resolve_booking_hash_and_maybe_get_parent_resource_id( $params_arr, 'form' );
65 if ( ! $hash_res['ok'] ) {
66 return self::echo_or_return( $hash_res['error_html'], $is_echo );
67 }
68 $params_arr = $hash_res['params_arr'];
69
70 // ---------------------------------------------------------------------
71 // Normalize aggregate resource IDs. - "5;3;9" -> [ 'resource_id' => 5, 'aggregate_resource_id_arr' => [5,3,9] ].
72 // ---------------------------------------------------------------------
73 $aggregate_resource_id_arr = array();
74 $split = WPBC_FE_Attr_Postprocessor::split_aggregate_resource_id( $params_arr['resource_id'] );
75 $params_arr['resource_id'] = $split['resource_id'];
76 $aggregate_resource_id_arr = $split['aggregate_resource_id_arr'];
77
78 // ---------------------------------------------------------------------
79 // Validate resource_id parameter and check if booking resource exists.
80 // ---------------------------------------------------------------------
81 $resource_validation = WPBC_FE_Attr_Postprocessor::validate_resource_id( $params_arr['resource_id'] );
82 if ( true !== $resource_validation ) {
83 return self::echo_or_return( $resource_validation, $is_echo );
84 }
85
86 // ---------------------------------------------------------------------
87 // == MU ==
88 // ---------------------------------------------------------------------
89 make_bk_action( 'check_multiuser_params_for_client_side', $params_arr['resource_id'] );
90
91 // ---------------------------------------------------------------------
92 // Normalize calendar_dates_start/end.
93 // ---------------------------------------------------------------------
94 $calendar_dates_range = WPBC_FE_Attr_Postprocessor::normalize_calendar_dates_range( $params_arr['calendar_dates_start'], $params_arr['calendar_dates_end'] );
95
96 // ---------------------------------------------------------------------
97 // Calendar load params (keep identical keys).
98 // ---------------------------------------------------------------------
99 $calendar_load_params = array(
100 'resource_id' => $params_arr['resource_id'],
101 'aggregate_resource_id_arr' => $aggregate_resource_id_arr,
102 'selected_dates_without_calendar' => $params_arr['selected_dates_without_calendar'],
103 'calendar_number_of_months' => $params_arr['cal_count'],
104 'start_month_calendar' => $params_arr['start_month_calendar'],
105 'shortcode_options' => $params_arr['shortcode_param__options'],
106 'custom_form' => $params_arr['custom_booking_form'],
107 'calendar_dates_start' => $calendar_dates_range['start'],
108 'calendar_dates_end' => $calendar_dates_range['end'],
109 );
110
111 $start_script_code = wpbc__calendar__load( $calendar_load_params );
112
113 // Disable booked time slots when selected date is predefined (legacy behavior).
114 if ( '' !== $params_arr['selected_dates_without_calendar'] ) {
115 $assets_key = 'wpbc:disable_time_fields_in_booking_form:' . intval( $params_arr['resource_id'] );
116
117 // Fire on all booking dates loaded. // FixIn: 10.14.17.2.
118 $local_js_code = " jQuery( 'body' ).on( 'wpbc_calendar_ajx__loaded_data', function ( event, loaded_resource_id ){ ";
119 $local_js_code .= ' if ( loaded_resource_id == ' . intval( $params_arr['resource_id'] ) . ' ){ ';
120 $local_js_code .= ' wpbc_disable_time_fields_in_booking_form(' . intval( $params_arr['resource_id'] ) . ')';
121 $local_js_code .= ' }';
122 $local_js_code .= '} );';
123
124 $added = WPBC_FE_Assets::add_jq_ready_js_to_wp_script( 'wpbc_all', $local_js_code, $assets_key );
125 if ( ! $added ) {
126 $start_script_code .= WPBC_FE_Assets::add_inline_js( $local_js_code, $assets_key ); // Fallback to direct inline JS, if previosly not edded script.
127 }
128 }
129
130 // ---------------------------------------------------------------------
131 // For Phase #1 we still use legacy HTML builder for the form body. (Later phases will move it fully.)
132 // ---------------------------------------------------------------------
133 $legacy = wpbc_get_legacy_booking_instance();
134 if ( ! $legacy ) {
135 $err = '<div class="wpbc_after_booking_thank_you_section"><div class="wpbc_ty__container"><div class="wpbc_ty__header"><strong>' . esc_html__( 'Oops!', 'booking' ) . '</strong> ' . esc_html__( 'Booking Calendar front-end renderer is not available. Please contact support.', 'booking' ) . '</div></div></div>';
136 return self::echo_or_return( $err, $is_echo );
137 }
138
139 $form_html = WPBC_FE_Form_Body_Renderer::render(
140 array(
141 'resource_id' => $params_arr['resource_id'],
142 'custom_booking_form' => $params_arr['custom_booking_form'],
143 'form_status' => $params_arr['form_status'],
144 'selected_dates_without_calendar' => $params_arr['selected_dates_without_calendar'],
145 'cal_count' => $params_arr['cal_count'],
146 'shortcode_param__options' => $params_arr['shortcode_param__options'],
147 'legacy_instance' => $legacy,
148 )
149 );
150
151 $my_result = ' ' . $form_html . ' ' . $start_script_code;
152
153
154 // Add DIV structure, where to show payment form.
155 $my_result = apply_filters( 'wpdev_booking_form', $my_result, $params_arr['resource_id'] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
156
157 // == MU ==
158 make_bk_action( 'finish_check_multiuser_params_for_client_side', $params_arr['resource_id'] );
159
160 return self::echo_or_return( $my_result, $is_echo );
161 }
162
163
164 /**
165 * Render Availability Calendar Only.
166 *
167 * @param array $params_arr
168 *
169 * @return string|void
170 */
171 public static function render_calendar_only( $params_arr = array() ) {
172
173 $default_params = array(
174 'resource_id' => 1,
175 'cal_count' => 1,
176 'is_echo' => 1,
177 'start_month_calendar' => false,
178 'shortcode_param__options' => '',
179 'calendar_dates_start' => '',
180 'calendar_dates_end' => '',
181 );
182 $params_arr = wp_parse_args( $params_arr, $default_params );
183 $is_echo = ( ! empty( $params_arr['is_echo'] ) );
184
185 // ---------------------------------------------------------------------
186 // Hash resolution, e.g. $_GET['booking_hash'] for Booking Form rendering.
187 // ---------------------------------------------------------------------
188 $hash_res = WPBC_FE_Attr_Postprocessor::resolve_booking_hash_and_maybe_get_parent_resource_id( $params_arr, 'calendar' );
189 if ( ! $hash_res['ok'] ) {
190 return self::echo_or_return( $hash_res['error_html'], $is_echo );
191 }
192 $params_arr = $hash_res['params_arr'];
193
194 // ---------------------------------------------------------------------
195 // Normalize aggregate resource IDs. - "5;3;9" -> [ 'resource_id' => 5, 'aggregate_resource_id_arr' => [5,3,9] ].
196 // ---------------------------------------------------------------------
197 $aggregate_resource_id_arr = array();
198 $split = WPBC_FE_Attr_Postprocessor::split_aggregate_resource_id( $params_arr['resource_id'] );
199 $params_arr['resource_id'] = $split['resource_id'];
200 $aggregate_resource_id_arr = $split['aggregate_resource_id_arr'];
201
202
203 // ---------------------------------------------------------------------
204 // Validate resource_id parameter and check if booking resource exists.
205 // ---------------------------------------------------------------------
206 $resource_validation = WPBC_FE_Attr_Postprocessor::validate_resource_id( $params_arr['resource_id'] );
207 if ( true !== $resource_validation ) {
208 return self::echo_or_return( $resource_validation, $is_echo );
209 }
210
211 // ---------------------------------------------------------------------
212 // == MU ==
213 // ---------------------------------------------------------------------
214 make_bk_action( 'check_multiuser_params_for_client_side', $params_arr['resource_id'] );
215
216 // ---------------------------------------------------------------------
217 // Normalize calendar_dates_start/end.
218 // ---------------------------------------------------------------------
219 $calendar_dates_range = WPBC_FE_Attr_Postprocessor::normalize_calendar_dates_range( $params_arr['calendar_dates_start'], $params_arr['calendar_dates_end'] );
220
221 $calendar_load_params = array(
222 'resource_id' => $params_arr['resource_id'],
223 'aggregate_resource_id_arr' => $aggregate_resource_id_arr,
224 'selected_dates_without_calendar' => '',
225 'calendar_number_of_months' => $params_arr['cal_count'],
226 'start_month_calendar' => $params_arr['start_month_calendar'],
227 'shortcode_options' => $params_arr['shortcode_param__options'],
228 'custom_form' => 'standard', // Because we show only 'AVAILABILITY CALENDAR' without the form, at all.
229 'calendar_dates_start' => $calendar_dates_range['start'],
230 'calendar_dates_end' => $calendar_dates_range['end'],
231 );
232 $start_script_code = wpbc__calendar__load( $calendar_load_params );
233
234
235 $my_result = '<div style="clear:both;height:10px;"></div>';
236 $my_result .= wpbc_pre_get_calendar_html( $params_arr['resource_id'], $params_arr['cal_count'], $params_arr['shortcode_param__options'] );
237 $my_result .= ' ' . $start_script_code;
238
239 // Keep legacy filter.
240 $my_result = apply_filters( 'wpdev_booking_calendar', $my_result, $params_arr['resource_id'] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
241
242 $booking_form_is_using_bs_css = get_bk_option( 'booking_form_is_using_bs_css' );
243 $my_result = '<span ' . ( ( 'On' === $booking_form_is_using_bs_css ) ? 'class="wpdevelop"' : '' ) . '>' . $my_result . '</span>';
244
245 // == MU ==
246 make_bk_action( 'finish_check_multiuser_params_for_client_side', $params_arr['resource_id'] );
247
248 return self::echo_or_return( $my_result, $is_echo );
249 }
250
251 }
252
253
254 /**
255 * Try to get legacy wpdev_booking instance (for Phase #1 fallback calls).
256 *
257 * @return wpdev_booking|null
258 */
259 function wpbc_get_legacy_booking_instance() {
260
261 if ( ! function_exists( 'WPBC' ) ) {
262 return null;
263 }
264
265 $wpbc_instance = WPBC();
266 if ( ! $wpbc_instance ) {
267 return null;
268 }
269
270 if ( empty( $wpbc_instance->booking_obj ) && class_exists( 'wpdev_booking' ) ) {
271 // Lazy boot as a last resort (avoid doing this if you don’t want any boot during true WPBC ajax).
272 $wpbc_instance->booking_obj = new wpdev_booking();
273 }
274
275 return ( $wpbc_instance->booking_obj instanceof wpdev_booking ) ? $wpbc_instance->booking_obj : null;
276 }
277
278
279
280 //TODO: replace evrywhere wpbc_get_rendered_booking_form_html() to some simpler call.
281
282 /**
283 * Get HTML of Rendered Booking From - Legacy type of calling render.
284 *
285 * @param $resource_id
286 * @param $cal_count
287 * @param $is_echo
288 * @param $my_booking_form
289 * @param $my_selected_dates_without_calendar
290 * @param $start_month_calendar
291 * @param $shortcode_param__options
292 *
293 * @return string|null
294 */
295 function wpbc_get_rendered_booking_form_html( $resource_id = 1, $cal_count = 1, $is_echo = 1, $my_booking_form = 'standard', $my_selected_dates_without_calendar = '', $start_month_calendar = false, $shortcode_param__options = array() ) {
296
297 return WPBC_FE_Render::render_booking_form(
298 array(
299 'resource_id' => $resource_id,
300 'cal_count' => $cal_count,
301 'is_echo' => $is_echo,
302 'custom_booking_form' => $my_booking_form,
303 'selected_dates_without_calendar' => $my_selected_dates_without_calendar,
304 'start_month_calendar' => $start_month_calendar,
305 'shortcode_param__options' => $shortcode_param__options,
306 )
307 );
308 }
309
310 /**
311 * Get booking form rendered HTML content without echo.
312 *
313 * @param $resource_id
314 * @param $cal_count
315 * @param $my_booking_form
316 * @param $my_selected_dates_without_calendar
317 * @param $start_month_calendar
318 * @param $shortcode_param__options
319 *
320 * @return string|null
321 */
322 function wpbc_get_rendered_booking_form_html__noecho( $resource_id = 1, $cal_count = 1, $my_booking_form = 'standard', $my_selected_dates_without_calendar = '', $start_month_calendar = false, $shortcode_param__options = array() ) {
323
324 $my_result = WPBC_FE_Render::render_booking_form(
325 array(
326 'resource_id' => $resource_id,
327 'cal_count' => $cal_count,
328 'is_echo' => 0,
329 'custom_booking_form' => $my_booking_form,
330 'selected_dates_without_calendar' => $my_selected_dates_without_calendar,
331 'start_month_calendar' => $start_month_calendar,
332 'shortcode_param__options' => $shortcode_param__options,
333 )
334 );
335 return $my_result;
336 }
337
338 /**
339 * This hook exists in personal.php file for the [bookingselect ..]
340 */
341 add_bk_filter( 'wpdevbk_get_booking_form', 'wpbc_get_rendered_booking_form_html__noecho' );