PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.2.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.2.2
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/helpers/FrmAppHelper.php +659 -1996 6.316.2.2 View file →
@@ -3,43 +3,27 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 + public static $db_version = 98; // Version of the database we are moving to.
8 + public static $pro_db_version = 37; //deprecated
9 + public static $font_version = 7;
7 10
8 11 /**
9 - * Version of the database we are moving to.
10 - *
11 - * @var int
12 + * @var bool $added_gmt_offset_filter
12 13 */
13 - public static $db_version = 105;
14 -
15 - /**
16 - * Used by the API add-on.
17 - *
18 - * @var float
19 - */
20 - public static $font_version = 7;
21 -
22 - /**
23 - * @var bool
24 - */
25 14 private static $added_gmt_offset_filter = false;
26 15
27 16 /**
28 17 * @since 2.0
29 - *
30 - * @var string
31 18 */
32 - public static $plug_version = '6.31';
19 + public static $plug_version = '6.2.2';
33 20
34 21 /**
35 - * @var bool
36 - */
37 - private static $included_svg = false;
38 -
39 - /**
40 22 * @since 1.07.02
41 23 *
24 + * @param none
25 + *
42 26 * @return string The version of this plugin
43 27 */
44 28 public static function plugin_version() {
45 29 return self::$plug_version;
@@ -44,33 +28,21 @@
44 28 public static function plugin_version() {
45 29 return self::$plug_version;
46 30 }
47 31
48 - /**
49 - * @return string
50 - */
51 32 public static function plugin_folder() {
52 33 return basename( self::plugin_path() );
53 34 }
54 35
55 - /**
56 - * @return string
57 - */
58 36 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
37 + return dirname( dirname( dirname( __FILE__ ) ) );
60 38 }
61 39
62 - /**
63 - * @return string
64 - */
65 40 public static function plugin_url() {
66 - // Previously FRM_URL constant.
41 + // Prevously FRM_URL constant.
67 42 return plugins_url( '', self::plugin_path() . '/formidable.php' );
68 43 }
69 44
70 - /**
71 - * @return string
72 - */
73 45 public static function relative_plugin_url() {
74 46 return str_replace( array( 'https:', 'http:' ), '', self::plugin_url() );
75 47 }
76 48
@@ -85,9 +57,8 @@
85 57 * Get the name of this site
86 58 * Used for [sitename] shortcode
87 59 *
88 60 * @since 2.0
89 - *
90 61 * @return string
91 62 */
92 63 public static function site_name() {
93 64 return get_option( 'blogname' );
@@ -92,17 +63,11 @@
92 63 public static function site_name() {
93 64 return get_option( 'blogname' );
94 65 }
95 66
96 - /**
97 - * @param string $url
98 - *
99 - * @return string
100 - */
101 67 public static function make_affiliate_url( $url ) {
102 68 $affiliate_id = self::get_affiliate();
103 -
104 - if ( $affiliate_id ) {
69 + if ( ! empty( $affiliate_id ) ) {
105 70 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 71 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 72 }
108 73
@@ -108,11 +73,8 @@
108 73
109 74 return $url;
110 75 }
111 76
112 - /**
113 - * @return int
114 - */
115 77 public static function get_affiliate() {
116 78 return absint( apply_filters( 'frm_affiliate_id', 0 ) );
117 79 }
118 80
@@ -117,167 +79,65 @@
117 79 }
118 80
119 81 /**
120 82 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
83 + * @param array|string $args
123 84 * @param string $page
124 85 */
125 86 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
87 + if ( empty( $page ) ) {
88 + $page = 'https://formidableforms.com/lite-upgrade/';
89 + } else {
127 90 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 91 $page = 'https://formidableforms.com/' . $page;
92 + }
93 +
94 + $anchor = '';
95 + if ( is_array( $args ) ) {
96 + $medium = $args['medium'];
97 + if ( isset( $args['content'] ) ) {
98 + $content = $args['content'];
99 + }
100 + if ( isset( $args['anchor'] ) ) {
101 + $anchor = '#' . $args['anchor'];
102 + }
129 103 } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
104 + $medium = $args;
131 105 }
132 106
133 - $args = is_array( $args ) ? self::adjust_legacy_utm_args( $args ) : array( 'campaign' => $args );
134 -
135 107 $query_args = array(
136 - 'utm_source' => 'plugin',
137 - 'utm_medium' => self::get_utm_medium(),
108 + 'utm_source' => 'WordPress',
109 + 'utm_medium' => $medium,
110 + 'utm_campaign' => 'liteplugin',
138 111 );
139 - $query_args = self::maybe_add_utm_license( $query_args );
140 112
141 - if ( isset( $args['campaign'] ) ) {
142 - $query_args['utm_campaign'] = $args['campaign'];
113 + if ( isset( $content ) ) {
114 + $query_args['utm_content'] = $content;
143 115 }
144 116
145 - if ( isset( $args['content'] ) ) {
146 - $query_args['utm_content'] = $args['content'];
147 - }
148 -
149 - if ( isset( $args['param'] ) ) {
117 + if ( is_array( $args ) && isset( $args['param'] ) ) {
150 118 $query_args['f'] = $args['param'];
151 119 }
152 120
153 - if ( ! empty( $args['plan'] ) ) {
121 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
154 122 $query_args['plan'] = $args['plan'];
155 123 }
156 124
157 - $link = add_query_arg( $query_args, $page );
158 -
159 - if ( isset( $args['anchor'] ) ) {
160 - $link .= '#' . $args['anchor'];
161 - }
162 -
125 + $link = add_query_arg( $query_args, $page ) . $anchor;
163 126 return self::make_affiliate_url( $link );
164 127 }
165 128
166 129 /**
167 - * If medium is "pro", add an additional utm_license param with their active license type.
168 - *
169 - * @since 6.25.1
170 - *
171 - * @param array $query_args
172 - * @param string $link
173 - *
174 - * @return array
175 - */
176 - private static function maybe_add_utm_license( $query_args, $link = '' ) {
177 - $medium = $query_args['utm_medium'] ?? self::pull_medium_from_link( $link );
178 -
179 - if ( 'pro' === $medium && is_callable( 'FrmProAddonsController::get_readable_license_type' ) ) {
180 - $query_args['utm_license'] = strtolower( FrmProAddonsController::get_readable_license_type() );
181 - }
182 -
183 - return $query_args;
184 - }
185 -
186 - /**
187 - * @since 6.26
188 - *
189 - * @param string $link
190 - *
191 - * @return string
192 - */
193 - private static function pull_medium_from_link( $link ) {
194 - if ( ! $link ) {
195 - return '';
196 - }
197 -
198 - $parsed = parse_url( $link );
199 -
200 - if ( ! is_array( $parsed ) || ! isset( $parsed['query'] ) ) {
201 - return '';
202 - }
203 -
204 - $query_args = wp_parse_args( $parsed['query'] );
205 -
206 - return ! empty( $query_args['utm_medium'] ) ? $query_args['utm_medium'] : '';
207 - }
208 -
209 - /**
210 - * @since 6.25.1
211 - *
212 - * @return string
213 - */
214 - private static function get_utm_medium() {
215 - return self::pro_is_connected() ? 'pro' : 'lite';
216 - }
217 -
218 - /**
219 - * Change campaign from "liteplugin" to what we're currently using for medium.
220 - *
221 - * @since 6.25.1
222 - *
223 - * @param array $args
224 - *
225 - * @return array
226 - */
227 - private static function adjust_legacy_utm_args( $args ) {
228 - if ( isset( $args['medium'] ) ) {
229 - $args['campaign'] = $args['medium'];
230 - unset( $args['medium'] );
231 - }
232 -
233 - return $args;
234 - }
235 -
236 - /**
237 - * @since 6.21
238 - *
239 - * @param string $cta_link
240 - * @param array $utm
241 - */
242 - public static function maybe_add_missing_utm( $cta_link, $utm ) {
243 - $utm = self::adjust_legacy_utm_args( $utm );
244 - $query_args = array();
245 -
246 - if ( ! str_contains( $cta_link, 'utm_source' ) ) {
247 - $query_args['utm_source'] = 'plugin';
248 - }
249 -
250 - if ( ! str_contains( $cta_link, 'utm_medium' ) ) {
251 - $query_args['utm_medium'] = self::get_utm_medium();
252 - }
253 -
254 - if ( ! str_contains( $cta_link, 'utm_campaign' ) && isset( $utm['campaign'] ) ) {
255 - $query_args['utm_campaign'] = $utm['campaign'];
256 - }
257 -
258 - if ( ! str_contains( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
259 - $query_args['utm_content'] = $utm['content'];
260 - }
261 -
262 - $query_args = self::maybe_add_utm_license( $query_args, $cta_link );
263 -
264 - return $query_args ? add_query_arg( $query_args, $cta_link ) : $cta_link;
265 - }
266 -
267 - /**
268 130 * Get the Formidable settings
269 131 *
270 132 * @since 2.0
271 133 *
272 134 * @param array $args - May include the form id when values need translation.
273 - *
274 - * @return FrmSettings
135 + * @return FrmSettings $frm_setings
275 136 */
276 137 public static function get_settings( $args = array() ) {
277 138 global $frm_settings;
278 -
279 - if ( ! $frm_settings ) {
139 + if ( empty( $frm_settings ) ) {
280 140 $frm_settings = new FrmSettings( $args );
281 141 } elseif ( isset( $args['current_form'] ) ) {
282 142 // If the global has already been set, allow strings to be filtered.
283 143 $frm_settings->maybe_filter_for_form( $args );
@@ -285,41 +145,16 @@
285 145
286 146 return $frm_settings;
287 147 }
288 148
289 - /**
290 - * @return string
291 - */
292 149 public static function get_menu_name() {
293 - if ( ! self::pro_is_installed() || FrmAddonsController::is_license_expired() ) {
294 - return 'Formidable';
295 - }
150 + $frm_settings = self::get_settings();
296 151
297 - return self::get_settings()->menu;
152 + return $frm_settings->menu;
298 153 }
299 154
300 155 /**
301 - * Determine if the current branding is set to 'formidable'.
302 - * Checks the menu icon, and verifies if it matches the formidable branding.
303 - *
304 - * @since 6.4.2
305 - *
306 - * @return bool True if the menu icon is the logo, false otherwise.
307 - */
308 - public static function is_formidable_branding() {
309 - if ( ! self::pro_is_installed() ) {
310 - return true;
311 - }
312 -
313 - return str_contains( self::get_menu_icon_class(), 'frm_logo_icon' );
314 - }
315 -
316 - /**
317 156 * @since 3.05
318 - *
319 - * @param array $atts
320 - *
321 - * @return string
322 157 */
323 158 public static function svg_logo( $atts = array() ) {
324 159 $defaults = array(
325 160 'height' => 18,
@@ -328,31 +163,23 @@
328 163 'orange' => '#f05a24',
329 164 );
330 165 $atts = array_merge( $defaults, $atts );
331 166
332 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
333 167 return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 599.68 601.37" width="' . esc_attr( $atts['width'] ) . '" height="' . esc_attr( $atts['height'] ) . '">
334 168 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
335 169 <path fill="' . esc_attr( $atts['fill'] ) . '" d="M400.2 147h-200c-17 0-30.6 12.2-30.6 29.3V218h260v-71zM397.9 264H169.6v196h75V340H398a32.2 32.2 0 0 0 30.1-21.4 24.3 24.3 0 0 0 1.7-8.7V264zM299.8 601.4A300.3 300.3 0 0 1 0 300.7a299.8 299.8 0 1 1 511.9 212.6 297.4 297.4 0 0 1-212 88zm0-563A262 262 0 0 0 38.3 300.7a261.6 261.6 0 1 0 446.5-185.5 259.5 259.5 0 0 0-185-76.8z"/>
336 170 </svg>';
337 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
338 171 }
339 172
340 173 /**
341 174 * @since 4.0
342 - *
343 - * @param array $atts
344 - *
345 - * @return void
346 175 */
347 176 public static function show_logo( $atts = array() ) {
348 - self::kses_echo( self::svg_logo( $atts ), 'all' );
177 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
349 178 }
350 179
351 180 /**
352 181 * @since 4.03.02
353 - *
354 - * @return void
355 182 */
356 183 public static function show_header_logo() {
357 184 $icon = self::svg_logo(
358 185 array(
@@ -361,11 +188,10 @@
361 188 )
362 189 );
363 190
364 191 $new_icon = apply_filters( 'frm_icon', $icon, true );
365 -
366 192 if ( $new_icon !== $icon ) {
367 - if ( str_starts_with( $new_icon, '<svg' ) ) {
193 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
368 194 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
369 195 } else {
370 196 // Show nothing if it isn't an SVG.
371 197 $icon = '<div style="height:39px"></div>';
@@ -370,43 +196,26 @@
370 196 // Show nothing if it isn't an SVG.
371 197 $icon = '<div style="height:39px"></div>';
372 198 }
373 199 }
374 - self::kses_echo( $icon, 'all' );
200 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
375 201 }
376 202
377 203 /**
378 204 * @since 2.02.04
379 - *
380 - * @return bool
381 205 */
382 206 public static function ips_saved() {
383 207 $frm_settings = self::get_settings();
208 +
384 209 return ! $frm_settings->no_ips;
385 210 }
386 211
387 - /**
388 - * @return bool
389 - */
390 212 public static function pro_is_installed() {
391 - return (bool) apply_filters( 'frm_pro_installed', false );
213 + return apply_filters( 'frm_pro_installed', false );
392 214 }
393 215
394 216 /**
395 - * Check if the Pro plugin is installed, whether authorized or not.
396 - *
397 - * @since 6.8.3
398 - *
399 - * @return bool
400 - */
401 - public static function pro_is_included() {
402 - return function_exists( 'load_formidable_pro' );
403 - }
404 -
405 - /**
406 217 * @since 4.06.02
407 - *
408 - * @return bool
409 218 */
410 219 public static function pro_is_connected() {
411 220 global $frm_vars;
412 221 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -413,94 +222,39 @@
413 222 }
414 223
415 224 /**
416 225 * @since 4.06
417 - * @since 6.16.2 Added $check_for_settings parameter
418 - *
419 - * @param bool $check_for_settings
420 - *
421 - * @return bool
422 226 */
423 - public static function is_form_builder_page( $check_for_settings = true ) {
424 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
425 - $check_actions = array( 'edit', 'duplicate' );
426 -
427 - if ( $check_for_settings ) {
428 - $check_actions[] = 'settings';
429 - }
430 -
431 - return self::is_admin_page( 'formidable' ) && in_array( $action, $check_actions, true );
227 + public static function is_form_builder_page() {
228 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
229 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
432 230 }
433 231
434 - /**
435 - * @return bool
436 - */
437 232 public static function is_formidable_admin() {
438 - $page = self::simple_get( 'page', 'sanitize_title' );
439 -
440 - if ( ! $page ) {
441 - return self::is_view_builder_page();
233 + $page = self::simple_get( 'page', 'sanitize_title' );
234 + $is_formidable = strpos( $page, 'formidable' ) !== false;
235 + if ( empty( $page ) ) {
236 + $is_formidable = self::is_view_builder_page();
442 237 }
443 238
444 - return str_contains( $page, 'formidable' );
239 + return $is_formidable;
445 240 }
446 241
447 242 /**
448 - * Checks if is a list page.
449 - *
450 - * @since 6.19
451 - *
452 - * @param string $page The name of the page to check.
453 - *
454 - * @return bool
455 - */
456 - public static function is_admin_list_page( $page = 'formidable' ) {
457 - if ( 'formidable' === $page ) {
458 - return self::on_form_listing_page();
459 - }
460 -
461 - if ( ! self::is_admin_page( $page ) ) {
462 - return false;
463 - }
464 -
465 - if ( 'formidable-entries' === $page ) {
466 - $action = self::simple_get( 'frm_action' );
467 -
468 - if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
469 - return true;
470 - }
471 - }
472 -
473 - // Check edit or settings page.
474 - return ! self::simple_get( 'frm_action' );
475 - }
476 -
477 - /**
478 - * @since 6.20
479 - *
480 - * @return array<string>
481 - */
482 - private static function get_entries_listing_page_form_actions() {
483 - return array( 'list', 'destroy' );
484 - }
485 -
486 - /**
487 243 * Check for certain page in Formidable settings
488 244 *
489 245 * @since 2.0
490 246 *
491 - * @param string $page The name of the page to check.
247 + * @param string $page The name of the page to check
492 248 *
493 - * @return bool
249 + * @return boolean
494 250 */
495 251 public static function is_admin_page( $page = 'formidable' ) {
496 252 global $pagenow;
497 253 $get_page = self::simple_get( 'page', 'sanitize_title' );
498 -
499 254 if ( $pagenow ) {
500 - // Allow this to be true during ajax load i.e. ajax form builder loading
255 + // allow this to be true during ajax load i.e. ajax form builder loading
501 256 $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
502 -
503 257 if ( $is_page ) {
504 258 return true;
505 259 }
506 260 }
@@ -512,23 +266,21 @@
512 266 * If the current page is for editing or creating a view.
513 267 * Returns false for the views listing page.
514 268 *
515 269 * @since 4.0
516 - *
517 - * @return bool
518 270 */
519 271 public static function is_view_builder_page() {
520 272 global $pagenow;
521 273
522 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
274 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
523 275 return false;
524 276 }
525 277
526 278 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
527 279
528 - if ( ! $post_type ) {
529 - $post_id = self::simple_get( 'post', 'absint' );
530 - $post = get_post( $post_id );
280 + if ( empty( $post_type ) ) {
281 + $post_id = self::simple_get( 'post', 'absint' );
282 + $post = get_post( $post_id );
531 283 $post_type = $post ? $post->post_type : '';
532 284 }
533 285
534 286 return $post_type === 'frm_display';
@@ -538,15 +290,17 @@
538 290 * Check for the form preview page
539 291 *
540 292 * @since 2.0
541 293 *
542 - * @return bool
294 + * @param None
295 + *
296 + * @return boolean
543 297 */
544 298 public static function is_preview_page() {
545 299 global $pagenow;
546 300 $action = self::simple_get( 'action', 'sanitize_title' );
547 301
548 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
302 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
549 303 }
550 304
551 305 /**
552 306 * Check for ajax except the form preview page
@@ -552,17 +306,16 @@
552 306 * Check for ajax except the form preview page
553 307 *
554 308 * @since 2.0
555 309 *
556 - * @return bool
310 + * @param None
311 + *
312 + * @return boolean
557 313 */
558 314 public static function doing_ajax() {
559 315 return wp_doing_ajax() && ! self::is_preview_page();
560 316 }
561 317
562 - /**
563 - * @return string
564 - */
565 318 public static function js_suffix() {
566 319 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
567 320 }
568 321
@@ -567,14 +320,13 @@
567 320 }
568 321
569 322 /**
570 323 * @since 2.0.8
571 - *
572 - * @return bool
573 324 */
574 325 public static function prevent_caching() {
575 326 global $frm_vars;
576 - return ! empty( $frm_vars['prevent_caching'] );
327 +
328 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
577 329 }
578 330
579 331 /**
580 332 * Check if on an admin page
@@ -580,9 +332,9 @@
580 332 * Check if on an admin page
581 333 *
582 334 * @since 2.0
583 335 *
584 - * @return bool
336 + * @return boolean
585 337 */
586 338 public static function is_admin() {
587 339 $is_admin = is_admin() && ! wp_doing_ajax();
588 340
@@ -587,9 +339,8 @@
587 339 $is_admin = is_admin() && ! wp_doing_ajax();
588 340
589 341 /**
590 342 * @since 6.0
591 - *
592 343 * @param bool $is_admin
593 344 */
594 345 return apply_filters( 'frm_is_admin', $is_admin );
595 346 }
@@ -598,23 +349,17 @@
598 349 * Check if value contains blank value or empty array
599 350 *
600 351 * @since 2.0
601 352 *
602 - * @param mixed $value Value to check.
603 - * @param string $empty
353 + * @param mixed $value - value to check
354 + * @param string
604 355 *
605 - * @return bool
356 + * @return boolean
606 357 */
607 358 public static function is_empty_value( $value, $empty = '' ) {
608 - return $value === array() || $value === $empty;
359 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
609 360 }
610 361
611 - /**
612 - * @param mixed $value
613 - * @param string $empty
614 - *
615 - * @return bool
616 - */
617 362 public static function is_not_empty_value( $value, $empty = '' ) {
618 363 return ! self::is_empty_value( $value, $empty );
619 364 }
620 365
@@ -631,28 +376,8 @@
631 376 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
632 377 }
633 378
634 379 /**
635 - * Get the server OS
636 - *
637 - * @since 6.4.2
638 - *
639 - * @return string
640 - */
641 - public static function get_server_os() {
642 - if ( function_exists( 'php_uname' ) ) {
643 - return php_uname( 's' );
644 - }
645 -
646 - if ( ! defined( 'PHP_OS' ) ) {
647 - return '';
648 - }
649 -
650 - // match the same response for Windows server as php_uname('s')
651 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
652 - }
653 -
654 - /**
655 380 * Check for the IP address in several places (when custom headers are enabled).
656 381 * Used by [ip] shortcode.
657 382 *
658 383 * @return string The IP address of the current user
@@ -666,12 +391,10 @@
666 391 continue;
667 392 }
668 393
669 394 $key = self::get_server_value( $key );
670 -
671 395 foreach ( explode( ',', $key ) as $ip ) {
672 - // Just to be safe.
673 - $ip = trim( $ip );
396 + $ip = trim( $ip ); // Just to be safe.
674 397
675 398 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
676 399 return sanitize_text_field( $ip );
677 400 }
@@ -724,26 +447,16 @@
724 447 */
725 448 return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
726 449 }
727 450
728 - /**
729 - * @param string $param
730 - * @param mixed $default
731 - * @param string $src
732 - * @param callable|string $sanitize
733 - *
734 - * @return mixed
735 - */
736 451 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
737 - if ( str_contains( $param, '[' ) ) {
452 + if ( strpos( $param, '[' ) ) {
738 453 $params = explode( '[', $param );
739 454 $param = $params[0];
740 455 }
741 456
742 457 if ( $src === 'get' ) {
743 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
744 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
745 -
458 + $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default ); // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
746 459 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
747 460 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
748 461 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
749 462 }
@@ -758,41 +471,29 @@
758 471 )
759 472 );
760 473 }
761 474
762 - if ( ! isset( $params ) || ! is_array( $value ) || ! $value ) {
763 - return $value;
764 - }
475 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
476 + foreach ( $params as $k => $p ) {
477 + if ( ! $k || ! is_array( $value ) ) {
478 + continue;
479 + }
765 480
766 - foreach ( $params as $k => $p ) {
767 - if ( ! $k || ! is_array( $value ) ) {
768 - continue;
481 + $p = trim( $p, ']' );
482 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
769 483 }
770 -
771 - $p = trim( $p, ']' );
772 - $value = $value[ $p ] ?? $default;
773 484 }
774 485
775 486 return $value;
776 487 }
777 488
778 - /**
779 - * Get a value from $_POST data.
780 - *
781 - * @param string $param The key we are trying to access data from in $_POST.
782 - * @param mixed $default The default if nothing is being sent.
783 - * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
784 - * @param bool $serialized
785 - *
786 - * @return mixed
787 - */
788 489 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
789 490 return self::get_simple_request(
790 491 array(
791 - 'type' => 'post',
792 - 'param' => $param,
793 - 'default' => $default,
794 - 'sanitize' => $sanitize,
492 + 'type' => 'post',
493 + 'param' => $param,
494 + 'default' => $default,
495 + 'sanitize' => $sanitize,
795 496 'serialized' => $serialized,
796 497 )
797 498 );
798 499 }
@@ -803,9 +504,9 @@
803 504 * @param string $param
804 505 * @param string $sanitize
805 506 * @param string $default
806 507 *
807 - * @return array|int|string
508 + * @return string|array
808 509 */
809 510 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
810 511 return self::get_simple_request(
811 512 array(
@@ -823,38 +524,39 @@
823 524 * @since 2.0.6
824 525 *
825 526 * @param array $args
826 527 *
827 - * @return array|string
528 + * @return string|array
828 529 */
829 530 public static function get_simple_request( $args ) {
830 531 $defaults = array(
831 - 'param' => '',
832 - 'default' => '',
833 - 'type' => 'get',
834 - 'sanitize' => 'sanitize_text_field',
532 + 'param' => '',
533 + 'default' => '',
534 + 'type' => 'get',
535 + 'sanitize' => 'sanitize_text_field',
835 536 'serialized' => false,
836 537 );
837 538 $args = wp_parse_args( $args, $defaults );
838 - $value = $args['default'];
839 539
840 - if ( $args['type'] === 'get' ) {
540 + $value = $args['default'];
541 + if ( $args['type'] == 'get' ) {
841 542 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
842 543 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
843 544 $value = wp_unslash( $_GET[ $args['param'] ] );
844 545 }
845 - } elseif ( $args['type'] === 'post' ) {
546 + } elseif ( $args['type'] == 'post' ) {
846 547 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
847 548 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
848 549 $value = wp_unslash( $_POST[ $args['param'] ] );
849 -
850 550 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
851 551 self::unserialize_or_decode( $value );
852 552 }
853 553 }
854 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
855 - // phpcs:ignore phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
856 - $value = wp_unslash( $_REQUEST[ $args['param'] ] );
554 + } else {
555 + if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
556 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
557 + $value = wp_unslash( $_REQUEST[ $args['param'] ] );
558 + }
857 559 }
858 560
859 561 self::sanitize_value( $args['sanitize'], $value );
860 562
@@ -867,56 +569,34 @@
867 569 * @since 2.0.8
868 570 *
869 571 * @param string $value
870 572 *
871 - * @return string Value.
573 + * @return string $value
872 574 */
873 575 public static function preserve_backslashes( $value ) {
874 576 // If backslashes have already been added, don't add them again
875 - return str_contains( $value, '\\\\' ) ? $value : addslashes( $value );
577 + if ( strpos( $value, '\\\\' ) === false ) {
578 + $value = addslashes( $value );
579 + }
580 +
581 + return $value;
876 582 }
877 583
878 - /**
879 - * Sanitize a value in-place.
880 - * If $value is an array, the sanitize function will get called for each item.
881 - *
882 - * @param callable $sanitize
883 - * @param mixed $value
884 - *
885 - * @return void
886 - */
887 584 public static function sanitize_value( $sanitize, &$value ) {
888 - if ( ! $sanitize ) {
889 - return;
890 - }
891 -
892 - if ( is_object( $value ) ) {
893 - $value = '';
894 - return;
895 - }
896 -
897 - if ( is_array( $value ) ) {
898 - $temp_values = $value;
899 -
900 - foreach ( $temp_values as $k => $v ) {
901 - self::sanitize_value( $sanitize, $value[ $k ] );
585 + if ( ! empty( $sanitize ) ) {
586 + if ( is_array( $value ) ) {
587 + $temp_values = $value;
588 + foreach ( $temp_values as $k => $v ) {
589 + self::sanitize_value( $sanitize, $value[ $k ] );
590 + }
591 + } else {
592 + $value = call_user_func( $sanitize, $value );
902 593 }
903 -
904 - return;
905 594 }
906 -
907 - $value = call_user_func( $sanitize, $value );
908 595 }
909 596
910 - /**
911 - * @param array $sanitize_method
912 - * @param array $values
913 - *
914 - * @return void
915 - */
916 597 public static function sanitize_request( $sanitize_method, &$values ) {
917 598 $temp_values = $values;
918 -
919 599 foreach ( $temp_values as $k => $val ) {
920 600 if ( isset( $sanitize_method[ $k ] ) ) {
921 601 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
922 602 }
@@ -924,68 +604,23 @@
924 604 }
925 605
926 606 /**
927 607 * @since 4.0.04
928 - *
929 - * @param mixed $value
930 - *
931 - * @return void
932 608 */
933 609 public static function sanitize_with_html( &$value ) {
934 - if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
935 - // Only strip unsafe HTML like scripts for a privileged user submitting a form.
936 - self::sanitize_value( 'wp_kses_post', $value );
937 - } else {
938 - self::sanitize_value( self::class . '::strip_most_html', $value );
939 - }
610 + self::sanitize_value( 'wp_kses_post', $value );
940 611 self::decode_specialchars( $value );
941 612 }
942 613
943 614 /**
944 - * Allow only a small set of very basic HTML for unprivileged users.
945 - *
946 - * @since 6.7.1
947 - *
948 - * @param string $value
949 - */
950 - public static function strip_most_html( $value ) {
951 - if ( '' === $value ) {
952 - return $value;
953 - }
954 -
955 - $allowed_html = array(
956 - 'b' => array(),
957 - 'br' => array(),
958 - 'strong' => array(),
959 - 'p' => array(),
960 - 'i' => array(),
961 - 'ul' => array(),
962 - 'ol' => array(),
963 - 'li' => array(),
964 - );
965 -
966 - /**
967 - * @since 6.7.1
968 - *
969 - * @param array $allowed_html
970 - */
971 - $allowed_html = apply_filters( 'frm_allowed_form_input_html', $allowed_html );
972 -
973 - return wp_kses( $value, $allowed_html );
974 - }
975 -
976 - /**
977 615 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
978 616 * this MUST be done, else we'll be back to the '& entity' problem.
979 617 *
980 618 * @since 4.0.04
981 - *
982 - * @param mixed $value Value to decode, passed by reference.
983 619 */
984 620 public static function decode_specialchars( &$value ) {
985 621 if ( is_array( $value ) ) {
986 622 $temp_values = $value;
987 -
988 623 foreach ( $temp_values as $k => $v ) {
989 624 self::decode_specialchars( $value[ $k ] );
990 625 }
991 626 } else {
@@ -999,13 +634,13 @@
999 634 * Adapted from wp_specialchars_decode().
1000 635 *
1001 636 * @since 4.03.01
1002 637 *
1003 - * @param string $string The string to prep, passed by reference.
638 + * @param string $string The string to prep.
1004 639 */
1005 640 private static function decode_amp( &$string ) {
1006 641 // Don't bother if there are no entities - saves a lot of processing
1007 - if ( ! $string || ! str_contains( $string, '&' ) ) {
642 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1008 643 return;
1009 644 }
1010 645
1011 646 $translation = array(
@@ -1011,12 +646,10 @@
1011 646 $translation = array(
1012 647 '&quot;' => '"',
1013 648 '&#034;' => '"',
1014 649 '&#x22;' => '"',
1015 - // The space preserves the HTML.
1016 - '&lt; ' => '< ',
1017 - // The space preserves the HTML.
1018 - '&#060; ' => '< ',
650 + '&lt; ' => '< ', // The space preserves the HTML.
651 + '&#060; ' => '< ', // The space preserves the HTML.
1019 652 '&gt;' => '>',
1020 653 '&#062;' => '>',
1021 654 '&amp;' => '&',
1022 655 '&#038;' => '&',
@@ -1043,29 +676,17 @@
1043 676 * Sanitize the value, and allow some HTML
1044 677 *
1045 678 * @since 2.0
1046 679 *
1047 - * @param string $value The value to sanitize.
1048 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
680 + * @param string $value
681 + * @param array|string $allowed 'all' for everything included as defaults
1049 682 *
1050 683 * @return string
1051 684 */
1052 685 public static function kses( $value, $allowed = array() ) {
1053 - return wp_kses( $value, self::allowed_html( $allowed ) );
1054 - }
686 + $allowed_html = self::allowed_html( $allowed );
1055 687
1056 - /**
1057 - * Sanitizes and echoes a given value.
1058 - *
1059 - * @since 6.18
1060 - *
1061 - * @param string $value The value to sanitize and output.
1062 - * @param array|string $allowed Allowed HTML tags and attributes.
1063 - *
1064 - * @return void
1065 - */
1066 - public static function kses_echo( $value, $allowed = array() ) {
1067 - echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
688 + return wp_kses( $value, $allowed_html );
1068 689 }
1069 690
1070 691 /**
1071 692 * The regular kses function strips [button_action] from submit button HTML.
@@ -1072,23 +693,21 @@
1072 693 *
1073 694 * @since 5.0.13
1074 695 *
1075 696 * @param string $html
1076 - *
1077 697 * @return string
1078 698 */
1079 699 public static function kses_submit_button( $html ) {
1080 - $included_button_action = str_contains( $html, '[button_action]' );
1081 - $included_back_hook = str_contains( $html, '[back_hook]' );
1082 - $included_draft_hook = str_contains( $html, '[draft_hook]' );
700 + $included_button_action = false !== strpos( $html, '[button_action]' );
701 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
702 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1083 703 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1084 704 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1085 705 $html = self::kses( $html, 'all' );
1086 706 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1087 707 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1088 -
1089 708 if ( $included_button_action ) {
1090 - if ( str_contains( $html, '<input type="submit"' ) ) {
709 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1091 710 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1092 711 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1093 712 } else {
1094 713 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1094,17 +713,14 @@
1094 713 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1095 714 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1096 715 }
1097 716 }
1098 -
1099 717 if ( $included_back_hook ) {
1100 718 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1101 719 }
1102 -
1103 720 if ( $included_draft_hook ) {
1104 - return str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
721 + $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1105 722 }
1106 -
1107 723 return $html;
1108 724 }
1109 725
1110 726 /**
@@ -1110,9 +726,8 @@
1110 726 /**
1111 727 * @since 5.0.13
1112 728 *
1113 729 * @param array $allowed_attr
1114 - *
1115 730 * @return array
1116 731 */
1117 732 public static function allow_visibility_style( $allowed_attr ) {
1118 733 $allowed_attr[] = 'visibility';
@@ -1122,9 +737,8 @@
1122 737 /**
1123 738 * @since 5.0.13
1124 739 *
1125 740 * @param array $allowed_html
1126 - *
1127 741 * @return array
1128 742 */
1129 743 public static function add_allowed_submit_button_tags( $allowed_html ) {
1130 744 $allowed_html['input'] = array(
@@ -1141,22 +755,17 @@
1141 755 }
1142 756
1143 757 /**
1144 758 * @since 2.05.03
1145 - *
1146 - * @param array|string $allowed
1147 - *
1148 - * @return array
1149 759 */
1150 760 private static function allowed_html( $allowed ) {
1151 761 $html = self::safe_html();
1152 762 $allowed_html = array();
1153 -
1154 763 if ( $allowed === 'all' ) {
1155 764 $allowed_html = $html;
1156 - } elseif ( $allowed ) {
765 + } elseif ( ! empty( $allowed ) ) {
1157 766 foreach ( (array) $allowed as $a ) {
1158 - $allowed_html[ $a ] = $html[ $a ] ?? array();
767 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1159 768 }
1160 769 }
1161 770
1162 771 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1163,10 +772,8 @@
1163 772 }
1164 773
1165 774 /**
1166 775 * @since 2.05.03
1167 - *
1168 - * @return array
1169 776 */
1170 777 private static function safe_html() {
1171 778 $allow_class = array(
1172 779 'class' => true,
@@ -1173,9 +780,9 @@
1173 780 'id' => true,
1174 781 );
1175 782
1176 783 return array(
1177 - 'a' => array(
784 + 'a' => array(
1178 785 'class' => true,
1179 786 'href' => true,
1180 787 'id' => true,
1181 788 'rel' => true,
@@ -1244,16 +851,16 @@
1244 851 'cite' => true,
1245 852 'title' => true,
1246 853 ),
1247 854 'rect' => array(
1248 - 'class' => true,
1249 - 'fill' => true,
1250 - 'height' => true,
1251 - 'width' => true,
1252 - 'x' => true,
1253 - 'y' => true,
1254 - 'rx' => true,
1255 - 'stroke' => true,
855 + 'class' => true,
856 + 'fill' => true,
857 + 'height' => true,
858 + 'width' => true,
859 + 'x' => true,
860 + 'y' => true,
861 + 'rx' => true,
862 + 'stroke' => true,
1256 863 'stroke-opacity' => true,
1257 864 'stroke-width' => true,
1258 865 ),
1259 866 'section' => $allow_class,
@@ -1288,9 +895,9 @@
1288 895 'xlink:href' => true,
1289 896 ),
1290 897 'ul' => $allow_class,
1291 898 'label' => array(
1292 - 'for' => true,
899 + 'for' => true,
1293 900 'class' => true,
1294 901 'id' => true,
1295 902 ),
1296 903 'button' => array(
@@ -1299,13 +906,8 @@
1299 906 ),
1300 907 'legend' => array(
1301 908 'class' => true,
1302 909 ),
1303 - 'option' => array(
1304 - 'class' => true,
1305 - 'value' => true,
1306 - 'selected' => true,
1307 - ),
1308 910 );
1309 911 }
1310 912
1311 913 /**
@@ -1313,21 +915,19 @@
1313 915 *
1314 916 * @since 2.0
1315 917 */
1316 918 public static function remove_get_action() {
1317 - if ( empty( $_GET ) ) {
919 + if ( ! isset( $_GET ) ) {
1318 920 return;
1319 921 }
1320 922
1321 923 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1322 -
1323 - if ( ! $action_name ) {
924 + if ( empty( $action_name ) ) {
1324 925 return;
1325 926 }
1326 927
1327 928 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1328 -
1329 - if ( $new_action ) {
929 + if ( ! empty( $new_action ) ) {
1330 930 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1331 931 }
1332 932 }
1333 933
@@ -1334,23 +934,21 @@
1334 934 /**
1335 935 * Check the WP query for a parameter
1336 936 *
1337 937 * @since 2.0
1338 - *
1339 - * @param array|string $value
1340 - * @param string $param
1341 - *
1342 - * @return array|string
938 + * @return string|array
1343 939 */
1344 940 public static function get_query_var( $value, $param ) {
1345 - // phpcs:ignore Universal.Operators.StrictComparisons
1346 941 if ( $value != '' ) {
1347 942 return $value;
1348 943 }
1349 944
1350 945 global $wp_query;
946 + if ( isset( $wp_query->query_vars[ $param ] ) ) {
947 + $value = $wp_query->query_vars[ $param ];
948 + }
1351 949
1352 - return $wp_query->query_vars[ $param ] ?? $value;
950 + return $value;
1353 951 }
1354 952
1355 953 /**
1356 954 * Try to show the SVG if possible. Otherwise, use the font icon.
@@ -1355,33 +953,27 @@
1355 953 /**
1356 954 * Try to show the SVG if possible. Otherwise, use the font icon.
1357 955 *
1358 956 * @since 4.0.02
1359 - *
1360 957 * @param string $class
1361 958 * @param array $atts
1362 - *
1363 - * @return string|null
1364 959 */
1365 960 public static function icon_by_class( $class, $atts = array() ) {
1366 961 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1367 -
1368 962 if ( isset( $atts['echo'] ) ) {
1369 963 unset( $atts['echo'] );
1370 964 }
1371 965
1372 966 $html_atts = self::array_to_html_params( $atts );
1373 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1374 967
1375 - // Replace icons that have been removed or renamed.
968 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
969 +
970 + // Replace icons that have been removed.
1376 971 $deprecated = array(
1377 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 - 'frm_keyalt_icon' => 'frm_key_icon',
1379 - 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
972 + 'frm_clone_solid_icon' => 'frm_clone_icon',
1380 973 );
1381 -
1382 974 if ( isset( $deprecated[ $icon ] ) ) {
1383 - $icon = $deprecated[ $icon ];
975 + $icon = $deprecated[ $icon ];
1384 976 $class = str_replace( $icon, $deprecated[ $icon ], $class );
1385 977 }
1386 978
1387 979 if ( $icon === $class ) {
@@ -1386,24 +978,23 @@
1386 978
1387 979 if ( $icon === $class ) {
1388 980 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1389 981 } else {
1390 - $class = str_contains( $icon, ' ' ) ? ' ' . $icon : '';
1391 -
1392 - if ( str_contains( $icon, ' ' ) ) {
982 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
983 + if ( strpos( $icon, ' ' ) ) {
1393 984 $icon = explode( ' ', $icon );
1394 985 $icon = reset( $icon );
1395 986 }
1396 -
1397 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
987 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
988 + <use xlink:href="#' . esc_attr( $icon ) . '" />
989 + </svg>';
1398 990 }
1399 991
1400 992 if ( $echo ) {
1401 993 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1402 - return null;
994 + } else {
995 + return $icon;
1403 996 }
1404 -
1405 - return $icon;
1406 997 }
1407 998
1408 999 /**
1409 1000 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1410,9 +1001,8 @@
1410 1001 *
1411 1002 * @since 5.0.13
1412 1003 *
1413 1004 * @param string $icon
1414 - *
1415 1005 * @return string
1416 1006 */
1417 1007 public static function kses_icon( $icon ) {
1418 1008 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1428,15 +1018,13 @@
1428 1018 /**
1429 1019 * @since 5.0.13.1
1430 1020 *
1431 1021 * @param array $allowed_html
1432 - *
1433 1022 * @return array
1434 1023 */
1435 1024 public static function add_allowed_icon_tags( $allowed_html ) {
1436 1025 $allowed_html['svg']['data-open'] = true;
1437 1026 $allowed_html['svg']['title'] = true;
1438 - $allowed_html['svg']['tabindex'] = true;
1439 1027 return $allowed_html;
1440 1028 }
1441 1029
1442 1030 /**
@@ -1442,9 +1030,8 @@
1442 1030 /**
1443 1031 * @since 5.0.13
1444 1032 *
1445 1033 * @param array $allowed_attr
1446 - *
1447 1034 * @return array
1448 1035 */
1449 1036 public static function allow_vars_in_styles( $allowed_attr ) {
1450 1037 $allowed_attr[] = '--primary-700';
@@ -1457,9 +1044,9 @@
1457 1044 * @param bool $allow_css
1458 1045 * @param string $css_string
1459 1046 */
1460 1047 public static function allow_style( $allow_css, $css_string ) {
1461 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
1048 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
1462 1049 $split = explode( ':', $css_string, 2 );
1463 1050 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1464 1051 }
1465 1052 return $allow_css;
@@ -1468,22 +1055,19 @@
1468 1055 /**
1469 1056 * @since 5.0.13
1470 1057 *
1471 1058 * @param string $value
1472 - *
1473 1059 * @return bool
1474 1060 */
1475 1061 private static function is_a_valid_color( $value ) {
1476 1062 $match = 0;
1477 -
1478 - if ( str_starts_with( $value, 'rgba(' ) ) {
1063 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1479 1064 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1480 - } elseif ( str_starts_with( $value, 'rgb(' ) ) {
1065 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1481 1066 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1482 - } elseif ( str_starts_with( $value, '#' ) ) {
1067 + } elseif ( 0 === strpos( $value, '#' ) ) {
1483 1068 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1484 1069 }
1485 -
1486 1070 return (bool) $match;
1487 1071 }
1488 1072
1489 1073 /**
@@ -1489,19 +1073,11 @@
1489 1073 /**
1490 1074 * Include svg images.
1491 1075 *
1492 1076 * @since 4.0.02
1493 - *
1494 - * @return void
1495 1077 */
1496 1078 public static function include_svg() {
1497 - if ( self::$included_svg ) {
1498 - return;
1499 - }
1500 -
1501 - // Use readfile instead of include_once because of a default security rule in Snuffleupagus.
1502 - readfile( self::plugin_path() . '/images/icons.svg' );
1503 - self::$included_svg = true;
1079 + include_once self::plugin_path() . '/images/icons.svg';
1504 1080 }
1505 1081
1506 1082 /**
1507 1083 * Convert an associative array to HTML values.
@@ -1510,20 +1086,17 @@
1510 1086 * @since 5.0.13 added $echo parameter.
1511 1087 *
1512 1088 * @param array $atts
1513 1089 * @param bool $echo
1514 - *
1515 1090 * @return string|void
1516 1091 */
1517 1092 public static function array_to_html_params( $atts, $echo = false ) {
1518 - $callback = function () use ( $atts ) {
1519 - if ( ! $atts ) {
1520 - return;
1093 + $callback = function() use ( $atts ) {
1094 + if ( $atts ) {
1095 + foreach ( $atts as $key => $value ) {
1096 + echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1097 + }
1521 1098 }
1522 -
1523 - foreach ( $atts as $key => $value ) {
1524 - echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1525 - }
1526 1099 };
1527 1100 return self::clip( $callback, $echo );
1528 1101 }
1529 1102
@@ -1533,10 +1106,9 @@
1533 1106 * @since 5.0.13
1534 1107 *
1535 1108 * @param Closure $echo_function
1536 1109 * @param bool $echo
1537 - *
1538 - * @return string|null
1110 + * @return string|void
1539 1111 */
1540 1112 public static function clip( $echo_function, $echo = false ) {
1541 1113 if ( ! $echo ) {
1542 1114 ob_start();
@@ -1541,34 +1113,30 @@
1541 1113 if ( ! $echo ) {
1542 1114 ob_start();
1543 1115 }
1544 1116
1545 - if ( is_callable( $echo_function ) ) {
1546 - $echo_function();
1117 + $echo_function();
1118 +
1119 + if ( ! $echo ) {
1120 + $return = ob_get_contents();
1121 + ob_end_clean();
1122 + return $return;
1547 1123 }
1548 -
1549 - return $echo ? null : ob_get_clean();
1550 1124 }
1551 1125
1552 1126 /**
1553 1127 * @since 3.0
1554 - *
1555 - * @param array $atts
1556 - *
1557 - * @return void
1558 1128 */
1559 1129 public static function get_admin_header( $atts ) {
1560 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1561 -
1562 - if ( empty( $atts['close'] ) ) {
1130 + $has_nav = ( isset( $atts['form'] ) && ! empty( $atts['form'] ) && ( ! isset( $atts['is_template'] ) || ! $atts['is_template'] ) );
1131 + if ( ! isset( $atts['close'] ) || empty( $atts['close'] ) ) {
1563 1132 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1564 1133 }
1565 -
1566 1134 if ( ! isset( $atts['import_link'] ) ) {
1567 1135 $atts['import_link'] = false;
1568 1136 }
1569 1137
1570 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
1138 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1571 1139 }
1572 1140
1573 1141 /**
1574 1142 * @since 6.0
@@ -1573,19 +1141,16 @@
1573 1141 /**
1574 1142 * @since 6.0
1575 1143 *
1576 1144 * @param string $type
1577 - *
1578 1145 * @return void
1579 1146 */
1580 1147 public static function import_link( $type = 'secondary' ) {
1581 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1582 1148 ?>
1583 1149 <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable-import' ) ); ?>" class="button frm-button-<?php echo esc_attr( $type ); ?> frm_animate_bg">
1584 1150 <?php esc_html_e( 'Import', 'formidable' ); ?>
1585 1151 </a>
1586 1152 <?php
1587 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1588 1153 }
1589 1154
1590 1155 /**
1591 1156 * Print applicable admin banner.
@@ -1592,9 +1157,8 @@
1592 1157 *
1593 1158 * @since 5.4.2
1594 1159 *
1595 1160 * @param bool $should_show_lite_upgrade
1596 - *
1597 1161 * @return void
1598 1162 */
1599 1163 public static function print_admin_banner( $should_show_lite_upgrade ) {
1600 1164 if ( ! current_user_can( 'administrator' ) ) {
@@ -1601,44 +1165,19 @@
1601 1165 FrmInbox::maybe_show_banner();
1602 1166 return;
1603 1167 }
1604 1168
1605 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1169 + if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1606 1170 // Print license warning or inbox banner and exit if either prints.
1607 1171 // And exit before printing the upgrade bar if it shouldn't be shown.
1608 1172 return;
1609 1173 }
1610 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1611 1174 ?>
1612 1175 <div class="frm-upgrade-bar">
1613 - <div class="frm-upgrade-bar-inner">
1614 - <?php
1615 - $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1616 -
1617 - if ( ! $cta_text ) {
1618 - $cta_text = __( 'upgrading to PRO', 'formidable' );
1619 - }
1620 -
1621 - $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1622 - $utm = array(
1623 - 'campaign' => 'settings-license',
1624 - 'content' => 'lite-banner',
1625 - );
1626 -
1627 - $upgrade_link = $upgrade_link ? self::maybe_add_missing_utm( $upgrade_link, $utm ) : self::admin_upgrade_link( $utm );
1628 -
1629 - printf(
1630 - /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1631 - esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
1632 - '<a href="' . esc_url( $upgrade_link ) . '">',
1633 - esc_html( $cta_text ),
1634 - '</a>'
1635 - );
1636 - ?>
1637 - </div>
1176 + <span>You're using Formidable Forms Lite. To unlock more features consider</span>
1177 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'top-bar' ) ); ?>" target="_blank" rel="noopener">upgrading to Pro</a>.
1638 1178 </div>
1639 1179 <?php
1640 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1641 1180 }
1642 1181
1643 1182 /**
1644 1183 * @since 5.4.2
@@ -1652,18 +1191,14 @@
1652 1191 /**
1653 1192 * Render a button for a new item (Form, Application, etc).
1654 1193 *
1655 1194 * @since 3.0
1656 - *
1657 1195 * @param array $atts {
1658 - * Details about the button.
1659 - *
1660 1196 * @type array $link_hook Custom link hook, calls do_action and exits early.
1661 1197 * @type string $new_link Href value, default #.
1662 1198 * @type string $class Custom class names, space separated.
1663 1199 * @type string $button_text Button text. Default "Add New".
1664 1200 * }
1665 - *
1666 1201 * @return void
1667 1202 */
1668 1203 public static function add_new_item_link( $atts ) {
1669 1204 if ( isset( $atts['link_hook'] ) ) {
@@ -1670,9 +1205,9 @@
1670 1205 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1671 1206 return;
1672 1207 }
1673 1208
1674 - if ( empty( $atts['new_link'] ) && empty( $atts['create_form'] ) && empty( $atts['class'] ) ) {
1209 + if ( empty( $atts['new_link'] ) && empty( $atts['trigger_new_form_modal'] ) && empty( $atts['class'] ) ) {
1675 1210 // Do not render a button if none of these attributes are set.
1676 1211 return;
1677 1212 }
1678 1213
@@ -1678,8 +1213,12 @@
1678 1213
1679 1214 $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1680 1215 $class = 'button button-primary frm-button-primary';
1681 1216
1217 + if ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1218 + $class .= ' frm-trigger-new-form-modal';
1219 + }
1220 +
1682 1221 if ( ! empty( $atts['class'] ) ) {
1683 1222 $class .= ' ' . $atts['class'];
1684 1223 }
1685 1224
@@ -1689,12 +1228,8 @@
1689 1228 }
1690 1229
1691 1230 /**
1692 1231 * @since 3.06
1693 - *
1694 - * @param array $atts
1695 - *
1696 - * @return void
1697 1232 */
1698 1233 public static function show_search_box( $atts ) {
1699 1234 $defaults = array(
1700 1235 'placeholder' => '',
@@ -1700,12 +1235,10 @@
1700 1235 'placeholder' => '',
1701 1236 'tosearch' => '',
1702 1237 'text' => __( 'Search', 'formidable' ),
1703 1238 'input_id' => '',
1704 - 'value' => false,
1705 - 'class' => '',
1706 1239 );
1707 - $atts = array_merge( $defaults, $atts );
1240 + $atts = array_merge( $defaults, $atts );
1708 1241
1709 1242 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1710 1243 $atts['tosearch'] = 'frm-card';
1711 1244 }
@@ -1710,9 +1243,8 @@
1710 1243 $atts['tosearch'] = 'frm-card';
1711 1244 }
1712 1245
1713 1246 $class = 'frm-search-input';
1714 -
1715 1247 if ( ! empty( $atts['tosearch'] ) ) {
1716 1248 $class .= ' frm-auto-search';
1717 1249 }
1718 1250
@@ -1717,35 +1249,21 @@
1717 1249 }
1718 1250
1719 1251 $input_id = $atts['input_id'] . '-search-input';
1720 1252
1721 - $input_atts = array(
1722 - 'type' => 'search',
1723 - 'id' => $input_id,
1724 - 'name' => 's',
1725 - 'placeholder' => $atts['placeholder'],
1726 - 'class' => $class,
1727 - 'data-tosearch' => $atts['tosearch'],
1728 - );
1729 -
1730 - if ( is_string( $atts['value'] ) ) {
1731 - $input_atts['value'] = $atts['value'];
1732 - } elseif ( isset( $_REQUEST['s'] ) ) {
1733 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1734 - $input_atts['value'] = wp_unslash( $_REQUEST['s'] );
1735 - }
1736 -
1737 - if ( ! empty( $atts['tosearch'] ) ) {
1738 - $input_atts['autocomplete'] = 'off';
1739 - }
1740 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1741 1253 ?>
1742 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1254 + <p class="frm-search">
1743 1255 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1744 1256 <?php echo esc_html( $atts['text'] ); ?>:
1745 1257 </label>
1746 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1747 - <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1258 + <span class="frmfont frm_search_icon"></span>
1259 + <input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s"
1260 + value="<?php _admin_search_query(); ?>" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>"
1261 + class="<?php echo esc_attr( $class ); ?>" data-tosearch="<?php echo esc_attr( $atts['tosearch'] ); ?>"
1262 + <?php if ( ! empty( $atts['tosearch'] ) ) { ?>
1263 + autocomplete="off"
1264 + <?php } ?>
1265 + />
1748 1266 <?php
1749 1267 if ( empty( $atts['tosearch'] ) ) {
1750 1268 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1751 1269 }
@@ -1751,21 +1269,16 @@
1751 1269 }
1752 1270 ?>
1753 1271 </p>
1754 1272 <?php
1755 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1756 1273 }
1757 1274
1758 1275 /**
1759 - * @param string $type Hook type slug.
1760 - * @param object|null $object Optional related object.
1761 - *
1762 - * @return void
1276 + * @param string $type
1763 1277 */
1764 1278 public static function trigger_hook_load( $type, $object = null ) {
1765 1279 // Only load the form hooks once.
1766 1280 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1767 -
1768 1281 if ( ! $hooks_loaded ) {
1769 1282 do_action( 'frm_load_' . $type . '_hooks' );
1770 1283 }
1771 1284 }
@@ -1770,14 +1283,11 @@
1770 1283 }
1771 1284 }
1772 1285
1773 1286 /**
1774 - * Save all front-end js scripts into a single file.
1775 - * And save an additional single file of all front-end Stripe JS scripts.
1287 + * Save all front-end js scripts into a single file
1776 1288 *
1777 1289 * @since 3.0
1778 - *
1779 - * @return void
1780 1290 */
1781 1291 public static function save_combined_js() {
1782 1292 $file_atts = apply_filters(
1783 1293 'frm_js_location',
@@ -1790,34 +1300,10 @@
1790 1300
1791 1301 $files = array(
1792 1302 self::plugin_path() . '/js/formidable.min.js',
1793 1303 );
1794 - /**
1795 - * @param array $files
1796 - */
1797 1304 $files = apply_filters( 'frm_combined_js_files', $files );
1798 1305 $new_file->combine_files( $files );
1799 -
1800 - // Create the minified Stripe Script.
1801 - $file_atts = apply_filters(
1802 - 'frm_stripe_js_location',
1803 - array(
1804 - 'file_name' => 'frmstrp.min.js',
1805 - 'new_file_path' => self::plugin_path() . '/js',
1806 - )
1807 - );
1808 - $new_file = new FrmCreateFile( $file_atts );
1809 - $files = array(
1810 - FrmStrpLiteAppHelper::plugin_path() . 'js/frmstrp.min.js',
1811 - );
1812 -
1813 - /**
1814 - * @since 6.5
1815 - *
1816 - * @param array $files
1817 - */
1818 - $files = apply_filters( 'frm_stripe_combined_js_files', $files );
1819 - $new_file->combine_files( $files );
1820 1306 }
1821 1307
1822 1308 /**
1823 1309 * Check a value from a shortcode to see if true or false.
@@ -1824,14 +1310,14 @@
1824 1310 * True when value is 1, true, 'true', 'yes'
1825 1311 *
1826 1312 * @since 1.07.10
1827 1313 *
1828 - * @param bool|int|string $value The value to compare.
1314 + * @param string $value The value to compare
1829 1315 *
1830 - * @return bool
1316 + * @return boolean True or False
1831 1317 */
1832 1318 public static function is_true( $value ) {
1833 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1319 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1834 1320 }
1835 1321
1836 1322 /**
1837 1323 * Gets all post from a specific post type.
@@ -1839,9 +1325,8 @@
1839 1325 *
1840 1326 * @since 4.10.01 Add `$post_type` argument.
1841 1327 *
1842 1328 * @param string $post_type Post type to query. Default is `page`.
1843 - *
1844 1329 * @return WP_Post[]
1845 1330 */
1846 1331 public static function get_pages( $post_type = 'page' ) {
1847 1332 $query = array(
@@ -1860,9 +1345,8 @@
1860 1345 *
1861 1346 * @since 5.0.09
1862 1347 *
1863 1348 * @param string $post_type Post type to query. Default is `page`.
1864 - *
1865 1349 * @return array
1866 1350 */
1867 1351 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1868 1352 return FrmDb::get_results(
@@ -1887,12 +1371,13 @@
1887 1371 *
1888 1372 * @param array $args Selection arguments.
1889 1373 */
1890 1374 public static function maybe_autocomplete_pages_options( $args ) {
1891 - $args = self::preformat_selection_args( $args );
1375 + $args = self::preformat_selection_args( $args );
1376 +
1892 1377 $pages_count = wp_count_posts( $args['post_type'] );
1893 1378
1894 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1379 + if ( $pages_count->publish <= 50 ) {
1895 1380 self::wp_pages_dropdown( $args );
1896 1381 return;
1897 1382 }
1898 1383
@@ -1898,9 +1383,9 @@
1898 1383
1899 1384 wp_enqueue_script( 'jquery-ui-autocomplete' );
1900 1385
1901 1386 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1902 - $title = '';
1387 + $title = '';
1903 1388
1904 1389 if ( $selected ) {
1905 1390 $title = get_the_title( $selected );
1906 1391 }
@@ -1916,119 +1401,18 @@
1916 1401 <?php
1917 1402 }
1918 1403
1919 1404 /**
1920 - * Maybe show an HTML select or autocomplete input based on the number of options.
1921 - *
1922 - * @since 6.21
1923 - *
1924 - * @param array $args Args. See the method for details.
1405 + * @param array $args
1406 + * @param string $page_id Deprecated.
1407 + * @param boolean $truncate Deprecated.
1925 1408 */
1926 - public static function maybe_autocomplete_options( $args ) {
1927 - $defaults = array(
1928 - 'truncate' => false,
1929 - 'placeholder' => ' ',
1930 - 'name' => '',
1931 - 'id' => '',
1932 - 'selected' => '',
1933 - 'source' => array(),
1934 - 'dropdown_limit' => 50,
1935 - 'autocomplete_placeholder' => __( 'Select an option', 'formidable' ),
1936 - 'value_key' => 'value',
1937 - 'label_key' => 'label',
1938 - );
1939 -
1940 - $args = wp_parse_args( $args, $defaults );
1941 - $html_attrs = array();
1942 -
1943 - if ( ! empty( $args['name'] ) ) {
1944 - $html_attrs['name'] = $args['name'];
1945 - }
1946 -
1947 - if ( ! empty( $args['id'] ) ) {
1948 - $html_attrs['id'] = $args['id'];
1949 - }
1950 -
1951 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1952 - if ( count( $args['source'] ) <= $args['dropdown_limit'] ) {
1953 - ?>
1954 - <select <?php self::array_to_html_params( $html_attrs, true ); ?>>
1955 - <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1956 - <?php
1957 - foreach ( $args['source'] as $key => $source ) :
1958 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1959 -
1960 - if ( ! empty( $args['truncate'] ) ) {
1961 - $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1962 - }
1963 - ?>
1964 - <option value="<?php echo esc_attr( $value_label['value'] ); ?>" <?php selected( $value_label['value'], $args['selected'] ); ?>><?php echo esc_html( $value_label['label'] ); ?></option><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1965 - <?php endforeach; ?>
1966 - </select>
1967 - <?php
1968 - return;
1969 - }
1970 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1971 -
1972 - $options = array();
1973 - $autocomplete_value = '';
1974 -
1975 - foreach ( $args['source'] as $key => $source ) {
1976 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1977 -
1978 - if ( $value_label['value'] === $args['selected'] ) {
1979 - $autocomplete_value = $value_label['label'];
1980 - }
1981 -
1982 - $options[] = $value_label;
1983 - }
1984 -
1985 - $html_attrs['type'] = 'hidden';
1986 - $html_attrs['class'] = 'frm_autocomplete_value_input';
1987 - $html_attrs['value'] = $args['selected'];
1988 - ?>
1989 - <input type="text" class="frm-custom-search"
1990 - data-source="<?php echo esc_attr( wp_json_encode( $options ) ); ?>"
1991 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1992 - value="<?php echo esc_attr( $autocomplete_value ); ?>" />
1993 - <input <?php self::array_to_html_params( $html_attrs, true ); ?> />
1994 - <?php
1995 - }
1996 -
1997 - /**
1998 - * Gets dropdown value and label from autodropdown option.
1999 - *
2000 - * @since 6.21
2001 - *
2002 - * @param array|string $option Autocomplete option.
2003 - * @param string $key Array key of the option.
2004 - * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
2005 - *
2006 - * @return array
2007 - */
2008 - private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
2009 - if ( is_array( $option ) ) {
2010 - $value = $option[ $args['value_key'] ] ?? '';
2011 - $label = $option[ $args['label_key'] ] ?? '';
2012 - } else {
2013 - $value = $key;
2014 - $label = $option;
2015 - }
2016 -
2017 - return compact( 'value', 'label' );
2018 - }
2019 -
2020 - /**
2021 - * @param array $args
2022 - * @param string $page_id Deprecated.
2023 - * @param bool $truncate Deprecated.
2024 - */
2025 1409 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2026 1410 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2027 1411
2028 1412 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2029 1413 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
2030 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1414 +
2031 1415 ?>
2032 1416 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2033 1417 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2034 1418 <?php foreach ( $pages as $page ) { ?>
@@ -2037,9 +1421,8 @@
2037 1421 </option>
2038 1422 <?php } ?>
2039 1423 </select>
2040 1424 <?php
2041 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2042 1425 }
2043 1426
2044 1427 /**
2045 1428 * Fill in missing parameters passed to wp_pages_dropdown().
@@ -2045,14 +1428,8 @@
2045 1428 * Fill in missing parameters passed to wp_pages_dropdown().
2046 1429 * This is for reverse compatibility with switching 3 params to 1.
2047 1430 *
2048 1431 * @since 4.03.06
2049 - *
2050 - * @param string $page_id Deprecated.
2051 - * @param bool $truncate Deprecated.
2052 - * @param mixed $args
2053 - *
2054 - * @return void
2055 1432 */
2056 1433 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2057 1434 if ( ! is_array( $args ) ) {
2058 1435 $args = array(
@@ -2069,20 +1446,16 @@
2069 1446 * Filter to format args for page dropdown or autocomplete
2070 1447 *
2071 1448 * @since 4.03.06
2072 1449 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2073 - *
2074 - * @param array $args
2075 - *
2076 - * @return array
2077 1450 */
2078 1451 private static function preformat_selection_args( $args ) {
2079 1452 $defaults = array(
2080 - 'truncate' => false,
2081 - 'placeholder' => ' ',
2082 - 'field_name' => '',
2083 - 'page_id' => '',
2084 - 'post_type' => 'page',
1453 + 'truncate' => false,
1454 + 'placeholder' => ' ',
1455 + 'field_name' => '',
1456 + 'page_id' => '',
1457 + 'post_type' => 'page',
2085 1458 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
2086 1459 );
2087 1460
2088 1461 return array_merge( $defaults, $args );
@@ -2087,18 +1460,13 @@
2087 1460
2088 1461 return array_merge( $defaults, $args );
2089 1462 }
2090 1463
2091 - /**
2092 - * @param int $post_id
2093 - *
2094 - * @return string
2095 - */
2096 1464 public static function post_edit_link( $post_id ) {
2097 1465 $post = get_post( $post_id );
2098 -
2099 1466 if ( $post ) {
2100 1467 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1468 +
2101 1469 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2102 1470 }
2103 1471
2104 1472 return '';
@@ -2111,9 +1479,11 @@
2111 1479 *
2112 1480 * @return bool
2113 1481 */
2114 1482 public static function is_full_screen() {
2115 - return self::is_form_builder_page() || self::is_style_editor_page() || self::is_full_screen_view_builder_page();
1483 + return self::is_form_builder_page() ||
1484 + self::is_style_editor_page() ||
1485 + self::is_full_screen_view_builder_page();
2116 1486 }
2117 1487
2118 1488 /**
2119 1489 * Check if user is on the style editor or its alternative URL.
@@ -2123,9 +1493,8 @@
2123 1493 * @since 5.5.3
2124 1494 * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2125 1495 *
2126 1496 * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2127 - *
2128 1497 * @return bool
2129 1498 */
2130 1499 public static function is_style_editor_page( $view = '' ) {
2131 1500 if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
@@ -2157,29 +1526,35 @@
2157 1526 return self::is_admin_page( 'formidable-views-editor' );
2158 1527 }
2159 1528
2160 1529 /**
2161 - * @param string $field_name
2162 - * @param array|string $capability
2163 - * @param string $multiple 'single' and 'multiple'.
1530 + * @since 4.0
1531 + * @deprecated 5.5.3
2164 1532 */
1533 + public static function maybe_full_screen_link( $link ) {
1534 + _deprecated_function( __METHOD__, '5.5.3' );
1535 + return $link;
1536 + }
1537 +
1538 + /**
1539 + * @param string $field_name
1540 + * @param string|array $capability
1541 + * @param string $multiple 'single' and 'multiple'
1542 + */
2165 1543 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2166 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
2167 1544 ?>
2168 1545 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2169 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1546 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2170 1547 class="frm_multiselect">
2171 1548 <?php self::roles_options( $capability ); ?>
2172 1549 </select>
2173 1550 <?php
2174 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2175 1551 }
2176 1552
2177 1553 /**
2178 1554 * @since 4.07
2179 - *
2180 1555 * @param array|string $selected
2181 - * @param string $current
1556 + * @param string $current
2182 1557 */
2183 1558 private static function selected( $selected, $current ) {
2184 1559 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2185 1560 FrmProAppHelper::selected( $selected, $current );
@@ -2188,13 +1563,12 @@
2188 1563 }
2189 1564 }
2190 1565
2191 1566 /**
2192 - * @param array|string $capability
1567 + * @param string|array $capability
2193 1568 */
2194 1569 public static function roles_options( $capability ) {
2195 1570 global $frm_vars;
2196 -
2197 1571 if ( isset( $frm_vars['editable_roles'] ) ) {
2198 1572 $editable_roles = $frm_vars['editable_roles'];
2199 1573 } else {
2200 1574 $editable_roles = get_editable_roles();
@@ -2203,9 +1577,9 @@
2203 1577
2204 1578 foreach ( $editable_roles as $role => $details ) {
2205 1579 $name = translate_user_role( $details['name'] );
2206 1580 ?>
2207 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1581 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_attr( $name ); ?> </option>
2208 1582 <?php
2209 1583 unset( $role, $details );
2210 1584 }
2211 1585 }
@@ -2215,9 +1589,8 @@
2215 1589 *
2216 1590 * @since 5.0 Parameter `$type` supports `pro_only` value.
2217 1591 *
2218 1592 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2219 - *
2220 1593 * @return array
2221 1594 */
2222 1595 public static function frm_capabilities( $type = 'auto' ) {
2223 1596 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2227,8 +1600,9 @@
2227 1600 $pro_cap = array(
2228 1601 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2229 1602 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2230 1603 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1604 + 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
2231 1605 );
2232 1606 /**
2233 1607 * @since 5.3.1
2234 1608 *
@@ -2251,9 +1625,9 @@
2251 1625 * @return array<string,string>
2252 1626 */
2253 1627 private static function get_lite_capabilities() {
2254 1628 return array(
2255 - 'frm_view_forms' => __( 'View Forms List', 'formidable' ),
1629 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
2256 1630 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2257 1631 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2258 1632 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2259 1633 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
@@ -2282,18 +1656,21 @@
2282 1656 if ( $role === 'loggedin' || ! $role ) {
2283 1657 return is_user_logged_in();
2284 1658 }
2285 1659
2286 - if ( (int) $role === 1 ) {
1660 + if ( $role == 1 ) {
2287 1661 $role = 'administrator';
2288 1662 }
2289 1663
2290 - return is_user_logged_in() ? current_user_can( $role ) : false;
1664 + if ( ! is_user_logged_in() ) {
1665 + return false;
1666 + }
1667 +
1668 + return current_user_can( $role );
2291 1669 }
2292 1670
2293 1671 /**
2294 - * @param array|string $needed_role
2295 - *
1672 + * @param string|array $needed_role
2296 1673 * @return bool
2297 1674 */
2298 1675 public static function user_has_permission( $needed_role ) {
2299 1676 if ( is_array( $needed_role ) ) {
@@ -2307,20 +1684,18 @@
2307 1684 }
2308 1685
2309 1686 $can = self::current_user_can( $needed_role );
2310 1687
2311 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
1688 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2312 1689 return $can;
2313 1690 }
2314 1691
2315 1692 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2316 -
2317 1693 foreach ( $roles as $role ) {
2318 1694 if ( current_user_can( $role ) ) {
2319 1695 return true;
2320 1696 }
2321 -
2322 - if ( $role === $needed_role ) {
1697 + if ( $role == $needed_role ) {
2323 1698 break;
2324 1699 }
2325 1700 }
2326 1701
@@ -2338,11 +1713,11 @@
2338 1713 if ( ! current_user_can( 'administrator' ) || current_user_can( 'frm_view_forms' ) ) {
2339 1714 return;
2340 1715 }
2341 1716
2342 - $user = new WP_User( get_current_user_id() );
1717 + $user_id = get_current_user_id();
1718 + $user = new WP_User( $user_id );
2343 1719 $frm_roles = self::frm_capabilities();
2344 -
2345 1720 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2346 1721 $user->add_cap( $frm_role );
2347 1722 unset( $frm_role, $frm_role_description );
2348 1723 }
@@ -2351,47 +1726,35 @@
2351 1726 /**
2352 1727 * Make sure admins have permission to see the menu items
2353 1728 *
2354 1729 * @since 2.0.6
2355 - *
2356 - * @param string $cap
2357 - *
2358 - * @return void
2359 1730 */
2360 1731 public static function force_capability( $cap = 'frm_change_settings' ) {
2361 - if ( ! current_user_can( 'administrator' ) || current_user_can( $cap ) ) {
2362 - return;
1732 + if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
1733 + $role = get_role( 'administrator' );
1734 + $frm_roles = self::frm_capabilities();
1735 + foreach ( $frm_roles as $frm_role => $frm_role_description ) {
1736 + $role->add_cap( $frm_role );
1737 + }
2363 1738 }
2364 -
2365 - $role = get_role( 'administrator' );
2366 - $frm_roles = self::frm_capabilities();
2367 -
2368 - foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2369 - $role->add_cap( $frm_role );
2370 - }
2371 1739 }
2372 1740
2373 1741 /**
2374 - * Check if the user has permission for action.
1742 + * Check if the user has permision for action.
2375 1743 * Return permission message and stop the action if no permission
2376 1744 *
2377 1745 * @since 2.0
2378 1746 *
2379 1747 * @param string $permission
2380 - * @param string $show_message
2381 1748 */
2382 1749 public static function permission_check( $permission, $show_message = 'show' ) {
2383 1750 $permission_error = self::permission_nonce_error( $permission );
2384 -
2385 - if ( $permission_error === false ) {
2386 - return;
1751 + if ( $permission_error !== false ) {
1752 + if ( 'hide' == $show_message ) {
1753 + $permission_error = '';
1754 + }
1755 + wp_die( esc_html( $permission_error ) );
2387 1756 }
2388 -
2389 - if ( 'hide' === $show_message ) {
2390 - $permission_error = '';
2391 - }
2392 -
2393 - wp_die( esc_html( $permission_error ) );
2394 1757 }
2395 1758
2396 1759 /**
2397 1760 * Check user permission and nonce
@@ -2398,27 +1761,24 @@
2398 1761 *
2399 1762 * @since 2.0
2400 1763 *
2401 1764 * @param string $permission
2402 - * @param string $nonce_name
2403 - * @param string $nonce
2404 1765 *
2405 1766 * @return false|string The permission message or false if allowed
2406 1767 */
2407 1768 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2408 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
1769 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2409 1770 $frm_settings = self::get_settings();
1771 +
2410 1772 return $frm_settings->admin_permission;
2411 1773 }
2412 1774
2413 1775 $error = false;
2414 -
2415 - if ( ! $nonce_name ) {
1776 + if ( empty( $nonce_name ) ) {
2416 1777 return $error;
2417 1778 }
2418 1779
2419 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2420 -
1780 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2421 1781 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2422 1782 $frm_settings = self::get_settings();
2423 1783 $error = $frm_settings->admin_permission;
2424 1784 }
@@ -2425,14 +1785,8 @@
2425 1785
2426 1786 return $error;
2427 1787 }
2428 1788
2429 - /**
2430 - * @param array|string $values
2431 - * @param string $current
2432 - *
2433 - * @return void
2434 - */
2435 1789 public static function checked( $values, $current ) {
2436 1790 if ( self::check_selected( $values, $current ) ) {
2437 1791 echo ' checked="checked"';
2438 1792 }
@@ -2437,74 +1791,40 @@
2437 1791 echo ' checked="checked"';
2438 1792 }
2439 1793 }
2440 1794
2441 - /**
2442 - * @param array|string $values
2443 - * @param string|null $current
2444 - *
2445 - * @return bool
2446 - */
2447 1795 public static function check_selected( $values, $current ) {
2448 1796 $values = self::recursive_function_map( $values, 'trim' );
2449 1797 $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2450 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
1798 + $current = htmlspecialchars_decode( trim( $current ) );
2451 1799
2452 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2453 - return is_array( $values ) ? in_array( $current, $values ) : $values == $current;
1800 + return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2454 1801 }
2455 1802
2456 - /**
2457 - * @param array|string $value
2458 - * @param callable|string $function
2459 - *
2460 - * @return array|string
2461 - */
2462 1803 public static function recursive_function_map( $value, $function ) {
2463 1804 if ( is_array( $value ) ) {
2464 1805 $original_function = $function;
2465 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2466 -
2467 - if ( self::is_assoc( $value ) ) {
1806 + if ( count( $value ) ) {
1807 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
1808 + } else {
1809 + $function = array( $function );
1810 + }
1811 + if ( ! self::is_assoc( $value ) ) {
1812 + $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
1813 + } else {
2468 1814 foreach ( $value as $k => $v ) {
2469 1815 if ( ! is_array( $v ) ) {
2470 1816 $value[ $k ] = call_user_func( $original_function, $v );
2471 1817 }
2472 1818 }
2473 - } else {
2474 - $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2475 1819 }
2476 1820 } else {
2477 - $value = self::maybe_update_value_if_null( $value, $function );
2478 1821 $value = call_user_func( $function, $value );
2479 - }//end if
2480 -
2481 - return $value;
2482 - }
2483 -
2484 - /**
2485 - * Updates value to empty string if it is null and being passed to a string function.
2486 - *
2487 - * @since 6.8.4
2488 - *
2489 - * @param mixed $value
2490 - * @param string $function
2491 - *
2492 - * @return mixed
2493 - */
2494 - private static function maybe_update_value_if_null( $value, $function ) {
2495 - if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
2496 - return '';
2497 1822 }
2498 1823
2499 1824 return $value;
2500 1825 }
2501 1826
2502 - /**
2503 - * @param array $array
2504 - *
2505 - * @return bool
2506 - */
2507 1827 public static function is_assoc( $array ) {
2508 1828 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2509 1829 }
2510 1830
@@ -2509,24 +1829,20 @@
2509 1829 }
2510 1830
2511 1831 /**
2512 1832 * Flatten a multi-dimensional array
2513 - *
2514 - * @param array $array
2515 - * @param string $keys
2516 - *
2517 - * @return array
2518 1833 */
2519 1834 public static function array_flatten( $array, $keys = 'keep' ) {
2520 1835 $return = array();
2521 -
2522 1836 foreach ( $array as $key => $value ) {
2523 1837 if ( is_array( $value ) ) {
2524 1838 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2525 - } elseif ( $keys === 'keep' ) {
2526 - $return[ $key ] = $value;
2527 1839 } else {
2528 - $return[] = $value;
1840 + if ( $keys == 'keep' ) {
1841 + $return[ $key ] = $value;
1842 + } else {
1843 + $return[] = $value;
1844 + }
2529 1845 }
2530 1846 }
2531 1847
2532 1848 return $return;
@@ -2531,43 +1847,16 @@
2531 1847
2532 1848 return $return;
2533 1849 }
2534 1850
2535 - /**
2536 - * Flatten an array before imploding it to avoid Array to string conversion warnings.
2537 - *
2538 - * @since 6.16.1
2539 - *
2540 - * @param string $sep
2541 - * @param array $array
2542 - *
2543 - * @return string
2544 - */
2545 - public static function safe_implode( $sep, $array ) {
2546 - $array = self::array_flatten( $array );
2547 - return implode( $sep, $array );
2548 - }
2549 -
2550 - /**
2551 - * @param string $text
2552 - * @param bool $is_rich_text
2553 - *
2554 - * @return string
2555 - */
2556 1851 public static function esc_textarea( $text, $is_rich_text = false ) {
2557 1852 $safe_text = str_replace( '&quot;', '"', $text );
2558 -
2559 1853 if ( ! $is_rich_text ) {
2560 1854 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2561 1855 }
2562 -
2563 1856 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2564 1857
2565 - /**
2566 - * @param string $safe_text
2567 - * @param string $text
2568 - */
2569 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1858 + return apply_filters( 'esc_textarea', $safe_text, $text );
2570 1859 }
2571 1860
2572 1861 /**
2573 1862 * Add auto paragraphs to text areas
@@ -2572,59 +1861,44 @@
2572 1861 /**
2573 1862 * Add auto paragraphs to text areas
2574 1863 *
2575 1864 * @since 2.0
2576 - *
2577 - * @param mixed $content
2578 - *
2579 - * @return mixed
2580 1865 */
2581 1866 public static function use_wpautop( $content ) {
2582 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2583 - return wpautop( str_replace( '<br>', '<br />', $content ) );
1867 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
1868 + $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2584 1869 }
2585 1870
2586 1871 return $content;
2587 1872 }
2588 1873
2589 - /**
2590 - * Replace quotes with their HTML entities.
2591 - *
2592 - * @param string $val
2593 - *
2594 - * @return string
2595 - */
2596 1874 public static function replace_quotes( $val ) {
2597 1875 // Replace double quotes.
2598 1876 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2599 1877
2600 1878 // Replace single quotes.
2601 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1879 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1880 +
1881 + return $val;
2602 1882 }
2603 1883
2604 1884 /**
2605 - * @param string $handle
2606 - * @param int|string $default
2607 - *
2608 - * @return int|string
1885 + * @param string $handle
2609 1886 */
2610 1887 public static function script_version( $handle, $default = 0 ) {
2611 1888 global $wp_scripts;
2612 -
2613 1889 if ( ! $wp_scripts ) {
2614 1890 return $default;
2615 1891 }
2616 1892
2617 1893 $ver = $default;
2618 -
2619 1894 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2620 1895 return $ver;
2621 1896 }
2622 1897
2623 1898 $query = $wp_scripts->registered[ $handle ];
2624 -
2625 1899 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2626 - return $query->ver;
1900 + $ver = $query->ver;
2627 1901 }
2628 1902
2629 1903 return $ver;
2630 1904 }
@@ -2633,23 +1907,17 @@
2633 1907 * @since 5.0.13 added $echo param.
2634 1908 *
2635 1909 * @param string $url
2636 1910 * @param bool $echo
2637 - *
2638 - * @return string|null
1911 + * @return string|void
2639 1912 */
2640 1913 public static function js_redirect( $url, $echo = false ) {
2641 - $callback = function () use ( $url ) {
1914 + $callback = function() use ( $url ) {
2642 1915 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2643 1916 };
2644 1917 return self::clip( $callback, $echo );
2645 1918 }
2646 1919
2647 - /**
2648 - * @param int|string $user_id
2649 - *
2650 - * @return int|string
2651 - */
2652 1920 public static function get_user_id_param( $user_id ) {
2653 1921 if ( ! $user_id || is_numeric( $user_id ) ) {
2654 1922 return $user_id;
2655 1923 }
@@ -2654,13 +1922,16 @@
2654 1922 return $user_id;
2655 1923 }
2656 1924
2657 1925 $user_id = sanitize_text_field( $user_id );
2658 -
2659 - if ( $user_id === 'current' ) {
1926 + if ( $user_id == 'current' ) {
2660 1927 $user_id = get_current_user_id();
2661 1928 } else {
2662 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
1929 + if ( is_email( $user_id ) ) {
1930 + $user = get_user_by( 'email', $user_id );
1931 + } else {
1932 + $user = get_user_by( 'login', $user_id );
1933 + }
2663 1934
2664 1935 if ( $user ) {
2665 1936 $user_id = $user->ID;
2666 1937 }
@@ -2669,14 +1940,8 @@
2669 1940
2670 1941 return $user_id;
2671 1942 }
2672 1943
2673 - /**
2674 - * @param string $filename
2675 - * @param array $atts
2676 - *
2677 - * @return false|string
2678 - */
2679 1944 public static function get_file_contents( $filename, $atts = array() ) {
2680 1945 if ( ! is_file( $filename ) ) {
2681 1946 return false;
2682 1947 }
@@ -2682,10 +1947,13 @@
2682 1947 }
2683 1948
2684 1949 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2685 1950 ob_start();
2686 - include $filename;
2687 - return ob_get_clean();
1951 + include( $filename );
1952 + $contents = ob_get_contents();
1953 + ob_end_clean();
1954 +
1955 + return $contents;
2688 1956 }
2689 1957
2690 1958 /**
2691 1959 * @param string $name
@@ -2695,9 +1963,8 @@
2695 1963 * @param int $num_chars
2696 1964 */
2697 1965 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2698 1966 $key = '';
2699 -
2700 1967 if ( $name ) {
2701 1968 $key = sanitize_key( $name );
2702 1969 $key = self::maybe_clear_long_key( $key, $column );
2703 1970 }
@@ -2717,31 +1984,31 @@
2717 1984 $column
2718 1985 );
2719 1986
2720 1987 // Create a unique field id if it has already been used.
2721 - if ( ! in_array( $key, $similar_keys, true ) ) {
2722 - return $key;
2723 - }
1988 + if ( in_array( $key, $similar_keys, true ) ) {
1989 + $key = self::maybe_truncate_key_before_appending( $column, $key );
2724 1990
2725 - $key = self::maybe_truncate_key_before_appending( $column, $key );
1991 + /**
1992 + * Allow for a custom separator between the attempted key and the generated suffix.
1993 + *
1994 + * @since 5.2.03
1995 + *
1996 + * @param string $separator. Default empty.
1997 + * @param string $key the key without the added suffix.
1998 + */
1999 + $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2726 2000
2727 - /**
2728 - * Allow for a custom separator between the attempted key and the generated suffix.
2729 - *
2730 - * @since 5.2.03
2731 - *
2732 - * @param string $separator. Default empty.
2733 - * @param string $key the key without the added suffix.
2734 - */
2735 - $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2001 + $suffix = 2;
2002 + do {
2003 + $key_check = $key . $separator . $suffix;
2004 + ++$suffix;
2005 + } while ( in_array( $key_check, $similar_keys, true ) );
2736 2006
2737 - $suffix = 2;
2738 - do {
2739 - $key_check = $key . $separator . $suffix;
2740 - ++$suffix;
2741 - } while ( in_array( $key_check, $similar_keys, true ) );
2007 + $key = $key_check;
2008 + }
2742 2009
2743 - return $key_check;
2010 + return $key;
2744 2011 }
2745 2012
2746 2013 /**
2747 2014 * Avoid trying to append to a really long key,
@@ -2748,26 +2015,20 @@
2748 2015 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2749 2016 *
2750 2017 * @param string $column
2751 2018 * @param string $key
2752 - *
2753 2019 * @return string
2754 2020 */
2755 2021 private static function maybe_truncate_key_before_appending( $column, $key ) {
2756 - if ( ! in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2757 - return $key;
2758 - }
2759 -
2760 - $max_key_length_before_truncating = 60;
2761 -
2762 - if ( strlen( $key ) > $max_key_length_before_truncating ) {
2763 - $key = substr( $key, 0, $max_key_length_before_truncating );
2764 -
2765 - if ( is_numeric( $key ) ) {
2766 - $key .= 'a';
2022 + if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2023 + $max_key_length_before_truncating = 60;
2024 + if ( strlen( $key ) > $max_key_length_before_truncating ) {
2025 + $key = substr( $key, 0, $max_key_length_before_truncating );
2026 + if ( is_numeric( $key ) ) {
2027 + $key .= 'a';
2028 + }
2767 2029 }
2768 2030 }
2769 -
2770 2031 return $key;
2771 2032 }
2772 2033
2773 2034 /**
@@ -2774,36 +2035,29 @@
2774 2035 * Possibly reset a key to avoid conflicts with column size limits.
2775 2036 *
2776 2037 * @param string $key
2777 2038 * @param string $column
2778 - *
2779 2039 * @return string either the original key value, or an empty string if the key was too long.
2780 2040 */
2781 2041 private static function maybe_clear_long_key( $key, $column ) {
2782 2042 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2783 - return '';
2043 + $key = '';
2784 2044 }
2785 2045 return $key;
2786 2046 }
2787 2047
2788 2048 /**
2789 - * @since 6.21 This is changed from `private` to `public`.
2790 - *
2791 2049 * @param int $num_chars
2792 - *
2793 2050 * @return string
2794 2051 */
2795 - public static function generate_new_key( $num_chars ) {
2796 - $max_slug_value = 36 ** $num_chars;
2797 -
2798 - // We want to have at least 2 characters in the slug.
2799 - $min_slug_value = 37;
2800 - return base_convert( random_int( $min_slug_value, $max_slug_value ), 10, 36 );
2052 + private static function generate_new_key( $num_chars ) {
2053 + $max_slug_value = pow( 36, $num_chars );
2054 + $min_slug_value = 37; // we want to have at least 2 characters in the slug
2055 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2801 2056 }
2802 2057
2803 2058 /**
2804 2059 * @param string $key
2805 - *
2806 2060 * @return string
2807 2061 */
2808 2062 private static function prevent_numeric_and_reserved_keys( $key ) {
2809 2063 if ( is_numeric( $key ) ) {
@@ -2817,14 +2071,12 @@
2817 2071 'editlink',
2818 2072 'siteurl',
2819 2073 'evenodd',
2820 2074 );
2821 -
2822 2075 if ( in_array( $key, $not_allowed, true ) ) {
2823 2076 $key .= 'a';
2824 2077 }
2825 2078 }
2826 -
2827 2079 return $key;
2828 2080 }
2829 2081
2830 2082 /**
@@ -2829,16 +2081,11 @@
2829 2081
2830 2082 /**
2831 2083 * Editing a Form or Entry
2832 2084 *
2833 - * @param object $record
2834 - * @param string $table
2835 - * @param array|string $fields
2836 - * @param bool $default
2837 - * @param array $post_values
2838 - * @param array $args
2085 + * @param string $table
2839 2086 *
2840 - * @return array|bool
2087 + * @return bool|array
2841 2088 */
2842 2089 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2843 2090 if ( ! $record ) {
2844 2091 return false;
@@ -2843,9 +2090,9 @@
2843 2090 if ( ! $record ) {
2844 2091 return false;
2845 2092 }
2846 2093
2847 - if ( ! $post_values ) {
2094 + if ( empty( $post_values ) ) {
2848 2095 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2849 2096 }
2850 2097
2851 2098 $values = array(
@@ -2853,9 +2100,9 @@
2853 2100 'fields' => array(),
2854 2101 );
2855 2102
2856 2103 foreach ( array( 'name', 'description' ) as $var ) {
2857 - $default_val = $record->{$var} ?? '';
2104 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2858 2105 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2859 2106 unset( $var, $default_val );
2860 2107 }
2861 2108
@@ -2873,67 +2120,48 @@
2873 2120
2874 2121 return $values;
2875 2122 }
2876 2123
2877 - /**
2878 - * @param array|string $fields
2879 - * @param object $record
2880 - * @param array $values
2881 - * @param array $args
2882 - *
2883 - * @return void
2884 - */
2885 2124 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2886 - if ( ! $fields ) {
2887 - return;
2888 - }
2889 -
2890 - foreach ( (array) $fields as $field ) {
2891 - if ( ! self::is_admin_page() ) {
2892 - // Don't prep default values on the form settings page.
2893 - $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2125 + if ( ! empty( $fields ) ) {
2126 + foreach ( (array) $fields as $field ) {
2127 + if ( ! self::is_admin_page() ) {
2128 + // Don't prep default values on the form settings page.
2129 + $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2130 + }
2131 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2132 + self::fill_field_defaults( $field, $record, $values, $args );
2894 2133 }
2895 -
2896 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2897 - self::fill_field_defaults( $field, $record, $values, $args );
2898 2134 }
2899 2135 }
2900 2136
2901 - /**
2902 - * @param object $field
2903 - * @param object $record
2904 - * @param array $values
2905 - * @param array $args
2906 - *
2907 - * @return void
2908 - */
2909 2137 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2910 2138 $post_values = $args['post_values'];
2911 2139
2912 2140 if ( $args['default'] ) {
2913 2141 $meta_value = $field->default_value;
2914 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2915 - if ( ! isset( $field->field_options['custom_field'] ) ) {
2916 - $field->field_options['custom_field'] = '';
2142 + } else {
2143 + if ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2144 + if ( ! isset( $field->field_options['custom_field'] ) ) {
2145 + $field->field_options['custom_field'] = '';
2146 + }
2147 + $meta_value = FrmProEntryMetaHelper::get_post_value(
2148 + $record->post_id,
2149 + $field->field_options['post_field'],
2150 + $field->field_options['custom_field'],
2151 + array(
2152 + 'truncate' => false,
2153 + 'type' => $field->type,
2154 + 'form_id' => $field->form_id,
2155 + 'field' => $field,
2156 + )
2157 + );
2158 + } else {
2159 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2917 2160 }
2161 + }
2918 2162
2919 - $meta_value = FrmProEntryMetaHelper::get_post_value(
2920 - $record->post_id,
2921 - $field->field_options['post_field'],
2922 - $field->field_options['custom_field'],
2923 - array(
2924 - 'truncate' => false,
2925 - 'type' => $field->type,
2926 - 'form_id' => $field->form_id,
2927 - 'field' => $field,
2928 - )
2929 - );
2930 - } else {
2931 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2932 - }//end if
2933 -
2934 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2935 -
2163 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2936 2164 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2937 2165 $new_value = $post_values['item_meta'][ $field->id ];
2938 2166 self::unserialize_or_decode( $new_value );
2939 2167 } else {
@@ -2948,9 +2176,9 @@
2948 2176 $args['field_type'] = $field_type;
2949 2177
2950 2178 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2951 2179
2952 - if ( empty( $field_array['unique'] ) ) {
2180 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2953 2181 $field_array['unique_msg'] = '';
2954 2182 }
2955 2183
2956 2184 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2979,15 +2207,12 @@
2979 2207 );
2980 2208 }
2981 2209
2982 2210 /**
2983 - * @param object $record
2984 2211 * @param string $table
2985 - * @param array $post_values
2986 - * @param array $values
2987 2212 */
2988 2213 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
2989 - if ( $table === 'entries' ) {
2214 + if ( $table == 'entries' ) {
2990 2215 $form = $record->form_id;
2991 2216 FrmForm::maybe_get_form( $form );
2992 2217 } else {
2993 2218 $form = $record;
@@ -3017,21 +2242,15 @@
3017 2242 }
3018 2243
3019 2244 /**
3020 2245 * Set to POST value or default
3021 - *
3022 - * @param array $post_values
3023 - * @param array $values
3024 - *
3025 - * @return void
3026 2246 */
3027 2247 private static function fill_form_defaults( $post_values, array &$values ) {
3028 2248 $form_defaults = FrmFormsHelper::get_default_opts();
3029 2249
3030 2250 foreach ( $form_defaults as $opt => $default ) {
3031 - // phpcs:ignore Universal.Operators.StrictComparisons
3032 2251 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3033 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2252 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3034 2253 }
3035 2254
3036 2255 unset( $opt, $default );
3037 2256 }
@@ -3041,9 +2260,9 @@
3041 2260 }
3042 2261
3043 2262 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3044 2263 if ( ! isset( $values[ $h . '_html' ] ) ) {
3045 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2264 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3046 2265 }
3047 2266 unset( $h );
3048 2267 }
3049 2268 }
@@ -3052,70 +2271,46 @@
3052 2271 * @since 2.2.10
3053 2272 *
3054 2273 * @param array $post_values
3055 2274 *
3056 - * @return bool|int
2275 + * @return boolean|int
3057 2276 */
3058 2277 public static function custom_style_value( $post_values ) {
3059 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3060 - return absint( $post_values['options']['custom_style'] );
2278 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2279 + $custom_style = absint( $post_values['options']['custom_style'] );
2280 + } else {
2281 + $frm_settings = self::get_settings();
2282 + $custom_style = ( $frm_settings->load_style != 'none' );
3061 2283 }
3062 2284
3063 - $frm_settings = self::get_settings();
3064 - return $frm_settings->load_style !== 'none';
2285 + return $custom_style;
3065 2286 }
3066 2287
3067 - /**
3068 - * Truncate a string.
3069 - *
3070 - * Note: By default, this function will allow for a few additional characters more than $length.
3071 - * If a string has no spaces, it allows up to 50 additional characters. To force a true length limit,
3072 - * use $force_length_limit = true.
3073 - *
3074 - * @param mixed $original_string
3075 - * @param int|string $length
3076 - * @param int $minword
3077 - * @param string $continue
3078 - * @param bool $force_length_limit Force the final string to never exceed the length limit.
3079 - *
3080 - * @return string
3081 - */
3082 - public static function truncate( $original_string, $length, $minword = 3, $continue = '...', $force_length_limit = false ) {
3083 - if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
2288 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2289 + if ( is_array( $str ) ) {
3084 2290 return '';
3085 2291 }
3086 2292
3087 - $length = (int) $length;
2293 + $length = (int) $length;
2294 + $str = wp_strip_all_tags( $str );
2295 + $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3088 2296
3089 - if ( $length === 0 ) {
2297 + if ( $length == 0 ) {
3090 2298 return '';
3091 - }
3092 -
3093 - $str = wp_strip_all_tags( (string) $original_string );
3094 - $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3095 -
3096 - if ( $length <= 10 ) {
2299 + } elseif ( $length <= 10 ) {
3097 2300 $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3098 2301
3099 - if ( $force_length_limit ) {
3100 - return $sub;
3101 - }
2302 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
2303 + }
3102 2304
3103 - return $sub . ( $length < $original_len ? $continue : '' );
3104 - }
2305 + $sub = '';
2306 + $len = 0;
3105 2307
3106 - $sub = '';
3107 - $len = 0;
3108 2308 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3109 2309
3110 - if ( ! is_array( $words ) ) {
3111 - return $original_string;
3112 - }
3113 -
3114 2310 foreach ( $words as $word ) {
3115 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2311 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3116 2312 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3117 -
3118 2313 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3119 2314 break;
3120 2315 }
3121 2316
@@ -3128,72 +2323,14 @@
3128 2323
3129 2324 unset( $total_len, $word );
3130 2325 }
3131 2326
3132 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length, $force_length_limit );
3133 -
3134 - if ( $force_length_limit ) {
3135 - // Ensure the final string doesn't exceed the length limit.
3136 - $final_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub ) );
3137 -
3138 - if ( $final_len > $length ) {
3139 - return self::mb_function( array( 'mb_substr', 'substr' ), array( $sub, 0, $length ) );
3140 - }
3141 -
3142 - return $sub;
3143 - }
3144 -
3145 - return $sub . ( $len < $original_len ? $continue : '' );
2327 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3146 2328 }
3147 2329
3148 - /**
3149 - * If the string is still too long because there may not have been any spaces, force truncate.
3150 - *
3151 - * @since 6.5.4
3152 - *
3153 - * @param string $sub Current substring.
3154 - * @param int $length The length limit.
3155 - * @param bool $force_length_limit Force the string to not exceed the length limit.
3156 - *
3157 - * @return string
3158 - */
3159 - private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length, $force_length_limit = false ) {
3160 - if ( ! $force_length_limit ) {
3161 - if ( strlen( $sub ) < $length + 50 ) {
3162 - // If the string isn't way over the limit, leave it.
3163 - return $sub;
3164 - }
3165 -
3166 - $first_space = strpos( $sub, ' ', $length );
3167 -
3168 - if ( false !== $first_space ) {
3169 - // Ignore anything with spaces.
3170 - return $sub;
3171 - }
3172 -
3173 - return substr( $sub, 0, $length + 10 );
3174 - }
3175 -
3176 - // When force_length_limit is true, ensure the string doesn't exceed the length.
3177 - $final_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub ) );
3178 -
3179 - if ( $final_len > $length ) {
3180 - return self::mb_function( array( 'mb_substr', 'substr' ), array( $sub, 0, $length ) );
3181 - }
3182 -
3183 - return $sub;
3184 - }
3185 -
3186 - /**
3187 - * @param array $function_names
3188 - * @param array $args
3189 - *
3190 - * @return mixed
3191 - */
3192 2330 public static function mb_function( $function_names, $args ) {
3193 2331 $mb_function_name = $function_names[0];
3194 2332 $function_name = $function_names[1];
3195 -
3196 2333 if ( function_exists( $mb_function_name ) ) {
3197 2334 $function_name = $mb_function_name;
3198 2335 }
3199 2336
@@ -3199,21 +2336,14 @@
3199 2336
3200 2337 return call_user_func_array( $function_name, $args );
3201 2338 }
3202 2339
3203 - /**
3204 - * @param string $date
3205 - * @param string $date_format
3206 - * @param string $time_format
3207 - *
3208 - * @return string
3209 - */
3210 2340 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3211 - if ( ! $date ) {
2341 + if ( empty( $date ) ) {
3212 2342 return $date;
3213 2343 }
3214 2344
3215 - if ( ! $date_format ) {
2345 + if ( empty( $date_format ) ) {
3216 2346 $date_format = get_option( 'date_format' );
3217 2347 }
3218 2348
3219 2349 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3221,10 +2351,10 @@
3221 2351 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3222 2352 }
3223 2353
3224 2354 $formatted = self::get_localized_date( $date_format, $date );
3225 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3226 2355
2356 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3227 2357 if ( $do_time ) {
3228 2358 $formatted .= self::add_time_to_date( $time_format, $date );
3229 2359 }
3230 2360
@@ -3230,52 +2360,45 @@
3230 2360
3231 2361 return $formatted;
3232 2362 }
3233 2363
3234 - /**
3235 - * @param string $time_format
3236 - * @param string $date
3237 - *
3238 - * @return string
3239 - */
3240 2364 private static function add_time_to_date( $time_format, $date ) {
3241 - if ( ! $time_format ) {
2365 + if ( empty( $time_format ) ) {
3242 2366 $time_format = get_option( 'time_format' );
3243 2367 }
3244 2368
3245 2369 $trimmed_format = trim( $time_format );
3246 -
3247 - if ( $time_format && $trimmed_format ) {
3248 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2370 + $time = '';
2371 + if ( $time_format && ! empty( $trimmed_format ) ) {
2372 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3249 2373 }
3250 2374
3251 - return '';
2375 + return $time;
3252 2376 }
3253 2377
3254 2378 /**
3255 2379 * @since 2.0.8
3256 - *
3257 - * @param string $date_format
3258 - * @param string $date
3259 - *
3260 - * @return string
3261 2380 */
3262 2381 public static function get_localized_date( $date_format, $date ) {
3263 2382 $date = get_date_from_gmt( $date );
2383 +
3264 2384 return date_i18n( $date_format, strtotime( $date ) );
3265 2385 }
3266 2386
3267 2387 /**
3268 - * Gets the time ago in words.
2388 + * Gets the time ago in words
3269 2389 *
3270 - * @param int $from In seconds.
3271 - * @param int|string $to In seconds.
3272 - * @param int|string $levels Number of time units to include or a specific unit.
2390 + * @param int $from in seconds
2391 + * @param int|string $to in seconds
3273 2392 *
3274 - * @return string Time ago.
2393 + * @return string $time_ago
3275 2394 */
3276 2395 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3277 - $now = ! $to && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2396 + if ( empty( $to ) && 0 !== $to ) {
2397 + $now = new DateTime();
2398 + } else {
2399 + $now = new DateTime( '@' . $to );
2400 + }
3278 2401 $ago = new DateTime( '@' . $from );
3279 2402
3280 2403 // Get the time difference
3281 2404 $diff_object = $now->diff( $ago );
@@ -3281,9 +2404,9 @@
3281 2404 $diff_object = $now->diff( $ago );
3282 2405 $diff = get_object_vars( $diff_object );
3283 2406
3284 2407 // Add week amount and update day amount
3285 - $diff['w'] = floor( $diff['d'] / 7 );
2408 + $diff['w'] = floor( $diff['d'] / 7 );
3286 2409 $diff['d'] -= $diff['w'] * 7;
3287 2410
3288 2411 $time_strings = self::get_time_strings();
3289 2412
@@ -3289,11 +2412,10 @@
3289 2412
3290 2413 if ( ! is_numeric( $levels ) ) {
3291 2414 // Show time in specified unit.
3292 2415 $levels = self::get_unit( $levels );
3293 -
3294 2416 if ( isset( $time_strings[ $levels ] ) ) {
3295 - $diff = array(
2417 + $diff = array(
3296 2418 $levels => self::time_format( $levels, $diff ),
3297 2419 );
3298 2420 $time_strings = array(
3299 2421 $levels => $time_strings[ $levels ],
@@ -3298,14 +2420,13 @@
3298 2420 $time_strings = array(
3299 2421 $levels => $time_strings[ $levels ],
3300 2422 );
3301 2423 }
3302 -
3303 2424 $levels = 1;
3304 2425 }
3305 2426
3306 2427 foreach ( $time_strings as $k => $v ) {
3307 - if ( ! empty( $diff[ $k ] ) ) {
2428 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3308 2429 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3309 2430 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3310 2431 // Account for 0.
3311 2432 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3313,21 +2434,17 @@
3313 2434 unset( $time_strings[ $k ] );
3314 2435 }
3315 2436 }
3316 2437
3317 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3318 - $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2438 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2439 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2440 + $time_ago_string = implode( ' ', $time_strings );
3319 2441
3320 - return implode( ' ', $time_strings );
2442 + return $time_ago_string;
3321 2443 }
3322 2444
3323 2445 /**
3324 2446 * @since 4.05.01
3325 - *
3326 - * @param string $unit
3327 - * @param array $diff
3328 - *
3329 - * @return int
3330 2447 */
3331 2448 private static function time_format( $unit, $diff ) {
3332 2449 $return = array(
3333 2450 'y' => 'y',
@@ -3332,14 +2449,14 @@
3332 2449 $return = array(
3333 2450 'y' => 'y',
3334 2451 'd' => 'days',
3335 2452 );
3336 -
3337 2453 if ( isset( $return[ $unit ] ) ) {
3338 2454 return $diff[ $return[ $unit ] ];
3339 2455 }
3340 2456
3341 2457 $total = $diff['days'] * self::convert_time( 'd', $unit );
2458 +
3342 2459 $times = array( 'h', 'i', 's' );
3343 2460
3344 2461 foreach ( $times as $time ) {
3345 2462 if ( ! isset( $diff[ $time ] ) ) {
@@ -3353,13 +2470,8 @@
3353 2470 }
3354 2471
3355 2472 /**
3356 2473 * @since 4.05.01
3357 - *
3358 - * @param string $from
3359 - * @param string $to
3360 - *
3361 - * @return int
3362 2474 */
3363 2475 private static function convert_time( $from, $to ) {
3364 2476 $convert = array(
3365 2477 's' => 1,
@@ -3375,35 +2487,28 @@
3375 2487 }
3376 2488
3377 2489 /**
3378 2490 * @since 4.05.01
3379 - *
3380 - * @param string $unit
3381 - *
3382 - * @return int|string
3383 2491 */
3384 2492 private static function get_unit( $unit ) {
3385 2493 $units = self::get_time_strings();
3386 -
3387 2494 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3388 2495 return $unit;
3389 2496 }
3390 2497
3391 2498 foreach ( $units as $u => $strings ) {
3392 - if ( in_array( $unit, $strings, true ) ) {
2499 + if ( in_array( $unit, $strings ) ) {
3393 2500 return $u;
3394 2501 }
3395 2502 }
3396 -
3397 2503 return 1;
3398 2504 }
3399 2505
3400 2506 /**
3401 2507 * Get the translatable time strings. The untranslated version is a failsafe
3402 - * in case languages are changing for the unit set in the shortcode.
2508 + * in case langauges are changing for the unit set in the shortcode.
3403 2509 *
3404 2510 * @since 2.0.20
3405 - *
3406 2511 * @return array
3407 2512 */
3408 2513 private static function get_time_strings() {
3409 2514 return array(
@@ -3447,48 +2552,35 @@
3447 2552
3448 2553 // Pagination Methods.
3449 2554
3450 2555 /**
3451 - * @param int $r_count
3452 - * @param int $current_p
3453 - * @param int $p_size
3454 - *
3455 - * @return int
2556 + * @param integer $current_p
3456 2557 */
3457 2558 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3458 - return $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size;
2559 + return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
3459 2560 }
3460 2561
3461 2562 /**
3462 - * @param int $r_count
3463 - * @param int $current_p
3464 - * @param int $p_size
3465 - *
3466 - * @return int
2563 + * @param integer $current_p
3467 2564 */
3468 2565 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3469 - // phpcs:ignore Universal.Operators.StrictComparisons
3470 2566 if ( $current_p == 1 ) {
3471 2567 return 1;
2568 + } else {
2569 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3472 2570 }
3473 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3474 2571 }
3475 2572
3476 2573 /**
3477 - * @param array $json_vars
3478 - *
3479 2574 * @return array
3480 2575 */
3481 2576 public static function json_to_array( $json_vars ) {
3482 2577 $vars = array();
3483 -
3484 2578 foreach ( $json_vars as $jv ) {
3485 2579 $jv_name = explode( '[', $jv['name'] );
3486 2580 $last = count( $jv_name ) - 1;
3487 -
3488 2581 foreach ( $jv_name as $p => $n ) {
3489 2582 $name = trim( $n, ']' );
3490 -
3491 2583 if ( ! isset( $l1 ) ) {
3492 2584 $l1 = $name;
3493 2585 }
3494 2586
@@ -3499,9 +2591,9 @@
3499 2591 if ( ! isset( $l3 ) ) {
3500 2592 $l3 = $name;
3501 2593 }
3502 2594
3503 - $this_val = $p === $last ? $jv['value'] : array();
2595 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3504 2596
3505 2597 switch ( $p ) {
3506 2598 case 0:
3507 2599 $l1 = $name;
@@ -3523,12 +2615,12 @@
3523 2615 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3524 2616 }
3525 2617
3526 2618 unset( $this_val, $n );
3527 - }//end foreach
2619 + }
3528 2620
3529 2621 unset( $last, $jv );
3530 - }//end foreach
2622 + }
3531 2623
3532 2624 return $vars;
3533 2625 }
3534 2626
@@ -3534,15 +2626,10 @@
3534 2626
3535 2627 /**
3536 2628 * @param string $name
3537 2629 * @param string $l1
3538 - * @param mixed $val
3539 - * @param array $vars
3540 - *
3541 - * @return void
3542 2630 */
3543 2631 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3544 - // phpcs:ignore Universal.Operators.StrictComparisons
3545 2632 if ( $name == '' ) {
3546 2633 $vars[] = $val;
3547 2634 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3548 2635 $vars[ $l1 ] = $val;
@@ -3548,26 +2635,18 @@
3548 2635 $vars[ $l1 ] = $val;
3549 2636 }
3550 2637 }
3551 2638
3552 - /**
3553 - * @param string $name
3554 - * @param string $class
3555 - * @param string $form_name
3556 - *
3557 - * @return void
3558 - */
3559 2639 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3560 2640 $tooltips = array(
3561 2641 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3562 - 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com. [default-email] is the address set in the global "Default Email Address" settings.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2642 + 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com. [admin_email] is the address set in WP General Settings.', 'formidable' ),
3563 2643 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3564 2644 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3565 - 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2645 + 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3566 2646 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3567 2647 /* translators: %1$s: Form name, %2$s: Date */
3568 - 'email_subject' => esc_attr( sprintf( __( 'If you leave the subject blank, the default will be used: %1$s Form submitted on %2$s', 'formidable' ), $form_name, self::site_name() ) ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3569 - 'new_tab' => __( 'This option will open the link in a new browser tab. Please note that some popup blockers may prevent this from happening, in which case the link will be displayed.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2648 + 'email_subject' => esc_attr( sprintf( __( 'If you leave the subject blank, the default will be used: %1$s Form submitted on %2$s', 'formidable' ), $form_name, self::site_name() ) ),
3570 2649 );
3571 2650
3572 2651 if ( ! isset( $tooltips[ $name ] ) ) {
3573 2652 return;
@@ -3572,9 +2651,9 @@
3572 2651 if ( ! isset( $tooltips[ $name ] ) ) {
3573 2652 return;
3574 2653 }
3575 2654
3576 - if ( 'open' === $class ) {
2655 + if ( 'open' == $class ) {
3577 2656 echo ' frm_help"';
3578 2657 } else {
3579 2658 echo ' class="frm_help"';
3580 2659 }
@@ -3580,9 +2659,9 @@
3580 2659 }
3581 2660
3582 2661 echo ' title="' . esc_attr( $tooltips[ $name ] );
3583 2662
3584 - if ( 'open' !== $class ) {
2663 + if ( 'open' != $class ) {
3585 2664 echo '"';
3586 2665 }
3587 2666 }
3588 2667
@@ -3587,28 +2666,20 @@
3587 2666 }
3588 2667
3589 2668 /**
3590 2669 * Add the current_page class to that page in the form nav
3591 - *
3592 - * @param int|string $page
3593 - * @param int|string $current_page
3594 - * @param array $action
3595 - *
3596 - * @return void
3597 2670 */
3598 2671 public static function select_current_page( $page, $current_page, $action = array() ) {
3599 - // phpcs:ignore Universal.Operators.StrictComparisons
3600 2672 if ( $current_page != $page ) {
3601 2673 return;
3602 2674 }
3603 2675
3604 2676 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3605 -
3606 2677 if ( 'lite-reports' === $frm_action ) {
3607 2678 $frm_action = 'reports';
3608 2679 }
3609 2680
3610 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
2681 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3611 2682 echo ' class="current_page"';
3612 2683 }
3613 2684 }
3614 2685
@@ -3638,19 +2709,14 @@
3638 2709
3639 2710 // Add extra slashes for \r\n since WP strips them.
3640 2711 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3641 2712
3642 - // Allow for &quot
3643 - return str_replace( '&quot;', '\\"', $post_content );
2713 + // allow for &quot
2714 + $post_content = str_replace( '&quot;', '\\"', $post_content );
2715 +
2716 + return $post_content;
3644 2717 }
3645 2718
3646 - /**
3647 - * @param array|string $val
3648 - * @param int|string $key
3649 - * @param array $post_content
3650 - *
3651 - * @return void
3652 - */
3653 2719 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3654 2720 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3655 2721 return;
3656 2722 }
@@ -3659,17 +2725,15 @@
3659 2725 foreach ( $val as $k1 => $v1 ) {
3660 2726 self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
3661 2727 unset( $k1, $v1 );
3662 2728 }
2729 + } else {
2730 + // Strip all slashes so everything is the same, no matter where the value is coming from
2731 + $val = stripslashes( $val );
3663 2732
3664 - return;
2733 + // Add backslashes before double quotes and forward slashes only
2734 + $post_content[ $key ] = addcslashes( $val, '"\\/' );
3665 2735 }
3666 -
3667 - // Strip all slashes so everything is the same, no matter where the value is coming from
3668 - $val = stripslashes( $val );
3669 -
3670 - // Add backslashes before double quotes and forward slashes only
3671 - $post_content[ $key ] = addcslashes( $val, '"\\/' );
3672 2736 }
3673 2737
3674 2738 /**
3675 2739 * Check for either json or serialized data. This is temporary while transitioning
@@ -3677,9 +2741,8 @@
3677 2741 *
3678 2742 * @since 4.02.03
3679 2743 *
3680 2744 * @param array|string $value
3681 - *
3682 2745 * @return void
3683 2746 */
3684 2747 public static function unserialize_or_decode( &$value ) {
3685 2748 if ( is_array( $value ) ) {
@@ -3685,9 +2748,13 @@
3685 2748 if ( is_array( $value ) ) {
3686 2749 return;
3687 2750 }
3688 2751
3689 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
2752 + if ( is_serialized( $value ) ) {
2753 + $value = self::maybe_unserialize_array( $value );
2754 + } else {
2755 + $value = self::maybe_json_decode( $value, false );
2756 + }
3690 2757 }
3691 2758
3692 2759 /**
3693 2760 * Safely unserialize an array if necessary.
@@ -3695,9 +2762,8 @@
3695 2762 *
3696 2763 * @since 6.2
3697 2764 *
3698 2765 * @param mixed $value
3699 - *
3700 2766 * @return mixed
3701 2767 */
3702 2768 public static function maybe_unserialize_array( $value ) {
3703 2769 if ( ! is_string( $value ) ) {
@@ -3704,15 +2770,18 @@
3704 2770 return $value;
3705 2771 }
3706 2772
3707 2773 // Since we only expect an array, skip anything that doesn't start with a:.
3708 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
2774 + if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
3709 2775 return $value;
3710 2776 }
3711 2777
3712 2778 $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
2779 + if ( is_array( $parsed ) ) {
2780 + $value = $parsed;
2781 + }
3713 2782
3714 - return is_array( $parsed ) ? $parsed : $value;
2783 + return $value;
3715 2784 }
3716 2785
3717 2786 /**
3718 2787 * Decode a JSON string.
@@ -3717,12 +2786,11 @@
3717 2786 /**
3718 2787 * Decode a JSON string.
3719 2788 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3720 2789 *
3721 - * @param array|string|null $string
3722 - * @param bool $single_to_array
3723 - *
3724 - * @return array|string|null
2790 + * @param mixed $string
2791 + * @param bool $single_to_array
2792 + * @return mixed
3725 2793 */
3726 2794 public static function maybe_json_decode( $string, $single_to_array = true ) {
3727 2795 if ( is_array( $string ) || is_null( $string ) ) {
3728 2796 return $string;
@@ -3727,51 +2795,21 @@
3727 2795 if ( is_array( $string ) || is_null( $string ) ) {
3728 2796 return $string;
3729 2797 }
3730 2798
3731 - $new_string = json_decode( $string, true );
3732 - $single_value = false;
3733 -
3734 - if ( ! $single_to_array ) {
3735 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3736 - }
3737 -
3738 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3739 - return $new_string;
3740 - }
3741 -
3742 - return $string;
3743 - }
3744 -
3745 - /**
3746 - * @since 6.2.3
3747 - *
3748 - * @param string $value
3749 - *
3750 - * @return string
3751 - */
3752 - public static function maybe_utf8_encode( $value ) {
3753 - $from_format = 'ISO-8859-1';
3754 - $to_format = 'UTF-8';
3755 -
3756 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3757 - if ( mb_check_encoding( $value, $from_format ) ) {
3758 - return mb_convert_encoding( $value, $to_format, $from_format );
2799 + $new_string = json_decode( $string, true );
2800 + if ( function_exists( 'json_last_error' ) ) {
2801 + // php 5.3+
2802 + $single_value = false;
2803 + if ( ! $single_to_array ) {
2804 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3759 2805 }
3760 -
3761 - return $value;
3762 - }
3763 -
3764 - if ( function_exists( 'iconv' ) ) {
3765 - $converted = iconv( $from_format, $to_format, $value );
3766 -
3767 - // Value is false if $value is not ISO-8859-1.
3768 - if ( false !== $converted ) {
3769 - return $converted;
2806 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
2807 + $string = $new_string;
3770 2808 }
3771 2809 }
3772 2810
3773 - return $value;
2811 + return $string;
3774 2812 }
3775 2813
3776 2814 /**
3777 2815 * Reformat the json serialized array in name => value array.
@@ -3776,12 +2814,8 @@
3776 2814 /**
3777 2815 * Reformat the json serialized array in name => value array.
3778 2816 *
3779 2817 * @since 4.02.03
3780 - *
3781 - * @param array $form
3782 - *
3783 - * @return void
3784 2818 */
3785 2819 public static function format_form_data( &$form ) {
3786 2820 $formatted = array();
3787 2821
@@ -3788,21 +2822,18 @@
3788 2822 foreach ( $form as $input ) {
3789 2823 if ( ! isset( $input['name'] ) ) {
3790 2824 continue;
3791 2825 }
3792 -
3793 2826 $key = $input['name'];
3794 -
3795 - if ( ! isset( $formatted[ $key ] ) ) {
2827 + if ( isset( $formatted[ $key ] ) ) {
2828 + if ( is_array( $formatted[ $key ] ) ) {
2829 + $formatted[ $key ][] = $input['value'];
2830 + } else {
2831 + $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
2832 + }
2833 + } else {
3796 2834 $formatted[ $key ] = $input['value'];
3797 - continue;
3798 2835 }
3799 -
3800 - if ( is_array( $formatted[ $key ] ) ) {
3801 - $formatted[ $key ][] = $input['value'];
3802 - } else {
3803 - $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3804 - }
3805 2836 }
3806 2837
3807 2838 parse_str( http_build_query( $formatted ), $form );
3808 2839 }
@@ -3808,34 +2839,30 @@
3808 2839 }
3809 2840
3810 2841 /**
3811 2842 * @since 4.02.03
3812 - *
3813 - * @param array|string $value
3814 - *
3815 - * @return string
3816 2843 */
3817 2844 public static function maybe_json_encode( $value ) {
3818 - return is_array( $value ) ? wp_json_encode( $value ) : $value;
2845 + if ( is_array( $value ) ) {
2846 + $value = wp_json_encode( $value );
2847 + }
2848 + return $value;
3819 2849 }
3820 2850
3821 2851 /**
3822 - * Echo The javascript to open and highlight the Formidable menu
3823 - *
3824 2852 * @since 1.07.10
3825 2853 *
3826 - * @param string $post_type The name of the post type that may need to be highlighted.
3827 - *
3828 - * @return void
2854 + * @param string $post_type The name of the post type that may need to be highlighted
2855 + * echo The javascript to open and highlight the Formidable menu
3829 2856 */
3830 2857 public static function maybe_highlight_menu( $post_type ) {
3831 2858 global $post;
3832 2859
3833 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
2860 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3834 2861 return;
3835 2862 }
3836 2863
3837 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
2864 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3838 2865 return;
3839 2866 }
3840 2867
3841 2868 self::load_admin_wide_js();
@@ -3845,15 +2872,12 @@
3845 2872 /**
3846 2873 * Load the JS file on non-Formidable pages in the admin area
3847 2874 *
3848 2875 * @since 2.0
3849 - *
3850 - * @param bool $load
3851 - *
3852 - * @return void
3853 2876 */
3854 2877 public static function load_admin_wide_js( $load = true ) {
3855 - wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), self::plugin_version() );
2878 + $version = self::plugin_version();
2879 + wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
3856 2880
3857 2881 $global_strings = array(
3858 2882 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
3859 2883 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
@@ -3859,13 +2883,12 @@
3859 2883 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3860 2884 'url' => self::plugin_url(),
3861 2885 'app_url' => 'https://formidableforms.com/',
3862 2886 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3863 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2887 + 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3864 2888 'loading' => __( 'Loading&hellip;', 'formidable' ),
3865 2889 'nonce' => wp_create_nonce( 'frm_ajax' ),
3866 2890 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3867 - 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
3868 2891 );
3869 2892 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3870 2893
3871 2894 if ( $load ) {
@@ -3874,10 +2897,8 @@
3874 2897 }
3875 2898
3876 2899 /**
3877 2900 * @since 2.0.9
3878 - *
3879 - * @return void
3880 2901 */
3881 2902 public static function load_font_style() {
3882 2903 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3883 2904 }
@@ -3883,220 +2904,99 @@
3883 2904 }
3884 2905
3885 2906 /**
3886 2907 * @param string $location
3887 - *
3888 - * @return void
3889 2908 */
3890 2909 public static function localize_script( $location ) {
3891 - global $wp_scripts, $wp_version;
2910 + global $wp_scripts;
3892 2911
2912 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2913 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2914 +
3893 2915 $script_strings = array(
3894 - 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
3895 - 'images_url' => self::plugin_url() . '/images',
3896 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3897 - 'remove' => __( 'Remove', 'formidable' ),
3898 - 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
3899 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3900 - 'id' => __( 'ID', 'formidable' ),
3901 - 'no_results' => __( 'No results match', 'formidable' ),
3902 - 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
3903 - 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
3904 - 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3905 - 'focus_first_error' => self::should_focus_first_error(),
3906 - 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3907 - // We need to keep this setting for a few versions because Pro checks for this.
3908 - 'include_resend_email' => false,
2916 + 'ajax_url' => $ajax_url,
2917 + 'images_url' => self::plugin_url() . '/images',
2918 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2919 + 'remove' => __( 'Remove', 'formidable' ),
2920 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2921 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2922 + 'id' => __( 'ID', 'formidable' ),
2923 + 'no_results' => __( 'No results match', 'formidable' ),
2924 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2925 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2926 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
2927 + 'focus_first_error' => self::should_focus_first_error(),
2928 + 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3909 2929 );
3910 2930
3911 2931 $data = $wp_scripts->get_data( 'formidable', 'data' );
3912 -
3913 - if ( ! $data ) {
2932 + if ( empty( $data ) ) {
3914 2933 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3915 2934 }
3916 2935
3917 - if ( $location === 'admin' ) {
2936 + if ( $location == 'admin' ) {
2937 + $frm_settings = self::get_settings();
3918 2938 $admin_script_strings = array(
3919 - 'desc' => __( '(Click to add description)', 'formidable' ),
3920 - 'blank' => __( '(Blank)', 'formidable' ),
3921 - 'no_label' => self::get_no_label_text(),
3922 - 'ok' => __( 'OK', 'formidable' ),
3923 - 'cancel' => __( 'Cancel', 'formidable' ),
3924 - 'default_label' => __( 'Default', 'formidable' ),
3925 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3926 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3927 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3928 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3929 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3930 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3931 - 'conf_delete_sec' => __( 'All fields inside this Section will be deleted along with their data. Are you sure you want to delete this group of fields?', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3932 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3933 - 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3934 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3935 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3936 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3937 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3938 - 'new_option' => __( 'New Option', 'formidable' ),
3939 - 'css_invalid_size' => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3940 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3941 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3942 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3943 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3944 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3945 - 'private_label' => __( 'Private', 'formidable' ),
3946 - 'jquery_ui_url' => '',
3947 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3948 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3949 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3950 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3951 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3952 - /* translators: %d is the number of allowed actions per form */
3953 - 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3954 - 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3955 - 'only_one_payment_action' => __( 'This form already has a payment action, and is currently limited to a single payment action.', 'formidable' ),
3956 - 'only_one_stripe_action' => __( 'This form already has a payment action. Multiple Stripe actions are available when using the Stripe add-on, available for Formidable Business licenses and higher.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3957 - 'unsafe_params' => FrmFormsHelper::reserved_words(),
2939 + 'desc' => __( '(Click to add description)', 'formidable' ),
2940 + 'blank' => __( '(Blank)', 'formidable' ),
2941 + 'no_label' => __( '(no label)', 'formidable' ),
2942 + 'saving' => '', // Deprecated in 6.0.
2943 + 'saved' => '', // Deprecated in 6.0.
2944 + 'ok' => __( 'OK', 'formidable' ),
2945 + 'cancel' => __( 'Cancel', 'formidable' ),
2946 + 'default_label' => __( 'Default', 'formidable' ),
2947 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2948 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2949 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2950 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2951 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2952 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2953 + 'conf_delete_sec' => __( 'All fields inside this Section will be deleted along with their data. Are you sure you want to delete this group of fields?', 'formidable' ),
2954 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2955 + 'default_unique' => $frm_settings->unique_msg,
2956 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2957 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2958 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2959 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2960 + 'new_option' => __( 'New Option', 'formidable' ),
2961 + 'css_invalid_size' => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ),
2962 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2963 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2964 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2965 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2966 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2967 + 'private_label' => __( 'Private', 'formidable' ),
2968 + 'jquery_ui_url' => '',
2969 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2970 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2971 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2972 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2973 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2974 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2975 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3958 2976 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3959 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2977 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3960 2978 /* Translators: %s is the name of a parameter that is a reserved word. More than one word could be listed here, though that would not be common. */
3961 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3962 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3963 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3964 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3965 - 'install' => __( 'Install', 'formidable' ),
3966 - 'active' => __( 'Active', 'formidable' ),
3967 - 'installed' => __( 'Installed', 'formidable' ),
3968 - 'not_installed' => __( 'Not Installed', 'formidable' ),
3969 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3970 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3971 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3972 -
3973 - // Deprecated in 6.0.
3974 - 'saving' => '',
3975 -
3976 - // Deprecated in 6.0.
3977 - 'saved' => '',
3978 -
3979 - // translators: %1$s: HTML open tag, %2$s: HTML end tag.
3980 - 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3981 - 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3982 -
3983 - // In older versions this event listener causes the section to immediately close again
3984 - // When the h3 element is clicked. It's only required in WP 6.7+.
3985 - 'requireAccordionTitleClickListener' => version_compare( $wp_version, '6.7', '>=' ),
2979 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2980 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2981 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2982 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2983 + 'install' => __( 'Install', 'formidable' ),
2984 + 'active' => __( 'Active', 'formidable' ),
2985 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2986 + 'no_items_found' => __( 'No items found.', 'formidable' ),
2987 + 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3986 2988 );
3987 -
3988 - self::add_form_builder_modal_data( $admin_script_strings );
3989 -
3990 - /**
3991 - * @param array $admin_script_strings
3992 - */
3993 2989 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3994 2990
3995 2991 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3996 -
3997 - if ( ! $data ) {
2992 + if ( empty( $data ) ) {
3998 2993 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3999 2994 }
4000 - }//end if
4001 - }
4002 -
4003 - /**
4004 - * @param array $admin_script_strings
4005 - *
4006 - * @return void
4007 - */
4008 - private static function add_form_builder_modal_data( &$admin_script_strings ) {
4009 - if ( ! self::is_form_builder_page() || self::pro_is_installed() ) {
4010 - return;
4011 2995 }
4012 -
4013 - $stripe_connected = FrmStrpLiteConnectHelper::at_least_one_mode_is_setup();
4014 - $square_connected = FrmSquareLiteConnectHelper::at_least_one_mode_is_setup();
4015 - $paypal_connected = FrmPayPalLiteConnectHelper::at_least_one_mode_is_setup();
4016 - $gateway_connected = $stripe_connected || $square_connected || $paypal_connected;
4017 - $payments_settings_url = FrmStrpLiteAppController::get_payments_settings_url();
4018 -
4019 - if ( ! $gateway_connected ) {
4020 - // This modal shows when user clicks on one of the pricing fields and no payment gateways configured.
4021 - $admin_script_strings['paymentsSettingsModal'] = array(
4022 - 'title' => __( 'Setup a Payment Gateway first', 'formidable' ),
4023 - 'msg' => __( 'To use the payment fields, please install and configure a payment gateway in your account settings.', 'formidable' ),
4024 - 'closeText' => __( 'Close', 'formidable' ),
4025 - 'actionUrl' => $payments_settings_url,
4026 - 'actionText' => __( 'Go to Payment Settings', 'formidable' ),
4027 - 'noCenter' => true,
4028 - );
4029 - }
4030 -
4031 - // This modal shows on load once after upgrading the plugin.
4032 - $show_pricing_fields_modal = get_option( 'frm_show_pricing_fields_modal' );
4033 -
4034 - if ( ! $show_pricing_fields_modal ) {
4035 - return;
4036 - }
4037 -
4038 - $admin_script_strings['pricingFieldsModal'] = array(
4039 - 'title' => esc_html__( 'Start Accepting Payments Today!', 'formidable' ),
4040 - 'img' => esc_url( self::plugin_url() . '/images/upsell/pricing-fields.png' ),
4041 - 'noCenter' => true,
4042 - );
4043 -
4044 - if ( $gateway_connected ) {
4045 - $gateway_texts = array();
4046 -
4047 - if ( $stripe_connected ) {
4048 - $gateway_texts['stripe'] = esc_html__( 'Stripe', 'formidable' );
4049 - }
4050 -
4051 - if ( $square_connected ) {
4052 - $gateway_texts['square'] = esc_html__( 'Square', 'formidable' );
4053 - }
4054 -
4055 - $admin_script_strings['pricingFieldsModal']['msg'] = sprintf(
4056 - // translators: %s: Stripe or Square.
4057 - esc_html__( 'You already have %s connected, so these have already been unlocked.', 'formidable' ),
4058 - esc_html( implode( ' ' . esc_html__( 'and', 'formidable' ) . ' ', $gateway_texts ) )
4059 - );
4060 - } else {
4061 - $admin_script_strings['pricingFieldsModal']['closeText'] = __( 'I\'ll do it later!', 'formidable' );
4062 - $admin_script_strings['pricingFieldsModal']['actionText'] = __( 'Setup Payments Now', 'formidable' );
4063 - $admin_script_strings['pricingFieldsModal']['actionUrl'] = $payments_settings_url;
4064 - // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
4065 - $admin_script_strings['pricingFieldsModal']['msg'] = __( 'We\'ve unlocked Product, Quantity, and Total fields for Lite users! You can now transform your forms into checkout pages. To start collecting revenue, simply connect your preferred payment gateway (Stripe, or Square) in your settings.', 'formidable' );
4066 - }//end if
4067 -
4068 - delete_option( 'frm_show_pricing_fields_modal' );
4069 2996 }
4070 2997
4071 2998 /**
4072 - * Get the no label text.
4073 - *
4074 - * @since 6.25.1
4075 - *
4076 - * @return string
4077 - */
4078 - public static function get_no_label_text() {
4079 - return __( '(no label)', 'formidable' );
4080 - }
4081 -
4082 - /**
4083 - * @since 6.5
4084 - *
4085 - * @return string
4086 - */
4087 - public static function get_ajax_url() {
4088 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
4089 -
4090 - /**
4091 - * @since 2.0.13
4092 - *
4093 - * @param string $ajax_url
4094 - */
4095 - return apply_filters( 'frm_ajax_url', $ajax_url );
4096 - }
4097 -
4098 - /**
4099 2999 * Returns whether or not the first errored input should be auto-focused (default true).
4100 3000 *
4101 3001 * @since 5.2.05
4102 3002 *
@@ -4121,11 +3021,9 @@
4121 3021 * Echo the message on the plugins listing page
4122 3022 *
4123 3023 * @since 1.07.10
4124 3024 *
4125 - * @param float $min_version The version the add-on requires.
4126 - *
4127 - * @return void
3025 + * @param float $min_version The version the add-on requires
4128 3026 */
4129 3027 public static function min_version_notice( $min_version ) {
4130 3028 $frm_version = self::plugin_version();
4131 3029
@@ -4134,11 +3032,11 @@
4134 3032 return;
4135 3033 }
4136 3034
4137 3035 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4138 - echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' . // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
4139 - esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4140 - '</div></td></tr>';
3036 + echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' .
3037 + esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
3038 + '</div></td></tr>';
4141 3039 }
4142 3040
4143 3041 /**
4144 3042 * If Pro is far outdated, show a message.
@@ -4144,10 +3042,8 @@
4144 3042 * If Pro is far outdated, show a message.
4145 3043 *
4146 3044 * @since 4.0.01
4147 3045 *
4148 - * @param string $min_version
4149 - *
4150 3046 * @return void
4151 3047 */
4152 3048 public static function min_pro_version_notice( $min_version ) {
4153 3049 if ( ! self::is_formidable_admin() ) {
@@ -4157,14 +3053,26 @@
4157 3053
4158 3054 self::php_version_notice();
4159 3055
4160 3056 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4161 -
4162 3057 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4163 3058 return;
4164 3059 }
4165 3060
4166 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
3061 + $pro_version = FrmProDb::$plug_version;
3062 + $expired = FrmAddonsController::is_license_expired();
3063 + ?>
3064 + <div class="frm-banner-alert frm_error_style frm_previous_install">
3065 + <?php
3066 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3067 + if ( empty( $expired ) ) {
3068 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
3069 + } else {
3070 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
3071 + }
3072 + ?>
3073 + </div>
3074 + <?php
4167 3075 }
4168 3076
4169 3077 /**
4170 3078 * If Pro is installed, check the version number.
@@ -4169,12 +3077,8 @@
4169 3077 /**
4170 3078 * If Pro is installed, check the version number.
4171 3079 *
4172 3080 * @since 4.0.01
4173 - *
4174 - * @param string $min_version
4175 - *
4176 - * @return bool
4177 3081 */
4178 3082 public static function meets_min_pro_version( $min_version ) {
4179 3083 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4180 3084 }
@@ -4179,22 +3083,24 @@
4179 3083 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4180 3084 }
4181 3085
4182 3086 /**
4183 - * Show a message if the PHP version is below the recommendations.
3087 + * Show a message if the browser or PHP version is below the recommendations.
4184 3088 *
4185 3089 * @since 4.0.02
4186 - *
4187 - * @return void
4188 3090 */
4189 3091 private static function php_version_notice() {
4190 3092 $message = array();
3093 + if ( version_compare( phpversion(), '5.6', '<' ) ) {
3094 + $message[] = __( 'The version of PHP on your server is too low. If this is not corrected, you may see issues with Formidable Forms. Please contact your web host and ask to be updated to PHP 7.0+.', 'formidable' );
3095 + }
4191 3096
4192 - if ( version_compare( phpversion(), '7.0', '<' ) ) {
4193 - $message[] = __( 'The version of PHP on your server is too low. If this is not corrected, you may see issues with Formidable Forms. Please contact your web host and ask to be updated to PHP 7.0+.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3097 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
3098 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
3099 + if ( $is_ie ) {
3100 + $message[] = __( 'You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome).', 'formidable' );
4194 3101 }
4195 3102
4196 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4197 3103 foreach ( $message as $m ) {
4198 3104 ?>
4199 3105 <div class="frm-banner-alert frm_error_style frm_previous_install">
4200 3106 <?php echo esc_html( $m ); ?>
@@ -4200,14 +3106,12 @@
4200 3106 <?php echo esc_html( $m ); ?>
4201 3107 </div>
4202 3108 <?php
4203 3109 }
4204 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4205 3110 }
4206 3111
4207 3112 /**
4208 3113 * @param string $type
4209 - *
4210 3114 * @return array<string,string>
4211 3115 */
4212 3116 public static function locales( $type = 'date' ) {
4213 3117 $locales = array(
@@ -4301,12 +3205,12 @@
4301 3205 'zu' => __( 'Zulu', 'formidable' ),
4302 3206 );
4303 3207
4304 3208 if ( $type === 'captcha' ) {
4305 - // Remove the languages unavailable for the captcha
3209 + // remove the languages unavailable for the captcha
4306 3210 $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
4307 3211 } else {
4308 - // Remove the languages unavailable for the datepicker
3212 + // remove the languages unavailable for the datepicker
4309 3213 $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
4310 3214 }
4311 3215
4312 3216 $locales = array_diff_key( $locales, array_flip( $unset ) );
@@ -4317,27 +3221,32 @@
4317 3221 * @since 5.4.5 Added $args parameter with type.
4318 3222 *
4319 3223 * @param array<string,string> $locales
4320 3224 * @param array $args {
4321 - *
4322 3225 * @type string $type
4323 3226 * }
4324 3227 */
4325 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3228 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3229 +
3230 + return $locales;
4326 3231 }
4327 3232
4328 3233 /**
4329 - * @return string
3234 + * Output HTML containing reference text for accessibility
3235 + *
3236 + * @deprecated 5.1
4330 3237 */
3238 + public static function multiselect_accessibility() {
3239 + _deprecated_function( __METHOD__, '5.1' );
3240 + }
3241 +
4331 3242 public static function get_menu_icon_class() {
4332 3243 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4333 3244 $settings = FrmProAppHelper::get_settings();
4334 -
4335 3245 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4336 3246 return $settings->menu_icon;
4337 3247 }
4338 3248 }
4339 -
4340 3249 return 'frmfont frm_logo_icon';
4341 3250 }
4342 3251
4343 3252 /**
@@ -4355,9 +3264,10 @@
4355 3264 * @type array $input_attrs Attributes of value input.
4356 3265 * }
4357 3266 */
4358 3267 public static function images_dropdown( $args ) {
4359 - $args = self::fill_default_images_dropdown_args( $args );
3268 + $args = self::fill_default_images_dropdown_args( $args );
3269 +
4360 3270 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4361 3271 ob_start();
4362 3272 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4363 3273 $output = ob_get_clean();
@@ -4378,9 +3288,8 @@
4378 3288 *
4379 3289 * @since 5.0.04
4380 3290 *
4381 3291 * @param array $args The arguments.
4382 - *
4383 3292 * @return array
4384 3293 */
4385 3294 private static function fill_default_images_dropdown_args( $args ) {
4386 3295 $defaults = array(
@@ -4393,8 +3302,14 @@
4393 3302
4394 3303 $new_args['options'] = (array) $new_args['options'];
4395 3304 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4396 3305
3306 + // Set the number of columns.
3307 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3308 + if ( $new_args['col_class'] > 6 ) {
3309 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3310 + }
3311 +
4397 3312 /**
4398 3313 * Allows modifying the arguments of images_dropdown() method.
4399 3314 *
4400 3315 * @since 5.0.04
@@ -4410,9 +3325,8 @@
4410 3325 *
4411 3326 * @since 5.0.04
4412 3327 *
4413 3328 * @param array $args The arguments.
4414 - *
4415 3329 * @return string
4416 3330 */
4417 3331 private static function get_images_dropdown_input_attrs( $args ) {
4418 3332 $input_attrs = $args['input_attrs'];
@@ -4419,9 +3333,8 @@
4419 3333 $input_attrs['type'] = 'radio';
4420 3334 $input_attrs['name'] = $args['name'];
4421 3335
4422 3336 $input_attrs_str = '';
4423 -
4424 3337 foreach ( $input_attrs as $key => $input_attr ) {
4425 3338 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4426 3339 }
4427 3340
@@ -4436,23 +3349,8 @@
4436 3349 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4437 3350 }
4438 3351
4439 3352 /**
4440 - * @since 6.7.1
4441 - *
4442 - * @param array $option Option data.
4443 - * @param array $args The arguments of images_dropdown() method.
4444 - *
4445 - * @return array
4446 - */
4447 - public static function get_images_dropdown_atts( $option, $args ) {
4448 - $image = self::get_images_dropdown_option_image( $option, $args );
4449 - $classes = self::get_images_dropdown_option_classes( $option, $args );
4450 - $custom_attrs = self::get_images_dropdown_option_html_attrs( $option, $args );
4451 - return compact( 'image', 'classes', 'custom_attrs' );
4452 - }
4453 -
4454 - /**
4455 3353 * Gets the image of each option in images_dropdown() method.
4456 3354 *
4457 3355 * @since 5.0.04
4458 3356 *
@@ -4457,9 +3355,8 @@
4457 3355 * @since 5.0.04
4458 3356 *
4459 3357 * @param array $option Option data.
4460 3358 * @param array $args The arguments of images_dropdown() method.
4461 - *
4462 3359 * @return string
4463 3360 */
4464 3361 private static function get_images_dropdown_option_image( $option, $args ) {
4465 3362 $image = self::icon_by_class(
@@ -4464,9 +3361,9 @@
4464 3361 private static function get_images_dropdown_option_image( $option, $args ) {
4465 3362 $image = self::icon_by_class(
4466 3363 'frmfont ' . $option['svg'],
4467 3364 array(
4468 - 'echo' => false,
3365 + 'echo' => false,
4469 3366 )
4470 3367 );
4471 3368
4472 3369 $args['option'] = $option;
@@ -4488,9 +3385,8 @@
4488 3385 * @since 5.0.04
4489 3386 *
4490 3387 * @param array $option Option data.
4491 3388 * @param array $args The arguments of images_dropdown() method.
4492 - *
4493 3389 * @return string
4494 3390 */
4495 3391 private static function get_images_dropdown_option_classes( $option, $args ) {
4496 3392 $classes = '';
@@ -4518,19 +3414,17 @@
4518 3414 * @since 5.0.04
4519 3415 *
4520 3416 * @param array $option Option data.
4521 3417 * @param array $args The arguments of images_dropdown() method.
4522 - *
4523 3418 * @return string
4524 3419 */
4525 3420 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4526 3421 $html_attrs = '';
4527 -
4528 3422 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4529 3423 $html_attrs_arr = array();
4530 3424
4531 3425 foreach ( $option['custom_attrs'] as $key => $value ) {
4532 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3426 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4533 3427 continue;
4534 3428 }
4535 3429
4536 3430 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4588,13 +3482,14 @@
4588 3482 * @since 5.0.07
4589 3483 *
4590 3484 * @param array $values
4591 3485 * @param array $keys
4592 - *
4593 3486 * @return array
4594 3487 */
4595 3488 public static function maybe_filter_array( $values, $keys ) {
4596 - if ( self::allow_unfiltered_html() ) {
3489 + $allow_unfiltered_html = self::allow_unfiltered_html();
3490 +
3491 + if ( $allow_unfiltered_html ) {
4597 3492 return $values;
4598 3493 }
4599 3494
4600 3495 foreach ( $keys as $key ) {
@@ -4606,87 +3501,36 @@
4606 3501 return $values;
4607 3502 }
4608 3503
4609 3504 /**
4610 - * Some back end fields allow privileged users to add scripts.
3505 + * Some back end fields allow privleged users to add scripts.
4611 3506 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4612 3507 *
4613 3508 * @since 5.0.13
4614 3509 *
4615 3510 * @param string $value
4616 - * @param array|string $allowed 'all' for everything included as defaults.
4617 - *
3511 + * @param array|string $allowed 'all' for everything included as defaults
4618 3512 * @return string
4619 3513 */
4620 3514 public static function maybe_kses( $value, $allowed = 'all' ) {
4621 3515 if ( self::should_never_allow_unfiltered_html() ) {
4622 - return self::kses( $value, $allowed );
3516 + $value = self::kses( $value, $allowed );
4623 3517 }
4624 3518 return $value;
4625 3519 }
4626 3520
4627 3521 /**
4628 - * Check if an option attribute used in an [input] shortcode is safe.
3522 + * @since 5.0.16
4629 3523 *
4630 - * @since 6.11.2
4631 - *
4632 - * @param string $key
4633 - * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4634 - *
4635 3524 * @return bool
4636 3525 */
4637 - public static function input_key_is_safe( $key, $context = 'display' ) {
4638 - if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4639 - $safe = true;
4640 - } elseif ( str_starts_with( $key, 'data-' ) ) {
4641 - // Allow all data attributes.
4642 - $safe = true;
4643 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
4644 - // Allow all aria attributes.
4645 - $safe = true;
4646 - } else {
4647 - $safe_keys = array(
4648 - 'class',
4649 - 'required',
4650 - 'title',
4651 - 'placeholder',
4652 - 'value',
4653 - 'readonly',
4654 - 'disabled',
4655 - 'size',
4656 - 'maxlength',
4657 - 'min',
4658 - 'max',
4659 - 'pattern',
4660 - 'step',
4661 - 'autofocus',
4662 - 'width',
4663 - 'height',
4664 - 'autocomplete',
4665 - 'tabindex',
4666 - 'role',
4667 - 'style',
4668 - );
4669 - $safe = in_array( $key, $safe_keys, true );
4670 - }//end if
4671 -
4672 - /**
4673 - * Filter the $safe value so additional keys can be allowed or disallowed.
4674 - *
4675 - * @since 6.11.2
4676 - *
4677 - * @param bool $safe True if the key is considered safe.
4678 - * @param string $key
4679 - * @param string $context Either 'display' or 'update'.
4680 - */
4681 - return (bool) apply_filters( 'frm_input_key_is_safe', $safe, $key, $context );
3526 + public static function show_landing_pages() {
3527 + return self::show_new_feature( 'landing' );
4682 3528 }
4683 3529
4684 3530 /**
4685 3531 * @since 5.0.16
4686 3532 *
4687 - * @param string $medium
4688 - *
4689 3533 * @return array
4690 3534 */
4691 3535 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4692 3536 $params = array(
@@ -4693,9 +3537,8 @@
4693 3537 'medium' => $medium,
4694 3538 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4695 3539 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4696 3540 'screenshot' => 'landing.png',
4697 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4698 3541 );
4699 3542 return self::get_upgrade_data_params( 'landing', $params );
4700 3543 }
4701 3544
@@ -4701,10 +3544,20 @@
4701 3544
4702 3545 /**
4703 3546 * @since 5.0.17
4704 3547 *
4705 - * @param string $feature
3548 + * @param string $plugin
3549 + * @return string|false
3550 + */
3551 + private static function get_plan_required( $plugin ) {
3552 + $link = FrmAddonsController::install_link( $plugin );
3553 + return FrmFormsHelper::get_plan_required( $link );
3554 + }
3555 +
3556 + /**
3557 + * @since 5.0.17
4706 3558 *
3559 + * @param string
4707 3560 * @return bool
4708 3561 */
4709 3562 public static function show_new_feature( $feature ) {
4710 3563 $link = FrmAddonsController::install_link( $feature );
@@ -4711,21 +3564,16 @@
4711 3564 return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4712 3565 }
4713 3566
4714 3567 /**
4715 - * Enhances upgrade data parameters with installation link and plan requirement information.
4716 - *
4717 3568 * @since 5.0.17
4718 3569 *
4719 - * @param string $plugin The plugin slug to get installation data for.
4720 - * @param array $params Initial parameters for the upgrade data.
4721 - * @param bool $detailed Whether to include detailed information.
4722 - *
4723 - * @return array Modified parameters with installation data.
3570 + * @param string $plugin
3571 + * @param array $params
3572 + * @return array
4724 3573 */
4725 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3574 + public static function get_upgrade_data_params( $plugin, $params ) {
4726 3575 $link = FrmAddonsController::install_link( $plugin );
4727 -
4728 3576 if ( ! $link ) {
4729 3577 return $params;
4730 3578 }
4731 3579
@@ -4731,20 +3579,15 @@
4731 3579
4732 3580 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4733 3581 $params['oneclick'] = json_encode( $link );
4734 3582 unset( $params['message'] );
4735 -
4736 3583 if ( ! isset( $params['medium'] ) ) {
4737 3584 $params['medium'] = $plugin;
4738 3585 }
4739 3586 } else {
4740 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3587 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4741 3588 }
4742 3589
4743 - if ( $detailed ) {
4744 - $params['plugin-status'] = $link['status'] ?? '';
4745 - }
4746 -
4747 3590 return $params;
4748 3591 }
4749 3592
4750 3593 /**
@@ -4753,9 +3596,8 @@
4753 3596 *
4754 3597 * @since 5.0.17
4755 3598 *
4756 3599 * @param string $text
4757 - *
4758 3600 * @return bool
4759 3601 */
4760 3602 public static function ctype_xdigit( $text ) {
4761 3603 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4770,14 +3612,12 @@
4770 3612 * @since 5.2.01
4771 3613 */
4772 3614 public static function set_current_screen_and_hook_suffix() {
4773 3615 global $hook_suffix;
4774 -
4775 3616 if ( is_null( $hook_suffix ) ) {
4776 3617 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4777 3618 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4778 3619 }
4779 -
4780 3620 set_current_screen();
4781 3621 }
4782 3622
4783 3623 /**
@@ -4784,15 +3624,15 @@
4784 3624 * Shows pill text.
4785 3625 *
4786 3626 * @since 5.2.02
4787 3627 *
4788 - * @param string|null $text Text in the pill. Default is NEW.
3628 + * @param string $text Text in the pill. Default is NEW.
4789 3629 */
4790 3630 public static function show_pill_text( $text = null ) {
4791 3631 if ( null === $text ) {
4792 3632 $text = __( 'NEW', 'formidable' );
4793 3633 }
4794 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3634 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4795 3635 }
4796 3636
4797 3637 /**
4798 3638 * Count the number of decimals digits.
@@ -4799,10 +3639,9 @@
4799 3639 *
4800 3640 * @since 5.2.07
4801 3641 *
4802 3642 * @param mixed $num Number.
4803 - *
4804 - * @return false|int Returns `false` if the passed parameter is not number.
3643 + * @return int|false Returns `false` if the passed parameter is not number.
4805 3644 */
4806 3645 public static function count_decimals( $num ) {
4807 3646 if ( ! is_numeric( $num ) ) {
4808 3647 return false;
@@ -4809,9 +3648,8 @@
4809 3648 }
4810 3649
4811 3650 $num = (string) $num;
4812 3651 $parts = explode( '.', $num );
4813 -
4814 3652 if ( 1 === count( $parts ) ) {
4815 3653 return 0;
4816 3654 }
4817 3655
@@ -4834,9 +3672,9 @@
4834 3672 }
4835 3673
4836 3674 add_filter(
4837 3675 'option_gmt_offset',
4838 - function ( $offset ) {
3676 + function( $offset ) {
4839 3677 if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4840 3678 // Leave a valid value alone.
4841 3679 return $offset;
4842 3680 }
@@ -4893,20 +3731,17 @@
4893 3731 * @since 5.5.5
4894 3732 *
4895 3733 * @param string $url
4896 3734 * @param string $expected_extension
4897 - *
4898 3735 * @return bool
4899 3736 */
4900 3737 public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4901 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4902 -
3738 + $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4903 3739 if ( ! $file_is_in_expected_s3_bucket ) {
4904 3740 return false;
4905 3741 }
4906 3742
4907 3743 $parsed = parse_url( $url );
4908 -
4909 3744 if ( ! is_array( $parsed ) ) {
4910 3745 // URL is malformed.
4911 3746 return false;
4912 3747 }
@@ -4912,241 +3747,69 @@
4912 3747 }
4913 3748
4914 3749 $path = $parsed['path'];
4915 3750 $ext = pathinfo( $path, PATHINFO_EXTENSION );
4916 - // The URL isn't to an XML file.
4917 - return $expected_extension === $ext;
4918 - }
4919 -
4920 - /**
4921 - * Display a dismissable warning message and save its dismissal state.
4922 - *
4923 - * @since 6.3
4924 - *
4925 - * @param string $message The warning message to display.
4926 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4927 - *
4928 - * @return void
4929 - */
4930 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4931 - if ( ! $message || ! $option ) {
4932 - return;
3751 + if ( $expected_extension !== $ext ) {
3752 + // The URL isn't to an XML file.
3753 + return false;
4933 3754 }
4934 3755
4935 - $ajax_callback = function () use ( $option ) {
4936 - self::dismiss_warning_message( $option );
4937 - };
4938 -
4939 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
4940 - // To prevent any issues, we add 'frm_' from the beginning of the action.
4941 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
4942 -
4943 - add_filter(
4944 - 'frm_message_list',
4945 - function ( $show_messages ) use ( $message, $option ) {
4946 - if ( get_option( $option, false ) ) {
4947 - return $show_messages;
4948 - }
4949 -
4950 - $dismiss_icon = self::icon_by_class(
4951 - 'frmfont frm_close_icon',
4952 - array(
4953 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
4954 - 'echo' => false,
4955 - )
4956 - );
4957 -
4958 - $show_messages[] = $message;
4959 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
4960 -
4961 - return $show_messages;
4962 - }
4963 - );
3756 + return true;
4964 3757 }
4965 3758
4966 3759 /**
4967 - * Dismiss a warning message and update the dismissal state.
4968 - *
4969 - * @since 6.3
4970 - *
4971 - * @param string $option The unique identifier for the dismissal state of the message.
4972 - *
4973 - * @return void
3760 + * @since 4.08
3761 + * @deprecated 4.09.01
4974 3762 */
4975 - public static function dismiss_warning_message( $option = '' ) {
4976 - self::permission_check( 'frm_change_settings' );
4977 - check_ajax_referer( 'frm_ajax', 'nonce' );
4978 -
4979 - if ( $option ) {
4980 - update_option( $option, true, false );
3763 + public static function expiring_message() {
3764 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3765 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3766 + FrmProAddonsController::expiring_message();
4981 3767 }
4982 -
4983 - wp_send_json_success();
4984 3768 }
4985 3769
4986 3770 /**
4987 - * Lite license copy.
4988 - * Used in FrmDashboardController & FrmSettingsController
3771 + * Use the WP 4.7 wp_doing_ajax function
4989 3772 *
4990 - * @since 6.8
4991 - *
4992 - * @return string
3773 + * @since 2.05.07
3774 + * @deprecated 4.04.04
4993 3775 */
4994 - public static function copy_for_lite_license() {
4995 - $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4996 - return apply_filters( 'frm_license_type_text', $message );
3776 + public static function wp_doing_ajax() {
3777 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3778 + return wp_doing_ajax();
4997 3779 }
4998 3780
4999 3781 /**
5000 - * Removes scripts that are unnecessarily loaded across the pages!
5001 - *
5002 - * @since 6.9
5003 - *
5004 - * @return void
3782 + * @deprecated 4.0
5005 3783 */
5006 - public static function dequeue_extra_global_scripts() {
5007 - wp_dequeue_script( 'frm-surveys-admin' );
5008 - wp_dequeue_script( 'frm-quizzes-form-action' );
3784 + public static function insert_opt_html( $args ) {
3785 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3786 + FrmFormsHelper::insert_opt_html( $args );
5009 3787 }
5010 3788
5011 3789 /**
5012 - * Shows tooltip icon.
5013 - *
5014 - * @since 6.12
5015 - *
5016 - * @param string $tooltip_text Tooltip text.
5017 - * @param array $atts Tooltip wrapper HTML attributes.
5018 - *
5019 - * @return void
3790 + * @deprecated 3.01
3791 + * @codeCoverageIgnore
5020 3792 */
5021 - public static function tooltip_icon( $tooltip_text, $atts = array() ) {
5022 - $atts['title'] = $tooltip_text;
5023 -
5024 - if ( isset( $atts['class'] ) ) {
5025 - $atts['class'] .= ' frm_help';
5026 - } else {
5027 - $atts['class'] = 'frm_help';
5028 - }
5029 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
5030 - ?>
5031 - <span <?php self::array_to_html_params( $atts, true ); ?>>
5032 - <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
5033 - </span>
5034 - <?php
5035 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3793 + public static function sanitize_array( &$values ) {
3794 + FrmDeprecated::sanitize_array( $values );
5036 3795 }
5037 3796
5038 3797 /**
5039 - * Prints errors for settings in onboarding wizard or template settings.
3798 + * @since 2.0
3799 + * @deprecated 5.0.13
5040 3800 *
5041 - * @since 6.15
5042 - *
5043 - * @param array $args Args.
5044 - *
5045 - * @return void
3801 + * @return string The base Google APIS url for the current version of jQuery UI
5046 3802 */
5047 - public static function print_setting_error( $args ) {
5048 - $args = wp_parse_args(
5049 - $args,
5050 - array(
5051 - 'id' => '',
5052 - 'errors' => array(),
5053 - 'class' => '',
5054 - )
5055 - );
5056 -
5057 - $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
5058 -
5059 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
5060 - ?>
5061 - <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
5062 - <?php
5063 - if ( is_array( $args['errors'] ) ) {
5064 - foreach ( $args['errors'] as $key => $msg ) {
5065 - ?>
5066 - <span frm-error="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $msg ); ?></span>
5067 - <?php
5068 - }
5069 - } else {
5070 - echo '<span>' . esc_html( $args['errors'] ) . '</span>';
5071 - }
5072 - ?>
5073 - </span>
5074 - <?php
5075 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3803 + public static function jquery_ui_base_url() {
3804 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3805 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
5076 3806 }
5077 3807
5078 3808 /**
5079 - * Check if GDPR is enabled.
5080 - *
5081 - * @since 6.19
5082 - *
5083 - * @return bool
3809 + * @since 4.07
3810 + * @deprecated 6.0
5084 3811 */
5085 - public static function is_gdpr_enabled() {
5086 - $frm_settings = self::get_settings();
5087 - return $frm_settings->enable_gdpr || $frm_settings->no_ips || $frm_settings->custom_header_ip || $frm_settings->no_gdpr_cookies;
5088 - }
5089 -
5090 - /**
5091 - * Check if GDPR cookies are disabled.
5092 - *
5093 - * @since 6.19
5094 - *
5095 - * @return bool
5096 - */
5097 - public static function no_gdpr_cookies() {
5098 - $frm_settings = self::get_settings();
5099 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
5100 - }
5101 -
5102 - /**
5103 - * Check if a string is valid UTF-8.
5104 - *
5105 - * @since 6.24
5106 - *
5107 - * @param string $string The string to check.
5108 - *
5109 - * @return bool
5110 - */
5111 - public static function is_valid_utf8( $string ) {
5112 - // wp_is_valid_utf8 is added in WP 6.9.
5113 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
5114 - return wp_is_valid_utf8( $string );
5115 - }
5116 -
5117 - // As of WP 6.9, seems_utf8 is deprecated.
5118 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
5119 - }
5120 -
5121 - /**
5122 - * Get a documentation URL with UTM parameters and affiliate tracking.
5123 - *
5124 - * @since 6.26
5125 - *
5126 - * @param string $path The relative path to append to the base URL.
5127 - * @param string $campaign The campaign to use for UTM parameters.
5128 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5129 - *
5130 - * @return string The processed URL with UTM parameters and affiliate tracking.
5131 - */
5132 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5133 - $path = trim( $path, '/' );
5134 -
5135 - if ( $add_kb_base ) {
5136 - $path = 'knowledgebase/' . $path;
5137 - }
5138 -
5139 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
5140 - }
5141 -
5142 - /**
5143 - * @since 5.0.16
5144 - * @deprecated 6.26
5145 - *
5146 - * @return bool
5147 - */
5148 - public static function show_landing_pages() {
5149 - _deprecated_function( __METHOD__, '6.26' );
5150 - return true;
3812 + public static function renewal_message() {
3813 + _deprecated_function( __METHOD__, '6.0', 'FrmProAddonsController::renewal_message' );
5151 3814 }
5152 3815 }