PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.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 +391 -1660 6.266.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 = 104;
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.26';
19 + public static $plug_version = '6.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,16 +63,10 @@
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 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,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,178 +79,64 @@
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;
129 - } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
131 92 }
132 93
94 + $anchor = '';
133 95 if ( is_array( $args ) ) {
134 - $args = self::adjust_legacy_utm_args( $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 + }
135 103 } else {
136 - $args = array( 'campaign' => $args );
104 + $medium = $args;
137 105 }
138 106
139 107 $query_args = array(
140 - 'utm_source' => 'plugin',
141 - 'utm_medium' => self::get_utm_medium(),
108 + 'utm_source' => 'WordPress',
109 + 'utm_medium' => $medium,
110 + 'utm_campaign' => 'liteplugin',
142 111 );
143 - $query_args = self::maybe_add_utm_license( $query_args );
144 112
145 - if ( isset( $args['campaign'] ) ) {
146 - $query_args['utm_campaign'] = $args['campaign'];
113 + if ( isset( $content ) ) {
114 + $query_args['utm_content'] = $content;
147 115 }
148 116
149 - if ( isset( $args['content'] ) ) {
150 - $query_args['utm_content'] = $args['content'];
151 - }
152 -
153 - if ( isset( $args['param'] ) ) {
117 + if ( is_array( $args ) && isset( $args['param'] ) ) {
154 118 $query_args['f'] = $args['param'];
155 119 }
156 120
157 - if ( ! empty( $args['plan'] ) ) {
121 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
158 122 $query_args['plan'] = $args['plan'];
159 123 }
160 124
161 - $link = add_query_arg( $query_args, $page );
162 -
163 - if ( isset( $args['anchor'] ) ) {
164 - $link .= '#' . $args['anchor'];
165 - }
166 -
125 + $link = add_query_arg( $query_args, $page ) . $anchor;
167 126 return self::make_affiliate_url( $link );
168 127 }
169 128
170 129 /**
171 - * If medium is "pro", add an additional utm_license param with their active license type.
172 - *
173 - * @since 6.25.1
174 - *
175 - * @param array $query_args
176 - * @param string $link
177 - *
178 - * @return array
179 - */
180 - private static function maybe_add_utm_license( $query_args, $link = '' ) {
181 - if ( isset( $query_args['utm_medium'] ) ) {
182 - $medium = $query_args['utm_medium'];
183 - } else {
184 - $medium = self::pull_medium_from_link( $link );
185 - }
186 -
187 - if ( 'pro' === $medium && is_callable( 'FrmProAddonsController::get_readable_license_type' ) ) {
188 - $query_args['utm_license'] = strtolower( FrmProAddonsController::get_readable_license_type() );
189 - }
190 -
191 - return $query_args;
192 - }
193 -
194 - /**
195 - * @since 6.26
196 - *
197 - * @param string $link
198 - *
199 - * @return string
200 - */
201 - private static function pull_medium_from_link( $link ) {
202 - if ( ! $link ) {
203 - return '';
204 - }
205 -
206 - $parsed = parse_url( $link );
207 -
208 - if ( ! is_array( $parsed ) || ! isset( $parsed['query'] ) ) {
209 - return '';
210 - }
211 -
212 - $query_args = wp_parse_args( $parsed['query'] );
213 -
214 - if ( empty( $query_args['utm_medium'] ) ) {
215 - return '';
216 - }
217 -
218 - return $query_args['utm_medium'];
219 - }
220 -
221 - /**
222 - * @since 6.25.1
223 - *
224 - * @return string
225 - */
226 - private static function get_utm_medium() {
227 - return self::pro_is_connected() ? 'pro' : 'lite';
228 - }
229 -
230 - /**
231 - * Change campaign from "liteplugin" to what we're currently using for medium.
232 - *
233 - * @since 6.25.1
234 - *
235 - * @param array $args
236 - *
237 - * @return array
238 - */
239 - private static function adjust_legacy_utm_args( $args ) {
240 - if ( isset( $args['medium'] ) ) {
241 - $args['campaign'] = $args['medium'];
242 - unset( $args['medium'] );
243 - }
244 -
245 - return $args;
246 - }
247 -
248 - /**
249 - * @since 6.21
250 - *
251 - * @param string $cta_link
252 - * @param array $utm
253 - */
254 - public static function maybe_add_missing_utm( $cta_link, $utm ) {
255 - $utm = self::adjust_legacy_utm_args( $utm );
256 - $query_args = array();
257 -
258 - if ( false === strpos( $cta_link, 'utm_source' ) ) {
259 - $query_args['utm_source'] = 'plugin';
260 - }
261 -
262 - if ( false === strpos( $cta_link, 'utm_medium' ) ) {
263 - $query_args['utm_medium'] = self::get_utm_medium();
264 - }
265 -
266 - if ( false === strpos( $cta_link, 'utm_campaign' ) && isset( $utm['campaign'] ) ) {
267 - $query_args['utm_campaign'] = $utm['campaign'];
268 - }
269 -
270 - if ( false === strpos( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
271 - $query_args['utm_content'] = $utm['content'];
272 - }
273 -
274 - $query_args = self::maybe_add_utm_license( $query_args, $cta_link );
275 -
276 - return $query_args ? add_query_arg( $query_args, $cta_link ) : $cta_link;
277 - }
278 -
279 - /**
280 130 * Get the Formidable settings
281 131 *
282 132 * @since 2.0
283 133 *
284 134 * @param array $args - May include the form id when values need translation.
285 - *
286 - * @return FrmSettings $frm_settings
135 + * @return FrmSettings $frm_setings
287 136 */
288 137 public static function get_settings( $args = array() ) {
289 138 global $frm_settings;
290 -
291 139 if ( empty( $frm_settings ) ) {
292 140 $frm_settings = new FrmSettings( $args );
293 141 } elseif ( isset( $args['current_form'] ) ) {
294 142 // If the global has already been set, allow strings to be filtered.
@@ -297,40 +145,16 @@
297 145
298 146 return $frm_settings;
299 147 }
300 148
301 - /**
302 - * @return string
303 - */
304 149 public static function get_menu_name() {
305 150 $frm_settings = self::get_settings();
306 151
307 - return FrmAddonsController::is_license_expired() || ! self::pro_is_installed() ? 'Formidable' : $frm_settings->menu;
152 + return $frm_settings->menu;
308 153 }
309 154
310 155 /**
311 - * Determine if the current branding is set to 'formidable'.
312 - * Checks the menu icon, and verifies if it matches the formidable branding.
313 - *
314 - * @since 6.4.2
315 - *
316 - * @return bool True if the menu icon is the logo, false otherwise.
317 - */
318 - public static function is_formidable_branding() {
319 - if ( ! self::pro_is_installed() ) {
320 - return true;
321 - }
322 -
323 - $menu_icon = self::get_menu_icon_class();
324 - return strpos( $menu_icon, 'frm_logo_icon' ) !== false;
325 - }
326 -
327 - /**
328 156 * @since 3.05
329 - *
330 - * @param array $atts
331 - *
332 - * @return string
333 157 */
334 158 public static function svg_logo( $atts = array() ) {
335 159 $defaults = array(
336 160 'height' => 18,
@@ -347,12 +171,8 @@
347 171 }
348 172
349 173 /**
350 174 * @since 4.0
351 - *
352 - * @param array $atts
353 - *
354 - * @return void
355 175 */
356 176 public static function show_logo( $atts = array() ) {
357 177 echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
358 178 }
@@ -358,10 +178,8 @@
358 178 }
359 179
360 180 /**
361 181 * @since 4.03.02
362 - *
363 - * @return void
364 182 */
365 183 public static function show_header_logo() {
366 184 $icon = self::svg_logo(
367 185 array(
@@ -370,9 +188,8 @@
370 188 )
371 189 );
372 190
373 191 $new_icon = apply_filters( 'frm_icon', $icon, true );
374 -
375 192 if ( $new_icon !== $icon ) {
376 193 if ( strpos( $new_icon, '<svg' ) === 0 ) {
377 194 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
378 195 } else {
@@ -384,38 +201,21 @@
384 201 }
385 202
386 203 /**
387 204 * @since 2.02.04
388 - *
389 - * @return bool
390 205 */
391 206 public static function ips_saved() {
392 207 $frm_settings = self::get_settings();
208 +
393 209 return ! $frm_settings->no_ips;
394 210 }
395 211
396 - /**
397 - * @return bool
398 - */
399 212 public static function pro_is_installed() {
400 - return (bool) apply_filters( 'frm_pro_installed', false );
213 + return apply_filters( 'frm_pro_installed', false );
401 214 }
402 215
403 216 /**
404 - * Check if the Pro plugin is installed, whether authorized or not.
405 - *
406 - * @since 6.8.3
407 - *
408 - * @return bool
409 - */
410 - public static function pro_is_included() {
411 - return function_exists( 'load_formidable_pro' );
412 - }
413 -
414 - /**
415 217 * @since 4.06.02
416 - *
417 - * @return bool
418 218 */
419 219 public static function pro_is_connected() {
420 220 global $frm_vars;
421 221 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -422,31 +222,17 @@
422 222 }
423 223
424 224 /**
425 225 * @since 4.06
426 - * @since 6.16.2 Added $check_for_settings parameter
427 - *
428 - * @param bool $check_for_settings
429 - *
430 - * @return bool
431 226 */
432 - public static function is_form_builder_page( $check_for_settings = true ) {
433 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
434 - $check_actions = array( 'edit', 'duplicate' );
435 -
436 - if ( $check_for_settings ) {
437 - $check_actions[] = 'settings';
438 - }
439 - 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' );
440 230 }
441 231
442 - /**
443 - * @return bool
444 - */
445 232 public static function is_formidable_admin() {
446 233 $page = self::simple_get( 'page', 'sanitize_title' );
447 234 $is_formidable = strpos( $page, 'formidable' ) !== false;
448 -
449 235 if ( empty( $page ) ) {
450 236 $is_formidable = self::is_view_builder_page();
451 237 }
452 238
@@ -453,63 +239,22 @@
453 239 return $is_formidable;
454 240 }
455 241
456 242 /**
457 - * Checks if is a list page.
458 - *
459 - * @since 6.19
460 - *
461 - * @param string $page The name of the page to check.
462 - *
463 - * @return bool
464 - */
465 - public static function is_admin_list_page( $page = 'formidable' ) {
466 - if ( 'formidable' === $page ) {
467 - return self::on_form_listing_page();
468 - }
469 -
470 - if ( ! self::is_admin_page( $page ) ) {
471 - return false;
472 - }
473 -
474 - if ( 'formidable-entries' === $page ) {
475 - $action = self::simple_get( 'frm_action' );
476 -
477 - if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
478 - return true;
479 - }
480 - }
481 -
482 - // Check edit or settings page.
483 - return ! self::simple_get( 'frm_action' );
484 - }
485 -
486 - /**
487 - * @since 6.20
488 - *
489 - * @return array<string>
490 - */
491 - private static function get_entries_listing_page_form_actions() {
492 - return array( 'list', 'destroy' );
493 - }
494 -
495 - /**
496 243 * Check for certain page in Formidable settings
497 244 *
498 245 * @since 2.0
499 246 *
500 - * @param string $page The name of the page to check.
247 + * @param string $page The name of the page to check
501 248 *
502 - * @return bool
249 + * @return boolean
503 250 */
504 251 public static function is_admin_page( $page = 'formidable' ) {
505 252 global $pagenow;
506 253 $get_page = self::simple_get( 'page', 'sanitize_title' );
507 -
508 254 if ( $pagenow ) {
509 255 // allow this to be true during ajax load i.e. ajax form builder loading
510 256 $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
511 -
512 257 if ( $is_page ) {
513 258 return true;
514 259 }
515 260 }
@@ -521,10 +266,8 @@
521 266 * If the current page is for editing or creating a view.
522 267 * Returns false for the views listing page.
523 268 *
524 269 * @since 4.0
525 - *
526 - * @return bool
527 270 */
528 271 public static function is_view_builder_page() {
529 272 global $pagenow;
530 273
@@ -534,10 +277,10 @@
534 277
535 278 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
536 279
537 280 if ( empty( $post_type ) ) {
538 - $post_id = self::simple_get( 'post', 'absint' );
539 - $post = get_post( $post_id );
281 + $post_id = self::simple_get( 'post', 'absint' );
282 + $post = get_post( $post_id );
540 283 $post_type = $post ? $post->post_type : '';
541 284 }
542 285
543 286 return $post_type === 'frm_display';
@@ -547,15 +290,17 @@
547 290 * Check for the form preview page
548 291 *
549 292 * @since 2.0
550 293 *
551 - * @return bool
294 + * @param None
295 + *
296 + * @return boolean
552 297 */
553 298 public static function is_preview_page() {
554 299 global $pagenow;
555 300 $action = self::simple_get( 'action', 'sanitize_title' );
556 301
557 - return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
302 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
558 303 }
559 304
560 305 /**
561 306 * Check for ajax except the form preview page
@@ -561,17 +306,16 @@
561 306 * Check for ajax except the form preview page
562 307 *
563 308 * @since 2.0
564 309 *
565 - * @return bool
310 + * @param None
311 + *
312 + * @return boolean
566 313 */
567 314 public static function doing_ajax() {
568 315 return wp_doing_ajax() && ! self::is_preview_page();
569 316 }
570 317
571 - /**
572 - * @return string
573 - */
574 318 public static function js_suffix() {
575 319 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
576 320 }
577 321
@@ -576,14 +320,13 @@
576 320 }
577 321
578 322 /**
579 323 * @since 2.0.8
580 - *
581 - * @return bool
582 324 */
583 325 public static function prevent_caching() {
584 326 global $frm_vars;
585 - return ! empty( $frm_vars['prevent_caching'] );
327 +
328 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
586 329 }
587 330
588 331 /**
589 332 * Check if on an admin page
@@ -589,9 +332,9 @@
589 332 * Check if on an admin page
590 333 *
591 334 * @since 2.0
592 335 *
593 - * @return bool
336 + * @return boolean
594 337 */
595 338 public static function is_admin() {
596 339 $is_admin = is_admin() && ! wp_doing_ajax();
597 340
@@ -596,9 +339,8 @@
596 339 $is_admin = is_admin() && ! wp_doing_ajax();
597 340
598 341 /**
599 342 * @since 6.0
600 - *
601 343 * @param bool $is_admin
602 344 */
603 345 return apply_filters( 'frm_is_admin', $is_admin );
604 346 }
@@ -607,23 +349,17 @@
607 349 * Check if value contains blank value or empty array
608 350 *
609 351 * @since 2.0
610 352 *
611 - * @param mixed $value Value to check.
612 - * @param string $empty
353 + * @param mixed $value - value to check
354 + * @param string
613 355 *
614 - * @return bool
356 + * @return boolean
615 357 */
616 358 public static function is_empty_value( $value, $empty = '' ) {
617 359 return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
618 360 }
619 361
620 - /**
621 - * @param mixed $value
622 - * @param string $empty
623 - *
624 - * @return bool
625 - */
626 362 public static function is_not_empty_value( $value, $empty = '' ) {
627 363 return ! self::is_empty_value( $value, $empty );
628 364 }
629 365
@@ -640,28 +376,8 @@
640 376 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
641 377 }
642 378
643 379 /**
644 - * Get the server OS
645 - *
646 - * @since 6.4.2
647 - *
648 - * @return string
649 - */
650 - public static function get_server_os() {
651 - if ( function_exists( 'php_uname' ) ) {
652 - return php_uname( 's' );
653 - }
654 -
655 - if ( ! defined( 'PHP_OS' ) ) {
656 - return '';
657 - }
658 -
659 - // match the same response for Windows server as php_uname('s')
660 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
661 - }
662 -
663 - /**
664 380 * Check for the IP address in several places (when custom headers are enabled).
665 381 * Used by [ip] shortcode.
666 382 *
667 383 * @return string The IP address of the current user
@@ -675,12 +391,10 @@
675 391 continue;
676 392 }
677 393
678 394 $key = self::get_server_value( $key );
679 -
680 395 foreach ( explode( ',', $key ) as $ip ) {
681 - // Just to be safe.
682 - $ip = trim( $ip );
396 + $ip = trim( $ip ); // Just to be safe.
683 397
684 398 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
685 399 return sanitize_text_field( $ip );
686 400 }
@@ -733,16 +447,8 @@
733 447 */
734 448 return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
735 449 }
736 450
737 - /**
738 - * @param string $param
739 - * @param mixed $default
740 - * @param string $src
741 - * @param callable|string $sanitize
742 - *
743 - * @return mixed
744 - */
745 451 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
746 452 if ( strpos( $param, '[' ) ) {
747 453 $params = explode( '[', $param );
748 454 $param = $params[0];
@@ -749,9 +455,8 @@
749 455 }
750 456
751 457 if ( $src === 'get' ) {
752 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
753 -
754 459 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
755 460 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
756 461 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
757 462 }
@@ -773,9 +478,9 @@
773 478 continue;
774 479 }
775 480
776 481 $p = trim( $p, ']' );
777 - $value = $value[ $p ] ?? $default;
482 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
778 483 }
779 484 }
780 485
781 486 return $value;
@@ -780,25 +485,15 @@
780 485
781 486 return $value;
782 487 }
783 488
784 - /**
785 - * Get a value from $_POST data.
786 - *
787 - * @param string $param The key we are trying to access data from in $_POST.
788 - * @param mixed $default The default if nothing is being sent.
789 - * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
790 - * @param bool $serialized
791 - *
792 - * @return mixed
793 - */
794 489 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
795 490 return self::get_simple_request(
796 491 array(
797 - 'type' => 'post',
798 - 'param' => $param,
799 - 'default' => $default,
800 - 'sanitize' => $sanitize,
492 + 'type' => 'post',
493 + 'param' => $param,
494 + 'default' => $default,
495 + 'sanitize' => $sanitize,
801 496 'serialized' => $serialized,
802 497 )
803 498 );
804 499 }
@@ -809,9 +504,9 @@
809 504 * @param string $param
810 505 * @param string $sanitize
811 506 * @param string $default
812 507 *
813 - * @return array|string
508 + * @return string|array
814 509 */
815 510 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
816 511 return self::get_simple_request(
817 512 array(
@@ -829,40 +524,39 @@
829 524 * @since 2.0.6
830 525 *
831 526 * @param array $args
832 527 *
833 - * @return array|string
528 + * @return string|array
834 529 */
835 530 public static function get_simple_request( $args ) {
836 531 $defaults = array(
837 - 'param' => '',
838 - 'default' => '',
839 - 'type' => 'get',
840 - 'sanitize' => 'sanitize_text_field',
532 + 'param' => '',
533 + 'default' => '',
534 + 'type' => 'get',
535 + 'sanitize' => 'sanitize_text_field',
841 536 'serialized' => false,
842 537 );
843 538 $args = wp_parse_args( $args, $defaults );
844 539
845 540 $value = $args['default'];
846 -
847 - if ( $args['type'] === 'get' ) {
541 + if ( $args['type'] == 'get' ) {
848 542 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
849 543 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
850 544 $value = wp_unslash( $_GET[ $args['param'] ] );
851 545 }
852 - } elseif ( $args['type'] === 'post' ) {
546 + } elseif ( $args['type'] == 'post' ) {
853 547 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
854 548 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
855 549 $value = wp_unslash( $_POST[ $args['param'] ] );
856 -
857 550 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
858 551 self::unserialize_or_decode( $value );
859 552 }
860 553 }
861 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
862 - // phpcs:ignore WordPress.Security.NonceVerification.Missing
554 + } else {
555 + if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
863 556 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
864 557 $value = wp_unslash( $_REQUEST[ $args['param'] ] );
558 + }
865 559 }
866 560
867 561 self::sanitize_value( $args['sanitize'], $value );
868 562
@@ -886,48 +580,23 @@
886 580
887 581 return $value;
888 582 }
889 583
890 - /**
891 - * Sanitize a value in-place.
892 - * If $value is an array, the sanitize function will get called for each item.
893 - *
894 - * @param callable $sanitize
895 - * @param mixed $value
896 - *
897 - * @return void
898 - */
899 584 public static function sanitize_value( $sanitize, &$value ) {
900 - if ( ! $sanitize ) {
901 - return;
902 - }
903 -
904 - if ( is_object( $value ) ) {
905 - $value = '';
906 - return;
907 - }
908 -
909 - if ( is_array( $value ) ) {
910 - $temp_values = $value;
911 -
912 - foreach ( $temp_values as $k => $v ) {
913 - 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 );
914 593 }
915 - return;
916 594 }
917 -
918 - $value = call_user_func( $sanitize, $value );
919 595 }
920 596
921 - /**
922 - * @param array $sanitize_method
923 - * @param array $values
924 - *
925 - * @return void
926 - */
927 597 public static function sanitize_request( $sanitize_method, &$values ) {
928 598 $temp_values = $values;
929 -
930 599 foreach ( $temp_values as $k => $val ) {
931 600 if ( isset( $sanitize_method[ $k ] ) ) {
932 601 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
933 602 }
@@ -935,64 +604,23 @@
935 604 }
936 605
937 606 /**
938 607 * @since 4.0.04
939 - *
940 - * @param mixed $value
941 - *
942 - * @return void
943 608 */
944 609 public static function sanitize_with_html( &$value ) {
945 - if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
946 - // Only strip unsafe HTML like scripts for a privileged user submitting a form.
947 - self::sanitize_value( 'wp_kses_post', $value );
948 - } else {
949 - self::sanitize_value( self::class . '::strip_most_html', $value );
950 - }
610 + self::sanitize_value( 'wp_kses_post', $value );
951 611 self::decode_specialchars( $value );
952 612 }
953 613
954 614 /**
955 - * Allow only a small set of very basic HTML for unprivileged users.
956 - *
957 - * @since 6.7.1
958 - *
959 - * @param string $value
960 - */
961 - public static function strip_most_html( $value ) {
962 - $allowed_html = array(
963 - 'b' => array(),
964 - 'br' => array(),
965 - 'strong' => array(),
966 - 'p' => array(),
967 - 'i' => array(),
968 - 'ul' => array(),
969 - 'ol' => array(),
970 - 'li' => array(),
971 - );
972 -
973 - /**
974 - * @since 6.7.1
975 - *
976 - * @param array $allowed_html
977 - */
978 - $allowed_html = apply_filters( 'frm_allowed_form_input_html', $allowed_html );
979 -
980 - return wp_kses( $value, $allowed_html );
981 - }
982 -
983 - /**
984 615 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
985 616 * this MUST be done, else we'll be back to the '& entity' problem.
986 617 *
987 618 * @since 4.0.04
988 - *
989 - * @param mixed $value Value to decode, passed by reference.
990 619 */
991 620 public static function decode_specialchars( &$value ) {
992 621 if ( is_array( $value ) ) {
993 622 $temp_values = $value;
994 -
995 623 foreach ( $temp_values as $k => $v ) {
996 624 self::decode_specialchars( $value[ $k ] );
997 625 }
998 626 } else {
@@ -1006,9 +634,9 @@
1006 634 * Adapted from wp_specialchars_decode().
1007 635 *
1008 636 * @since 4.03.01
1009 637 *
1010 - * @param string $string The string to prep, passed by reference.
638 + * @param string $string The string to prep.
1011 639 */
1012 640 private static function decode_amp( &$string ) {
1013 641 // Don't bother if there are no entities - saves a lot of processing
1014 642 if ( empty( $string ) || strpos( $string, '&' ) === false ) {
@@ -1018,12 +646,10 @@
1018 646 $translation = array(
1019 647 '&quot;' => '"',
1020 648 '&#034;' => '"',
1021 649 '&#x22;' => '"',
1022 - // The space preserves the HTML.
1023 - '&lt; ' => '< ',
1024 - // The space preserves the HTML.
1025 - '&#060; ' => '< ',
650 + '&lt; ' => '< ', // The space preserves the HTML.
651 + '&#060; ' => '< ', // The space preserves the HTML.
1026 652 '&gt;' => '>',
1027 653 '&#062;' => '>',
1028 654 '&amp;' => '&',
1029 655 '&#038;' => '&',
@@ -1050,10 +676,10 @@
1050 676 * Sanitize the value, and allow some HTML
1051 677 *
1052 678 * @since 2.0
1053 679 *
1054 - * @param string $value The value to sanitize.
1055 - * @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
1056 682 *
1057 683 * @return string
1058 684 */
1059 685 public static function kses( $value, $allowed = array() ) {
@@ -1062,28 +688,13 @@
1062 688 return wp_kses( $value, $allowed_html );
1063 689 }
1064 690
1065 691 /**
1066 - * Sanitizes and echoes a given value.
1067 - *
1068 - * @since 6.18
1069 - *
1070 - * @param string $value The value to sanitize and output.
1071 - * @param array|string $allowed Allowed HTML tags and attributes.
1072 - *
1073 - * @return void
1074 - */
1075 - public static function kses_echo( $value, $allowed = array() ) {
1076 - echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1077 - }
1078 -
1079 - /**
1080 692 * The regular kses function strips [button_action] from submit button HTML.
1081 693 *
1082 694 * @since 5.0.13
1083 695 *
1084 696 * @param string $html
1085 - *
1086 697 * @return string
1087 698 */
1088 699 public static function kses_submit_button( $html ) {
1089 700 $included_button_action = false !== strpos( $html, '[button_action]' );
@@ -1093,9 +704,8 @@
1093 704 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1094 705 $html = self::kses( $html, 'all' );
1095 706 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1096 707 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1097 -
1098 708 if ( $included_button_action ) {
1099 709 if ( false !== strpos( $html, '<input type="submit"' ) ) {
1100 710 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1101 711 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
@@ -1103,13 +713,11 @@
1103 713 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1104 714 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1105 715 }
1106 716 }
1107 -
1108 717 if ( $included_back_hook ) {
1109 718 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1110 719 }
1111 -
1112 720 if ( $included_draft_hook ) {
1113 721 $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1114 722 }
1115 723 return $html;
@@ -1118,9 +726,8 @@
1118 726 /**
1119 727 * @since 5.0.13
1120 728 *
1121 729 * @param array $allowed_attr
1122 - *
1123 730 * @return array
1124 731 */
1125 732 public static function allow_visibility_style( $allowed_attr ) {
1126 733 $allowed_attr[] = 'visibility';
@@ -1130,9 +737,8 @@
1130 737 /**
1131 738 * @since 5.0.13
1132 739 *
1133 740 * @param array $allowed_html
1134 - *
1135 741 * @return array
1136 742 */
1137 743 public static function add_allowed_submit_button_tags( $allowed_html ) {
1138 744 $allowed_html['input'] = array(
@@ -1149,22 +755,17 @@
1149 755 }
1150 756
1151 757 /**
1152 758 * @since 2.05.03
1153 - *
1154 - * @param array|string $allowed
1155 - *
1156 - * @return array
1157 759 */
1158 760 private static function allowed_html( $allowed ) {
1159 761 $html = self::safe_html();
1160 762 $allowed_html = array();
1161 -
1162 763 if ( $allowed === 'all' ) {
1163 764 $allowed_html = $html;
1164 765 } elseif ( ! empty( $allowed ) ) {
1165 766 foreach ( (array) $allowed as $a ) {
1166 - $allowed_html[ $a ] = $html[ $a ] ?? array();
767 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1167 768 }
1168 769 }
1169 770
1170 771 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1179,9 +780,9 @@
1179 780 'id' => true,
1180 781 );
1181 782
1182 783 return array(
1183 - 'a' => array(
784 + 'a' => array(
1184 785 'class' => true,
1185 786 'href' => true,
1186 787 'id' => true,
1187 788 'rel' => true,
@@ -1250,16 +851,16 @@
1250 851 'cite' => true,
1251 852 'title' => true,
1252 853 ),
1253 854 'rect' => array(
1254 - 'class' => true,
1255 - 'fill' => true,
1256 - 'height' => true,
1257 - 'width' => true,
1258 - 'x' => true,
1259 - 'y' => true,
1260 - 'rx' => true,
1261 - '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,
1262 863 'stroke-opacity' => true,
1263 864 'stroke-width' => true,
1264 865 ),
1265 866 'section' => $allow_class,
@@ -1294,9 +895,9 @@
1294 895 'xlink:href' => true,
1295 896 ),
1296 897 'ul' => $allow_class,
1297 898 'label' => array(
1298 - 'for' => true,
899 + 'for' => true,
1299 900 'class' => true,
1300 901 'id' => true,
1301 902 ),
1302 903 'button' => array(
@@ -1305,13 +906,8 @@
1305 906 ),
1306 907 'legend' => array(
1307 908 'class' => true,
1308 909 ),
1309 - 'option' => array(
1310 - 'class' => true,
1311 - 'value' => true,
1312 - 'selected' => true,
1313 - ),
1314 910 );
1315 911 }
1316 912
1317 913 /**
@@ -1319,20 +915,18 @@
1319 915 *
1320 916 * @since 2.0
1321 917 */
1322 918 public static function remove_get_action() {
1323 - if ( empty( $_GET ) ) {
919 + if ( ! isset( $_GET ) ) {
1324 920 return;
1325 921 }
1326 922
1327 923 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1328 -
1329 924 if ( empty( $action_name ) ) {
1330 925 return;
1331 926 }
1332 927
1333 928 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1334 -
1335 929 if ( ! empty( $new_action ) ) {
1336 930 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1337 931 }
1338 932 }
@@ -1340,13 +934,9 @@
1340 934 /**
1341 935 * Check the WP query for a parameter
1342 936 *
1343 937 * @since 2.0
1344 - *
1345 - * @param array|string $value
1346 - * @param string $param
1347 - *
1348 - * @return array|string
938 + * @return string|array
1349 939 */
1350 940 public static function get_query_var( $value, $param ) {
1351 941 if ( $value != '' ) {
1352 942 return $value;
@@ -1352,9 +942,8 @@
1352 942 return $value;
1353 943 }
1354 944
1355 945 global $wp_query;
1356 -
1357 946 if ( isset( $wp_query->query_vars[ $param ] ) ) {
1358 947 $value = $wp_query->query_vars[ $param ];
1359 948 }
1360 949
@@ -1364,17 +953,13 @@
1364 953 /**
1365 954 * Try to show the SVG if possible. Otherwise, use the font icon.
1366 955 *
1367 956 * @since 4.0.02
1368 - *
1369 957 * @param string $class
1370 958 * @param array $atts
1371 - *
1372 - * @return string|null
1373 959 */
1374 960 public static function icon_by_class( $class, $atts = array() ) {
1375 961 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1376 -
1377 962 if ( isset( $atts['echo'] ) ) {
1378 963 unset( $atts['echo'] );
1379 964 }
1380 965
@@ -1381,17 +966,14 @@
1381 966 $html_atts = self::array_to_html_params( $atts );
1382 967
1383 968 $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1384 969
1385 - // Replace icons that have been removed or renamed.
970 + // Replace icons that have been removed.
1386 971 $deprecated = array(
1387 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1388 - 'frm_keyalt_icon' => 'frm_key_icon',
1389 - 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
972 + 'frm_clone_solid_icon' => 'frm_clone_icon',
1390 973 );
1391 -
1392 974 if ( isset( $deprecated[ $icon ] ) ) {
1393 - $icon = $deprecated[ $icon ];
975 + $icon = $deprecated[ $icon ];
1394 976 $class = str_replace( $icon, $deprecated[ $icon ], $class );
1395 977 }
1396 978
1397 979 if ( $icon === $class ) {
@@ -1397,15 +979,15 @@
1397 979 if ( $icon === $class ) {
1398 980 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1399 981 } else {
1400 982 $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1401 -
1402 983 if ( strpos( $icon, ' ' ) ) {
1403 984 $icon = explode( ' ', $icon );
1404 985 $icon = reset( $icon );
1405 986 }
1406 -
1407 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use xlink:href="#' . esc_attr( $icon ) . '" /></svg>';
987 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
988 + <use xlink:href="#' . esc_attr( $icon ) . '" />
989 + </svg>';
1408 990 }
1409 991
1410 992 if ( $echo ) {
1411 993 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
@@ -1419,9 +1001,8 @@
1419 1001 *
1420 1002 * @since 5.0.13
1421 1003 *
1422 1004 * @param string $icon
1423 - *
1424 1005 * @return string
1425 1006 */
1426 1007 public static function kses_icon( $icon ) {
1427 1008 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1437,15 +1018,13 @@
1437 1018 /**
1438 1019 * @since 5.0.13.1
1439 1020 *
1440 1021 * @param array $allowed_html
1441 - *
1442 1022 * @return array
1443 1023 */
1444 1024 public static function add_allowed_icon_tags( $allowed_html ) {
1445 1025 $allowed_html['svg']['data-open'] = true;
1446 1026 $allowed_html['svg']['title'] = true;
1447 - $allowed_html['svg']['tabindex'] = true;
1448 1027 return $allowed_html;
1449 1028 }
1450 1029
1451 1030 /**
@@ -1451,9 +1030,8 @@
1451 1030 /**
1452 1031 * @since 5.0.13
1453 1032 *
1454 1033 * @param array $allowed_attr
1455 - *
1456 1034 * @return array
1457 1035 */
1458 1036 public static function allow_vars_in_styles( $allowed_attr ) {
1459 1037 $allowed_attr[] = '--primary-700';
@@ -1477,14 +1055,12 @@
1477 1055 /**
1478 1056 * @since 5.0.13
1479 1057 *
1480 1058 * @param string $value
1481 - *
1482 1059 * @return bool
1483 1060 */
1484 1061 private static function is_a_valid_color( $value ) {
1485 1062 $match = 0;
1486 -
1487 1063 if ( 0 === strpos( $value, 'rgba(' ) ) {
1488 1064 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1489 1065 } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1490 1066 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
@@ -1497,19 +1073,11 @@
1497 1073 /**
1498 1074 * Include svg images.
1499 1075 *
1500 1076 * @since 4.0.02
1501 - *
1502 - * @return void
1503 1077 */
1504 1078 public static function include_svg() {
1505 - if ( self::$included_svg ) {
1506 - return;
1507 - }
1508 -
1509 - // Use readfile instead of include_once because of a default security rule in Snuffleupagus.
1510 - readfile( self::plugin_path() . '/images/icons.svg' );
1511 - self::$included_svg = true;
1079 + include_once self::plugin_path() . '/images/icons.svg';
1512 1080 }
1513 1081
1514 1082 /**
1515 1083 * Convert an associative array to HTML values.
@@ -1518,13 +1086,12 @@
1518 1086 * @since 5.0.13 added $echo parameter.
1519 1087 *
1520 1088 * @param array $atts
1521 1089 * @param bool $echo
1522 - *
1523 1090 * @return string|void
1524 1091 */
1525 1092 public static function array_to_html_params( $atts, $echo = false ) {
1526 - $callback = function () use ( $atts ) {
1093 + $callback = function() use ( $atts ) {
1527 1094 if ( $atts ) {
1528 1095 foreach ( $atts as $key => $value ) {
1529 1096 echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1530 1097 }
@@ -1539,10 +1106,9 @@
1539 1106 * @since 5.0.13
1540 1107 *
1541 1108 * @param Closure $echo_function
1542 1109 * @param bool $echo
1543 - *
1544 - * @return string|null
1110 + * @return string|void
1545 1111 */
1546 1112 public static function clip( $echo_function, $echo = false ) {
1547 1113 if ( ! $echo ) {
1548 1114 ob_start();
@@ -1547,11 +1113,9 @@
1547 1113 if ( ! $echo ) {
1548 1114 ob_start();
1549 1115 }
1550 1116
1551 - if ( is_callable( $echo_function ) ) {
1552 - $echo_function();
1553 - }
1117 + $echo_function();
1554 1118
1555 1119 if ( ! $echo ) {
1556 1120 $return = ob_get_contents();
1557 1121 ob_end_clean();
@@ -1560,25 +1124,19 @@
1560 1124 }
1561 1125
1562 1126 /**
1563 1127 * @since 3.0
1564 - *
1565 - * @param array $atts
1566 - *
1567 - * @return void
1568 1128 */
1569 1129 public static function get_admin_header( $atts ) {
1570 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1571 -
1572 - 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'] ) ) {
1573 1132 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1574 1133 }
1575 -
1576 1134 if ( ! isset( $atts['import_link'] ) ) {
1577 1135 $atts['import_link'] = false;
1578 1136 }
1579 1137
1580 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
1138 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1581 1139 }
1582 1140
1583 1141 /**
1584 1142 * @since 6.0
@@ -1583,9 +1141,8 @@
1583 1141 /**
1584 1142 * @since 6.0
1585 1143 *
1586 1144 * @param string $type
1587 - *
1588 1145 * @return void
1589 1146 */
1590 1147 public static function import_link( $type = 'secondary' ) {
1591 1148 ?>
@@ -1600,9 +1157,8 @@
1600 1157 *
1601 1158 * @since 5.4.2
1602 1159 *
1603 1160 * @param bool $should_show_lite_upgrade
1604 - *
1605 1161 * @return void
1606 1162 */
1607 1163 public static function print_admin_banner( $should_show_lite_upgrade ) {
1608 1164 if ( ! current_user_can( 'administrator' ) ) {
@@ -1609,9 +1165,9 @@
1609 1165 FrmInbox::maybe_show_banner();
1610 1166 return;
1611 1167 }
1612 1168
1613 - 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() ) {
1614 1170 // Print license warning or inbox banner and exit if either prints.
1615 1171 // And exit before printing the upgrade bar if it shouldn't be shown.
1616 1172 return;
1617 1173 }
@@ -1616,37 +1172,10 @@
1616 1172 return;
1617 1173 }
1618 1174 ?>
1619 1175 <div class="frm-upgrade-bar">
1620 - <div class="frm-upgrade-bar-inner">
1621 - <?php
1622 - $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1623 -
1624 - if ( ! $cta_text ) {
1625 - $cta_text = __( 'upgrading to PRO', 'formidable' );
1626 - }
1627 -
1628 - $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1629 - $utm = array(
1630 - 'campaign' => 'settings-license',
1631 - 'content' => 'lite-banner',
1632 - );
1633 -
1634 - if ( $upgrade_link ) {
1635 - $upgrade_link = self::maybe_add_missing_utm( $upgrade_link, $utm );
1636 - } else {
1637 - $upgrade_link = self::admin_upgrade_link( $utm );
1638 - }
1639 -
1640 - printf(
1641 - /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1642 - esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
1643 - '<a href="' . esc_url( $upgrade_link ) . '">',
1644 - esc_html( $cta_text ),
1645 - '</a>'
1646 - );
1647 - ?>
1648 - </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>.
1649 1178 </div>
1650 1179 <?php
1651 1180 }
1652 1181
@@ -1662,18 +1191,14 @@
1662 1191 /**
1663 1192 * Render a button for a new item (Form, Application, etc).
1664 1193 *
1665 1194 * @since 3.0
1666 - *
1667 1195 * @param array $atts {
1668 - * Details about the button.
1669 - *
1670 1196 * @type array $link_hook Custom link hook, calls do_action and exits early.
1671 1197 * @type string $new_link Href value, default #.
1672 1198 * @type string $class Custom class names, space separated.
1673 1199 * @type string $button_text Button text. Default "Add New".
1674 1200 * }
1675 - *
1676 1201 * @return void
1677 1202 */
1678 1203 public static function add_new_item_link( $atts ) {
1679 1204 if ( isset( $atts['link_hook'] ) ) {
@@ -1680,9 +1205,9 @@
1680 1205 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1681 1206 return;
1682 1207 }
1683 1208
1684 - 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'] ) ) {
1685 1210 // Do not render a button if none of these attributes are set.
1686 1211 return;
1687 1212 }
1688 1213
@@ -1688,8 +1213,12 @@
1688 1213
1689 1214 $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1690 1215 $class = 'button button-primary frm-button-primary';
1691 1216
1217 + if ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1218 + $class .= ' frm-trigger-new-form-modal';
1219 + }
1220 +
1692 1221 if ( ! empty( $atts['class'] ) ) {
1693 1222 $class .= ' ' . $atts['class'];
1694 1223 }
1695 1224
@@ -1699,12 +1228,8 @@
1699 1228 }
1700 1229
1701 1230 /**
1702 1231 * @since 3.06
1703 - *
1704 - * @param array $atts
1705 - *
1706 - * @return void
1707 1232 */
1708 1233 public static function show_search_box( $atts ) {
1709 1234 $defaults = array(
1710 1235 'placeholder' => '',
@@ -1710,12 +1235,10 @@
1710 1235 'placeholder' => '',
1711 1236 'tosearch' => '',
1712 1237 'text' => __( 'Search', 'formidable' ),
1713 1238 'input_id' => '',
1714 - 'value' => false,
1715 - 'class' => '',
1716 1239 );
1717 - $atts = array_merge( $defaults, $atts );
1240 + $atts = array_merge( $defaults, $atts );
1718 1241
1719 1242 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1720 1243 $atts['tosearch'] = 'frm-card';
1721 1244 }
@@ -1720,9 +1243,8 @@
1720 1243 $atts['tosearch'] = 'frm-card';
1721 1244 }
1722 1245
1723 1246 $class = 'frm-search-input';
1724 -
1725 1247 if ( ! empty( $atts['tosearch'] ) ) {
1726 1248 $class .= ' frm-auto-search';
1727 1249 }
1728 1250
@@ -1727,34 +1249,21 @@
1727 1249 }
1728 1250
1729 1251 $input_id = $atts['input_id'] . '-search-input';
1730 1252
1731 - $input_atts = array(
1732 - 'type' => 'search',
1733 - 'id' => $input_id,
1734 - 'name' => 's',
1735 - 'placeholder' => $atts['placeholder'],
1736 - 'class' => $class,
1737 - 'data-tosearch' => $atts['tosearch'],
1738 - );
1739 -
1740 - if ( is_string( $atts['value'] ) ) {
1741 - $input_atts['value'] = $atts['value'];
1742 - } elseif ( isset( $_REQUEST['s'] ) ) {
1743 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1744 - $input_atts['value'] = wp_unslash( $_REQUEST['s'] );
1745 - }
1746 -
1747 - if ( ! empty( $atts['tosearch'] ) ) {
1748 - $input_atts['autocomplete'] = 'off';
1749 - }
1750 1253 ?>
1751 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1254 + <p class="frm-search">
1752 1255 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1753 1256 <?php echo esc_html( $atts['text'] ); ?>:
1754 1257 </label>
1755 - <?php self::icon_by_class( 'frm_icon_font frm_search_icon frm_svg20' ); ?>
1756 - <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 + />
1757 1266 <?php
1758 1267 if ( empty( $atts['tosearch'] ) ) {
1759 1268 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1760 1269 }
@@ -1763,17 +1272,13 @@
1763 1272 <?php
1764 1273 }
1765 1274
1766 1275 /**
1767 - * @param string $type Hook type slug.
1768 - * @param object|null $object Optional related object.
1769 - *
1770 - * @return void
1276 + * @param string $type
1771 1277 */
1772 1278 public static function trigger_hook_load( $type, $object = null ) {
1773 1279 // Only load the form hooks once.
1774 1280 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1775 -
1776 1281 if ( ! $hooks_loaded ) {
1777 1282 do_action( 'frm_load_' . $type . '_hooks' );
1778 1283 }
1779 1284 }
@@ -1778,14 +1283,11 @@
1778 1283 }
1779 1284 }
1780 1285
1781 1286 /**
1782 - * Save all front-end js scripts into a single file.
1783 - * And save an additional single file of all front-end Stripe JS scripts.
1287 + * Save all front-end js scripts into a single file
1784 1288 *
1785 1289 * @since 3.0
1786 - *
1787 - * @return void
1788 1290 */
1789 1291 public static function save_combined_js() {
1790 1292 $file_atts = apply_filters(
1791 1293 'frm_js_location',
@@ -1798,34 +1300,10 @@
1798 1300
1799 1301 $files = array(
1800 1302 self::plugin_path() . '/js/formidable.min.js',
1801 1303 );
1802 - /**
1803 - * @param array $files
1804 - */
1805 1304 $files = apply_filters( 'frm_combined_js_files', $files );
1806 1305 $new_file->combine_files( $files );
1807 -
1808 - // Create the minified Stripe Script.
1809 - $file_atts = apply_filters(
1810 - 'frm_stripe_js_location',
1811 - array(
1812 - 'file_name' => 'frmstrp.min.js',
1813 - 'new_file_path' => self::plugin_path() . '/js',
1814 - )
1815 - );
1816 - $new_file = new FrmCreateFile( $file_atts );
1817 - $files = array(
1818 - FrmStrpLiteAppHelper::plugin_path() . 'js/frmstrp.min.js',
1819 - );
1820 -
1821 - /**
1822 - * @since 6.5
1823 - *
1824 - * @param array $files
1825 - */
1826 - $files = apply_filters( 'frm_stripe_combined_js_files', $files );
1827 - $new_file->combine_files( $files );
1828 1306 }
1829 1307
1830 1308 /**
1831 1309 * Check a value from a shortcode to see if true or false.
@@ -1832,14 +1310,14 @@
1832 1310 * True when value is 1, true, 'true', 'yes'
1833 1311 *
1834 1312 * @since 1.07.10
1835 1313 *
1836 - * @param string $value The value to compare.
1314 + * @param string $value The value to compare
1837 1315 *
1838 - * @return bool
1316 + * @return boolean True or False
1839 1317 */
1840 1318 public static function is_true( $value ) {
1841 - return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1319 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1842 1320 }
1843 1321
1844 1322 /**
1845 1323 * Gets all post from a specific post type.
@@ -1847,9 +1325,8 @@
1847 1325 *
1848 1326 * @since 4.10.01 Add `$post_type` argument.
1849 1327 *
1850 1328 * @param string $post_type Post type to query. Default is `page`.
1851 - *
1852 1329 * @return WP_Post[]
1853 1330 */
1854 1331 public static function get_pages( $post_type = 'page' ) {
1855 1332 $query = array(
@@ -1868,9 +1345,8 @@
1868 1345 *
1869 1346 * @since 5.0.09
1870 1347 *
1871 1348 * @param string $post_type Post type to query. Default is `page`.
1872 - *
1873 1349 * @return array
1874 1350 */
1875 1351 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1876 1352 return FrmDb::get_results(
@@ -1899,9 +1375,9 @@
1899 1375 $args = self::preformat_selection_args( $args );
1900 1376
1901 1377 $pages_count = wp_count_posts( $args['post_type'] );
1902 1378
1903 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1379 + if ( $pages_count->publish <= 50 ) {
1904 1380 self::wp_pages_dropdown( $args );
1905 1381 return;
1906 1382 }
1907 1383
@@ -1907,9 +1383,9 @@
1907 1383
1908 1384 wp_enqueue_script( 'jquery-ui-autocomplete' );
1909 1385
1910 1386 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1911 - $title = '';
1387 + $title = '';
1912 1388
1913 1389 if ( $selected ) {
1914 1390 $title = get_the_title( $selected );
1915 1391 }
@@ -1925,116 +1401,18 @@
1925 1401 <?php
1926 1402 }
1927 1403
1928 1404 /**
1929 - * Maybe show an HTML select or autocomplete input based on the number of options.
1930 - *
1931 - * @since 6.21
1932 - *
1933 - * @param array $args Args. See the method for details.
1405 + * @param array $args
1406 + * @param string $page_id Deprecated.
1407 + * @param boolean $truncate Deprecated.
1934 1408 */
1935 - public static function maybe_autocomplete_options( $args ) {
1936 - $defaults = array(
1937 - 'truncate' => false,
1938 - 'placeholder' => ' ',
1939 - 'name' => '',
1940 - 'id' => '',
1941 - 'selected' => '',
1942 - 'source' => array(),
1943 - 'dropdown_limit' => 50,
1944 - 'autocomplete_placeholder' => __( 'Select an option', 'formidable' ),
1945 - 'value_key' => 'value',
1946 - 'label_key' => 'label',
1947 - );
1948 -
1949 - $args = wp_parse_args( $args, $defaults );
1950 -
1951 - $html_attrs = array();
1952 -
1953 - if ( ! empty( $args['name'] ) ) {
1954 - $html_attrs['name'] = $args['name'];
1955 - }
1956 -
1957 - if ( ! empty( $args['id'] ) ) {
1958 - $html_attrs['id'] = $args['id'];
1959 - }
1960 -
1961 - if ( count( $args['source'] ) <= $args['dropdown_limit'] ) {
1962 - ?>
1963 - <select <?php self::array_to_html_params( $html_attrs, true ); ?>>
1964 - <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1965 - <?php
1966 - foreach ( $args['source'] as $key => $source ) :
1967 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1968 -
1969 - if ( ! empty( $args['truncate'] ) ) {
1970 - $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1971 - }
1972 - ?>
1973 - <option value="<?php echo esc_attr( $value_label['value'] ); ?>" <?php selected( $value_label['value'], $args['selected'] ); ?>><?php echo esc_html( $value_label['label'] ); ?></option>
1974 - <?php endforeach; ?>
1975 - </select>
1976 - <?php
1977 - } else {
1978 - $options = array();
1979 - $autocomplete_value = '';
1980 -
1981 - foreach ( $args['source'] as $key => $source ) {
1982 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1983 -
1984 - if ( $value_label['value'] === $args['selected'] ) {
1985 - $autocomplete_value = $value_label['label'];
1986 - }
1987 -
1988 - $options[] = $value_label;
1989 - }
1990 -
1991 - $html_attrs['type'] = 'hidden';
1992 - $html_attrs['class'] = 'frm_autocomplete_value_input';
1993 - $html_attrs['value'] = $args['selected'];
1994 - ?>
1995 - <input type="text" class="frm-custom-search"
1996 - data-source="<?php echo esc_attr( wp_json_encode( $options ) ); ?>"
1997 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1998 - value="<?php echo esc_attr( $autocomplete_value ); ?>" />
1999 - <input <?php self::array_to_html_params( $html_attrs, true ); ?> />
2000 - <?php
2001 - }//end if
2002 - }
2003 -
2004 - /**
2005 - * Gets dropdown value and label from autodropdown option.
2006 - *
2007 - * @since 6.21
2008 - *
2009 - * @param array|string $option Autocomplete option.
2010 - * @param string $key Array key of the option.
2011 - * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
2012 - *
2013 - * @return array
2014 - */
2015 - private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
2016 - if ( is_array( $option ) ) {
2017 - $value = $option[ $args['value_key'] ] ?? '';
2018 - $label = $option[ $args['label_key'] ] ?? '';
2019 - } else {
2020 - $value = $key;
2021 - $label = $option;
2022 - }
2023 -
2024 - return compact( 'value', 'label' );
2025 - }
2026 -
2027 - /**
2028 - * @param array $args
2029 - * @param string $page_id Deprecated.
2030 - * @param bool $truncate Deprecated.
2031 - */
2032 1409 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2033 1410 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2034 1411
2035 1412 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2036 1413 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1414 +
2037 1415 ?>
2038 1416 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2039 1417 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2040 1418 <?php foreach ( $pages as $page ) { ?>
@@ -2050,14 +1428,8 @@
2050 1428 * Fill in missing parameters passed to wp_pages_dropdown().
2051 1429 * This is for reverse compatibility with switching 3 params to 1.
2052 1430 *
2053 1431 * @since 4.03.06
2054 - *
2055 - * @param string $page_id Deprecated.
2056 - * @param bool $truncate Deprecated.
2057 - * @param mixed $args
2058 - *
2059 - * @return void
2060 1432 */
2061 1433 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2062 1434 if ( ! is_array( $args ) ) {
2063 1435 $args = array(
@@ -2074,20 +1446,16 @@
2074 1446 * Filter to format args for page dropdown or autocomplete
2075 1447 *
2076 1448 * @since 4.03.06
2077 1449 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2078 - *
2079 - * @param array $args
2080 - *
2081 - * @return array
2082 1450 */
2083 1451 private static function preformat_selection_args( $args ) {
2084 1452 $defaults = array(
2085 - 'truncate' => false,
2086 - 'placeholder' => ' ',
2087 - 'field_name' => '',
2088 - 'page_id' => '',
2089 - 'post_type' => 'page',
1453 + 'truncate' => false,
1454 + 'placeholder' => ' ',
1455 + 'field_name' => '',
1456 + 'page_id' => '',
1457 + 'post_type' => 'page',
2090 1458 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
2091 1459 );
2092 1460
2093 1461 return array_merge( $defaults, $args );
@@ -2092,16 +1460,10 @@
2092 1460
2093 1461 return array_merge( $defaults, $args );
2094 1462 }
2095 1463
2096 - /**
2097 - * @param int $post_id
2098 - *
2099 - * @return string
2100 - */
2101 1464 public static function post_edit_link( $post_id ) {
2102 1465 $post = get_post( $post_id );
2103 -
2104 1466 if ( $post ) {
2105 1467 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
2106 1468
2107 1469 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
@@ -2131,9 +1493,8 @@
2131 1493 * @since 5.5.3
2132 1494 * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2133 1495 *
2134 1496 * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2135 - *
2136 1497 * @return bool
2137 1498 */
2138 1499 public static function is_style_editor_page( $view = '' ) {
2139 1500 if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
@@ -2165,16 +1526,25 @@
2165 1526 return self::is_admin_page( 'formidable-views-editor' );
2166 1527 }
2167 1528
2168 1529 /**
2169 - * @param string $field_name
2170 - * @param array|string $capability
2171 - * @param string $multiple 'single' and 'multiple'.
1530 + * @since 4.0
1531 + * @deprecated 5.5.3
2172 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 + */
2173 1543 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2174 1544 ?>
2175 1545 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2176 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1546 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2177 1547 class="frm_multiselect">
2178 1548 <?php self::roles_options( $capability ); ?>
2179 1549 </select>
2180 1550 <?php
@@ -2181,11 +1551,10 @@
2181 1551 }
2182 1552
2183 1553 /**
2184 1554 * @since 4.07
2185 - *
2186 1555 * @param array|string $selected
2187 - * @param string $current
1556 + * @param string $current
2188 1557 */
2189 1558 private static function selected( $selected, $current ) {
2190 1559 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2191 1560 FrmProAppHelper::selected( $selected, $current );
@@ -2194,13 +1563,12 @@
2194 1563 }
2195 1564 }
2196 1565
2197 1566 /**
2198 - * @param array|string $capability
1567 + * @param string|array $capability
2199 1568 */
2200 1569 public static function roles_options( $capability ) {
2201 1570 global $frm_vars;
2202 -
2203 1571 if ( isset( $frm_vars['editable_roles'] ) ) {
2204 1572 $editable_roles = $frm_vars['editable_roles'];
2205 1573 } else {
2206 1574 $editable_roles = get_editable_roles();
@@ -2209,9 +1577,9 @@
2209 1577
2210 1578 foreach ( $editable_roles as $role => $details ) {
2211 1579 $name = translate_user_role( $details['name'] );
2212 1580 ?>
2213 - <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>
2214 1582 <?php
2215 1583 unset( $role, $details );
2216 1584 }
2217 1585 }
@@ -2221,9 +1589,8 @@
2221 1589 *
2222 1590 * @since 5.0 Parameter `$type` supports `pro_only` value.
2223 1591 *
2224 1592 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2225 - *
2226 1593 * @return array
2227 1594 */
2228 1595 public static function frm_capabilities( $type = 'auto' ) {
2229 1596 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2233,8 +1600,9 @@
2233 1600 $pro_cap = array(
2234 1601 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2235 1602 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2236 1603 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1604 + 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
2237 1605 );
2238 1606 /**
2239 1607 * @since 5.3.1
2240 1608 *
@@ -2257,9 +1625,9 @@
2257 1625 * @return array<string,string>
2258 1626 */
2259 1627 private static function get_lite_capabilities() {
2260 1628 return array(
2261 - 'frm_view_forms' => __( 'View Forms List', 'formidable' ),
1629 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
2262 1630 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2263 1631 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2264 1632 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2265 1633 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
@@ -2300,10 +1668,9 @@
2300 1668 return current_user_can( $role );
2301 1669 }
2302 1670
2303 1671 /**
2304 - * @param array|string $needed_role
2305 - *
1672 + * @param string|array $needed_role
2306 1673 * @return bool
2307 1674 */
2308 1675 public static function user_has_permission( $needed_role ) {
2309 1676 if ( is_array( $needed_role ) ) {
@@ -2322,14 +1689,12 @@
2322 1689 return $can;
2323 1690 }
2324 1691
2325 1692 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2326 -
2327 1693 foreach ( $roles as $role ) {
2328 1694 if ( current_user_can( $role ) ) {
2329 1695 return true;
2330 1696 }
2331 -
2332 1697 if ( $role == $needed_role ) {
2333 1698 break;
2334 1699 }
2335 1700 }
@@ -2351,9 +1716,8 @@
2351 1716
2352 1717 $user_id = get_current_user_id();
2353 1718 $user = new WP_User( $user_id );
2354 1719 $frm_roles = self::frm_capabilities();
2355 -
2356 1720 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2357 1721 $user->add_cap( $frm_role );
2358 1722 unset( $frm_role, $frm_role_description );
2359 1723 }
@@ -2362,18 +1726,13 @@
2362 1726 /**
2363 1727 * Make sure admins have permission to see the menu items
2364 1728 *
2365 1729 * @since 2.0.6
2366 - *
2367 - * @param string $cap
2368 - *
2369 - * @return void
2370 1730 */
2371 1731 public static function force_capability( $cap = 'frm_change_settings' ) {
2372 1732 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2373 1733 $role = get_role( 'administrator' );
2374 1734 $frm_roles = self::frm_capabilities();
2375 -
2376 1735 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2377 1736 $role->add_cap( $frm_role );
2378 1737 }
2379 1738 }
@@ -2379,19 +1738,17 @@
2379 1738 }
2380 1739 }
2381 1740
2382 1741 /**
2383 - * Check if the user has permission for action.
1742 + * Check if the user has permision for action.
2384 1743 * Return permission message and stop the action if no permission
2385 1744 *
2386 1745 * @since 2.0
2387 1746 *
2388 1747 * @param string $permission
2389 - * @param string $show_message
2390 1748 */
2391 1749 public static function permission_check( $permission, $show_message = 'show' ) {
2392 1750 $permission_error = self::permission_nonce_error( $permission );
2393 -
2394 1751 if ( $permission_error !== false ) {
2395 1752 if ( 'hide' == $show_message ) {
2396 1753 $permission_error = '';
2397 1754 }
@@ -2404,10 +1761,8 @@
2404 1761 *
2405 1762 * @since 2.0
2406 1763 *
2407 1764 * @param string $permission
2408 - * @param string $nonce_name
2409 - * @param string $nonce
2410 1765 *
2411 1766 * @return false|string The permission message or false if allowed
2412 1767 */
2413 1768 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
@@ -2417,15 +1772,13 @@
2417 1772 return $frm_settings->admin_permission;
2418 1773 }
2419 1774
2420 1775 $error = false;
2421 -
2422 1776 if ( empty( $nonce_name ) ) {
2423 1777 return $error;
2424 1778 }
2425 1779
2426 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2427 -
1780 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2428 1781 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2429 1782 $frm_settings = self::get_settings();
2430 1783 $error = $frm_settings->admin_permission;
2431 1784 }
@@ -2432,14 +1785,8 @@
2432 1785
2433 1786 return $error;
2434 1787 }
2435 1788
2436 - /**
2437 - * @param array|string $values
2438 - * @param string $current
2439 - *
2440 - * @return void
2441 - */
2442 1789 public static function checked( $values, $current ) {
2443 1790 if ( self::check_selected( $values, $current ) ) {
2444 1791 echo ' checked="checked"';
2445 1792 }
@@ -2444,39 +1791,24 @@
2444 1791 echo ' checked="checked"';
2445 1792 }
2446 1793 }
2447 1794
2448 - /**
2449 - * @param array|string $values
2450 - * @param string $current
2451 - *
2452 - * @return bool
2453 - */
2454 1795 public static function check_selected( $values, $current ) {
2455 - $values = self::recursive_function_map( $values, 'trim' );
2456 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1796 + $values = self::recursive_function_map( $values, 'trim' );
1797 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1798 + $current = htmlspecialchars_decode( trim( $current ) );
2457 1799
2458 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2459 -
2460 1800 return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2461 1801 }
2462 1802
2463 - /**
2464 - * @param array|string $value
2465 - * @param callable|string $function
2466 - *
2467 - * @return array|string
2468 - */
2469 1803 public static function recursive_function_map( $value, $function ) {
2470 1804 if ( is_array( $value ) ) {
2471 1805 $original_function = $function;
2472 -
2473 1806 if ( count( $value ) ) {
2474 1807 $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2475 1808 } else {
2476 1809 $function = array( $function );
2477 1810 }
2478 -
2479 1811 if ( ! self::is_assoc( $value ) ) {
2480 1812 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2481 1813 } else {
2482 1814 foreach ( $value as $k => $v ) {
@@ -2485,38 +1817,14 @@
2485 1817 }
2486 1818 }
2487 1819 }
2488 1820 } else {
2489 - $value = self::maybe_update_value_if_null( $value, $function );
2490 1821 $value = call_user_func( $function, $value );
2491 - }//end if
2492 -
2493 - return $value;
2494 - }
2495 -
2496 - /**
2497 - * Updates value to empty string if it is null and being passed to a string function.
2498 - *
2499 - * @since 6.8.4
2500 - *
2501 - * @param mixed $value
2502 - * @param string $function
2503 - *
2504 - * @return mixed
2505 - */
2506 - private static function maybe_update_value_if_null( $value, $function ) {
2507 - if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
2508 - $value = '';
2509 1822 }
2510 1823
2511 1824 return $value;
2512 1825 }
2513 1826
2514 - /**
2515 - * @param array $array
2516 - *
2517 - * @return bool
2518 - */
2519 1827 public static function is_assoc( $array ) {
2520 1828 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2521 1829 }
2522 1830
@@ -2521,24 +1829,20 @@
2521 1829 }
2522 1830
2523 1831 /**
2524 1832 * Flatten a multi-dimensional array
2525 - *
2526 - * @param array $array
2527 - * @param string $keys
2528 - *
2529 - * @return array
2530 1833 */
2531 1834 public static function array_flatten( $array, $keys = 'keep' ) {
2532 1835 $return = array();
2533 -
2534 1836 foreach ( $array as $key => $value ) {
2535 1837 if ( is_array( $value ) ) {
2536 1838 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2537 - } elseif ( $keys === 'keep' ) {
1839 + } else {
1840 + if ( $keys == 'keep' ) {
2538 1841 $return[ $key ] = $value;
2539 - } else {
2540 - $return[] = $value;
1842 + } else {
1843 + $return[] = $value;
1844 + }
2541 1845 }
2542 1846 }
2543 1847
2544 1848 return $return;
@@ -2543,43 +1847,16 @@
2543 1847
2544 1848 return $return;
2545 1849 }
2546 1850
2547 - /**
2548 - * Flatten an array before imploding it to avoid Array to string conversion warnings.
2549 - *
2550 - * @since 6.16.1
2551 - *
2552 - * @param string $sep
2553 - * @param array $array
2554 - *
2555 - * @return string
2556 - */
2557 - public static function safe_implode( $sep, $array ) {
2558 - $array = self::array_flatten( $array );
2559 - return implode( $sep, $array );
2560 - }
2561 -
2562 - /**
2563 - * @param string $text
2564 - * @param bool $is_rich_text
2565 - *
2566 - * @return string
2567 - */
2568 1851 public static function esc_textarea( $text, $is_rich_text = false ) {
2569 1852 $safe_text = str_replace( '&quot;', '"', $text );
2570 -
2571 1853 if ( ! $is_rich_text ) {
2572 1854 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2573 1855 }
2574 -
2575 1856 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2576 1857
2577 - /**
2578 - * @param string $safe_text
2579 - * @param string $text
2580 - */
2581 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1858 + return apply_filters( 'esc_textarea', $safe_text, $text );
2582 1859 }
2583 1860
2584 1861 /**
2585 1862 * Add auto paragraphs to text areas
@@ -2584,15 +1861,11 @@
2584 1861 /**
2585 1862 * Add auto paragraphs to text areas
2586 1863 *
2587 1864 * @since 2.0
2588 - *
2589 - * @param mixed $content
2590 - *
2591 - * @return mixed
2592 1865 */
2593 1866 public static function use_wpautop( $content ) {
2594 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
1867 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
2595 1868 $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2596 1869 }
2597 1870
2598 1871 return $content;
@@ -2597,15 +1870,8 @@
2597 1870
2598 1871 return $content;
2599 1872 }
2600 1873
2601 - /**
2602 - * Replace quotes with their HTML entities.
2603 - *
2604 - * @param string $val
2605 - *
2606 - * @return string
2607 - */
2608 1874 public static function replace_quotes( $val ) {
2609 1875 // Replace double quotes.
2610 1876 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2611 1877
@@ -2615,28 +1881,22 @@
2615 1881 return $val;
2616 1882 }
2617 1883
2618 1884 /**
2619 - * @param string $handle
2620 - * @param int|string $default
2621 - *
2622 - * @return int|string
1885 + * @param string $handle
2623 1886 */
2624 1887 public static function script_version( $handle, $default = 0 ) {
2625 1888 global $wp_scripts;
2626 -
2627 1889 if ( ! $wp_scripts ) {
2628 1890 return $default;
2629 1891 }
2630 1892
2631 1893 $ver = $default;
2632 -
2633 1894 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2634 1895 return $ver;
2635 1896 }
2636 1897
2637 1898 $query = $wp_scripts->registered[ $handle ];
2638 -
2639 1899 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2640 1900 $ver = $query->ver;
2641 1901 }
2642 1902
@@ -2647,23 +1907,17 @@
2647 1907 * @since 5.0.13 added $echo param.
2648 1908 *
2649 1909 * @param string $url
2650 1910 * @param bool $echo
2651 - *
2652 - * @return string|null
1911 + * @return string|void
2653 1912 */
2654 1913 public static function js_redirect( $url, $echo = false ) {
2655 - $callback = function () use ( $url ) {
1914 + $callback = function() use ( $url ) {
2656 1915 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2657 1916 };
2658 1917 return self::clip( $callback, $echo );
2659 1918 }
2660 1919
2661 - /**
2662 - * @param int|string $user_id
2663 - *
2664 - * @return int|string
2665 - */
2666 1920 public static function get_user_id_param( $user_id ) {
2667 1921 if ( ! $user_id || is_numeric( $user_id ) ) {
2668 1922 return $user_id;
2669 1923 }
@@ -2668,10 +1922,9 @@
2668 1922 return $user_id;
2669 1923 }
2670 1924
2671 1925 $user_id = sanitize_text_field( $user_id );
2672 -
2673 - if ( $user_id === 'current' ) {
1926 + if ( $user_id == 'current' ) {
2674 1927 $user_id = get_current_user_id();
2675 1928 } else {
2676 1929 if ( is_email( $user_id ) ) {
2677 1930 $user = get_user_by( 'email', $user_id );
@@ -2687,14 +1940,8 @@
2687 1940
2688 1941 return $user_id;
2689 1942 }
2690 1943
2691 - /**
2692 - * @param string $filename
2693 - * @param array $atts
2694 - *
2695 - * @return false|string
2696 - */
2697 1944 public static function get_file_contents( $filename, $atts = array() ) {
2698 1945 if ( ! is_file( $filename ) ) {
2699 1946 return false;
2700 1947 }
@@ -2700,9 +1947,9 @@
2700 1947 }
2701 1948
2702 1949 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2703 1950 ob_start();
2704 - include $filename;
1951 + include( $filename );
2705 1952 $contents = ob_get_contents();
2706 1953 ob_end_clean();
2707 1954
2708 1955 return $contents;
@@ -2716,9 +1963,8 @@
2716 1963 * @param int $num_chars
2717 1964 */
2718 1965 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2719 1966 $key = '';
2720 -
2721 1967 if ( $name ) {
2722 1968 $key = sanitize_key( $name );
2723 1969 $key = self::maybe_clear_long_key( $key, $column );
2724 1970 }
@@ -2758,9 +2004,9 @@
2758 2004 ++$suffix;
2759 2005 } while ( in_array( $key_check, $similar_keys, true ) );
2760 2006
2761 2007 $key = $key_check;
2762 - }//end if
2008 + }
2763 2009
2764 2010 return $key;
2765 2011 }
2766 2012
@@ -2769,18 +2015,15 @@
2769 2015 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2770 2016 *
2771 2017 * @param string $column
2772 2018 * @param string $key
2773 - *
2774 2019 * @return string
2775 2020 */
2776 2021 private static function maybe_truncate_key_before_appending( $column, $key ) {
2777 2022 if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2778 2023 $max_key_length_before_truncating = 60;
2779 -
2780 2024 if ( strlen( $key ) > $max_key_length_before_truncating ) {
2781 2025 $key = substr( $key, 0, $max_key_length_before_truncating );
2782 -
2783 2026 if ( is_numeric( $key ) ) {
2784 2027 $key .= 'a';
2785 2028 }
2786 2029 }
@@ -2792,9 +2035,8 @@
2792 2035 * Possibly reset a key to avoid conflicts with column size limits.
2793 2036 *
2794 2037 * @param string $key
2795 2038 * @param string $column
2796 - *
2797 2039 * @return string either the original key value, or an empty string if the key was too long.
2798 2040 */
2799 2041 private static function maybe_clear_long_key( $key, $column ) {
2800 2042 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
@@ -2803,25 +2045,19 @@
2803 2045 return $key;
2804 2046 }
2805 2047
2806 2048 /**
2807 - * @since 6.21 This is changed from `private` to `public`.
2808 - *
2809 2049 * @param int $num_chars
2810 - *
2811 2050 * @return string
2812 2051 */
2813 - public static function generate_new_key( $num_chars ) {
2814 - $max_slug_value = 36 ** $num_chars;
2815 -
2816 - // We want to have at least 2 characters in the slug.
2817 - $min_slug_value = 37;
2818 - 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 );
2819 2056 }
2820 2057
2821 2058 /**
2822 2059 * @param string $key
2823 - *
2824 2060 * @return string
2825 2061 */
2826 2062 private static function prevent_numeric_and_reserved_keys( $key ) {
2827 2063 if ( is_numeric( $key ) ) {
@@ -2835,9 +2071,8 @@
2835 2071 'editlink',
2836 2072 'siteurl',
2837 2073 'evenodd',
2838 2074 );
2839 -
2840 2075 if ( in_array( $key, $not_allowed, true ) ) {
2841 2076 $key .= 'a';
2842 2077 }
2843 2078 }
@@ -2846,16 +2081,11 @@
2846 2081
2847 2082 /**
2848 2083 * Editing a Form or Entry
2849 2084 *
2850 - * @param object $record
2851 - * @param string $table
2852 - * @param array|string $fields
2853 - * @param bool $default
2854 - * @param array $post_values
2855 - * @param array $args
2085 + * @param string $table
2856 2086 *
2857 - * @return array|bool
2087 + * @return bool|array
2858 2088 */
2859 2089 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2860 2090 if ( ! $record ) {
2861 2091 return false;
@@ -2870,9 +2100,9 @@
2870 2100 'fields' => array(),
2871 2101 );
2872 2102
2873 2103 foreach ( array( 'name', 'description' ) as $var ) {
2874 - $default_val = $record->{$var} ?? '';
2104 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2875 2105 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2876 2106 unset( $var, $default_val );
2877 2107 }
2878 2108
@@ -2890,16 +2120,8 @@
2890 2120
2891 2121 return $values;
2892 2122 }
2893 2123
2894 - /**
2895 - * @param array|string $fields
2896 - * @param object $record
2897 - * @param array $values
2898 - * @param array $args
2899 - *
2900 - * @return void
2901 - */
2902 2124 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2903 2125 if ( ! empty( $fields ) ) {
2904 2126 foreach ( (array) $fields as $field ) {
2905 2127 if ( ! self::is_admin_page() ) {
@@ -2905,32 +2127,24 @@
2905 2127 if ( ! self::is_admin_page() ) {
2906 2128 // Don't prep default values on the form settings page.
2907 2129 $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2908 2130 }
2909 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2131 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2910 2132 self::fill_field_defaults( $field, $record, $values, $args );
2911 2133 }
2912 2134 }
2913 2135 }
2914 2136
2915 - /**
2916 - * @param object $field
2917 - * @param object $record
2918 - * @param array $values
2919 - * @param array $args
2920 - *
2921 - * @return void
2922 - */
2923 2137 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2924 2138 $post_values = $args['post_values'];
2925 2139
2926 2140 if ( $args['default'] ) {
2927 2141 $meta_value = $field->default_value;
2928 - } elseif ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2929 - if ( ! isset( $field->field_options['custom_field'] ) ) {
2930 - $field->field_options['custom_field'] = '';
2931 - }
2932 -
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 + }
2933 2147 $meta_value = FrmProEntryMetaHelper::get_post_value(
2934 2148 $record->post_id,
2935 2149 $field->field_options['post_field'],
2936 2150 $field->field_options['custom_field'],
@@ -2940,14 +2154,14 @@
2940 2154 'form_id' => $field->form_id,
2941 2155 'field' => $field,
2942 2156 )
2943 2157 );
2944 - } else {
2945 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2946 - }//end if
2158 + } else {
2159 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2160 + }
2161 + }
2947 2162
2948 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2949 -
2163 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2950 2164 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2951 2165 $new_value = $post_values['item_meta'][ $field->id ];
2952 2166 self::unserialize_or_decode( $new_value );
2953 2167 } else {
@@ -2993,15 +2207,12 @@
2993 2207 );
2994 2208 }
2995 2209
2996 2210 /**
2997 - * @param object $record
2998 2211 * @param string $table
2999 - * @param array $post_values
3000 - * @param array $values
3001 2212 */
3002 2213 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
3003 - if ( $table === 'entries' ) {
2214 + if ( $table == 'entries' ) {
3004 2215 $form = $record->form_id;
3005 2216 FrmForm::maybe_get_form( $form );
3006 2217 } else {
3007 2218 $form = $record;
@@ -3031,13 +2242,8 @@
3031 2242 }
3032 2243
3033 2244 /**
3034 2245 * Set to POST value or default
3035 - *
3036 - * @param array $post_values
3037 - * @param array $values
3038 - *
3039 - * @return void
3040 2246 */
3041 2247 private static function fill_form_defaults( $post_values, array &$values ) {
3042 2248 $form_defaults = FrmFormsHelper::get_default_opts();
3043 2249
@@ -3042,9 +2248,9 @@
3042 2248 $form_defaults = FrmFormsHelper::get_default_opts();
3043 2249
3044 2250 foreach ( $form_defaults as $opt => $default ) {
3045 2251 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3046 - $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
2252 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3047 2253 }
3048 2254
3049 2255 unset( $opt, $default );
3050 2256 }
@@ -3054,9 +2260,9 @@
3054 2260 }
3055 2261
3056 2262 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3057 2263 if ( ! isset( $values[ $h . '_html' ] ) ) {
3058 - $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 ) );
3059 2265 }
3060 2266 unset( $h );
3061 2267 }
3062 2268 }
@@ -3065,9 +2271,9 @@
3065 2271 * @since 2.2.10
3066 2272 *
3067 2273 * @param array $post_values
3068 2274 *
3069 - * @return bool|int
2275 + * @return boolean|int
3070 2276 */
3071 2277 public static function custom_style_value( $post_values ) {
3072 2278 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 2279 $custom_style = absint( $post_values['options']['custom_style'] );
@@ -3072,38 +2278,29 @@
3072 2278 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 2279 $custom_style = absint( $post_values['options']['custom_style'] );
3074 2280 } else {
3075 2281 $frm_settings = self::get_settings();
3076 - $custom_style = ( $frm_settings->load_style !== 'none' );
2282 + $custom_style = ( $frm_settings->load_style != 'none' );
3077 2283 }
3078 2284
3079 2285 return $custom_style;
3080 2286 }
3081 2287
3082 - /**
3083 - * @param mixed $original_string
3084 - * @param int|string $length
3085 - * @param int $minword
3086 - * @param string $continue
3087 - *
3088 - * @return string
3089 - */
3090 - public static function truncate( $original_string, $length, $minword = 3, $continue = '...' ) {
3091 - if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
2288 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2289 + if ( is_array( $str ) ) {
3092 2290 return '';
3093 2291 }
3094 2292
3095 2293 $length = (int) $length;
3096 - $str = wp_strip_all_tags( (string) $original_string );
2294 + $str = wp_strip_all_tags( $str );
3097 2295 $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3098 2296
3099 2297 if ( $length == 0 ) {
3100 2298 return '';
3101 - }
2299 + } elseif ( $length <= 10 ) {
2300 + $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3102 2301
3103 - if ( $length <= 10 ) {
3104 - $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3105 - return $sub . ( $length < $original_len ? $continue : '' );
2302 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
3106 2303 }
3107 2304
3108 2305 $sub = '';
3109 2306 $len = 0;
@@ -3109,16 +2306,11 @@
3109 2306 $len = 0;
3110 2307
3111 2308 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3112 2309
3113 - if ( ! is_array( $words ) ) {
3114 - return $original_string;
3115 - }
3116 -
3117 2310 foreach ( $words as $word ) {
3118 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2311 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3119 2312 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3120 -
3121 2313 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3122 2314 break;
3123 2315 }
3124 2316
@@ -3131,49 +2323,14 @@
3131 2323
3132 2324 unset( $total_len, $word );
3133 2325 }
3134 2326
3135 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length );
3136 -
3137 - return $sub . ( $len < $original_len ? $continue : '' );
2327 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3138 2328 }
3139 2329
3140 - /**
3141 - * If the string is still too long because there may not have been any spaces, force truncate.
3142 - *
3143 - * @since 6.5.4
3144 - *
3145 - * @param string $sub Current substring.
3146 - * @param int $length The length limit.
3147 - *
3148 - * @return string
3149 - */
3150 - private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length ) {
3151 - if ( strlen( $sub ) < $length + 50 ) {
3152 - // If the string isn't way over the limit, leave it.
3153 - return $sub;
3154 - }
3155 -
3156 - $first_space = strpos( $sub, ' ', $length );
3157 -
3158 - if ( false !== $first_space ) {
3159 - // Ignore anything with spaces.
3160 - return $sub;
3161 - }
3162 -
3163 - return substr( $sub, 0, $length + 10 );
3164 - }
3165 -
3166 - /**
3167 - * @param array $function_names
3168 - * @param array $args
3169 - *
3170 - * @return mixed
3171 - */
3172 2330 public static function mb_function( $function_names, $args ) {
3173 2331 $mb_function_name = $function_names[0];
3174 2332 $function_name = $function_names[1];
3175 -
3176 2333 if ( function_exists( $mb_function_name ) ) {
3177 2334 $function_name = $mb_function_name;
3178 2335 }
3179 2336
@@ -3179,15 +2336,8 @@
3179 2336
3180 2337 return call_user_func_array( $function_name, $args );
3181 2338 }
3182 2339
3183 - /**
3184 - * @param string $date
3185 - * @param string $date_format
3186 - * @param string $time_format
3187 - *
3188 - * @return string
3189 - */
3190 2340 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3191 2341 if ( empty( $date ) ) {
3192 2342 return $date;
3193 2343 }
@@ -3202,10 +2352,9 @@
3202 2352 }
3203 2353
3204 2354 $formatted = self::get_localized_date( $date_format, $date );
3205 2355
3206 - $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00' );
3207 -
2356 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3208 2357 if ( $do_time ) {
3209 2358 $formatted .= self::add_time_to_date( $time_format, $date );
3210 2359 }
3211 2360
@@ -3211,14 +2360,8 @@
3211 2360
3212 2361 return $formatted;
3213 2362 }
3214 2363
3215 - /**
3216 - * @param string $time_format
3217 - * @param string $date
3218 - *
3219 - * @return string
3220 - */
3221 2364 private static function add_time_to_date( $time_format, $date ) {
3222 2365 if ( empty( $time_format ) ) {
3223 2366 $time_format = get_option( 'time_format' );
3224 2367 }
@@ -3224,9 +2367,8 @@
3224 2367 }
3225 2368
3226 2369 $trimmed_format = trim( $time_format );
3227 2370 $time = '';
3228 -
3229 2371 if ( $time_format && ! empty( $trimmed_format ) ) {
3230 2372 $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3231 2373 }
3232 2374
@@ -3234,13 +2376,8 @@
3234 2376 }
3235 2377
3236 2378 /**
3237 2379 * @since 2.0.8
3238 - *
3239 - * @param string $date_format
3240 - * @param string $date
3241 - *
3242 - * @return string
3243 2380 */
3244 2381 public static function get_localized_date( $date_format, $date ) {
3245 2382 $date = get_date_from_gmt( $date );
3246 2383
@@ -3247,13 +2384,12 @@
3247 2384 return date_i18n( $date_format, strtotime( $date ) );
3248 2385 }
3249 2386
3250 2387 /**
3251 - * Gets the time ago in words.
2388 + * Gets the time ago in words
3252 2389 *
3253 - * @param int $from In seconds.
3254 - * @param int|string $to In seconds.
3255 - * @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
3256 2392 *
3257 2393 * @return string $time_ago
3258 2394 */
3259 2395 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
@@ -3261,9 +2397,8 @@
3261 2397 $now = new DateTime();
3262 2398 } else {
3263 2399 $now = new DateTime( '@' . $to );
3264 2400 }
3265 -
3266 2401 $ago = new DateTime( '@' . $from );
3267 2402
3268 2403 // Get the time difference
3269 2404 $diff_object = $now->diff( $ago );
@@ -3269,9 +2404,9 @@
3269 2404 $diff_object = $now->diff( $ago );
3270 2405 $diff = get_object_vars( $diff_object );
3271 2406
3272 2407 // Add week amount and update day amount
3273 - $diff['w'] = floor( $diff['d'] / 7 );
2408 + $diff['w'] = floor( $diff['d'] / 7 );
3274 2409 $diff['d'] -= $diff['w'] * 7;
3275 2410
3276 2411 $time_strings = self::get_time_strings();
3277 2412
@@ -3277,11 +2412,10 @@
3277 2412
3278 2413 if ( ! is_numeric( $levels ) ) {
3279 2414 // Show time in specified unit.
3280 2415 $levels = self::get_unit( $levels );
3281 -
3282 2416 if ( isset( $time_strings[ $levels ] ) ) {
3283 - $diff = array(
2417 + $diff = array(
3284 2418 $levels => self::time_format( $levels, $diff ),
3285 2419 );
3286 2420 $time_strings = array(
3287 2421 $levels => $time_strings[ $levels ],
@@ -3286,9 +2420,8 @@
3286 2420 $time_strings = array(
3287 2421 $levels => $time_strings[ $levels ],
3288 2422 );
3289 2423 }
3290 -
3291 2424 $levels = 1;
3292 2425 }
3293 2426
3294 2427 foreach ( $time_strings as $k => $v ) {
@@ -3310,13 +2443,8 @@
3310 2443 }
3311 2444
3312 2445 /**
3313 2446 * @since 4.05.01
3314 - *
3315 - * @param string $unit
3316 - * @param array $diff
3317 - *
3318 - * @return int
3319 2447 */
3320 2448 private static function time_format( $unit, $diff ) {
3321 2449 $return = array(
3322 2450 'y' => 'y',
@@ -3321,9 +2449,8 @@
3321 2449 $return = array(
3322 2450 'y' => 'y',
3323 2451 'd' => 'days',
3324 2452 );
3325 -
3326 2453 if ( isset( $return[ $unit ] ) ) {
3327 2454 return $diff[ $return[ $unit ] ];
3328 2455 }
3329 2456
@@ -3343,13 +2470,8 @@
3343 2470 }
3344 2471
3345 2472 /**
3346 2473 * @since 4.05.01
3347 - *
3348 - * @param string $from
3349 - * @param string $to
3350 - *
3351 - * @return int
3352 2474 */
3353 2475 private static function convert_time( $from, $to ) {
3354 2476 $convert = array(
3355 2477 's' => 1,
@@ -3365,16 +2487,11 @@
3365 2487 }
3366 2488
3367 2489 /**
3368 2490 * @since 4.05.01
3369 - *
3370 - * @param string $unit
3371 - *
3372 - * @return int|string
3373 2491 */
3374 2492 private static function get_unit( $unit ) {
3375 2493 $units = self::get_time_strings();
3376 -
3377 2494 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3378 2495 return $unit;
3379 2496 }
3380 2497
@@ -3387,12 +2504,11 @@
3387 2504 }
3388 2505
3389 2506 /**
3390 2507 * Get the translatable time strings. The untranslated version is a failsafe
3391 - * 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.
3392 2509 *
3393 2510 * @since 2.0.20
3394 - *
3395 2511 * @return array
3396 2512 */
3397 2513 private static function get_time_strings() {
3398 2514 return array(
@@ -3436,47 +2552,35 @@
3436 2552
3437 2553 // Pagination Methods.
3438 2554
3439 2555 /**
3440 - * @param int $r_count
3441 - * @param int $current_p
3442 - * @param int $p_size
3443 - *
3444 - * @return int
2556 + * @param integer $current_p
3445 2557 */
3446 2558 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3447 - 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 ) );
3448 2560 }
3449 2561
3450 2562 /**
3451 - * @param int $r_count
3452 - * @param int $current_p
3453 - * @param int $p_size
3454 - *
3455 - * @return int
2563 + * @param integer $current_p
3456 2564 */
3457 2565 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3458 2566 if ( $current_p == 1 ) {
3459 2567 return 1;
2568 + } else {
2569 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3460 2570 }
3461 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3462 2571 }
3463 2572
3464 2573 /**
3465 - * @param array $json_vars
3466 - *
3467 2574 * @return array
3468 2575 */
3469 2576 public static function json_to_array( $json_vars ) {
3470 2577 $vars = array();
3471 -
3472 2578 foreach ( $json_vars as $jv ) {
3473 2579 $jv_name = explode( '[', $jv['name'] );
3474 2580 $last = count( $jv_name ) - 1;
3475 -
3476 2581 foreach ( $jv_name as $p => $n ) {
3477 2582 $name = trim( $n, ']' );
3478 -
3479 2583 if ( ! isset( $l1 ) ) {
3480 2584 $l1 = $name;
3481 2585 }
3482 2586
@@ -3487,9 +2591,9 @@
3487 2591 if ( ! isset( $l3 ) ) {
3488 2592 $l3 = $name;
3489 2593 }
3490 2594
3491 - $this_val = $p == $last ? $jv['value'] : array();
2595 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3492 2596
3493 2597 switch ( $p ) {
3494 2598 case 0:
3495 2599 $l1 = $name;
@@ -3511,12 +2615,12 @@
3511 2615 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3512 2616 }
3513 2617
3514 2618 unset( $this_val, $n );
3515 - }//end foreach
2619 + }
3516 2620
3517 2621 unset( $last, $jv );
3518 - }//end foreach
2622 + }
3519 2623
3520 2624 return $vars;
3521 2625 }
3522 2626
@@ -3522,12 +2626,8 @@
3522 2626
3523 2627 /**
3524 2628 * @param string $name
3525 2629 * @param string $l1
3526 - * @param mixed $val
3527 - * @param array $vars
3528 - *
3529 - * @return void
3530 2630 */
3531 2631 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3532 2632 if ( $name == '' ) {
3533 2633 $vars[] = $val;
@@ -3535,19 +2635,12 @@
3535 2635 $vars[ $l1 ] = $val;
3536 2636 }
3537 2637 }
3538 2638
3539 - /**
3540 - * @param string $name
3541 - * @param string $class
3542 - * @param string $form_name
3543 - *
3544 - * @return void
3545 - */
3546 2639 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3547 2640 $tooltips = array(
3548 2641 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3549 - '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' ),
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' ),
3550 2643 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3551 2644 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3552 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' ),
3553 2646 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
@@ -3552,9 +2645,8 @@
3552 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' ),
3553 2646 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3554 2647 /* translators: %1$s: Form name, %2$s: Date */
3555 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() ) ),
3556 - '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' ),
3557 2649 );
3558 2650
3559 2651 if ( ! isset( $tooltips[ $name ] ) ) {
3560 2652 return;
@@ -3574,14 +2666,8 @@
3574 2666 }
3575 2667
3576 2668 /**
3577 2669 * Add the current_page class to that page in the form nav
3578 - *
3579 - * @param int|string $page
3580 - * @param int|string $current_page
3581 - * @param array $action
3582 - *
3583 - * @return void
3584 2670 */
3585 2671 public static function select_current_page( $page, $current_page, $action = array() ) {
3586 2672 if ( $current_page != $page ) {
3587 2673 return;
@@ -3587,9 +2673,8 @@
3587 2673 return;
3588 2674 }
3589 2675
3590 2676 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3591 -
3592 2677 if ( 'lite-reports' === $frm_action ) {
3593 2678 $frm_action = 'reports';
3594 2679 }
3595 2680
@@ -3630,15 +2715,8 @@
3630 2715
3631 2716 return $post_content;
3632 2717 }
3633 2718
3634 - /**
3635 - * @param array|string $val
3636 - * @param int|string $key
3637 - * @param array $post_content
3638 - *
3639 - * @return void
3640 - */
3641 2719 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3642 2720 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3643 2721 return;
3644 2722 }
@@ -3663,9 +2741,8 @@
3663 2741 *
3664 2742 * @since 4.02.03
3665 2743 *
3666 2744 * @param array|string $value
3667 - *
3668 2745 * @return void
3669 2746 */
3670 2747 public static function unserialize_or_decode( &$value ) {
3671 2748 if ( is_array( $value ) ) {
@@ -3685,9 +2762,8 @@
3685 2762 *
3686 2763 * @since 6.2
3687 2764 *
3688 2765 * @param mixed $value
3689 - *
3690 2766 * @return mixed
3691 2767 */
3692 2768 public static function maybe_unserialize_array( $value ) {
3693 2769 if ( ! is_string( $value ) ) {
@@ -3699,9 +2775,8 @@
3699 2775 return $value;
3700 2776 }
3701 2777
3702 2778 $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3703 -
3704 2779 if ( is_array( $parsed ) ) {
3705 2780 $value = $parsed;
3706 2781 }
3707 2782
@@ -3713,9 +2788,8 @@
3713 2788 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3714 2789 *
3715 2790 * @param mixed $string
3716 2791 * @param bool $single_to_array
3717 - *
3718 2792 * @return mixed
3719 2793 */
3720 2794 public static function maybe_json_decode( $string, $single_to_array = true ) {
3721 2795 if ( is_array( $string ) || is_null( $string ) ) {
@@ -3722,17 +2796,14 @@
3722 2796 return $string;
3723 2797 }
3724 2798
3725 2799 $new_string = json_decode( $string, true );
3726 -
3727 2800 if ( function_exists( 'json_last_error' ) ) {
3728 2801 // php 5.3+
3729 2802 $single_value = false;
3730 -
3731 2803 if ( ! $single_to_array ) {
3732 2804 $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3733 2805 }
3734 -
3735 2806 if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3736 2807 $string = $new_string;
3737 2808 }
3738 2809 }
@@ -3740,45 +2811,11 @@
3740 2811 return $string;
3741 2812 }
3742 2813
3743 2814 /**
3744 - * @since 6.2.3
3745 - *
3746 - * @param string $value
3747 - *
3748 - * @return string
3749 - */
3750 - public static function maybe_utf8_encode( $value ) {
3751 - $from_format = 'ISO-8859-1';
3752 - $to_format = 'UTF-8';
3753 -
3754 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3755 - if ( mb_check_encoding( $value, $from_format ) ) {
3756 - return mb_convert_encoding( $value, $to_format, $from_format );
3757 - }
3758 - return $value;
3759 - }
3760 -
3761 - if ( function_exists( 'iconv' ) ) {
3762 - $converted = iconv( $from_format, $to_format, $value );
3763 -
3764 - // Value is false if $value is not ISO-8859-1.
3765 - if ( false !== $converted ) {
3766 - return $converted;
3767 - }
3768 - }
3769 -
3770 - return $value;
3771 - }
3772 -
3773 - /**
3774 2815 * Reformat the json serialized array in name => value array.
3775 2816 *
3776 2817 * @since 4.02.03
3777 - *
3778 - * @param array $form
3779 - *
3780 - * @return void
3781 2818 */
3782 2819 public static function format_form_data( &$form ) {
3783 2820 $formatted = array();
3784 2821
@@ -3785,11 +2822,9 @@
3785 2822 foreach ( $form as $input ) {
3786 2823 if ( ! isset( $input['name'] ) ) {
3787 2824 continue;
3788 2825 }
3789 -
3790 2826 $key = $input['name'];
3791 -
3792 2827 if ( isset( $formatted[ $key ] ) ) {
3793 2828 if ( is_array( $formatted[ $key ] ) ) {
3794 2829 $formatted[ $key ][] = $input['value'];
3795 2830 } else {
@@ -3804,12 +2839,8 @@
3804 2839 }
3805 2840
3806 2841 /**
3807 2842 * @since 4.02.03
3808 - *
3809 - * @param array|string $value
3810 - *
3811 - * @return string
3812 2843 */
3813 2844 public static function maybe_json_encode( $value ) {
3814 2845 if ( is_array( $value ) ) {
3815 2846 $value = wp_json_encode( $value );
@@ -3817,15 +2848,12 @@
3817 2848 return $value;
3818 2849 }
3819 2850
3820 2851 /**
3821 - * Echo The javascript to open and highlight the Formidable menu
3822 - *
3823 2852 * @since 1.07.10
3824 2853 *
3825 - * @param string $post_type The name of the post type that may need to be highlighted.
3826 - *
3827 - * @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
3828 2856 */
3829 2857 public static function maybe_highlight_menu( $post_type ) {
3830 2858 global $post;
3831 2859
@@ -3844,12 +2872,8 @@
3844 2872 /**
3845 2873 * Load the JS file on non-Formidable pages in the admin area
3846 2874 *
3847 2875 * @since 2.0
3848 - *
3849 - * @param bool $load
3850 - *
3851 - * @return void
3852 2876 */
3853 2877 public static function load_admin_wide_js( $load = true ) {
3854 2878 $version = self::plugin_version();
3855 2879 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
@@ -3863,9 +2887,8 @@
3863 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,147 +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' ),
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' ),
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 - '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(),
3956 2976 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3957 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
2977 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3958 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. */
3959 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3960 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3961 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3962 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3963 - 'install' => __( 'Install', 'formidable' ),
3964 - 'active' => __( 'Active', 'formidable' ),
3965 - 'installed' => __( 'Installed', 'formidable' ),
3966 - 'not_installed' => __( 'Not Installed', 'formidable' ),
3967 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3968 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3969 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3970 -
3971 - // Deprecated in 6.0.
3972 - 'saving' => '',
3973 -
3974 - // Deprecated in 6.0.
3975 - 'saved' => '',
3976 -
3977 - // translators: %1$s: HTML open tag, %2$s: HTML end tag.
3978 - 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3979 - 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3980 -
3981 - // In older versions this event listener causes the section to immediately close again
3982 - // when the h3 element is clicked. It's only required in WP 6.7+.
3983 - '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' ),
3984 2988 );
3985 - /**
3986 - * @param array $admin_script_strings
3987 - */
3988 2989 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3989 2990
3990 2991 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3991 -
3992 - if ( ! $data ) {
2992 + if ( empty( $data ) ) {
3993 2993 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3994 2994 }
3995 - }//end if
2995 + }
3996 2996 }
3997 2997
3998 2998 /**
3999 - * Get the no label text.
4000 - *
4001 - * @since 6.25.1
4002 - *
4003 - * @return string
4004 - */
4005 - public static function get_no_label_text() {
4006 - return __( '(no label)', 'formidable' );
4007 - }
4008 -
4009 - /**
4010 - * @since 6.5
4011 - *
4012 - * @return string
4013 - */
4014 - public static function get_ajax_url() {
4015 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
4016 -
4017 - /**
4018 - * @since 2.0.13
4019 - *
4020 - * @param string $ajax_url
4021 - */
4022 - return apply_filters( 'frm_ajax_url', $ajax_url );
4023 - }
4024 -
4025 - /**
4026 2999 * Returns whether or not the first errored input should be auto-focused (default true).
4027 3000 *
4028 3001 * @since 5.2.05
4029 3002 *
@@ -4048,11 +3021,9 @@
4048 3021 * Echo the message on the plugins listing page
4049 3022 *
4050 3023 * @since 1.07.10
4051 3024 *
4052 - * @param float $min_version The version the add-on requires.
4053 - *
4054 - * @return void
3025 + * @param float $min_version The version the add-on requires
4055 3026 */
4056 3027 public static function min_version_notice( $min_version ) {
4057 3028 $frm_version = self::plugin_version();
4058 3029
@@ -4071,10 +3042,8 @@
4071 3042 * If Pro is far outdated, show a message.
4072 3043 *
4073 3044 * @since 4.0.01
4074 3045 *
4075 - * @param string $min_version
4076 - *
4077 3046 * @return void
4078 3047 */
4079 3048 public static function min_pro_version_notice( $min_version ) {
4080 3049 if ( ! self::is_formidable_admin() ) {
@@ -4084,14 +3053,26 @@
4084 3053
4085 3054 self::php_version_notice();
4086 3055
4087 3056 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4088 -
4089 3057 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4090 3058 return;
4091 3059 }
4092 3060
4093 - 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
4094 3075 }
4095 3076
4096 3077 /**
4097 3078 * If Pro is installed, check the version number.
@@ -4096,12 +3077,8 @@
4096 3077 /**
4097 3078 * If Pro is installed, check the version number.
4098 3079 *
4099 3080 * @since 4.0.01
4100 - *
4101 - * @param string $min_version
4102 - *
4103 - * @return bool
4104 3081 */
4105 3082 public static function meets_min_pro_version( $min_version ) {
4106 3083 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 3084 }
@@ -4106,19 +3083,22 @@
4106 3083 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 3084 }
4108 3085
4109 3086 /**
4110 - * 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.
4111 3088 *
4112 3089 * @since 4.0.02
4113 - *
4114 - * @return void
4115 3090 */
4116 3091 private static function php_version_notice() {
4117 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 + }
4118 3096
4119 - if ( version_compare( phpversion(), '7.0', '<' ) ) {
4120 - $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' );
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' );
4121 3101 }
4122 3102
4123 3103 foreach ( $message as $m ) {
4124 3104 ?>
@@ -4130,9 +3110,8 @@
4130 3110 }
4131 3111
4132 3112 /**
4133 3113 * @param string $type
4134 - *
4135 3114 * @return array<string,string>
4136 3115 */
4137 3116 public static function locales( $type = 'date' ) {
4138 3117 $locales = array(
@@ -4242,9 +3221,8 @@
4242 3221 * @since 5.4.5 Added $args parameter with type.
4243 3222 *
4244 3223 * @param array<string,string> $locales
4245 3224 * @param array $args {
4246 - *
4247 3225 * @type string $type
4248 3226 * }
4249 3227 */
4250 3228 $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
@@ -4252,14 +3230,19 @@
4252 3230 return $locales;
4253 3231 }
4254 3232
4255 3233 /**
4256 - * @return string
3234 + * Output HTML containing reference text for accessibility
3235 + *
3236 + * @deprecated 5.1
4257 3237 */
3238 + public static function multiselect_accessibility() {
3239 + _deprecated_function( __METHOD__, '5.1' );
3240 + }
3241 +
4258 3242 public static function get_menu_icon_class() {
4259 3243 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4260 3244 $settings = FrmProAppHelper::get_settings();
4261 -
4262 3245 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4263 3246 return $settings->menu_icon;
4264 3247 }
4265 3248 }
@@ -4305,9 +3288,8 @@
4305 3288 *
4306 3289 * @since 5.0.04
4307 3290 *
4308 3291 * @param array $args The arguments.
4309 - *
4310 3292 * @return array
4311 3293 */
4312 3294 private static function fill_default_images_dropdown_args( $args ) {
4313 3295 $defaults = array(
@@ -4320,8 +3302,14 @@
4320 3302
4321 3303 $new_args['options'] = (array) $new_args['options'];
4322 3304 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4323 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 +
4324 3312 /**
4325 3313 * Allows modifying the arguments of images_dropdown() method.
4326 3314 *
4327 3315 * @since 5.0.04
@@ -4337,9 +3325,8 @@
4337 3325 *
4338 3326 * @since 5.0.04
4339 3327 *
4340 3328 * @param array $args The arguments.
4341 - *
4342 3329 * @return string
4343 3330 */
4344 3331 private static function get_images_dropdown_input_attrs( $args ) {
4345 3332 $input_attrs = $args['input_attrs'];
@@ -4346,9 +3333,8 @@
4346 3333 $input_attrs['type'] = 'radio';
4347 3334 $input_attrs['name'] = $args['name'];
4348 3335
4349 3336 $input_attrs_str = '';
4350 -
4351 3337 foreach ( $input_attrs as $key => $input_attr ) {
4352 3338 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4353 3339 }
4354 3340
@@ -4363,23 +3349,8 @@
4363 3349 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4364 3350 }
4365 3351
4366 3352 /**
4367 - * @since 6.7.1
4368 - *
4369 - * @param array $option Option data.
4370 - * @param array $args The arguments of images_dropdown() method.
4371 - *
4372 - * @return array
4373 - */
4374 - public static function get_images_dropdown_atts( $option, $args ) {
4375 - $image = self::get_images_dropdown_option_image( $option, $args );
4376 - $classes = self::get_images_dropdown_option_classes( $option, $args );
4377 - $custom_attrs = self::get_images_dropdown_option_html_attrs( $option, $args );
4378 - return compact( 'image', 'classes', 'custom_attrs' );
4379 - }
4380 -
4381 - /**
4382 3353 * Gets the image of each option in images_dropdown() method.
4383 3354 *
4384 3355 * @since 5.0.04
4385 3356 *
@@ -4384,9 +3355,8 @@
4384 3355 * @since 5.0.04
4385 3356 *
4386 3357 * @param array $option Option data.
4387 3358 * @param array $args The arguments of images_dropdown() method.
4388 - *
4389 3359 * @return string
4390 3360 */
4391 3361 private static function get_images_dropdown_option_image( $option, $args ) {
4392 3362 $image = self::icon_by_class(
@@ -4391,9 +3361,9 @@
4391 3361 private static function get_images_dropdown_option_image( $option, $args ) {
4392 3362 $image = self::icon_by_class(
4393 3363 'frmfont ' . $option['svg'],
4394 3364 array(
4395 - 'echo' => false,
3365 + 'echo' => false,
4396 3366 )
4397 3367 );
4398 3368
4399 3369 $args['option'] = $option;
@@ -4415,9 +3385,8 @@
4415 3385 * @since 5.0.04
4416 3386 *
4417 3387 * @param array $option Option data.
4418 3388 * @param array $args The arguments of images_dropdown() method.
4419 - *
4420 3389 * @return string
4421 3390 */
4422 3391 private static function get_images_dropdown_option_classes( $option, $args ) {
4423 3392 $classes = '';
@@ -4445,14 +3414,12 @@
4445 3414 * @since 5.0.04
4446 3415 *
4447 3416 * @param array $option Option data.
4448 3417 * @param array $args The arguments of images_dropdown() method.
4449 - *
4450 3418 * @return string
4451 3419 */
4452 3420 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4453 3421 $html_attrs = '';
4454 -
4455 3422 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4456 3423 $html_attrs_arr = array();
4457 3424
4458 3425 foreach ( $option['custom_attrs'] as $key => $value ) {
@@ -4515,9 +3482,8 @@
4515 3482 * @since 5.0.07
4516 3483 *
4517 3484 * @param array $values
4518 3485 * @param array $keys
4519 - *
4520 3486 * @return array
4521 3487 */
4522 3488 public static function maybe_filter_array( $values, $keys ) {
4523 3489 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4535,16 +3501,15 @@
4535 3501 return $values;
4536 3502 }
4537 3503
4538 3504 /**
4539 - * Some back end fields allow privileged users to add scripts.
3505 + * Some back end fields allow privleged users to add scripts.
4540 3506 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4541 3507 *
4542 3508 * @since 5.0.13
4543 3509 *
4544 3510 * @param string $value
4545 - * @param array|string $allowed 'all' for everything included as defaults.
4546 - *
3511 + * @param array|string $allowed 'all' for everything included as defaults
4547 3512 * @return string
4548 3513 */
4549 3514 public static function maybe_kses( $value, $allowed = 'all' ) {
4550 3515 if ( self::should_never_allow_unfiltered_html() ) {
@@ -4553,69 +3518,19 @@
4553 3518 return $value;
4554 3519 }
4555 3520
4556 3521 /**
4557 - * Check if an option attribute used in an [input] shortcode is safe.
3522 + * @since 5.0.16
4558 3523 *
4559 - * @since 6.11.2
4560 - *
4561 - * @param string $key
4562 - * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4563 - *
4564 3524 * @return bool
4565 3525 */
4566 - public static function input_key_is_safe( $key, $context = 'display' ) {
4567 - if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4568 - $safe = true;
4569 - } elseif ( 0 === strpos( $key, 'data-' ) ) {
4570 - // Allow all data attributes.
4571 - $safe = true;
4572 - } elseif ( 0 === strpos( $key, 'aria-' ) ) {
4573 - // Allow all aria attributes.
4574 - $safe = true;
4575 - } else {
4576 - $safe_keys = array(
4577 - 'class',
4578 - 'required',
4579 - 'title',
4580 - 'placeholder',
4581 - 'value',
4582 - 'readonly',
4583 - 'disabled',
4584 - 'size',
4585 - 'maxlength',
4586 - 'min',
4587 - 'max',
4588 - 'pattern',
4589 - 'step',
4590 - 'autofocus',
4591 - 'width',
4592 - 'height',
4593 - 'autocomplete',
4594 - 'tabindex',
4595 - 'role',
4596 - 'style',
4597 - );
4598 - $safe = in_array( $key, $safe_keys, true );
4599 - }//end if
4600 -
4601 - /**
4602 - * Filter the $safe value so additional keys can be allowed or disallowed.
4603 - *
4604 - * @since 6.11.2
4605 - *
4606 - * @param bool $safe True if the key is considered safe.
4607 - * @param string $key
4608 - * @param string $context Either 'display' or 'update'.
4609 - */
4610 - 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' );
4611 3528 }
4612 3529
4613 3530 /**
4614 3531 * @since 5.0.16
4615 3532 *
4616 - * @param string $medium
4617 - *
4618 3533 * @return array
4619 3534 */
4620 3535 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4621 3536 $params = array(
@@ -4622,9 +3537,8 @@
4622 3537 'medium' => $medium,
4623 3538 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4624 3539 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4625 3540 'screenshot' => 'landing.png',
4626 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4627 3541 );
4628 3542 return self::get_upgrade_data_params( 'landing', $params );
4629 3543 }
4630 3544
@@ -4630,10 +3544,20 @@
4630 3544
4631 3545 /**
4632 3546 * @since 5.0.17
4633 3547 *
4634 - * @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
4635 3558 *
3559 + * @param string
4636 3560 * @return bool
4637 3561 */
4638 3562 public static function show_new_feature( $feature ) {
4639 3563 $link = FrmAddonsController::install_link( $feature );
@@ -4640,21 +3564,16 @@
4640 3564 return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4641 3565 }
4642 3566
4643 3567 /**
4644 - * Enhances upgrade data parameters with installation link and plan requirement information.
4645 - *
4646 3568 * @since 5.0.17
4647 3569 *
4648 - * @param string $plugin The plugin slug to get installation data for.
4649 - * @param array $params Initial parameters for the upgrade data.
4650 - * @param bool $detailed Whether to include detailed information.
4651 - *
4652 - * @return array Modified parameters with installation data.
3570 + * @param string $plugin
3571 + * @param array $params
3572 + * @return array
4653 3573 */
4654 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3574 + public static function get_upgrade_data_params( $plugin, $params ) {
4655 3575 $link = FrmAddonsController::install_link( $plugin );
4656 -
4657 3576 if ( ! $link ) {
4658 3577 return $params;
4659 3578 }
4660 3579
@@ -4660,20 +3579,15 @@
4660 3579
4661 3580 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4662 3581 $params['oneclick'] = json_encode( $link );
4663 3582 unset( $params['message'] );
4664 -
4665 3583 if ( ! isset( $params['medium'] ) ) {
4666 3584 $params['medium'] = $plugin;
4667 3585 }
4668 3586 } else {
4669 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3587 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4670 3588 }
4671 3589
4672 - if ( $detailed ) {
4673 - $params['plugin-status'] = $link['status'] ?? '';
4674 - }
4675 -
4676 3590 return $params;
4677 3591 }
4678 3592
4679 3593 /**
@@ -4682,9 +3596,8 @@
4682 3596 *
4683 3597 * @since 5.0.17
4684 3598 *
4685 3599 * @param string $text
4686 - *
4687 3600 * @return bool
4688 3601 */
4689 3602 public static function ctype_xdigit( $text ) {
4690 3603 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4699,9 +3612,8 @@
4699 3612 * @since 5.2.01
4700 3613 */
4701 3614 public static function set_current_screen_and_hook_suffix() {
4702 3615 global $hook_suffix;
4703 -
4704 3616 if ( is_null( $hook_suffix ) ) {
4705 3617 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4706 3618 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4707 3619 }
@@ -4718,9 +3630,9 @@
4718 3630 public static function show_pill_text( $text = null ) {
4719 3631 if ( null === $text ) {
4720 3632 $text = __( 'NEW', 'formidable' );
4721 3633 }
4722 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3634 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4723 3635 }
4724 3636
4725 3637 /**
4726 3638 * Count the number of decimals digits.
@@ -4727,10 +3639,9 @@
4727 3639 *
4728 3640 * @since 5.2.07
4729 3641 *
4730 3642 * @param mixed $num Number.
4731 - *
4732 - * @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.
4733 3644 */
4734 3645 public static function count_decimals( $num ) {
4735 3646 if ( ! is_numeric( $num ) ) {
4736 3647 return false;
@@ -4737,9 +3648,8 @@
4737 3648 }
4738 3649
4739 3650 $num = (string) $num;
4740 3651 $parts = explode( '.', $num );
4741 -
4742 3652 if ( 1 === count( $parts ) ) {
4743 3653 return 0;
4744 3654 }
4745 3655
@@ -4762,9 +3672,9 @@
4762 3672 }
4763 3673
4764 3674 add_filter(
4765 3675 'option_gmt_offset',
4766 - function ( $offset ) {
3676 + function( $offset ) {
4767 3677 if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4768 3678 // Leave a valid value alone.
4769 3679 return $offset;
4770 3680 }
@@ -4821,20 +3731,17 @@
4821 3731 * @since 5.5.5
4822 3732 *
4823 3733 * @param string $url
4824 3734 * @param string $expected_extension
4825 - *
4826 3735 * @return bool
4827 3736 */
4828 3737 public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4829 3738 $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4830 -
4831 3739 if ( ! $file_is_in_expected_s3_bucket ) {
4832 3740 return false;
4833 3741 }
4834 3742
4835 3743 $parsed = parse_url( $url );
4836 -
4837 3744 if ( ! is_array( $parsed ) ) {
4838 3745 // URL is malformed.
4839 3746 return false;
4840 3747 }
@@ -4840,9 +3747,8 @@
4840 3747 }
4841 3748
4842 3749 $path = $parsed['path'];
4843 3750 $ext = pathinfo( $path, PATHINFO_EXTENSION );
4844 -
4845 3751 if ( $expected_extension !== $ext ) {
4846 3752 // The URL isn't to an XML file.
4847 3753 return false;
4848 3754 }
@@ -4850,235 +3756,60 @@
4850 3756 return true;
4851 3757 }
4852 3758
4853 3759 /**
4854 - * Display a dismissable warning message and save its dismissal state.
4855 - *
4856 - * @since 6.3
4857 - *
4858 - * @param string $message The warning message to display.
4859 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4860 - *
4861 - * @return void
3760 + * @since 4.08
3761 + * @deprecated 4.09.01
4862 3762 */
4863 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4864 - if ( ! $message || ! $option ) {
4865 - return;
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();
4866 3767 }
4867 -
4868 - $ajax_callback = function () use ( $option ) {
4869 - self::dismiss_warning_message( $option );
4870 - };
4871 -
4872 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
4873 - // To prevent any issues, we add 'frm_' from the beginning of the action.
4874 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
4875 -
4876 - add_filter(
4877 - 'frm_message_list',
4878 - function ( $show_messages ) use ( $message, $option ) {
4879 - if ( get_option( $option, false ) ) {
4880 - return $show_messages;
4881 - }
4882 -
4883 - $dismiss_icon = self::icon_by_class(
4884 - 'frmfont frm_close_icon',
4885 - array(
4886 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
4887 - 'echo' => false,
4888 - )
4889 - );
4890 -
4891 - $show_messages[] = $message;
4892 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
4893 -
4894 - return $show_messages;
4895 - }
4896 - );
4897 3768 }
4898 3769
4899 3770 /**
4900 - * Dismiss a warning message and update the dismissal state.
3771 + * Use the WP 4.7 wp_doing_ajax function
4901 3772 *
4902 - * @since 6.3
4903 - *
4904 - * @param string $option The unique identifier for the dismissal state of the message.
4905 - *
4906 - * @return void
3773 + * @since 2.05.07
3774 + * @deprecated 4.04.04
4907 3775 */
4908 - public static function dismiss_warning_message( $option = '' ) {
4909 - self::permission_check( 'frm_change_settings' );
4910 - check_ajax_referer( 'frm_ajax', 'nonce' );
4911 -
4912 - if ( $option ) {
4913 - update_option( $option, true, 'no' );
4914 - }
4915 -
4916 - wp_send_json_success();
3776 + public static function wp_doing_ajax() {
3777 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3778 + return wp_doing_ajax();
4917 3779 }
4918 3780
4919 3781 /**
4920 - * Lite license copy.
4921 - * Used in FrmDashboardController & FrmSettingsController
4922 - *
4923 - * @since 6.8
4924 - *
4925 - * @return string
3782 + * @deprecated 4.0
4926 3783 */
4927 - public static function copy_for_lite_license() {
4928 - $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4929 -
4930 - return apply_filters( 'frm_license_type_text', $message );
3784 + public static function insert_opt_html( $args ) {
3785 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3786 + FrmFormsHelper::insert_opt_html( $args );
4931 3787 }
4932 3788
4933 3789 /**
4934 - * Removes scripts that are unnecessarily loaded across the pages!
4935 - *
4936 - * @since 6.9
4937 - *
4938 - * @return void
3790 + * @deprecated 3.01
3791 + * @codeCoverageIgnore
4939 3792 */
4940 - public static function dequeue_extra_global_scripts() {
4941 - wp_dequeue_script( 'frm-surveys-admin' );
4942 - wp_dequeue_script( 'frm-quizzes-form-action' );
3793 + public static function sanitize_array( &$values ) {
3794 + FrmDeprecated::sanitize_array( $values );
4943 3795 }
4944 3796
4945 3797 /**
4946 - * Shows tooltip icon.
3798 + * @since 2.0
3799 + * @deprecated 5.0.13
4947 3800 *
4948 - * @since 6.12
4949 - *
4950 - * @param string $tooltip_text Tooltip text.
4951 - * @param array $atts Tooltip wrapper HTML attributes.
4952 - *
4953 - * @return void
3801 + * @return string The base Google APIS url for the current version of jQuery UI
4954 3802 */
4955 - public static function tooltip_icon( $tooltip_text, $atts = array() ) {
4956 - $atts['title'] = $tooltip_text;
4957 -
4958 - if ( isset( $atts['class'] ) ) {
4959 - $atts['class'] .= ' frm_help';
4960 - } else {
4961 - $atts['class'] = 'frm_help';
4962 - }
4963 - ?>
4964 - <span <?php self::array_to_html_params( $atts, true ); ?>>
4965 - <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
4966 - </span>
4967 - <?php
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() : '';
4968 3806 }
4969 3807
4970 3808 /**
4971 - * Prints errors for settings in onboarding wizard or template settings.
4972 - *
4973 - * @since 6.15
4974 - *
4975 - * @param array $args Args.
4976 - *
4977 - * @return void
3809 + * @since 4.07
3810 + * @deprecated 6.0
4978 3811 */
4979 - public static function print_setting_error( $args ) {
4980 - $args = wp_parse_args(
4981 - $args,
4982 - array(
4983 - 'id' => '',
4984 - 'errors' => array(),
4985 - 'class' => '',
4986 - )
4987 - );
4988 -
4989 - $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
4990 - ?>
4991 - <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
4992 - <?php
4993 - if ( is_array( $args['errors'] ) ) {
4994 - foreach ( $args['errors'] as $key => $msg ) {
4995 - ?>
4996 - <span frm-error="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $msg ); ?></span>
4997 - <?php
4998 - }
4999 - } else {
5000 - echo '<span>' . esc_html( $args['errors'] ) . '</span>';
5001 - }
5002 - ?>
5003 - </span>
5004 - <?php
5005 - }
5006 -
5007 - /**
5008 - * Check if GDPR is enabled.
5009 - *
5010 - * @since 6.19
5011 - *
5012 - * @return bool
5013 - */
5014 - public static function is_gdpr_enabled() {
5015 - $frm_settings = self::get_settings();
5016 - return $frm_settings->enable_gdpr || $frm_settings->no_ips || $frm_settings->custom_header_ip || $frm_settings->no_gdpr_cookies;
5017 - }
5018 -
5019 - /**
5020 - * Check if GDPR cookies are disabled.
5021 - *
5022 - * @since 6.19
5023 - *
5024 - * @return bool
5025 - */
5026 - public static function no_gdpr_cookies() {
5027 - $frm_settings = self::get_settings();
5028 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
5029 - }
5030 -
5031 - /**
5032 - * Check if a string is valid UTF-8.
5033 - *
5034 - * @since 6.24
5035 - *
5036 - * @param string $string The string to check.
5037 - *
5038 - * @return bool
5039 - */
5040 - public static function is_valid_utf8( $string ) {
5041 - // wp_is_valid_utf8 is added in WP 6.9.
5042 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
5043 - return wp_is_valid_utf8( $string );
5044 - }
5045 -
5046 - // As of WP 6.9, seems_utf8 is deprecated.
5047 - if ( function_exists( 'seems_utf8' ) ) {
5048 - return seems_utf8( $string );
5049 - }
5050 - return false;
5051 - }
5052 -
5053 - /**
5054 - * Get a documentation URL with UTM parameters and affiliate tracking.
5055 - *
5056 - * @since 6.26
5057 - *
5058 - * @param string $path The relative path to append to the base URL.
5059 - * @param string $campaign The campaign to use for UTM parameters.
5060 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5061 - *
5062 - * @return string The processed URL with UTM parameters and affiliate tracking.
5063 - */
5064 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5065 - $path = trim( $path, '/' );
5066 -
5067 - if ( $add_kb_base ) {
5068 - $path = 'knowledgebase/' . $path;
5069 - }
5070 -
5071 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
5072 - }
5073 -
5074 - /**
5075 - * @since 5.0.16
5076 - * @deprecated 6.26
5077 - *
5078 - * @return bool
5079 - */
5080 - public static function show_landing_pages() {
5081 - _deprecated_function( __METHOD__, '6.26' );
5082 - return true;
3812 + public static function renewal_message() {
3813 + _deprecated_function( __METHOD__, '6.0', 'FrmProAddonsController::renewal_message' );
5083 3814 }
5084 3815 }