PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 2.0.4
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v2.0.4
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / includes / fields / class-evf-field-date-time.php
everest-forms / includes / fields Last commit date
class-evf-field-address.php 7 years ago class-evf-field-ai.php 2 years ago class-evf-field-captcha.php 2 years ago class-evf-field-checkbox.php 2 years ago class-evf-field-color.php 3 years ago class-evf-field-country.php 7 years ago class-evf-field-credit-card.php 2 years ago class-evf-field-date-time.php 2 years ago class-evf-field-divider.php 4 years ago class-evf-field-email.php 2 years ago class-evf-field-file-upload.php 6 years ago class-evf-field-first-name.php 2 years ago class-evf-field-hidden.php 7 years ago class-evf-field-html.php 7 years ago class-evf-field-image-upload.php 7 years ago class-evf-field-last-name.php 2 years ago class-evf-field-likert.php 2 years ago class-evf-field-lookup.php 2 years ago class-evf-field-number.php 2 years ago class-evf-field-password.php 7 years ago class-evf-field-payment-authorize-net.php 2 years ago class-evf-field-payment-checkbox.php 7 years ago class-evf-field-payment-coupon.php 2 years ago class-evf-field-payment-quantity.php 5 years ago class-evf-field-payment-radio.php 7 years ago class-evf-field-payment-single.php 7 years ago class-evf-field-payment-subtotal.php 3 years ago class-evf-field-payment-total.php 6 years ago class-evf-field-phone.php 7 years ago class-evf-field-privacy-policy.php 4 years ago class-evf-field-progress.php 3 years ago class-evf-field-radio.php 2 years ago class-evf-field-range-slider.php 6 years ago class-evf-field-rating.php 7 years ago class-evf-field-repeater.php 2 years ago class-evf-field-reset.php 3 years ago class-evf-field-scale-rating.php 2 years ago class-evf-field-select.php 2 years ago class-evf-field-signature.php 7 years ago class-evf-field-text.php 2 years ago class-evf-field-textarea.php 2 years ago class-evf-field-title.php 6 years ago class-evf-field-url.php 2 years ago class-evf-field-wysiwyg.php 4 years ago class-evf-field-yes-no.php 2 years ago
class-evf-field-date-time.php
1146 lines
1 <?php
2 /**
3 * Date and Time field.
4 *
5 * @package EverestForms\Fields
6 * @since 1.0.0
7 */
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * EVF_Field_Date_Time class.
13 */
14 class EVF_Field_Date_Time extends EVF_Form_Fields {
15
16 /**
17 * Constructor.
18 */
19 public function __construct() {
20 $this->name = esc_html__( 'Date / Time', 'everest-forms' );
21 $this->type = 'date-time';
22 $this->icon = 'evf-icon evf-icon-calendar';
23 $this->order = 20;
24 $this->group = 'advanced';
25 $this->settings = array(
26 'basic-options' => array(
27 'field_options' => array(
28 'label',
29 'meta',
30 'choose_format',
31 'choose_style',
32 'description',
33 'required',
34 'required_field_message_setting',
35 'required_field_message',
36 ),
37 ),
38 'advanced-options' => array(
39 'field_options' => array(
40 'placeholder',
41 'datetime_options',
42 'label_hide',
43 'css',
44 ),
45 ),
46 );
47
48 parent::__construct();
49 }
50
51 /**
52 * Hook in tabs.
53 */
54 public function init_hooks() {
55 add_action( 'everest_forms_shortcode_scripts', array( $this, 'load_assets' ) );
56 add_filter( 'everest_forms_field_properties_' . $this->type, array( $this, 'field_properties' ), 5, 3 );
57 add_filter( 'everest_forms_entry_save_fields', array( $this, 'save_timezone' ), 10, 3 );
58 add_filter( 'everest_forms_html_field_value', array( $this, 'entry_html' ), 10, 5 );
59 add_filter( 'everest_forms_date_time_properties', array( $this, 'set_default_timezone' ), 10, 2 );
60 }
61
62 /**
63 * Date field format option.
64 *
65 * @since 1.4.9
66 * @param array $field Field Data.
67 */
68 public function choose_format( $field ) {
69 $format = ! empty( $field['datetime_format'] ) ? esc_attr( $field['datetime_format'] ) : 'date';
70 $format_label = $this->field_element(
71 'label',
72 $field,
73 array(
74 'slug' => 'datetime_format',
75 'value' => esc_html__( 'Format', 'everest-forms' ),
76 'tooltip' => esc_html__( 'Select a format for the date field.', 'everest-forms' ),
77 ),
78 false
79 );
80 $format_select = $this->field_element(
81 'select',
82 $field,
83 array(
84 'slug' => 'datetime_format',
85 'value' => $format,
86 'options' => array(
87 'date' => esc_html__( 'Date', 'everest-forms' ),
88 'time' => esc_html__( 'Time', 'everest-forms' ),
89 'date-time' => esc_html__( 'Both', 'everest-forms' ),
90 ),
91 ),
92 false
93 );
94 $args = array(
95 'slug' => 'datetime_format',
96 'content' => $format_label . $format_select,
97 );
98 $this->field_element( 'row', $field, $args );
99 }
100
101 /**
102 * Date field style option.
103 *
104 * @since 1.7.5
105 * @param array $field Field Data.
106 */
107 public function choose_style( $field ) {
108 $style = ! empty( $field['datetime_style'] ) ? esc_attr( $field['datetime_style'] ) : 'picker';
109 $style_label = $this->field_element(
110 'label',
111 $field,
112 array(
113 'slug' => 'datetime_style',
114 'value' => esc_html__( 'Style', 'everest-forms' ),
115 'tooltip' => esc_html__( 'Select a style for the date field.', 'everest-forms' ),
116 ),
117 false
118 );
119 $style_select = $this->field_element(
120 'select',
121 $field,
122 array(
123 'slug' => 'datetime_style',
124 'value' => $style,
125 'options' => array(
126 'picker' => esc_html__( 'Picker', 'everest-forms' ),
127 'dropdown' => esc_html__( 'Dropdown', 'everest-forms' ),
128 ),
129 ),
130 false
131 );
132 $args = array(
133 'slug' => 'datetime_style',
134 'content' => $style_label . $style_select,
135 );
136 $this->field_element( 'row', $field, $args );
137 }
138
139 /**
140 * Date and time advanced field options.
141 *
142 * @since 1.4.9
143 * @param array $field Field Data.
144 */
145 public function datetime_options( $field ) {
146 $format = ! empty( $field['datetime_format'] ) ? esc_attr( $field['datetime_format'] ) : 'date';
147 $class_name = isset( $field['enable_min_max'] ) && '1' === $field['enable_min_max'] ? '' : 'everest-forms-hidden';
148 $field['date_mode'] = isset( $field['date_mode'] ) ? $field['date_mode'] : 'single';
149 $field['date_mode'] = isset( $field['date_range'] ) && '1' === $field['date_range'] ? 'range' : $field['date_mode'];
150
151 $this->field_element(
152 'label',
153 $field,
154 array(
155 'slug' => 'datetime_advanced',
156 'value' => esc_html__( 'Date & Time Format', 'everest-forms' ),
157 'tooltip' => esc_html__( 'Advanced date and time formatting options.', 'everest-forms' ),
158 ),
159 true
160 );
161
162 echo '<div class="format-selected-' . esc_attr( $format ) . ' format-selected">';
163 echo '<div class="everest-forms-border-container everest-forms-date">';
164 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Date', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
165
166 $date_format_label = $this->field_element(
167 'label',
168 $field,
169 array(
170 'slug' => 'date_format',
171 'value' => esc_html__( 'Date Format', 'everest-forms' ),
172 'tooltip' => esc_html__( 'Choose a desire date format to display.', 'everest-forms' ),
173 ),
174 false
175 );
176
177 $date_format_select = $this->field_element(
178 'select',
179 $field,
180 array(
181 'slug' => 'date_format',
182 'value' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
183 'class' => 'evf-date-format',
184 'options' => array(
185 'Y-m-d' => date_i18n( 'Y-m-d' ) . ' (Y-m-d)',
186 'F j, Y' => date_i18n( 'F j, Y' ) . ' (F j, Y)',
187 'm/d/Y' => date_i18n( 'm/d/Y' ) . ' (m/d/Y)',
188 'd/m/Y' => date_i18n( 'd/m/Y' ) . ' (d/m/Y)',
189 ),
190 ),
191 false
192 );
193
194 // Disable certain dates option.
195 $clear_disabled_dates_button = sprintf( '<a href="#" class="evf-clear-disabled-dates after-label-description">%s</a>', esc_html__( 'Clear', 'everest-forms' ) );
196 $disable_dates_label = $this->field_element(
197 'label',
198 $field,
199 array(
200 'slug' => 'disable_dates',
201 'value' => esc_html__( 'Disable Dates', 'everest-forms' ),
202 'tooltip' => esc_html__( 'Select which dates you want to disable.', 'everest-forms' ),
203 'after_tooltip' => $clear_disabled_dates_button,
204 ),
205 false
206 );
207 $disable_dates = $this->field_element(
208 'text',
209 $field,
210 array(
211 'slug' => 'disable_dates',
212 'value' => isset( $field['disable_dates'] ) ? $field['disable_dates'] : '',
213 'class' => 'everest-forms-disable-dates',
214 'data' => array(
215 'date-format' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
216 ),
217 ),
218 false
219 );
220
221 $current_date_mode = $this->field_element(
222 'radio',
223 $field,
224 array(
225 'slug' => 'date_mode',
226 'default' => isset( $field['date_mode'] ) ? $field['date_mode'] : 'single',
227 'desc' => esc_html__( 'Date Mode', 'everest-forms' ),
228 'tooltip' => esc_html__( 'Select your desire date mode.', 'everest-forms' ),
229 'options' => array(
230 'single' => 'Single',
231 'range' => 'Range',
232 'multiple' => 'Multiple',
233 ),
234 ),
235 false
236 );
237
238 $date_localization_label = $this->field_element(
239 'label',
240 $field,
241 array(
242 'slug' => 'date_localization',
243 'value' => esc_html__( 'Date Localization', 'everest-forms' ),
244 'tooltip' => esc_html__( 'Choose a desire date localization to display.', 'everest-forms' ),
245 ),
246 false
247 );
248
249 $date_localization_select = $this->field_element(
250 'select',
251 $field,
252 array(
253 'slug' => 'date_localization',
254 'value' => isset( $field['date_localization'] ) ? $field['date_localization'] : 'en',
255 'options' => array(
256 'en' => 'English',
257 'ar' => 'Arabic',
258 'at' => 'Austria',
259 'az' => 'Azerbaijan',
260 'be' => 'Belarusian',
261 'bg' => 'Bulgarian',
262 'bn' => 'Bangla',
263 'bs' => 'Bosnian',
264 'cat' => 'Catalan',
265 'cs' => 'Czech',
266 'cy' => 'Welsh',
267 'da' => 'Danish',
268 'de' => 'German',
269 'eo' => 'Esperanto',
270 'es' => 'Spanish',
271 'et' => 'Estonian',
272 'fa' => 'Persian',
273 'fi' => 'Finnish',
274 'fo' => 'Faroese',
275 'fr' => 'French',
276 'ga' => 'Irish',
277 'gr' => 'Greek',
278 'he' => 'Hebrew',
279 'hi' => 'Hindi',
280 'hr' => 'Croatian',
281 'hu' => 'Hungarian',
282 'id' => 'Indonesian',
283 'is' => 'Icelandic',
284 'it' => 'Italian',
285 'ja' => 'Japanese',
286 'ka' => 'Georgian',
287 'ko' => 'Korean',
288 'km' => 'Khmer',
289 'kz' => 'Kazakh',
290 'lt' => 'Lithuanian',
291 'lv' => 'Latvian',
292 'mk' => 'Macedonian',
293 'mn' => 'Mongolian',
294 'ms' => 'Malaysian',
295 'my' => 'Burmese',
296 'nl' => 'Dutch',
297 'no' => 'Norwegian',
298 'pa' => 'Punjabi',
299 'pl' => 'Polish',
300 'pt' => 'Portuguese',
301 'ro' => 'Romanian',
302 'ru' => 'Russian',
303 'si' => 'Sinhala',
304 'sk' => 'Slovak',
305 'sl' => 'Slovenian',
306 'sq' => 'Albanian',
307 'sr' => 'Serbian',
308 'sv' => 'Swedish',
309 'th' => 'Thai',
310 'tr' => 'Turkish',
311 'uk' => 'Ukrainian',
312 'vn' => 'Vietnamese',
313 'zh' => 'Mandarin',
314 'zh_tw' => 'MandarinTraditional',
315 ),
316 ),
317 false
318 );
319
320 $date_timezone_label = $this->field_element(
321 'label',
322 $field,
323 array(
324 'slug' => 'date_timezone',
325 'value' => esc_html__( 'Timezone', 'everest-forms' ),
326 'tooltip' => esc_html__( 'Choose a desired timezone to save datetime in.', 'everest-forms' ),
327 ),
328 false
329 );
330
331 $date_timezone_select = $this->field_element(
332 'select',
333 $field,
334 array(
335 'slug' => 'date_timezone',
336 'value' => isset( $field['date_timezone'] ) ? $field['date_timezone'] : '',
337 'options' => $this->get_timezones(),
338 ),
339 false
340 );
341
342 $current_date_default = $this->field_element(
343 'toggle',
344 $field,
345 array(
346 'slug' => 'date_default',
347 'value' => isset( $field['date_default'] ) ? $field['date_default'] : '',
348 'desc' => esc_html__( 'Default to current date.', 'everest-forms' ),
349 'tooltip' => esc_html__( 'Check this option to set current date as default.', 'everest-forms' ),
350 ),
351 false
352 );
353
354 $enable_past_date_disable = $this->field_element(
355 'toggle',
356 $field,
357 array(
358 'slug' => 'past_date_disable',
359 'value' => isset( $field['past_date_disable'] ) ? $field['past_date_disable'] : '',
360 'desc' => esc_html__( 'Disable the past date', 'everest-forms' ),
361 'tooltip' => esc_html__( 'Check this option to disable the past date', 'everest-forms' ),
362 ),
363 false
364 );
365
366 $enable_min_max = $this->field_element(
367 'toggle',
368 $field,
369 array(
370 'slug' => 'enable_min_max',
371 'value' => isset( $field['enable_min_max'] ) ? $field['enable_min_max'] : '',
372 'desc' => esc_html__( 'Enable Min Max date.', 'everest-forms' ),
373 'tooltip' => esc_html__( 'Check this option to set min max date.', 'everest-forms' ),
374 ),
375 false
376 );
377
378 $min_date_label = $this->field_element(
379 'label',
380 $field,
381 array(
382 'slug' => 'min_date',
383 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
384 'tooltip' => esc_html__( 'Select minium date.', 'everest-forms' ),
385 ),
386 false
387 );
388
389 $min_date = $this->field_element(
390 'text',
391 $field,
392 array(
393 'slug' => 'min_date',
394 'value' => isset( $field['min_date'] ) ? $field['min_date'] : '',
395 'class' => 'everest-forms-min-date',
396 ),
397 false
398 );
399
400 $max_date_label = $this->field_element(
401 'label',
402 $field,
403 array(
404 'slug' => 'max_date',
405 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
406 'tooltip' => esc_html__( 'Select maximum date.', 'everest-forms' ),
407 ),
408 false
409 );
410
411 $max_date = $this->field_element(
412 'text',
413 $field,
414 array(
415 'slug' => 'max_date',
416 'value' => isset( $field['max_date'] ) ? $field['max_date'] : '',
417 'class' => 'everest-forms-max-date',
418 ),
419 false
420 );
421
422 $set_date_range = $this->field_element(
423 'toggle',
424 $field,
425 array(
426 'slug' => 'set_date_range',
427 'value' => isset( $field['set_date_range'] ) ? $field['set_date_range'] : '',
428 'desc' => esc_html__( 'Enable Custom Input', 'everest-forms' ),
429 'tooltip' => esc_html__( "Check this option to set date range 'x' days after today.", 'everest-forms' ),
430 ),
431 false
432 );
433
434 $min_date_range_level = $this->field_element(
435 'label',
436 $field,
437 array(
438 'slug' => 'min_date_range',
439 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
440 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
441 ),
442 false
443 );
444
445 $min_date_range = $this->field_element(
446 'text',
447 $field,
448 array(
449 'slug' => 'min_date_range',
450 'value' => isset( $field['min_date_range'] ) ? $field['min_date_range'] : '',
451 'class' => 'everest-forms-min-date-range',
452 'placeholder' => 'e.g. today',
453 ),
454 false
455 );
456
457 $max_date_range_label = $this->field_element(
458 'label',
459 $field,
460 array(
461 'slug' => 'max_date_range',
462 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
463 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
464 ),
465 false
466 );
467
468 $max_date_range = $this->field_element(
469 'text',
470 $field,
471 array(
472 'slug' => 'max_date_range',
473 'value' => isset( $field['max_date_range'] ) ? $field['max_date_range'] : '',
474 'class' => 'everest-forms-max-date-range',
475 'placeholder' => 'e.g. +14 days',
476 ),
477 false
478 );
479
480 $args = array(
481 'slug' => 'date_format',
482 'content' => $date_format_label . $date_format_select . $disable_dates_label . $disable_dates . $date_localization_label . $date_localization_select . $date_timezone_label . $date_timezone_select . '<div class="everest-forms-checklist everest-forms-checklist-inline">' . $current_date_mode . '</div><div class="everest-forms-current-date-format">' . $current_date_default . '</div><div class="everest-forms-past-date-disable-format">' . $enable_past_date_disable . '</div><div class="everest-forms-min-max-date-format">' . $enable_min_max . '</div><div class="everest-forms-min-max-date-range-format ' . $class_name . '">' . $set_date_range . '</div><div class="everest-forms-min-max-date-option ' . $class_name . '">' . $min_date_label . $min_date . $max_date_label . $max_date . '</div><div class="everest-forms-min-max-date-range-option ' . $class_name . '">' . $min_date_range_level . $min_date_range . $max_date_range_label . $max_date_range . '</div>',
483 );
484 $this->field_element( 'row', $field, $args );
485
486 echo '</div>';
487
488 echo '<div class="everest-forms-border-container everest-forms-time">';
489 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Time', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
490
491 $time_format_label = $this->field_element(
492 'label',
493 $field,
494 array(
495 'slug' => 'time_interval',
496 'value' => esc_html__( 'Time interval and format', 'everest-forms' ),
497 'tooltip' => esc_html__( 'Choose time interval and format to display.', 'everest-forms' ),
498 ),
499 false
500 );
501
502 $time_interval_select = '<div class="input-group-col-2">';
503 $time_interval_select .= $this->field_element(
504 'select',
505 $field,
506 array(
507 'slug' => 'time_interval',
508 'value' => isset( $field['time_interval'] ) ? $field['time_interval'] : '',
509 'class' => 'time_interval',
510 'options' => array(
511 '15' => esc_html__( '15 minutes', 'everest-forms' ),
512 '30' => esc_html__( '30 minutes', 'everest-forms' ),
513 '60' => esc_html__( '1 hour', 'everest-forms' ),
514 ),
515 ),
516 false
517 );
518 $time_format_select = $this->field_element(
519 'select',
520 $field,
521 array(
522 'slug' => 'time_format',
523 'value' => isset( $field['time_format'] ) ? $field['time_format'] : '',
524 'class' => 'time_format',
525 'options' => array(
526 'g:i A' => esc_html__( '12 H', 'everest-forms' ),
527 'H:i' => esc_html__( '24 H', 'everest-forms' ),
528 ),
529 ),
530 false
531 );
532 $time_format_select .= '</div>';
533
534 $min_time_select = '<div class="input-group-col-2">';
535 $min_time_select .= $this->field_element(
536 'select',
537 $field,
538 array(
539 'slug' => 'min_time_hour',
540 'value' => isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : 9,
541 'class' => 'min_time_hour',
542 'options' => $this->get_minute_hours( $field, 'hours' ),
543 ),
544 false
545 );
546 $min_time_select .= $this->field_element(
547 'select',
548 $field,
549 array(
550 'slug' => 'min_time_minute',
551 'value' => isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : 30,
552 'class' => 'min_time_minute',
553 'options' => $this->get_minute_hours( $field, 'minutes' ),
554 ),
555 false
556 );
557 $min_time_select .= '</div>';
558
559 $max_time_select = '<div class="input-group-col-2">';
560 $max_time_select .= $this->field_element(
561 'select',
562 $field,
563 array(
564 'slug' => 'max_time_hour',
565 'value' => isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : 18,
566 'class' => 'max_time_hour',
567 'options' => $this->get_minute_hours( $field, 'hours' ),
568 ),
569 false
570 );
571 $max_time_select .= $this->field_element(
572 'select',
573 $field,
574 array(
575 'slug' => 'max_time_minute',
576 'value' => isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : 30,
577 'class' => 'max_time_minute',
578 'options' => $this->get_minute_hours( $field, 'minutes' ),
579 ),
580 false
581 );
582 $max_time_select .= '</div>';
583
584 $enable_min_max_time = '<div class="input-group-col-2">';
585
586 $enable_min_max_time .= $this->field_element(
587 'toggle',
588 $field,
589 array(
590 'slug' => 'enable_min_max_time',
591 'value' => isset( $field['enable_min_max_time'] ) ? $field['enable_min_max_time'] : '',
592 'desc' => esc_html__( 'Enable Min Max Time.', 'everest-forms' ),
593 'tooltip' => esc_html__( 'Check this option to set min max time.', 'everest-forms' ),
594 ),
595 false
596 );
597 $enable_min_max_time .= '</div>';
598
599 $select_min_time = $this->field_element(
600 'label',
601 $field,
602 array(
603 'slug' => 'select_min_time',
604 'value' => esc_html__( 'Minimum Time', 'everest-forms' ),
605 'tooltip' => esc_html__( 'Select minium time.', 'everest-forms' ),
606 ),
607 false
608 );
609
610 $select_max_time = $this->field_element(
611 'label',
612 $field,
613 array(
614 'slug' => 'select_max_time',
615 'value' => esc_html__( 'Maximum Time', 'everest-forms' ),
616 'tooltip' => esc_html__( 'Select maximum time.', 'everest-forms' ),
617 ),
618 false
619 );
620 $args = array(
621 'slug' => 'time_interval_format',
622 'content' => $time_format_label . $time_interval_select . $time_format_select . $enable_min_max_time . $select_min_time . $min_time_select . $select_max_time . $max_time_select,
623 );
624 $this->field_element( 'row', $field, $args );
625
626 echo '</div>';
627 echo '<div class="everest-forms-border-container everest-forms-slot-booking">';
628 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Slot Booking', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
629
630 $slot_booking_toggle = $this->field_element(
631 'toggle',
632 $field,
633 array(
634 'slug' => 'slot_booking_advanced',
635 'desc' => esc_html__( 'Enable Slot Booking', 'everest-forms' ),
636 'value' => isset( $field['slot_booking_advanced'] ) ? $field['slot_booking_advanced'] : false,
637 'tooltip' => esc_html__( 'Enable to use date/time field as slot booking.', 'everest-forms' ),
638 'class' => 'slot-booking-advanced ',
639 'default' => false,
640 ),
641 false
642 );
643
644 $args = array(
645 'slug' => 'slot_booking_advanced_setting',
646 'content' => $slot_booking_toggle,
647 );
648 $this->field_element( 'row', $field, $args );
649 echo '</div>';
650 echo '</div>';
651 }
652
653 /**
654 * Time Hours/Minutes Provider.
655 *
656 * @since 1.7.5
657 * @param mixed $field field data.
658 * @param string $required required type.
659 */
660 public function get_minute_hours( $field, $required = 'hours' ) {
661 $required_array = array();
662 if ( 'hours' === $required ) {
663 // Hours Array.
664 $period = '';
665 for ( $i = 0; $i <= 23; $i++ ) {
666 if ( isset( $field['time_format'] ) && 'H:i' === $field['time_format'] ) {
667 $required_array [] = ( $i < 10 ? '0' . $i : $i ) . $period;
668 } else {
669 if ( $i < 12 ) {
670 $period = ' AM';
671 } else {
672 $period = ' PM';
673 }
674 $hour = $i;
675 if ( 0 === $i ) {
676 $hour = 12;
677 }
678 if ( $hour > 12 ) {
679 $hour = $i - 12;
680 }
681 $required_array [] = $hour . $period;
682 }
683 }
684 } else {
685 // Minutes Array.
686 for ( $i = 0; $i <= 59; $i++ ) {
687 $required_array [] = ( $i < 10 ) ? '0' . $i : $i;
688 }
689 }
690 return $required_array;
691 }
692
693 /**
694 * Define additional field properties.
695 *
696 * @since 1.0.0
697 *
698 * @param array $properties Field properties.
699 * @param array $field Field settings.
700 * @param array $form_data Form data and settings.
701 *
702 * @return array of additional field properties.
703 */
704 public function field_properties( $properties, $field, $form_data ) {
705 // Input primary: data-time-interval.
706 if ( ! empty( $field['time_interval'] ) ) {
707 $properties['inputs']['primary']['attr']['data-time-interval'] = esc_attr( $field['time_interval'] );
708 }
709
710 // Input primary: Disabled dates data.
711 if ( ! empty( $field['disable_dates'] ) ) {
712 $properties['inputs']['primary']['attr']['data-disable-dates'] = esc_attr( $field['disable_dates'] );
713 }
714
715 // Input primary: Booked slot.
716 if ( isset( $field['slot_booking_advanced'] ) && evf_string_to_bool( $field['slot_booking_advanced'] ) ) {
717 $properties['inputs']['primary']['attr']['data-slot-booking'] = esc_attr( $field['slot_booking_advanced'] );
718 $properties['inputs']['primary']['attr']['data-form-id'] = esc_attr( $form_data['id'] );
719 }
720
721 // Input primary: data-date-time.
722 if ( ! empty( $field['datetime_format'] ) ) {
723 $properties['inputs']['primary']['attr']['data-date-time'] = esc_attr( $field['datetime_format'] );
724
725 // Input primary: data-mode.
726 if ( 'time' !== $field['datetime_format'] ) {
727 if ( isset( $field['date_range'] ) && '1' === $field['date_range'] ) {
728 $properties['inputs']['primary']['attr']['data-mode'] = 'range';
729 } else {
730 $properties['inputs']['primary']['attr']['data-mode'] = isset( $field['date_mode'] ) ? $field['date_mode'] : 'single';
731 }
732 $properties['inputs']['primary']['attr']['data-locale'] = isset( $field['date_localization'] ) ? $field['date_localization'] : 'en';
733 $properties['inputs']['primary']['attr']['data-min-date'] = isset( $field['enable_min_max'], $field['min_date'] ) && ! isset( $field['set_date_range'] ) ? $field['min_date'] : '';
734 $properties['inputs']['primary']['attr']['data-max-date'] = isset( $field['enable_min_max'], $field['max_date'] ) && ! isset( $field['set_date_range'] ) ? $field['max_date'] : '';
735 $properties['inputs']['primary']['attr']['data-min-date-range'] = isset( $field['set_date_range'], $field['enable_min_max'], $field['min_date_range'] ) ? $field['min_date_range'] : '';
736 $properties['inputs']['primary']['attr']['data-max-date-range'] = isset( $field['set_date_range'], $field['enable_min_max'], $field['max_date_range'] ) ? $field['max_date_range'] : '';
737 }
738
739 if ( 'date' !== $field['datetime_format'] ) {
740 if ( isset( $field['enable_min_max_time'] ) ) {
741 $properties['inputs']['primary']['attr']['data-min-hour'] = isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : '';
742 $properties['inputs']['primary']['attr']['data-min-minute'] = isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : '';
743 $properties['inputs']['primary']['attr']['data-max-hour'] = isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : '';
744 $properties['inputs']['primary']['attr']['data-max-minute'] = isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : '';
745 }
746 }
747
748 // Input primary: data-date-format and value.
749 switch ( $field['datetime_format'] ) {
750 case 'date':
751 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
752 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $field['date_format'] ) ) : '';
753 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
754 break;
755 case 'time':
756 $properties['inputs']['primary']['attr']['value'] = '';
757 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['time_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $field['time_format'] ) ) : 'g:i A';
758 break;
759 case 'date-time':
760 if ( ! empty( $field['time_format'] ) ) {
761 $date_format = esc_attr( $field['date_format'] ) . ' ' . esc_attr( $field['time_format'] );
762 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
763 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
764 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
765 } else {
766 $date_format = esc_attr( $field['date_format'] ) . ' g:i A';
767 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
768 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
769 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
770 }
771 break;
772 }
773 }
774 return apply_filters( 'everest_forms_date_time_properties', $properties, $field );
775 }
776
777 /**
778 * Field preview inside the builder.
779 *
780 * @since 1.0.0
781 *
782 * @param array $field Field data and settings.
783 */
784 public function field_preview( $field ) {
785 // Define data.
786 $placeholder = ! empty( $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : '';
787
788 // Label.
789 $this->field_preview_option( 'label', $field );
790
791 // Primary input.
792 echo '<input type="text" placeholder="' . esc_attr( $placeholder ) . '" class="widefat" disabled>';
793
794 // Description.
795 $this->field_preview_option( 'description', $field );
796 }
797
798 /**
799 * Field display on the form front-end.
800 *
801 * @since 1.0.0
802 *
803 * @param array $field Field Data.
804 * @param array $field_atts Field attributes.
805 * @param array $form_data All Form Data.
806 */
807 public function field_display( $field, $field_atts, $form_data ) {
808 // Define data.
809 $primary = $field['properties']['inputs']['primary'];
810
811 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
812
813 if ( ! array_key_exists( 'datetime_style', $field ) || 'picker' === $field['datetime_style'] ) {
814 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
815 // Primary field.
816 printf(
817 '<input type="text" %s %s >',
818 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
819 esc_attr( $primary['required'] )
820 );
821 } else {
822 $class = array_merge( array( 'date-dropdown-field' ), $primary['class'] );
823 echo '<div class="date-time-container">';
824
825 printf(
826 '<input type="text" %s %s >',
827 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
828 esc_attr( $primary['required'] )
829 );
830
831 if ( 'date-time' === $field['datetime_format'] || 'date' === $field['datetime_format'] ) {
832 $data_date_format = $primary['attr']['data-date-format'];
833
834 if ( 'F j, Y' === $data_date_format || 'm/d/Y' === $data_date_format || 'F j, Y H:i' === $data_date_format || 'F j, Y h:i K' === $data_date_format || 'm/d/Y H:i' === $data_date_format || 'm/d/Y h:i K' === $data_date_format ) {
835 $this->get_month_html( $primary );
836 $this->get_day_html( $primary );
837 $this->get_year_html( $primary );
838 } elseif ( 'd/m/Y' === $data_date_format || 'd/m/Y H:i' === $data_date_format || 'd/m/Y h:i K' === $data_date_format ) {
839 $this->get_day_html( $primary );
840 $this->get_month_html( $primary );
841 $this->get_year_html( $primary );
842 } else {
843 $this->get_year_html( $primary );
844 $this->get_month_html( $primary );
845 $this->get_day_html( $primary );
846 }
847 }
848
849 if ( 'date-time' === $field['datetime_format'] ) {
850 echo '<span class="date-time-space-filler"></span>';
851 }
852
853 if ( 'time' === $field['datetime_format'] || 'date-time' === $field['datetime_format'] ) {
854
855 $min_hour = isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['min_time_hour'] : 0;
856 $max_hour = isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['max_time_hour'] : 23;
857
858 // For Hours.
859 printf(
860 '<select value = "%s" %s>',
861 esc_attr( ( gmdate( 'H' ) >= $min_hour && ( gmdate( 'H' ) <= $max_hour ) ) ? gmdate( 'H' ) : $min_hour ),
862 evf_html_attributes( 'hour-select-' . esc_attr( $primary['id'] ) )
863 );
864
865 for ( $i = $min_hour; $i <= $max_hour; $i++ ) {
866 printf(
867 '<option value="%s" %s>%s</option>',
868 esc_attr( $i ),
869 (int) gmdate( 'H' ) === $i ? 'selected' : '',
870 esc_html( $this->get_minute_hours( $field, 'hours' )[ $i ] )
871 );
872 }
873
874 echo '</select>';
875
876 $time_interval = isset( $field['time_interval'] ) ? $field['time_interval'] : 1;
877
878 // For Minutes.
879 printf(
880 '<select %s>',
881 evf_html_attributes( 'minute-select-' . esc_attr( $primary['id'] ) )
882 );
883 echo '</select>';
884 }
885
886 echo '</div>';
887 }
888
889 }
890
891 /**
892 * Register/queue frontend scripts.
893 *
894 * @param array $atts Shortcode attributes.
895 */
896 public static function load_assets( $atts ) {
897 $form_id = isset( $atts['id'] ) ? wp_unslash( $atts['id'] ) : ''; // WPCS: CSRF ok, input var ok, sanitization ok.
898 $form_obj = evf()->form->get( $form_id );
899 $form_data = ! empty( $form_obj->post_content ) ? evf_decode( $form_obj->post_content ) : '';
900
901 if ( ! empty( $form_data['form_fields'] ) ) {
902 $data_i10ns = array();
903 foreach ( $form_data['form_fields'] as $form_field ) {
904 if ( 'date-time' === $form_field['type'] && isset( $form_field['datetime_style'] ) && 'picker' === $form_field['datetime_style'] ) {
905 $data_i10n = isset( $form_field['date_localization'] ) ? $form_field['date_localization'] : 'en';
906
907 if ( ! in_array( $data_i10n, $data_i10ns, true ) && 'en' !== $data_i10n ) {
908 $data_i10ns[] = $data_i10n;
909 }
910 }
911 }
912
913 if ( ! empty( $data_i10ns ) ) {
914 foreach ( $data_i10ns as $data_i10n ) {
915 if ( wp_script_is( 'flatpickr' ) ) {
916 wp_enqueue_script( 'flatpickr-localization-' . $data_i10n, evf()->plugin_url() . '/assets/js/flatpickr/dist/I10n/' . $data_i10n . '.js', array(), EVF_VERSION, true );
917 }
918 }
919 }
920 }
921
922 }
923
924 /**
925 * Print HTML for year.
926 *
927 * @param array $primary Primary.
928 * @return void
929 */
930 private function get_year_html( $primary ) {
931 // For Years.
932 printf(
933 '<select value="%s" %s >',
934 esc_attr( gmdate( 'Y' ) ),
935 evf_html_attributes( 'year-select-' . esc_attr( $primary['id'] ) )
936 );
937 // Build the select options.
938 $end_date = gmdate( 'Y' ) + 100;
939 $start_date = $end_date - 200;
940
941 for ( $i = $end_date; $i >= $start_date; $i-- ) {
942 printf(
943 '<option value="%s" %s>%s</option>',
944 esc_attr( $i ),
945 (int) gmdate( 'Y' ) === $i ? 'selected' : '',
946 esc_html( $i )
947 );
948 }
949 echo '</select>';
950 }
951
952 /**
953 * Print HTML for month.
954 *
955 * @param array $primary Primary.
956 * @return void
957 */
958 private function get_month_html( $primary ) {
959 // For Months.
960 printf(
961 '<select value="%s" %s >',
962 esc_attr( gmdate( 'm' ) ),
963 evf_html_attributes( 'month-select-' . esc_attr( $primary['id'] ) )
964 );
965 // Build the select options.
966 for ( $i = 1; $i <= 12; $i++ ) {
967 $month = ( $i < 10 ) ? '0' . $i : $i;
968 printf(
969 '<option value="%s" %s>%s</option>',
970 esc_attr( $i ),
971 (int) gmdate( 'm' ) === $i ? 'selected' : '',
972 esc_html( $month )
973 );
974 }
975 echo '</select>';
976 }
977
978 /**
979 * Print HTML for day.
980 *
981 * @param array $primary Primary.
982 * @return void
983 */
984 private function get_day_html( $primary ) {
985 // For Days.
986 printf(
987 '<select value="%s" %s >',
988 esc_attr( gmdate( 'd' ) ),
989 evf_html_attributes( 'day-select-' . esc_attr( $primary['id'] ) )
990 );
991 // Build the select options.
992 for ( $i = 1; $i <= 32; $i++ ) {
993 $day = $i < 10 ? '0' . $i : $i;
994 printf(
995 '<option value="%s" %s>%s</option>',
996 esc_attr( $i ),
997 (int) gmdate( 'd' ) === $i ? 'selected' : '',
998 esc_html( $day )
999 );
1000 }
1001 echo '</select>';
1002 }
1003
1004
1005
1006 /**
1007 * Returns a list of all timezones.
1008 */
1009 public function get_timezones() {
1010
1011 $utc_timezone = new DateTimeZone( 'UTC' );
1012 $timezones = DateTimeZone::listIdentifiers();
1013 $timezones_array = array(
1014 'Default' => 'Default',
1015 );
1016
1017 foreach ( $timezones as $timezone ) {
1018 $dtz = new DateTimeZone( $timezone );
1019 $offset = $dtz->getOffset( new DateTime( 'now', $utc_timezone ) );
1020
1021 $offset_hours = abs( intval( $offset / 3600 ) );
1022 $offset_minutes = abs( intval( ( $offset % 3600 ) / 60 ) );
1023 $offset_sign = ( $offset < 0 ) ? '-' : '+';
1024
1025 $offset_string = sprintf( '%s%02d:%02d', $offset_sign, $offset_hours, $offset_minutes );
1026
1027 $timezone_parts = explode( '/', $timezone );
1028 $timezone_parts = implode( '/', array_reverse( $timezone_parts ) );
1029
1030 $timezones_array[ $timezone ] = $timezone_parts . " ($offset_string)";
1031 }
1032
1033 return $timezones_array;
1034 }
1035
1036
1037
1038 /**
1039 * Save timezone data for datetime field.
1040 *
1041 * @param [array] $field Field.
1042 * @param [array] $form_data Form Data.
1043 * @param [int] $entry_id Entry Id.
1044 * @return array
1045 */
1046 public function save_timezone( $field, $form_data, $entry_id ) {
1047 global $wpdb;
1048
1049 $field_id = isset( $field['id'] ) ? $field['id'] : 0;
1050
1051 if ( $field_id ) {
1052 $fields_settings = $form_data['form_fields'];
1053 $field_settings = isset( $fields_settings[ $field_id ] ) ? $fields_settings[ $field_id ] : array();
1054
1055 if ( ! empty( $field_settings ) && isset( $field_settings['date_timezone'] ) ) {
1056
1057 $date_timezone = $field_settings['date_timezone'];
1058
1059 if ( ! empty( $date_timezone ) && 'Default' !== $date_timezone ) {
1060
1061 $entry_metadata = array(
1062 'entry_id' => $entry_id,
1063 'meta_key' => sanitize_key( $field_settings['meta-key'] . '_timezone' ),
1064 'meta_value' => maybe_serialize( $date_timezone ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
1065 );
1066
1067 // Insert entry meta.
1068 $wpdb->insert( $wpdb->prefix . 'evf_entrymeta', $entry_metadata );
1069 }
1070 }
1071 }
1072
1073 return $field;
1074 }
1075
1076
1077
1078 /**
1079 * Adds Timezone for datetime column in entries table if available.
1080 *
1081 * @param [string] $value Value.
1082 * @param [string] $entry_meta Entry Meta.
1083 * @param [array] $entry Entry.
1084 * @param [string] $type Type.
1085 * @param [string] $meta_key Meta Key.
1086 *
1087 * @return string
1088 */
1089 public function entry_html( $value, $entry_meta, $entry, $type, $meta_key = '' ) {
1090
1091 $field_metas = isset( $entry->meta ) ? $entry->meta : array();
1092 $timezone_key = $meta_key . '_timezone';
1093
1094 if ( ! empty( $meta_key ) && isset( $field_metas[ $timezone_key ] ) ) {
1095 $timezone_value = $field_metas[ $timezone_key ];
1096 $all_timezones = $this->get_timezones();
1097
1098 if ( isset( $all_timezones[ $timezone_value ] ) ) {
1099 $value .= '<p>' . $all_timezones[ $timezone_value ] . '</p>';
1100 }
1101 }
1102
1103 return $value;
1104 }
1105
1106
1107
1108 /**
1109 * Set default date time in frontend if timezone set.
1110 *
1111 * @param [array] $properties Properties array.
1112 * @param [array] $field Field properties.
1113 * @return array
1114 */
1115 public function set_default_timezone( $properties, $field ) {
1116
1117 if ( ! empty( $field['date_timezone'] ) && 'Default' !== $field['date_timezone'] ) {
1118 $timezone = $field['date_timezone'];
1119
1120 if ( in_array( $timezone, timezone_identifiers_list(), true ) ) {
1121
1122 $dtz = new DateTimeZone( $timezone );
1123 $datetime = new DateTime( 'now', $dtz );
1124
1125 switch ( $field['datetime_format'] ) {
1126 case 'date':
1127 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $field['date_format'] ) );
1128 break;
1129
1130 case 'date-time':
1131 if ( ! empty( $field['time_format'] ) ) {
1132 $date_format = esc_attr( $field['date_format'] ) . ' ' . esc_attr( $field['time_format'] );
1133 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $date_format ) );
1134 } else {
1135 $date_format = esc_attr( $field['date_format'] ) . ' g:i A';
1136 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $date_format ) );
1137 }
1138 break;
1139 }
1140 }
1141 }
1142
1143 return $properties;
1144 }
1145 }
1146