PluginProbe
Booking Calendar / 10.10
Booking Calendar v10.10
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 10.11.3 All 202 releases
booking / core / any / class-admin-settings-api.php

class-admin-settings-api.php in Booking Calendar 10.10, at core/any/class-admin-settings-api.php

2,089 lines 66.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @package Settings
5 * @category Abstract Class
6 * @author wpdevelop
7 *
8 * @web-site https://wpbookingcalendar.com/
9 * @email info@wpbookingcalendar.com
10 * @modified 2015-10-06
11 */
12
13 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
14
15
16 abstract class WPBC_Settings_API {
17
18 /**
19 * ID of specific Settings page
20 * basically its prefix near each generated Input field
21 *
22 * @var String
23 */
24 public $id;
25
26 /**
27 * Define different options for CLASS - check more in constructor.
28 *
29 * @var array
30 */
31 public $options;
32
33 /**
34 * List of all settings rows
35 * @var array
36 */
37 public $fields = array();
38
39 /**
40 * Values of all settings fields
41 * @var array
42 */
43 public $fields_values = array();
44
45 /**
46 * Validated fields after $_POST request - for example before saving to DB
47 *
48 * @var array
49 */
50 public $validated_fields = array();
51
52
53 /**
54 * If setted, then we can validate all form fields, BEFORE post.
55 * Each form field that we need to validate have to have parameter: "validate_as" which ia array, like array('required')
56 * HTML fields elements will have additional CSS classes, like "validate-required"
57 * If this $validated_form_id empty so then no validation procedure.
58 *
59 * @var string
60 */
61 public $validated_form_id = '';
62
63 /**
64 * Constructor for Settings API
65 *
66 * @param string $id - unique ID of this Settings
67 * @param array $options - Optional. Array of parameters.
68 * array(
69 * 'db_prefix_option' => 'wpbc_'
70 * , 'db_saving_type' => 'togather' ['togather'|'separate'|'separate_prefix']
71 * )
72 * @param array $fields_values - optional array of values. If skipped, then case system try to get values from DB.
73 */
74 public function __construct( $id, $options = array(), $fields_values = array() ) {
75
76 $this->id = $id; // Define name of this settings page .
77
78 $default_options = array(
79 'db_prefix_option' => 'wpbc_',
80 // Prefix for adding to option name before saving to DB.
81 'db_saving_type' => 'separate'
82 // Type of DB saving: 'togather' | 'separate' | 'separate_prefix'.
83 /* 'togather' - saving all parameters from settings page to one DB option
84 'separate' - saving each settings parameters as separate DB options
85 'separate_prefix' - saving each settings parameters as separate DB options
86 with prefix $id */
87 );
88
89 $this->options = wp_parse_args( $options, $default_options );
90
91 // Define what fields we are having.
92 $this->init_settings_fields(); // Init all Fields Rows for settings page.
93
94
95 // Get Values for the fields
96 if ( empty( $fields_values ) ) {
97 $this->define_fields_values_from_db(); // Define Fields Values from DB.
98 } else {
99 $this->define_fields_values( $fields_values ); // Define Fields by transmited values.
100 }
101
102 // Set Values for the fields.
103 $this->set_values_to_fields(); // Assign $this->fields_values['some_field'] to $this->fields[ 'some_field' ]['value'].
104
105 add_action( 'wpbc_after_settings_content', array(
106 $this,
107 'enqueue_validate_js'
108 ), 10, 3 ); // Add JavaScript if you need.
109 }
110
111
112 /**
113 * Validate Form Fields before $_POST request
114 *
115 * @param string $page_tag
116 */
117 public function enqueue_validate_js( $page_tag, $active_page_tab, $active_page_subtab ) {
118
119 if ( empty( $this->validated_form_id ) ) {
120 return;
121 }
122
123 // Get Fields to validate
124 $fields_to_validate = array();
125 foreach ( $this->fields as $field_name => $field_values ) {
126
127 if ( ( isset( $field_values['validate_as'] ) ) && ( ! empty( $field_values['validate_as'] ) ) ) {
128 $field_html_id = $this->id . '_' . $field_name;
129 $fields_to_validate[ $field_html_id ] = $field_values['validate_as'];
130 }
131 }
132 // JavaScript .
133
134 $js_script = '';
135
136 $js_script .= " jQuery('#" . $this->validated_form_id . "').on( 'submit', function(){ "; // Catch Submit event.
137
138 foreach ( $fields_to_validate as $field_html_id => $field_validate_array ) {
139
140 // Validate Required.
141 $js_script .= " if ( jQuery('#" . $field_html_id . "').val() == '' ) { " . "\n";
142
143 $js_script .= " wpbc_field_highlight( '#" . $field_html_id . "' );" . "\n";
144
145 //$js_script .= " wpbc_scroll_to( '#". $field_html_id ."' );" . "\n" ;
146 //$js_script .= " showWarningUnderElement( '#". $field_html_id ."' );" . "\n" ;
147
148 $js_script .= " return false; " . "\n"; // - cancel event - Submit.
149
150 $js_script .= " }" . "\n";
151 }
152
153 $js_script .= " } ); " . "\n";
154
155 // Eneque JS to the footer of the page.
156 wpbc_enqueue_js( $js_script );
157 }
158
159 // -----------------------------------------------------------------------------------------------------------------
160 // Abstract methods
161 // -----------------------------------------------------------------------------------------------------------------
162 /**
163 * Init all fields rows for settings page
164 */
165 abstract public function init_settings_fields();
166
167
168
169
170 // -----------------------------------------------------------------------------------------------------------------
171 // Functions
172 // -----------------------------------------------------------------------------------------------------------------
173 /**
174 * Get array of Default fields Names and Values.
175 * Example:
176 * $default_values = array(
177 * 'my_date_format' => get_option('date_format')
178 * , 'my_time_format' => get_option('time_format')
179 * );
180 *
181 * @return array
182 */
183 public function get_default_values() {
184
185 $default_values = array();
186
187 foreach ( $this->fields as $field_name => $field_data ) {
188 if ( isset( $field_data['default'] ) ) {
189 $default_values[ $field_name ] = $field_data['default'];
190 } else {
191 // Action here if no default value in field.
192 }
193 }
194
195 return $default_values;
196 }
197
198
199 /**
200 * Define "Default Values" for all exist settings Fields.
201 *
202 * @param array $fields_values - Optional. Field values
203 */
204 public function define_fields_values( $fields_values = array(), $is_check_exist_values_from_fields = true ) {
205
206 // Default .
207 if ( $is_check_exist_values_from_fields ) {
208 $default_values = $this->get_default_values();
209 } else {
210 $default_values = array();
211 }
212
213 // Parse.
214 $this->fields_values = wp_parse_args( $fields_values, $default_values );
215
216 if ( $is_check_exist_values_from_fields ) { // We no need to check it after saving to DB.
217 $defined_values_in_fields = array();
218 foreach ( $this->fields as $field_name => $field_data ) {
219 if ( isset( $field_data['value'] ) ) {
220 $defined_values_in_fields[ $field_name ] = $field_data['value'];
221 }
222 }
223 $this->fields_values = wp_parse_args( $defined_values_in_fields, $this->fields_values );
224 }
225 }
226
227
228 /**
229 * Set Values to Fiels
230 * Assign $this->fields_values to $fields[ 'some_field' ]['value']
231 */
232 public function set_values_to_fields() {
233
234 foreach ( $this->fields_values as $field_name => $field_value ) {
235
236 if ( isset( $this->fields[ $field_name ] ) ) {
237 $this->fields[ $field_name ]['value'] = $field_value;
238 }
239 }
240 }
241
242
243 /**
244 * Get ID of this settings page
245 *
246 * @return string
247 */
248 public function get_id() {
249 return $this->id;
250 }
251
252
253 /**
254 * Get Value of specfic Field
255 *
256 * @param string $field_name
257 *
258 * @return mixed or false, if field does not exist
259 *
260 */
261 public function get_field_value( $field_name ) {
262
263 if ( empty( $this->fields_values ) ) {
264 $this->define_fields_values();
265 } // If empty, then define by Default values
266
267 return isset( $this->fields_values[ $field_name ] ) ? $this->fields_values[ $field_name ] : false;
268 }
269
270
271 /**
272 * Set Value to specfic Field
273 *
274 * @param string $field_name
275 *
276 * @return mixed or false, if field does not exist
277 *
278 */
279 public function set_field_value( $field_name, $field_value ) {
280
281 if ( empty( $this->fields_values ) ) {
282 $this->define_fields_values();
283 } // If empty, then define by Default values
284
285 $this->fields_values[ $field_name ] = $field_value;
286 }
287
288
289 /**
290 * Get all exist form fields
291 * and Init fields, if fields are empty.
292 *
293 * @return array
294 */
295 public function get_form_fields() {
296
297 if ( empty( $this->fields ) ) {
298 $this->init_settings_fields();
299 }
300
301 return $this->fields;
302 }
303
304
305 /**
306 * Generate Settings Table
307 */
308 public function show( $group = false ) {
309 ?>
310 <table class="form-table">
311 <?php
312 $this->generate_settings_rows( $group );
313 ?>
314 </table>
315 <?php
316 }
317
318
319 /**
320 * Loop through the fields array and show settings.
321 */
322 public function generate_settings_rows( $group = false, $form_fields = false ) {
323
324 if ( ! $form_fields ) {
325 $form_fields = $this->get_form_fields();
326 }
327
328 $html = '';
329 foreach ( $form_fields as $k => $v ) {
330
331 $k = $this->id . '_' . $k;
332
333 if ( ! isset( $v['type'] ) || ( $v['type'] == '' ) ) {
334 $v['type'] = 'text';
335 }
336
337 if (
338 ( $group === false ) || ( ( ! isset( $v['group'] ) ) && ( $group == 'general' ) ) || ( ( isset( $v['group'] ) ) && ( $group == $v['group'] ) ) ) {
339 if ( method_exists( $this, 'field_' . $v['type'] . '_row' ) ) {
340 $html .= $this->{'field_' . $v['type'] . '_row'}( $k, $v );
341 } else {
342 $html .= $this->{'field_text_row'}( $k, $v );
343 }
344 }
345 }
346
347 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
348 echo $html;
349 }
350
351
352 // <editor-fold defaultstate="collapsed" desc=" G e n e r a t e F i e l d s " >
353
354 // -----------------------------------------------------------------------------------------------------------------
355 // Input Fields
356 // -----------------------------------------------------------------------------------------------------------------
357 /**
358 * Text Input Row
359 *
360 * @param string $field_name - name of field
361 * @param array $field - parameters
362 * @param boolean $echo - show or return reaults {default true}
363 *
364 * @return string - html || nothing
365 */
366 public function field_text_row( $field_name, $field, $echo = true ) {
367 if ( ! $echo ) {
368 return self::field_text_row_static( $field_name, $field, $echo );
369 } else {
370 self::field_text_row_static( $field_name, $field, $echo );
371 }
372 }
373
374
375 /**
376 * Text Color Row
377 *
378 * @param string $field_name - name of field
379 * @param array $field - parameters
380 * @param boolean $echo - show or return reaults {default true}
381 *
382 * @return string - html || nothing
383 */
384 public function field_color_row( $field_name, $field, $echo = true ) {
385 if ( ! $echo ) {
386 return self::field_color_row_static( $field_name, $field, $echo );
387 } else {
388 self::field_color_row_static( $field_name, $field, $echo );
389 }
390 }
391
392
393 /**
394 * Textarea Row
395 *
396 * @param string $field_name - name of field
397 * @param array $field - parameters
398 * @param boolean $echo - show or return reaults {default true}
399 *
400 * @return string - html || nothing
401 */
402 public function field_textarea_row( $field_name, $field, $echo = true ) {
403 if ( ! $echo ) {
404 return self::field_textarea_row_static( $field_name, $field, $echo );
405 } else {
406 self::field_textarea_row_static( $field_name, $field, $echo );
407 }
408 }
409
410
411 /**
412 * WP Rich Content Edit Textarea Row
413 *
414 * @param string $field_name - name of field
415 * @param array $field - parameters
416 * @param boolean $echo - show or return reaults {default true}
417 *
418 * @return string - html || nothing
419 */
420 public function field_wp_textarea_row( $field_name, $field, $echo = true ) {
421 if ( ! $echo ) {
422 return self::field_wp_textarea_row_static( $field_name, $field, $echo );
423 } else {
424 self::field_wp_textarea_row_static( $field_name, $field, $echo );
425 }
426 }
427
428
429 /**
430 * Radio buttons field row
431 *
432 * @param string $field_name - name of field
433 * @param array $field - parameters
434 * @param boolean $echo - show or return reaults {default true}
435 *
436 * @return string - html || nothing
437 */
438 public function field_radio_row( $field_name, $field, $echo = true ) {
439 if ( ! $echo ) {
440 return self::field_radio_row_static( $field_name, $field, $echo );
441 } else {
442 self::field_radio_row_static( $field_name, $field, $echo );
443 }
444 }
445
446
447 /**
448 * Selectbox field row
449 *
450 * @param string $field_name - name of field
451 * @param array $field - parameters
452 * @param boolean $echo - show or return reaults {default true}
453 *
454 * @return string - html || nothing
455 */
456 public function field_select_row( $field_name, $field, $echo = true ) {
457 if ( ! $echo ) {
458 return self::field_select_row_static( $field_name, $field, $echo );
459 } else {
460 self::field_select_row_static( $field_name, $field, $echo );
461 }
462 }
463
464
465 /**
466 * Checkbox field row
467 *
468 * @param string $field_name - name of field
469 * @param array $field - parameters
470 * @param boolean $echo - show or return reaults {default true}
471 *
472 * @return string - html || nothing
473 */
474 public function field_checkbox_row( $field_name, $field, $echo = true ) {
475 if ( ! $echo ) {
476 return self::field_checkbox_row_static( $field_name, $field, $echo );
477 } else {
478 self::field_checkbox_row_static( $field_name, $field, $echo );
479 }
480 }
481
482 // -----------------------------------------------------------------------------------------------------------------
483 // Static Methods
484 // -----------------------------------------------------------------------------------------------------------------
485 /**
486 * Static Text Input Row
487 *
488 * @param string $field_name - name of field
489 * @param array $field - parameters
490 * @param boolean $echo - show or return reaults {default true}
491 *
492 * @return string - html || nothing
493 */
494 public static function field_text_row_static( $field_name, $field, $echo = true ) {
495
496 $defaults = array(
497 'title' => '',
498 'disabled' => false,
499 'class' => '',
500 'css' => '',
501 'placeholder' => '',
502 'type' => 'text',
503 'description' => '',
504 'attr' => array(),
505 'group' => 'general',
506 'tr_class' => '',
507 'only_field' => false,
508 'description_tag' => 'p',
509 'validate_as' => array()
510 );
511
512 $field = wp_parse_args( $field, $defaults );
513
514 if ( ! $echo ) {
515 ob_start();
516 }
517
518 if ( ! $field['only_field'] ) {
519 ?>
520 <tr valign="top" class="wpbc_tr_<?php
521 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] );
522 ?>">
523 <th scope="row">
524 <?php
525 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
526 </th>
527 <td><fieldset><?php
528 }
529 ?>
530 <legend class="screen-reader-text"><span><?php
531 echo wp_kses_post( $field['title'] ); ?></span></legend>
532 <input type="<?php
533 echo esc_attr( $field['type'] ); ?>"
534 id="<?php
535 echo esc_attr( $field_name ); ?>"
536 name="<?php
537 echo esc_attr( $field_name ); ?>"
538 value="<?php
539 echo esc_attr( $field['value'] ); ?>"
540 class="regular-text <?php
541 echo esc_attr( $field['class'] );
542 echo esc_attr( ( ! empty( $field['validate_as'] ) ) ? ' validate-' . implode( ' validate-', $field['validate_as'] ) : '' ); ?>"
543 style="<?php
544 echo esc_attr( $field['css'] ); ?>"
545 placeholder="<?php
546 echo esc_attr( $field['placeholder'] ); ?>"
547 <?php
548 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
549 echo self::get_custom_attr_static( $field ); ?>
550 <?php
551 disabled( $field['disabled'], true ); ?>
552 autocomplete="off"
553 />
554 <?php
555 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
556 <?php
557 if ( ! $field['only_field'] ) {
558 ?>
559 </fieldset></td>
560 </tr>
561 <?php
562 }
563
564 if ( ! $echo ) {
565 return ob_get_clean();
566 }
567 }
568
569
570 /**
571 * Static Color Input Row
572 *
573 * @param string $field_name - name of field
574 * @param array $field - parameters
575 * @param boolean $echo - show or return reaults {default true}
576 *
577 * @return string - html || nothing
578 */
579 public static function field_color_row_static( $field_name, $field, $echo = true ) {
580
581 $defaults = array(
582 'title' => '',
583 'disabled' => false,
584 'class' => '',
585 'css' => '',
586 'placeholder' => '',
587 'type' => 'text',
588 'description' => '',
589 'attr' => array(),
590 'group' => 'general',
591 'tr_class' => '',
592 'only_field' => false,
593 'description_tag' => 'p'
594 );
595
596 $field = wp_parse_args( $field, $defaults );
597
598 if ( ! $echo ) {
599 ob_start();
600 }
601 if ( ! $field['only_field'] ) {
602 ?>
603 <tr valign="top" class="wpbc_tr_<?php
604 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
605 <th scope="row">
606 <?php
607 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
608 </th>
609 <td><fieldset><?php
610 }
611 ?>
612 <legend class="screen-reader-text"><span><?php
613 echo wp_kses_post( $field['title'] ); ?></span></legend>
614 <input type="text"
615 id="<?php
616 echo esc_attr( $field_name ); ?>"
617 name="<?php
618 echo esc_attr( $field_name ); ?>"
619 value="<?php
620 echo esc_attr( $field['value'] ); ?>"
621 class="regular-text wpbc_colorpick <?php
622 echo esc_attr( $field['class'] ); ?>"
623 style="width: 6em; background-color: <?php
624 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
625 echo $field['value']; ?>;<?php
626 echo esc_attr( $field['css'] ); ?>"
627 placeholder="<?php
628 echo esc_attr( $field['placeholder'] ); ?>"
629 <?php
630 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
631 echo self::get_custom_attr_static( $field ); ?>
632 <?php
633 disabled( $field['disabled'], true ); ?>
634 autocomplete="off"
635 />
636 <?php
637 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
638 <?php
639 if ( ! $field['only_field'] ) {
640 ?>
641 </fieldset></td>
642 </tr>
643 <?php
644 }
645
646 if ( ! $echo ) {
647 return ob_get_clean();
648 }
649 }
650
651
652 /**
653 * Static Textarea Row
654 *
655 * @param string $field_name - name of field
656 * @param array $field - parameters
657 * @param boolean $echo - show or return reaults {default true}
658 *
659 * @return string - html || nothing
660 */
661 public static function field_textarea_row_static( $field_name, $field, $echo = true ) {
662
663 $defaults = array(
664 'title' => '',
665 'disabled' => false,
666 'class' => '',
667 'css' => '',
668 'placeholder' => '',
669 'type' => 'text',
670 'description' => '',
671 'attr' => array(),
672 'rows' => 3,
673 'cols' => 20,
674 'show_in_2_cols' => false,
675 'group' => 'general',
676 'tr_class' => '',
677 'only_field' => false,
678 'description_tag' => 'p',
679 'validate_as' => array()
680 );
681
682 $field = wp_parse_args( $field, $defaults );
683
684 if ( ! $echo ) {
685 ob_start();
686 }
687
688 if ( ! $field['only_field'] ) {
689 ?>
690 <tr valign="top" class="wpbc_tr_<?php
691 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
692 <th scope="row">
693 <?php
694 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
695 <?php
696 if ( $field['show_in_2_cols'] ) { ?>
697 </th>
698 <td></td>
699 </tr>
700 <tr valign="top" class="wpbc_tr_<?php
701 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
702 <td colspan="2"><fieldset>
703 <?php
704 } else {
705 echo ' </th>'; // FixIn: 9.6.3.3.
706 echo ' <td><fieldset>';
707 } ?><?php
708 }
709 ?>
710 <legend class="screen-reader-text"><span><?php
711 echo wp_kses_post( $field['title'] ); ?></span></legend>
712 <textarea
713 rows="<?php
714 echo esc_attr( $field['rows'] ); ?>"
715 cols="<?php
716 echo esc_attr( $field['cols'] ); ?>"
717 <?php
718 /* type="<?php echo esc_attr( $field['type'] ); ?>" */ ?>
719 id="<?php
720 echo esc_attr( $field_name ); ?>"
721 name="<?php
722 echo esc_attr( $field_name ); ?>"
723 class="input-text wide-input <?php
724 echo esc_attr( $field['class'] );
725 echo esc_attr( ( ! empty( $field['validate_as'] ) ) ? ' validate-' . implode( ' validate-', $field['validate_as'] ) : '' ); ?>"
726 style="<?php
727 echo esc_attr( $field['css'] ); ?>"
728 placeholder="<?php
729 echo esc_attr( $field['placeholder'] ); ?>"
730 <?php
731 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
732 echo self::get_custom_attr_static( $field ); ?>
733 <?php
734 disabled( $field['disabled'], true ); ?>
735 autocomplete="off"
736 ><?php
737 echo esc_textarea( $field['value'] ); ?></textarea>
738 <?php
739 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
740 <?php
741 if ( ! $field['only_field'] ) {
742 ?>
743 </fieldset></td>
744 </tr>
745 <?php
746 }
747
748 if ( ! $echo ) {
749 return ob_get_clean();
750 }
751 }
752
753
754 /**
755 * Static WP Rich Content Edit Textarea Row
756 *
757 * @param string $field_name - name of field
758 * @param array $field - parameters
759 * @param boolean $echo - show or return reaults {default true}
760 *
761 * @return string - html || nothing
762 */
763 public static function field_wp_textarea_row_static( $field_name, $field, $echo = true ) {
764
765 $defaults = array(
766 'title' => '',
767 'disabled' => false,
768 'class' => '',
769 'css' => '',
770 'placeholder' => '',
771 'type' => 'text',
772 'description' => '',
773 'attr' => array(),
774 'rows' => 3,
775 'editor_height' => '',
776 'cols' => 20,
777 'teeny' => true,
778 'show_visual_tabs' => true,
779 'default_editor' => 'tinymce',
780 // 'tinymce' | 'html' // 'html' is used for the "Text" editor tab.
781 'drag_drop_upload' => false,
782 'show_in_2_cols' => false,
783 'group' => 'general',
784 'tr_class' => '',
785 'only_field' => false,
786 'description_tag' => 'p'
787 );
788
789 $field = wp_parse_args( $field, $defaults );
790
791 if ( ! $echo ) {
792 ob_start();
793 }
794 if ( ! $field['only_field'] ) {
795 ?>
796 <tr valign="top" class="wpbc_tr_<?php
797 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
798 <th scope="row">
799 <?php
800 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
801 <?php
802 if ( $field['show_in_2_cols'] ) { ?>
803 </th>
804 <td></td>
805 </tr>
806 <tr valign="top" class="wpbc_tr_<?php
807 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
808 <td colspan="2"><fieldset>
809 <?php
810 } else {
811 echo ' </th>'; // FixIn: 9.6.3.3.
812 echo ' <td><fieldset>';
813 } ?><?php
814 }
815 ?>
816 <legend class="screen-reader-text"><span><?php
817 echo wp_kses_post( $field['title'] ); ?></span></legend><?php
818 wp_editor( $field['value'], esc_attr( $field_name ), array(
819 'wpautop' => false,
820 'media_buttons' => false,
821 'textarea_name' => esc_attr( $field_name ),
822 'textarea_rows' => $field['rows'],
823 'editor_class' => 'wpbc-textarea-tinymce ' . esc_attr( $field['class'] )
824 // Any extra CSS Classes to append to the Editor textarea
825 ,
826 'teeny' => esc_attr( $field['teeny'] )
827 // Whether to output the minimal editor configuration used in PressThis
828 ,
829 'drag_drop_upload' => esc_attr( $field['drag_drop_upload'] )
830 // Enable Drag & Drop Upload Support (since WordPress 3.9)
831 ,
832 'tinymce' => $field['show_visual_tabs']
833 // Remove Visual Mode from the Editor
834 ,
835 'default_editor' => $field['default_editor']
836 // 'tinymce' | 'html' // 'html' is used for the "Text" editor tab.
837 ,
838 'editor_height' => $field['editor_height']
839 // '' | '500'
840 ) );
841 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
842 <?php
843 if ( ! $field['only_field'] ) {
844 ?>
845 </fieldset></td>
846 </tr>
847 <?php
848 }
849
850 if ( ! $echo ) {
851 return ob_get_clean();
852 }
853 }
854
855
856 /**
857 * Static Radio buttons field row
858 *
859 * @param string $field_name - name of field
860 * @param array $field - parameters
861 * @param boolean $echo - show or return reaults {default true}
862 *
863 * @return string - html || nothing
864 */
865 public static function field_radio_row_static( $field_name, $field, $echo = true ) {
866
867 $defaults = array(
868 'title' => '',
869 'label' => '',
870 'disabled' => false,
871 'disabled_options' => array(),
872 'class' => '',
873 'css' => '',
874 'type' => 'radio',
875 'description' => '',
876 'attr' => array(),
877 'options' => array(),
878 'group' => 'general',
879 'tr_class' => '',
880 'only_field' => false,
881 'is_new_line' => false,
882 'description_tag' => 'span'
883 );
884
885 $field = wp_parse_args( $field, $defaults );
886
887 if ( ! $echo ) {
888 ob_start();
889 }
890 if ( ! $field['only_field'] ) {
891 ?>
892 <tr valign="top" class="wpbc_tr_<?php
893 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
894 <th scope="row">
895 <?php
896 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
897 </th>
898 <td><fieldset><?php
899 }
900 ?>
901 <legend class="screen-reader-text"><span><?php
902 echo wp_kses_post( $field['title'] ); ?></span></legend>
903 <?php
904 foreach ( $field['options'] as $option_value => $option_title ) {
905
906 $option_parameters = array();
907 if ( is_array( $option_title ) ) {
908 $option_parameters = $option_title;
909 $option_title = $option_title['title'];
910 }
911
912 ?><label class="wpbc-form-radio" title="<?php
913 echo esc_attr( $option_title ); ?>">
914 <input type="radio"
915 name="<?php
916 echo esc_attr( $field_name ); ?>"
917 value="<?php
918 echo esc_attr( $option_value ); ?>"
919 class="<?php
920 echo esc_attr( $field['class'] ); ?>"
921 style="<?php
922 echo esc_attr( $field['css'] ); ?>"
923 <?php
924 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
925 echo self::get_custom_attr_static( $field ); ?>
926 <?php
927 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
928 echo self::get_custom_attr_static( $option_parameters ); ?>
929 <?php
930 checked( $field['value'], $option_value ); ?>
931 <?php
932 disabled( $field['disabled'], true ); ?>
933 <?php
934 disabled( in_array( $option_value, $field['disabled_options'] ), true ); ?>
935 autocomplete="off"
936 /> <?php
937 echo wp_kses_post( $option_title ); ?></label><?php
938 echo ( $field['is_new_line'] ) ? '<br/>' : '&nbsp; &nbsp; &nbsp;';
939
940 if ( isset( $option_parameters['html'] ) ) {
941 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
942 echo $option_parameters['html'] ;
943 }
944 } ?>
945 <?php
946 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
947 <?php
948 if ( ! $field['only_field'] ) {
949 ?>
950 </fieldset></td>
951 </tr>
952 <?php
953 }
954
955 if ( ! $echo ) {
956 return ob_get_clean();
957 }
958 }
959
960
961 /**
962 * Static Selectbox field row
963 *
964 * @param string $field_name - name of field
965 * @param array $field - parameters
966 * @param boolean $echo - show or return reaults {default true}
967 *
968 * @return string - html || nothing
969 */
970 public static function field_select_row_static( $field_name, $field, $echo = true ) {
971
972 $defaults = array(
973 'title' => '',
974 'label' => '',
975 'disabled' => false,
976 'disabled_options' => array(),
977 'class' => '',
978 'css' => '',
979 'type' => 'select',
980 'description' => '',
981 'multiple' => false,
982 'attr' => array(),
983 'options' => array(),
984 'group' => 'general',
985 'tr_class' => '',
986 'only_field' => false,
987 'description_tag' => 'span'
988 );
989
990 $field = wp_parse_args( $field, $defaults );
991
992 if ( ! $echo ) {
993 ob_start();
994 }
995
996 if ( ! $field['only_field'] ) {
997 ?>
998 <tr valign="top" class="wpbc_tr_<?php
999 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
1000 <th scope="row">
1001 <?php
1002 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
1003 </th>
1004 <td><fieldset>
1005 <?php
1006 }
1007 ?>
1008 <legend class="screen-reader-text"><span><?php
1009 echo wp_kses_post( $field['title'] ); ?></span></legend>
1010 <select
1011 id="<?php
1012 echo esc_attr( $field_name ); ?>"
1013 name="<?php
1014 echo esc_attr( $field_name );
1015 echo( $field['multiple'] ? '[]' : '' ); ?>"
1016 class="<?php
1017 echo esc_attr( $field['class'] ); ?>"
1018 style="<?php
1019 echo esc_attr( $field['css'] ); ?>"
1020 <?php
1021 disabled( $field['disabled'], true ); ?>
1022 <?php
1023 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1024 echo self::get_custom_attr_static( $field ); ?>
1025 <?php
1026 echo( $field['multiple'] ? ' multiple="MULTIPLE"' : '' ); ?>
1027 autocomplete="off"
1028 ><?php
1029
1030 foreach ( (array) $field['options'] as $option_value => $option_title ) {
1031
1032 $option_parameters = array();
1033 if ( is_array( $option_title ) ) {
1034 $option_parameters = $option_title;
1035 $option_title = ( ! empty( $option_title['title'] ) ) ? $option_title['title'] : '';
1036 }
1037
1038
1039 // array(
1040 // 'title' => 'Option Group Title' // Title
1041 // , 'optgroup' => true // Use only if you need to show OPTGROUP - Also need to use 'title' of start, end 'close' for END
1042 // , 'close' => false
1043 // )
1044
1045 if ( ! empty( $option_parameters['optgroup'] ) ) { // OPTGROUP
1046
1047 if ( ! $option_parameters['close'] ) {
1048 ?><optgroup label="<?php
1049 echo esc_attr( $option_parameters['title'] ); ?>"><?php
1050 } else {
1051 ?></optgroup><?php
1052 }
1053 } else {
1054
1055
1056 ?>
1057 <option value="<?php
1058 echo esc_attr( $option_value ); ?>"
1059 <?php
1060 if ( ( is_array( $field['value'] ) ) && ( in_array( $option_value, $field['value'] ) ) ) {
1061 selected( true );
1062 } else {
1063 if ( ! is_array( $field['value'] ) ) { // FixIn: 8.1.1.2.
1064 selected( $option_value, $field['value'] );
1065 }
1066 }
1067 ?>
1068 <?php
1069 disabled( in_array( $option_value, $field['disabled_options'] ), true ); ?>
1070 <?php
1071 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1072 echo self::get_custom_attr_static( $option_parameters ); ?>
1073 ><?php
1074 echo wp_kses_post( $option_title ); ?></option><?php
1075 }
1076 } ?>
1077 </select>
1078 <?php
1079 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
1080 <?php
1081 if ( ! $field['only_field'] ) {
1082 ?>
1083 </fieldset></td>
1084 </tr>
1085 <?php
1086 }
1087
1088 if ( ! $echo ) {
1089 return ob_get_clean();
1090 }
1091 }
1092
1093
1094 /**
1095 * Static Checkbox field row
1096 *
1097 * @param string $field_name - name of field
1098 * @param array $field - parameters
1099 * @param boolean $echo - show or return reaults {default true}
1100 *
1101 * @return string - html || nothing
1102 */
1103 public static function field_checkbox_row_static( $field_name, $field, $echo = true ) {
1104
1105 $defaults = array(
1106 'title' => '',
1107 'label' => '',
1108 'disabled' => false,
1109 'class' => '',
1110 'css' => '',
1111 'type' => 'checkbox',
1112 'description' => '',
1113 'attr' => array(),
1114 'group' => 'general',
1115 'tr_class' => '',
1116 'only_field' => false,
1117 'is_new_line' => true,
1118 'description_tag' => 'span'
1119 );
1120
1121 $field = wp_parse_args( $field, $defaults );
1122
1123 if ( ! $echo ) {
1124 ob_start();
1125 }
1126 if ( ! $field['only_field'] ) {
1127 ?>
1128 <tr valign="top" class="wpbc_tr_<?php
1129 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
1130 <th scope="row">
1131 <?php
1132 echo wp_kses_post( self::label_static( $field_name, $field ) ); ?>
1133 </th>
1134 <td><fieldset><?php
1135 }
1136
1137 // Show toggles in Settings pages
1138 if ( 1 ) {
1139
1140 $field['label'] = str_replace( '<span', '<i style="font-style: normal;"', $field['label'] );
1141 $field['label'] = str_replace( '/span>', '/i>', $field['label'] );
1142
1143 $params_checkbox = array(
1144 'id' => $field_name
1145 // HTML ID of element
1146 ,
1147 'name' => $field_name,
1148 'label' => array( 'title' => wp_kses_post( $field['label'] ), 'position' => 'right' )
1149 // FixIn: 9.6.1.5.
1150 ,
1151 'toggle_style' => $field['css']
1152 // CSS of select element
1153 ,
1154 'class' => $field['class']
1155 // CSS Class of select element
1156 ,
1157 'disabled' => $field['disabled'],
1158 'attr' => $field['attr']
1159 // Any additional attributes, if this radio | checkbox element
1160 ,
1161 'legend' => wp_kses_post( $field['title'] )
1162 // aria-label parameter
1163 ,
1164 'value' => $field['value']
1165 // Some Value from optins array that selected by default
1166 ,
1167 'selected' => ( ( 'On' == $field['value'] ) ? true : false )
1168 // Selected or not
1169
1170 //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code
1171 //, 'onchange' => "wpbc_ajx_booking_send_search_request_with_params( {'ui_usr__send_emails': (jQuery( this ).is(':checked') ? 'send' : 'not_send') } );" // JavaScript code
1172 //, 'hint' => array( 'title' => __('Send email notification to customer about this operation' ,'booking') , 'position' => 'top' )
1173 );
1174 $params_checkbox = wp_parse_args( $params_checkbox, $field );
1175 wpbc_flex_toggle( $params_checkbox );
1176
1177 ?>
1178 <legend class="screen-reader-text"><span><?php
1179 echo wp_kses_post( $field['title'] ); ?></span></legend><?php
1180
1181 echo ( $field['is_new_line'] ) ? '<br/>' : '&nbsp; &nbsp; &nbsp;';
1182 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) );
1183
1184 } else {
1185
1186 ?>
1187 <legend class="screen-reader-text"><span><?php
1188 echo wp_kses_post( $field['title'] ); ?></span></legend>
1189 <label class="wpbc-form-checkbox" for="<?php
1190 echo esc_attr( $field_name ); ?>">
1191 <input type="checkbox"
1192 id="<?php
1193 echo esc_attr( $field_name ); ?>"
1194 name="<?php
1195 echo esc_attr( $field_name ); ?>"
1196 value="<?php
1197 echo esc_attr( $field['value'] ); ?>"
1198 class="<?php
1199 echo esc_attr( $field['class'] ); ?>"
1200 style="<?php
1201 echo esc_attr( $field['css'] ); ?>"
1202 <?php
1203 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1204 echo self::get_custom_attr_static( $field ); ?>
1205 <?php
1206 checked( $field['value'], 'On' ); ?>
1207 <?php
1208 disabled( $field['disabled'], true ); ?>
1209 autocomplete="off"
1210 /> <?php
1211 echo wp_kses_post( $field['label'] ); ?></label><?php
1212 echo ( $field['is_new_line'] ) ? '<br/>' : '&nbsp; &nbsp; &nbsp;'; ?>
1213 <?php
1214 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?><?php
1215 }
1216
1217 if ( ! $field['only_field'] ) {
1218 ?></fieldset></td>
1219 </tr><?php
1220
1221 }
1222
1223 if ( ! $echo ) {
1224 return ob_get_clean();
1225 }
1226 }
1227
1228
1229 // -----------------------------------------------------------------------------------------------------------------
1230 // Text, Help, HTML, JS Elements
1231 // -----------------------------------------------------------------------------------------------------------------
1232 /**
1233 * Help Info Row
1234 *
1235 * @param string $field_name - name of field
1236 * @param array $field - parameters
1237 * @param boolean $echo - show or return reaults {default true}
1238 *
1239 * @return string - html || nothing
1240 */
1241 public function field_help_row( $field_name, $field, $echo = true ) {
1242 if ( ! $echo ) {
1243 return self::field_help_row_static( $field_name, $field, $echo );
1244 } else {
1245 self::field_help_row_static( $field_name, $field, $echo );
1246 }
1247 }
1248
1249
1250 /**
1251 * Static Help Info Row
1252 *
1253 * @param string $field_name - name of field
1254 * @param array $field - parameters
1255 * @param boolean $echo - show or return reaults {default true}
1256 *
1257 * @return string - html || nothing
1258 */
1259 public static function field_help_row_static( $field_name, $field, $echo = true ) {
1260
1261 $defaults = array(
1262 'value' => array(),
1263 'class' => '',
1264 'css' => '',
1265 'description' => '',
1266 'cols' => 1,
1267 'group' => 'general',
1268 'tr_class' => '',
1269 'description_tag' => 'span',
1270 'only_field' => false
1271 );
1272
1273 $field = wp_parse_args( $field, $defaults );
1274
1275 if ( ! $echo ) {
1276 ob_start();
1277 }
1278 if ( ! $field['only_field'] ) {
1279
1280 ?><tr valign="top" class="wpbc_tr_<?php
1281 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
1282 <?php
1283 if ( $field['cols'] == 1 ) { ?>
1284 <th scope="row"></th>
1285 <td>
1286 <?php
1287 } else { ?>
1288 <td colspan="2">
1289 <?php
1290 }
1291 }
1292 ?>
1293 <div class="wpbc-help-message <?php
1294 echo esc_attr( $field['class'] ); ?>" style="margin-top:10px; <?php
1295 echo esc_attr( $field['css'] ); ?>">
1296 <?php
1297 $field['value'] = (array) $field['value'];
1298
1299 foreach ( $field['value'] as $help_text ) {
1300 ?><p class="description" style="font-weight: 400;"><?php
1301 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1302 echo $help_text;
1303
1304 ?></p><?php
1305 }
1306 ?>
1307 </div>
1308 <?php
1309 echo wp_kses_post( self::description_static( $field, $field['description_tag'] ) ); ?>
1310 <?php
1311 if ( ! $field['only_field'] ) { ?>
1312 </td>
1313 </tr>
1314 <?php
1315 }
1316
1317 if ( ! $echo ) {
1318 return ob_get_clean();
1319 }
1320 }
1321
1322
1323 /**
1324 * Horizontal Separator
1325 *
1326 * @param string $field_name - name of field
1327 * @param array $field - parameters
1328 * @param boolean $echo - show or return reaults {default true}
1329 *
1330 * @return string - html || nothing
1331 */
1332 public function field_hr_row( $field_name, $field, $echo = true ) {
1333 if ( ! $echo ) {
1334 return self::field_hr_row_static( $field_name, $field, $echo );
1335 } else {
1336 self::field_hr_row_static( $field_name, $field, $echo );
1337 }
1338 }
1339
1340
1341 /**
1342 * Static Horizontal Separator
1343 *
1344 * @param string $field_name - name of field
1345 * @param array $field - parameters
1346 * @param boolean $echo - show or return reaults {default true}
1347 *
1348 * @return string - html || nothing
1349 */
1350 public static function field_hr_row_static( $field_name, $field, $echo = true ) {
1351
1352 $defaults = array(
1353 'class' => '',
1354 'css' => '',
1355 'group' => 'general',
1356 'tr_class' => ''
1357 );
1358
1359 $field = wp_parse_args( $field, $defaults );
1360
1361 if ( ! $echo ) {
1362 ob_start();
1363 }
1364 ?>
1365 <tr valign="top" class="wpbc_tr_<?php
1366 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
1367 <td style="padding:10px 0px; " colspan="2">
1368 <div class="<?php
1369 echo esc_attr( $field['class'] ); ?>" style="border-bottom:1px solid #cccccc;<?php
1370 echo esc_attr( $field['css'] ); ?>"></div>
1371 </td>
1372 </tr>
1373 <?php
1374
1375 if ( ! $echo ) {
1376 return ob_get_clean();
1377 }
1378 }
1379
1380
1381 /**
1382 * HTML Row - show any html. Warning parameter html do not escaped, check it before assign.
1383 *
1384 * @param string $field_name - name of field
1385 * @param array $field - parameters
1386 * @param boolean $echo - show or return reaults {default true}
1387 *
1388 * @return string - html || nothing
1389 */
1390 public function field_html_row( $field_name, $field, $echo = true ) {
1391 if ( ! $echo ) {
1392 return self::field_html_row_static( $field_name, $field, $echo );
1393 } else {
1394 self::field_html_row_static( $field_name, $field, $echo );
1395 }
1396 }
1397
1398
1399 /**
1400 * Static HTML Row - show any html. Warning parameter html do not escaped, check it before assign.
1401 *
1402 * @param string $field_name - name of field
1403 * @param array $field - parameters
1404 * @param boolean $echo - show or return reaults {default true}
1405 *
1406 * @return string - html || nothing
1407 */
1408 public static function field_html_row_static( $field_name, $field, $echo = true ) {
1409
1410 $defaults = array(
1411 'html' => '',
1412 'cols' => 1,
1413 'group' => 'general',
1414 'tr_class' => ''
1415 );
1416
1417 $field = wp_parse_args( $field, $defaults );
1418
1419 if ( ! $echo ) {
1420 ob_start();
1421 }
1422 ?>
1423 <tr valign="top" class="wpbc_tr_<?php
1424 echo esc_attr( $field_name ), ' ', esc_attr( $field['tr_class'] ); ?>">
1425 <?php
1426 if ( $field['cols'] == 1 ) { ?>
1427 <th scope="row"></th>
1428 <td>
1429 <?php
1430 } else { ?>
1431 <td colspan="2">
1432 <?php
1433 } ?>
1434 <?php
1435 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1436 echo $field['html'];
1437 ?>
1438 </td>
1439 </tr>
1440 <?php
1441
1442 if ( ! $echo ) {
1443 return ob_get_clean();
1444 }
1445 }
1446
1447
1448 /**
1449 * HTML - show only this html, Without any Table Rows. Warning parameter html do not escaped, check it before assign.
1450 *
1451 * @param string $field_name - name of field
1452 * @param array $field - parameters
1453 * @param boolean $echo - show or return reaults {default true}
1454 *
1455 * @return string - html || nothing
1456 */
1457 public function field_pure_html_row( $field_name, $field, $echo = true ) {
1458 if ( ! $echo ) {
1459 return self::field_pure_html_row_static( $field_name, $field, $echo );
1460 } else {
1461 self::field_pure_html_row_static( $field_name, $field, $echo );
1462 }
1463 }
1464
1465
1466 /**
1467 * Static HTML - show only this html, Without any Table Rows. Warning parameter html do not escaped, check it before assign.
1468 *
1469 * @param string $field_name - name of field
1470 * @param array $field - parameters
1471 * @param boolean $echo - show or return reaults {default true}
1472 *
1473 * @return string - html || nothing
1474 */
1475 public static function field_pure_html_row_static( $field_name, $field, $echo = true ) {
1476
1477 $defaults = array(
1478 'html' => '',
1479 'group' => 'general'
1480 );
1481
1482 $field = wp_parse_args( $field, $defaults );
1483
1484 if ( ! $echo ) {
1485 ob_start();
1486 }
1487
1488 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1489 echo $field['html'] ;
1490
1491 if ( ! $echo ) {
1492 return ob_get_clean();
1493 }
1494 }
1495
1496
1497 /**
1498 * JavaScript Row - insert JavaScript
1499 *
1500 * @param string $field_name - name of field
1501 * @param array $field - parameters
1502 * @param boolean $echo - show or return reaults {default true}
1503 *
1504 * @return string - html || nothing
1505 */
1506 public function field_js_row( $field_name, $field, $echo = true ) {
1507 if ( ! $echo ) {
1508 return self::field_js_row_static( $field_name, $field, $echo );
1509 } else {
1510 self::field_js_row_static( $field_name, $field, $echo );
1511 }
1512 }
1513
1514
1515 /**
1516 * Static JavaScript Row - insert JavaScript
1517 *
1518 * @param string $field_name - name of field
1519 * @param array $field - parameters
1520 * @param boolean $echo - show or return reaults {default true}
1521 *
1522 * @return string - html || nothing
1523 */
1524 public static function field_js_row_static( $field_name, $field, $echo = true ) {
1525
1526 $defaults = array(
1527 'js' => '',
1528 'group' => 'general'
1529 );
1530
1531 $field = wp_parse_args( $field, $defaults );
1532
1533 if ( ! $echo ) {
1534 ob_start();
1535 }
1536 ?>
1537 <script type="text/javascript">
1538 <?php
1539 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1540 echo $field['js']; ?>
1541 </script>
1542 <?php
1543
1544 if ( ! $echo ) {
1545 return ob_get_clean();
1546 }
1547 }
1548
1549
1550 // -----------------------------------------------------------------------------------------------------------------
1551 // Support functions
1552 // -----------------------------------------------------------------------------------------------------------------
1553 /**
1554 * Get custom attributes
1555 *
1556 * @param array $field
1557 *
1558 * @return string
1559 */
1560 public static function get_custom_attr_static( $field ) {
1561
1562 $attributes = array();
1563
1564 if ( ! empty( $field['attr'] ) && is_array( $field['attr'] ) ) {
1565
1566 foreach ( $field['attr'] as $attr => $attr_v ) {
1567 $attributes[] = esc_attr( $attr ) . '="' . esc_attr( $attr_v ) . '"';
1568 }
1569 }
1570
1571 return implode( ' ', $attributes );
1572 }
1573
1574
1575 /**
1576 * Get Description
1577 *
1578 * @param array $field
1579 * @param string $html_tag - HTML element, which will be used as separator. Default - 'p'
1580 *
1581 * @return string
1582 */
1583 public static function description_static( $field, $html_tag = 'p' ) {
1584 if ( empty( $html_tag ) ) {
1585 $html_tag = 'p';
1586 }
1587
1588 return $field['description']
1589 ? '<' . $html_tag . ' class="description">' . wp_kses_post( $field['description'] ) . '</' . $html_tag . '>' . "\n"
1590 : '';
1591 }
1592
1593 public static function label_static( $field_name, $field ) {
1594
1595 if ( empty( $field['title'] ) ) {
1596 return '';
1597 }
1598
1599 $defaults = array(
1600 'title' => '',
1601 'label_class' => '',
1602 'label_css' => '',
1603 'type' => ''
1604 );
1605 $field = wp_parse_args( $field, $defaults );
1606
1607 if ( ! empty( $field['type'] ) ) {
1608 $field['label_class'] .= ' wpbc-form-' . $field['type'];
1609 }
1610
1611 if ( ! empty( $field['label_css'] ) ) {
1612 $field['label_css'] = ' style="' . $field['label_css'] . '"';
1613 }
1614
1615 return '<label for="' . esc_attr( $field_name ) . '" class="' . $field['label_class'] . '"' . $field['label_css'] . '>' . wp_kses_post( $field['title'] ) . '</label>';
1616 }
1617
1618 // </editor-fold>
1619
1620
1621 // -----------------------------------------------------------------------------------------------------------------
1622 // Validate POSTs
1623 // -----------------------------------------------------------------------------------------------------------------
1624 /**
1625 * Validate Settings Field Data.
1626 *
1627 * Validate the data on the "Settings" form.
1628 *
1629 * @since 1.0.0
1630 * @uses method_exists()
1631 * @param array $form_fields (default: array())
1632 */
1633 public function validate_post( $form_fields = array() ) {
1634
1635 // Check server restrictions in php.ini file relative to length of $_POST variabales
1636 if ( function_exists ('wpbc_check_post_key_max_number')) { wpbc_check_post_key_max_number(); }
1637
1638 if ( ! $form_fields ) {
1639 $form_fields = $this->get_form_fields();
1640 }
1641
1642 $this->validated_fields = array();
1643
1644 foreach ( $form_fields as $k => $v ) {
1645
1646 if ( ! empty( $v['is_demo_safe'] ) ) { // Skip saving values for fields with this parameter ( 'is_demo_safe' => true )
1647 continue;
1648 }
1649
1650 if ( empty( $v['type'] ) ) {
1651 $v['type'] = 'text';
1652 }
1653
1654 // Look for a validate_FIELDID_post method for special handling
1655 if ( method_exists( $this, 'validate_' . $k . '_post' ) ) {
1656 $field = $this->{'validate_' . $k . '_post'}( $this->id . '_' . $k );
1657 $this->validated_fields[ $k ] = $field;
1658
1659 // Look for a validate_FIELDTYPE_post method
1660 } elseif ( method_exists( $this, 'validate_' . $v['type'] . '_post' ) ) {
1661 $field = $this->{'validate_' . $v['type'] . '_post'}( $this->id . '_' . $k );
1662 $this->validated_fields[ $k ] = $field;
1663
1664 // Default to text
1665 } else {
1666 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1667 if ( isset( $_POST[ $this->id . '_' . $k ] ) ) { //Check this for non Fields elements, like simple HTML or TEXT or JS
1668 $field = $this->{'validate_text_post'}( $this->id . '_' . $k );
1669 $this->validated_fields[ $k ] = $field;
1670 }
1671 }
1672 }
1673
1674 return $this->validated_fields;
1675 }
1676
1677
1678 // <editor-fold defaultstate="collapsed" desc=" V a l i d a t e P O S T F i e l d s " >
1679
1680 /**
1681 * Validate Text in POST request - escape data correctly.
1682 *
1683 * @param string $post_key - key for POST
1684 * @return string | false, if no such POST
1685 */
1686 public function validate_text_post( $post_key ) {
1687 return self::validate_text_post_static( $post_key );
1688 }
1689
1690
1691 /**
1692 * Static Validate Text in POST request - escape data correctly.
1693 *
1694 * @param string $post_key - key for POST
1695 * @return string | false, if no such POST
1696 */
1697 public static function validate_text_post_static( $post_key, $post_index = false ) {
1698
1699 $value = false;
1700 // FixIn: 9.2.4.2.
1701 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1702 if ( isset( $_POST[ $post_key ] ) ) {
1703 if ( $post_index !== false ) {
1704 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.InputNotValidated
1705 $post_value = $_POST[ $post_key ][ $post_index ];
1706 } else {
1707 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.InputNotValidated
1708 $post_value = $_POST[ $post_key ];
1709 }
1710 }
1711
1712 if ( isset( $post_value ) ) {
1713
1714 $value = wp_kses_post( trim( stripslashes( $post_value ) ) );
1715 }
1716
1717 return $value;
1718 }
1719
1720
1721 /**
1722 * Validate Email field in POST request - escape data correctly.
1723 *
1724 * @param string $post_key - key for POST
1725 * @return string | false, if no such POST
1726 */
1727 public function validate_email_post( $post_key ) {
1728 return self::validate_email_post_static( $post_key );
1729 }
1730
1731
1732 /**
1733 * Static Validate Email field in POST request - escape data correctly.
1734 *
1735 * @param string $post_key - key for POST
1736 * @return string | false, if no such POST
1737 */
1738 public static function validate_email_post_static( $post_key ) {
1739
1740 $value = false;
1741
1742 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1743 if ( isset( $_POST[ $post_key ] ) ) {
1744 // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1745 $value = sanitize_email( trim( stripslashes( $_POST[ $post_key ] ) ) );
1746 }
1747
1748 return $value;
1749 }
1750
1751
1752 /**
1753 * Validate Textarea in POST request - escape data correctly.
1754 *
1755 * @param string $post_key - key for POST
1756 * @return string | false, if no such POST
1757 */
1758 public function validate_textarea_post( $post_key ) {
1759 return self::validate_textarea_post_static( $post_key );
1760 }
1761
1762
1763 /**
1764 * Static Validate Textarea in POST request - escape data correctly.
1765 *
1766 * @param string $post_key - key for POST
1767 * @return string | false, if no such POST
1768 */
1769 public static function validate_textarea_post_static( $post_key ) {
1770
1771 $value = false;
1772
1773 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1774 if ( isset( $_POST[ $post_key ] ) ) {
1775
1776 // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1777 $value = wp_kses( trim( stripslashes( $_POST[ $post_key ] ) ),
1778 array_merge(
1779 array(
1780 'iframe' => array( 'src' => true, 'style' => true, 'id' => true, 'class' => true )
1781 ),
1782 wp_kses_allowed_html( 'post' )
1783 )
1784 );
1785 }
1786
1787 return $value;
1788 }
1789
1790
1791 /**
1792 * Validate WP Textarea in POST request - escape data correctly.
1793 *
1794 * Same as Textarea
1795 *
1796 * @param string $post_key - key for POST
1797 * @return string | false, if no such POST
1798 */
1799 public function validate_wp_textarea_post( $post_key ){
1800 return self::validate_wp_textarea_post_static( $post_key );
1801 }
1802
1803
1804 /**
1805 * Static Validate WP Textarea in POST request - escape data correctly.
1806 *
1807 * Same as Textarea
1808 *
1809 * @param string $post_key - key for POST
1810 * @return string | false, if no such POST
1811 */
1812 public static function validate_wp_textarea_post_static( $post_key ){
1813 return self::validate_textarea_post_static( $post_key );
1814 }
1815
1816
1817 /**
1818 * Validate Checkbox in POST request - escape data correctly.
1819 *
1820 * @param string $post_key - key for POST
1821 * @return string: 'On' | 'Off'
1822 */
1823 public function validate_checkbox_post( $post_key ) {
1824 return self::validate_checkbox_post_static( $post_key );
1825 }
1826
1827
1828 /**
1829 * Static Validate Checkbox in POST request - escape data correctly.
1830 *
1831 * @param string $post_key - key for POST
1832 * @return string: 'On' | 'Off'
1833 */
1834 public static function validate_checkbox_post_static( $post_key ) {
1835
1836 $status = 'Off';
1837
1838 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1839 if ( isset( $_POST[ $post_key ] ) && ( in_array( $_POST[ $post_key ], array( 'On', 'Off' ) ) ) ) {
1840 $status = 'On';
1841 }
1842
1843 return $status;
1844 }
1845
1846
1847 /**
1848 * Validate Select in POST request - escape data correctly.
1849 *
1850 * @param string $post_key - key for POST
1851 * @return string | array | false, if no such POST
1852 */
1853 public function validate_select_post( $post_key ) {
1854 return self::validate_select_post_static( $post_key );
1855 }
1856
1857
1858 /**
1859 * Static Validate Select in POST request - escape data correctly.
1860 *
1861 * @param string $post_key - key for POST
1862 * @return string | array | false, if no such POST
1863 */
1864 public static function validate_select_post_static( $post_key ) {
1865
1866 $value = false;
1867
1868 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1869 if ( isset( $_POST[ $post_key ] ) ) {
1870
1871 // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
1872 if ( is_array( $_POST[ $post_key ] ) ) {
1873 // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1874 $value = array_map( 'sanitize_text_field', array_map( 'stripslashes', (array) $_POST[ $post_key ] ) );
1875 } else {
1876 // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1877 $value = sanitize_text_field( stripslashes( $_POST[ $post_key ] ) );
1878 }
1879 }
1880
1881 return $value;
1882 }
1883
1884
1885 /**
1886 * Validate Radio in POST request - escape data correctly.
1887 *
1888 * Its the same as Select field
1889 *
1890 * @param string $post_key - key for POST
1891 * @return string | array | false, if no such POST
1892 */
1893 public function validate_radio_post( $post_key ) {
1894 return self::validate_radio_post_static( $post_key );
1895 }
1896
1897
1898 /**
1899 * Static Validate Radio in POST request - escape data correctly.
1900 *
1901 * Its the same as Select field
1902 *
1903 * @param string $post_key - key for POST
1904 * @return string | array | false, if no such POST
1905 */
1906 public static function validate_radio_post_static( $post_key ) {
1907 return self::validate_select_post_static( $post_key );
1908 }
1909
1910 // </editor-fold>
1911
1912 // -----------------------------------------------------------------------------------------------------------------
1913 // Save | Get from DB
1914 // -----------------------------------------------------------------------------------------------------------------
1915 /**
1916 * Save Setting Options to DB, then Reinit Settings Fields with these new Values...
1917 *
1918 * @param string $settings_id - ID of the settings
1919 * @param array $validated_fields - List of validated fields in format array( field_name => field_value, ... )
1920 * @param string $how_to_save - 'togather' - default - save as one field | 'separately_with_prefix' - save separately but with adding settings_id | 'separately' - separately each field only with adding db prefix
1921 */
1922 public function save_to_db( $validated_fields ){
1923
1924 $settings_id = $this->get_id();
1925
1926 $how_to_save = $this->options['db_saving_type'];
1927
1928
1929 if ( $how_to_save == 'togather' ) {
1930 /* wpbc_ settings_general =
1931 Array (
1932 [date_format] => F j, Y
1933 [time_format] => H:i
1934 [hr_time_format] =>
1935 ) */
1936 update_bk_option( $this->options['db_prefix_option'] . $settings_id , $validated_fields );
1937
1938 } elseif ( $how_to_save == 'separate_prefix' ) { // wpbc_ settings_general_ date_format => F j, Y
1939
1940 foreach ( (array) $validated_fields as $field_name => $field_value ) {
1941 update_bk_option( $this->options['db_prefix_option'] . $settings_id . '_' . $field_name , $field_value );
1942 }
1943 } else { // $how_to_save == 'separate' // wpbc_ date_format => F j, Y
1944
1945 foreach ( (array) $validated_fields as $field_name => $field_value ) {
1946 update_bk_option( $this->options['db_prefix_option'] . $field_name , $field_value );
1947 }
1948 }
1949
1950
1951 // Redefine fields values for New Saved values
1952 $this->define_fields_values( $validated_fields , false );
1953
1954 // Set Values for the fields
1955 $this->set_values_to_fields(); // Assign $this->fields_values['some_field'] to $this->fields[ 'some_field' ]['value']
1956
1957
1958 $this->fields = apply_filters( 'wpbc_fields_after_saving_to_db', $this->fields, $this->id );
1959
1960 //debuge('After Saving to DB', $this->fields_values, $this->fields);
1961 }
1962
1963
1964 public function define_fields_values_from_db() {
1965
1966 $how_to_save = $this->options['db_saving_type'];
1967
1968 switch ( $how_to_save ) {
1969
1970 case 'togather':
1971
1972 $fields_values_from_db = get_bk_option( $this->options['db_prefix_option'] . $this->get_id() );
1973
1974 $this->define_fields_values( $fields_values_from_db ); // Define Fields by values from DB
1975
1976 break;
1977
1978 case 'separate_prefix':
1979
1980 $this->define_fields_values(); // Reinit Fields - need to know how many fields and names of fields
1981
1982 $fields_values_from_db = array();
1983
1984 foreach ( $this->fields_values as $field_name => $field_value ) {
1985
1986 $got_value = get_bk_option( $this->options['db_prefix_option'] . $this->get_id() . '_' . $field_name );
1987
1988 // If we do not have this value in DB ( === false ), then do not assing this value - will have Default Value
1989 if ( $got_value !== false )
1990 $fields_values_from_db[ $field_name ] = $got_value;
1991 }
1992
1993 $this->define_fields_values( $fields_values_from_db ); // Define Fields by values from DB
1994
1995 break;
1996
1997 default: // 'separate'
1998
1999 $this->define_fields_values(); // Reinit Fields - need to know how many fields and names of fields
2000
2001 $fields_values_from_db = array();
2002 //debuge('Before Loading from DB', $this->fields_values, $this->fields);
2003 foreach ( $this->fields_values as $field_name => $field_value ) {
2004
2005 $got_value = get_bk_option( $this->options['db_prefix_option'] . $field_name );
2006
2007 // If we do not have this value in DB ( === false ), then do not assing this value - will have Default Value
2008 if ( $got_value !== false )
2009 $fields_values_from_db[ $field_name ] = $got_value;
2010 }
2011
2012 $this->define_fields_values( $fields_values_from_db ); // Define Fields by values from DB
2013 //debuge('After loaded from DB', $this->fields_values, $this->fields);
2014 break;
2015 }
2016
2017 }
2018
2019
2020
2021 // -----------------------------------------------------------------------------------------------------------------
2022 // Install | Uninstall
2023 // -----------------------------------------------------------------------------------------------------------------
2024 /** Actiovation of Plugin. Save to DB initial values of Settings Fields. */
2025 public function activate() {
2026
2027 $settings_id = $this->get_id();
2028
2029 $how_to_save = $this->options['db_saving_type'];
2030
2031
2032 $default_values = $this->get_default_values(); // Get "Default" values from $this->fields array.
2033
2034 if ( $how_to_save == 'togather' ) {
2035 /* wpbc_ settings_general =
2036 Array (
2037 [date_format] => F j, Y
2038 [time_format] => H:i
2039 [hr_time_format] =>
2040 ) */
2041 add_bk_option( $this->options['db_prefix_option'] . $settings_id , $default_values );
2042
2043 } elseif ( $how_to_save == 'separate_prefix' ) { // wpbc_ settings_general_ date_format => F j, Y
2044
2045 foreach ( (array) $default_values as $field_name => $field_value ) {
2046 add_bk_option( $this->options['db_prefix_option'] . $settings_id . '_' . $field_name , $field_value );
2047 }
2048 } else { // $how_to_save == 'separate' // wpbc_ date_format => F j, Y
2049
2050 foreach ( (array) $default_values as $field_name => $field_value ) {
2051 add_bk_option( $this->options['db_prefix_option'] . $field_name , $field_value );
2052 }
2053 }
2054 }
2055
2056
2057 /** Uninstall. Deactivation of Plugin. Delete Settings Fields from DB. */
2058 public function deactivate() {
2059
2060 $settings_id = $this->get_id();
2061
2062 $how_to_save = $this->options['db_saving_type'];
2063
2064 $default_values = $this->get_default_values(); // Get "Default" values from $this->fields array.
2065
2066
2067 if ( $how_to_save == 'togather' ) {
2068 /* wpbc_ settings_general =
2069 Array (
2070 [date_format] => F j, Y
2071 [time_format] => H:i
2072 [hr_time_format] =>
2073 ) */
2074 delete_bk_option( $this->options['db_prefix_option'] . $settings_id );
2075
2076 } elseif ( $how_to_save == 'separate_prefix' ) { // wpbc_ settings_general_ date_format => F j, Y
2077
2078 foreach ( (array) $default_values as $field_name => $field_value ) {
2079 delete_bk_option( $this->options['db_prefix_option'] . $settings_id . '_' . $field_name );
2080 }
2081 } else { // $how_to_save == 'separate' // wpbc_ date_format => F j, Y
2082
2083 foreach ( (array) $default_values as $field_name => $field_value ) {
2084 delete_bk_option( $this->options['db_prefix_option'] . $field_name );
2085 }
2086 }
2087 }
2088
2089 }