PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.6.1
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.6.1
3.6.1 3.6.0 3.5.3 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 1 month ago class-evf-field-ai.php 1 year ago class-evf-field-captcha.php 2 months ago class-evf-field-checkbox.php 4 months ago class-evf-field-color.php 2 months ago class-evf-field-country.php 4 months ago class-evf-field-credit-card.php 2 months ago class-evf-field-date-time.php 12 hours ago class-evf-field-divider.php 2 years ago class-evf-field-email.php 1 year ago class-evf-field-file-upload.php 1 year ago class-evf-field-first-name.php 1 year ago class-evf-field-hcaptcha.php 6 months ago class-evf-field-hidden.php 1 year ago class-evf-field-html.php 11 months ago class-evf-field-image-upload.php 1 year ago class-evf-field-last-name.php 1 year ago class-evf-field-likert.php 1 year ago class-evf-field-lookup.php 2 months ago class-evf-field-number.php 1 year ago class-evf-field-password.php 2 months ago class-evf-field-payment-authorize-net.php 2 months ago class-evf-field-payment-checkbox.php 2 months ago class-evf-field-payment-coupon.php 2 months ago class-evf-field-payment-gateway-selector.php 2 months ago class-evf-field-payment-quantity.php 2 months ago class-evf-field-payment-radio.php 2 months ago class-evf-field-payment-single.php 2 months ago class-evf-field-payment-square.php 2 years ago class-evf-field-payment-subscription-plan.php 2 months ago class-evf-field-payment-subtotal.php 2 months ago class-evf-field-payment-total.php 2 months ago class-evf-field-phone.php 1 year ago class-evf-field-privacy-policy.php 4 months ago class-evf-field-private-note.php 1 year ago class-evf-field-progress.php 2 months ago class-evf-field-radio.php 4 months ago class-evf-field-range-slider.php 2 months ago class-evf-field-rating.php 4 months ago class-evf-field-recaptcha.php 6 months ago class-evf-field-repeater.php 2 months ago class-evf-field-reset.php 2 months ago class-evf-field-scale-rating.php 1 year ago class-evf-field-select.php 1 year ago class-evf-field-signature.php 2 months ago class-evf-field-text.php 1 year ago class-evf-field-textarea.php 1 year ago class-evf-field-title.php 2 years ago class-evf-field-turnstile.php 6 months ago class-evf-field-url.php 1 year ago class-evf-field-wysiwyg.php 4 months ago class-evf-field-yes-no.php 1 year ago payment-amount-helpers.php 2 months ago
class-evf-field-date-time.php
1284 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 'choose_format',
30 'choose_style',
31 'description',
32 'required',
33 'required_field_message_setting',
34 'required_field_message',
35 ),
36 ),
37 'advanced-options' => array(
38 'field_options' => array(
39 'placeholder',
40 'meta',
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_types = array(
178 'Y-m-d' => date_i18n( 'Y-m-d' ) . ' (Y-m-d)',
179 'F j, Y' => date_i18n( 'F j, Y' ) . ' (F j, Y)',
180 'm/d/Y' => date_i18n( 'm/d/Y' ) . ' (m/d/Y)',
181 'd/m/Y' => date_i18n( 'd/m/Y' ) . ' (d/m/Y)',
182 'Y.m.d' => date_i18n( 'Y.m.d' ) . ' (Y.m.d)',
183 'F,Y' => date_i18n( 'F,Y' ) . ' (F,Y)',
184 'm.d.y' => date_i18n( 'm.d.y' ) . ' (m.d.y)',
185 'd.m.y' => date_i18n( 'd.m.y' ) . ' (d.m.y)',
186 'd.m.y' => date_i18n( 'd.m.Y' ) . ' (d.m.Y)',
187 'm-d-y' => date_i18n( 'm-d-y' ) . ' (m-d-y)',
188 );
189
190 /**
191 * Filter to modify the date format options.
192 *
193 * @since 3.2.2
194 */
195 $date_format_options = apply_filters( 'everest_forms_date_format_options', $date_format_types );
196 $date_format_select = $this->field_element(
197 'select',
198 $field,
199 array(
200 'slug' => 'date_format',
201 'value' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
202 'class' => 'evf-date-format',
203 'options' => $date_format_options,
204 ),
205 false
206 );
207
208 // Disable certain dates option.
209 $clear_disabled_dates_button = sprintf( '<a href="#" class="evf-clear-disabled-dates after-label-description">%s</a>', esc_html__( 'Clear', 'everest-forms' ) );
210 $disable_dates_label = $this->field_element(
211 'label',
212 $field,
213 array(
214 'slug' => 'disable_dates',
215 'value' => esc_html__( 'Disable Dates', 'everest-forms' ),
216 'tooltip' => esc_html__( 'Select which dates you want to disable.', 'everest-forms' ),
217 'after_tooltip' => $clear_disabled_dates_button,
218 ),
219 false
220 );
221 $disable_dates = $this->field_element(
222 'text',
223 $field,
224 array(
225 'slug' => 'disable_dates',
226 'value' => isset( $field['disable_dates'] ) ? $field['disable_dates'] : '',
227 'class' => 'everest-forms-disable-dates',
228 'data' => array(
229 'date-format' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
230 ),
231 ),
232 false
233 );
234
235 $current_date_mode = $this->field_element(
236 'radio',
237 $field,
238 array(
239 'slug' => 'date_mode',
240 'default' => isset( $field['date_mode'] ) ? $field['date_mode'] : 'single',
241 'desc' => esc_html__( 'Date Mode', 'everest-forms' ),
242 'tooltip' => esc_html__( 'Select your desire date mode.', 'everest-forms' ),
243 'options' => array(
244 'single' => 'Single',
245 'range' => 'Range',
246 'multiple' => 'Multiple',
247 ),
248 ),
249 false
250 );
251
252 $date_localization_label = $this->field_element(
253 'label',
254 $field,
255 array(
256 'slug' => 'date_localization',
257 'value' => esc_html__( 'Date Localization', 'everest-forms' ),
258 'tooltip' => esc_html__( 'Choose a desire date localization to display.', 'everest-forms' ),
259 ),
260 false
261 );
262
263 $date_localization_select = $this->field_element(
264 'select',
265 $field,
266 array(
267 'slug' => 'date_localization',
268 'value' => isset( $field['date_localization'] ) ? $field['date_localization'] : 'en',
269 'options' => array(
270 'en' => 'English',
271 'ar' => 'Arabic',
272 'at' => 'Austria',
273 'az' => 'Azerbaijan',
274 'be' => 'Belarusian',
275 'bg' => 'Bulgarian',
276 'bn' => 'Bangla',
277 'bs' => 'Bosnian',
278 'cat' => 'Catalan',
279 'cs' => 'Czech',
280 'cy' => 'Welsh',
281 'da' => 'Danish',
282 'de' => 'German',
283 'eo' => 'Esperanto',
284 'es' => 'Spanish',
285 'et' => 'Estonian',
286 'fa' => 'Persian',
287 'fi' => 'Finnish',
288 'fo' => 'Faroese',
289 'fr' => 'French',
290 'ga' => 'Irish',
291 'gr' => 'Greek',
292 'he' => 'Hebrew',
293 'hi' => 'Hindi',
294 'hr' => 'Croatian',
295 'hu' => 'Hungarian',
296 'id' => 'Indonesian',
297 'is' => 'Icelandic',
298 'it' => 'Italian',
299 'ja' => 'Japanese',
300 'ka' => 'Georgian',
301 'ko' => 'Korean',
302 'km' => 'Khmer',
303 'kz' => 'Kazakh',
304 'lt' => 'Lithuanian',
305 'lv' => 'Latvian',
306 'mk' => 'Macedonian',
307 'mn' => 'Mongolian',
308 'ms' => 'Malaysian',
309 'my' => 'Burmese',
310 'nl' => 'Dutch',
311 'no' => 'Norwegian',
312 'pa' => 'Punjabi',
313 'pl' => 'Polish',
314 'pt' => 'Portuguese',
315 'ro' => 'Romanian',
316 'ru' => 'Russian',
317 'si' => 'Sinhala',
318 'sk' => 'Slovak',
319 'sl' => 'Slovenian',
320 'sq' => 'Albanian',
321 'sr' => 'Serbian',
322 'sv' => 'Swedish',
323 'th' => 'Thai',
324 'tr' => 'Turkish',
325 'uk' => 'Ukrainian',
326 'vn' => 'Vietnamese',
327 'zh' => 'Mandarin',
328 'zh_tw' => 'MandarinTraditional',
329 ),
330 ),
331 false
332 );
333
334 $date_timezone_label = $this->field_element(
335 'label',
336 $field,
337 array(
338 'slug' => 'date_timezone',
339 'value' => esc_html__( 'Timezone', 'everest-forms' ),
340 'tooltip' => esc_html__( 'Choose a desired timezone to save datetime in.', 'everest-forms' ),
341 ),
342 false
343 );
344
345 $date_timezone_select = $this->field_element(
346 'select',
347 $field,
348 array(
349 'slug' => 'date_timezone',
350 'value' => isset( $field['date_timezone'] ) ? $field['date_timezone'] : '',
351 'options' => $this->get_timezones(),
352 ),
353 false
354 );
355
356 $current_date_default = $this->field_element(
357 'toggle',
358 $field,
359 array(
360 'slug' => 'date_default',
361 'value' => isset( $field['date_default'] ) ? $field['date_default'] : '',
362 'desc' => esc_html__( 'Default to current date.', 'everest-forms' ),
363 'tooltip' => esc_html__( 'Check this option to set current date as default.', 'everest-forms' ),
364 ),
365 false
366 );
367
368 $enable_past_date_disable = $this->field_element(
369 'toggle',
370 $field,
371 array(
372 'slug' => 'past_date_disable',
373 'value' => isset( $field['past_date_disable'] ) ? $field['past_date_disable'] : '',
374 'desc' => esc_html__( 'Disable the past date', 'everest-forms' ),
375 'tooltip' => esc_html__( 'Check this option to disable the past date', 'everest-forms' ),
376 ),
377 false
378 );
379
380 $enable_min_max = $this->field_element(
381 'toggle',
382 $field,
383 array(
384 'slug' => 'enable_min_max',
385 'value' => isset( $field['enable_min_max'] ) ? $field['enable_min_max'] : '',
386 'desc' => esc_html__( 'Enable Min Max date.', 'everest-forms' ),
387 'tooltip' => esc_html__( 'Check this option to set min max date.', 'everest-forms' ),
388 ),
389 false
390 );
391
392 $min_date_label = $this->field_element(
393 'label',
394 $field,
395 array(
396 'slug' => 'min_date',
397 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
398 'tooltip' => esc_html__( 'Select minium date.', 'everest-forms' ),
399 ),
400 false
401 );
402
403 $min_date = $this->field_element(
404 'text',
405 $field,
406 array(
407 'slug' => 'min_date',
408 'value' => isset( $field['min_date'] ) ? $field['min_date'] : '',
409 'class' => 'everest-forms-min-date',
410 ),
411 false
412 );
413
414 $max_date_label = $this->field_element(
415 'label',
416 $field,
417 array(
418 'slug' => 'max_date',
419 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
420 'tooltip' => esc_html__( 'Select maximum date.', 'everest-forms' ),
421 ),
422 false
423 );
424
425 $max_date = $this->field_element(
426 'text',
427 $field,
428 array(
429 'slug' => 'max_date',
430 'value' => isset( $field['max_date'] ) ? $field['max_date'] : '',
431 'class' => 'everest-forms-max-date',
432 ),
433 false
434 );
435
436 $set_date_range = $this->field_element(
437 'toggle',
438 $field,
439 array(
440 'slug' => 'set_date_range',
441 'value' => isset( $field['set_date_range'] ) ? $field['set_date_range'] : '',
442 'desc' => esc_html__( 'Enable Custom Input', 'everest-forms' ),
443 'tooltip' => esc_html__( "Check this option to set date range 'x' days after today.", 'everest-forms' ),
444 ),
445 false
446 );
447
448 $min_date_range_level = $this->field_element(
449 'label',
450 $field,
451 array(
452 'slug' => 'min_date_range',
453 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
454 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
455 ),
456 false
457 );
458
459 $min_date_range = $this->field_element(
460 'text',
461 $field,
462 array(
463 'slug' => 'min_date_range',
464 'value' => isset( $field['min_date_range'] ) ? $field['min_date_range'] : '',
465 'class' => 'everest-forms-min-date-range',
466 'placeholder' => 'e.g. today',
467 ),
468 false
469 );
470
471 $max_date_range_label = $this->field_element(
472 'label',
473 $field,
474 array(
475 'slug' => 'max_date_range',
476 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
477 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
478 ),
479 false
480 );
481
482 $max_date_range = $this->field_element(
483 'text',
484 $field,
485 array(
486 'slug' => 'max_date_range',
487 'value' => isset( $field['max_date_range'] ) ? $field['max_date_range'] : '',
488 'class' => 'everest-forms-max-date-range',
489 'placeholder' => 'e.g. +14 days',
490 ),
491 false
492 );
493
494 $args = array(
495 'slug' => 'date_format',
496 '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>',
497 );
498 $this->field_element( 'row', $field, $args );
499
500 echo '</div>';
501
502 echo '<div class="everest-forms-border-container everest-forms-time">';
503 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Time', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
504
505 $time_format_label = $this->field_element(
506 'label',
507 $field,
508 array(
509 'slug' => 'time_interval',
510 'value' => esc_html__( 'Time interval and format', 'everest-forms' ),
511 'tooltip' => esc_html__( 'Choose time interval and format to display.', 'everest-forms' ),
512 ),
513 false
514 );
515
516 $time_interval_select = '<div class="input-group-col-2">';
517 $time_interval_select .= $this->field_element(
518 'select',
519 $field,
520 array(
521 'slug' => 'time_interval',
522 'value' => isset( $field['time_interval'] ) ? $field['time_interval'] : '',
523 'class' => 'time_interval',
524 'options' => array(
525 '15' => esc_html__( '15 minutes', 'everest-forms' ),
526 '30' => esc_html__( '30 minutes', 'everest-forms' ),
527 '60' => esc_html__( '1 hour', 'everest-forms' ),
528 ),
529 ),
530 false
531 );
532 $time_format_select = $this->field_element(
533 'select',
534 $field,
535 array(
536 'slug' => 'time_format',
537 'value' => isset( $field['time_format'] ) ? $field['time_format'] : '',
538 'class' => 'time_format',
539 'options' => array(
540 'g:i A' => esc_html__( '12 H', 'everest-forms' ),
541 'H:i' => esc_html__( '24 H', 'everest-forms' ),
542 ),
543 ),
544 false
545 );
546 $time_format_select .= '</div>';
547
548 $min_time_select = '<div class="input-group-col-2">';
549 $min_time_select .= $this->field_element(
550 'select',
551 $field,
552 array(
553 'slug' => 'min_time_hour',
554 'value' => isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : 9,
555 'class' => 'min_time_hour',
556 'options' => $this->get_minute_hours( $field, 'hours' ),
557 ),
558 false
559 );
560 $min_time_select .= $this->field_element(
561 'select',
562 $field,
563 array(
564 'slug' => 'min_time_minute',
565 'value' => isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : 30,
566 'class' => 'min_time_minute',
567 'options' => $this->get_minute_hours( $field, 'minutes' ),
568 ),
569 false
570 );
571 $min_time_select .= '</div>';
572
573 $max_time_select = '<div class="input-group-col-2">';
574 $max_time_select .= $this->field_element(
575 'select',
576 $field,
577 array(
578 'slug' => 'max_time_hour',
579 'value' => isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : 18,
580 'class' => 'max_time_hour',
581 'options' => $this->get_minute_hours( $field, 'hours' ),
582 ),
583 false
584 );
585 $max_time_select .= $this->field_element(
586 'select',
587 $field,
588 array(
589 'slug' => 'max_time_minute',
590 'value' => isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : 30,
591 'class' => 'max_time_minute',
592 'options' => $this->get_minute_hours( $field, 'minutes' ),
593 ),
594 false
595 );
596 $max_time_select .= '</div>';
597
598 $enable_min_max_time = '<div class="input-group-col-2">';
599
600 $enable_min_max_time .= $this->field_element(
601 'toggle',
602 $field,
603 array(
604 'slug' => 'enable_min_max_time',
605 'value' => isset( $field['enable_min_max_time'] ) ? $field['enable_min_max_time'] : '',
606 'desc' => esc_html__( 'Enable Min Max Time.', 'everest-forms' ),
607 'tooltip' => esc_html__( 'Check this option to set min max time.', 'everest-forms' ),
608 ),
609 false
610 );
611 $enable_min_max_time .= '</div>';
612
613 $select_min_time = $this->field_element(
614 'label',
615 $field,
616 array(
617 'slug' => 'select_min_time',
618 'value' => esc_html__( 'Minimum Time', 'everest-forms' ),
619 'tooltip' => esc_html__( 'Select minium time.', 'everest-forms' ),
620 ),
621 false
622 );
623
624 $select_max_time = $this->field_element(
625 'label',
626 $field,
627 array(
628 'slug' => 'select_max_time',
629 'value' => esc_html__( 'Maximum Time', 'everest-forms' ),
630 'tooltip' => esc_html__( 'Select maximum time.', 'everest-forms' ),
631 ),
632 false
633 );
634 $args = array(
635 'slug' => 'time_interval_format',
636 '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,
637 );
638 $this->field_element( 'row', $field, $args );
639
640 echo '</div>';
641 echo '<div class="everest-forms-border-container everest-forms-slot-booking">';
642 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Slot Booking', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
643
644 $slot_booking_toggle = $this->field_element(
645 'toggle',
646 $field,
647 array(
648 'slug' => 'slot_booking_advanced',
649 'desc' => esc_html__( 'Enable Slot Booking', 'everest-forms' ),
650 'value' => isset( $field['slot_booking_advanced'] ) ? $field['slot_booking_advanced'] : false,
651 'tooltip' => esc_html__( 'Enable to use date/time field as slot booking.', 'everest-forms' ),
652 'class' => 'slot-booking-advanced ',
653 'default' => false,
654 ),
655 false
656 );
657
658 $args = array(
659 'slug' => 'slot_booking_advanced_setting',
660 'content' => $slot_booking_toggle,
661 );
662 $this->field_element( 'row', $field, $args );
663 echo '</div>';
664 echo '</div>';
665 }
666
667 /**
668 * Time Hours/Minutes Provider.
669 *
670 * @since 1.7.5
671 * @param mixed $field field data.
672 * @param string $required required type.
673 */
674 public function get_minute_hours( $field, $required = 'hours' ) {
675 $required_array = array();
676 if ( 'hours' === $required ) {
677 // Hours Array.
678 $period = '';
679 for ( $i = 0; $i <= 23; $i++ ) {
680 if ( isset( $field['time_format'] ) && 'H:i' === $field['time_format'] ) {
681 $required_array [] = ( $i < 10 ? '0' . $i : $i ) . $period;
682 } else {
683 if ( $i < 12 ) {
684 $period = ' AM';
685 } else {
686 $period = ' PM';
687 }
688 $hour = $i;
689 if ( 0 === $i ) {
690 $hour = 12;
691 }
692 if ( $hour > 12 ) {
693 $hour = $i - 12;
694 }
695 $required_array [] = $hour . $period;
696 }
697 }
698 } else {
699 // Minutes Array.
700 for ( $i = 0; $i <= 59; $i++ ) {
701 $required_array [] = ( $i < 10 ) ? '0' . $i : $i;
702 }
703 }
704 return $required_array;
705 }
706
707 /**
708 * Define additional field properties.
709 *
710 * @since 1.0.0
711 *
712 * @param array $properties Field properties.
713 * @param array $field Field settings.
714 * @param array $form_data Form data and settings.
715 *
716 * @return array of additional field properties.
717 */
718 public function field_properties( $properties, $field, $form_data ) {
719 // Input primary: data-time-interval.
720 if ( ! empty( $field['time_interval'] ) ) {
721 $properties['inputs']['primary']['attr']['data-time-interval'] = esc_attr( $field['time_interval'] );
722 }
723
724 // Input primary: Disabled dates data.
725 if ( ! empty( $field['disable_dates'] ) ) {
726 $properties['inputs']['primary']['attr']['data-disable-dates'] = esc_attr( $field['disable_dates'] );
727 }
728
729 // Input primary: Booked slot.
730 if ( isset( $field['slot_booking_advanced'] ) && evf_string_to_bool( $field['slot_booking_advanced'] ) ) {
731 $properties['inputs']['primary']['attr']['data-slot-booking'] = esc_attr( $field['slot_booking_advanced'] );
732 $properties['inputs']['primary']['attr']['data-form-id'] = esc_attr( $form_data['id'] );
733 }
734
735 // Input primary: data-date-time.
736 if ( ! empty( $field['datetime_format'] ) ) {
737 $properties['inputs']['primary']['attr']['data-date-time'] = esc_attr( $field['datetime_format'] );
738
739 // Input primary: data-mode.
740 if ( 'time' !== $field['datetime_format'] ) {
741 if ( isset( $field['date_range'] ) && '1' === $field['date_range'] ) {
742 $properties['inputs']['primary']['attr']['data-mode'] = 'range';
743 } else {
744 $properties['inputs']['primary']['attr']['data-mode'] = isset( $field['date_mode'] ) ? $field['date_mode'] : 'single';
745 }
746 $properties['inputs']['primary']['attr']['data-locale'] = isset( $field['date_localization'] ) ? $field['date_localization'] : 'en';
747 $properties['inputs']['primary']['attr']['data-min-date'] = isset( $field['enable_min_max'], $field['min_date'] ) && ! isset( $field['set_date_range'] ) ? $field['min_date'] : '';
748 $properties['inputs']['primary']['attr']['data-max-date'] = isset( $field['enable_min_max'], $field['max_date'] ) && ! isset( $field['set_date_range'] ) ? $field['max_date'] : '';
749 $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'] : '';
750 $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'] : '';
751 }
752
753 if ( 'date' !== $field['datetime_format'] ) {
754 if ( isset( $field['enable_min_max_time'] ) ) {
755 $properties['inputs']['primary']['attr']['data-min-hour'] = isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : '';
756 $properties['inputs']['primary']['attr']['data-min-minute'] = isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : '';
757 $properties['inputs']['primary']['attr']['data-max-hour'] = isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : '';
758 $properties['inputs']['primary']['attr']['data-max-minute'] = isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : '';
759 }
760 }
761
762 // Input primary: data-date-format and value.
763 switch ( $field['datetime_format'] ) {
764 case 'date':
765 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
766 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $field['date_format'] ) ) : '';
767 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
768 break;
769 case 'time':
770 $properties['inputs']['primary']['attr']['value'] = '';
771 $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';
772 break;
773 case 'date-time':
774 if ( ! empty( $field['time_format'] ) ) {
775 $date_format = esc_attr( $field['date_format'] ) . ' ' . esc_attr( $field['time_format'] );
776 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
777 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
778 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
779 } else {
780 $date_format = esc_attr( $field['date_format'] ) . ' g:i A';
781 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
782 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
783 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
784 }
785 break;
786 }
787 }
788 return apply_filters( 'everest_forms_date_time_properties', $properties, $field );
789 }
790
791 /**
792 * Field preview inside the builder.
793 *
794 * @since 1.0.0
795 *
796 * @param array $field Field data and settings.
797 */
798 public function field_preview( $field ) {
799 // Define data.
800 $placeholder = ! empty( $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : '';
801
802 // Label.
803 $this->field_preview_option( 'label', $field );
804
805 // Primary input.
806 echo '<input type="text" placeholder="' . esc_attr( $placeholder ) . '" class="widefat" disabled>';
807
808 // Description.
809 $this->field_preview_option( 'description', $field );
810 }
811
812 /**
813 * Field display on the form front-end.
814 *
815 * @since 1.0.0
816 *
817 * @param array $field Field Data.
818 * @param array $field_atts Field attributes.
819 * @param array $form_data All Form Data.
820 */
821 public function field_display( $field, $field_atts, $form_data ) {
822 // Define data.
823 $primary = $field['properties']['inputs']['primary'];
824
825 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
826
827 if ( ! array_key_exists( 'datetime_style', $field ) || 'picker' === $field['datetime_style'] ) {
828 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
829 // Primary field.
830 printf(
831 '<input type="text" %s %s >',
832 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
833 esc_attr( $primary['required'] )
834 );
835 } else {
836 $class = array_merge( array( 'date-dropdown-field' ), $primary['class'] );
837 echo '<div class="date-time-container">';
838
839 printf(
840 '<input type="text" %s %s >',
841 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
842 esc_attr( $primary['required'] )
843 );
844
845 // Preselect the field's own value (e.g. when editing an entry), not
846 // today. Both the date and the time selects read this.
847 $primary['selected_date'] = $this->get_dropdown_selected_date( $primary, $field );
848
849 if ( 'date-time' === $field['datetime_format'] || 'date' === $field['datetime_format'] ) {
850 $data_date_format = $primary['attr']['data-date-format'];
851
852 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 ) {
853 $this->get_month_html( $primary );
854 $this->get_day_html( $primary );
855 $this->get_year_html( $primary );
856 } elseif ( 'd/m/Y' === $data_date_format || 'd/m/Y H:i' === $data_date_format || 'd/m/Y h:i K' === $data_date_format ) {
857 $this->get_day_html( $primary );
858 $this->get_month_html( $primary );
859 $this->get_year_html( $primary );
860 } else {
861 $this->get_year_html( $primary );
862 $this->get_month_html( $primary );
863 $this->get_day_html( $primary );
864 }
865 }
866
867 if ( 'date-time' === $field['datetime_format'] ) {
868 echo '<span class="date-time-space-filler"></span>';
869 }
870
871 if ( 'time' === $field['datetime_format'] || 'date-time' === $field['datetime_format'] ) {
872
873 $min_hour = (int) ( isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['min_time_hour'] : 0 );
874 $max_hour = (int) ( isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['max_time_hour'] : 23 );
875
876 // The field's own time when there is one, today's hour otherwise.
877 $selected_hour = null === $primary['selected_date']['hour'] ? (int) gmdate( 'H' ) : $primary['selected_date']['hour'];
878
879 if ( $selected_hour < $min_hour || $selected_hour > $max_hour ) {
880 $selected_hour = $min_hour;
881 }
882
883 // For Hours.
884 printf(
885 '<select value = "%s" %s>',
886 esc_attr( $selected_hour ),
887 evf_html_attributes( 'hour-select-' . esc_attr( $primary['id'] ) )
888 );
889
890 for ( $i = $min_hour; $i <= $max_hour; $i++ ) {
891 printf(
892 '<option value="%s" %s>%s</option>',
893 esc_attr( $i ),
894 $selected_hour === $i ? 'selected' : '',
895 esc_html( $this->get_minute_hours( $field, 'hours' )[ $i ] )
896 );
897 }
898
899 echo '</select>';
900
901 $time_interval = isset( $field['time_interval'] ) ? $field['time_interval'] : 1;
902
903 // For Minutes. The options are built by the frontend script, so
904 // hand it the minute to restore once it has.
905 printf(
906 '<select data-selected-minute="%s" %s>',
907 esc_attr( null === $primary['selected_date']['minute'] ? '' : $primary['selected_date']['minute'] ),
908 evf_html_attributes( 'minute-select-' . esc_attr( $primary['id'] ) )
909 );
910 echo '</select>';
911 }
912
913 echo '</div>';
914 }
915 }
916
917 /**
918 * Register/queue frontend scripts.
919 *
920 * @param array $atts Shortcode attributes.
921 */
922 public static function load_assets( $atts ) {
923 $form_id = isset( $atts['id'] ) ? wp_unslash( $atts['id'] ) : ''; // WPCS: CSRF ok, input var ok, sanitization ok.
924 $form_obj = evf()->form->get( $form_id );
925 $form_data = ! empty( $form_obj->post_content ) ? evf_decode( $form_obj->post_content ) : '';
926
927 if ( ! empty( $form_data['form_fields'] ) ) {
928 $data_i10ns = array();
929 foreach ( $form_data['form_fields'] as $form_field ) {
930 if ( 'date-time' === $form_field['type'] && isset( $form_field['datetime_style'] ) && 'picker' === $form_field['datetime_style'] ) {
931 $data_i10n = isset( $form_field['date_localization'] ) ? $form_field['date_localization'] : 'en';
932
933 if ( ! in_array( $data_i10n, $data_i10ns, true ) && 'en' !== $data_i10n ) {
934 $data_i10ns[] = $data_i10n;
935 }
936 }
937 }
938
939 if ( ! empty( $data_i10ns ) ) {
940 foreach ( $data_i10ns as $data_i10n ) {
941 if ( wp_script_is( 'flatpickr' ) ) {
942 wp_enqueue_script( 'flatpickr-localization-' . $data_i10n, evf()->plugin_url() . '/assets/js/flatpickr/dist/I10n/' . $data_i10n . '.js', array(), EVF_VERSION, true );
943 }
944 }
945 }
946 }
947 }
948
949 /**
950 * Resolve which date and time the dropdowns should preselect.
951 *
952 * The dropdowns are also used to render an existing value (editing an entry,
953 * a validation redisplay, Save & Continue), so they must reflect the field's
954 * own value and only fall back to today when there isn't one.
955 *
956 * @since 3.5.4
957 *
958 * @param array $primary Primary input properties.
959 * @param array $field Field data and settings.
960 * @return array Year, month and day as integers, plus hour and minute as
961 * integers when the value carried a time and null when it did not.
962 */
963 private function get_dropdown_selected_date( $primary, $field ) {
964 $fallback = array(
965 'year' => (int) gmdate( 'Y' ),
966 'month' => (int) gmdate( 'm' ),
967 'day' => (int) gmdate( 'd' ),
968 'hour' => null,
969 'minute' => null,
970 );
971
972 $value = isset( $primary['attr']['value'] ) ? trim( $primary['attr']['value'] ) : '';
973
974 if ( '' === $value ) {
975 return $fallback;
976 }
977
978 $datetime_format = ! empty( $field['datetime_format'] ) ? $field['datetime_format'] : 'date';
979 $date_format = ! empty( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d';
980 $time_format = ! empty( $field['time_format'] ) ? $field['time_format'] : 'g:i A';
981
982 // Widest format first: a stored date-time still yields its date half
983 // when the field has since been switched to date only. The flag says
984 // whether a match carries a usable time.
985 if ( 'time' === $datetime_format ) {
986 $formats = array( $time_format => true );
987 } elseif ( 'date-time' === $datetime_format ) {
988 $formats = array(
989 $date_format . ' ' . $time_format => true,
990 $date_format => false,
991 );
992 } else {
993 $formats = array( $date_format => false );
994 }
995
996 foreach ( $formats as $format => $has_time ) {
997 $date = DateTime::createFromFormat( $format, $value );
998
999 if ( ! $date instanceof DateTime ) {
1000 continue;
1001 }
1002
1003 // createFromFormat() rolls an impossible date over rather than
1004 // failing (Feb 31 becomes Mar 2), so only accept a parse that
1005 // renders back to what was stored.
1006 $rendered = $date->format( $format );
1007
1008 if ( 0 !== strncmp( $rendered, $value, strlen( $rendered ) ) ) {
1009 continue;
1010 }
1011
1012 return array(
1013 'year' => (int) $date->format( 'Y' ),
1014 'month' => (int) $date->format( 'n' ),
1015 'day' => (int) $date->format( 'j' ),
1016 'hour' => $has_time ? (int) $date->format( 'G' ) : null,
1017 'minute' => $has_time ? (int) $date->format( 'i' ) : null,
1018 );
1019 }
1020
1021 return $fallback;
1022 }
1023
1024 /**
1025 * Print HTML for year.
1026 *
1027 * @param array $primary Primary.
1028 * @return void
1029 */
1030 private function get_year_html( $primary ) {
1031 $selected_year = $primary['selected_date']['year'];
1032
1033 // For Years.
1034 printf(
1035 '<select value="%s" %s >',
1036 esc_attr( $selected_year ),
1037 evf_html_attributes( 'year-select-' . esc_attr( $primary['id'] ) )
1038 );
1039 // Build the select options.
1040 $end_date = gmdate( 'Y' ) + 100;
1041 $start_date = $end_date - 200;
1042
1043 for ( $i = $end_date; $i >= $start_date; $i-- ) {
1044 printf(
1045 '<option value="%s" %s>%s</option>',
1046 esc_attr( $i ),
1047 $selected_year === $i ? 'selected' : '',
1048 esc_html( $i )
1049 );
1050 }
1051 echo '</select>';
1052 }
1053
1054 /**
1055 * Print HTML for month.
1056 *
1057 * @param array $primary Primary.
1058 * @return void
1059 */
1060 private function get_month_html( $primary ) {
1061 $selected_month = $primary['selected_date']['month'];
1062
1063 // For Months.
1064 printf(
1065 '<select value="%s" %s >',
1066 esc_attr( sprintf( '%02d', $selected_month ) ),
1067 evf_html_attributes( 'month-select-' . esc_attr( $primary['id'] ) )
1068 );
1069 // Build the select options.
1070 for ( $i = 1; $i <= 12; $i++ ) {
1071 $month = ( $i < 10 ) ? '0' . $i : $i;
1072 printf(
1073 '<option value="%s" %s>%s</option>',
1074 esc_attr( $i ),
1075 $selected_month === $i ? 'selected' : '',
1076 esc_html( $month )
1077 );
1078 }
1079 echo '</select>';
1080 }
1081
1082 /**
1083 * Print HTML for day.
1084 *
1085 * @param array $primary Primary.
1086 * @return void
1087 */
1088 private function get_day_html( $primary ) {
1089 $selected_day = $primary['selected_date']['day'];
1090
1091 // For Days.
1092 printf(
1093 '<select value="%s" %s >',
1094 esc_attr( sprintf( '%02d', $selected_day ) ),
1095 evf_html_attributes( 'day-select-' . esc_attr( $primary['id'] ) )
1096 );
1097 // Build the select options.
1098 for ( $i = 1; $i <= 31; $i++ ) {
1099 $day = $i < 10 ? '0' . $i : $i;
1100 printf(
1101 '<option value="%s" %s>%s</option>',
1102 esc_attr( $i ),
1103 $selected_day === $i ? 'selected' : '',
1104 esc_html( $day )
1105 );
1106 }
1107 echo '</select>';
1108 }
1109
1110
1111
1112 /**
1113 * Returns a list of all timezones.
1114 */
1115 public function get_timezones() {
1116
1117 $utc_timezone = new DateTimeZone( 'UTC' );
1118 $timezones = DateTimeZone::listIdentifiers();
1119 $timezones_array = array(
1120 'Default' => 'Default',
1121 );
1122
1123 foreach ( $timezones as $timezone ) {
1124 try {
1125 $dtz = new DateTimeZone( $timezone );
1126 } catch ( Exception $e ) {
1127 // Skip identifiers that the system timezone database does not recognize.
1128 continue;
1129 }
1130 $offset = $dtz->getOffset( new DateTime( 'now', $utc_timezone ) );
1131
1132 $offset_hours = abs( intval( $offset / 3600 ) );
1133 $offset_minutes = abs( intval( ( $offset % 3600 ) / 60 ) );
1134 $offset_sign = ( $offset < 0 ) ? '-' : '+';
1135
1136 $offset_string = sprintf( '%s%02d:%02d', $offset_sign, $offset_hours, $offset_minutes );
1137
1138 $timezone_parts = explode( '/', $timezone );
1139 $timezone_parts = implode( '/', array_reverse( $timezone_parts ) );
1140
1141 $timezones_array[ $timezone ] = $timezone_parts . " ($offset_string)";
1142 }
1143
1144 return $timezones_array;
1145 }
1146
1147
1148
1149 /**
1150 * Save timezone data for datetime field.
1151 *
1152 * @param [array] $field Field.
1153 * @param [array] $form_data Form Data.
1154 * @param [int] $entry_id Entry Id.
1155 * @return array
1156 */
1157 public function save_timezone( $field, $form_data, $entry_id ) {
1158 global $wpdb;
1159
1160 $field_id = isset( $field['id'] ) ? $field['id'] : 0;
1161
1162 if ( $field_id ) {
1163 $fields_settings = $form_data['form_fields'];
1164 $field_settings = isset( $fields_settings[ $field_id ] ) ? $fields_settings[ $field_id ] : array();
1165
1166 if ( ! empty( $field_settings ) && isset( $field_settings['date_timezone'] ) ) {
1167
1168 $date_timezone = $field_settings['date_timezone'];
1169
1170 if ( ! empty( $date_timezone ) && 'Default' !== $date_timezone ) {
1171
1172 $entry_metadata = array(
1173 'entry_id' => $entry_id,
1174 'meta_key' => sanitize_key( $field_settings['meta-key'] . '_timezone' ),
1175 'meta_value' => maybe_serialize( $date_timezone ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
1176 );
1177
1178 // Insert entry meta.
1179 $wpdb->insert( $wpdb->prefix . 'evf_entrymeta', $entry_metadata );
1180 }
1181 }
1182 }
1183
1184 return $field;
1185 }
1186
1187
1188
1189 /**
1190 * Adds Timezone for datetime column in entries table if available.
1191 *
1192 * @param [string] $value Value.
1193 * @param [string] $entry_meta Entry Meta.
1194 * @param [array] $entry Entry.
1195 * @param [string] $type Type.
1196 * @param [string] $meta_key Meta Key.
1197 *
1198 * @return string
1199 */
1200 public function entry_html( $value, $entry_meta, $entry, $type, $meta_key = '' ) {
1201 $field_metas = isset( $entry->meta ) && is_array( $entry->meta ) ? $entry->meta : array();
1202
1203 $timezone_key = isset( $meta_key['meta_key'] )
1204 ? sanitize_key( $meta_key['meta_key'] ) . '_timezone'
1205 : sanitize_key( (string) $meta_key ) . '_timezone';
1206
1207 if ( isset( $meta_key['meta_key'], $field_metas[ $timezone_key ] ) && ! empty( $meta_key['meta_key'] ) ) {
1208 $timezone_value = sanitize_text_field( wp_unslash( (string) $field_metas[ $timezone_key ] ) );
1209 $all_timezones = $this->get_timezones();
1210
1211 if ( is_array( $all_timezones ) && isset( $all_timezones[ $timezone_value ] ) ) {
1212 $value .= '<p>' . esc_html( $all_timezones[ $timezone_value ] ) . '</p>';
1213 }
1214 }
1215
1216 return $value;
1217 }
1218
1219
1220
1221 /**
1222 * Set default date time in frontend if timezone set.
1223 *
1224 * @param [array] $properties Properties array.
1225 * @param [array] $field Field properties.
1226 * @return array
1227 */
1228 public function set_default_timezone( $properties, $field ) {
1229 // Does not set default date time if default date feature is not enabled.`
1230 if ( ! isset( $field['date_default'] ) || 1 !== absint( $field['date_default'] ) ) {
1231 return $properties;
1232 }
1233
1234 if ( ! empty( $field['date_timezone'] ) && 'Default' !== $field['date_timezone'] ) {
1235 $timezone = $field['date_timezone'];
1236
1237 if ( in_array( $timezone, timezone_identifiers_list(), true ) ) {
1238
1239 $dtz = new DateTimeZone( $timezone );
1240 $datetime = new DateTime( 'now', $dtz );
1241
1242 switch ( $field['datetime_format'] ) {
1243 case 'date':
1244 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $field['date_format'] ) );
1245 break;
1246
1247 case 'date-time':
1248 if ( ! empty( $field['time_format'] ) ) {
1249 $date_format = esc_attr( $field['date_format'] ) . ' ' . esc_attr( $field['time_format'] );
1250 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $date_format ) );
1251 } else {
1252 $date_format = esc_attr( $field['date_format'] ) . ' g:i A';
1253 $properties['inputs']['primary']['attr']['value'] = esc_attr( $datetime->format( $date_format ) );
1254 }
1255 break;
1256 }
1257 }
1258 }
1259
1260 return $properties;
1261 }
1262 /**
1263 * Form's field list for google calendar.
1264 *
1265 * @param int $form_id form id.
1266 */
1267 public static function get_form_fields( $form_id ) {
1268 $text_field_name_option_list = array(
1269 '' => __( '---Select Field---', 'everest-forms' ),
1270 );
1271 if ( ! empty( $form_id ) && 'none' !== $form_id ) {
1272 $form = json_decode( get_post_field( 'post_content', $form_id ) );
1273 $text_field = apply_filters( 'evf_support_field_type_for_google_event', array( 'first-name', 'last-name', 'text', 'textarea' ) );
1274 $form_arr = isset( $form->form_fields ) ? (array) $form->form_fields : array();
1275 foreach ( $form_arr as $key => $value ) {
1276 if ( in_array( $value->type, $text_field, true ) ) {
1277 $text_field_name_option_list[ $key ] = $value->label;
1278 }
1279 }
1280 }
1281 return $text_field_name_option_list;
1282 }
1283 }
1284