PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.1.8
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.1.8
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 3.6.66 All 195 releases
fluentform / boot / globals.php

globals.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.1.8, at boot/globals.php

519 lines 13.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 use FluentForm\Framework\Helpers\ArrayHelper;
4 use FluentForm\App\Modules\Component\BaseComponent;
5 use FluentForm\App\Services\FormBuilder\EditorShortCode;
6
7 /**
8 ***** DO NOT CALL ANY FUNCTIONS DIRECTLY FROM THIS FILE ******
9 *
10 * This file will be loaded even before the framework is loaded
11 * so the $app is not available here, only declare functions here.
12 */
13
14 //if ('dev' == $app->config->get('app.env')) {
15 // $globalsDevFile = __DIR__ . '/globals_dev.php';
16 //
17 // is_readable($globalsDevFile) && include $globalsDevFile;
18 //}
19
20 if (!function_exists('dd')) {
21 // function dd()
22 // {
23 // foreach (func_get_args() as $arg) {
24 // echo '<pre>';
25 // print_r($arg); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $value is only used for debugging in development.
26 // echo '</pre>';
27 // }
28 // exit();
29 // }
30 }
31
32 /**
33 * Get fluentform instance or other core modules
34 *
35 * @param string $key
36 *
37 * @return mixed
38 */
39 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Global helper function, part of plugin API
40 function wpFluentForm($key = null)
41 {
42 return \FluentForm\App\App::make($key);
43 }
44
45 /**
46 * Generate URL for static assets
47 *
48 * @param string $path
49 *
50 * @return string
51 */
52 function fluentFormMix($path = '')
53 {
54 return wpFluentForm('url.assets') . ltrim($path, '/');
55 }
56
57 if (! function_exists('wpFluent')) {
58 /**
59 * @return \FluentForm\Framework\Database\Query\Builder|\FluentForm\Framework\Database\Query\WPDBConnection
60 */
61 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Global helper function, part of plugin API
62 function wpFluent()
63 {
64 return wpFluentForm('db');
65 }
66 }
67
68
69 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Global helper function, part of plugin API
70 function wpFluentFormAddComponent(BaseComponent $component)
71 {
72 return $component->_init();
73 }
74
75 /**
76 * Sanitize form inputs recursively.
77 *
78 * @param $input
79 *
80 * @return mixed $input
81 */
82 function fluentFormSanitizer($input, $attribute = null, $fields = [])
83 {
84 if (is_string($input)) {
85 $element = ArrayHelper::get($fields, $attribute . '.element');
86
87 if (in_array($element, ['post_content', 'rich_text_input'])) {
88 return wp_kses_post($input);
89 } elseif ('textarea' === $element) {
90 $input = sanitize_textarea_field($input);
91 } elseif ('input_email' === $element) {
92 $input = strtolower(sanitize_text_field($input));
93 } elseif ('input_url' === $element) {
94 $input = sanitize_url($input);
95 } elseif ('input_password' === $element) {
96 $input = trim($input);
97 } else {
98 $input = sanitize_text_field($input);
99 }
100 } elseif (is_array($input)) {
101 $sanitizedInput = [];
102
103 foreach ($input as $key => &$value) {
104 $key = fluentFormSanitizer($key);
105 $attribute = $attribute ? $attribute . '[' . $key . ']' : $key;
106
107 $value = fluentFormSanitizer($value, $attribute, $fields);
108 $attribute = null;
109 $sanitizedInput[$key] = $value;
110 }
111
112 $input = $sanitizedInput;
113 }
114
115 return $input;
116 }
117
118 function fluentFormEditorShortCodes()
119 {
120 $generalShortCodes = [EditorShortCode::getGeneralShortCodes()];
121 /* This filter is deprecated, will be removed soon. */
122 $generalShortCodes = apply_filters('fluentform_editor_shortcodes', $generalShortCodes);
123
124 return apply_filters('fluentform/editor_shortcodes', $generalShortCodes);
125 }
126
127 function fluentFormGetAllEditorShortCodes($form)
128 {
129 $editorShortCodes = EditorShortCode::getShortCodes($form);
130 /* This filter is deprecated and will be removed soon */
131 $editorShortCodes = apply_filters(
132 'fluentform_all_editor_shortcodes',
133 $editorShortCodes,
134 $form
135 );
136 return apply_filters(
137 'fluentform/all_editor_shortcodes',
138 $editorShortCodes,
139 $form
140 );
141 }
142
143 /**
144 * Recursively implode a multi-dimentional array
145 *
146 * @param string $glue
147 * @param array $array
148 *
149 * @return string
150 */
151 function fluentImplodeRecursive($glue, array $array)
152 {
153 $fn = function ($glue, array $array) use (&$fn) {
154 $result = '';
155 foreach ($array as $item) {
156 if (is_array($item)) {
157 $result .= $fn($glue, $item);
158 } else {
159 $result .= $glue . $item;
160 }
161 }
162
163 return $result;
164 };
165
166 return ltrim($fn($glue, $array), $glue);
167 }
168
169 function fluentform_get_active_theme_slug()
170 {
171 $ins = get_option('_ff_ins_by');
172
173 if ($ins) {
174 return sanitize_text_field($ins);
175 }
176
177 if (defined('TEMPLATELY_FILE')) {
178 return 'templately';
179 }
180
181 return get_option('template');
182 }
183
184 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Global helper function, part of plugin API
185 function getFluentFormCountryList()
186 {
187 static $countries = null;
188
189 if (is_null($countries)) {
190 $countries = fluentformLoadFile('/Services/FormBuilder/CountryNames.php');
191 }
192
193 return $countries;
194 }
195
196 function fluentFormWasSubmitted($action = 'fluentform_submit')
197 {
198 return wpFluentForm('request')->get('action') == $action;
199 }
200
201 if (!function_exists('isWpAsyncRequest')) {
202 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Global helper function, part of plugin API
203 function isWpAsyncRequest($action)
204 {
205 return false !== strpos(wpFluentForm('request')->get('action'), $action);
206 }
207 }
208
209 function fluentFormIsHandlingSubmission()
210 {
211 $status = fluentFormWasSubmitted() || isWpAsyncRequest('fluentform_async_request');
212
213 $status = apply_filters_deprecated(
214 'fluentform_is_handling_submission',
215 [
216 $status
217 ],
218 FLUENTFORM_FRAMEWORK_UPGRADE,
219 'fluentform/is_handling_submission',
220 'Use fluentform/is_handling_submission instead of fluentform_is_handling_submission'
221 );
222 return apply_filters('fluentform/is_handling_submission', $status);
223 }
224
225 function fluentform_mb_strpos($haystack, $needle)
226 {
227 if (function_exists('mb_strpos')) {
228 return mb_strpos($haystack, $needle);
229 }
230
231 return strpos($haystack, $needle);
232 }
233
234 function fluentFormHandleScheduledTasks()
235 {
236 $failedActions = wpFluent()->table('ff_scheduled_actions')->where('status', 'failed')->where('retry_count', '<', 4)->get();
237
238 if ($failedActions) {
239 $scheduler = wpFluentForm('fluentFormAsyncRequest');
240
241 foreach ($failedActions as $action) {
242 $scheduler->process($action);
243 }
244 }
245
246 $rand = wp_rand(1, 10);
247 if ($rand >= 5) {
248 do_action('fluentform/maybe_scheduled_jobs');
249 }
250 }
251
252 function fluentFormHandleScheduledEmailReport()
253 {
254 \FluentForm\App\Services\Scheduler\Scheduler::processEmailReport();
255 }
256
257 function fluentform_upgrade_url()
258 {
259 return 'https://fluentforms.com/pricing/?utm_source=plugin&utm_medium=wp_install&utm_campaign=ff_upgrade&theme_style=' . fluentform_get_active_theme_slug();
260 }
261
262 function fluentform_integrations_url()
263 {
264 return 'https://fluentforms.com/integration/?utm_source=plugin&utm_medium=wp_install&utm_campaign=ff_upgrade&theme_style=' . fluentform_get_active_theme_slug();
265 }
266
267 function fluentFormApi($module = 'forms')
268 {
269 if ('forms' == $module) {
270 return new \FluentForm\App\Api\Form();
271 } elseif ('submissions' == $module) {
272 return new \FluentForm\App\Api\Submission();
273 }
274
275 throw new \Exception(esc_html('No Module found with name ' . $module));
276 }
277
278 function fluentFormGetRandomPhoto()
279 {
280 $photos = [
281 'demo_1.jpg',
282 'demo_2.jpg',
283 'demo_3.jpg',
284 'demo_4.jpg',
285 'demo_5.jpg',
286 ];
287
288 $selected = array_rand($photos, 1);
289
290 $photoName = $photos[$selected];
291
292 return fluentformMix('img/conversational/' . $photoName);
293 }
294
295 function fluentFormRender($atts)
296 {
297 $shortcodeDefaults = [
298 'id' => null,
299 'title' => null,
300 'css_classes' => '',
301 'permission' => '',
302 'type' => 'classic',
303 'permission_message' => __('Sorry, You do not have permission to view this form', 'fluentform'),
304 ];
305 $atts = shortcode_atts($shortcodeDefaults, $atts);
306
307 return (new \FluentForm\App\Modules\Component\Component(wpFluentForm()))->renderForm($atts);
308 }
309
310 /**
311 * Print internal content (not user input) without escaping.
312 */
313 function fluentFormPrintUnescapedInternalString($string)
314 {
315 echo $string; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- deprecated function, should remove it later.
316 }
317
318 function fluentform_options_sanitize($options)
319 {
320 $maps = [
321 'label' => 'wp_kses_post',
322 'value' => 'sanitize_text_field',
323 'image' => 'sanitize_url',
324 'calc_value' => 'sanitize_text_field',
325 ];
326
327 $mapKeys = array_keys($maps);
328
329 foreach ($options as $optionIndex => $option) {
330 $attributes = array_filter(ArrayHelper::only($option, $mapKeys));
331 foreach ($attributes as $key => $value) {
332 $options[$optionIndex][$key] = call_user_func($maps[$key], $value);
333 }
334 }
335
336 return $options;
337 }
338
339 function fluentform_iframe_srcdoc_sanitize($value)
340 {
341 $tags = wp_kses_allowed_html('post');
342 $tags['style'] = [
343 'types' => [],
344 ];
345 // Check if decoding is necessary
346 if (strpos($value, '&') !== false) {
347 // Decode HTML entities
348 $value = html_entity_decode($value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
349 $value = stripslashes($value);
350 }
351 return wp_kses($value, $tags);
352 }
353
354
355 function fluentform_sanitize_html($html)
356 {
357 if (!$html) {
358 return $html;
359 }
360
361 // Remove event handlers (e.g., onerror, onclick, onmouseover)
362 $html = preg_replace('/\s+on[a-z]+\s*=\s*([\'"])[^\'"]*\1/i', '', $html);
363
364 // Remove JavaScript protocol (e.g., `href="javascript:alert(1)"`)
365 $html = preg_replace('/\bjavascript\s*:/i', '', $html);
366
367 $tags = wp_kses_allowed_html('post');
368 $tags['style'] = [
369 'types' => [],
370 ];
371 // iframe
372 $tags['iframe'] = [
373 'width' => [],
374 'height' => [],
375 'src' => [],
376 'srcdoc' => [
377 'value_callback' => 'fluentform_iframe_srcdoc_sanitize'
378 ],
379 'title' => [],
380 'frameborder' => [],
381 'allow' => [],
382 'class' => [],
383 'id' => [],
384 'allowfullscreen' => [],
385 'style' => [],
386 ];
387
388 //button
389 $tags['button']['onclick'] = [];
390
391 //svg
392 if (empty($tags['svg'])) {
393 $svg_args = [
394 'svg' => [
395 'class' => true,
396 'aria-hidden' => true,
397 'aria-labelledby' => true,
398 'role' => true,
399 'xmlns' => true,
400 'width' => true,
401 'height' => true,
402 'viewbox' => true,
403 'fill' => true,
404 'stroke' => true,
405 'stroke-width' => true,
406 'stroke-linecap' => true,
407 'stroke-linejoin' => true
408 ],
409 'g' => ['fill' => true],
410 'title' => ['title' => true],
411 'path' => [
412 'd' => true,
413 'fill' => true,
414 'transform' => true,
415 ],
416 'polyline' => [
417 'points' => true
418 ]
419 ];
420 $tags = array_merge($tags, $svg_args);
421 }
422
423 $tags = apply_filters_deprecated(
424 'fluentform_allowed_html_tags',
425 [
426 $tags
427 ],
428 FLUENTFORM_FRAMEWORK_UPGRADE,
429 'fluentform/allowed_html_tags',
430 'Use fluentform/allowed_html_tags instead of fluentform_allowed_html_tags'
431 );
432
433 $tags = apply_filters('fluentform/allowed_html_tags', $tags);
434
435 return wp_kses($html, $tags);
436 }
437
438 function fluentform_kses_js($content)
439 {
440 return $content ? preg_replace('/<script.*?>[\s\S]*<\/script>/is', '', $content) : '';
441 }
442
443 /**
444 * Sanitize inputs recursively.
445 *
446 * @param array $input
447 * @param array $sanitizeMap
448 *
449 * @return array $input
450 */
451 function fluentform_backend_sanitizer($inputs, $sanitizeMap = [])
452 {
453 $originalValues = $inputs;
454 foreach ($inputs as $key => &$value) {
455 if (is_array($value)) {
456 $value = fluentform_backend_sanitizer($value, $sanitizeMap);
457 } else {
458 $method = ArrayHelper::get($sanitizeMap, $key);
459 if (is_callable($method)) {
460 $value = call_user_func($method, $value);
461 }
462 }
463 }
464
465 return apply_filters('fluentform/backend_sanitized_values', $inputs, $originalValues);
466 }
467
468 /**
469 * Sanitizes CSS.
470 *
471 * @return mixed $css
472 */
473 function fluentformSanitizeCSS($css)
474 {
475 if ($css === null || $css === '') {
476 return '';
477 }
478
479 // Convert to string if not already
480 if (!is_string($css)) {
481 $css = (string) $css;
482 }
483
484 return preg_match('#</?\w+#', $css) ? '' : $css;
485 }
486
487 function fluentformCanUnfilteredHTML()
488 {
489 return current_user_can('unfiltered_html') || apply_filters('fluentform/disable_fields_sanitize', false);
490 }
491
492 function fluentformLoadFile($path)
493 {
494 return require wpFluentForm('path.app') . '/' . ltrim($path, '/');
495 }
496
497 if (!function_exists('fluentValidator')) {
498 function fluentValidator($data = [], $rules = [], $messages = [])
499 {
500 return wpFluentForm('validator')->make($data, $rules, $messages);
501 }
502 }
503
504 function fluentformGetPages()
505 {
506 $pages = get_pages();
507 $formattedPages = [];
508
509 foreach ($pages as $page) {
510 $formattedPages[] = [
511 'ID' => $page->ID,
512 'post_title' => $page->post_title,
513 'guid' => $page->guid,
514 ];
515 }
516
517 return $formattedPages;
518 }
519