PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 4.07.01
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v4.07.01
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 +559 -2798 6.26.14.07.01 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 = 97; //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.1';
14 + public static $plug_version = '4.07.01';
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,79 @@
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 + $content = $args['content'];
93 + if ( isset( $args['anchor'] ) ) {
94 + $anchor = '#' . $args['anchor'];
95 + }
135 96 } else {
136 - $args = array( 'campaign' => $args );
97 + $medium = $args;
137 98 }
138 99
139 100 $query_args = array(
140 - 'utm_source' => 'plugin',
141 - 'utm_medium' => self::get_utm_medium(),
101 + 'utm_source' => 'WordPress',
102 + 'utm_medium' => $medium,
103 + 'utm_campaign' => 'liteplugin',
142 104 );
143 - $query_args = self::maybe_add_utm_license( $query_args );
144 105
145 - if ( isset( $args['campaign'] ) ) {
146 - $query_args['utm_campaign'] = $args['campaign'];
106 + if ( isset( $content ) ) {
107 + $query_args['utm_content'] = $content;
147 108 }
148 109
149 - if ( isset( $args['content'] ) ) {
150 - $query_args['utm_content'] = $args['content'];
151 - }
152 -
153 - if ( isset( $args['param'] ) ) {
110 + if ( is_array( $args ) && isset( $args['param'] ) ) {
154 111 $query_args['f'] = $args['param'];
155 112 }
156 113
157 - if ( ! empty( $args['plan'] ) ) {
158 - $query_args['plan'] = $args['plan'];
159 - }
160 -
161 - $link = add_query_arg( $query_args, $page );
162 -
163 - if ( isset( $args['anchor'] ) ) {
164 - $link .= '#' . $args['anchor'];
165 - }
166 -
114 + $link = add_query_arg( $query_args, $page ) . $anchor;
167 115 return self::make_affiliate_url( $link );
168 116 }
169 117
170 118 /**
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
119 + * @since 4.07
179 120 */
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 );
121 + public static function renewal_message() {
122 + if ( ! FrmAddonsController::is_license_expired() ) {
123 + return;
185 124 }
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;
125 + ?>
126 + <div class="frm_error_style" style="text-align:left">
127 + <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
128 + &nbsp;
129 + <?php esc_attr_e( 'Your account has expired', 'formidable' ); ?>
130 + <div style="float:right">
131 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-renew', 'account/downloads/' ) ); ?>">
132 + Renew Now
133 + </a>
134 + </div>
135 + </div>
136 + <?php
192 137 }
193 138
194 139 /**
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 140 * Get the Formidable settings
281 141 *
282 142 * @since 2.0
283 143 *
284 144 * @param array $args - May include the form id when values need translation.
285 - *
286 - * @return FrmSettings $frm_settings
145 + * @return FrmSettings $frm_setings
287 146 */
288 147 public static function get_settings( $args = array() ) {
289 148 global $frm_settings;
290 -
291 149 if ( empty( $frm_settings ) ) {
292 150 $frm_settings = new FrmSettings( $args );
293 151 } elseif ( isset( $args['current_form'] ) ) {
294 152 // If the global has already been set, allow strings to be filtered.
@@ -297,40 +155,16 @@
297 155
298 156 return $frm_settings;
299 157 }
300 158
301 - /**
302 - * @return string
303 - */
304 159 public static function get_menu_name() {
305 160 $frm_settings = self::get_settings();
306 161
307 - return FrmAddonsController::is_license_expired() || ! self::pro_is_installed() ? 'Formidable' : $frm_settings->menu;
162 + return $frm_settings->menu;
308 163 }
309 164
310 165 /**
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 166 * @since 3.05
329 - *
330 - * @param array $atts
331 - *
332 - * @return string
333 167 */
334 168 public static function svg_logo( $atts = array() ) {
335 169 $defaults = array(
336 170 'height' => 18,
@@ -347,21 +181,15 @@
347 181 }
348 182
349 183 /**
350 184 * @since 4.0
351 - *
352 - * @param array $atts
353 - *
354 - * @return void
355 185 */
356 186 public static function show_logo( $atts = array() ) {
357 - echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
187 + echo self::kses( self::svg_logo( $atts ), 'all' ); // WPCS: XSS ok.
358 188 }
359 189
360 190 /**
361 191 * @since 4.03.02
362 - *
363 - * @return void
364 192 */
365 193 public static function show_header_logo() {
366 194 $icon = self::svg_logo(
367 195 array(
@@ -370,9 +198,8 @@
370 198 )
371 199 );
372 200
373 201 $new_icon = apply_filters( 'frm_icon', $icon, true );
374 -
375 202 if ( $new_icon !== $icon ) {
376 203 if ( strpos( $new_icon, '<svg' ) === 0 ) {
377 204 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
378 205 } else {
@@ -379,43 +206,26 @@
379 206 // Show nothing if it isn't an SVG.
380 207 $icon = '<div style="height:39px"></div>';
381 208 }
382 209 }
383 - echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
210 + echo self::kses( $icon, 'all' ); // WPCS: XSS ok.
384 211 }
385 212
386 213 /**
387 214 * @since 2.02.04
388 - *
389 - * @return bool
390 215 */
391 216 public static function ips_saved() {
392 217 $frm_settings = self::get_settings();
218 +
393 219 return ! $frm_settings->no_ips;
394 220 }
395 221
396 - /**
397 - * @return bool
398 - */
399 222 public static function pro_is_installed() {
400 - return (bool) apply_filters( 'frm_pro_installed', false );
223 + return apply_filters( 'frm_pro_installed', false );
401 224 }
402 225
403 226 /**
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 227 * @since 4.06.02
416 - *
417 - * @return bool
418 228 */
419 229 public static function pro_is_connected() {
420 230 global $frm_vars;
421 231 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -422,31 +232,17 @@
422 232 }
423 233
424 234 /**
425 235 * @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 236 */
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 );
237 + public static function is_form_builder_page() {
238 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
239 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
440 240 }
441 241
442 - /**
443 - * @return bool
444 - */
445 242 public static function is_formidable_admin() {
446 243 $page = self::simple_get( 'page', 'sanitize_title' );
447 244 $is_formidable = strpos( $page, 'formidable' ) !== false;
448 -
449 245 if ( empty( $page ) ) {
450 246 $is_formidable = self::is_view_builder_page();
451 247 }
452 248
@@ -453,69 +249,28 @@
453 249 return $is_formidable;
454 250 }
455 251
456 252 /**
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 253 * Check for certain page in Formidable settings
497 254 *
498 255 * @since 2.0
499 256 *
500 - * @param string $page The name of the page to check.
257 + * @param string $page The name of the page to check
501 258 *
502 - * @return bool
259 + * @return boolean
503 260 */
504 261 public static function is_admin_page( $page = 'formidable' ) {
505 262 global $pagenow;
506 263 $get_page = self::simple_get( 'page', 'sanitize_title' );
507 -
508 264 if ( $pagenow ) {
509 265 // 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 -
266 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
512 267 if ( $is_page ) {
513 268 return true;
514 269 }
515 270 }
516 271
517 - return is_admin() && $get_page === $page;
272 + return is_admin() && $get_page == $page;
518 273 }
519 274
520 275 /**
521 276 * If the current page is for editing or creating a view.
@@ -521,10 +276,8 @@
521 276 * If the current page is for editing or creating a view.
522 277 * Returns false for the views listing page.
523 278 *
524 279 * @since 4.0
525 - *
526 - * @return bool
527 280 */
528 281 public static function is_view_builder_page() {
529 282 global $pagenow;
530 283
@@ -534,10 +287,10 @@
534 287
535 288 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
536 289
537 290 if ( empty( $post_type ) ) {
538 - $post_id = self::simple_get( 'post', 'absint' );
539 - $post = get_post( $post_id );
291 + $post_id = self::simple_get( 'post', 'absint' );
292 + $post = get_post( $post_id );
540 293 $post_type = $post ? $post->post_type : '';
541 294 }
542 295
543 296 return $post_type === 'frm_display';
@@ -547,15 +300,17 @@
547 300 * Check for the form preview page
548 301 *
549 302 * @since 2.0
550 303 *
551 - * @return bool
304 + * @param None
305 + *
306 + * @return boolean
552 307 */
553 308 public static function is_preview_page() {
554 309 global $pagenow;
555 310 $action = self::simple_get( 'action', 'sanitize_title' );
556 311
557 - return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
312 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
558 313 }
559 314
560 315 /**
561 316 * Check for ajax except the form preview page
@@ -561,17 +316,16 @@
561 316 * Check for ajax except the form preview page
562 317 *
563 318 * @since 2.0
564 319 *
565 - * @return bool
320 + * @param None
321 + *
322 + * @return boolean
566 323 */
567 324 public static function doing_ajax() {
568 325 return wp_doing_ajax() && ! self::is_preview_page();
569 326 }
570 327
571 - /**
572 - * @return string
573 - */
574 328 public static function js_suffix() {
575 329 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
576 330 }
577 331
@@ -576,14 +330,13 @@
576 330 }
577 331
578 332 /**
579 333 * @since 2.0.8
580 - *
581 - * @return bool
582 334 */
583 335 public static function prevent_caching() {
584 336 global $frm_vars;
585 - return ! empty( $frm_vars['prevent_caching'] );
337 +
338 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
586 339 }
587 340
588 341 /**
589 342 * Check if on an admin page
@@ -589,19 +342,14 @@
589 342 * Check if on an admin page
590 343 *
591 344 * @since 2.0
592 345 *
593 - * @return bool
346 + * @param None
347 + *
348 + * @return boolean
594 349 */
595 350 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 );
351 + return is_admin() && ! wp_doing_ajax();
604 352 }
605 353
606 354 /**
607 355 * Check if value contains blank value or empty array
@@ -607,23 +355,17 @@
607 355 * Check if value contains blank value or empty array
608 356 *
609 357 * @since 2.0
610 358 *
611 - * @param mixed $value Value to check.
612 - * @param string $empty
359 + * @param mixed $value - value to check
360 + * @param string
613 361 *
614 - * @return bool
362 + * @return boolean
615 363 */
616 364 public static function is_empty_value( $value, $empty = '' ) {
617 365 return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
618 366 }
619 367
620 - /**
621 - * @param mixed $value
622 - * @param string $empty
623 - *
624 - * @return bool
625 - */
626 368 public static function is_not_empty_value( $value, $empty = '' ) {
627 369 return ! self::is_empty_value( $value, $empty );
628 370 }
629 371
@@ -640,37 +382,26 @@
640 382 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
641 383 }
642 384
643 385 /**
644 - * Get the server OS
386 + * Check for the IP address in several places
387 + * Used by [ip] shortcode
645 388 *
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 389 * @return string The IP address of the current user
668 390 */
669 391 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 -
392 + $ip_options = array(
393 + 'HTTP_CLIENT_IP',
394 + 'HTTP_CF_CONNECTING_IP',
395 + 'HTTP_X_FORWARDED_FOR',
396 + 'HTTP_X_FORWARDED',
397 + 'HTTP_X_CLUSTER_CLIENT_IP',
398 + 'HTTP_X_REAL_IP',
399 + 'HTTP_FORWARDED_FOR',
400 + 'HTTP_FORWARDED',
401 + 'REMOTE_ADDR',
402 + );
403 + $ip = '';
673 404 foreach ( $ip_options as $key ) {
674 405 if ( ! isset( $_SERVER[ $key ] ) ) {
675 406 continue;
676 407 }
@@ -675,12 +406,10 @@
675 406 continue;
676 407 }
677 408
678 409 $key = self::get_server_value( $key );
679 -
680 410 foreach ( explode( ',', $key ) as $ip ) {
681 - // Just to be safe.
682 - $ip = trim( $ip );
411 + $ip = trim( $ip ); // just to be safe.
683 412
684 413 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
685 414 return sanitize_text_field( $ip );
686 415 }
@@ -689,60 +418,8 @@
689 418
690 419 return sanitize_text_field( $ip );
691 420 }
692 421
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 422 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
746 423 if ( strpos( $param, '[' ) ) {
747 424 $params = explode( '[', $param );
748 425 $param = $params[0];
@@ -747,12 +424,12 @@
747 424 $params = explode( '[', $param );
748 425 $param = $params[0];
749 426 }
750 427
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
428 + if ( $src == 'get' ) {
429 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
430 + $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
431 + if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) {
755 432 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
756 433 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
757 434 }
758 435 self::sanitize_value( $sanitize, $value );
@@ -773,9 +450,9 @@
773 450 continue;
774 451 }
775 452
776 453 $p = trim( $p, ']' );
777 - $value = $value[ $p ] ?? $default;
454 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
778 455 }
779 456 }
780 457
781 458 return $value;
@@ -780,25 +457,15 @@
780 457
781 458 return $value;
782 459 }
783 460
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 461 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
795 462 return self::get_simple_request(
796 463 array(
797 - 'type' => 'post',
798 - 'param' => $param,
799 - 'default' => $default,
800 - 'sanitize' => $sanitize,
464 + 'type' => 'post',
465 + 'param' => $param,
466 + 'default' => $default,
467 + 'sanitize' => $sanitize,
801 468 'serialized' => $serialized,
802 469 )
803 470 );
804 471 }
@@ -809,9 +476,9 @@
809 476 * @param string $param
810 477 * @param string $sanitize
811 478 * @param string $default
812 479 *
813 - * @return array|string
480 + * @return string|array
814 481 */
815 482 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
816 483 return self::get_simple_request(
817 484 array(
@@ -829,40 +496,39 @@
829 496 * @since 2.0.6
830 497 *
831 498 * @param array $args
832 499 *
833 - * @return array|string
500 + * @return string|array
834 501 */
835 502 public static function get_simple_request( $args ) {
836 503 $defaults = array(
837 - 'param' => '',
838 - 'default' => '',
839 - 'type' => 'get',
840 - 'sanitize' => 'sanitize_text_field',
504 + 'param' => '',
505 + 'default' => '',
506 + 'type' => 'get',
507 + 'sanitize' => 'sanitize_text_field',
841 508 'serialized' => false,
842 509 );
843 510 $args = wp_parse_args( $args, $defaults );
844 511
845 512 $value = $args['default'];
846 -
847 - if ( $args['type'] === 'get' ) {
513 + if ( $args['type'] == 'get' ) {
848 514 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
849 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
515 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
850 516 $value = wp_unslash( $_GET[ $args['param'] ] );
851 517 }
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
518 + } elseif ( $args['type'] == 'post' ) {
519 + if ( isset( $_POST[ $args['param'] ] ) ) {
520 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
855 521 $value = wp_unslash( $_POST[ $args['param'] ] );
856 -
857 522 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
858 523 self::unserialize_or_decode( $value );
859 524 }
860 525 }
861 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
862 - // phpcs:ignore WordPress.Security.NonceVerification.Missing
526 + } else {
527 + if ( isset( $_REQUEST[ $args['param'] ] ) ) {
863 528 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
864 529 $value = wp_unslash( $_REQUEST[ $args['param'] ] );
530 + }
865 531 }
866 532
867 533 self::sanitize_value( $args['sanitize'], $value );
868 534
@@ -886,48 +552,23 @@
886 552
887 553 return $value;
888 554 }
889 555
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 556 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 ] );
557 + if ( ! empty( $sanitize ) ) {
558 + if ( is_array( $value ) ) {
559 + $temp_values = $value;
560 + foreach ( $temp_values as $k => $v ) {
561 + self::sanitize_value( $sanitize, $value[ $k ] );
562 + }
563 + } else {
564 + $value = call_user_func( $sanitize, $value );
914 565 }
915 - return;
916 566 }
917 -
918 - $value = call_user_func( $sanitize, $value );
919 567 }
920 568
921 - /**
922 - * @param array $sanitize_method
923 - * @param array $values
924 - *
925 - * @return void
926 - */
927 569 public static function sanitize_request( $sanitize_method, &$values ) {
928 570 $temp_values = $values;
929 -
930 571 foreach ( $temp_values as $k => $val ) {
931 572 if ( isset( $sanitize_method[ $k ] ) ) {
932 573 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
933 574 }
@@ -935,64 +576,23 @@
935 576 }
936 577
937 578 /**
938 579 * @since 4.0.04
939 - *
940 - * @param mixed $value
941 - *
942 - * @return void
943 580 */
944 581 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 - }
582 + self::sanitize_value( 'wp_kses_post', $value );
951 583 self::decode_specialchars( $value );
952 584 }
953 585
954 586 /**
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 587 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
985 588 * this MUST be done, else we'll be back to the '& entity' problem.
986 589 *
987 590 * @since 4.0.04
988 - *
989 - * @param mixed $value Value to decode, passed by reference.
990 591 */
991 592 public static function decode_specialchars( &$value ) {
992 593 if ( is_array( $value ) ) {
993 594 $temp_values = $value;
994 -
995 595 foreach ( $temp_values as $k => $v ) {
996 596 self::decode_specialchars( $value[ $k ] );
997 597 }
998 598 } else {
@@ -1006,9 +606,9 @@
1006 606 * Adapted from wp_specialchars_decode().
1007 607 *
1008 608 * @since 4.03.01
1009 609 *
1010 - * @param string $string The string to prep, passed by reference.
610 + * @param string $string The string to prep.
1011 611 */
1012 612 private static function decode_amp( &$string ) {
1013 613 // Don't bother if there are no entities - saves a lot of processing
1014 614 if ( empty( $string ) || strpos( $string, '&' ) === false ) {
@@ -1018,12 +618,10 @@
1018 618 $translation = array(
1019 619 '&quot;' => '"',
1020 620 '&#034;' => '"',
1021 621 '&#x22;' => '"',
1022 - // The space preserves the HTML.
1023 - '&lt; ' => '< ',
1024 - // The space preserves the HTML.
1025 - '&#060; ' => '< ',
622 + '&lt; ' => '< ', // The space preserves the HTML.
623 + '&#060; ' => '< ', // The space preserves the HTML.
1026 624 '&gt;' => '>',
1027 625 '&#062;' => '>',
1028 626 '&amp;' => '&',
1029 627 '&#038;' => '&',
@@ -1050,10 +648,10 @@
1050 648 * Sanitize the value, and allow some HTML
1051 649 *
1052 650 * @since 2.0
1053 651 *
1054 - * @param string $value The value to sanitize.
1055 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
652 + * @param string $value
653 + * @param array|string $allowed 'all' for everything included as defaults
1056 654 *
1057 655 * @return string
1058 656 */
1059 657 public static function kses( $value, $allowed = array() ) {
@@ -1062,109 +660,18 @@
1062 660 return wp_kses( $value, $allowed_html );
1063 661 }
1064 662
1065 663 /**
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 664 * @since 2.05.03
1153 - *
1154 - * @param array|string $allowed
1155 - *
1156 - * @return array
1157 665 */
1158 666 private static function allowed_html( $allowed ) {
1159 667 $html = self::safe_html();
1160 668 $allowed_html = array();
1161 -
1162 - if ( $allowed === 'all' ) {
669 + if ( $allowed == 'all' ) {
1163 670 $allowed_html = $html;
1164 671 } elseif ( ! empty( $allowed ) ) {
1165 672 foreach ( (array) $allowed as $a ) {
1166 - $allowed_html[ $a ] = $html[ $a ] ?? array();
673 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1167 674 }
1168 675 }
1169 676
1170 677 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1180,15 +687,14 @@
1180 687 );
1181 688
1182 689 return array(
1183 690 'a' => array(
1184 - 'class' => true,
1185 - 'href' => true,
1186 - 'id' => true,
1187 - 'rel' => true,
1188 - 'target' => true,
1189 - 'title' => true,
1190 - 'tabindex' => true,
691 + 'class' => true,
692 + 'href' => true,
693 + 'id' => true,
694 + 'rel' => true,
695 + 'target' => true,
696 + 'title' => true,
1191 697 ),
1192 698 'abbr' => array(
1193 699 'title' => true,
1194 700 ),
@@ -1212,9 +718,8 @@
1212 718 'class' => true,
1213 719 'id' => true,
1214 720 'title' => true,
1215 721 'style' => true,
1216 - 'role' => true,
1217 722 ),
1218 723 'dl' => array(),
1219 724 'dt' => array(),
1220 725 'em' => array(),
@@ -1250,26 +755,25 @@
1250 755 'cite' => true,
1251 756 'title' => true,
1252 757 ),
1253 758 '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,
759 + 'class' => true,
760 + 'fill' => true,
761 + 'height' => true,
762 + 'width' => true,
763 + 'x' => true,
764 + 'y' => true,
765 + 'rx' => true,
766 + 'stroke' => true,
1262 767 'stroke-opacity' => true,
1263 768 'stroke-width' => true,
1264 769 ),
1265 770 'section' => $allow_class,
1266 771 'span' => array(
1267 - 'class' => true,
1268 - 'id' => true,
1269 - 'title' => true,
1270 - 'style' => true,
1271 - 'aria-hidden' => true,
772 + 'class' => true,
773 + 'id' => true,
774 + 'title' => true,
775 + 'style' => true,
1272 776 ),
1273 777 'strike' => array(),
1274 778 'strong' => array(),
1275 779 'symbol' => array(
@@ -1277,41 +781,22 @@
1277 781 'id' => true,
1278 782 'viewbox' => true,
1279 783 ),
1280 784 '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,
785 + 'class' => true,
786 + 'id' => true,
787 + 'xmlns' => true,
788 + 'viewbox' => true,
789 + 'width' => true,
790 + 'height' => true,
791 + 'style' => true,
792 + 'fill' => true,
1291 793 ),
1292 794 'use' => array(
1293 - 'href' => true,
795 + 'href' => true,
1294 796 'xlink:href' => true,
1295 797 ),
1296 798 '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 799 );
1315 800 }
1316 801
1317 802 /**
@@ -1319,20 +804,18 @@
1319 804 *
1320 805 * @since 2.0
1321 806 */
1322 807 public static function remove_get_action() {
1323 - if ( empty( $_GET ) ) {
808 + if ( ! isset( $_GET ) ) {
1324 809 return;
1325 810 }
1326 811
1327 812 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1328 -
1329 813 if ( empty( $action_name ) ) {
1330 814 return;
1331 815 }
1332 816
1333 817 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1334 -
1335 818 if ( ! empty( $new_action ) ) {
1336 819 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1337 820 }
1338 821 }
@@ -1340,13 +823,9 @@
1340 823 /**
1341 824 * Check the WP query for a parameter
1342 825 *
1343 826 * @since 2.0
1344 - *
1345 - * @param array|string $value
1346 - * @param string $param
1347 - *
1348 - * @return array|string
827 + * @return string|array
1349 828 */
1350 829 public static function get_query_var( $value, $param ) {
1351 830 if ( $value != '' ) {
1352 831 return $value;
@@ -1352,9 +831,8 @@
1352 831 return $value;
1353 832 }
1354 833
1355 834 global $wp_query;
1356 -
1357 835 if ( isset( $wp_query->query_vars[ $param ] ) ) {
1358 836 $value = $wp_query->query_vars[ $param ];
1359 837 }
1360 838
@@ -1364,17 +842,13 @@
1364 842 /**
1365 843 * Try to show the SVG if possible. Otherwise, use the font icon.
1366 844 *
1367 845 * @since 4.0.02
1368 - *
1369 846 * @param string $class
1370 847 * @param array $atts
1371 - *
1372 - * @return string|null
1373 848 */
1374 849 public static function icon_by_class( $class, $atts = array() ) {
1375 850 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1376 -
1377 851 if ( isset( $atts['echo'] ) ) {
1378 852 unset( $atts['echo'] );
1379 853 }
1380 854
@@ -1380,36 +854,23 @@
1380 854
1381 855 $html_atts = self::array_to_html_params( $atts );
1382 856
1383 857 $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 858 if ( $icon === $class ) {
1398 859 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1399 860 } else {
1400 861 $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1401 -
1402 862 if ( strpos( $icon, ' ' ) ) {
1403 863 $icon = explode( ' ', $icon );
1404 864 $icon = reset( $icon );
1405 865 }
1406 -
1407 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
866 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
867 + <use xlink:href="#' . esc_attr( $icon ) . '" />
868 + </svg>';
1408 869 }
1409 870
1410 871 if ( $echo ) {
1411 - echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
872 + echo $icon; // WPCS: XSS ok.
1412 873 } else {
1413 874 return $icon;
1414 875 }
1415 876 }
@@ -1414,102 +875,14 @@
1414 875 }
1415 876 }
1416 877
1417 878 /**
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 879 * Include svg images.
1499 880 *
1500 881 * @since 4.0.02
1501 - *
1502 - * @return void
1503 882 */
1504 883 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;
884 + include_once( self::plugin_path() . '/images/icons.svg' );
1512 885 }
1513 886
1514 887 /**
1515 888 * Convert an associative array to HTML values.
@@ -1514,197 +887,54 @@
1514 887 /**
1515 888 * Convert an associative array to HTML values.
1516 889 *
1517 890 * @since 4.0.02
1518 - * @since 5.0.13 added $echo parameter.
1519 - *
1520 891 * @param array $atts
1521 - * @param bool $echo
1522 - *
1523 - * @return string|void
892 + * @return string
1524 893 */
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 - }
894 + public static function array_to_html_params( $atts ) {
895 + $html = '';
896 + if ( ! empty( $atts ) ) {
897 + foreach ( $atts as $key => $value ) {
898 + $html .= ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1531 899 }
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 900 }
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 - }
901 + return $html;
1560 902 }
1561 903
1562 904 /**
1563 905 * @since 3.0
1564 - *
1565 - * @param array $atts
1566 - *
1567 - * @return void
1568 906 */
1569 907 public static function get_admin_header( $atts ) {
1570 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1571 -
1572 - if ( empty( $atts['close'] ) ) {
908 + $has_nav = ( isset( $atts['form'] ) && ! empty( $atts['form'] ) && ( ! isset( $atts['is_template'] ) || ! $atts['is_template'] ) );
909 + if ( ! isset( $atts['close'] ) || empty( $atts['close'] ) ) {
1573 910 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1574 911 }
1575 -
1576 912 if ( ! isset( $atts['import_link'] ) ) {
1577 913 $atts['import_link'] = false;
1578 914 }
1579 915
1580 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
916 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1581 917 }
1582 918
1583 919 /**
1584 - * @since 6.0
1585 - *
1586 - * @param string $type
1587 - *
1588 - * @return void
1589 - */
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">
1621 - <?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 - );
1647 - ?>
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 920 * @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 921 */
1678 922 public static function add_new_item_link( $atts ) {
1679 - if ( isset( $atts['link_hook'] ) ) {
923 + if ( isset( $atts['new_link'] ) && ! empty( $atts['new_link'] ) ) {
924 + ?>
925 + <a href="<?php echo esc_url( $atts['new_link'] ); ?>" class="button button-primary frm-button-primary frm-with-plus">
926 + <?php self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' ); ?>
927 + <?php esc_html_e( 'Add New', 'formidable' ); ?>
928 + </a>
929 + <?php
930 + } elseif ( isset( $atts['link_hook'] ) ) {
1680 931 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1681 - return;
1682 932 }
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 933 }
1700 934
1701 935 /**
1702 936 * @since 3.06
1703 - *
1704 - * @param array $atts
1705 - *
1706 - * @return void
1707 937 */
1708 938 public static function show_search_box( $atts ) {
1709 939 $defaults = array(
1710 940 'placeholder' => '',
@@ -1710,12 +940,10 @@
1710 940 'placeholder' => '',
1711 941 'tosearch' => '',
1712 942 'text' => __( 'Search', 'formidable' ),
1713 943 'input_id' => '',
1714 - 'value' => false,
1715 - 'class' => '',
1716 944 );
1717 - $atts = array_merge( $defaults, $atts );
945 + $atts = array_merge( $defaults, $atts );
1718 946
1719 947 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1720 948 $atts['tosearch'] = 'frm-card';
1721 949 }
@@ -1720,9 +948,8 @@
1720 948 $atts['tosearch'] = 'frm-card';
1721 949 }
1722 950
1723 951 $class = 'frm-search-input';
1724 -
1725 952 if ( ! empty( $atts['tosearch'] ) ) {
1726 953 $class .= ' frm-auto-search';
1727 954 }
1728 955
@@ -1727,34 +954,21 @@
1727 954 }
1728 955
1729 956 $input_id = $atts['input_id'] . '-search-input';
1730 957
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 958 ?>
1751 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
959 + <p class="frm-search">
1752 960 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1753 961 <?php echo esc_html( $atts['text'] ); ?>:
1754 962 </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 ); ?> />
963 + <span class="frmfont frm_search_icon"></span>
964 + <input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s"
965 + value="<?php _admin_search_query(); ?>" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>"
966 + class="<?php echo esc_attr( $class ); ?>" data-tosearch="<?php echo esc_attr( $atts['tosearch'] ); ?>"
967 + <?php if ( ! empty( $atts['tosearch'] ) ) { ?>
968 + autocomplete="off"
969 + <?php } ?>
970 + />
1757 971 <?php
1758 972 if ( empty( $atts['tosearch'] ) ) {
1759 973 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1760 974 }
@@ -1763,17 +977,13 @@
1763 977 <?php
1764 978 }
1765 979
1766 980 /**
1767 - * @param string $type Hook type slug.
1768 - * @param object|null $object Optional related object.
1769 - *
1770 - * @return void
981 + * @param string $type
1771 982 */
1772 983 public static function trigger_hook_load( $type, $object = null ) {
1773 984 // Only load the form hooks once.
1774 985 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1775 -
1776 986 if ( ! $hooks_loaded ) {
1777 987 do_action( 'frm_load_' . $type . '_hooks' );
1778 988 }
1779 989 }
@@ -1778,14 +988,11 @@
1778 988 }
1779 989 }
1780 990
1781 991 /**
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.
992 + * Save all front-end js scripts into a single file
1784 993 *
1785 994 * @since 3.0
1786 - *
1787 - * @return void
1788 995 */
1789 996 public static function save_combined_js() {
1790 997 $file_atts = apply_filters(
1791 998 'frm_js_location',
@@ -1796,36 +1003,13 @@
1796 1003 );
1797 1004 $new_file = new FrmCreateFile( $file_atts );
1798 1005
1799 1006 $files = array(
1007 + self::plugin_path() . '/js/jquery/jquery.placeholder.min.js',
1800 1008 self::plugin_path() . '/js/formidable.min.js',
1801 1009 );
1802 - /**
1803 - * @param array $files
1804 - */
1805 1010 $files = apply_filters( 'frm_combined_js_files', $files );
1806 1011 $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 1012 }
1829 1013
1830 1014 /**
1831 1015 * Check a value from a shortcode to see if true or false.
@@ -1832,29 +1016,19 @@
1832 1016 * True when value is 1, true, 'true', 'yes'
1833 1017 *
1834 1018 * @since 1.07.10
1835 1019 *
1836 - * @param string $value The value to compare.
1020 + * @param string $value The value to compare
1837 1021 *
1838 - * @return bool
1022 + * @return boolean True or False
1839 1023 */
1840 1024 public static function is_true( $value ) {
1841 - return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1025 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1842 1026 }
1843 1027
1844 - /**
1845 - * 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 - *
1848 - * @since 4.10.01 Add `$post_type` argument.
1849 - *
1850 - * @param string $post_type Post type to query. Default is `page`.
1851 - *
1852 - * @return WP_Post[]
1853 - */
1854 - public static function get_pages( $post_type = 'page' ) {
1028 + public static function get_pages() {
1855 1029 $query = array(
1856 - 'post_type' => $post_type,
1030 + 'post_type' => 'page',
1857 1031 'post_status' => array( 'publish', 'private' ),
1858 1032 'numberposts' => - 1,
1859 1033 'orderby' => 'title',
1860 1034 'order' => 'ASC',
@@ -1863,45 +1037,19 @@
1863 1037 return get_posts( $query );
1864 1038 }
1865 1039
1866 1040 /**
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 1041 * Renders an autocomplete page selection or a regular dropdown depending on
1891 1042 * the total page count
1892 1043 *
1893 1044 * @since 4.03.06
1894 - * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
1895 - *
1896 - * @param array $args Selection arguments.
1897 1045 */
1898 1046 public static function maybe_autocomplete_pages_options( $args ) {
1899 1047 $args = self::preformat_selection_args( $args );
1900 1048
1901 - $pages_count = wp_count_posts( $args['post_type'] );
1049 + $pages_count = wp_count_posts( 'page' );
1902 1050
1903 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1051 + if ( $pages_count->publish <= 50 ) {
1904 1052 self::wp_pages_dropdown( $args );
1905 1053 return;
1906 1054 }
1907 1055
@@ -1907,9 +1055,9 @@
1907 1055
1908 1056 wp_enqueue_script( 'jquery-ui-autocomplete' );
1909 1057
1910 1058 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1911 - $title = '';
1059 + $title = '';
1912 1060
1913 1061 if ( $selected ) {
1914 1062 $title = get_the_title( $selected );
1915 1063 }
@@ -1915,126 +1063,26 @@
1915 1063 }
1916 1064
1917 1065 ?>
1918 1066 <input type="text" class="frm-page-search"
1919 - data-post-type="<?php echo esc_attr( $args['post_type'] ); ?>"
1920 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1067 + placeholder="<?php esc_html_e( 'Select a Page', 'formidable' ); ?>"
1921 1068 value="<?php echo esc_attr( $title ); ?>" />
1922 1069 <input type="hidden" name="<?php echo esc_attr( $args['field_name'] ); ?>"
1923 - class="frm_autocomplete_value_input"
1924 1070 value="<?php echo esc_attr( $selected ); ?>" />
1925 1071 <?php
1926 1072 }
1927 1073
1928 1074 /**
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.
1075 + * @param array $args
1076 + * @param string $page_id Deprecated.
1077 + * @param boolean $truncate Deprecated.
1934 1078 */
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 1079 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2033 1080 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2034 1081
2035 - $pages = self::get_post_ids_and_titles( $args['post_type'] );
1082 + $pages = self::get_pages();
2036 1083 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1084 +
2037 1085 ?>
2038 1086 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2039 1087 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2040 1088 <?php foreach ( $pages as $page ) { ?>
@@ -2050,14 +1098,8 @@
2050 1098 * Fill in missing parameters passed to wp_pages_dropdown().
2051 1099 * This is for reverse compatibility with switching 3 params to 1.
2052 1100 *
2053 1101 * @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 1102 */
2061 1103 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2062 1104 if ( ! is_array( $args ) ) {
2063 1105 $args = array(
@@ -2073,37 +1115,25 @@
2073 1115 /**
2074 1116 * Filter to format args for page dropdown or autocomplete
2075 1117 *
2076 1118 * @since 4.03.06
2077 - * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2078 - *
2079 - * @param array $args
2080 - *
2081 - * @return array
2082 1119 */
2083 1120 private static function preformat_selection_args( $args ) {
2084 1121 $defaults = array(
2085 - 'truncate' => false,
2086 - 'placeholder' => ' ',
2087 - 'field_name' => '',
2088 - 'page_id' => '',
2089 - 'post_type' => 'page',
2090 - 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
1122 + 'truncate' => false,
1123 + 'placeholder' => ' ',
1124 + 'field_name' => '',
1125 + 'page_id' => '',
2091 1126 );
2092 1127
2093 1128 return array_merge( $defaults, $args );
2094 1129 }
2095 1130
2096 - /**
2097 - * @param int $post_id
2098 - *
2099 - * @return string
2100 - */
2101 1131 public static function post_edit_link( $post_id ) {
2102 1132 $post = get_post( $post_id );
2103 -
2104 1133 if ( $post ) {
2105 1134 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1135 + $post_url = self::maybe_full_screen_link( $post_url );
2106 1136
2107 1137 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2108 1138 }
2109 1139
@@ -2113,68 +1143,37 @@
2113 1143 /**
2114 1144 * Hide the WordPress menus on some pages.
2115 1145 *
2116 1146 * @since 4.0
2117 - *
2118 - * @return bool
2119 1147 */
2120 1148 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();
1149 + $full_builder = self::is_form_builder_page();
1150 + $styler = self::is_admin_page( 'formidable-styles' ) || self::is_admin_page( 'formidable-styles2' );
1151 + $full_entries = self::simple_get( 'frm-full', 'absint' );
1152 +
1153 + return $full_builder || $full_entries || $styler || self::is_view_builder_page();
2124 1154 }
2125 1155
2126 1156 /**
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
1157 + * @since 4.0
2137 1158 */
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;
1159 + public static function maybe_full_screen_link( $link ) {
1160 + $is_full = self::simple_get( 'frm-full', 'absint' );
1161 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1162 + $link .= '&frm-full=1';
2141 1163 }
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;
1164 + return $link;
2157 1165 }
2158 1166
2159 1167 /**
2160 - * @since 5.5.3
2161 - *
2162 - * @return bool
1168 + * @param string $field_name
1169 + * @param string|array $capability
1170 + * @param string $multiple 'single' and 'multiple'
2163 1171 */
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 1172 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2174 1173 ?>
2175 1174 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2176 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1175 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2177 1176 class="frm_multiselect">
2178 1177 <?php self::roles_options( $capability ); ?>
2179 1178 </select>
2180 1179 <?php
@@ -2181,11 +1180,10 @@
2181 1180 }
2182 1181
2183 1182 /**
2184 1183 * @since 4.07
2185 - *
2186 1184 * @param array|string $selected
2187 - * @param string $current
1185 + * @param string $current
2188 1186 */
2189 1187 private static function selected( $selected, $current ) {
2190 1188 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2191 1189 FrmProAppHelper::selected( $selected, $current );
@@ -2194,13 +1192,12 @@
2194 1192 }
2195 1193 }
2196 1194
2197 1195 /**
2198 - * @param array|string $capability
1196 + * @param string|array $capability
2199 1197 */
2200 1198 public static function roles_options( $capability ) {
2201 1199 global $frm_vars;
2202 -
2203 1200 if ( isset( $frm_vars['editable_roles'] ) ) {
2204 1201 $editable_roles = $frm_vars['editable_roles'];
2205 1202 } else {
2206 1203 $editable_roles = get_editable_roles();
@@ -2209,57 +1206,17 @@
2209 1206
2210 1207 foreach ( $editable_roles as $role => $details ) {
2211 1208 $name = translate_user_role( $details['name'] );
2212 1209 ?>
2213 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1210 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_attr( $name ); ?> </option>
2214 1211 <?php
2215 1212 unset( $role, $details );
2216 1213 }
2217 1214 }
2218 1215
2219 - /**
2220 - * Gets the list of capabilities.
2221 - *
2222 - * @since 5.0 Parameter `$type` supports `pro_only` value.
2223 - *
2224 - * @param string $type Supports `auto`, `pro`, or `pro_only`.
2225 - *
2226 - * @return array
2227 - */
2228 1216 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();
2231 - }
2232 -
2233 - $pro_cap = array(
2234 - 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2235 - 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2236 - 'frm_view_reports' => __( 'View Reports', 'formidable' ),
2237 - );
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 -
2245 - if ( 'pro_only' === $type ) {
2246 - return $pro_cap;
2247 - }
2248 -
2249 - return self::get_lite_capabilities() + $pro_cap;
2250 - }
2251 -
2252 - /**
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' ),
1217 + $cap = array(
1218 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
2262 1219 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2263 1220 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2264 1221 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2265 1222 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
@@ -2264,8 +1221,19 @@
2264 1221 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2265 1222 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
2266 1223 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
2267 1224 );
1225 +
1226 + if ( ! self::pro_is_installed() && 'pro' != $type ) {
1227 + return $cap;
1228 + }
1229 +
1230 + $cap['frm_create_entries'] = __( 'Add Entries from Admin Area', 'formidable' );
1231 + $cap['frm_edit_entries'] = __( 'Edit Entries from Admin Area', 'formidable' );
1232 + $cap['frm_view_reports'] = __( 'View Reports', 'formidable' );
1233 + $cap['frm_edit_displays'] = __( 'Add/Edit Views', 'formidable' );
1234 +
1235 + return $cap;
2268 1236 }
2269 1237
2270 1238 /**
2271 1239 * Call the WordPress current_user_can but also validate empty strings as true for any logged in user
@@ -2300,10 +1268,9 @@
2300 1268 return current_user_can( $role );
2301 1269 }
2302 1270
2303 1271 /**
2304 - * @param array|string $needed_role
2305 - *
1272 + * @param string|array $needed_role
2306 1273 * @return bool
2307 1274 */
2308 1275 public static function user_has_permission( $needed_role ) {
2309 1276 if ( is_array( $needed_role ) ) {
@@ -2322,14 +1289,12 @@
2322 1289 return $can;
2323 1290 }
2324 1291
2325 1292 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2326 -
2327 1293 foreach ( $roles as $role ) {
2328 1294 if ( current_user_can( $role ) ) {
2329 1295 return true;
2330 1296 }
2331 -
2332 1297 if ( $role == $needed_role ) {
2333 1298 break;
2334 1299 }
2335 1300 }
@@ -2351,9 +1316,8 @@
2351 1316
2352 1317 $user_id = get_current_user_id();
2353 1318 $user = new WP_User( $user_id );
2354 1319 $frm_roles = self::frm_capabilities();
2355 -
2356 1320 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2357 1321 $user->add_cap( $frm_role );
2358 1322 unset( $frm_role, $frm_role_description );
2359 1323 }
@@ -2362,18 +1326,13 @@
2362 1326 /**
2363 1327 * Make sure admins have permission to see the menu items
2364 1328 *
2365 1329 * @since 2.0.6
2366 - *
2367 - * @param string $cap
2368 - *
2369 - * @return void
2370 1330 */
2371 1331 public static function force_capability( $cap = 'frm_change_settings' ) {
2372 1332 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2373 1333 $role = get_role( 'administrator' );
2374 1334 $frm_roles = self::frm_capabilities();
2375 -
2376 1335 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2377 1336 $role->add_cap( $frm_role );
2378 1337 }
2379 1338 }
@@ -2379,19 +1338,17 @@
2379 1338 }
2380 1339 }
2381 1340
2382 1341 /**
2383 - * Check if the user has permission for action.
1342 + * Check if the user has permision for action.
2384 1343 * Return permission message and stop the action if no permission
2385 1344 *
2386 1345 * @since 2.0
2387 1346 *
2388 1347 * @param string $permission
2389 - * @param string $show_message
2390 1348 */
2391 1349 public static function permission_check( $permission, $show_message = 'show' ) {
2392 1350 $permission_error = self::permission_nonce_error( $permission );
2393 -
2394 1351 if ( $permission_error !== false ) {
2395 1352 if ( 'hide' == $show_message ) {
2396 1353 $permission_error = '';
2397 1354 }
@@ -2404,10 +1361,8 @@
2404 1361 *
2405 1362 * @since 2.0
2406 1363 *
2407 1364 * @param string $permission
2408 - * @param string $nonce_name
2409 - * @param string $nonce
2410 1365 *
2411 1366 * @return false|string The permission message or false if allowed
2412 1367 */
2413 1368 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
@@ -2417,15 +1372,13 @@
2417 1372 return $frm_settings->admin_permission;
2418 1373 }
2419 1374
2420 1375 $error = false;
2421 -
2422 1376 if ( empty( $nonce_name ) ) {
2423 1377 return $error;
2424 1378 }
2425 1379
2426 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2427 -
1380 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2428 1381 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2429 1382 $frm_settings = self::get_settings();
2430 1383 $error = $frm_settings->admin_permission;
2431 1384 }
@@ -2432,14 +1385,8 @@
2432 1385
2433 1386 return $error;
2434 1387 }
2435 1388
2436 - /**
2437 - * @param array|string $values
2438 - * @param string $current
2439 - *
2440 - * @return void
2441 - */
2442 1389 public static function checked( $values, $current ) {
2443 1390 if ( self::check_selected( $values, $current ) ) {
2444 1391 echo ' checked="checked"';
2445 1392 }
@@ -2444,39 +1391,24 @@
2444 1391 echo ' checked="checked"';
2445 1392 }
2446 1393 }
2447 1394
2448 - /**
2449 - * @param array|string $values
2450 - * @param string $current
2451 - *
2452 - * @return bool
2453 - */
2454 1395 public static function check_selected( $values, $current ) {
2455 - $values = self::recursive_function_map( $values, 'trim' );
2456 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1396 + $values = self::recursive_function_map( $values, 'trim' );
1397 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
1398 + $current = htmlspecialchars_decode( trim( $current ) );
2457 1399
2458 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2459 -
2460 1400 return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2461 1401 }
2462 1402
2463 - /**
2464 - * @param array|string $value
2465 - * @param callable|string $function
2466 - *
2467 - * @return array|string
2468 - */
2469 1403 public static function recursive_function_map( $value, $function ) {
2470 1404 if ( is_array( $value ) ) {
2471 1405 $original_function = $function;
2472 -
2473 1406 if ( count( $value ) ) {
2474 1407 $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2475 1408 } else {
2476 1409 $function = array( $function );
2477 1410 }
2478 -
2479 1411 if ( ! self::is_assoc( $value ) ) {
2480 1412 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2481 1413 } else {
2482 1414 foreach ( $value as $k => $v ) {
@@ -2485,38 +1417,14 @@
2485 1417 }
2486 1418 }
2487 1419 }
2488 1420 } else {
2489 - $value = self::maybe_update_value_if_null( $value, $function );
2490 1421 $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 1422 }
2510 1423
2511 1424 return $value;
2512 1425 }
2513 1426
2514 - /**
2515 - * @param array $array
2516 - *
2517 - * @return bool
2518 - */
2519 1427 public static function is_assoc( $array ) {
2520 1428 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2521 1429 }
2522 1430
@@ -2521,24 +1429,20 @@
2521 1429 }
2522 1430
2523 1431 /**
2524 1432 * Flatten a multi-dimensional array
2525 - *
2526 - * @param array $array
2527 - * @param string $keys
2528 - *
2529 - * @return array
2530 1433 */
2531 1434 public static function array_flatten( $array, $keys = 'keep' ) {
2532 1435 $return = array();
2533 -
2534 1436 foreach ( $array as $key => $value ) {
2535 1437 if ( is_array( $value ) ) {
2536 1438 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2537 - } elseif ( $keys === 'keep' ) {
1439 + } else {
1440 + if ( $keys == 'keep' ) {
2538 1441 $return[ $key ] = $value;
2539 - } else {
2540 - $return[] = $value;
1442 + } else {
1443 + $return[] = $value;
1444 + }
2541 1445 }
2542 1446 }
2543 1447
2544 1448 return $return;
@@ -2543,43 +1447,16 @@
2543 1447
2544 1448 return $return;
2545 1449 }
2546 1450
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 1451 public static function esc_textarea( $text, $is_rich_text = false ) {
2569 1452 $safe_text = str_replace( '&quot;', '"', $text );
2570 -
2571 1453 if ( ! $is_rich_text ) {
2572 1454 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2573 1455 }
2574 -
2575 1456 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2576 1457
2577 - /**
2578 - * @param string $safe_text
2579 - * @param string $text
2580 - */
2581 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1458 + return apply_filters( 'esc_textarea', $safe_text, $text );
2582 1459 }
2583 1460
2584 1461 /**
2585 1462 * Add auto paragraphs to text areas
@@ -2584,15 +1461,11 @@
2584 1461 /**
2585 1462 * Add auto paragraphs to text areas
2586 1463 *
2587 1464 * @since 2.0
2588 - *
2589 - * @param mixed $content
2590 - *
2591 - * @return mixed
2592 1465 */
2593 1466 public static function use_wpautop( $content ) {
2594 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
1467 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
2595 1468 $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2596 1469 }
2597 1470
2598 1471 return $content;
@@ -2597,15 +1470,8 @@
2597 1470
2598 1471 return $content;
2599 1472 }
2600 1473
2601 - /**
2602 - * Replace quotes with their HTML entities.
2603 - *
2604 - * @param string $val
2605 - *
2606 - * @return string
2607 - */
2608 1474 public static function replace_quotes( $val ) {
2609 1475 // Replace double quotes.
2610 1476 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2611 1477
@@ -2615,28 +1481,33 @@
2615 1481 return $val;
2616 1482 }
2617 1483
2618 1484 /**
2619 - * @param string $handle
2620 - * @param int|string $default
2621 - *
2622 - * @return int|string
1485 + * @since 2.0
1486 + * @return string The base Google APIS url for the current version of jQuery UI
2623 1487 */
1488 + public static function jquery_ui_base_url() {
1489 + $url = 'http' . ( is_ssl() ? 's' : '' ) . '://ajax.googleapis.com/ajax/libs/jqueryui/' . self::script_version( 'jquery-ui-core', '1.11.4' );
1490 + $url = apply_filters( 'frm_jquery_ui_base_url', $url );
1491 +
1492 + return $url;
1493 + }
1494 +
1495 + /**
1496 + * @param string $handle
1497 + */
2624 1498 public static function script_version( $handle, $default = 0 ) {
2625 1499 global $wp_scripts;
2626 -
2627 1500 if ( ! $wp_scripts ) {
2628 1501 return $default;
2629 1502 }
2630 1503
2631 1504 $ver = $default;
2632 -
2633 1505 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2634 1506 return $ver;
2635 1507 }
2636 1508
2637 1509 $query = $wp_scripts->registered[ $handle ];
2638 -
2639 1510 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2640 1511 $ver = $query->ver;
2641 1512 }
2642 1513
@@ -2642,36 +1513,19 @@
2642 1513
2643 1514 return $ver;
2644 1515 }
2645 1516
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 );
1517 + public static function js_redirect( $url ) {
1518 + return '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2659 1519 }
2660 1520
2661 - /**
2662 - * @param int|string $user_id
2663 - *
2664 - * @return int|string
2665 - */
2666 1521 public static function get_user_id_param( $user_id ) {
2667 - if ( ! $user_id || is_numeric( $user_id ) ) {
1522 + if ( ! $user_id || empty( $user_id ) || is_numeric( $user_id ) ) {
2668 1523 return $user_id;
2669 1524 }
2670 1525
2671 1526 $user_id = sanitize_text_field( $user_id );
2672 -
2673 - if ( $user_id === 'current' ) {
1527 + if ( $user_id == 'current' ) {
2674 1528 $user_id = get_current_user_id();
2675 1529 } else {
2676 1530 if ( is_email( $user_id ) ) {
2677 1531 $user = get_user_by( 'email', $user_id );
@@ -2687,22 +1541,16 @@
2687 1541
2688 1542 return $user_id;
2689 1543 }
2690 1544
2691 - /**
2692 - * @param string $filename
2693 - * @param array $atts
2694 - *
2695 - * @return false|string
2696 - */
2697 1545 public static function get_file_contents( $filename, $atts = array() ) {
2698 1546 if ( ! is_file( $filename ) ) {
2699 1547 return false;
2700 1548 }
2701 1549
2702 - extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
1550 + extract( $atts );
2703 1551 ob_start();
2704 - include $filename;
1552 + include( $filename );
2705 1553 $contents = ob_get_contents();
2706 1554 ob_end_clean();
2707 1555
2708 1556 return $contents;
@@ -2708,154 +1556,63 @@
2708 1556 return $contents;
2709 1557 }
2710 1558
2711 1559 /**
2712 - * @param string $name
2713 1560 * @param string $table_name
2714 1561 * @param string $column
2715 - * @param int $id
2716 - * @param int $num_chars
1562 + * @param int $id
1563 + * @param int $num_chars
2717 1564 */
2718 - public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
1565 + public static function get_unique_key( $name = '', $table_name, $column, $id = 0, $num_chars = 5 ) {
2719 1566 $key = '';
2720 1567
2721 - if ( $name ) {
1568 + if ( ! empty( $name ) ) {
2722 1569 $key = sanitize_key( $name );
2723 - $key = self::maybe_clear_long_key( $key, $column );
2724 1570 }
2725 1571
2726 - if ( ! $key ) {
2727 - $key = self::generate_new_key( $num_chars );
1572 + if ( empty( $key ) ) {
1573 + $max_slug_value = pow( 36, $num_chars );
1574 + $min_slug_value = 37; // we want to have at least 2 characters in the slug
1575 + $key = base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2728 1576 }
2729 1577
2730 - $key = self::prevent_numeric_and_reserved_keys( $key );
1578 + $not_allowed = array(
1579 + 'id',
1580 + 'key',
1581 + 'created-at',
1582 + 'detaillink',
1583 + 'editlink',
1584 + 'siteurl',
1585 + 'evenodd',
1586 + );
2731 1587
2732 - $similar_keys = FrmDb::get_col(
1588 + if ( is_numeric( $key ) || in_array( $key, $not_allowed ) ) {
1589 + $key = $key . 'a';
1590 + }
1591 +
1592 + $key_check = FrmDb::get_var(
2733 1593 $table_name,
2734 1594 array(
2735 - $column . ' like%' => $key,
2736 - 'ID !' => $id,
1595 + $column => $key,
1596 + 'ID !' => $id,
2737 1597 ),
2738 1598 $column
2739 1599 );
2740 1600
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 );
2744 -
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 - return $key;
2765 - }
2766 -
2767 - /**
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 - }
1601 + if ( $key_check || is_numeric( $key_check ) ) {
1602 + // Create a unique field id if it has already been used.
1603 + $key = $key . substr( md5( microtime() . rand() ), 0, 10 );
2787 1604 }
2788 - return $key;
2789 - }
2790 1605
2791 - /**
2792 - * Possibly reset a key to avoid conflicts with column size limits.
2793 - *
2794 - * @param string $key
2795 - * @param string $column
2796 - *
2797 - * @return string either the original key value, or an empty string if the key was too long.
2798 - */
2799 - private static function maybe_clear_long_key( $key, $column ) {
2800 - if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2801 - $key = '';
2802 - }
2803 1606 return $key;
2804 1607 }
2805 1608
2806 1609 /**
2807 - * @since 6.21 This is changed from `private` to `public`.
2808 - *
2809 - * @param int $num_chars
2810 - *
2811 - * @return string
2812 - */
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 );
2819 - }
2820 -
2821 - /**
2822 - * @param string $key
2823 - *
2824 - * @return string
2825 - */
2826 - private static function prevent_numeric_and_reserved_keys( $key ) {
2827 - if ( is_numeric( $key ) ) {
2828 - $key .= 'a';
2829 - } else {
2830 - $not_allowed = array(
2831 - 'id',
2832 - 'key',
2833 - 'created-at',
2834 - 'detaillink',
2835 - 'editlink',
2836 - 'siteurl',
2837 - 'evenodd',
2838 - );
2839 -
2840 - if ( in_array( $key, $not_allowed, true ) ) {
2841 - $key .= 'a';
2842 - }
2843 - }
2844 - return $key;
2845 - }
2846 -
2847 - /**
2848 1610 * Editing a Form or Entry
2849 1611 *
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
1612 + * @param string $table
2856 1613 *
2857 - * @return array|bool
1614 + * @return bool|array
2858 1615 */
2859 1616 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2860 1617 if ( ! $record ) {
2861 1618 return false;
@@ -2861,9 +1618,9 @@
2861 1618 return false;
2862 1619 }
2863 1620
2864 1621 if ( empty( $post_values ) ) {
2865 - $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
1622 + $post_values = wp_unslash( $_POST );
2866 1623 }
2867 1624
2868 1625 $values = array(
2869 1626 'id' => $record->id,
@@ -2870,9 +1627,9 @@
2870 1627 'fields' => array(),
2871 1628 );
2872 1629
2873 1630 foreach ( array( 'name', 'description' ) as $var ) {
2874 - $default_val = $record->{$var} ?? '';
1631 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2875 1632 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2876 1633 unset( $var, $default_val );
2877 1634 }
2878 1635
@@ -2881,11 +1638,11 @@
2881 1638 self::fill_form_opts( $record, $table, $post_values, $values );
2882 1639
2883 1640 self::prepare_field_arrays( $fields, $record, $values, array_merge( $args, compact( 'default', 'post_values' ) ) );
2884 1641
2885 - if ( $table === 'entries' ) {
1642 + if ( $table == 'entries' ) {
2886 1643 $values = FrmEntriesHelper::setup_edit_vars( $values, $record );
2887 - } elseif ( $table === 'forms' ) {
1644 + } elseif ( $table == 'forms' ) {
2888 1645 $values = FrmFormsHelper::setup_edit_vars( $values, $record, $post_values );
2889 1646 }
2890 1647
2891 1648 return $values;
@@ -2890,16 +1647,8 @@
2890 1647
2891 1648 return $values;
2892 1649 }
2893 1650
2894 - /**
2895 - * @param array|string $fields
2896 - * @param object $record
2897 - * @param array $values
2898 - * @param array $args
2899 - *
2900 - * @return void
2901 - */
2902 1651 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2903 1652 if ( ! empty( $fields ) ) {
2904 1653 foreach ( (array) $fields as $field ) {
2905 1654 if ( ! self::is_admin_page() ) {
@@ -2905,32 +1654,24 @@
2905 1654 if ( ! self::is_admin_page() ) {
2906 1655 // Don't prep default values on the form settings page.
2907 1656 $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2908 1657 }
2909 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
1658 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2910 1659 self::fill_field_defaults( $field, $record, $values, $args );
2911 1660 }
2912 1661 }
2913 1662 }
2914 1663
2915 - /**
2916 - * @param object $field
2917 - * @param object $record
2918 - * @param array $values
2919 - * @param array $args
2920 - *
2921 - * @return void
2922 - */
2923 1664 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2924 1665 $post_values = $args['post_values'];
2925 1666
2926 1667 if ( $args['default'] ) {
2927 1668 $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 -
1669 + } else {
1670 + if ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
1671 + if ( ! isset( $field->field_options['custom_field'] ) ) {
1672 + $field->field_options['custom_field'] = '';
1673 + }
2933 1674 $meta_value = FrmProEntryMetaHelper::get_post_value(
2934 1675 $record->post_id,
2935 1676 $field->field_options['post_field'],
2936 1677 $field->field_options['custom_field'],
@@ -2940,14 +1681,14 @@
2940 1681 'form_id' => $field->form_id,
2941 1682 'field' => $field,
2942 1683 )
2943 1684 );
2944 - } else {
2945 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2946 - }//end if
1685 + } else {
1686 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
1687 + }
1688 + }
2947 1689
2948 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2949 -
1690 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2950 1691 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2951 1692 $new_value = $post_values['item_meta'][ $field->id ];
2952 1693 self::unserialize_or_decode( $new_value );
2953 1694 } else {
@@ -2993,15 +1734,12 @@
2993 1734 );
2994 1735 }
2995 1736
2996 1737 /**
2997 - * @param object $record
2998 1738 * @param string $table
2999 - * @param array $post_values
3000 - * @param array $values
3001 1739 */
3002 1740 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
3003 - if ( $table === 'entries' ) {
1741 + if ( $table == 'entries' ) {
3004 1742 $form = $record->form_id;
3005 1743 FrmForm::maybe_get_form( $form );
3006 1744 } else {
3007 1745 $form = $record;
@@ -3031,13 +1769,8 @@
3031 1769 }
3032 1770
3033 1771 /**
3034 1772 * Set to POST value or default
3035 - *
3036 - * @param array $post_values
3037 - * @param array $values
3038 - *
3039 - * @return void
3040 1773 */
3041 1774 private static function fill_form_defaults( $post_values, array &$values ) {
3042 1775 $form_defaults = FrmFormsHelper::get_default_opts();
3043 1776
@@ -3042,9 +1775,9 @@
3042 1775 $form_defaults = FrmFormsHelper::get_default_opts();
3043 1776
3044 1777 foreach ( $form_defaults as $opt => $default ) {
3045 1778 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3046 - $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
1779 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3047 1780 }
3048 1781
3049 1782 unset( $opt, $default );
3050 1783 }
@@ -3054,9 +1787,9 @@
3054 1787 }
3055 1788
3056 1789 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3057 1790 if ( ! isset( $values[ $h . '_html' ] ) ) {
3058 - $values[ $h . '_html' ] = ( $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h ) );
1791 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3059 1792 }
3060 1793 unset( $h );
3061 1794 }
3062 1795 }
@@ -3065,9 +1798,9 @@
3065 1798 * @since 2.2.10
3066 1799 *
3067 1800 * @param array $post_values
3068 1801 *
3069 - * @return bool|int
1802 + * @return boolean|int
3070 1803 */
3071 1804 public static function custom_style_value( $post_values ) {
3072 1805 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 1806 $custom_style = absint( $post_values['options']['custom_style'] );
@@ -3072,38 +1805,29 @@
3072 1805 if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
3073 1806 $custom_style = absint( $post_values['options']['custom_style'] );
3074 1807 } else {
3075 1808 $frm_settings = self::get_settings();
3076 - $custom_style = ( $frm_settings->load_style !== 'none' );
1809 + $custom_style = ( $frm_settings->load_style != 'none' );
3077 1810 }
3078 1811
3079 1812 return $custom_style;
3080 1813 }
3081 1814
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 ) ) {
1815 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
1816 + if ( is_array( $str ) ) {
3092 1817 return '';
3093 1818 }
3094 1819
3095 1820 $length = (int) $length;
3096 - $str = wp_strip_all_tags( (string) $original_string );
1821 + $str = wp_strip_all_tags( $str );
3097 1822 $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3098 1823
3099 1824 if ( $length == 0 ) {
3100 1825 return '';
3101 - }
1826 + } elseif ( $length <= 10 ) {
1827 + $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3102 1828
3103 - if ( $length <= 10 ) {
3104 - $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3105 - return $sub . ( $length < $original_len ? $continue : '' );
1829 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
3106 1830 }
3107 1831
3108 1832 $sub = '';
3109 1833 $len = 0;
@@ -3109,16 +1833,11 @@
3109 1833 $len = 0;
3110 1834
3111 1835 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3112 1836
3113 - if ( ! is_array( $words ) ) {
3114 - return $original_string;
3115 - }
3116 -
3117 1837 foreach ( $words as $word ) {
3118 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
1838 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3119 1839 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3120 -
3121 1840 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3122 1841 break;
3123 1842 }
3124 1843
@@ -3131,49 +1850,14 @@
3131 1850
3132 1851 unset( $total_len, $word );
3133 1852 }
3134 1853
3135 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length );
3136 -
3137 - return $sub . ( $len < $original_len ? $continue : '' );
1854 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3138 1855 }
3139 1856
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 1857 public static function mb_function( $function_names, $args ) {
3173 1858 $mb_function_name = $function_names[0];
3174 1859 $function_name = $function_names[1];
3175 -
3176 1860 if ( function_exists( $mb_function_name ) ) {
3177 1861 $function_name = $mb_function_name;
3178 1862 }
3179 1863
@@ -3179,15 +1863,8 @@
3179 1863
3180 1864 return call_user_func_array( $function_name, $args );
3181 1865 }
3182 1866
3183 - /**
3184 - * @param string $date
3185 - * @param string $date_format
3186 - * @param string $time_format
3187 - *
3188 - * @return string
3189 - */
3190 1867 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3191 1868 if ( empty( $date ) ) {
3192 1869 return $date;
3193 1870 }
@@ -3202,10 +1879,9 @@
3202 1879 }
3203 1880
3204 1881 $formatted = self::get_localized_date( $date_format, $date );
3205 1882
3206 - $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00' );
3207 -
1883 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3208 1884 if ( $do_time ) {
3209 1885 $formatted .= self::add_time_to_date( $time_format, $date );
3210 1886 }
3211 1887
@@ -3211,14 +1887,8 @@
3211 1887
3212 1888 return $formatted;
3213 1889 }
3214 1890
3215 - /**
3216 - * @param string $time_format
3217 - * @param string $date
3218 - *
3219 - * @return string
3220 - */
3221 1891 private static function add_time_to_date( $time_format, $date ) {
3222 1892 if ( empty( $time_format ) ) {
3223 1893 $time_format = get_option( 'time_format' );
3224 1894 }
@@ -3224,9 +1894,8 @@
3224 1894 }
3225 1895
3226 1896 $trimmed_format = trim( $time_format );
3227 1897 $time = '';
3228 -
3229 1898 if ( $time_format && ! empty( $trimmed_format ) ) {
3230 1899 $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3231 1900 }
3232 1901
@@ -3234,13 +1903,8 @@
3234 1903 }
3235 1904
3236 1905 /**
3237 1906 * @since 2.0.8
3238 - *
3239 - * @param string $date_format
3240 - * @param string $date
3241 - *
3242 - * @return string
3243 1907 */
3244 1908 public static function get_localized_date( $date_format, $date ) {
3245 1909 $date = get_date_from_gmt( $date );
3246 1910
@@ -3247,23 +1911,21 @@
3247 1911 return date_i18n( $date_format, strtotime( $date ) );
3248 1912 }
3249 1913
3250 1914 /**
3251 - * Gets the time ago in words.
1915 + * Gets the time ago in words
3252 1916 *
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.
1917 + * @param int $from in seconds
1918 + * @param int|string $to in seconds
3256 1919 *
3257 1920 * @return string $time_ago
3258 1921 */
3259 1922 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3260 - if ( empty( $to ) && 0 !== $to ) {
1923 + if ( empty( $to ) ) {
3261 1924 $now = new DateTime();
3262 1925 } else {
3263 1926 $now = new DateTime( '@' . $to );
3264 1927 }
3265 -
3266 1928 $ago = new DateTime( '@' . $from );
3267 1929
3268 1930 // Get the time difference
3269 1931 $diff_object = $now->diff( $ago );
@@ -3269,9 +1931,9 @@
3269 1931 $diff_object = $now->diff( $ago );
3270 1932 $diff = get_object_vars( $diff_object );
3271 1933
3272 1934 // Add week amount and update day amount
3273 - $diff['w'] = floor( $diff['d'] / 7 );
1935 + $diff['w'] = floor( $diff['d'] / 7 );
3274 1936 $diff['d'] -= $diff['w'] * 7;
3275 1937
3276 1938 $time_strings = self::get_time_strings();
3277 1939
@@ -3277,11 +1939,10 @@
3277 1939
3278 1940 if ( ! is_numeric( $levels ) ) {
3279 1941 // Show time in specified unit.
3280 1942 $levels = self::get_unit( $levels );
3281 -
3282 1943 if ( isset( $time_strings[ $levels ] ) ) {
3283 - $diff = array(
1944 + $diff = array(
3284 1945 $levels => self::time_format( $levels, $diff ),
3285 1946 );
3286 1947 $time_strings = array(
3287 1948 $levels => $time_strings[ $levels ],
@@ -3286,9 +1947,8 @@
3286 1947 $time_strings = array(
3287 1948 $levels => $time_strings[ $levels ],
3288 1949 );
3289 1950 }
3290 -
3291 1951 $levels = 1;
3292 1952 }
3293 1953
3294 1954 foreach ( $time_strings as $k => $v ) {
@@ -3310,13 +1970,8 @@
3310 1970 }
3311 1971
3312 1972 /**
3313 1973 * @since 4.05.01
3314 - *
3315 - * @param string $unit
3316 - * @param array $diff
3317 - *
3318 - * @return int
3319 1974 */
3320 1975 private static function time_format( $unit, $diff ) {
3321 1976 $return = array(
3322 1977 'y' => 'y',
@@ -3321,9 +1976,8 @@
3321 1976 $return = array(
3322 1977 'y' => 'y',
3323 1978 'd' => 'days',
3324 1979 );
3325 -
3326 1980 if ( isset( $return[ $unit ] ) ) {
3327 1981 return $diff[ $return[ $unit ] ];
3328 1982 }
3329 1983
@@ -3343,13 +1997,8 @@
3343 1997 }
3344 1998
3345 1999 /**
3346 2000 * @since 4.05.01
3347 - *
3348 - * @param string $from
3349 - * @param string $to
3350 - *
3351 - * @return int
3352 2001 */
3353 2002 private static function convert_time( $from, $to ) {
3354 2003 $convert = array(
3355 2004 's' => 1,
@@ -3365,16 +2014,11 @@
3365 2014 }
3366 2015
3367 2016 /**
3368 2017 * @since 4.05.01
3369 - *
3370 - * @param string $unit
3371 - *
3372 - * @return int|string
3373 2018 */
3374 2019 private static function get_unit( $unit ) {
3375 2020 $units = self::get_time_strings();
3376 -
3377 2021 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3378 2022 return $unit;
3379 2023 }
3380 2024
@@ -3387,12 +2031,11 @@
3387 2031 }
3388 2032
3389 2033 /**
3390 2034 * Get the translatable time strings. The untranslated version is a failsafe
3391 - * in case languages are changing for the unit set in the shortcode.
2035 + * in case langauges are changing for the unit set in the shortcode.
3392 2036 *
3393 2037 * @since 2.0.20
3394 - *
3395 2038 * @return array
3396 2039 */
3397 2040 private static function get_time_strings() {
3398 2041 return array(
@@ -3436,47 +2079,35 @@
3436 2079
3437 2080 // Pagination Methods.
3438 2081
3439 2082 /**
3440 - * @param int $r_count
3441 - * @param int $current_p
3442 - * @param int $p_size
3443 - *
3444 - * @return int
2083 + * @param integer $current_p
3445 2084 */
3446 2085 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 );
2086 + return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
3448 2087 }
3449 2088
3450 2089 /**
3451 - * @param int $r_count
3452 - * @param int $current_p
3453 - * @param int $p_size
3454 - *
3455 - * @return int
2090 + * @param integer $current_p
3456 2091 */
3457 2092 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3458 2093 if ( $current_p == 1 ) {
3459 2094 return 1;
2095 + } else {
2096 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3460 2097 }
3461 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3462 2098 }
3463 2099
3464 2100 /**
3465 - * @param array $json_vars
3466 - *
3467 2101 * @return array
3468 2102 */
3469 2103 public static function json_to_array( $json_vars ) {
3470 2104 $vars = array();
3471 -
3472 2105 foreach ( $json_vars as $jv ) {
3473 2106 $jv_name = explode( '[', $jv['name'] );
3474 2107 $last = count( $jv_name ) - 1;
3475 -
3476 2108 foreach ( $jv_name as $p => $n ) {
3477 2109 $name = trim( $n, ']' );
3478 -
3479 2110 if ( ! isset( $l1 ) ) {
3480 2111 $l1 = $name;
3481 2112 }
3482 2113
@@ -3487,9 +2118,9 @@
3487 2118 if ( ! isset( $l3 ) ) {
3488 2119 $l3 = $name;
3489 2120 }
3490 2121
3491 - $this_val = $p == $last ? $jv['value'] : array();
2122 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3492 2123
3493 2124 switch ( $p ) {
3494 2125 case 0:
3495 2126 $l1 = $name;
@@ -3511,12 +2142,12 @@
3511 2142 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3512 2143 }
3513 2144
3514 2145 unset( $this_val, $n );
3515 - }//end foreach
2146 + }
3516 2147
3517 2148 unset( $last, $jv );
3518 - }//end foreach
2149 + }
3519 2150
3520 2151 return $vars;
3521 2152 }
3522 2153
@@ -3522,12 +2153,8 @@
3522 2153
3523 2154 /**
3524 2155 * @param string $name
3525 2156 * @param string $l1
3526 - * @param mixed $val
3527 - * @param array $vars
3528 - *
3529 - * @return void
3530 2157 */
3531 2158 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3532 2159 if ( $name == '' ) {
3533 2160 $vars[] = $val;
@@ -3535,19 +2162,12 @@
3535 2162 $vars[ $l1 ] = $val;
3536 2163 }
3537 2164 }
3538 2165
3539 - /**
3540 - * @param string $name
3541 - * @param string $class
3542 - * @param string $form_name
3543 - *
3544 - * @return void
3545 - */
3546 2166 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3547 2167 $tooltips = array(
3548 2168 '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' ),
2169 + '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 2170 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3551 2171 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3552 2172 '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 2173 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
@@ -3552,9 +2172,8 @@
3552 2172 '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 2173 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3554 2174 /* translators: %1$s: Form name, %2$s: Date */
3555 2175 '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 2176 );
3558 2177
3559 2178 if ( ! isset( $tooltips[ $name ] ) ) {
3560 2179 return;
@@ -3574,14 +2193,8 @@
3574 2193 }
3575 2194
3576 2195 /**
3577 2196 * 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 2197 */
3585 2198 public static function select_current_page( $page, $current_page, $action = array() ) {
3586 2199 if ( $current_page != $page ) {
3587 2200 return;
@@ -3587,13 +2200,8 @@
3587 2200 return;
3588 2201 }
3589 2202
3590 2203 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3591 -
3592 - if ( 'lite-reports' === $frm_action ) {
3593 - $frm_action = 'reports';
3594 - }
3595 -
3596 2204 if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3597 2205 echo ' class="current_page"';
3598 2206 }
3599 2207 }
@@ -3610,11 +2218,9 @@
3610 2218 public static function prepare_and_encode( $post_content ) {
3611 2219 // Loop through array to strip slashes and add only the needed ones.
3612 2220 foreach ( $post_content as $key => $val ) {
3613 2221 // Replace problematic characters (like &quot;)
3614 - if ( is_string( $val ) ) {
3615 - $val = str_replace( '&quot;', '"', $val );
3616 - }
2222 + $val = str_replace( '&quot;', '"', $val );
3617 2223
3618 2224 self::prepare_action_slashes( $val, $key, $post_content );
3619 2225 unset( $key, $val );
3620 2226 }
@@ -3630,17 +2236,10 @@
3630 2236
3631 2237 return $post_content;
3632 2238 }
3633 2239
3634 - /**
3635 - * @param array|string $val
3636 - * @param int|string $key
3637 - * @param array $post_content
3638 - *
3639 - * @return void
3640 - */
3641 2240 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3642 - if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
2241 + if ( ! isset( $post_content[ $key ] ) ) {
3643 2242 return;
3644 2243 }
3645 2244
3646 2245 if ( is_array( $val ) ) {
@@ -3657,16 +2256,12 @@
3657 2256 }
3658 2257 }
3659 2258
3660 2259 /**
3661 - * Check for either json or serialized data. This is temporary while transitioning
2260 + * Check for either json or serilized data. This is temporary while transitioning
3662 2261 * all data to json.
3663 2262 *
3664 2263 * @since 4.02.03
3665 - *
3666 - * @param array|string $value
3667 - *
3668 - * @return void
3669 2264 */
3670 2265 public static function unserialize_or_decode( &$value ) {
3671 2266 if ( is_array( $value ) ) {
3672 2267 return;
@@ -3672,9 +2267,9 @@
3672 2267 return;
3673 2268 }
3674 2269
3675 2270 if ( is_serialized( $value ) ) {
3676 - $value = self::maybe_unserialize_array( $value );
2271 + $value = maybe_unserialize( $value );
3677 2272 } else {
3678 2273 $value = self::maybe_json_decode( $value, false );
3679 2274 }
3680 2275 }
@@ -3679,60 +2274,23 @@
3679 2274 }
3680 2275 }
3681 2276
3682 2277 /**
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 2278 * Decode a JSON string.
3713 2279 * 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 2280 */
3720 2281 public static function maybe_json_decode( $string, $single_to_array = true ) {
3721 - if ( is_array( $string ) || is_null( $string ) ) {
2282 + if ( is_array( $string ) ) {
3722 2283 return $string;
3723 2284 }
3724 2285
3725 2286 $new_string = json_decode( $string, true );
3726 -
3727 2287 if ( function_exists( 'json_last_error' ) ) {
3728 2288 // php 5.3+
3729 2289 $single_value = false;
3730 -
3731 2290 if ( ! $single_to_array ) {
3732 2291 $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3733 2292 }
3734 -
3735 2293 if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3736 2294 $string = $new_string;
3737 2295 }
3738 2296 }
@@ -3740,45 +2298,11 @@
3740 2298 return $string;
3741 2299 }
3742 2300
3743 2301 /**
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 2302 * Reformat the json serialized array in name => value array.
3775 2303 *
3776 2304 * @since 4.02.03
3777 - *
3778 - * @param array $form
3779 - *
3780 - * @return void
3781 2305 */
3782 2306 public static function format_form_data( &$form ) {
3783 2307 $formatted = array();
3784 2308
@@ -3785,11 +2309,9 @@
3785 2309 foreach ( $form as $input ) {
3786 2310 if ( ! isset( $input['name'] ) ) {
3787 2311 continue;
3788 2312 }
3789 -
3790 2313 $key = $input['name'];
3791 -
3792 2314 if ( isset( $formatted[ $key ] ) ) {
3793 2315 if ( is_array( $formatted[ $key ] ) ) {
3794 2316 $formatted[ $key ][] = $input['value'];
3795 2317 } else {
@@ -3804,12 +2326,8 @@
3804 2326 }
3805 2327
3806 2328 /**
3807 2329 * @since 4.02.03
3808 - *
3809 - * @param array|string $value
3810 - *
3811 - * @return string
3812 2330 */
3813 2331 public static function maybe_json_encode( $value ) {
3814 2332 if ( is_array( $value ) ) {
3815 2333 $value = wp_json_encode( $value );
@@ -3817,15 +2335,12 @@
3817 2335 return $value;
3818 2336 }
3819 2337
3820 2338 /**
3821 - * Echo The javascript to open and highlight the Formidable menu
3822 - *
3823 2339 * @since 1.07.10
3824 2340 *
3825 - * @param string $post_type The name of the post type that may need to be highlighted.
3826 - *
3827 - * @return void
2341 + * @param string $post_type The name of the post type that may need to be highlighted
2342 + * echo The javascript to open and highlight the Formidable menu
3828 2343 */
3829 2344 public static function maybe_highlight_menu( $post_type ) {
3830 2345 global $post;
3831 2346
@@ -3844,12 +2359,8 @@
3844 2359 /**
3845 2360 * Load the JS file on non-Formidable pages in the admin area
3846 2361 *
3847 2362 * @since 2.0
3848 - *
3849 - * @param bool $load
3850 - *
3851 - * @return void
3852 2363 */
3853 2364 public static function load_admin_wide_js( $load = true ) {
3854 2365 $version = self::plugin_version();
3855 2366 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
@@ -3854,18 +2365,14 @@
3854 2365 $version = self::plugin_version();
3855 2366 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
3856 2367
3857 2368 $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(),
2369 + 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2370 + 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2371 + 'url' => self::plugin_url(),
2372 + 'app_url' => 'https://formidableforms.com/',
2373 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2374 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
3868 2375 );
3869 2376 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3870 2377
3871 2378 if ( $load ) {
@@ -3874,10 +2381,8 @@
3874 2381 }
3875 2382
3876 2383 /**
3877 2384 * @since 2.0.9
3878 - *
3879 - * @return void
3880 2385 */
3881 2386 public static function load_font_style() {
3882 2387 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3883 2388 }
@@ -3883,176 +2388,102 @@
3883 2388 }
3884 2389
3885 2390 /**
3886 2391 * @param string $location
3887 - *
3888 - * @return void
3889 2392 */
3890 2393 public static function localize_script( $location ) {
3891 - global $wp_scripts, $wp_version;
2394 + global $wp_scripts;
3892 2395
2396 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2397 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2398 +
3893 2399 $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,
2400 + 'ajax_url' => $ajax_url,
2401 + 'images_url' => self::plugin_url() . '/images',
2402 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2403 + 'remove' => __( 'Remove', 'formidable' ),
2404 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2405 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2406 + 'id' => __( 'ID', 'formidable' ),
2407 + 'no_results' => __( 'No results match', 'formidable' ),
2408 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2409 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2410 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3909 2411 );
3910 2412
3911 2413 $data = $wp_scripts->get_data( 'formidable', 'data' );
3912 -
3913 - if ( ! $data ) {
2414 + if ( empty( $data ) ) {
3914 2415 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3915 2416 }
3916 2417
3917 - if ( $location === 'admin' ) {
2418 + if ( $location == 'admin' ) {
2419 + $frm_settings = self::get_settings();
3918 2420 $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(),
2421 + 'desc' => __( '(Click to add description)', 'formidable' ),
2422 + 'blank' => __( '(Blank)', 'formidable' ),
2423 + 'no_label' => __( '(no label)', 'formidable' ),
2424 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2425 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2426 + 'ok' => __( 'OK', 'formidable' ),
2427 + 'cancel' => __( 'Cancel', 'formidable' ),
2428 + 'default_label' => __( 'Default', 'formidable' ),
2429 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2430 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2431 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2432 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2433 + 'caution' => __( 'Heads up', 'formidable' ),
2434 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2435 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2436 + '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' ),
2437 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2438 + 'default_unique' => $frm_settings->unique_msg,
2439 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2440 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2441 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2442 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2443 + 'new_option' => __( 'New Option', 'formidable' ),
2444 + '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' ),
2445 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2446 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2447 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2448 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2449 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2450 + 'private_label' => __( 'Private', 'formidable' ),
2451 + 'jquery_ui_url' => self::jquery_ui_base_url(),
2452 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2453 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2454 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2455 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2456 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2457 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2458 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3956 2459 /* 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' ), '****' ),
2460 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3958 2461 /* 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', '>=' ),
2462 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2463 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2464 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2465 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2466 + 'install' => __( 'Install', 'formidable' ),
2467 + 'active' => __( 'Active', 'formidable' ),
2468 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2469 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3984 2470 );
3985 - /**
3986 - * @param array $admin_script_strings
3987 - */
3988 2471 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3989 2472
3990 2473 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3991 -
3992 - if ( ! $data ) {
2474 + if ( empty( $data ) ) {
3993 2475 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3994 2476 }
3995 - }//end if
2477 + }
3996 2478 }
3997 2479
3998 2480 /**
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 2481 * Echo the message on the plugins listing page
4049 2482 *
4050 2483 * @since 1.07.10
4051 2484 *
4052 - * @param float $min_version The version the add-on requires.
4053 - *
4054 - * @return void
2485 + * @param float $min_version The version the add-on requires
4055 2486 */
4056 2487 public static function min_version_notice( $min_version ) {
4057 2488 $frm_version = self::plugin_version();
4058 2489
@@ -4070,12 +2501,8 @@
4070 2501 /**
4071 2502 * If Pro is far outdated, show a message.
4072 2503 *
4073 2504 * @since 4.0.01
4074 - *
4075 - * @param string $min_version
4076 - *
4077 - * @return void
4078 2505 */
4079 2506 public static function min_pro_version_notice( $min_version ) {
4080 2507 if ( ! self::is_formidable_admin() ) {
4081 2508 // Don't show admin-wide.
@@ -4084,14 +2511,26 @@
4084 2511
4085 2512 self::php_version_notice();
4086 2513
4087 2514 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4088 -
4089 2515 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4090 2516 return;
4091 2517 }
4092 2518
4093 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
2519 + $pro_version = FrmProDb::$plug_version;
2520 + $expired = FrmAddonsController::is_license_expired();
2521 + ?>
2522 + <div class="error frm_previous_install">
2523 + <?php
2524 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
2525 + if ( empty( $expired ) ) {
2526 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2527 + } else {
2528 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest Pro version or <a href="https://downloads.wordpress.org/plugin/formidable.<?php echo esc_attr( $pro_version ); ?>.zip">download the previous Lite version</a> to revert.';
2529 + }
2530 + ?>
2531 + </div>
2532 + <?php
4094 2533 }
4095 2534
4096 2535 /**
4097 2536 * If Pro is installed, check the version number.
@@ -4096,12 +2535,8 @@
4096 2535 /**
4097 2536 * If Pro is installed, check the version number.
4098 2537 *
4099 2538 * @since 4.0.01
4100 - *
4101 - * @param string $min_version
4102 - *
4103 - * @return bool
4104 2539 */
4105 2540 public static function meets_min_pro_version( $min_version ) {
4106 2541 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 2542 }
@@ -4106,24 +2541,27 @@
4106 2541 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4107 2542 }
4108 2543
4109 2544 /**
4110 - * Show a message if the PHP version is below the recommendations.
2545 + * Show a message if the browser or PHP version is below the recommendations.
4111 2546 *
4112 2547 * @since 4.0.02
4113 - *
4114 - * @return void
4115 2548 */
4116 2549 private static function php_version_notice() {
4117 2550 $message = array();
2551 + if ( version_compare( phpversion(), '5.6', '<' ) ) {
2552 + $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' );
2553 + }
4118 2554
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' );
2555 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
2556 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
2557 + if ( $is_ie ) {
2558 + $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 2559 }
4122 2560
4123 2561 foreach ( $message as $m ) {
4124 2562 ?>
4125 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2563 + <div class="error frm_previous_install">
4126 2564 <?php echo esc_html( $m ); ?>
4127 2565 </div>
4128 2566 <?php
4129 2567 }
@@ -4128,26 +2566,17 @@
4128 2566 <?php
4129 2567 }
4130 2568 }
4131 2569
4132 - /**
4133 - * @param string $type
4134 - *
4135 - * @return array<string,string>
4136 - */
4137 2570 public static function locales( $type = 'date' ) {
4138 2571 $locales = array(
4139 2572 'en' => __( 'English', 'formidable' ),
4140 2573 'af' => __( 'Afrikaans', 'formidable' ),
4141 2574 'sq' => __( 'Albanian', 'formidable' ),
4142 - 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
4143 - 'am' => __( 'Amharic', 'formidable' ),
4144 2575 'ar' => __( 'Arabic', 'formidable' ),
4145 2576 'hy' => __( 'Armenian', 'formidable' ),
4146 2577 'az' => __( 'Azerbaijani', 'formidable' ),
4147 2578 'eu' => __( 'Basque', 'formidable' ),
4148 - 'be' => __( 'Belarusian', 'formidable' ),
4149 - 'bn' => __( 'Bengali', 'formidable' ),
4150 2579 'bs' => __( 'Bosnian', 'formidable' ),
4151 2580 'bg' => __( 'Bulgarian', 'formidable' ),
4152 2581 'ca' => __( 'Catalan', 'formidable' ),
4153 2582 'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
@@ -4166,15 +2595,12 @@
4166 2595 'fi' => __( 'Finnish', 'formidable' ),
4167 2596 'fr' => __( 'French', 'formidable' ),
4168 2597 'fr-CA' => __( 'French/Canadian', 'formidable' ),
4169 2598 'fr-CH' => __( 'French/Swiss', 'formidable' ),
4170 - 'gl' => __( 'Galician', 'formidable' ),
4171 - 'ka' => __( 'Georgian', 'formidable' ),
4172 2599 'de' => __( 'German', 'formidable' ),
4173 2600 'de-AT' => __( 'German/Austria', 'formidable' ),
4174 2601 'de-CH' => __( 'German/Switzerland', 'formidable' ),
4175 2602 'el' => __( 'Greek', 'formidable' ),
4176 - 'gu' => __( 'Gujarati', 'formidable' ),
4177 2603 'he' => __( 'Hebrew', 'formidable' ),
4178 2604 'iw' => __( 'Hebrew', 'formidable' ),
4179 2605 'hi' => __( 'Hindi', 'formidable' ),
4180 2606 'hu' => __( 'Hungarian', 'formidable' ),
@@ -4181,904 +2607,239 @@
4181 2607 'is' => __( 'Icelandic', 'formidable' ),
4182 2608 'id' => __( 'Indonesian', 'formidable' ),
4183 2609 'it' => __( 'Italian', 'formidable' ),
4184 2610 'ja' => __( 'Japanese', 'formidable' ),
4185 - 'kn' => __( 'Kannada', 'formidable' ),
4186 - 'kk' => __( 'Kazakh', 'formidable' ),
4187 - 'km' => __( 'Khmer', 'formidable' ),
4188 2611 'ko' => __( 'Korean', 'formidable' ),
4189 - 'ky' => __( 'Kyrgyz', 'formidable' ),
4190 - 'lo' => __( 'Laothian', 'formidable' ),
4191 2612 'lv' => __( 'Latvian', 'formidable' ),
4192 2613 'lt' => __( 'Lithuanian', 'formidable' ),
4193 - 'lb' => __( 'Luxembourgish', 'formidable' ),
4194 - 'mk' => __( 'Macedonian', 'formidable' ),
4195 - 'ml' => __( 'Malayalam', 'formidable' ),
4196 2614 'ms' => __( 'Malaysian', 'formidable' ),
4197 - 'mr' => __( 'Marathi', 'formidable' ),
4198 2615 'no' => __( 'Norwegian', 'formidable' ),
4199 - 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
4200 - 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
4201 2616 'pl' => __( 'Polish', 'formidable' ),
4202 2617 'pt' => __( 'Portuguese', 'formidable' ),
4203 2618 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
4204 2619 'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
4205 - 'rm' => __( 'Romansh', 'formidable' ),
4206 2620 'ro' => __( 'Romanian', 'formidable' ),
4207 2621 'ru' => __( 'Russian', 'formidable' ),
4208 2622 'sr' => __( 'Serbian', 'formidable' ),
4209 2623 'sr-SR' => __( 'Serbian', 'formidable' ),
4210 - 'si' => __( 'Sinhalese', 'formidable' ),
4211 2624 'sk' => __( 'Slovak', 'formidable' ),
4212 2625 'sl' => __( 'Slovenian', 'formidable' ),
4213 2626 'es' => __( 'Spanish', 'formidable' ),
4214 2627 'es-419' => __( 'Spanish/Latin America', 'formidable' ),
4215 - 'sw' => __( 'Swahili', 'formidable' ),
4216 2628 'sv' => __( 'Swedish', 'formidable' ),
4217 2629 'ta' => __( 'Tamil', 'formidable' ),
4218 - 'te' => __( 'Telugu', 'formidable' ),
4219 2630 'th' => __( 'Thai', 'formidable' ),
4220 - 'tj' => __( 'Tajiki', 'formidable' ),
2631 + 'tu' => __( 'Turkish', 'formidable' ),
4221 2632 'tr' => __( 'Turkish', 'formidable' ),
4222 - 'uk' => __( 'Ukrainian', 'formidable' ),
4223 - 'ur' => __( 'Urdu', 'formidable' ),
2633 + 'uk' => __( 'Ukranian', 'formidable' ),
4224 2634 'vi' => __( 'Vietnamese', 'formidable' ),
4225 - 'cy-GB' => __( 'Welsh', 'formidable' ),
4226 - 'zu' => __( 'Zulu', 'formidable' ),
4227 2635 );
4228 2636
4229 2637 if ( $type === 'captcha' ) {
4230 2638 // 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' );
2639 + $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta', 'tu' );
4232 2640 } else {
4233 2641 // 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' );
2642 + $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'tr' );
4235 2643 }
4236 2644
4237 2645 $locales = array_diff_key( $locales, array_flip( $unset ) );
2646 + $locales = apply_filters( 'frm_locales', $locales );
4238 2647
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 2648 return $locales;
4253 2649 }
4254 2650
4255 2651 /**
4256 - * @return string
2652 + * Output HTML containing reference text for accessibility
4257 2653 */
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';
2654 + public static function multiselect_accessibility() {
2655 + include_once self::plugin_path() . '/classes/views/frm-forms/multiselect-accessibility.php';
4267 2656 }
4268 2657
4269 2658 /**
4270 - * Shows the images dropdown.
2659 + * Use the WP 4.7 wp_doing_ajax function
4271 2660 *
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 - * }
2661 + * @since 2.05.07
2662 + * @deprecated 4.04.04
4283 2663 */
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
2664 + public static function wp_doing_ajax() {
2665 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
2666 + return wp_doing_ajax();
4301 2667 }
4302 2668
4303 2669 /**
4304 - * Fills the default images_dropdown() arguments.
4305 - *
4306 - * @since 5.0.04
4307 - *
4308 - * @param array $args The arguments.
4309 - *
4310 - * @return array
2670 + * @deprecated 4.0
4311 2671 */
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 );
2672 + public static function insert_opt_html( $args ) {
2673 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
2674 + FrmFormsHelper::insert_opt_html( $args );
4333 2675 }
4334 2676
4335 2677 /**
4336 - * Gets HTML attributes of the input in images_dropdown() method.
2678 + * Used to filter shortcode in text widgets
4337 2679 *
4338 - * @since 5.0.04
4339 - *
4340 - * @param array $args The arguments.
4341 - *
4342 - * @return string
2680 + * @deprecated 2.5.4
2681 + * @codeCoverageIgnore
4343 2682 */
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 ) );
4353 - }
4354 -
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 );
2683 + public static function widget_text_filter_callback( $matches ) {
2684 + return FrmDeprecated::widget_text_filter_callback( $matches );
4364 2685 }
4365 2686
4366 2687 /**
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
2688 + * @deprecated 3.01
2689 + * @codeCoverageIgnore
4373 2690 */
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' );
2691 + public static function sanitize_array( &$values ) {
2692 + FrmDeprecated::sanitize_array( $values );
4379 2693 }
4380 2694
4381 2695 /**
4382 - * Gets the image of each option in images_dropdown() method.
2696 + * @param array $settings
2697 + * @param string $group
4383 2698 *
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
2699 + * @since 2.0.6
2700 + * @deprecated 2.05.06
2701 + * @codeCoverageIgnore
4390 2702 */
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 );
2703 + public static function save_settings( $settings, $group ) {
2704 + return FrmDeprecated::save_settings( $settings, $group );
4410 2705 }
4411 2706
4412 2707 /**
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
2708 + * @since 2.0.4
2709 + * @deprecated 2.05.06
2710 + * @codeCoverageIgnore
4421 2711 */
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'];
4427 - }
4428 -
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 );
2712 + public static function save_json_post( $settings ) {
2713 + return FrmDeprecated::save_json_post( $settings );
4440 2714 }
4441 2715
4442 2716 /**
4443 - * Gets the custom HTML attributes of each option in images_dropdown() method.
2717 + * @since 2.0
2718 + * @deprecated 2.05.06
2719 + * @codeCoverageIgnore
4444 2720 *
4445 - * @since 5.0.04
2721 + * @param string $cache_key The unique name for this cache
2722 + * @param string $group The name of the cache group
2723 + * @param string $query If blank, don't run a db call
2724 + * @param string $type The wpdb function to use with this query
4446 2725 *
4447 - * @param array $option Option data.
4448 - * @param array $args The arguments of images_dropdown() method.
4449 - *
4450 - * @return string
2726 + * @return mixed $results The cache or query results
4451 2727 */
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 );
4467 - }
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 );
2728 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
2729 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
4480 2730 }
4481 2731
4482 2732 /**
4483 - * @since 5.0.07
4484 - *
4485 - * @return bool true if the current user is allowed to save unfiltered HTML.
2733 + * @deprecated 2.05.06
2734 + * @codeCoverageIgnore
4486 2735 */
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' );
2736 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
2737 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
4492 2738 }
4493 2739
4494 2740 /**
4495 - * @since 5.0.13
4496 - *
4497 - * @return bool
2741 + * @deprecated 2.05.06
2742 + * @codeCoverageIgnore
4498 2743 */
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 );
2744 + public static function add_key_to_group_cache( $key, $group ) {
2745 + FrmDeprecated::add_key_to_group_cache( $key, $group );
4512 2746 }
4513 2747
4514 2748 /**
4515 - * @since 5.0.07
4516 - *
4517 - * @param array $values
4518 - * @param array $keys
4519 - *
4520 - * @return array
2749 + * @deprecated 2.05.06
2750 + * @codeCoverageIgnore
4521 2751 */
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;
2752 + public static function get_group_cached_keys( $group ) {
2753 + return FrmDeprecated::get_group_cached_keys( $group );
4536 2754 }
4537 2755
4538 2756 /**
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
2757 + * @since 2.0
2758 + * @deprecated 2.05.06
2759 + * @codeCoverageIgnore
2760 + * @return mixed The cached value or false
4548 2761 */
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;
2762 + public static function check_cache_and_transient( $cache_key ) {
2763 + return FrmDeprecated::check_cache( $cache_key );
4554 2764 }
4555 2765
4556 2766 /**
4557 - * Check if an option attribute used in an [input] shortcode is safe.
2767 + * @since 2.0
2768 + * @deprecated 2.05.06
2769 + * @codeCoverageIgnore
4558 2770 *
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
2771 + * @param string $cache_key
4565 2772 */
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 );
2773 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
2774 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
4611 2775 }
4612 2776
4613 2777 /**
4614 - * @since 5.0.16
2778 + * @since 2.0
2779 + * @deprecated 2.05.06
2780 + * @codeCoverageIgnore
4615 2781 *
4616 - * @param string $medium
4617 - *
4618 - * @return array
2782 + * @param string $group The name of the cache group
4619 2783 */
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 );
2784 + public static function cache_delete_group( $group ) {
2785 + FrmDeprecated::cache_delete_group( $group );
4629 2786 }
4630 2787
4631 2788 /**
4632 - * @since 5.0.17
2789 + * @since 1.07.10
2790 + * @deprecated 2.05.06
2791 + * @codeCoverageIgnore
4633 2792 *
4634 - * @param string $feature
2793 + * @param string $term The value to escape
4635 2794 *
4636 - * @return bool
2795 + * @return string The escaped value
4637 2796 */
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 );
2797 + public static function esc_like( $term ) {
2798 + return FrmDeprecated::esc_like( $term );
4641 2799 }
4642 2800
4643 2801 /**
4644 - * Enhances upgrade data parameters with installation link and plan requirement information.
2802 + * @param string $order_query
4645 2803 *
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.
2804 + * @deprecated 2.05.06
2805 + * @codeCoverageIgnore
4653 2806 */
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;
2807 + public static function esc_order( $order_query ) {
2808 + return FrmDeprecated::esc_order( $order_query );
4677 2809 }
4678 2810
4679 2811 /**
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
2812 + * @deprecated 2.05.06
2813 + * @codeCoverageIgnore
4688 2814 */
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 );
2815 + public static function esc_order_by( &$order_by ) {
2816 + FrmDeprecated::esc_order_by( $order_by );
4694 2817 }
4695 2818
4696 2819 /**
4697 - * Set the current screen to avoid undefined notices.
2820 + * @param string $limit
4698 2821 *
4699 - * @since 5.2.01
2822 + * @deprecated 2.05.06
2823 + * @codeCoverageIgnore
4700 2824 */
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();
2825 + public static function esc_limit( $limit ) {
2826 + return FrmDeprecated::esc_limit( $limit );
4709 2827 }
4710 2828
4711 2829 /**
4712 - * Shows pill text.
4713 - *
4714 - * @since 5.2.02
4715 - *
4716 - * @param string $text Text in the pill. Default is NEW.
2830 + * @since 2.0
2831 + * @deprecated 2.05.06
2832 + * @codeCoverageIgnore
4717 2833 */
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>';
2834 + public static function prepare_array_values( $array, $type = '%s' ) {
2835 + return FrmDeprecated::prepare_array_values( $array, $type );
4723 2836 }
4724 2837
4725 2838 /**
4726 - * Count the number of decimals digits.
4727 - *
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.
2839 + * @deprecated 2.05.06
2840 + * @codeCoverageIgnore
4733 2841 */
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 ] );
4747 - }
4748 -
4749 - /**
4750 - * Prevent a fatal error in PHP8 if gmt_offset happens to be set an empty string.
4751 - * This is a bug in WordPress. It isn't safe to call current_time( 'timestamp' ) without this with an empty string offset.
4752 - * In the future this might be safe to remove. Keep an eye on the current_time function in functions.php.
4753 - *
4754 - * @since 5.3.1
4755 - *
4756 - * @return void
4757 - */
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;
4776 - }
4777 -
4778 - /**
4779 - * @since 5.3.1
4780 - *
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.
4794 - *
4795 - * @since 5.3.1
4796 - *
4797 - * @return array<string>
4798 - */
4799 - private static function get_form_listing_page_actions() {
4800 - return array( 'list', 'trash', 'untrash', 'destroy' );
4801 - }
4802 -
4803 - /**
4804 - * Safely call get_plugins, importing the required files if they are not yet loaded.
4805 - *
4806 - * @since 5.5
4807 - *
4808 - * @return array
4809 - */
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();
4815 - }
4816 -
4817 - /**
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
4827 - */
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;
4851 - }
4852 -
4853 - /**
4854 - * Display a dismissable warning message and save its dismissal state.
4855 - *
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
4862 - */
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 - );
4897 - }
4898 -
4899 - /**
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
4907 - */
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();
4917 - }
4918 -
4919 - /**
4920 - * Lite license copy.
4921 - * Used in FrmDashboardController & FrmSettingsController
4922 - *
4923 - * @since 6.8
4924 - *
4925 - * @return string
4926 - */
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;
2842 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
2843 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
5083 2844 }
5084 2845 }