PluginProbe
Booking Calendar / 11.4
Booking Calendar v11.4
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 10.11.3 10.11.4 10.12.0 10.12.1 All 199 releases
booking / includes / _functions / request.php

request.php in Booking Calendar 11.4, at includes/_functions/request.php

461 lines 20.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php /**
2 * @version 1.0
3 * @description Universal class for REQUEST params cleaning (sanitizing) and saving such data, relative to current WP user.
4 * @category WPBC_AJX__REQUEST Class
5 * @author wpdevelop
6 *
7 * @web-site http://oplugins.com/
8 * @email info@oplugins.com
9 *
10 * @modified 2022-10-29
11 */
12
13 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly // FixIn: 9.3.1.2.
14
15
16 /**
17 * Class for sanitizing $_REQUEST parameters and saving or getting it in/from DB
18 *
19 *
20 * Example 1:
21 *
22 $user_request = new WPBC_AJX__REQUEST( array(
23 'db_option_name' => 'booking_availability_request_params',
24 'user_id' => wpbc_get_current_user_id(),
25 'request_rules_structure' => WPBC_AJX__Availability::request_rules_structure()
26 )
27 );
28 $escaped_request_params_arr = $user_request->get_sanitized__saved__user_request_params(); // Get Saved
29
30 if ( false === $escaped_request_params_arr ) { // This request was not saved before, then get sanitized direct parameters, like: $_REQUEST['resource_id']
31
32 $request_prefix = false;
33 $escaped_request_params_arr = $user_request->get_sanitized__in_request__value_or_default( $request_prefix ); // Direct: $_REQUEST['resource_id']
34 }
35 *
36 *
37 * Example 2:
38 *
39 $user_request = new WPBC_AJX__REQUEST( array(
40 'db_option_name' => 'booking_availability_request_params',
41 'user_id' => wpbc_get_current_user_id(),
42 'request_rules_structure' => array(
43 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => 1 )
44 , 'ui_wh_booking_date_checkout' => array( 'validate' => 'digit_or_date', 'default' => '' ) // number | date 2016-07-20
45 , 'wh_modification_date' => array( 'validate' => 'array', 'default' => array( '3' ) ) // number | date 2016-07-20
46 , 'ui_wh_modification_date_radio' => array( 'validate' => 'd', 'default' => 0 ) // '1' | '2' ....
47 , 'keyword' => array( 'validate' => 's', 'default' => '' ) //string
48 , 'wh_cost' => array( 'validate' => 'float_or_empty', 'default' => '' ) // '1' | ''
49 , 'ui_usr__send_emails' => array( 'validate' => array( 'send', 'not_send' ), 'default' => 'send' )
50 )
51 ) );
52 *
53 *
54 * OR ******************************************************************************************************************
55 * $user_request = new WPBC_AJX__REQUEST();
56 *
57 * $user_request->set_db_option_name__for_saved_request( 'booking_availability_request_params' );
58 *
59 * $user_request->set_user_id( wpbc_get_current_user_id() );
60 *
61 * $user_request->set_default_request_structure( array(
62 * 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => array( '1' ) )
63 * ) );
64 * OR:
65 * $user_request->set_default_request_structure( WPBC_AJX__Availability::get__request_params__names_default() );
66 *
67 ***********************************************************************************************************************
68 *
69 * $params_arr = $user_request->get_sanitized__saved__user_request_params(); // Initial Load - get params SAVED in DB - user open page with same view as before
70 * OR
71 * $params_arr = $user_request->get_sanitized__in_request__value_or_default( false ); // Direct - $_REQUEST['resource_id']
72 * OR
73 * $params_arr = $user_request->get_sanitized__in_request__value_or_default( 'search_params' ); // In Ajax request - $_REQUEST['search_params']['resource_id']
74 *
75 *
76 ***********************************************************************************************************************
77 * Request Rules Structure
78 ***********************************************************************************************************************
79 *
80 array(
81 , 'page_num' => array( 'validate' => 'd', 'default' => 1 ) // 1 | 0
82 , 'cost' => array( 'validate' => 'f', 'default' => 1.5 ) // 1.5 | 0
83 , 'wh_cost' => array( 'validate' => 'float_or_empty', 'default' => '' ) // 1.5 | ''
84 , 'wh_num' => array( 'validate' => 'digit_or_empty', 'default' => '' ) // 1 | ''
85 , 'keyword' => array( 'validate' => 's', 'default' => '' ) // string
86
87 , 'wh_booking_date' => array( 'validate' => 'array', 'default' => array( "3" ) ) // Elements of array checked as string
88 , 'ui_wh_booking_date' => array( 'validate' => 'date', 'default' => '' ) // Date e.g.: '2022-05-31' or ''
89
90 // 'digit_or_csd' can check about 'digit_or_csd' in arrays, as well
91 , 'wh_booking_type' => array( 'validate' => 'digit_or_csd', 'default' => array( '0' ) ) // Digit or comma separated digit ( e.g.: '12,a,45,9' => '12,0,45,9' ) // if ['0'] - All booking resources, ['-1'] - lost bookings in deleted resources
92 , 'ui_wh_booking_date_checkout' => array( 'validate' => 'digit_or_date', 'default' => '' ) // digit or Date e.g.: '2022-05-31' or 5 or ''
93
94 , 'ui_wh_start' => array( 'validate' => 'checked_skip_it', 'default' => '' ) // Skip from checking
95
96 , 'ui_usr__is_expand_remarks' => array( 'validate' => array( 'On', 'Off' ), 'default' => 'Off' )
97 );
98 *
99 *
100 *
101 ***********************************************************************************************************************
102 * Otherwise possible to use ' Direct Clean Params '
103 ***********************************************************************************************************************
104 *
105 $request_params_ajx_booking = array(
106 'page_num' => array( 'validate' => 'd', 'default' => 1 )
107 , 'page_items_count' => array( 'validate' => 'd', 'default' => 10 )
108 , 'sort' => array( 'validate' => array( 'ajx_booking_id' ), 'default' => 'ajx_booking_id' )
109 , 'sort_type' => array( 'validate' => array( 'ASC', 'DESC'),'default' => 'DESC' )
110 , 'status' => array( 'validate' => 's', 'default' => '' )
111 , 'keyword' => array( 'validate' => 's', 'default' => '' )
112 , 'ru_create_date' => array( 'validate' => 'date', 'default' => '' )
113 );
114 $request_params_values = array( // Usually $request_params_values is $_REQUEST
115 'page_num' => 1,
116 'page_items_count' => 3,
117 'sort' => 'ajx_booking_id',
118 'sort_type' => 'DESC',
119 'status' => '',
120 'keyword' => '',
121 'ru_create_date' => ''
122 );
123 $request_params = wpbc_sanitize_params_in_arr( $request_params_values, $request_params_ajx_booking );
124
125 */
126 class WPBC_AJX__REQUEST {
127
128 private $db_option_name__for_saved_request;
129 private $request_rules_structure;
130 private $user_id;
131
132 public function __construct( $params ) {
133 $defaults = array(
134 'db_option_name' => 'general_booking_request_params',
135 'user_id' => wpbc_get_current_user_id(),
136 'request_rules_structure' => array()
137 );
138 $params = wp_parse_args( $params, $defaults );
139
140
141 if ( ! empty( $params['db_option_name'] ) ) {
142 $this->set_db_option_name__for_saved_request( $params['db_option_name'] );
143 }
144
145 if ( ! empty( $params['user_id'] ) ) {
146 $this->set_user_id( $params['user_id'] );
147 }
148
149 if ( ! empty( $params['request_rules_structure'] ) ) {
150 $this->set_request_rules_structure( $params['request_rules_structure'] );
151 }
152 }
153
154 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
155 // Setters
156 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
157
158 /**
159 * Set name of option for saving request parameters into DB
160 *
161 * @param string $db_option_name
162 *
163 * @return void
164 */
165 public function set_db_option_name__for_saved_request( $db_option_name ){
166 $this->db_option_name__for_saved_request = $db_option_name;
167 }
168
169 /**
170 * Set current active user ID
171 *
172 * @param int $user_id
173 *
174 * @return void
175 */
176 public function set_user_id( $user_id ){
177 $this->user_id = $user_id;
178 }
179
180 /**
181 * Set request structure for validation and default values
182 *
183 * @param array $request_rules_structure array(
184 * 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => array( '1' ) )
185 * , ...
186 * )
187 *
188 * @return void
189 */
190 public function set_request_rules_structure( $request_rules_structure ){
191 $this->request_rules_structure = $request_rules_structure;
192 }
193
194
195 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
196 /// Request Structure
197 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
198
199 /**
200 * Get params names for escaping and/or default value of such params
201 *
202 * @param string $structure_type 'validate_and_default' (default) | 'validate' | 'default'
203 *
204 * @return array
205 * if $structure_type == '' array ( 'keyword' => array( 'validate' => 's', 'default' => '' )
206 * , 'wh_booking_date' => array( 'validate' => 'digit_or_date', 'default' => '3' ), ...
207 * if $structure_type == 'validate' array ( 'keyword' => 's'
208 * , 'wh_booking_date' => 'digit_or_date'), ...
209 * if $structure_type == 'default' array ( 'keyword' => ''
210 * , 'wh_booking_date' => '3' ), ...
211 */
212 public function get_request_rules_structure( $structure_type = 'validate_and_default' ){
213
214 $params_for_cleaning = $this->request_rules_structure;
215
216 if ( 'validate_and_default' == $structure_type ) {
217 return $params_for_cleaning;
218 }
219
220 $return_simple_arr = array();
221
222 foreach ( $params_for_cleaning as $key => $value ) {
223 $return_simple_arr[ $key ] = $value[ $structure_type ];
224 }
225 return $return_simple_arr;
226
227 }
228
229
230 /**
231 * Get default values from rules structure
232 *
233 * @return array array ( 'keyword' => '', 'wh_booking_date' => '3' ), ...
234 */
235 public function get_request_rules__default( ){
236
237 return $this->get_request_rules_structure( 'default' );
238 }
239
240
241 /**
242 * Get validate rules from params structure
243 *
244 * @return array array ( 'keyword' => 's', 'wh_booking_date' => 'digit_or_date'), ...
245 */
246 public function get_request_rules__validate( ){
247
248 return $this->get_request_rules_structure( 'validate' );
249 }
250
251 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
252 // Get user Saved params
253 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
254
255 /**
256 * Get $_REQUEST saved before in DB from user - Sanitized Array
257 *
258 * @return
259 * false - if not saved before
260 * OR
261 * array(
262 * 'page_num' => 1
263 * , 'page_items_count' => 100
264 * , 'sort' => 'ajx_booking_id'
265 * , 'sort_type' => 'DESC'
266 * , 'keyword' => ''
267 * , 'status' => ''
268 * )
269 */
270 public function get_sanitized__saved__user_request_params() {
271
272 $request_params_values_arr = $this->user_request_params__db_get(); // - $request_params_values_arr - un-serialized here automatically
273
274 if ( false !== $request_params_values_arr ) {
275
276 $request_params_structure = $this->get_request_rules_structure(); /**
277 * array( 'page_num' => array( 'validate' => 'd', 'default' => 1 )
278 * , 'page_items_count' => array( 'validate' => 'd', 'default' => 10 )
279 * , 'sort' => array( 'validate' => array( 'booking_id' ), 'default' => 'booking_id' )
280 * , 'sort_type' => array( 'validate' => array( 'ASC', 'DESC'),'default' => 'DESC' )
281 * , 'keyword' => array( 'validate' => 's', 'default' => '' )
282 * , 'create_date' => array( 'validate' => 'date', 'default' => '' )
283 * )
284 */
285
286 $escaped_request_params = wpbc_sanitize_params_in_arr( $request_params_values_arr, $request_params_structure ); // Escaping params here
287
288 return $escaped_request_params;
289
290 } else {
291 return false;
292 }
293 }
294
295
296 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
297 // Get sanitized $_REQUEST params | default values
298 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
299
300 /**
301 * Get "sanitized values" from $_REQUEST or "default values", based on rules structure
302 *
303 * @param string | false $prefix_in_request
304 *
305 * default FALSE
306 *
307 * string parameter useful, if request like this (usually in Ajax):
308 *
309 * $_REQUEST (
310 * ['listing_page']['page_num'] => 3
311 * ['listing_page']['page_items_count'] => 20
312 * ['listing_page']['sort'] => 'booking_id'
313 * )
314 *
315 * then we use this: $this->get_sanitized__in_request__value_or_default( 'listing_page' )
316 *
317 *
318 * @return array
319 * Example: array(
320 * ['page_num'] => 3
321 * ['page_items_count'] => 20
322 * ['sort'] => 'booking_id'
323 * )
324 */
325 public function get_sanitized__in_request__value_or_default( $prefix_in_request = false ){
326
327 $request_rules_structure = $this->get_request_rules_structure();
328
329 $request_params_values_arr = array();
330
331 foreach ( $request_rules_structure as $request_key => $clean_type ) {
332
333 $exist_request_param_value = wpbc_get_direct_value_in_request( $request_key, $prefix_in_request ); // Get direct request values: $_REQUEST['page_num'] => 3
334 // if ( $prefix_in_request == 'listing_page' ): $_REQUEST['listing_page']['page_num'] => 3
335 if ( false !== $exist_request_param_value ) {
336 $request_params_values_arr[ $request_key ] = $exist_request_param_value;
337 }
338 }
339
340 $escaped_request_params = wpbc_sanitize_params_in_arr( $request_params_values_arr, $request_rules_structure );
341
342 return $escaped_request_params;
343 }
344
345
346 // <editor-fold defaultstate="collapsed" desc=" D B S A V E / G E T U S E R R E Q U E S T " >
347
348 /**
349 * Save user filter request - saving user filters in toolbar
350 *
351 * @param array $params_arr
352 *
353 * @return bool|int
354 */
355 function user_request_params__db_save( $params_arr ) {
356
357 return update_user_option( $this->user_id, $this->db_option_name__for_saved_request , $params_arr );
358 }
359
360 /**
361 * Delete saved user request - used for resetting user filters in toolbar
362 *
363 * @return bool
364 */
365 function user_request_params__db_delete() {
366
367 return delete_user_option( $this->user_id, $this->db_option_name__for_saved_request );
368 }
369
370 /**
371 * Get saved user filter request - params for user filters in toolbar
372 *
373 * @return false|mixed
374 */
375 function user_request_params__db_get() {
376
377 return get_user_option( $this->db_option_name__for_saved_request, $this->user_id );
378 }
379
380 // </editor-fold>
381
382 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
383 // Get user option - single parameter
384 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
385
386 /**
387 * Get user saved option from Request in Booking Listing
388 *
389 * @param $user_id int 1
390 * @param $option_name string 'ui_usr__send_emails'
391 *
392 * @return false|mixed
393 */
394 function user_request_params__get_option( $option_name ){
395
396 // Get User saved option from request
397 $escaped_request_params = $this->get_sanitized__saved__user_request_params();
398 if ( ( ! empty( $escaped_request_params ) ) && ( ! empty( $escaped_request_params[ $option_name ] ) ) ) {
399 return $escaped_request_params[ $option_name ];
400 }
401
402 // Get default option
403 $default_param_values = $this->get_request_rules_structure( 'default' );
404 if ( ! empty( $default_param_values[ $option_name ] ) ) {
405 return $default_param_values[ $option_name ];
406 }
407
408 // There is no such option
409 return false;
410 }
411
412 // Helpers:
413 /**
414 * Is send emails ? Check DB SAVED user defined option from Options toolbar.
415 * @param $user_id int ID of user
416 *
417 * @return int 1 | 0
418 */
419 function user_request_option__is_send_emails(){
420
421 $is_send_emeils = $this->user_request_params__get_option( 'ui_usr__send_emails' );
422
423 $is_send_emeils = ( 'send' == $is_send_emeils ) ? 1 : 0;
424
425 return $is_send_emeils;
426 }
427 }
428
429
430 // ---------------------------------------------------------------------------------------------------------------------
431 // Request
432 // ---------------------------------------------------------------------------------------------------------------------
433
434 /**
435 * Get indexed or direct request from REQUEST
436 *
437 * @param $request_key
438 * @param false $prefix_in_request
439 *
440 * @return false|mixed
441 */
442 function wpbc_get_direct_value_in_request( $request_key, $prefix_in_request = false ) {
443
444 /**
445 * Get value from 'direct request' - "$_REQUEST['page_num'] => 3"
446 * or
447 * from 'prefix request' - "$_REQUEST['request_params']['page_num'] => 3"
448 */
449
450 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
451 if ( ( empty( $prefix_in_request ) ) && ( isset( $_REQUEST[ $request_key ] ) ) ) {
452 return $_REQUEST[ $request_key ]; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
453 }
454
455 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
456 if ( ( ! empty( $prefix_in_request ) ) && ( isset( $_REQUEST[ $prefix_in_request ] ) ) && ( isset( $_REQUEST[ $prefix_in_request ][ $request_key ] ) ) ) {
457 return $_REQUEST[ $prefix_in_request ][ $request_key ]; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
458 }
459
460 return false;
461 }