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

212 lines 8.1 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') or 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']);
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)
140 {
141 $customConfigObject = trim(ArrayHelper::get($settings, 'date_config'));
142
143 if (! $customConfigObject || '{' != substr($customConfigObject, 0, 1) || '}' != substr($customConfigObject, -1)) {
144 $customConfigObject = '{}';
145 }
146
147 return $customConfigObject;
148 }
149
150 private function loadToFooter($config, $customConfigObject, $form, $id)
151 {
152 add_action('wp_footer', function () use ($config, $customConfigObject, $id, $form) {
153 ?>
154 <script type="text/javascript">
155 jQuery(document).ready(function($) {
156 function initPicker() {
157 if (typeof flatpickr == 'undefined') {
158 return;
159 }
160 flatpickr.localize(window.fluentFormVars.date_i18n);
161 var config = <?php echo fluentform_kses_js($config); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?> ;
162 try {
163 var customConfig = <?php echo fluentform_kses_js($customConfigObject); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $config is escaped using fluentform_kses_js ?>;
164 } catch (e) {
165 var customConfig = {};
166 }
167
168 var config = $.extend({}, config, customConfig);
169 if (!config.locale) {
170 config.locale = 'default';
171 }
172 if (jQuery('#<?php echo esc_attr($id); ?>').length) {
173 flatpickr('#<?php echo esc_attr($id); ?>', config);
174 }
175 }
176 initPicker();
177 $(document).on(
178 'reInitExtras',
179 '.<?php echo esc_attr($form->instance_css_class); ?>',
180 function() {
181 initPicker();
182 }
183 );
184 });
185 </script>
186 <?php
187 }, 99999);
188 }
189
190 private function hasTime($string)
191 {
192 $timeStrings = ['H', 'h', 'G', 'i', 'S', 's', 'K'];
193 foreach ($timeStrings as $timeString) {
194 if (false != strpos($string, $timeString)) {
195 return true;
196 }
197 }
198 return false;
199 }
200
201 private function hasDate($string)
202 {
203 $dateStrings = ['d', 'D', 'l', 'j', 'J', 'w', 'W', 'F', 'm', 'n', 'M', 'U', 'Y', 'y', 'Z'];
204 foreach ($dateStrings as $dateString) {
205 if (false != strpos($string, $dateString)) {
206 return 'true';
207 }
208 }
209 return false;
210 }
211 }
212