PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.2.07
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.2.07
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 +572 -2011 6.265.2.07 View file →
@@ -3,43 +3,22 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 -
8 - /**
9 - * Version of the database we are moving to.
10 - *
11 - * @var int
12 - */
13 - public static $db_version = 104;
14 -
15 - /**
16 - * Used by the API add-on.
17 - *
18 - * @var float
19 - */
7 + public static $db_version = 98; // Version of the database we are moving to.
8 + public static $pro_db_version = 37; //deprecated
20 9 public static $font_version = 7;
21 10
22 11 /**
23 - * @var bool
24 - */
25 - private static $added_gmt_offset_filter = false;
26 -
27 - /**
28 12 * @since 2.0
29 - *
30 - * @var string
31 13 */
32 - public static $plug_version = '6.26';
14 + public static $plug_version = '5.2.07';
33 15
34 16 /**
35 - * @var bool
36 - */
37 - private static $included_svg = false;
38 -
39 - /**
40 17 * @since 1.07.02
41 18 *
19 + * @param none
20 + *
42 21 * @return string The version of this plugin
43 22 */
44 23 public static function plugin_version() {
45 24 return self::$plug_version;
@@ -44,33 +23,21 @@
44 23 public static function plugin_version() {
45 24 return self::$plug_version;
46 25 }
47 26
48 - /**
49 - * @return string
50 - */
51 27 public static function plugin_folder() {
52 28 return basename( self::plugin_path() );
53 29 }
54 30
55 - /**
56 - * @return string
57 - */
58 31 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
32 + return dirname( dirname( dirname( __FILE__ ) ) );
60 33 }
61 34
62 - /**
63 - * @return string
64 - */
65 35 public static function plugin_url() {
66 - // Previously FRM_URL constant.
36 + // Prevously FRM_URL constant.
67 37 return plugins_url( '', self::plugin_path() . '/formidable.php' );
68 38 }
69 39
70 - /**
71 - * @return string
72 - */
73 40 public static function relative_plugin_url() {
74 41 return str_replace( array( 'https:', 'http:' ), '', self::plugin_url() );
75 42 }
76 43
@@ -85,9 +52,8 @@
85 52 * Get the name of this site
86 53 * Used for [sitename] shortcode
87 54 *
88 55 * @since 2.0
89 - *
90 56 * @return string
91 57 */
92 58 public static function site_name() {
93 59 return get_option( 'blogname' );
@@ -92,16 +58,10 @@
92 58 public static function site_name() {
93 59 return get_option( 'blogname' );
94 60 }
95 61
96 - /**
97 - * @param string $url
98 - *
99 - * @return string
100 - */
101 62 public static function make_affiliate_url( $url ) {
102 63 $affiliate_id = self::get_affiliate();
103 -
104 64 if ( ! empty( $affiliate_id ) ) {
105 65 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 66 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 67 }
@@ -108,11 +68,8 @@
108 68
109 69 return $url;
110 70 }
111 71
112 - /**
113 - * @return int
114 - */
115 72 public static function get_affiliate() {
116 73 return absint( apply_filters( 'frm_affiliate_id', 0 ) );
117 74 }
118 75
@@ -117,178 +74,64 @@
117 74 }
118 75
119 76 /**
120 77 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
78 + * @param array|string $args
123 79 * @param string $page
124 80 */
125 81 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
82 + if ( empty( $page ) ) {
83 + $page = 'https://formidableforms.com/lite-upgrade/';
84 + } else {
127 85 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 86 $page = 'https://formidableforms.com/' . $page;
129 - } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
131 87 }
132 88
89 + $anchor = '';
133 90 if ( is_array( $args ) ) {
134 - $args = self::adjust_legacy_utm_args( $args );
91 + $medium = $args['medium'];
92 + if ( isset( $args['content'] ) ) {
93 + $content = $args['content'];
94 + }
95 + if ( isset( $args['anchor'] ) ) {
96 + $anchor = '#' . $args['anchor'];
97 + }
135 98 } else {
136 - $args = array( 'campaign' => $args );
99 + $medium = $args;
137 100 }
138 101
139 102 $query_args = array(
140 - 'utm_source' => 'plugin',
141 - 'utm_medium' => self::get_utm_medium(),
103 + 'utm_source' => 'WordPress',
104 + 'utm_medium' => $medium,
105 + 'utm_campaign' => 'liteplugin',
142 106 );
143 - $query_args = self::maybe_add_utm_license( $query_args );
144 107
145 - if ( isset( $args['campaign'] ) ) {
146 - $query_args['utm_campaign'] = $args['campaign'];
108 + if ( isset( $content ) ) {
109 + $query_args['utm_content'] = $content;
147 110 }
148 111
149 - if ( isset( $args['content'] ) ) {
150 - $query_args['utm_content'] = $args['content'];
151 - }
152 -
153 - if ( isset( $args['param'] ) ) {
112 + if ( is_array( $args ) && isset( $args['param'] ) ) {
154 113 $query_args['f'] = $args['param'];
155 114 }
156 115
157 - if ( ! empty( $args['plan'] ) ) {
116 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
158 117 $query_args['plan'] = $args['plan'];
159 118 }
160 119
161 - $link = add_query_arg( $query_args, $page );
162 -
163 - if ( isset( $args['anchor'] ) ) {
164 - $link .= '#' . $args['anchor'];
165 - }
166 -
120 + $link = add_query_arg( $query_args, $page ) . $anchor;
167 121 return self::make_affiliate_url( $link );
168 122 }
169 123
170 124 /**
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 125 * Get the Formidable settings
281 126 *
282 127 * @since 2.0
283 128 *
284 129 * @param array $args - May include the form id when values need translation.
285 - *
286 - * @return FrmSettings $frm_settings
130 + * @return FrmSettings $frm_setings
287 131 */
288 132 public static function get_settings( $args = array() ) {
289 133 global $frm_settings;
290 -
291 134 if ( empty( $frm_settings ) ) {
292 135 $frm_settings = new FrmSettings( $args );
293 136 } elseif ( isset( $args['current_form'] ) ) {
294 137 // If the global has already been set, allow strings to be filtered.
@@ -297,40 +140,16 @@
297 140
298 141 return $frm_settings;
299 142 }
300 143
301 - /**
302 - * @return string
303 - */
304 144 public static function get_menu_name() {
305 145 $frm_settings = self::get_settings();
306 146
307 - return FrmAddonsController::is_license_expired() || ! self::pro_is_installed() ? 'Formidable' : $frm_settings->menu;
147 + return $frm_settings->menu;
308 148 }
309 149
310 150 /**
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 151 * @since 3.05
329 - *
330 - * @param array $atts
331 - *
332 - * @return string
333 152 */
334 153 public static function svg_logo( $atts = array() ) {
335 154 $defaults = array(
336 155 'height' => 18,
@@ -347,12 +166,8 @@
347 166 }
348 167
349 168 /**
350 169 * @since 4.0
351 - *
352 - * @param array $atts
353 - *
354 - * @return void
355 170 */
356 171 public static function show_logo( $atts = array() ) {
357 172 echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
358 173 }
@@ -358,10 +173,8 @@
358 173 }
359 174
360 175 /**
361 176 * @since 4.03.02
362 - *
363 - * @return void
364 177 */
365 178 public static function show_header_logo() {
366 179 $icon = self::svg_logo(
367 180 array(
@@ -370,9 +183,8 @@
370 183 )
371 184 );
372 185
373 186 $new_icon = apply_filters( 'frm_icon', $icon, true );
374 -
375 187 if ( $new_icon !== $icon ) {
376 188 if ( strpos( $new_icon, '<svg' ) === 0 ) {
377 189 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
378 190 } else {
@@ -384,38 +196,21 @@
384 196 }
385 197
386 198 /**
387 199 * @since 2.02.04
388 - *
389 - * @return bool
390 200 */
391 201 public static function ips_saved() {
392 202 $frm_settings = self::get_settings();
203 +
393 204 return ! $frm_settings->no_ips;
394 205 }
395 206
396 - /**
397 - * @return bool
398 - */
399 207 public static function pro_is_installed() {
400 - return (bool) apply_filters( 'frm_pro_installed', false );
208 + return apply_filters( 'frm_pro_installed', false );
401 209 }
402 210
403 211 /**
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 212 * @since 4.06.02
416 - *
417 - * @return bool
418 213 */
419 214 public static function pro_is_connected() {
420 215 global $frm_vars;
421 216 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -422,31 +217,17 @@
422 217 }
423 218
424 219 /**
425 220 * @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 221 */
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 );
222 + public static function is_form_builder_page() {
223 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
224 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
440 225 }
441 226
442 - /**
443 - * @return bool
444 - */
445 227 public static function is_formidable_admin() {
446 228 $page = self::simple_get( 'page', 'sanitize_title' );
447 229 $is_formidable = strpos( $page, 'formidable' ) !== false;
448 -
449 230 if ( empty( $page ) ) {
450 231 $is_formidable = self::is_view_builder_page();
451 232 }
452 233
@@ -453,69 +234,28 @@
453 234 return $is_formidable;
454 235 }
455 236
456 237 /**
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 238 * Check for certain page in Formidable settings
497 239 *
498 240 * @since 2.0
499 241 *
500 - * @param string $page The name of the page to check.
242 + * @param string $page The name of the page to check
501 243 *
502 - * @return bool
244 + * @return boolean
503 245 */
504 246 public static function is_admin_page( $page = 'formidable' ) {
505 247 global $pagenow;
506 248 $get_page = self::simple_get( 'page', 'sanitize_title' );
507 -
508 249 if ( $pagenow ) {
509 250 // allow this to be true during ajax load i.e. ajax form builder loading
510 - $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
511 -
251 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
512 252 if ( $is_page ) {
513 253 return true;
514 254 }
515 255 }
516 256
517 - return is_admin() && $get_page === $page;
257 + return is_admin() && $get_page == $page;
518 258 }
519 259
520 260 /**
521 261 * If the current page is for editing or creating a view.
@@ -521,10 +261,8 @@
521 261 * If the current page is for editing or creating a view.
522 262 * Returns false for the views listing page.
523 263 *
524 264 * @since 4.0
525 - *
526 - * @return bool
527 265 */
528 266 public static function is_view_builder_page() {
529 267 global $pagenow;
530 268
@@ -534,10 +272,10 @@
534 272
535 273 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
536 274
537 275 if ( empty( $post_type ) ) {
538 - $post_id = self::simple_get( 'post', 'absint' );
539 - $post = get_post( $post_id );
276 + $post_id = self::simple_get( 'post', 'absint' );
277 + $post = get_post( $post_id );
540 278 $post_type = $post ? $post->post_type : '';
541 279 }
542 280
543 281 return $post_type === 'frm_display';
@@ -547,15 +285,17 @@
547 285 * Check for the form preview page
548 286 *
549 287 * @since 2.0
550 288 *
551 - * @return bool
289 + * @param None
290 + *
291 + * @return boolean
552 292 */
553 293 public static function is_preview_page() {
554 294 global $pagenow;
555 295 $action = self::simple_get( 'action', 'sanitize_title' );
556 296
557 - return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
297 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
558 298 }
559 299
560 300 /**
561 301 * Check for ajax except the form preview page
@@ -561,17 +301,16 @@
561 301 * Check for ajax except the form preview page
562 302 *
563 303 * @since 2.0
564 304 *
565 - * @return bool
305 + * @param None
306 + *
307 + * @return boolean
566 308 */
567 309 public static function doing_ajax() {
568 310 return wp_doing_ajax() && ! self::is_preview_page();
569 311 }
570 312
571 - /**
572 - * @return string
573 - */
574 313 public static function js_suffix() {
575 314 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
576 315 }
577 316
@@ -576,14 +315,13 @@
576 315 }
577 316
578 317 /**
579 318 * @since 2.0.8
580 - *
581 - * @return bool
582 319 */
583 320 public static function prevent_caching() {
584 321 global $frm_vars;
585 - return ! empty( $frm_vars['prevent_caching'] );
322 +
323 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
586 324 }
587 325
588 326 /**
589 327 * Check if on an admin page
@@ -589,19 +327,14 @@
589 327 * Check if on an admin page
590 328 *
591 329 * @since 2.0
592 330 *
593 - * @return bool
331 + * @param None
332 + *
333 + * @return boolean
594 334 */
595 335 public static function is_admin() {
596 - $is_admin = is_admin() && ! wp_doing_ajax();
597 -
598 - /**
599 - * @since 6.0
600 - *
601 - * @param bool $is_admin
602 - */
603 - return apply_filters( 'frm_is_admin', $is_admin );
336 + return is_admin() && ! wp_doing_ajax();
604 337 }
605 338
606 339 /**
607 340 * Check if value contains blank value or empty array
@@ -607,23 +340,17 @@
607 340 * Check if value contains blank value or empty array
608 341 *
609 342 * @since 2.0
610 343 *
611 - * @param mixed $value Value to check.
612 - * @param string $empty
344 + * @param mixed $value - value to check
345 + * @param string
613 346 *
614 - * @return bool
347 + * @return boolean
615 348 */
616 349 public static function is_empty_value( $value, $empty = '' ) {
617 350 return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
618 351 }
619 352
620 - /**
621 - * @param mixed $value
622 - * @param string $empty
623 - *
624 - * @return bool
625 - */
626 353 public static function is_not_empty_value( $value, $empty = '' ) {
627 354 return ! self::is_empty_value( $value, $empty );
628 355 }
629 356
@@ -640,37 +367,26 @@
640 367 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
641 368 }
642 369
643 370 /**
644 - * Get the server OS
371 + * Check for the IP address in several places
372 + * Used by [ip] shortcode
645 373 *
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 - * Check for the IP address in several places (when custom headers are enabled).
665 - * Used by [ip] shortcode.
666 - *
667 374 * @return string The IP address of the current user
668 375 */
669 376 public static function get_ip_address() {
670 - $ip_options = self::should_use_custom_header_ip() ? self::get_custom_header_keys_for_ip() : array( 'REMOTE_ADDR' );
671 - $ip = '';
672 -
377 + $ip_options = array(
378 + 'HTTP_CLIENT_IP',
379 + 'HTTP_CF_CONNECTING_IP',
380 + 'HTTP_X_FORWARDED_FOR',
381 + 'HTTP_X_FORWARDED',
382 + 'HTTP_X_CLUSTER_CLIENT_IP',
383 + 'HTTP_X_REAL_IP',
384 + 'HTTP_FORWARDED_FOR',
385 + 'HTTP_FORWARDED',
386 + 'REMOTE_ADDR',
387 + );
388 + $ip = '';
673 389 foreach ( $ip_options as $key ) {
674 390 if ( ! isset( $_SERVER[ $key ] ) ) {
675 391 continue;
676 392 }
@@ -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 }
@@ -689,60 +403,8 @@
689 403
690 404 return sanitize_text_field( $ip );
691 405 }
692 406
693 - /**
694 - * @since 6.1
695 - *
696 - * @return array
697 - */
698 - public static function get_custom_header_keys_for_ip() {
699 - return array(
700 - 'HTTP_CLIENT_IP',
701 - 'HTTP_CF_CONNECTING_IP',
702 - 'HTTP_X_FORWARDED_FOR',
703 - 'HTTP_X_FORWARDED',
704 - 'HTTP_X_CLUSTER_CLIENT_IP',
705 - 'HTTP_X_REAL_IP',
706 - 'HTTP_FORWARDED_FOR',
707 - 'HTTP_FORWARDED',
708 - 'REMOTE_ADDR',
709 - );
710 - }
711 -
712 - /**
713 - * Check if we should check every HTTP header or just $_SERVER['REMOTE_ADDR'].
714 - * The other HTTP headers can be spoofed so this isn't recommended.
715 - * But in some cases (like reverse proxies), the IP may be empty if you use $_SERVER['REMOTE_ADDR'].
716 - *
717 - * @since 6.1
718 - *
719 - * @return bool
720 - */
721 - private static function should_use_custom_header_ip() {
722 - $settings = self::get_settings();
723 - $should_use_custom_header_ip = ! $settings->no_ips && $settings->custom_header_ip;
724 -
725 - /**
726 - * Filter whether to check spoofable HTTP headers.
727 - * This uses the custom_header_ip setting, but it is hidden if the GDPR option is also on.
728 - * As the IP is still checked for blacklist checks, someone with the GDPR option may still want to enable this when behind a reverse proxy.
729 - *
730 - * @since 6.1
731 - *
732 - * @param bool $should_use_custom_header_ip
733 - */
734 - return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
735 - }
736 -
737 - /**
738 - * @param string $param
739 - * @param mixed $default
740 - * @param string $src
741 - * @param callable|string $sanitize
742 - *
743 - * @return mixed
744 - */
745 407 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
746 408 if ( strpos( $param, '[' ) ) {
747 409 $params = explode( '[', $param );
748 410 $param = $params[0];
@@ -749,9 +411,8 @@
749 411 }
750 412
751 413 if ( $src === 'get' ) {
752 414 $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 415 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
755 416 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
756 417 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
757 418 }
@@ -773,9 +434,9 @@
773 434 continue;
774 435 }
775 436
776 437 $p = trim( $p, ']' );
777 - $value = $value[ $p ] ?? $default;
438 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
778 439 }
779 440 }
780 441
781 442 return $value;
@@ -780,25 +441,15 @@
780 441
781 442 return $value;
782 443 }
783 444
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 445 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
795 446 return self::get_simple_request(
796 447 array(
797 - 'type' => 'post',
798 - 'param' => $param,
799 - 'default' => $default,
800 - 'sanitize' => $sanitize,
448 + 'type' => 'post',
449 + 'param' => $param,
450 + 'default' => $default,
451 + 'sanitize' => $sanitize,
801 452 'serialized' => $serialized,
802 453 )
803 454 );
804 455 }
@@ -809,9 +460,9 @@
809 460 * @param string $param
810 461 * @param string $sanitize
811 462 * @param string $default
812 463 *
813 - * @return array|string
464 + * @return string|array
814 465 */
815 466 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
816 467 return self::get_simple_request(
817 468 array(
@@ -829,40 +480,39 @@
829 480 * @since 2.0.6
830 481 *
831 482 * @param array $args
832 483 *
833 - * @return array|string
484 + * @return string|array
834 485 */
835 486 public static function get_simple_request( $args ) {
836 487 $defaults = array(
837 - 'param' => '',
838 - 'default' => '',
839 - 'type' => 'get',
840 - 'sanitize' => 'sanitize_text_field',
488 + 'param' => '',
489 + 'default' => '',
490 + 'type' => 'get',
491 + 'sanitize' => 'sanitize_text_field',
841 492 'serialized' => false,
842 493 );
843 494 $args = wp_parse_args( $args, $defaults );
844 495
845 496 $value = $args['default'];
846 -
847 - if ( $args['type'] === 'get' ) {
497 + if ( $args['type'] == 'get' ) {
848 498 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
849 499 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
850 500 $value = wp_unslash( $_GET[ $args['param'] ] );
851 501 }
852 - } elseif ( $args['type'] === 'post' ) {
502 + } elseif ( $args['type'] == 'post' ) {
853 503 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
854 504 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
855 505 $value = wp_unslash( $_POST[ $args['param'] ] );
856 -
857 506 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
858 507 self::unserialize_or_decode( $value );
859 508 }
860 509 }
861 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
862 - // phpcs:ignore WordPress.Security.NonceVerification.Missing
510 + } else {
511 + if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
863 512 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
864 513 $value = wp_unslash( $_REQUEST[ $args['param'] ] );
514 + }
865 515 }
866 516
867 517 self::sanitize_value( $args['sanitize'], $value );
868 518
@@ -886,48 +536,23 @@
886 536
887 537 return $value;
888 538 }
889 539
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 540 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 ] );
541 + if ( ! empty( $sanitize ) ) {
542 + if ( is_array( $value ) ) {
543 + $temp_values = $value;
544 + foreach ( $temp_values as $k => $v ) {
545 + self::sanitize_value( $sanitize, $value[ $k ] );
546 + }
547 + } else {
548 + $value = call_user_func( $sanitize, $value );
914 549 }
915 - return;
916 550 }
917 -
918 - $value = call_user_func( $sanitize, $value );
919 551 }
920 552
921 - /**
922 - * @param array $sanitize_method
923 - * @param array $values
924 - *
925 - * @return void
926 - */
927 553 public static function sanitize_request( $sanitize_method, &$values ) {
928 554 $temp_values = $values;
929 -
930 555 foreach ( $temp_values as $k => $val ) {
931 556 if ( isset( $sanitize_method[ $k ] ) ) {
932 557 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
933 558 }
@@ -935,64 +560,23 @@
935 560 }
936 561
937 562 /**
938 563 * @since 4.0.04
939 - *
940 - * @param mixed $value
941 - *
942 - * @return void
943 564 */
944 565 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 - }
566 + self::sanitize_value( 'wp_kses_post', $value );
951 567 self::decode_specialchars( $value );
952 568 }
953 569
954 570 /**
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 571 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
985 572 * this MUST be done, else we'll be back to the '& entity' problem.
986 573 *
987 574 * @since 4.0.04
988 - *
989 - * @param mixed $value Value to decode, passed by reference.
990 575 */
991 576 public static function decode_specialchars( &$value ) {
992 577 if ( is_array( $value ) ) {
993 578 $temp_values = $value;
994 -
995 579 foreach ( $temp_values as $k => $v ) {
996 580 self::decode_specialchars( $value[ $k ] );
997 581 }
998 582 } else {
@@ -1006,9 +590,9 @@
1006 590 * Adapted from wp_specialchars_decode().
1007 591 *
1008 592 * @since 4.03.01
1009 593 *
1010 - * @param string $string The string to prep, passed by reference.
594 + * @param string $string The string to prep.
1011 595 */
1012 596 private static function decode_amp( &$string ) {
1013 597 // Don't bother if there are no entities - saves a lot of processing
1014 598 if ( empty( $string ) || strpos( $string, '&' ) === false ) {
@@ -1018,12 +602,10 @@
1018 602 $translation = array(
1019 603 '&quot;' => '"',
1020 604 '&#034;' => '"',
1021 605 '&#x22;' => '"',
1022 - // The space preserves the HTML.
1023 - '&lt; ' => '< ',
1024 - // The space preserves the HTML.
1025 - '&#060; ' => '< ',
606 + '&lt; ' => '< ', // The space preserves the HTML.
607 + '&#060; ' => '< ', // The space preserves the HTML.
1026 608 '&gt;' => '>',
1027 609 '&#062;' => '>',
1028 610 '&amp;' => '&',
1029 611 '&#038;' => '&',
@@ -1050,10 +632,10 @@
1050 632 * Sanitize the value, and allow some HTML
1051 633 *
1052 634 * @since 2.0
1053 635 *
1054 - * @param string $value The value to sanitize.
1055 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
636 + * @param string $value
637 + * @param array|string $allowed 'all' for everything included as defaults
1056 638 *
1057 639 * @return string
1058 640 */
1059 641 public static function kses( $value, $allowed = array() ) {
@@ -1062,28 +644,13 @@
1062 644 return wp_kses( $value, $allowed_html );
1063 645 }
1064 646
1065 647 /**
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 648 * The regular kses function strips [button_action] from submit button HTML.
1081 649 *
1082 650 * @since 5.0.13
1083 651 *
1084 652 * @param string $html
1085 - *
1086 653 * @return string
1087 654 */
1088 655 public static function kses_submit_button( $html ) {
1089 656 $included_button_action = false !== strpos( $html, '[button_action]' );
@@ -1093,9 +660,8 @@
1093 660 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1094 661 $html = self::kses( $html, 'all' );
1095 662 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1096 663 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1097 -
1098 664 if ( $included_button_action ) {
1099 665 if ( false !== strpos( $html, '<input type="submit"' ) ) {
1100 666 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1101 667 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
@@ -1103,13 +669,11 @@
1103 669 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1104 670 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1105 671 }
1106 672 }
1107 -
1108 673 if ( $included_back_hook ) {
1109 674 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1110 675 }
1111 -
1112 676 if ( $included_draft_hook ) {
1113 677 $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1114 678 }
1115 679 return $html;
@@ -1118,9 +682,8 @@
1118 682 /**
1119 683 * @since 5.0.13
1120 684 *
1121 685 * @param array $allowed_attr
1122 - *
1123 686 * @return array
1124 687 */
1125 688 public static function allow_visibility_style( $allowed_attr ) {
1126 689 $allowed_attr[] = 'visibility';
@@ -1130,9 +693,8 @@
1130 693 /**
1131 694 * @since 5.0.13
1132 695 *
1133 696 * @param array $allowed_html
1134 - *
1135 697 * @return array
1136 698 */
1137 699 public static function add_allowed_submit_button_tags( $allowed_html ) {
1138 700 $allowed_html['input'] = array(
@@ -1149,22 +711,17 @@
1149 711 }
1150 712
1151 713 /**
1152 714 * @since 2.05.03
1153 - *
1154 - * @param array|string $allowed
1155 - *
1156 - * @return array
1157 715 */
1158 716 private static function allowed_html( $allowed ) {
1159 717 $html = self::safe_html();
1160 718 $allowed_html = array();
1161 -
1162 719 if ( $allowed === 'all' ) {
1163 720 $allowed_html = $html;
1164 721 } elseif ( ! empty( $allowed ) ) {
1165 722 foreach ( (array) $allowed as $a ) {
1166 - $allowed_html[ $a ] = $html[ $a ] ?? array();
723 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1167 724 }
1168 725 }
1169 726
1170 727 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1179,9 +736,9 @@
1179 736 'id' => true,
1180 737 );
1181 738
1182 739 return array(
1183 - 'a' => array(
740 + 'a' => array(
1184 741 'class' => true,
1185 742 'href' => true,
1186 743 'id' => true,
1187 744 'rel' => true,
@@ -1250,16 +807,16 @@
1250 807 'cite' => true,
1251 808 'title' => true,
1252 809 ),
1253 810 '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,
811 + 'class' => true,
812 + 'fill' => true,
813 + 'height' => true,
814 + 'width' => true,
815 + 'x' => true,
816 + 'y' => true,
817 + 'rx' => true,
818 + 'stroke' => true,
1262 819 'stroke-opacity' => true,
1263 820 'stroke-width' => true,
1264 821 ),
1265 822 'section' => $allow_class,
@@ -1294,9 +851,9 @@
1294 851 'xlink:href' => true,
1295 852 ),
1296 853 'ul' => $allow_class,
1297 854 'label' => array(
1298 - 'for' => true,
855 + 'for' => true,
1299 856 'class' => true,
1300 857 'id' => true,
1301 858 ),
1302 859 'button' => array(
@@ -1305,13 +862,8 @@
1305 862 ),
1306 863 'legend' => array(
1307 864 'class' => true,
1308 865 ),
1309 - 'option' => array(
1310 - 'class' => true,
1311 - 'value' => true,
1312 - 'selected' => true,
1313 - ),
1314 866 );
1315 867 }
1316 868
1317 869 /**
@@ -1319,20 +871,18 @@
1319 871 *
1320 872 * @since 2.0
1321 873 */
1322 874 public static function remove_get_action() {
1323 - if ( empty( $_GET ) ) {
875 + if ( ! isset( $_GET ) ) {
1324 876 return;
1325 877 }
1326 878
1327 879 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1328 -
1329 880 if ( empty( $action_name ) ) {
1330 881 return;
1331 882 }
1332 883
1333 884 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1334 -
1335 885 if ( ! empty( $new_action ) ) {
1336 886 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1337 887 }
1338 888 }
@@ -1340,13 +890,9 @@
1340 890 /**
1341 891 * Check the WP query for a parameter
1342 892 *
1343 893 * @since 2.0
1344 - *
1345 - * @param array|string $value
1346 - * @param string $param
1347 - *
1348 - * @return array|string
894 + * @return string|array
1349 895 */
1350 896 public static function get_query_var( $value, $param ) {
1351 897 if ( $value != '' ) {
1352 898 return $value;
@@ -1352,9 +898,8 @@
1352 898 return $value;
1353 899 }
1354 900
1355 901 global $wp_query;
1356 -
1357 902 if ( isset( $wp_query->query_vars[ $param ] ) ) {
1358 903 $value = $wp_query->query_vars[ $param ];
1359 904 }
1360 905
@@ -1364,17 +909,13 @@
1364 909 /**
1365 910 * Try to show the SVG if possible. Otherwise, use the font icon.
1366 911 *
1367 912 * @since 4.0.02
1368 - *
1369 913 * @param string $class
1370 914 * @param array $atts
1371 - *
1372 - * @return string|null
1373 915 */
1374 916 public static function icon_by_class( $class, $atts = array() ) {
1375 917 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1376 -
1377 918 if ( isset( $atts['echo'] ) ) {
1378 919 unset( $atts['echo'] );
1379 920 }
1380 921
@@ -1380,32 +921,19 @@
1380 921
1381 922 $html_atts = self::array_to_html_params( $atts );
1382 923
1383 924 $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1384 -
1385 - // Replace icons that have been removed or renamed.
1386 - $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',
1390 - );
1391 -
1392 - if ( isset( $deprecated[ $icon ] ) ) {
1393 - $icon = $deprecated[ $icon ];
1394 - $class = str_replace( $icon, $deprecated[ $icon ], $class );
1395 - }
1396 -
1397 925 if ( $icon === $class ) {
1398 926 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1399 927 } else {
1400 928 $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1401 -
1402 929 if ( strpos( $icon, ' ' ) ) {
1403 930 $icon = explode( ' ', $icon );
1404 931 $icon = reset( $icon );
1405 932 }
1406 -
1407 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use xlink:href="#' . esc_attr( $icon ) . '" /></svg>';
933 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
934 + <use xlink:href="#' . esc_attr( $icon ) . '" />
935 + </svg>';
1408 936 }
1409 937
1410 938 if ( $echo ) {
1411 939 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
@@ -1419,9 +947,8 @@
1419 947 *
1420 948 * @since 5.0.13
1421 949 *
1422 950 * @param string $icon
1423 - *
1424 951 * @return string
1425 952 */
1426 953 public static function kses_icon( $icon ) {
1427 954 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1437,15 +964,13 @@
1437 964 /**
1438 965 * @since 5.0.13.1
1439 966 *
1440 967 * @param array $allowed_html
1441 - *
1442 968 * @return array
1443 969 */
1444 970 public static function add_allowed_icon_tags( $allowed_html ) {
1445 971 $allowed_html['svg']['data-open'] = true;
1446 972 $allowed_html['svg']['title'] = true;
1447 - $allowed_html['svg']['tabindex'] = true;
1448 973 return $allowed_html;
1449 974 }
1450 975
1451 976 /**
@@ -1451,13 +976,12 @@
1451 976 /**
1452 977 * @since 5.0.13
1453 978 *
1454 979 * @param array $allowed_attr
1455 - *
1456 980 * @return array
1457 981 */
1458 982 public static function allow_vars_in_styles( $allowed_attr ) {
1459 - $allowed_attr[] = '--primary-700';
983 + $allowed_attr[] = '--primary-hover';
1460 984 return $allowed_attr;
1461 985 }
1462 986
1463 987 /**
@@ -1466,9 +990,9 @@
1466 990 * @param bool $allow_css
1467 991 * @param string $css_string
1468 992 */
1469 993 public static function allow_style( $allow_css, $css_string ) {
1470 - if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
994 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-hover:' ) ) {
1471 995 $split = explode( ':', $css_string, 2 );
1472 996 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1473 997 }
1474 998 return $allow_css;
@@ -1477,14 +1001,12 @@
1477 1001 /**
1478 1002 * @since 5.0.13
1479 1003 *
1480 1004 * @param string $value
1481 - *
1482 1005 * @return bool
1483 1006 */
1484 1007 private static function is_a_valid_color( $value ) {
1485 1008 $match = 0;
1486 -
1487 1009 if ( 0 === strpos( $value, 'rgba(' ) ) {
1488 1010 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1489 1011 } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1490 1012 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
@@ -1497,19 +1019,11 @@
1497 1019 /**
1498 1020 * Include svg images.
1499 1021 *
1500 1022 * @since 4.0.02
1501 - *
1502 - * @return void
1503 1023 */
1504 1024 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;
1025 + include_once( self::plugin_path() . '/images/icons.svg' );
1512 1026 }
1513 1027
1514 1028 /**
1515 1029 * Convert an associative array to HTML values.
@@ -1518,13 +1032,12 @@
1518 1032 * @since 5.0.13 added $echo parameter.
1519 1033 *
1520 1034 * @param array $atts
1521 1035 * @param bool $echo
1522 - *
1523 1036 * @return string|void
1524 1037 */
1525 1038 public static function array_to_html_params( $atts, $echo = false ) {
1526 - $callback = function () use ( $atts ) {
1039 + $callback = function() use ( $atts ) {
1527 1040 if ( $atts ) {
1528 1041 foreach ( $atts as $key => $value ) {
1529 1042 echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1530 1043 }
@@ -1539,10 +1052,9 @@
1539 1052 * @since 5.0.13
1540 1053 *
1541 1054 * @param Closure $echo_function
1542 1055 * @param bool $echo
1543 - *
1544 - * @return string|null
1056 + * @return string|void
1545 1057 */
1546 1058 public static function clip( $echo_function, $echo = false ) {
1547 1059 if ( ! $echo ) {
1548 1060 ob_start();
@@ -1547,11 +1059,9 @@
1547 1059 if ( ! $echo ) {
1548 1060 ob_start();
1549 1061 }
1550 1062
1551 - if ( is_callable( $echo_function ) ) {
1552 - $echo_function();
1553 - }
1063 + $echo_function();
1554 1064
1555 1065 if ( ! $echo ) {
1556 1066 $return = ob_get_contents();
1557 1067 ob_end_clean();
@@ -1560,151 +1070,49 @@
1560 1070 }
1561 1071
1562 1072 /**
1563 1073 * @since 3.0
1564 - *
1565 - * @param array $atts
1566 - *
1567 - * @return void
1568 1074 */
1569 1075 public static function get_admin_header( $atts ) {
1570 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1571 -
1572 - if ( empty( $atts['close'] ) ) {
1076 + $has_nav = ( isset( $atts['form'] ) && ! empty( $atts['form'] ) && ( ! isset( $atts['is_template'] ) || ! $atts['is_template'] ) );
1077 + if ( ! isset( $atts['close'] ) || empty( $atts['close'] ) ) {
1573 1078 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1574 1079 }
1575 -
1576 1080 if ( ! isset( $atts['import_link'] ) ) {
1577 1081 $atts['import_link'] = false;
1578 1082 }
1579 1083
1580 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
1084 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1581 1085 }
1582 1086
1583 1087 /**
1584 - * @since 6.0
1585 - *
1586 - * @param string $type
1587 - *
1588 - * @return void
1088 + * @since 3.0
1089 + * @param array $atts
1589 1090 */
1590 - public static function import_link( $type = 'secondary' ) {
1591 - ?>
1592 - <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable-import' ) ); ?>" class="button frm-button-<?php echo esc_attr( $type ); ?> frm_animate_bg">
1593 - <?php esc_html_e( 'Import', 'formidable' ); ?>
1594 - </a>
1595 - <?php
1596 - }
1597 -
1598 - /**
1599 - * Print applicable admin banner.
1600 - *
1601 - * @since 5.4.2
1602 - *
1603 - * @param bool $should_show_lite_upgrade
1604 - *
1605 - * @return void
1606 - */
1607 - public static function print_admin_banner( $should_show_lite_upgrade ) {
1608 - if ( ! current_user_can( 'administrator' ) ) {
1609 - FrmInbox::maybe_show_banner();
1610 - return;
1611 - }
1612 -
1613 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1614 - // Print license warning or inbox banner and exit if either prints.
1615 - // And exit before printing the upgrade bar if it shouldn't be shown.
1616 - return;
1617 - }
1618 - ?>
1619 - <div class="frm-upgrade-bar">
1620 - <div class="frm-upgrade-bar-inner">
1091 + public static function add_new_item_link( $atts ) {
1092 + if ( ! empty( $atts['new_link'] ) ) {
1093 + ?>
1094 + <a href="<?php echo esc_url( $atts['new_link'] ); ?>" class="button button-primary frm-button-primary frm-with-plus">
1095 + <?php self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' ); ?>
1096 + <?php esc_html_e( 'Add New', 'formidable' ); ?>
1097 + </a>
1098 + <?php
1099 + } elseif ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1100 + ?>
1101 + <a href="#" class="button button-primary frm-button-primary frm-with-plus frm-trigger-new-form-modal">
1621 1102 <?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 - );
1103 + self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' );
1104 + esc_html_e( 'Add New', 'formidable' );
1647 1105 ?>
1648 - </div>
1649 - </div>
1650 - <?php
1651 - }
1652 -
1653 - /**
1654 - * @since 5.4.2
1655 - *
1656 - * @return bool True if a banner is available and shown.
1657 - */
1658 - private static function maybe_show_license_warning() {
1659 - return is_callable( 'FrmProAddonsController::admin_banner' ) && FrmProAddonsController::admin_banner();
1660 - }
1661 -
1662 - /**
1663 - * Render a button for a new item (Form, Application, etc).
1664 - *
1665 - * @since 3.0
1666 - *
1667 - * @param array $atts {
1668 - * Details about the button.
1669 - *
1670 - * @type array $link_hook Custom link hook, calls do_action and exits early.
1671 - * @type string $new_link Href value, default #.
1672 - * @type string $class Custom class names, space separated.
1673 - * @type string $button_text Button text. Default "Add New".
1674 - * }
1675 - *
1676 - * @return void
1677 - */
1678 - public static function add_new_item_link( $atts ) {
1679 - if ( isset( $atts['link_hook'] ) ) {
1106 + </a>
1107 + <?php
1108 + } elseif ( isset( $atts['link_hook'] ) ) {
1680 1109 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1681 - return;
1682 1110 }
1683 -
1684 - if ( empty( $atts['new_link'] ) && empty( $atts['create_form'] ) && empty( $atts['class'] ) ) {
1685 - // Do not render a button if none of these attributes are set.
1686 - return;
1687 - }
1688 -
1689 - $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1690 - $class = 'button button-primary frm-button-primary';
1691 -
1692 - if ( ! empty( $atts['class'] ) ) {
1693 - $class .= ' ' . $atts['class'];
1694 - }
1695 -
1696 - $button_text = ! empty( $atts['button_text'] ) ? $atts['button_text'] : __( 'Add New', 'formidable' );
1697 -
1698 - require self::plugin_path() . '/classes/views/shared/add-button.php';
1699 1111 }
1700 1112
1701 1113 /**
1702 1114 * @since 3.06
1703 - *
1704 - * @param array $atts
1705 - *
1706 - * @return void
1707 1115 */
1708 1116 public static function show_search_box( $atts ) {
1709 1117 $defaults = array(
1710 1118 'placeholder' => '',
@@ -1710,12 +1118,10 @@
1710 1118 'placeholder' => '',
1711 1119 'tosearch' => '',
1712 1120 'text' => __( 'Search', 'formidable' ),
1713 1121 'input_id' => '',
1714 - 'value' => false,
1715 - 'class' => '',
1716 1122 );
1717 - $atts = array_merge( $defaults, $atts );
1123 + $atts = array_merge( $defaults, $atts );
1718 1124
1719 1125 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1720 1126 $atts['tosearch'] = 'frm-card';
1721 1127 }
@@ -1720,9 +1126,8 @@
1720 1126 $atts['tosearch'] = 'frm-card';
1721 1127 }
1722 1128
1723 1129 $class = 'frm-search-input';
1724 -
1725 1130 if ( ! empty( $atts['tosearch'] ) ) {
1726 1131 $class .= ' frm-auto-search';
1727 1132 }
1728 1133
@@ -1727,34 +1132,21 @@
1727 1132 }
1728 1133
1729 1134 $input_id = $atts['input_id'] . '-search-input';
1730 1135
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 1136 ?>
1751 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1137 + <p class="frm-search">
1752 1138 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1753 1139 <?php echo esc_html( $atts['text'] ); ?>:
1754 1140 </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 ); ?> />
1141 + <span class="frmfont frm_search_icon"></span>
1142 + <input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s"
1143 + value="<?php _admin_search_query(); ?>" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>"
1144 + class="<?php echo esc_attr( $class ); ?>" data-tosearch="<?php echo esc_attr( $atts['tosearch'] ); ?>"
1145 + <?php if ( ! empty( $atts['tosearch'] ) ) { ?>
1146 + autocomplete="off"
1147 + <?php } ?>
1148 + />
1757 1149 <?php
1758 1150 if ( empty( $atts['tosearch'] ) ) {
1759 1151 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1760 1152 }
@@ -1763,17 +1155,13 @@
1763 1155 <?php
1764 1156 }
1765 1157
1766 1158 /**
1767 - * @param string $type Hook type slug.
1768 - * @param object|null $object Optional related object.
1769 - *
1770 - * @return void
1159 + * @param string $type
1771 1160 */
1772 1161 public static function trigger_hook_load( $type, $object = null ) {
1773 1162 // Only load the form hooks once.
1774 1163 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1775 -
1776 1164 if ( ! $hooks_loaded ) {
1777 1165 do_action( 'frm_load_' . $type . '_hooks' );
1778 1166 }
1779 1167 }
@@ -1778,14 +1166,11 @@
1778 1166 }
1779 1167 }
1780 1168
1781 1169 /**
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.
1170 + * Save all front-end js scripts into a single file
1784 1171 *
1785 1172 * @since 3.0
1786 - *
1787 - * @return void
1788 1173 */
1789 1174 public static function save_combined_js() {
1790 1175 $file_atts = apply_filters(
1791 1176 'frm_js_location',
@@ -1798,34 +1183,10 @@
1798 1183
1799 1184 $files = array(
1800 1185 self::plugin_path() . '/js/formidable.min.js',
1801 1186 );
1802 - /**
1803 - * @param array $files
1804 - */
1805 1187 $files = apply_filters( 'frm_combined_js_files', $files );
1806 1188 $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 1189 }
1829 1190
1830 1191 /**
1831 1192 * Check a value from a shortcode to see if true or false.
@@ -1832,14 +1193,14 @@
1832 1193 * True when value is 1, true, 'true', 'yes'
1833 1194 *
1834 1195 * @since 1.07.10
1835 1196 *
1836 - * @param string $value The value to compare.
1197 + * @param string $value The value to compare
1837 1198 *
1838 - * @return bool
1199 + * @return boolean True or False
1839 1200 */
1840 1201 public static function is_true( $value ) {
1841 - return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1202 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1842 1203 }
1843 1204
1844 1205 /**
1845 1206 * Gets all post from a specific post type.
@@ -1847,9 +1208,8 @@
1847 1208 *
1848 1209 * @since 4.10.01 Add `$post_type` argument.
1849 1210 *
1850 1211 * @param string $post_type Post type to query. Default is `page`.
1851 - *
1852 1212 * @return WP_Post[]
1853 1213 */
1854 1214 public static function get_pages( $post_type = 'page' ) {
1855 1215 $query = array(
@@ -1868,9 +1228,8 @@
1868 1228 *
1869 1229 * @since 5.0.09
1870 1230 *
1871 1231 * @param string $post_type Post type to query. Default is `page`.
1872 - *
1873 1232 * @return array
1874 1233 */
1875 1234 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1876 1235 return FrmDb::get_results(
@@ -1899,9 +1258,9 @@
1899 1258 $args = self::preformat_selection_args( $args );
1900 1259
1901 1260 $pages_count = wp_count_posts( $args['post_type'] );
1902 1261
1903 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1262 + if ( $pages_count->publish <= 50 ) {
1904 1263 self::wp_pages_dropdown( $args );
1905 1264 return;
1906 1265 }
1907 1266
@@ -1907,9 +1266,9 @@
1907 1266
1908 1267 wp_enqueue_script( 'jquery-ui-autocomplete' );
1909 1268
1910 1269 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1911 - $title = '';
1270 + $title = '';
1912 1271
1913 1272 if ( $selected ) {
1914 1273 $title = get_the_title( $selected );
1915 1274 }
@@ -1925,116 +1284,18 @@
1925 1284 <?php
1926 1285 }
1927 1286
1928 1287 /**
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.
1288 + * @param array $args
1289 + * @param string $page_id Deprecated.
1290 + * @param boolean $truncate Deprecated.
1934 1291 */
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 1292 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2033 1293 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2034 1294
2035 1295 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2036 1296 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1297 +
2037 1298 ?>
2038 1299 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2039 1300 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2040 1301 <?php foreach ( $pages as $page ) { ?>
@@ -2050,14 +1311,8 @@
2050 1311 * Fill in missing parameters passed to wp_pages_dropdown().
2051 1312 * This is for reverse compatibility with switching 3 params to 1.
2052 1313 *
2053 1314 * @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 1315 */
2061 1316 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2062 1317 if ( ! is_array( $args ) ) {
2063 1318 $args = array(
@@ -2074,20 +1329,16 @@
2074 1329 * Filter to format args for page dropdown or autocomplete
2075 1330 *
2076 1331 * @since 4.03.06
2077 1332 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2078 - *
2079 - * @param array $args
2080 - *
2081 - * @return array
2082 1333 */
2083 1334 private static function preformat_selection_args( $args ) {
2084 1335 $defaults = array(
2085 - 'truncate' => false,
2086 - 'placeholder' => ' ',
2087 - 'field_name' => '',
2088 - 'page_id' => '',
2089 - 'post_type' => 'page',
1336 + 'truncate' => false,
1337 + 'placeholder' => ' ',
1338 + 'field_name' => '',
1339 + 'page_id' => '',
1340 + 'post_type' => 'page',
2090 1341 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
2091 1342 );
2092 1343
2093 1344 return array_merge( $defaults, $args );
@@ -2092,18 +1343,13 @@
2092 1343
2093 1344 return array_merge( $defaults, $args );
2094 1345 }
2095 1346
2096 - /**
2097 - * @param int $post_id
2098 - *
2099 - * @return string
2100 - */
2101 1347 public static function post_edit_link( $post_id ) {
2102 1348 $post = get_post( $post_id );
2103 -
2104 1349 if ( $post ) {
2105 1350 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1351 + $post_url = self::maybe_full_screen_link( $post_url );
2106 1352
2107 1353 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2108 1354 }
2109 1355
@@ -2113,68 +1359,37 @@
2113 1359 /**
2114 1360 * Hide the WordPress menus on some pages.
2115 1361 *
2116 1362 * @since 4.0
2117 - *
2118 - * @return bool
2119 1363 */
2120 1364 public static function is_full_screen() {
2121 - return self::is_form_builder_page() ||
2122 - self::is_style_editor_page() ||
2123 - self::is_full_screen_view_builder_page();
1365 + $full_builder = self::is_form_builder_page();
1366 + $styler = self::is_admin_page( 'formidable-styles' ) || self::is_admin_page( 'formidable-styles2' );
1367 + $full_entries = self::simple_get( 'frm-full', 'absint' );
1368 +
1369 + return $full_builder || $full_entries || $styler || self::is_view_builder_page();
2124 1370 }
2125 1371
2126 1372 /**
2127 - * Check if user is on the style editor or its alternative URL.
2128 - * The first URL is a submenu "Styles" in the Formidable menu /wp-admin/admin.php?page=formidable-styles.
2129 - * The alternative URL is linked as a submenu "Forms" item of the Appearance menu /wp-admin/themes.php?page=formidable-styles2.
2130 - *
2131 - * @since 5.5.3
2132 - * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2133 - *
2134 - * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2135 - *
2136 - * @return bool
1373 + * @since 4.0
2137 1374 */
2138 - public static function is_style_editor_page( $view = '' ) {
2139 - if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
2140 - return false;
1375 + public static function maybe_full_screen_link( $link ) {
1376 + $is_full = self::simple_get( 'frm-full', 'absint' );
1377 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1378 + $link .= '&frm-full=1';
2141 1379 }
2142 -
2143 - if ( ! in_array( $view, array( 'list', 'edit' ), true ) ) {
2144 - return true;
2145 - }
2146 -
2147 - $action = self::simple_get( 'frm_action' );
2148 - $is_edit_mode = 'edit' === $action || ( ! $action && ! self::simple_get( 'id' ) && ! self::simple_get( 'form' ) );
2149 -
2150 - if ( ! $is_edit_mode && class_exists( 'FrmProStylesController' ) && in_array( $action, array( 'new_style', 'duplicate' ), true ) ) {
2151 - $is_edit_mode = true;
2152 - }
2153 -
2154 - $checking_for_edit_mode = 'edit' === $view;
2155 -
2156 - return $is_edit_mode === $checking_for_edit_mode;
1380 + return $link;
2157 1381 }
2158 1382
2159 1383 /**
2160 - * @since 5.5.3
2161 - *
2162 - * @return bool
1384 + * @param string $field_name
1385 + * @param string|array $capability
1386 + * @param string $multiple 'single' and 'multiple'
2163 1387 */
2164 - private static function is_full_screen_view_builder_page() {
2165 - return self::is_admin_page( 'formidable-views-editor' );
2166 - }
2167 -
2168 - /**
2169 - * @param string $field_name
2170 - * @param array|string $capability
2171 - * @param string $multiple 'single' and 'multiple'.
2172 - */
2173 1388 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2174 1389 ?>
2175 1390 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2176 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1391 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2177 1392 class="frm_multiselect">
2178 1393 <?php self::roles_options( $capability ); ?>
2179 1394 </select>
2180 1395 <?php
@@ -2181,11 +1396,10 @@
2181 1396 }
2182 1397
2183 1398 /**
2184 1399 * @since 4.07
2185 - *
2186 1400 * @param array|string $selected
2187 - * @param string $current
1401 + * @param string $current
2188 1402 */
2189 1403 private static function selected( $selected, $current ) {
2190 1404 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2191 1405 FrmProAppHelper::selected( $selected, $current );
@@ -2194,13 +1408,12 @@
2194 1408 }
2195 1409 }
2196 1410
2197 1411 /**
2198 - * @param array|string $capability
1412 + * @param string|array $capability
2199 1413 */
2200 1414 public static function roles_options( $capability ) {
2201 1415 global $frm_vars;
2202 -
2203 1416 if ( isset( $frm_vars['editable_roles'] ) ) {
2204 1417 $editable_roles = $frm_vars['editable_roles'];
2205 1418 } else {
2206 1419 $editable_roles = get_editable_roles();
@@ -2209,9 +1422,9 @@
2209 1422
2210 1423 foreach ( $editable_roles as $role => $details ) {
2211 1424 $name = translate_user_role( $details['name'] );
2212 1425 ?>
2213 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1426 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_attr( $name ); ?> </option>
2214 1427 <?php
2215 1428 unset( $role, $details );
2216 1429 }
2217 1430 }
@@ -2221,14 +1434,22 @@
2221 1434 *
2222 1435 * @since 5.0 Parameter `$type` supports `pro_only` value.
2223 1436 *
2224 1437 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2225 - *
2226 1438 * @return array
2227 1439 */
2228 1440 public static function frm_capabilities( $type = 'auto' ) {
2229 - if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
2230 - return self::get_lite_capabilities();
1441 + $cap = array(
1442 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1443 + 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1444 + 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1445 + 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1446 + 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1447 + 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1448 + );
1449 +
1450 + if ( ! self::pro_is_installed() && 'pro' !== $type && 'pro_only' !== $type ) {
1451 + return $cap;
2231 1452 }
2232 1453
2233 1454 $pro_cap = array(
2234 1455 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
@@ -2233,42 +1454,19 @@
2233 1454 $pro_cap = array(
2234 1455 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2235 1456 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2236 1457 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1458 + 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
2237 1459 );
2238 - /**
2239 - * @since 5.3.1
2240 - *
2241 - * @param array<string,string> $pro_cap
2242 - */
2243 - $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
2244 1460
2245 1461 if ( 'pro_only' === $type ) {
2246 1462 return $pro_cap;
2247 1463 }
2248 1464
2249 - return self::get_lite_capabilities() + $pro_cap;
1465 + return $cap + $pro_cap;
2250 1466 }
2251 1467
2252 1468 /**
2253 - * Get the list of lite plugin capabilities.
2254 - *
2255 - * @since 5.3.1
2256 - *
2257 - * @return array<string,string>
2258 - */
2259 - private static function get_lite_capabilities() {
2260 - return array(
2261 - 'frm_view_forms' => __( 'View Forms List', 'formidable' ),
2262 - 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2263 - 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2264 - 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2265 - 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
2266 - 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
2267 - );
2268 - }
2269 -
2270 - /**
2271 1469 * Call the WordPress current_user_can but also validate empty strings as true for any logged in user
2272 1470 *
2273 1471 * @since 4.06.03
2274 1472 *
@@ -2300,10 +1498,9 @@
2300 1498 return current_user_can( $role );
2301 1499 }
2302 1500
2303 1501 /**
2304 - * @param array|string $needed_role
2305 - *
1502 + * @param string|array $needed_role
2306 1503 * @return bool
2307 1504 */
2308 1505 public static function user_has_permission( $needed_role ) {
2309 1506 if ( is_array( $needed_role ) ) {
@@ -2322,14 +1519,12 @@
2322 1519 return $can;
2323 1520 }
2324 1521
2325 1522 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2326 -
2327 1523 foreach ( $roles as $role ) {
2328 1524 if ( current_user_can( $role ) ) {
2329 1525 return true;
2330 1526 }
2331 -
2332 1527 if ( $role == $needed_role ) {
2333 1528 break;
2334 1529 }
2335 1530 }
@@ -2351,9 +1546,8 @@
2351 1546
2352 1547 $user_id = get_current_user_id();
2353 1548 $user = new WP_User( $user_id );
2354 1549 $frm_roles = self::frm_capabilities();
2355 -
2356 1550 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2357 1551 $user->add_cap( $frm_role );
2358 1552 unset( $frm_role, $frm_role_description );
2359 1553 }
@@ -2362,18 +1556,13 @@
2362 1556 /**
2363 1557 * Make sure admins have permission to see the menu items
2364 1558 *
2365 1559 * @since 2.0.6
2366 - *
2367 - * @param string $cap
2368 - *
2369 - * @return void
2370 1560 */
2371 1561 public static function force_capability( $cap = 'frm_change_settings' ) {
2372 1562 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2373 1563 $role = get_role( 'administrator' );
2374 1564 $frm_roles = self::frm_capabilities();
2375 -
2376 1565 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2377 1566 $role->add_cap( $frm_role );
2378 1567 }
2379 1568 }
@@ -2379,19 +1568,17 @@
2379 1568 }
2380 1569 }
2381 1570
2382 1571 /**
2383 - * Check if the user has permission for action.
1572 + * Check if the user has permision for action.
2384 1573 * Return permission message and stop the action if no permission
2385 1574 *
2386 1575 * @since 2.0
2387 1576 *
2388 1577 * @param string $permission
2389 - * @param string $show_message
2390 1578 */
2391 1579 public static function permission_check( $permission, $show_message = 'show' ) {
2392 1580 $permission_error = self::permission_nonce_error( $permission );
2393 -
2394 1581 if ( $permission_error !== false ) {
2395 1582 if ( 'hide' == $show_message ) {
2396 1583 $permission_error = '';
2397 1584 }
@@ -2404,10 +1591,8 @@
2404 1591 *
2405 1592 * @since 2.0
2406 1593 *
2407 1594 * @param string $permission
2408 - * @param string $nonce_name
2409 - * @param string $nonce
2410 1595 *
2411 1596 * @return false|string The permission message or false if allowed
2412 1597 */
2413 1598 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
@@ -2417,15 +1602,13 @@
2417 1602 return $frm_settings->admin_permission;
2418 1603 }
2419 1604
2420 1605 $error = false;
2421 -
2422 1606 if ( empty( $nonce_name ) ) {
2423 1607 return $error;
2424 1608 }
2425 1609
2426 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2427 -
1610 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2428 1611 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2429 1612 $frm_settings = self::get_settings();
2430 1613 $error = $frm_settings->admin_permission;
2431 1614 }
@@ -2432,14 +1615,8 @@
2432 1615
2433 1616 return $error;
2434 1617 }
2435 1618
2436 - /**
2437 - * @param array|string $values
2438 - * @param string $current
2439 - *
2440 - * @return void
2441 - */
2442 1619 public static function checked( $values, $current ) {
2443 1620 if ( self::check_selected( $values, $current ) ) {
2444 1621 echo ' checked="checked"';
2445 1622 }
@@ -2444,39 +1621,24 @@
2444 1621 echo ' checked="checked"';
2445 1622 }
2446 1623 }
2447 1624
2448 - /**
2449 - * @param array|string $values
2450 - * @param string $current
2451 - *
2452 - * @return bool
2453 - */
2454 1625 public static function check_selected( $values, $current ) {
2455 - $values = self::recursive_function_map( $values, 'trim' );
2456 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1626 + $values = self::recursive_function_map( $values, 'trim' );
1627 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1628 + $current = htmlspecialchars_decode( trim( $current ) );
2457 1629
2458 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2459 -
2460 1630 return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2461 1631 }
2462 1632
2463 - /**
2464 - * @param array|string $value
2465 - * @param callable|string $function
2466 - *
2467 - * @return array|string
2468 - */
2469 1633 public static function recursive_function_map( $value, $function ) {
2470 1634 if ( is_array( $value ) ) {
2471 1635 $original_function = $function;
2472 -
2473 1636 if ( count( $value ) ) {
2474 1637 $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2475 1638 } else {
2476 1639 $function = array( $function );
2477 1640 }
2478 -
2479 1641 if ( ! self::is_assoc( $value ) ) {
2480 1642 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2481 1643 } else {
2482 1644 foreach ( $value as $k => $v ) {
@@ -2485,38 +1647,14 @@
2485 1647 }
2486 1648 }
2487 1649 }
2488 1650 } else {
2489 - $value = self::maybe_update_value_if_null( $value, $function );
2490 1651 $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 1652 }
2510 1653
2511 1654 return $value;
2512 1655 }
2513 1656
2514 - /**
2515 - * @param array $array
2516 - *
2517 - * @return bool
2518 - */
2519 1657 public static function is_assoc( $array ) {
2520 1658 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2521 1659 }
2522 1660
@@ -2521,24 +1659,20 @@
2521 1659 }
2522 1660
2523 1661 /**
2524 1662 * Flatten a multi-dimensional array
2525 - *
2526 - * @param array $array
2527 - * @param string $keys
2528 - *
2529 - * @return array
2530 1663 */
2531 1664 public static function array_flatten( $array, $keys = 'keep' ) {
2532 1665 $return = array();
2533 -
2534 1666 foreach ( $array as $key => $value ) {
2535 1667 if ( is_array( $value ) ) {
2536 1668 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2537 - } elseif ( $keys === 'keep' ) {
1669 + } else {
1670 + if ( $keys == 'keep' ) {
2538 1671 $return[ $key ] = $value;
2539 - } else {
2540 - $return[] = $value;
1672 + } else {
1673 + $return[] = $value;
1674 + }
2541 1675 }
2542 1676 }
2543 1677
2544 1678 return $return;
@@ -2543,43 +1677,16 @@
2543 1677
2544 1678 return $return;
2545 1679 }
2546 1680
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 1681 public static function esc_textarea( $text, $is_rich_text = false ) {
2569 1682 $safe_text = str_replace( '&quot;', '"', $text );
2570 -
2571 1683 if ( ! $is_rich_text ) {
2572 1684 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2573 1685 }
2574 -
2575 1686 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2576 1687
2577 - /**
2578 - * @param string $safe_text
2579 - * @param string $text
2580 - */
2581 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1688 + return apply_filters( 'esc_textarea', $safe_text, $text );
2582 1689 }
2583 1690
2584 1691 /**
2585 1692 * Add auto paragraphs to text areas
@@ -2584,15 +1691,11 @@
2584 1691 /**
2585 1692 * Add auto paragraphs to text areas
2586 1693 *
2587 1694 * @since 2.0
2588 - *
2589 - * @param mixed $content
2590 - *
2591 - * @return mixed
2592 1695 */
2593 1696 public static function use_wpautop( $content ) {
2594 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
1697 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
2595 1698 $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2596 1699 }
2597 1700
2598 1701 return $content;
@@ -2597,15 +1700,8 @@
2597 1700
2598 1701 return $content;
2599 1702 }
2600 1703
2601 - /**
2602 - * Replace quotes with their HTML entities.
2603 - *
2604 - * @param string $val
2605 - *
2606 - * @return string
2607 - */
2608 1704 public static function replace_quotes( $val ) {
2609 1705 // Replace double quotes.
2610 1706 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2611 1707
@@ -2615,28 +1711,22 @@
2615 1711 return $val;
2616 1712 }
2617 1713
2618 1714 /**
2619 - * @param string $handle
2620 - * @param int|string $default
2621 - *
2622 - * @return int|string
1715 + * @param string $handle
2623 1716 */
2624 1717 public static function script_version( $handle, $default = 0 ) {
2625 1718 global $wp_scripts;
2626 -
2627 1719 if ( ! $wp_scripts ) {
2628 1720 return $default;
2629 1721 }
2630 1722
2631 1723 $ver = $default;
2632 -
2633 1724 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2634 1725 return $ver;
2635 1726 }
2636 1727
2637 1728 $query = $wp_scripts->registered[ $handle ];
2638 -
2639 1729 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2640 1730 $ver = $query->ver;
2641 1731 }
2642 1732
@@ -2647,23 +1737,17 @@
2647 1737 * @since 5.0.13 added $echo param.
2648 1738 *
2649 1739 * @param string $url
2650 1740 * @param bool $echo
2651 - *
2652 - * @return string|null
1741 + * @return string|void
2653 1742 */
2654 1743 public static function js_redirect( $url, $echo = false ) {
2655 - $callback = function () use ( $url ) {
1744 + $callback = function() use ( $url ) {
2656 1745 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2657 1746 };
2658 1747 return self::clip( $callback, $echo );
2659 1748 }
2660 1749
2661 - /**
2662 - * @param int|string $user_id
2663 - *
2664 - * @return int|string
2665 - */
2666 1750 public static function get_user_id_param( $user_id ) {
2667 1751 if ( ! $user_id || is_numeric( $user_id ) ) {
2668 1752 return $user_id;
2669 1753 }
@@ -2668,10 +1752,9 @@
2668 1752 return $user_id;
2669 1753 }
2670 1754
2671 1755 $user_id = sanitize_text_field( $user_id );
2672 -
2673 - if ( $user_id === 'current' ) {
1756 + if ( $user_id == 'current' ) {
2674 1757 $user_id = get_current_user_id();
2675 1758 } else {
2676 1759 if ( is_email( $user_id ) ) {
2677 1760 $user = get_user_by( 'email', $user_id );
@@ -2687,14 +1770,8 @@
2687 1770
2688 1771 return $user_id;
2689 1772 }
2690 1773
2691 - /**
2692 - * @param string $filename
2693 - * @param array $atts
2694 - *
2695 - * @return false|string
2696 - */
2697 1774 public static function get_file_contents( $filename, $atts = array() ) {
2698 1775 if ( ! is_file( $filename ) ) {
2699 1776 return false;
2700 1777 }
@@ -2700,9 +1777,9 @@
2700 1777 }
2701 1778
2702 1779 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2703 1780 ob_start();
2704 - include $filename;
1781 + include( $filename );
2705 1782 $contents = ob_get_contents();
2706 1783 ob_end_clean();
2707 1784
2708 1785 return $contents;
@@ -2716,9 +1793,8 @@
2716 1793 * @param int $num_chars
2717 1794 */
2718 1795 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2719 1796 $key = '';
2720 -
2721 1797 if ( $name ) {
2722 1798 $key = sanitize_key( $name );
2723 1799 $key = self::maybe_clear_long_key( $key, $column );
2724 1800 }
@@ -2758,9 +1834,9 @@
2758 1834 ++$suffix;
2759 1835 } while ( in_array( $key_check, $similar_keys, true ) );
2760 1836
2761 1837 $key = $key_check;
2762 - }//end if
1838 + }
2763 1839
2764 1840 return $key;
2765 1841 }
2766 1842
@@ -2769,18 +1845,15 @@
2769 1845 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2770 1846 *
2771 1847 * @param string $column
2772 1848 * @param string $key
2773 - *
2774 1849 * @return string
2775 1850 */
2776 1851 private static function maybe_truncate_key_before_appending( $column, $key ) {
2777 1852 if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2778 1853 $max_key_length_before_truncating = 60;
2779 -
2780 1854 if ( strlen( $key ) > $max_key_length_before_truncating ) {
2781 1855 $key = substr( $key, 0, $max_key_length_before_truncating );
2782 -
2783 1856 if ( is_numeric( $key ) ) {
2784 1857 $key .= 'a';
2785 1858 }
2786 1859 }
@@ -2792,9 +1865,8 @@
2792 1865 * Possibly reset a key to avoid conflicts with column size limits.
2793 1866 *
2794 1867 * @param string $key
2795 1868 * @param string $column
2796 - *
2797 1869 * @return string either the original key value, or an empty string if the key was too long.
2798 1870 */
2799 1871 private static function maybe_clear_long_key( $key, $column ) {
2800 1872 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
@@ -2803,25 +1875,19 @@
2803 1875 return $key;
2804 1876 }
2805 1877
2806 1878 /**
2807 - * @since 6.21 This is changed from `private` to `public`.
2808 - *
2809 1879 * @param int $num_chars
2810 - *
2811 1880 * @return string
2812 1881 */
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 );
1882 + private static function generate_new_key( $num_chars ) {
1883 + $max_slug_value = pow( 36, $num_chars );
1884 + $min_slug_value = 37; // we want to have at least 2 characters in the slug
1885 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2819 1886 }
2820 1887
2821 1888 /**
2822 1889 * @param string $key
2823 - *
2824 1890 * @return string
2825 1891 */
2826 1892 private static function prevent_numeric_and_reserved_keys( $key ) {
2827 1893 if ( is_numeric( $key ) ) {
@@ -2835,9 +1901,8 @@
2835 1901 'editlink',
2836 1902 'siteurl',
2837 1903 'evenodd',
2838 1904 );
2839 -
2840 1905 if ( in_array( $key, $not_allowed, true ) ) {
2841 1906 $key .= 'a';
2842 1907 }
2843 1908 }
@@ -2846,16 +1911,11 @@
2846 1911
2847 1912 /**
2848 1913 * Editing a Form or Entry
2849 1914 *
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
1915 + * @param string $table
2856 1916 *
2857 - * @return array|bool
1917 + * @return bool|array
2858 1918 */
2859 1919 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2860 1920 if ( ! $record ) {
2861 1921 return false;
@@ -2870,9 +1930,9 @@
2870 1930 'fields' => array(),
2871 1931 );
2872 1932
2873 1933 foreach ( array( 'name', 'description' ) as $var ) {
2874 - $default_val = $record->{$var} ?? '';
1934 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2875 1935 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2876 1936 unset( $var, $default_val );
2877 1937 }
2878 1938
@@ -2890,16 +1950,8 @@
2890 1950
2891 1951 return $values;
2892 1952 }
2893 1953
2894 - /**
2895 - * @param array|string $fields
2896 - * @param object $record
2897 - * @param array $values
2898 - * @param array $args
2899 - *
2900 - * @return void
2901 - */
2902 1954 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2903 1955 if ( ! empty( $fields ) ) {
2904 1956 foreach ( (array) $fields as $field ) {
2905 1957 if ( ! self::is_admin_page() ) {
@@ -2905,32 +1957,24 @@
2905 1957 if ( ! self::is_admin_page() ) {
2906 1958 // Don't prep default values on the form settings page.
2907 1959 $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2908 1960 }
2909 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
1961 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2910 1962 self::fill_field_defaults( $field, $record, $values, $args );
2911 1963 }
2912 1964 }
2913 1965 }
2914 1966
2915 - /**
2916 - * @param object $field
2917 - * @param object $record
2918 - * @param array $values
2919 - * @param array $args
2920 - *
2921 - * @return void
2922 - */
2923 1967 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2924 1968 $post_values = $args['post_values'];
2925 1969
2926 1970 if ( $args['default'] ) {
2927 1971 $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 -
1972 + } else {
1973 + if ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
1974 + if ( ! isset( $field->field_options['custom_field'] ) ) {
1975 + $field->field_options['custom_field'] = '';
1976 + }
2933 1977 $meta_value = FrmProEntryMetaHelper::get_post_value(
2934 1978 $record->post_id,
2935 1979 $field->field_options['post_field'],
2936 1980 $field->field_options['custom_field'],
@@ -2940,14 +1984,14 @@
2940 1984 'form_id' => $field->form_id,
2941 1985 'field' => $field,
2942 1986 )
2943 1987 );
2944 - } else {
2945 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2946 - }//end if
1988 + } else {
1989 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
1990 + }
1991 + }
2947 1992
2948 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2949 -
1993 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2950 1994 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2951 1995 $new_value = $post_values['item_meta'][ $field->id ];
2952 1996 self::unserialize_or_decode( $new_value );
2953 1997 } else {
@@ -2993,15 +2037,12 @@
2993 2037 );
2994 2038 }
2995 2039
2996 2040 /**
2997 - * @param object $record
2998 2041 * @param string $table
2999 - * @param array $post_values
3000 - * @param array $values
3001 2042 */
3002 2043 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
3003 - if ( $table === 'entries' ) {
2044 + if ( $table == 'entries' ) {
3004 2045 $form = $record->form_id;
3005 2046 FrmForm::maybe_get_form( $form );
3006 2047 } else {
3007 2048 $form = $record;
@@ -3031,13 +2072,8 @@
3031 2072 }
3032 2073
3033 2074 /**
3034 2075 * Set to POST value or default
3035 - *
3036 - * @param array $post_values
3037 - * @param array $values
3038 - *
3039 - * @return void
3040 2076 */
3041 2077 private static function fill_form_defaults( $post_values, array &$values ) {
3042 2078 $form_defaults = FrmFormsHelper::get_default_opts();
3043 2079
@@ -3042,9 +2078,9 @@
3042 2078 $form_defaults = FrmFormsHelper::get_default_opts();
3043 2079
3044 2080 foreach ( $form_defaults as $opt => $default ) {
3045 2081 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3046 - $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
2082 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3047 2083 }
3048 2084
3049 2085 unset( $opt, $default );
3050 2086 }
@@ -3054,9 +2090,9 @@
3054 2090 }
3055 2091
3056 2092 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3057 2093 if ( ! isset( $values[ $h . '_html' ] ) ) {
3058 - $values[ $h . '_html' ] = ( $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h ) );
2094 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3059 2095 }
3060 2096 unset( $h );
3061 2097 }
3062 2098 }
@@ -3065,9 +2101,9 @@
3065 2101 * @since 2.2.10
3066 2102 *
3067 2103 * @param array $post_values
3068 2104 *
3069 - * @return bool|int
2105 + * @return boolean|int
3070 2106 */
3071 2107 public static function custom_style_value( $post_values ) {
3072 2108 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 2109 $custom_style = absint( $post_values['options']['custom_style'] );
@@ -3072,38 +2108,29 @@
3072 2108 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 2109 $custom_style = absint( $post_values['options']['custom_style'] );
3074 2110 } else {
3075 2111 $frm_settings = self::get_settings();
3076 - $custom_style = ( $frm_settings->load_style !== 'none' );
2112 + $custom_style = ( $frm_settings->load_style != 'none' );
3077 2113 }
3078 2114
3079 2115 return $custom_style;
3080 2116 }
3081 2117
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 ) ) {
2118 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2119 + if ( is_array( $str ) ) {
3092 2120 return '';
3093 2121 }
3094 2122
3095 2123 $length = (int) $length;
3096 - $str = wp_strip_all_tags( (string) $original_string );
2124 + $str = wp_strip_all_tags( $str );
3097 2125 $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3098 2126
3099 2127 if ( $length == 0 ) {
3100 2128 return '';
3101 - }
2129 + } elseif ( $length <= 10 ) {
2130 + $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3102 2131
3103 - if ( $length <= 10 ) {
3104 - $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3105 - return $sub . ( $length < $original_len ? $continue : '' );
2132 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
3106 2133 }
3107 2134
3108 2135 $sub = '';
3109 2136 $len = 0;
@@ -3109,16 +2136,11 @@
3109 2136 $len = 0;
3110 2137
3111 2138 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3112 2139
3113 - if ( ! is_array( $words ) ) {
3114 - return $original_string;
3115 - }
3116 -
3117 2140 foreach ( $words as $word ) {
3118 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2141 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3119 2142 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3120 -
3121 2143 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3122 2144 break;
3123 2145 }
3124 2146
@@ -3131,49 +2153,14 @@
3131 2153
3132 2154 unset( $total_len, $word );
3133 2155 }
3134 2156
3135 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length );
3136 -
3137 - return $sub . ( $len < $original_len ? $continue : '' );
2157 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3138 2158 }
3139 2159
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 2160 public static function mb_function( $function_names, $args ) {
3173 2161 $mb_function_name = $function_names[0];
3174 2162 $function_name = $function_names[1];
3175 -
3176 2163 if ( function_exists( $mb_function_name ) ) {
3177 2164 $function_name = $mb_function_name;
3178 2165 }
3179 2166
@@ -3179,15 +2166,8 @@
3179 2166
3180 2167 return call_user_func_array( $function_name, $args );
3181 2168 }
3182 2169
3183 - /**
3184 - * @param string $date
3185 - * @param string $date_format
3186 - * @param string $time_format
3187 - *
3188 - * @return string
3189 - */
3190 2170 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3191 2171 if ( empty( $date ) ) {
3192 2172 return $date;
3193 2173 }
@@ -3202,10 +2182,9 @@
3202 2182 }
3203 2183
3204 2184 $formatted = self::get_localized_date( $date_format, $date );
3205 2185
3206 - $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00' );
3207 -
2186 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3208 2187 if ( $do_time ) {
3209 2188 $formatted .= self::add_time_to_date( $time_format, $date );
3210 2189 }
3211 2190
@@ -3211,14 +2190,8 @@
3211 2190
3212 2191 return $formatted;
3213 2192 }
3214 2193
3215 - /**
3216 - * @param string $time_format
3217 - * @param string $date
3218 - *
3219 - * @return string
3220 - */
3221 2194 private static function add_time_to_date( $time_format, $date ) {
3222 2195 if ( empty( $time_format ) ) {
3223 2196 $time_format = get_option( 'time_format' );
3224 2197 }
@@ -3224,9 +2197,8 @@
3224 2197 }
3225 2198
3226 2199 $trimmed_format = trim( $time_format );
3227 2200 $time = '';
3228 -
3229 2201 if ( $time_format && ! empty( $trimmed_format ) ) {
3230 2202 $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3231 2203 }
3232 2204
@@ -3234,13 +2206,8 @@
3234 2206 }
3235 2207
3236 2208 /**
3237 2209 * @since 2.0.8
3238 - *
3239 - * @param string $date_format
3240 - * @param string $date
3241 - *
3242 - * @return string
3243 2210 */
3244 2211 public static function get_localized_date( $date_format, $date ) {
3245 2212 $date = get_date_from_gmt( $date );
3246 2213
@@ -3247,23 +2214,21 @@
3247 2214 return date_i18n( $date_format, strtotime( $date ) );
3248 2215 }
3249 2216
3250 2217 /**
3251 - * Gets the time ago in words.
2218 + * Gets the time ago in words
3252 2219 *
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.
2220 + * @param int $from in seconds
2221 + * @param int|string $to in seconds
3256 2222 *
3257 2223 * @return string $time_ago
3258 2224 */
3259 2225 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3260 - if ( empty( $to ) && 0 !== $to ) {
2226 + if ( empty( $to ) ) {
3261 2227 $now = new DateTime();
3262 2228 } else {
3263 2229 $now = new DateTime( '@' . $to );
3264 2230 }
3265 -
3266 2231 $ago = new DateTime( '@' . $from );
3267 2232
3268 2233 // Get the time difference
3269 2234 $diff_object = $now->diff( $ago );
@@ -3269,9 +2234,9 @@
3269 2234 $diff_object = $now->diff( $ago );
3270 2235 $diff = get_object_vars( $diff_object );
3271 2236
3272 2237 // Add week amount and update day amount
3273 - $diff['w'] = floor( $diff['d'] / 7 );
2238 + $diff['w'] = floor( $diff['d'] / 7 );
3274 2239 $diff['d'] -= $diff['w'] * 7;
3275 2240
3276 2241 $time_strings = self::get_time_strings();
3277 2242
@@ -3277,11 +2242,10 @@
3277 2242
3278 2243 if ( ! is_numeric( $levels ) ) {
3279 2244 // Show time in specified unit.
3280 2245 $levels = self::get_unit( $levels );
3281 -
3282 2246 if ( isset( $time_strings[ $levels ] ) ) {
3283 - $diff = array(
2247 + $diff = array(
3284 2248 $levels => self::time_format( $levels, $diff ),
3285 2249 );
3286 2250 $time_strings = array(
3287 2251 $levels => $time_strings[ $levels ],
@@ -3286,9 +2250,8 @@
3286 2250 $time_strings = array(
3287 2251 $levels => $time_strings[ $levels ],
3288 2252 );
3289 2253 }
3290 -
3291 2254 $levels = 1;
3292 2255 }
3293 2256
3294 2257 foreach ( $time_strings as $k => $v ) {
@@ -3310,13 +2273,8 @@
3310 2273 }
3311 2274
3312 2275 /**
3313 2276 * @since 4.05.01
3314 - *
3315 - * @param string $unit
3316 - * @param array $diff
3317 - *
3318 - * @return int
3319 2277 */
3320 2278 private static function time_format( $unit, $diff ) {
3321 2279 $return = array(
3322 2280 'y' => 'y',
@@ -3321,9 +2279,8 @@
3321 2279 $return = array(
3322 2280 'y' => 'y',
3323 2281 'd' => 'days',
3324 2282 );
3325 -
3326 2283 if ( isset( $return[ $unit ] ) ) {
3327 2284 return $diff[ $return[ $unit ] ];
3328 2285 }
3329 2286
@@ -3343,13 +2300,8 @@
3343 2300 }
3344 2301
3345 2302 /**
3346 2303 * @since 4.05.01
3347 - *
3348 - * @param string $from
3349 - * @param string $to
3350 - *
3351 - * @return int
3352 2304 */
3353 2305 private static function convert_time( $from, $to ) {
3354 2306 $convert = array(
3355 2307 's' => 1,
@@ -3365,16 +2317,11 @@
3365 2317 }
3366 2318
3367 2319 /**
3368 2320 * @since 4.05.01
3369 - *
3370 - * @param string $unit
3371 - *
3372 - * @return int|string
3373 2321 */
3374 2322 private static function get_unit( $unit ) {
3375 2323 $units = self::get_time_strings();
3376 -
3377 2324 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3378 2325 return $unit;
3379 2326 }
3380 2327
@@ -3387,12 +2334,11 @@
3387 2334 }
3388 2335
3389 2336 /**
3390 2337 * Get the translatable time strings. The untranslated version is a failsafe
3391 - * in case languages are changing for the unit set in the shortcode.
2338 + * in case langauges are changing for the unit set in the shortcode.
3392 2339 *
3393 2340 * @since 2.0.20
3394 - *
3395 2341 * @return array
3396 2342 */
3397 2343 private static function get_time_strings() {
3398 2344 return array(
@@ -3436,47 +2382,35 @@
3436 2382
3437 2383 // Pagination Methods.
3438 2384
3439 2385 /**
3440 - * @param int $r_count
3441 - * @param int $current_p
3442 - * @param int $p_size
3443 - *
3444 - * @return int
2386 + * @param integer $current_p
3445 2387 */
3446 2388 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 );
2389 + return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
3448 2390 }
3449 2391
3450 2392 /**
3451 - * @param int $r_count
3452 - * @param int $current_p
3453 - * @param int $p_size
3454 - *
3455 - * @return int
2393 + * @param integer $current_p
3456 2394 */
3457 2395 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3458 2396 if ( $current_p == 1 ) {
3459 2397 return 1;
2398 + } else {
2399 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3460 2400 }
3461 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3462 2401 }
3463 2402
3464 2403 /**
3465 - * @param array $json_vars
3466 - *
3467 2404 * @return array
3468 2405 */
3469 2406 public static function json_to_array( $json_vars ) {
3470 2407 $vars = array();
3471 -
3472 2408 foreach ( $json_vars as $jv ) {
3473 2409 $jv_name = explode( '[', $jv['name'] );
3474 2410 $last = count( $jv_name ) - 1;
3475 -
3476 2411 foreach ( $jv_name as $p => $n ) {
3477 2412 $name = trim( $n, ']' );
3478 -
3479 2413 if ( ! isset( $l1 ) ) {
3480 2414 $l1 = $name;
3481 2415 }
3482 2416
@@ -3487,9 +2421,9 @@
3487 2421 if ( ! isset( $l3 ) ) {
3488 2422 $l3 = $name;
3489 2423 }
3490 2424
3491 - $this_val = $p == $last ? $jv['value'] : array();
2425 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3492 2426
3493 2427 switch ( $p ) {
3494 2428 case 0:
3495 2429 $l1 = $name;
@@ -3511,12 +2445,12 @@
3511 2445 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3512 2446 }
3513 2447
3514 2448 unset( $this_val, $n );
3515 - }//end foreach
2449 + }
3516 2450
3517 2451 unset( $last, $jv );
3518 - }//end foreach
2452 + }
3519 2453
3520 2454 return $vars;
3521 2455 }
3522 2456
@@ -3522,12 +2456,8 @@
3522 2456
3523 2457 /**
3524 2458 * @param string $name
3525 2459 * @param string $l1
3526 - * @param mixed $val
3527 - * @param array $vars
3528 - *
3529 - * @return void
3530 2460 */
3531 2461 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3532 2462 if ( $name == '' ) {
3533 2463 $vars[] = $val;
@@ -3535,19 +2465,12 @@
3535 2465 $vars[ $l1 ] = $val;
3536 2466 }
3537 2467 }
3538 2468
3539 - /**
3540 - * @param string $name
3541 - * @param string $class
3542 - * @param string $form_name
3543 - *
3544 - * @return void
3545 - */
3546 2469 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3547 2470 $tooltips = array(
3548 2471 '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' ),
2472 + '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 2473 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3551 2474 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3552 2475 '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 2476 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
@@ -3552,9 +2475,8 @@
3552 2475 '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 2476 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3554 2477 /* translators: %1$s: Form name, %2$s: Date */
3555 2478 '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 2479 );
3558 2480
3559 2481 if ( ! isset( $tooltips[ $name ] ) ) {
3560 2482 return;
@@ -3574,14 +2496,8 @@
3574 2496 }
3575 2497
3576 2498 /**
3577 2499 * 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 2500 */
3585 2501 public static function select_current_page( $page, $current_page, $action = array() ) {
3586 2502 if ( $current_page != $page ) {
3587 2503 return;
@@ -3587,13 +2503,8 @@
3587 2503 return;
3588 2504 }
3589 2505
3590 2506 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3591 -
3592 - if ( 'lite-reports' === $frm_action ) {
3593 - $frm_action = 'reports';
3594 - }
3595 -
3596 2507 if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3597 2508 echo ' class="current_page"';
3598 2509 }
3599 2510 }
@@ -3630,15 +2541,8 @@
3630 2541
3631 2542 return $post_content;
3632 2543 }
3633 2544
3634 - /**
3635 - * @param array|string $val
3636 - * @param int|string $key
3637 - * @param array $post_content
3638 - *
3639 - * @return void
3640 - */
3641 2545 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3642 2546 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3643 2547 return;
3644 2548 }
@@ -3657,16 +2561,12 @@
3657 2561 }
3658 2562 }
3659 2563
3660 2564 /**
3661 - * Check for either json or serialized data. This is temporary while transitioning
2565 + * Check for either json or serilized data. This is temporary while transitioning
3662 2566 * all data to json.
3663 2567 *
3664 2568 * @since 4.02.03
3665 - *
3666 - * @param array|string $value
3667 - *
3668 - * @return void
3669 2569 */
3670 2570 public static function unserialize_or_decode( &$value ) {
3671 2571 if ( is_array( $value ) ) {
3672 2572 return;
@@ -3672,9 +2572,9 @@
3672 2572 return;
3673 2573 }
3674 2574
3675 2575 if ( is_serialized( $value ) ) {
3676 - $value = self::maybe_unserialize_array( $value );
2576 + $value = maybe_unserialize( $value );
3677 2577 } else {
3678 2578 $value = self::maybe_json_decode( $value, false );
3679 2579 }
3680 2580 }
@@ -3679,43 +2579,13 @@
3679 2579 }
3680 2580 }
3681 2581
3682 2582 /**
3683 - * Safely unserialize an array if necessary.
3684 - * This function doesn't actually use unserialize. The string is parsed instead.
3685 - *
3686 - * @since 6.2
3687 - *
3688 - * @param mixed $value
3689 - *
3690 - * @return mixed
3691 - */
3692 - public static function maybe_unserialize_array( $value ) {
3693 - if ( ! is_string( $value ) ) {
3694 - return $value;
3695 - }
3696 -
3697 - // Since we only expect an array, skip anything that doesn't start with a:.
3698 - if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
3699 - return $value;
3700 - }
3701 -
3702 - $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3703 -
3704 - if ( is_array( $parsed ) ) {
3705 - $value = $parsed;
3706 - }
3707 -
3708 - return $value;
3709 - }
3710 -
3711 - /**
3712 2583 * Decode a JSON string.
3713 2584 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3714 2585 *
3715 2586 * @param mixed $string
3716 2587 * @param bool $single_to_array
3717 - *
3718 2588 * @return mixed
3719 2589 */
3720 2590 public static function maybe_json_decode( $string, $single_to_array = true ) {
3721 2591 if ( is_array( $string ) || is_null( $string ) ) {
@@ -3722,17 +2592,14 @@
3722 2592 return $string;
3723 2593 }
3724 2594
3725 2595 $new_string = json_decode( $string, true );
3726 -
3727 2596 if ( function_exists( 'json_last_error' ) ) {
3728 2597 // php 5.3+
3729 2598 $single_value = false;
3730 -
3731 2599 if ( ! $single_to_array ) {
3732 2600 $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3733 2601 }
3734 -
3735 2602 if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3736 2603 $string = $new_string;
3737 2604 }
3738 2605 }
@@ -3740,45 +2607,11 @@
3740 2607 return $string;
3741 2608 }
3742 2609
3743 2610 /**
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 2611 * Reformat the json serialized array in name => value array.
3775 2612 *
3776 2613 * @since 4.02.03
3777 - *
3778 - * @param array $form
3779 - *
3780 - * @return void
3781 2614 */
3782 2615 public static function format_form_data( &$form ) {
3783 2616 $formatted = array();
3784 2617
@@ -3785,11 +2618,9 @@
3785 2618 foreach ( $form as $input ) {
3786 2619 if ( ! isset( $input['name'] ) ) {
3787 2620 continue;
3788 2621 }
3789 -
3790 2622 $key = $input['name'];
3791 -
3792 2623 if ( isset( $formatted[ $key ] ) ) {
3793 2624 if ( is_array( $formatted[ $key ] ) ) {
3794 2625 $formatted[ $key ][] = $input['value'];
3795 2626 } else {
@@ -3804,12 +2635,8 @@
3804 2635 }
3805 2636
3806 2637 /**
3807 2638 * @since 4.02.03
3808 - *
3809 - * @param array|string $value
3810 - *
3811 - * @return string
3812 2639 */
3813 2640 public static function maybe_json_encode( $value ) {
3814 2641 if ( is_array( $value ) ) {
3815 2642 $value = wp_json_encode( $value );
@@ -3817,15 +2644,12 @@
3817 2644 return $value;
3818 2645 }
3819 2646
3820 2647 /**
3821 - * Echo The javascript to open and highlight the Formidable menu
3822 - *
3823 2648 * @since 1.07.10
3824 2649 *
3825 - * @param string $post_type The name of the post type that may need to be highlighted.
3826 - *
3827 - * @return void
2650 + * @param string $post_type The name of the post type that may need to be highlighted
2651 + * echo The javascript to open and highlight the Formidable menu
3828 2652 */
3829 2653 public static function maybe_highlight_menu( $post_type ) {
3830 2654 global $post;
3831 2655
@@ -3844,12 +2668,8 @@
3844 2668 /**
3845 2669 * Load the JS file on non-Formidable pages in the admin area
3846 2670 *
3847 2671 * @since 2.0
3848 - *
3849 - * @param bool $load
3850 - *
3851 - * @return void
3852 2672 */
3853 2673 public static function load_admin_wide_js( $load = true ) {
3854 2674 $version = self::plugin_version();
3855 2675 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
@@ -3854,18 +2674,14 @@
3854 2674 $version = self::plugin_version();
3855 2675 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
3856 2676
3857 2677 $global_strings = array(
3858 - 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
3859 - 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3860 - 'url' => self::plugin_url(),
3861 - 'app_url' => 'https://formidableforms.com/',
3862 - 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3863 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3864 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3865 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3866 - 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3867 - 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
2678 + 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2679 + 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2680 + 'url' => self::plugin_url(),
2681 + 'app_url' => 'https://formidableforms.com/',
2682 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2683 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
3868 2684 );
3869 2685 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3870 2686
3871 2687 if ( $load ) {
@@ -3874,10 +2690,8 @@
3874 2690 }
3875 2691
3876 2692 /**
3877 2693 * @since 2.0.9
3878 - *
3879 - * @return void
3880 2694 */
3881 2695 public static function load_font_style() {
3882 2696 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3883 2697 }
@@ -3883,147 +2697,99 @@
3883 2697 }
3884 2698
3885 2699 /**
3886 2700 * @param string $location
3887 - *
3888 - * @return void
3889 2701 */
3890 2702 public static function localize_script( $location ) {
3891 - global $wp_scripts, $wp_version;
2703 + global $wp_scripts;
3892 2704
2705 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2706 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2707 +
3893 2708 $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,
2709 + 'ajax_url' => $ajax_url,
2710 + 'images_url' => self::plugin_url() . '/images',
2711 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2712 + 'remove' => __( 'Remove', 'formidable' ),
2713 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2714 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2715 + 'id' => __( 'ID', 'formidable' ),
2716 + 'no_results' => __( 'No results match', 'formidable' ),
2717 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2718 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2719 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
2720 + 'focus_first_error' => self::should_focus_first_error(),
2721 + 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3909 2722 );
3910 2723
3911 2724 $data = $wp_scripts->get_data( 'formidable', 'data' );
3912 -
3913 - if ( ! $data ) {
2725 + if ( empty( $data ) ) {
3914 2726 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3915 2727 }
3916 2728
3917 - if ( $location === 'admin' ) {
2729 + if ( $location == 'admin' ) {
2730 + $frm_settings = self::get_settings();
3918 2731 $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(),
2732 + 'desc' => __( '(Click to add description)', 'formidable' ),
2733 + 'blank' => __( '(Blank)', 'formidable' ),
2734 + 'no_label' => __( '(no label)', 'formidable' ),
2735 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2736 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2737 + 'ok' => __( 'OK', 'formidable' ),
2738 + 'cancel' => __( 'Cancel', 'formidable' ),
2739 + 'default_label' => __( 'Default', 'formidable' ),
2740 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2741 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2742 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2743 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2744 + 'caution' => __( 'Heads up', 'formidable' ),
2745 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2746 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2747 + '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' ),
2748 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2749 + 'default_unique' => $frm_settings->unique_msg,
2750 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2751 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2752 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2753 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2754 + 'new_option' => __( 'New Option', 'formidable' ),
2755 + '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' ),
2756 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2757 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2758 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2759 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2760 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2761 + 'private_label' => __( 'Private', 'formidable' ),
2762 + 'jquery_ui_url' => '',
2763 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2764 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2765 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2766 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2767 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2768 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2769 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3956 2770 /* 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' ), '****' ),
2771 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3958 2772 /* 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', '>=' ),
2773 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2774 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2775 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2776 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2777 + 'install' => __( 'Install', 'formidable' ),
2778 + 'active' => __( 'Active', 'formidable' ),
2779 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2780 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3984 2781 );
3985 - /**
3986 - * @param array $admin_script_strings
3987 - */
3988 2782 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3989 2783
3990 2784 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3991 -
3992 - if ( ! $data ) {
2785 + if ( empty( $data ) ) {
3993 2786 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3994 2787 }
3995 - }//end if
2788 + }
3996 2789 }
3997 2790
3998 2791 /**
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 2792 * Returns whether or not the first errored input should be auto-focused (default true).
4027 2793 *
4028 2794 * @since 5.2.05
4029 2795 *
@@ -4048,11 +2814,9 @@
4048 2814 * Echo the message on the plugins listing page
4049 2815 *
4050 2816 * @since 1.07.10
4051 2817 *
4052 - * @param float $min_version The version the add-on requires.
4053 - *
4054 - * @return void
2818 + * @param float $min_version The version the add-on requires
4055 2819 */
4056 2820 public static function min_version_notice( $min_version ) {
4057 2821 $frm_version = self::plugin_version();
4058 2822
@@ -4070,12 +2834,8 @@
4070 2834 /**
4071 2835 * If Pro is far outdated, show a message.
4072 2836 *
4073 2837 * @since 4.0.01
4074 - *
4075 - * @param string $min_version
4076 - *
4077 - * @return void
4078 2838 */
4079 2839 public static function min_pro_version_notice( $min_version ) {
4080 2840 if ( ! self::is_formidable_admin() ) {
4081 2841 // Don't show admin-wide.
@@ -4084,14 +2844,26 @@
4084 2844
4085 2845 self::php_version_notice();
4086 2846
4087 2847 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4088 -
4089 2848 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4090 2849 return;
4091 2850 }
4092 2851
4093 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
2852 + $pro_version = FrmProDb::$plug_version;
2853 + $expired = FrmAddonsController::is_license_expired();
2854 + ?>
2855 + <div class="error frm_previous_install">
2856 + <?php
2857 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
2858 + if ( empty( $expired ) ) {
2859 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2860 + } else {
2861 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
2862 + }
2863 + ?>
2864 + </div>
2865 + <?php
4094 2866 }
4095 2867
4096 2868 /**
4097 2869 * If Pro is installed, check the version number.
@@ -4096,12 +2868,8 @@
4096 2868 /**
4097 2869 * If Pro is installed, check the version number.
4098 2870 *
4099 2871 * @since 4.0.01
4100 - *
4101 - * @param string $min_version
4102 - *
4103 - * @return bool
4104 2872 */
4105 2873 public static function meets_min_pro_version( $min_version ) {
4106 2874 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 2875 }
@@ -4106,24 +2874,27 @@
4106 2874 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 2875 }
4108 2876
4109 2877 /**
4110 - * Show a message if the PHP version is below the recommendations.
2878 + * Show a message if the browser or PHP version is below the recommendations.
4111 2879 *
4112 2880 * @since 4.0.02
4113 - *
4114 - * @return void
4115 2881 */
4116 2882 private static function php_version_notice() {
4117 2883 $message = array();
2884 + if ( version_compare( phpversion(), '5.6', '<' ) ) {
2885 + $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' );
2886 + }
4118 2887
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' );
2888 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
2889 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
2890 + if ( $is_ie ) {
2891 + $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 2892 }
4122 2893
4123 2894 foreach ( $message as $m ) {
4124 2895 ?>
4125 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2896 + <div class="error frm_previous_install">
4126 2897 <?php echo esc_html( $m ); ?>
4127 2898 </div>
4128 2899 <?php
4129 2900 }
@@ -4128,26 +2899,17 @@
4128 2899 <?php
4129 2900 }
4130 2901 }
4131 2902
4132 - /**
4133 - * @param string $type
4134 - *
4135 - * @return array<string,string>
4136 - */
4137 2903 public static function locales( $type = 'date' ) {
4138 2904 $locales = array(
4139 2905 'en' => __( 'English', 'formidable' ),
4140 2906 'af' => __( 'Afrikaans', 'formidable' ),
4141 2907 'sq' => __( 'Albanian', 'formidable' ),
4142 - 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
4143 - 'am' => __( 'Amharic', 'formidable' ),
4144 2908 'ar' => __( 'Arabic', 'formidable' ),
4145 2909 'hy' => __( 'Armenian', 'formidable' ),
4146 2910 'az' => __( 'Azerbaijani', 'formidable' ),
4147 2911 'eu' => __( 'Basque', 'formidable' ),
4148 - 'be' => __( 'Belarusian', 'formidable' ),
4149 - 'bn' => __( 'Bengali', 'formidable' ),
4150 2912 'bs' => __( 'Bosnian', 'formidable' ),
4151 2913 'bg' => __( 'Bulgarian', 'formidable' ),
4152 2914 'ca' => __( 'Catalan', 'formidable' ),
4153 2915 'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
@@ -4166,15 +2928,12 @@
4166 2928 'fi' => __( 'Finnish', 'formidable' ),
4167 2929 'fr' => __( 'French', 'formidable' ),
4168 2930 'fr-CA' => __( 'French/Canadian', 'formidable' ),
4169 2931 'fr-CH' => __( 'French/Swiss', 'formidable' ),
4170 - 'gl' => __( 'Galician', 'formidable' ),
4171 - 'ka' => __( 'Georgian', 'formidable' ),
4172 2932 'de' => __( 'German', 'formidable' ),
4173 2933 'de-AT' => __( 'German/Austria', 'formidable' ),
4174 2934 'de-CH' => __( 'German/Switzerland', 'formidable' ),
4175 2935 'el' => __( 'Greek', 'formidable' ),
4176 - 'gu' => __( 'Gujarati', 'formidable' ),
4177 2936 'he' => __( 'Hebrew', 'formidable' ),
4178 2937 'iw' => __( 'Hebrew', 'formidable' ),
4179 2938 'hi' => __( 'Hindi', 'formidable' ),
4180 2939 'hu' => __( 'Hungarian', 'formidable' ),
@@ -4181,85 +2940,59 @@
4181 2940 'is' => __( 'Icelandic', 'formidable' ),
4182 2941 'id' => __( 'Indonesian', 'formidable' ),
4183 2942 'it' => __( 'Italian', 'formidable' ),
4184 2943 'ja' => __( 'Japanese', 'formidable' ),
4185 - 'kn' => __( 'Kannada', 'formidable' ),
4186 - 'kk' => __( 'Kazakh', 'formidable' ),
4187 - 'km' => __( 'Khmer', 'formidable' ),
4188 2944 'ko' => __( 'Korean', 'formidable' ),
4189 - 'ky' => __( 'Kyrgyz', 'formidable' ),
4190 - 'lo' => __( 'Laothian', 'formidable' ),
4191 2945 'lv' => __( 'Latvian', 'formidable' ),
4192 2946 'lt' => __( 'Lithuanian', 'formidable' ),
4193 - 'lb' => __( 'Luxembourgish', 'formidable' ),
4194 - 'mk' => __( 'Macedonian', 'formidable' ),
4195 - 'ml' => __( 'Malayalam', 'formidable' ),
4196 2947 'ms' => __( 'Malaysian', 'formidable' ),
4197 - 'mr' => __( 'Marathi', 'formidable' ),
4198 2948 'no' => __( 'Norwegian', 'formidable' ),
4199 - 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
4200 - 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
4201 2949 'pl' => __( 'Polish', 'formidable' ),
4202 2950 'pt' => __( 'Portuguese', 'formidable' ),
4203 2951 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
4204 2952 'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
4205 - 'rm' => __( 'Romansh', 'formidable' ),
4206 2953 'ro' => __( 'Romanian', 'formidable' ),
4207 2954 'ru' => __( 'Russian', 'formidable' ),
4208 2955 'sr' => __( 'Serbian', 'formidable' ),
4209 2956 'sr-SR' => __( 'Serbian', 'formidable' ),
4210 - 'si' => __( 'Sinhalese', 'formidable' ),
4211 2957 'sk' => __( 'Slovak', 'formidable' ),
4212 2958 'sl' => __( 'Slovenian', 'formidable' ),
4213 2959 'es' => __( 'Spanish', 'formidable' ),
4214 2960 'es-419' => __( 'Spanish/Latin America', 'formidable' ),
4215 - 'sw' => __( 'Swahili', 'formidable' ),
4216 2961 'sv' => __( 'Swedish', 'formidable' ),
4217 2962 'ta' => __( 'Tamil', 'formidable' ),
4218 - 'te' => __( 'Telugu', 'formidable' ),
4219 2963 'th' => __( 'Thai', 'formidable' ),
4220 - 'tj' => __( 'Tajiki', 'formidable' ),
4221 2964 'tr' => __( 'Turkish', 'formidable' ),
4222 2965 'uk' => __( 'Ukrainian', 'formidable' ),
4223 - 'ur' => __( 'Urdu', 'formidable' ),
4224 2966 'vi' => __( 'Vietnamese', 'formidable' ),
4225 - 'cy-GB' => __( 'Welsh', 'formidable' ),
4226 - 'zu' => __( 'Zulu', 'formidable' ),
4227 2967 );
4228 2968
4229 2969 if ( $type === 'captcha' ) {
4230 2970 // remove the languages unavailable for the captcha
4231 - $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
2971 + $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
4232 2972 } else {
4233 2973 // remove the languages unavailable for the datepicker
4234 - $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
2974 + $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
4235 2975 }
4236 2976
4237 2977 $locales = array_diff_key( $locales, array_flip( $unset ) );
2978 + $locales = apply_filters( 'frm_locales', $locales );
4238 2979
4239 - /**
4240 - * Filter available locale options.
4241 - *
4242 - * @since 5.4.5 Added $args parameter with type.
4243 - *
4244 - * @param array<string,string> $locales
4245 - * @param array $args {
4246 - *
4247 - * @type string $type
4248 - * }
4249 - */
4250 - $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
4251 -
4252 2980 return $locales;
4253 2981 }
4254 2982
4255 2983 /**
4256 - * @return string
2984 + * Output HTML containing reference text for accessibility
2985 + *
2986 + * @deprecated 5.1
4257 2987 */
2988 + public static function multiselect_accessibility() {
2989 + _deprecated_function( __METHOD__, '5.1' );
2990 + }
2991 +
4258 2992 public static function get_menu_icon_class() {
4259 2993 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4260 2994 $settings = FrmProAppHelper::get_settings();
4261 -
4262 2995 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4263 2996 return $settings->menu_icon;
4264 2997 }
4265 2998 }
@@ -4305,9 +3038,8 @@
4305 3038 *
4306 3039 * @since 5.0.04
4307 3040 *
4308 3041 * @param array $args The arguments.
4309 - *
4310 3042 * @return array
4311 3043 */
4312 3044 private static function fill_default_images_dropdown_args( $args ) {
4313 3045 $defaults = array(
@@ -4320,8 +3052,14 @@
4320 3052
4321 3053 $new_args['options'] = (array) $new_args['options'];
4322 3054 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4323 3055
3056 + // Set the number of columns.
3057 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3058 + if ( $new_args['col_class'] > 6 ) {
3059 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3060 + }
3061 +
4324 3062 /**
4325 3063 * Allows modifying the arguments of images_dropdown() method.
4326 3064 *
4327 3065 * @since 5.0.04
@@ -4337,9 +3075,8 @@
4337 3075 *
4338 3076 * @since 5.0.04
4339 3077 *
4340 3078 * @param array $args The arguments.
4341 - *
4342 3079 * @return string
4343 3080 */
4344 3081 private static function get_images_dropdown_input_attrs( $args ) {
4345 3082 $input_attrs = $args['input_attrs'];
@@ -4346,9 +3083,8 @@
4346 3083 $input_attrs['type'] = 'radio';
4347 3084 $input_attrs['name'] = $args['name'];
4348 3085
4349 3086 $input_attrs_str = '';
4350 -
4351 3087 foreach ( $input_attrs as $key => $input_attr ) {
4352 3088 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4353 3089 }
4354 3090
@@ -4363,23 +3099,8 @@
4363 3099 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4364 3100 }
4365 3101
4366 3102 /**
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 3103 * Gets the image of each option in images_dropdown() method.
4383 3104 *
4384 3105 * @since 5.0.04
4385 3106 *
@@ -4384,9 +3105,8 @@
4384 3105 * @since 5.0.04
4385 3106 *
4386 3107 * @param array $option Option data.
4387 3108 * @param array $args The arguments of images_dropdown() method.
4388 - *
4389 3109 * @return string
4390 3110 */
4391 3111 private static function get_images_dropdown_option_image( $option, $args ) {
4392 3112 $image = self::icon_by_class(
@@ -4391,9 +3111,9 @@
4391 3111 private static function get_images_dropdown_option_image( $option, $args ) {
4392 3112 $image = self::icon_by_class(
4393 3113 'frmfont ' . $option['svg'],
4394 3114 array(
4395 - 'echo' => false,
3115 + 'echo' => false,
4396 3116 )
4397 3117 );
4398 3118
4399 3119 $args['option'] = $option;
@@ -4415,9 +3135,8 @@
4415 3135 * @since 5.0.04
4416 3136 *
4417 3137 * @param array $option Option data.
4418 3138 * @param array $args The arguments of images_dropdown() method.
4419 - *
4420 3139 * @return string
4421 3140 */
4422 3141 private static function get_images_dropdown_option_classes( $option, $args ) {
4423 3142 $classes = '';
@@ -4445,14 +3164,12 @@
4445 3164 * @since 5.0.04
4446 3165 *
4447 3166 * @param array $option Option data.
4448 3167 * @param array $args The arguments of images_dropdown() method.
4449 - *
4450 3168 * @return string
4451 3169 */
4452 3170 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4453 3171 $html_attrs = '';
4454 -
4455 3172 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4456 3173 $html_attrs_arr = array();
4457 3174
4458 3175 foreach ( $option['custom_attrs'] as $key => $value ) {
@@ -4515,9 +3232,8 @@
4515 3232 * @since 5.0.07
4516 3233 *
4517 3234 * @param array $values
4518 3235 * @param array $keys
4519 - *
4520 3236 * @return array
4521 3237 */
4522 3238 public static function maybe_filter_array( $values, $keys ) {
4523 3239 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4535,16 +3251,15 @@
4535 3251 return $values;
4536 3252 }
4537 3253
4538 3254 /**
4539 - * Some back end fields allow privileged users to add scripts.
3255 + * Some back end fields allow privleged users to add scripts.
4540 3256 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4541 3257 *
4542 3258 * @since 5.0.13
4543 3259 *
4544 3260 * @param string $value
4545 - * @param array|string $allowed 'all' for everything included as defaults.
4546 - *
3261 + * @param array|string $allowed 'all' for everything included as defaults
4547 3262 * @return string
4548 3263 */
4549 3264 public static function maybe_kses( $value, $allowed = 'all' ) {
4550 3265 if ( self::should_never_allow_unfiltered_html() ) {
@@ -4553,78 +3268,26 @@
4553 3268 return $value;
4554 3269 }
4555 3270
4556 3271 /**
4557 - * Check if an option attribute used in an [input] shortcode is safe.
3272 + * @since 5.0.16
4558 3273 *
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 3274 * @return bool
4565 3275 */
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 );
3276 + public static function show_landing_pages() {
3277 + return self::show_new_feature( 'landing' );
4611 3278 }
4612 3279
4613 3280 /**
4614 3281 * @since 5.0.16
4615 3282 *
4616 - * @param string $medium
4617 - *
4618 3283 * @return array
4619 3284 */
4620 3285 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4621 3286 $params = array(
4622 - 'medium' => $medium,
4623 - 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4624 - 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4625 - 'screenshot' => 'landing.png',
4626 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
3287 + 'medium' => $medium,
3288 + 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
3289 + 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4627 3290 );
4628 3291 return self::get_upgrade_data_params( 'landing', $params );
4629 3292 }
4630 3293
@@ -4630,10 +3293,20 @@
4630 3293
4631 3294 /**
4632 3295 * @since 5.0.17
4633 3296 *
4634 - * @param string $feature
3297 + * @param string $plugin
3298 + * @return string|false
3299 + */
3300 + private static function get_plan_required( $plugin ) {
3301 + $link = FrmAddonsController::install_link( $plugin );
3302 + return FrmFormsHelper::get_plan_required( $link );
3303 + }
3304 +
3305 + /**
3306 + * @since 5.0.17
4635 3307 *
3308 + * @param string
4636 3309 * @return bool
4637 3310 */
4638 3311 public static function show_new_feature( $feature ) {
4639 3312 $link = FrmAddonsController::install_link( $feature );
@@ -4640,21 +3313,16 @@
4640 3313 return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4641 3314 }
4642 3315
4643 3316 /**
4644 - * Enhances upgrade data parameters with installation link and plan requirement information.
4645 - *
4646 3317 * @since 5.0.17
4647 3318 *
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.
3319 + * @param string $plugin
3320 + * @param array $params
3321 + * @return array
4653 3322 */
4654 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3323 + public static function get_upgrade_data_params( $plugin, $params ) {
4655 3324 $link = FrmAddonsController::install_link( $plugin );
4656 -
4657 3325 if ( ! $link ) {
4658 3326 return $params;
4659 3327 }
4660 3328
@@ -4660,20 +3328,15 @@
4660 3328
4661 3329 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4662 3330 $params['oneclick'] = json_encode( $link );
4663 3331 unset( $params['message'] );
4664 -
4665 3332 if ( ! isset( $params['medium'] ) ) {
4666 3333 $params['medium'] = $plugin;
4667 3334 }
4668 3335 } else {
4669 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3336 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4670 3337 }
4671 3338
4672 - if ( $detailed ) {
4673 - $params['plugin-status'] = $link['status'] ?? '';
4674 - }
4675 -
4676 3339 return $params;
4677 3340 }
4678 3341
4679 3342 /**
@@ -4682,9 +3345,8 @@
4682 3345 *
4683 3346 * @since 5.0.17
4684 3347 *
4685 3348 * @param string $text
4686 - *
4687 3349 * @return bool
4688 3350 */
4689 3351 public static function ctype_xdigit( $text ) {
4690 3352 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4699,9 +3361,8 @@
4699 3361 * @since 5.2.01
4700 3362 */
4701 3363 public static function set_current_screen_and_hook_suffix() {
4702 3364 global $hook_suffix;
4703 -
4704 3365 if ( is_null( $hook_suffix ) ) {
4705 3366 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4706 3367 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4707 3368 }
@@ -4708,8 +3369,36 @@
4708 3369 set_current_screen();
4709 3370 }
4710 3371
4711 3372 /**
3373 + * @since 4.07
3374 + * @deprecated 4.09.01
3375 + */
3376 + public static function renewal_message() {
3377 + if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
3378 + FrmProAddonsController::renewal_message();
3379 + return;
3380 + }
3381 +
3382 + if ( ! FrmAddonsController::is_license_expired() ) {
3383 + return;
3384 + }
3385 +
3386 + ?>
3387 + <div class="frm_error_style" style="text-align:left">
3388 + <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
3389 + &nbsp;
3390 + <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
3391 + <div style="float:right">
3392 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
3393 + <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
3394 + </a>
3395 + </div>
3396 + </div>
3397 + <?php
3398 + }
3399 +
3400 + /**
4712 3401 * Shows pill text.
4713 3402 *
4714 3403 * @since 5.2.02
4715 3404 *
@@ -4718,9 +3407,9 @@
4718 3407 public static function show_pill_text( $text = null ) {
4719 3408 if ( null === $text ) {
4720 3409 $text = __( 'NEW', 'formidable' );
4721 3410 }
4722 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3411 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4723 3412 }
4724 3413
4725 3414 /**
4726 3415 * Count the number of decimals digits.
@@ -4727,10 +3416,9 @@
4727 3416 *
4728 3417 * @since 5.2.07
4729 3418 *
4730 3419 * @param mixed $num Number.
4731 - *
4732 - * @return false|int Returns `false` if the passed parameter is not number.
3420 + * @return int|false Returns `false` if the passed parameter is not number.
4733 3421 */
4734 3422 public static function count_decimals( $num ) {
4735 3423 if ( ! is_numeric( $num ) ) {
4736 3424 return false;
@@ -4737,9 +3425,8 @@
4737 3425 }
4738 3426
4739 3427 $num = (string) $num;
4740 3428 $parts = explode( '.', $num );
4741 -
4742 3429 if ( 1 === count( $parts ) ) {
4743 3430 return 0;
4744 3431 }
4745 3432
@@ -4746,339 +3433,213 @@
4746 3433 return strlen( $parts[ count( $parts ) - 1 ] );
4747 3434 }
4748 3435
4749 3436 /**
4750 - * Prevent a fatal error in PHP8 if gmt_offset happens to be set an empty string.
4751 - * This is a bug in WordPress. It isn't safe to call current_time( 'timestamp' ) without this with an empty string offset.
4752 - * In the future this might be safe to remove. Keep an eye on the current_time function in functions.php.
4753 - *
4754 - * @since 5.3.1
4755 - *
4756 - * @return void
3437 + * @since 4.08
3438 + * @deprecated 4.09.01
4757 3439 */
4758 - public static function filter_gmt_offset() {
4759 - if ( self::$added_gmt_offset_filter ) {
4760 - // Avoid adding twice.
4761 - return;
3440 + public static function expiring_message() {
3441 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3442 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3443 + FrmProAddonsController::expiring_message();
4762 3444 }
4763 -
4764 - add_filter(
4765 - 'option_gmt_offset',
4766 - function ( $offset ) {
4767 - if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4768 - // Leave a valid value alone.
4769 - return $offset;
4770 - }
4771 -
4772 - return 0;
4773 - }
4774 - );
4775 - self::$added_gmt_offset_filter = true;
4776 3445 }
4777 3446
4778 3447 /**
4779 - * @since 5.3.1
3448 + * Use the WP 4.7 wp_doing_ajax function
4780 3449 *
4781 - * @return bool
3450 + * @since 2.05.07
3451 + * @deprecated 4.04.04
4782 3452 */
4783 - public static function on_form_listing_page() {
4784 - if ( ! self::is_admin_page( 'formidable' ) ) {
4785 - return false;
4786 - }
3453 + public static function wp_doing_ajax() {
3454 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3455 + return wp_doing_ajax();
3456 + }
4787 3457
4788 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
4789 - return ! $action || in_array( $action, self::get_form_listing_page_actions(), true );
3458 + /**
3459 + * @deprecated 4.0
3460 + */
3461 + public static function insert_opt_html( $args ) {
3462 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3463 + FrmFormsHelper::insert_opt_html( $args );
4790 3464 }
4791 3465
4792 3466 /**
4793 - * Get all actions that also display the forms list.
3467 + * Used to filter shortcode in text widgets
4794 3468 *
4795 - * @since 5.3.1
4796 - *
4797 - * @return array<string>
3469 + * @deprecated 2.5.4
3470 + * @codeCoverageIgnore
4798 3471 */
4799 - private static function get_form_listing_page_actions() {
4800 - return array( 'list', 'trash', 'untrash', 'destroy' );
3472 + public static function widget_text_filter_callback( $matches ) {
3473 + return FrmDeprecated::widget_text_filter_callback( $matches );
4801 3474 }
4802 3475
4803 3476 /**
4804 - * Safely call get_plugins, importing the required files if they are not yet loaded.
4805 - *
4806 - * @since 5.5
4807 - *
4808 - * @return array
3477 + * @deprecated 3.01
3478 + * @codeCoverageIgnore
4809 3479 */
4810 - public static function get_plugins() {
4811 - if ( ! function_exists( 'get_plugins' ) ) {
4812 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
4813 - }
4814 - return get_plugins();
3480 + public static function sanitize_array( &$values ) {
3481 + FrmDeprecated::sanitize_array( $values );
4815 3482 }
4816 3483
4817 3484 /**
4818 - * Make sure that the file we're trying to load is in fact the expected file type, and that it's coming from our S3 bucket.
4819 - * This is to make sure that the URL can't be exploited for a SSRF attack.
3485 + * @param array $settings
3486 + * @param string $group
4820 3487 *
4821 - * @since 5.5.5
4822 - *
4823 - * @param string $url
4824 - * @param string $expected_extension
4825 - *
4826 - * @return bool
3488 + * @since 2.0.6
3489 + * @deprecated 2.05.06
3490 + * @codeCoverageIgnore
4827 3491 */
4828 - public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4829 - $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
3492 + public static function save_settings( $settings, $group ) {
3493 + return FrmDeprecated::save_settings( $settings, $group );
3494 + }
4830 3495
4831 - if ( ! $file_is_in_expected_s3_bucket ) {
4832 - return false;
4833 - }
4834 -
4835 - $parsed = parse_url( $url );
4836 -
4837 - if ( ! is_array( $parsed ) ) {
4838 - // URL is malformed.
4839 - return false;
4840 - }
4841 -
4842 - $path = $parsed['path'];
4843 - $ext = pathinfo( $path, PATHINFO_EXTENSION );
4844 -
4845 - if ( $expected_extension !== $ext ) {
4846 - // The URL isn't to an XML file.
4847 - return false;
4848 - }
4849 -
4850 - return true;
3496 + /**
3497 + * @since 2.0.4
3498 + * @deprecated 2.05.06
3499 + * @codeCoverageIgnore
3500 + */
3501 + public static function save_json_post( $settings ) {
3502 + return FrmDeprecated::save_json_post( $settings );
4851 3503 }
4852 3504
4853 3505 /**
4854 - * Display a dismissable warning message and save its dismissal state.
3506 + * @since 2.0
3507 + * @deprecated 2.05.06
3508 + * @codeCoverageIgnore
4855 3509 *
4856 - * @since 6.3
3510 + * @param string $cache_key The unique name for this cache
3511 + * @param string $group The name of the cache group
3512 + * @param string $query If blank, don't run a db call
3513 + * @param string $type The wpdb function to use with this query
4857 3514 *
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
3515 + * @return mixed $results The cache or query results
4862 3516 */
4863 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4864 - if ( ! $message || ! $option ) {
4865 - return;
4866 - }
3517 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3518 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3519 + }
4867 3520
4868 - $ajax_callback = function () use ( $option ) {
4869 - self::dismiss_warning_message( $option );
4870 - };
3521 + /**
3522 + * @deprecated 2.05.06
3523 + * @codeCoverageIgnore
3524 + */
3525 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3526 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
3527 + }
4871 3528
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 );
3529 + /**
3530 + * @deprecated 2.05.06
3531 + * @codeCoverageIgnore
3532 + */
3533 + public static function add_key_to_group_cache( $key, $group ) {
3534 + FrmDeprecated::add_key_to_group_cache( $key, $group );
3535 + }
4875 3536
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 - );
3537 + /**
3538 + * @deprecated 2.05.06
3539 + * @codeCoverageIgnore
3540 + */
3541 + public static function get_group_cached_keys( $group ) {
3542 + return FrmDeprecated::get_group_cached_keys( $group );
4897 3543 }
4898 3544
4899 3545 /**
4900 - * Dismiss a warning message and update the dismissal state.
4901 - *
4902 - * @since 6.3
4903 - *
4904 - * @param string $option The unique identifier for the dismissal state of the message.
4905 - *
4906 - * @return void
3546 + * @since 2.0
3547 + * @deprecated 2.05.06
3548 + * @codeCoverageIgnore
3549 + * @return mixed The cached value or false
4907 3550 */
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();
3551 + public static function check_cache_and_transient( $cache_key ) {
3552 + return FrmDeprecated::check_cache( $cache_key );
4917 3553 }
4918 3554
4919 3555 /**
4920 - * Lite license copy.
4921 - * Used in FrmDashboardController & FrmSettingsController
3556 + * @since 2.0
3557 + * @deprecated 2.05.06
3558 + * @codeCoverageIgnore
4922 3559 *
4923 - * @since 6.8
4924 - *
4925 - * @return string
3560 + * @param string $cache_key
4926 3561 */
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 );
3562 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3563 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
4931 3564 }
4932 3565
4933 3566 /**
4934 - * Removes scripts that are unnecessarily loaded across the pages!
3567 + * @since 2.0
3568 + * @deprecated 2.05.06
3569 + * @codeCoverageIgnore
4935 3570 *
4936 - * @since 6.9
4937 - *
4938 - * @return void
3571 + * @param string $group The name of the cache group
4939 3572 */
4940 - public static function dequeue_extra_global_scripts() {
4941 - wp_dequeue_script( 'frm-surveys-admin' );
4942 - wp_dequeue_script( 'frm-quizzes-form-action' );
3573 + public static function cache_delete_group( $group ) {
3574 + FrmDeprecated::cache_delete_group( $group );
4943 3575 }
4944 3576
4945 3577 /**
4946 - * Shows tooltip icon.
3578 + * @since 1.07.10
3579 + * @deprecated 2.05.06
3580 + * @codeCoverageIgnore
4947 3581 *
4948 - * @since 6.12
3582 + * @param string $term The value to escape
4949 3583 *
4950 - * @param string $tooltip_text Tooltip text.
4951 - * @param array $atts Tooltip wrapper HTML attributes.
4952 - *
4953 - * @return void
3584 + * @return string The escaped value
4954 3585 */
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
3586 + public static function esc_like( $term ) {
3587 + return FrmDeprecated::esc_like( $term );
4968 3588 }
4969 3589
4970 3590 /**
4971 - * Prints errors for settings in onboarding wizard or template settings.
3591 + * @param string $order_query
4972 3592 *
4973 - * @since 6.15
4974 - *
4975 - * @param array $args Args.
4976 - *
4977 - * @return void
3593 + * @deprecated 2.05.06
3594 + * @codeCoverageIgnore
4978 3595 */
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
3596 + public static function esc_order( $order_query ) {
3597 + return FrmDeprecated::esc_order( $order_query );
5005 3598 }
5006 3599
5007 3600 /**
5008 - * Check if GDPR is enabled.
5009 - *
5010 - * @since 6.19
5011 - *
5012 - * @return bool
3601 + * @deprecated 2.05.06
3602 + * @codeCoverageIgnore
5013 3603 */
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;
3604 + public static function esc_order_by( &$order_by ) {
3605 + FrmDeprecated::esc_order_by( $order_by );
5017 3606 }
5018 3607
5019 3608 /**
5020 - * Check if GDPR cookies are disabled.
3609 + * @param string $limit
5021 3610 *
5022 - * @since 6.19
5023 - *
5024 - * @return bool
3611 + * @deprecated 2.05.06
3612 + * @codeCoverageIgnore
5025 3613 */
5026 - public static function no_gdpr_cookies() {
5027 - $frm_settings = self::get_settings();
5028 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
3614 + public static function esc_limit( $limit ) {
3615 + return FrmDeprecated::esc_limit( $limit );
5029 3616 }
5030 3617
5031 3618 /**
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
3619 + * @since 2.0
3620 + * @deprecated 2.05.06
3621 + * @codeCoverageIgnore
5039 3622 */
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;
3623 + public static function prepare_array_values( $array, $type = '%s' ) {
3624 + return FrmDeprecated::prepare_array_values( $array, $type );
5051 3625 }
5052 3626
5053 3627 /**
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.
3628 + * @deprecated 2.05.06
3629 + * @codeCoverageIgnore
5063 3630 */
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 ) );
3631 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3632 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
5072 3633 }
5073 3634
5074 3635 /**
5075 - * @since 5.0.16
5076 - * @deprecated 6.26
3636 + * @since 2.0
3637 + * @deprecated 5.0.13
5077 3638 *
5078 - * @return bool
3639 + * @return string The base Google APIS url for the current version of jQuery UI
5079 3640 */
5080 - public static function show_landing_pages() {
5081 - _deprecated_function( __METHOD__, '6.26' );
5082 - return true;
3641 + public static function jquery_ui_base_url() {
3642 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3643 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
5083 3644 }
5084 3645 }