PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.14
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.14
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 / Hooks / filters.php

filters.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.2.14, at app/Hooks/filters.php

441 lines 15.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 defined('ABSPATH') or die;
4
5 /**
6 * All registered filter's handlers should be in app\Hooks\Handlers,
7 * addFilter is similar to add_filter and addCustomFlter is just a
8 * wrapper over add_filter which will add a prefix to the hook name
9 * using the plugin slug to make it unique in all wordpress plugins,
10 * ex: $app->addCustomFilter('foo', ['FooHandler', 'handleFoo']) is
11 * equivalent to add_filter('slug-foo', ['FooHandler', 'handleFoo']).
12 */
13
14 /**
15 * @var $app FluentForm\Framework\Foundation\Application
16 */
17
18 // Render-time bridge for date configs saved as data-only tokens by 6.2.7-6.2.12; a listener (not inline in DateTime) so a migration can drop it in one line.
19 add_filter('fluentform/date_time_custom_config', function ($config) {
20 $decoded = \FluentForm\App\Services\FormBuilder\LegacyDateConfigDecoder::decode((string) $config);
21
22 return null !== $decoded ? $decoded : $config;
23 }, 5, 1);
24
25 add_filter('fluentform/addons_extra_menu', function ($menus) {
26 $menus['fluentform_pdf'] = __('Fluent Forms PDF', 'fluentform');
27
28 return $menus;
29 }, 99, 1);
30
31 //Add file upload location in global settings
32 add_filter('fluentform/get_global_settings_values', function ($values, $key) {
33 if (is_array($key)) {
34 if (in_array('_fluentform_global_form_settings', $key)) {
35 $values['file_upload_optoins'] = FluentForm\App\Helpers\Helper::fileUploadLocations();
36 }
37
38 if (in_array('_fluentform_turnstile_details', $key)) {
39 $values = FluentForm\App\Modules\Turnstile\Turnstile::ensureSettings($values);
40 }
41
42 if (in_array('_fluentform_global_default_message_setting_fields', $key)) {
43 $values['_fluentform_global_default_message_setting_fields'] = \FluentForm\App\Helpers\Helper::globalDefaultMessageSettingFields();
44 }
45
46 if (in_array('_fluentform_global_form_settings', $key) &&
47 !\FluentForm\Framework\Helpers\ArrayHelper::isTrue($values, '_fluentform_global_form_settings.default_messages')
48 ) {
49 $values['_fluentform_global_form_settings']['default_messages'] = \FluentForm\App\Helpers\Helper::getAllGlobalDefaultMessages();
50 }
51
52 // Ensure _fluentform_default_style_template has default structure if not set
53 if (in_array('_fluentform_default_style_template', $key)) {
54 if (empty($values['_fluentform_default_style_template']) || $values['_fluentform_default_style_template'] === false) {
55 $values['_fluentform_default_style_template'] = [
56 'enabled' => 'no',
57 'custom_css' => '',
58 'styler_enabled' => 'no',
59 'styler_theme' => '',
60 ];
61 }
62 }
63 }
64
65 return $values;
66 }, 10, 2);
67
68 //Enables recaptcha validation when autoload recaptcha enabled for all forms
69
70 add_action('fluentform/before_form_validation',function (){
71 $autoIncludeRecaptcha = [
72 [
73 'type' => 'hcaptcha',
74 'is_disabled' => !get_option('_fluentform_hCaptcha_keys_status', false),
75 ],
76 [
77 'type' => 'recaptcha',
78 'is_disabled' => !get_option('_fluentform_reCaptcha_keys_status', false),
79 ],
80 [
81 'type' => 'turnstile',
82 'is_disabled' => !get_option('_fluentform_turnstile_keys_status', false),
83 ],
84 ];
85 foreach ($autoIncludeRecaptcha as $input) {
86 if ($input['is_disabled']) {
87 continue;
88 }
89
90 add_filter('fluentform/has_' . $input['type'], function () use ($input) {
91 $option = get_option('_fluentform_global_form_settings');
92 $autoload = \FluentForm\Framework\Helpers\ArrayHelper::get($option, 'misc.autoload_captcha');
93 $type = \FluentForm\Framework\Helpers\ArrayHelper::get($option, 'misc.captcha_type');
94
95 if ($autoload && $type == $input['type']) {
96 return true;
97 }
98
99 return false;
100 });
101 }
102 });
103
104 /*
105 * Push captcha in all forms when enabled from global settings
106 */
107 $app->addFilter('fluentform/rendering_form', function ($form) {
108 $option = get_option('_fluentform_global_form_settings');
109 $enabled = \FluentForm\Framework\Helpers\ArrayHelper::get($option, 'misc.autoload_captcha');
110 if (!$enabled) {
111 return $form;
112 }
113 $type = \FluentForm\Framework\Helpers\ArrayHelper::get($option, 'misc.captcha_type');
114 $reCaptcha = [
115 'element' => 'recaptcha',
116 'attributes' => [
117 'name' => 'recaptcha',
118 ],
119 ];
120 $hCaptcha = [
121 'element' => 'hcaptcha',
122 'attributes' => [
123 'name' => 'hcaptcha',
124 ],
125 ];
126 $turnstile = [
127 'element' => 'turnstile',
128 'attributes' => [
129 'name' => 'turnstile',
130 ],
131 ];
132
133 if ('recaptcha' == $type) {
134 $captcha = $reCaptcha;
135 } elseif ('hcaptcha' == $type) {
136 $captcha = $hCaptcha;
137 } elseif ('turnstile' == $type) {
138 $captcha = $turnstile;
139 }
140 if (!isset($captcha)) {
141 return $form;
142 }
143 // place captcha below custom submit button
144 $formFields = $form->fields;
145 $hasCustomSubmit = false;
146 foreach ($formFields['fields'] as $index => $field) {
147 if (in_array($field['element'], ['recaptcha', 'hcaptcha', 'turnstile'])) {
148 \FluentForm\Framework\Helpers\ArrayHelper::forget($formFields['fields'], $index);
149 }
150 if ('custom_submit_button' == $field['element']) {
151 $hasCustomSubmit = true;
152 array_splice($formFields['fields'], $index, 0, [$captcha]);
153 break;
154 }
155 }
156 if (!$hasCustomSubmit) {
157 $formFields['fields'][] = $captcha;
158 }
159
160 $form->fields = $formFields;
161
162 return $form;
163 }, 10, 1);
164
165 $fluentformElements = [
166 'select',
167 'input_checkbox',
168 'input_radio',
169 'address',
170 'select_country',
171 'gdpr_agreement',
172 'terms_and_condition',
173 'dynamic_field',
174 'multi_payment_component'
175 ];
176
177 foreach ($fluentformElements as $fluentformElement) {
178 $fluentformEvent = 'fluentform/response_render_' . $fluentformElement;
179 $app->addFilter($fluentformEvent, function ($response, $field, $form_id, $isHtml = false) {
180 $element = $field['element'];
181 $isHtml = apply_filters("fluentform/format_{$element}_response_as_html", $isHtml, $response, $field);
182
183 if ('dynamic_field' == $element) {
184 $dynamicFetchValue = 'yes' == \FluentForm\Framework\Helpers\ArrayHelper::get($field, 'raw.settings.dynamic_fetch');
185 if ($dynamicFetchValue) {
186 $field = apply_filters('fluentform/dynamic_field_re_fetch_result_and_resolve_value', $field);
187 }
188 $attrType = \FluentForm\Framework\Helpers\ArrayHelper::get($field, 'raw.attributes.type');
189 if ('radio' == $attrType) {
190 $element = 'input_radio';
191 } elseif ('checkbox' == $attrType) {
192 $element = 'input_checkbox';
193 } elseif ('select' == $attrType) {
194 $element = 'select';
195 }
196 }
197
198 if ('address' == $element && !empty($response->country)) {
199 $countryList = getFluentFormCountryList();
200 if (isset($countryList[$response->country])) {
201 $response->country = $countryList[$response->country];
202 }
203 }
204
205 if ('address' == $element) {
206 unset($response->latitude, $response->longitude);
207 }
208
209 if ('select_country' == $element) {
210 $countryList = getFluentFormCountryList();
211 if (isset($countryList[$response])) {
212 $response = $countryList[$response];
213 }
214 }
215
216 if (in_array($field['element'], ['gdpr_agreement', 'terms_and_condition'])) {
217 if (!empty($response) && 'on' == $response) {
218 $response = __('Accepted', 'fluentform');
219 } else {
220 $response = __('Declined', 'fluentform');
221 }
222 }
223
224 if ($response && ($isHtml || defined('FLUENTFORM_RENDERING_ENTRIES')) && in_array($element, ['select', 'input_radio']) && !is_array($response)) {
225 if (!isset($field['options'])) {
226 $field['options'] = \FluentForm\App\Helpers\Helper::advancedOptionsValueLabelMap(
227 \FluentForm\Framework\Helpers\ArrayHelper::get($field, 'raw.settings.advanced_options', [])
228 );
229 }
230 if (isset($field['options'][$response])) {
231 return $field['options'][$response];
232 }
233 }
234
235 if (in_array($element, ['select', 'input_checkbox', 'multi_payment_component']) && is_array($response)) {
236 return \FluentForm\App\Modules\Form\FormDataParser::formatCheckBoxValues($response, $field, $isHtml);
237 }
238
239 return \FluentForm\App\Modules\Form\FormDataParser::formatValue($response);
240 }, 10, 4);
241 }
242
243 /*
244 * Validation rule wise resolve global validation message.
245 *
246 */
247 $fluentformRules = [
248 "required",
249 "email",
250 "numeric",
251 "min",
252 "max",
253 "min_selection",
254 "max_selection",
255 "digits",
256 "url",
257 "allowed_image_types",
258 "allowed_file_types",
259 "max_file_size",
260 "max_file_count",
261 "valid_phone_number",
262 ];
263 foreach ($fluentformRules as $fluentformRuleName) {
264 $app->addFilter('fluentform/get_global_message_' . $fluentformRuleName,
265 function ($message) use ($fluentformRuleName) {
266 return \FluentForm\App\Helpers\Helper::getGlobalDefaultMessage($fluentformRuleName);
267 }
268 );
269 }
270
271
272 $app->addFilter('fluentform/response_render_textarea', function ($value, $field, $formId, $isHtml) {
273 if (is_array($value) || is_object($value)) {
274 $value = fluentImplodeRecursive(', ', array_filter(array_values((array) $value)));
275 }
276
277 $value = $value ? nl2br($value) : $value;
278
279 if (!$isHtml || !$value) {
280 return $value;
281 }
282
283 return nl2br($value);
284 }, 10, 4);
285
286 $app->addFilter('fluentform/response_render_input_file', function ($response, $field, $form_id, $isHtml = false) {
287 return \FluentForm\App\Modules\Form\FormDataParser::formatFileValues($response, $isHtml, $form_id);
288 }, 10, 4);
289
290 $app->addFilter('fluentform/response_render_input_image', function ($response, $field, $form_id, $isHtml = false) {
291 return \FluentForm\App\Modules\Form\FormDataParser::formatImageValues($response, $isHtml, $form_id);
292 }, 10, 4);
293
294 $app->addFilter('fluentform/response_render_input_repeat', function ($response, $field, $form_id) {
295 return \FluentForm\App\Modules\Form\FormDataParser::formatRepeatFieldValue($response, $field, $form_id);
296 }, 10, 3);
297
298 $app->addFilter('fluentform/response_render_tabular_grid', function ($response, $field, $form_id, $isHtml = false) {
299 return \FluentForm\App\Modules\Form\FormDataParser::formatTabularGridFieldValue($response, $field, $form_id, $isHtml);
300 }, 10, 4);
301
302 $app->addFilter('fluentform/response_render_input_name', function ($response) {
303 return \FluentForm\App\Modules\Form\FormDataParser::formatName($response);
304 }, 10, 1);
305
306 $app->addFilter('fluentform/response_render_input_password', function ($value, $field, $formId) {
307 if (\FluentForm\App\Helpers\Helper::shouldHidePassword($formId)) {
308 $value = str_repeat('*', 6) . ' ' . __('(truncated)', 'fluentform');
309 }
310
311 return $value;
312 }, 10, 3);
313
314 $app->addFilter('fluentform/filter_insert_data', function ($data) {
315 $settings = get_option('_fluentform_global_form_settings', false);
316 if (is_array($settings) && isset($settings['misc'])) {
317 if (isset($settings['misc']['isIpLogingDisabled'])) {
318 if ($settings['misc']['isIpLogingDisabled']) {
319 unset($data['ip']);
320 }
321 }
322 }
323
324 return $data;
325 });
326
327 $app->addFilter('fluentform/disabled_analytics', function ($status) {
328 $settings = get_option('_fluentform_global_form_settings');
329 if (isset($settings['misc']['isAnalyticsDisabled']) && !$settings['misc']['isAnalyticsDisabled']) {
330 return false;
331 }
332
333 return $status;
334 });
335
336 // permission based filters
337 $app->addFilter('fluentform/permission_callback', function ($status, $permission) {
338 return \FluentForm\App\Modules\Acl\Acl::getCurrentUserCapability();
339 }, 10, 2);
340
341 // Get current user allowed form ids, if current user has specific form permission
342 $app->addFilter('fluentform/current_user_allowed_forms', function ($form){
343 return \FluentForm\App\Services\Manager\FormManagerService::getUserAllowedFormsScope();
344 });
345
346 $app->addFilter('fluentform/validate_input_item_input_email', ['\FluentForm\App\Helpers\Helper', 'isUniqueValidation'], 10, 5);
347
348 $app->addFilter('fluentform/validate_input_item_input_text', ['\FluentForm\App\Helpers\Helper', 'isUniqueValidation'], 10, 5);
349
350 $app->addFilter('fluentform/will_return_html', function ($result, $integration, $key) {
351 $dictionary = [
352 'notifications' => ['message'],
353 'pdfFeed' => apply_filters('fluentform/pdf_html_format', [])
354 ];
355
356 if (!isset($dictionary[$integration])) {
357 return $result;
358 }
359
360 if (in_array($key, $dictionary[$integration])) {
361 return true;
362 }
363
364 return $result;
365 }, 10, 3);
366
367 $app->addFilter('fluentform/response_render_input_number', function ($response, $field, $form_id, $isHtml = false) {
368 if (!$response || !$isHtml) {
369 return $response;
370 }
371 $fieldSettings = \FluentForm\Framework\Helpers\ArrayHelper::get($field, 'raw.settings');
372 $formatter = \FluentForm\Framework\Helpers\ArrayHelper::get($fieldSettings, 'numeric_formatter');
373 if (!$formatter) {
374 return $response;
375 }
376
377 return \FluentForm\App\Helpers\Helper::getNumericFormatted($response, $formatter);
378 }, 10, 4);
379
380 $app->addFilter(
381 'fluentform/create_default_settings',
382 function($defaultSettings) {
383 if (!isset($defaultSettings['restrictions']['restrictForm'])) {
384 $defaultSettings['restrictions']['restrictForm'] = [
385 'enabled' => false,
386 'fields' => [
387 'ip' => [
388 'status' => false,
389 'values' => '',
390 'message' => __('Sorry! You can\'t submit a form from your IP address.', 'fluentform'),
391 'validation_type' => 'fail_on_condition_met'
392 ],
393 'country' => [
394 'status' => false,
395 'values' => [],
396 'message' => __('Sorry! You can\'t submit a form the country you are residing.', 'fluentform'),
397 'validation_type' => 'fail_on_condition_met',
398 ],
399 'keywords' => [
400 'status' => false,
401 'values' => '',
402 'message' => __('Sorry! Your submission contains some restricted keywords.', 'fluentform'),
403 ],
404 ]
405 ];
406 }
407
408 if (!isset($defaultSettings['conv_form_per_step_save'])) {
409 $defaultSettings['conv_form_per_step_save'] = false;
410 }
411
412 if (!isset($defaultSettings['conv_form_resume_from_last_step'])) {
413 $defaultSettings['conv_form_resume_from_last_step'] = false;
414 }
415
416 return $defaultSettings;
417 }
418 );
419
420 // render badge toggle in form editor in case of recaptcha v3
421 $app->addFilter('fluentform/editor_element_settings_placement', function($placements, $form) {
422 $recaptchaDetails = get_option('_fluentform_reCaptcha_details');
423 if (!$recaptchaDetails) {
424 return $placements;
425 }
426
427 $isRecaptchaV3 = \FluentForm\Framework\Helpers\ArrayHelper::get($recaptchaDetails, 'api_version') === 'v3_invisible';
428 if (!$isRecaptchaV3) {
429 return $placements;
430 }
431
432 $placements['recaptcha']['general'][] = 'render_recaptcha_v3_badge';
433 return $placements;
434 }, 10, 2);
435
436
437 /*
438 * Remove this after WP Fusion Update their plugin
439 */
440 add_filter('fluentform/is_integration_enabled_wpfusion', '__return_true');
441