PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.9
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.9
6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 All 196 releases
fluentform / app / Services / FormBuilder / Components / DateTime.php

DateTime.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.2.9, at app/Services/FormBuilder/Components/DateTime.php

215 lines 8.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Services\FormBuilder\Components;
4
5 defined('ABSPATH') || die;
6
7 use FluentForm\App\Helpers\Helper;
8 use FluentForm\Framework\Helpers\ArrayHelper;
9
10 class DateTime extends BaseComponent
11 {
12 /**
13 * Compile and echo the html element
14 *
15 * @param array $data [element data]
16 * @param \stdClass $form [Form Object]
17 *
18 * @return void
19 */
20 public function compile($data, $form)
21 {
22 $elementName = $data['element'];
23 $data = apply_filters_deprecated(
24 'fluentform_rendering_field_data_' . $elementName,
25 [
26 $data,
27 $form,
28 ],
29 FLUENTFORM_FRAMEWORK_UPGRADE,
30 'fluentform/rendering_field_data_' . $elementName,
31 'Use fluentform/rendering_field_data_' . $elementName . ' instead of fluentform_rendering_field_data_' . $elementName
32 );
33 $data = apply_filters('fluentform/rendering_field_data_' . $elementName, $data, $form);
34
35 wp_enqueue_script('flatpickr');
36 wp_enqueue_style('flatpickr');
37
38 $data['attributes']['class'] = trim(
39 'ff-el-form-control ff-el-datepicker ' . $data['attributes']['class']
40 );
41 $dateFormat = $data['settings']['date_format'];
42
43 $data['attributes']['id'] = $this->makeElementId($data, $form);
44
45 if ($tabIndex = Helper::getNextTabIndex()) {
46 $data['attributes']['tabindex'] = $tabIndex;
47 }
48
49 $atts = $this->buildAttributes($data['attributes']);
50
51 $ariaRequired = 'false';
52 if (ArrayHelper::get($data, 'settings.validation_rules.required.value')) {
53 $ariaRequired = 'true';
54 }
55 $id = $data['attributes']['id'];
56
57 $ariaLabel = esc_html__(' Use arrow keys to navigate dates. Press enter to select a date.', 'fluentform');
58 $label = ArrayHelper::get($data, 'settings.label');
59 $elMarkup = "<input aria-label='" . $label . $ariaLabel . "' aria-haspopup='dialog' data-type-datepicker data-format='" . esc_attr($dateFormat) . "' " . $atts . " aria-invalid='false' aria-required={$ariaRequired}>"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $atts is escaped before being passed in.
60 $config = $this->getDateFormatConfigJSON($data['settings'], $form);
61 $customConfig = $this->getCustomConfig($data['settings'], $form);
62 $this->loadToFooter($config, $customConfig, $form, $id);
63 $html = $this->buildElementMarkup($elMarkup, $data, $form);
64
65 $html = apply_filters_deprecated(
66 'fluentform_rendering_field_html_' . $elementName,
67 [
68 $html,
69 $data,
70 $form,
71 ],
72 FLUENTFORM_FRAMEWORK_UPGRADE,
73 'fluentform/rendering_field_html_' . $elementName,
74 'Use fluentform/rendering_field_html_' . $elementName . ' instead of fluentform_rendering_field_html_' . $elementName
75 );
76
77 $this->printContent('fluentform/rendering_field_html_' . $elementName, $html, $data, $form);
78 }
79
80 public function getAvailableDateFormats()
81 {
82 $dateFormats = apply_filters('fluentform/available_date_formats', [
83 'm/d/Y' => 'm/d/Y - (Ex: 04/28/2018)', // USA
84 'd/m/Y' => 'd/m/Y - (Ex: 28/04/2018)', // Canada, UK
85 'd.m.Y' => 'd.m.Y - (Ex: 28.04.2019)', // Germany
86 'n/j/y' => 'n/j/y - (Ex: 4/28/18)',
87 'm/d/y' => 'm/d/y - (Ex: 04/28/18)',
88 'M/d/Y' => 'M/d/Y - (Ex: Apr/28/2018)',
89 'y/m/d' => 'y/m/d - (Ex: 18/04/28)',
90 'Y-m-d' => 'Y-m-d - (Ex: 2018-04-28)',
91 'd-M-y' => 'd-M-y - (Ex: 28-Apr-18)',
92 'm/d/Y h:i K' => 'm/d/Y h:i K - (Ex: 04/28/2018 08:55 PM)', // USA
93 'm/d/Y H:i' => 'm/d/Y H:i - (Ex: 04/28/2018 20:55)', // USA
94 'd/m/Y h:i K' => 'd/m/Y h:i K - (Ex: 28/04/2018 08:55 PM)', // Canada, UK
95 'd/m/Y H:i' => 'd/m/Y H:i - (Ex: 28/04/2018 20:55)', // Canada, UK
96 'd.m.Y h:i K' => 'd.m.Y h:i K - (Ex: 28.04.2019 08:55 PM)', // Germany
97 'd.m.Y H:i' => 'd.m.Y H:i - (Ex: 28.04.2019 20:55)', // Germany
98 'h:i K' => 'h:i K (Only Time Ex: 08:55 PM)',
99 'H:i' => 'H:i (Only Time Ex: 20:55)',
100 ]);
101
102 $formatted = [];
103 foreach ($dateFormats as $format => $label) {
104 $formatted[] = [
105 'label' => $label,
106 'value' => $format,
107 ];
108 }
109 return $formatted;
110 }
111
112 public function getDateFormatConfigJSON($settings, $form)
113 {
114 $dateFormat = ArrayHelper::get($settings, 'date_format');
115
116 if (! $dateFormat) {
117 $dateFormat = 'm/d/Y';
118 }
119
120 $hasTime = $this->hasTime($dateFormat);
121 $time24 = false;
122
123 if ($hasTime && false !== strpos($dateFormat, 'H')) {
124 $time24 = true;
125 }
126
127 $config = apply_filters('fluentform/frontend_date_format', [
128 'dateFormat' => $dateFormat,
129 'ariaDateFormat' =>'F j, Y',
130 'enableTime' => $hasTime,
131 'noCalendar' => ! $this->hasDate($dateFormat),
132 'disableMobile' => true,
133 'time_24hr' => $time24,
134 ], $settings, $form);
135
136 return json_encode($config, JSON_FORCE_OBJECT);
137 }
138
139 public function getCustomConfig($settings, $form = null)
140 {
141 $customConfigObject = fluentform_sanitize_json_object(
142 (string) ArrayHelper::get($settings, 'date_config')
143 );
144
145 // Emitted JS is rebuilt from validated data tokens (ints only) — the raw setting never reaches the script sink.
146 $customConfigObject = fluentform_date_config_to_js($customConfigObject);
147
148 $customConfigObject = '' !== $customConfigObject ? $customConfigObject : '{}';
149
150 return apply_filters('fluentform/date_time_custom_config', $customConfigObject, $settings, $form);
151 }
152
153 private function loadToFooter($config, $customConfigObject, $form, $id)
154 {
155 add_action('wp_footer', function () use ($config, $customConfigObject, $id, $form) {
156 ?>
157 <script type="text/javascript">
158 jQuery(document).ready(function($) {
159 function initPicker() {
160 if (typeof flatpickr == 'undefined') {
161 return;
162 }
163 flatpickr.localize(window.fluentFormVars.date_i18n);
164 var config = <?php echo fluentform_kses_js($config); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?> ;
165 try {
166 var customConfig = <?php echo fluentform_kses_js($customConfigObject); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?>;
167 } catch (e) {
168 var customConfig = {};
169 }
170
171 var config = $.extend({}, config, customConfig);
172 if (!config.locale) {
173 config.locale = 'default';
174 }
175 if (jQuery('#<?php echo esc_attr($id); ?>').length) {
176 flatpickr('#<?php echo esc_attr($id); ?>', config);
177 }
178 }
179 initPicker();
180 $(document).on(
181 'reInitExtras',
182 '.<?php echo esc_attr($form->instance_css_class); ?>',
183 function() {
184 initPicker();
185 }
186 );
187 });
188 </script>
189 <?php
190 }, 99999);
191 }
192
193 private function hasTime($string)
194 {
195 $timeStrings = ['H', 'h', 'G', 'i', 'S', 's', 'K'];
196 foreach ($timeStrings as $timeString) {
197 if (false != strpos($string, $timeString)) {
198 return true;
199 }
200 }
201 return false;
202 }
203
204 private function hasDate($string)
205 {
206 $dateStrings = ['d', 'D', 'l', 'j', 'J', 'w', 'W', 'F', 'm', 'n', 'M', 'U', 'Y', 'y', 'Z'];
207 foreach ($dateStrings as $dateString) {
208 if (false != strpos($string, $dateString)) {
209 return 'true';
210 }
211 }
212 return false;
213 }
214 }
215