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