PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.6
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.6
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.6, at app/Services/FormBuilder/Components/DateTime.php

216 lines 8.5 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 $customConfigObject = '' !== $customConfigObject ? $customConfigObject : '{}';
146
147 // The stored field value is always sanitised to a data-only JSON object
148 // (functions/expressions are stripped — they are the XSS vector for
149 // lower-privilege editors). Developers who need flatpickr callbacks
150 // supply them here from trusted server-side code, never via the setting.
151 return apply_filters('fluentform/date_time_custom_config', $customConfigObject, $settings, $form);
152 }
153
154 private function loadToFooter($config, $customConfigObject, $form, $id)
155 {
156 add_action('wp_footer', function () use ($config, $customConfigObject, $id, $form) {
157 ?>
158 <script type="text/javascript">
159 jQuery(document).ready(function($) {
160 function initPicker() {
161 if (typeof flatpickr == 'undefined') {
162 return;
163 }
164 flatpickr.localize(window.fluentFormVars.date_i18n);
165 var config = <?php echo fluentform_kses_js($config); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?> ;
166 try {
167 var customConfig = <?php echo fluentform_kses_js($customConfigObject); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?>;
168 } catch (e) {
169 var customConfig = {};
170 }
171
172 var config = $.extend({}, config, customConfig);
173 if (!config.locale) {
174 config.locale = 'default';
175 }
176 if (jQuery('#<?php echo esc_attr($id); ?>').length) {
177 flatpickr('#<?php echo esc_attr($id); ?>', config);
178 }
179 }
180 initPicker();
181 $(document).on(
182 'reInitExtras',
183 '.<?php echo esc_attr($form->instance_css_class); ?>',
184 function() {
185 initPicker();
186 }
187 );
188 });
189 </script>
190 <?php
191 }, 99999);
192 }
193
194 private function hasTime($string)
195 {
196 $timeStrings = ['H', 'h', 'G', 'i', 'S', 's', 'K'];
197 foreach ($timeStrings as $timeString) {
198 if (false != strpos($string, $timeString)) {
199 return true;
200 }
201 }
202 return false;
203 }
204
205 private function hasDate($string)
206 {
207 $dateStrings = ['d', 'D', 'l', 'j', 'J', 'w', 'W', 'F', 'm', 'n', 'M', 'U', 'Y', 'y', 'Z'];
208 foreach ($dateStrings as $dateString) {
209 if (false != strpos($string, $dateString)) {
210 return 'true';
211 }
212 }
213 return false;
214 }
215 }
216