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