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