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