PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.2.06
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.2.06
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 +306 -672 6.5.1 → 5.2.06 View file →
@@ -3,21 +3,16 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 - public static $db_version = 98; // Version of the database we are moving to.
7 + public static $db_version = 98; // Version of the database we are moving to.
8 8 public static $pro_db_version = 37; //deprecated
9 - public static $font_version = 7;
9 + public static $font_version = 7;
10 10
11 11 /**
12 - * @var bool $added_gmt_offset_filter
13 - */
14 - private static $added_gmt_offset_filter = false;
15 -
16 - /**
17 12 * @since 2.0
18 13 */
19 - public static $plug_version = '6.5.1';
14 + public static $plug_version = '5.2.06';
20 15
21 16 /**
22 17 * @since 1.07.02
23 18 *
@@ -148,28 +143,12 @@
148 143
149 144 public static function get_menu_name() {
150 145 $frm_settings = self::get_settings();
151 146
152 - return FrmAddonsController::is_license_expired() ? 'Formidable' : $frm_settings->menu;
147 + return $frm_settings->menu;
153 148 }
154 149
155 150 /**
156 - * Determine if the current branding is set to 'formidable'.
157 - *
158 - * Checks the menu title, retrieved through get_menu_name,
159 - * and verifies if it matches the 'formidable' branding.
160 - *
161 - * @since 6.4.2
162 - *
163 - * @return bool True if the menu title is 'formidable', false otherwise.
164 - */
165 - public static function is_formidable_branding() {
166 - $menu_title = self::get_menu_name();
167 -
168 - return 'formidable' === strtolower( trim( $menu_title ) );
169 - }
170 -
171 - /**
172 151 * @since 3.05
173 152 */
174 153 public static function svg_logo( $atts = array() ) {
175 154 $defaults = array(
@@ -268,15 +247,15 @@
268 247 global $pagenow;
269 248 $get_page = self::simple_get( 'page', 'sanitize_title' );
270 249 if ( $pagenow ) {
271 250 // allow this to be true during ajax load i.e. ajax form builder loading
272 - $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
251 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
273 252 if ( $is_page ) {
274 253 return true;
275 254 }
276 255 }
277 256
278 - return is_admin() && $get_page === $page;
257 + return is_admin() && $get_page == $page;
279 258 }
280 259
281 260 /**
282 261 * If the current page is for editing or creating a view.
@@ -348,18 +327,14 @@
348 327 * Check if on an admin page
349 328 *
350 329 * @since 2.0
351 330 *
331 + * @param None
332 + *
352 333 * @return boolean
353 334 */
354 335 public static function is_admin() {
355 - $is_admin = is_admin() && ! wp_doing_ajax();
356 -
357 - /**
358 - * @since 6.0
359 - * @param bool $is_admin
360 - */
361 - return apply_filters( 'frm_is_admin', $is_admin );
336 + return is_admin() && ! wp_doing_ajax();
362 337 }
363 338
364 339 /**
365 340 * Check if value contains blank value or empty array
@@ -392,37 +367,26 @@
392 367 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
393 368 }
394 369
395 370 /**
396 - * Get the server OS
371 + * Check for the IP address in several places
372 + * Used by [ip] shortcode
397 373 *
398 - * @since 6.4.2
399 - *
400 - * @return string
401 - */
402 - public static function get_server_os() {
403 - if ( function_exists( 'php_uname' ) ) {
404 - return php_uname( 's' );
405 - }
406 -
407 - if ( ! defined( 'PHP_OS' ) ) {
408 - return '';
409 - }
410 -
411 - // match the same response for Windows server as php_uname('s')
412 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
413 - }
414 -
415 - /**
416 - * Check for the IP address in several places (when custom headers are enabled).
417 - * Used by [ip] shortcode.
418 - *
419 374 * @return string The IP address of the current user
420 375 */
421 376 public static function get_ip_address() {
422 - $ip_options = self::should_use_custom_header_ip() ? self::get_custom_header_keys_for_ip() : array( 'REMOTE_ADDR' );
423 - $ip = '';
424 -
377 + $ip_options = array(
378 + 'HTTP_CLIENT_IP',
379 + 'HTTP_CF_CONNECTING_IP',
380 + 'HTTP_X_FORWARDED_FOR',
381 + 'HTTP_X_FORWARDED',
382 + 'HTTP_X_CLUSTER_CLIENT_IP',
383 + 'HTTP_X_REAL_IP',
384 + 'HTTP_FORWARDED_FOR',
385 + 'HTTP_FORWARDED',
386 + 'REMOTE_ADDR',
387 + );
388 + $ip = '';
425 389 foreach ( $ip_options as $key ) {
426 390 if ( ! isset( $_SERVER[ $key ] ) ) {
427 391 continue;
428 392 }
@@ -428,9 +392,9 @@
428 392 }
429 393
430 394 $key = self::get_server_value( $key );
431 395 foreach ( explode( ',', $key ) as $ip ) {
432 - $ip = trim( $ip ); // Just to be safe.
396 + $ip = trim( $ip ); // just to be safe.
433 397
434 398 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
435 399 return sanitize_text_field( $ip );
436 400 }
@@ -439,52 +403,8 @@
439 403
440 404 return sanitize_text_field( $ip );
441 405 }
442 406
443 - /**
444 - * @since 6.1
445 - *
446 - * @return array
447 - */
448 - public static function get_custom_header_keys_for_ip() {
449 - return array(
450 - 'HTTP_CLIENT_IP',
451 - 'HTTP_CF_CONNECTING_IP',
452 - 'HTTP_X_FORWARDED_FOR',
453 - 'HTTP_X_FORWARDED',
454 - 'HTTP_X_CLUSTER_CLIENT_IP',
455 - 'HTTP_X_REAL_IP',
456 - 'HTTP_FORWARDED_FOR',
457 - 'HTTP_FORWARDED',
458 - 'REMOTE_ADDR',
459 - );
460 - }
461 -
462 - /**
463 - * Check if we should check every HTTP header or just $_SERVER['REMOTE_ADDR'].
464 - * The other HTTP headers can be spoofed so this isn't recommended.
465 - * But in some cases (like reverse proxies), the IP may be empty if you use $_SERVER['REMOTE_ADDR'].
466 - *
467 - * @since 6.1
468 - *
469 - * @return bool
470 - */
471 - private static function should_use_custom_header_ip() {
472 - $settings = self::get_settings();
473 - $should_use_custom_header_ip = ! $settings->no_ips && $settings->custom_header_ip;
474 -
475 - /**
476 - * Filter whether to check spoofable HTTP headers.
477 - * This uses the custom_header_ip setting, but it is hidden if the GDPR option is also on.
478 - * 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.
479 - *
480 - * @since 6.1
481 - *
482 - * @param bool $should_use_custom_header_ip
483 - */
484 - return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
485 - }
486 -
487 407 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
488 408 if ( strpos( $param, '[' ) ) {
489 409 $params = explode( '[', $param );
490 410 $param = $params[0];
@@ -573,14 +493,14 @@
573 493 );
574 494 $args = wp_parse_args( $args, $defaults );
575 495
576 496 $value = $args['default'];
577 - if ( $args['type'] === 'get' ) {
497 + if ( $args['type'] == 'get' ) {
578 498 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
579 499 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
580 500 $value = wp_unslash( $_GET[ $args['param'] ] );
581 501 }
582 - } elseif ( $args['type'] === 'post' ) {
502 + } elseif ( $args['type'] == 'post' ) {
583 503 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
584 504 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
585 505 $value = wp_unslash( $_POST[ $args['param'] ] );
586 506 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
@@ -1001,18 +921,8 @@
1001 921
1002 922 $html_atts = self::array_to_html_params( $atts );
1003 923
1004 924 $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1005 -
1006 - // Replace icons that have been removed.
1007 - $deprecated = array(
1008 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1009 - );
1010 - if ( isset( $deprecated[ $icon ] ) ) {
1011 - $icon = $deprecated[ $icon ];
1012 - $class = str_replace( $icon, $deprecated[ $icon ], $class );
1013 - }
1014 -
1015 925 if ( $icon === $class ) {
1016 926 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1017 927 } else {
1018 928 $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
@@ -1069,9 +979,9 @@
1069 979 * @param array $allowed_attr
1070 980 * @return array
1071 981 */
1072 982 public static function allow_vars_in_styles( $allowed_attr ) {
1073 - $allowed_attr[] = '--primary-700';
983 + $allowed_attr[] = '--primary-hover';
1074 984 return $allowed_attr;
1075 985 }
1076 986
1077 987 /**
@@ -1080,9 +990,9 @@
1080 990 * @param bool $allow_css
1081 991 * @param string $css_string
1082 992 */
1083 993 public static function allow_style( $allow_css, $css_string ) {
1084 - if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
994 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-hover:' ) ) {
1085 995 $split = explode( ':', $css_string, 2 );
1086 996 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1087 997 }
1088 998 return $allow_css;
@@ -1111,9 +1021,9 @@
1111 1021 *
1112 1022 * @since 4.0.02
1113 1023 */
1114 1024 public static function include_svg() {
1115 - include_once self::plugin_path() . '/images/icons.svg';
1025 + include_once( self::plugin_path() . '/images/icons.svg' );
1116 1026 }
1117 1027
1118 1028 /**
1119 1029 * Convert an associative array to HTML values.
@@ -1149,11 +1059,9 @@
1149 1059 if ( ! $echo ) {
1150 1060 ob_start();
1151 1061 }
1152 1062
1153 - if ( is_callable( $echo_function ) ) {
1154 - $echo_function();
1155 - }
1063 + $echo_function();
1156 1064
1157 1065 if ( ! $echo ) {
1158 1066 $return = ob_get_contents();
1159 1067 ob_end_clean();
@@ -1176,94 +1084,31 @@
1176 1084 include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1177 1085 }
1178 1086
1179 1087 /**
1180 - * @since 6.0
1181 - *
1182 - * @param string $type
1183 - * @return void
1184 - */
1185 - public static function import_link( $type = 'secondary' ) {
1186 - ?>
1187 - <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">
1188 - <?php esc_html_e( 'Import', 'formidable' ); ?>
1189 - </a>
1190 - <?php
1191 - }
1192 -
1193 - /**
1194 - * Print applicable admin banner.
1195 - *
1196 - * @since 5.4.2
1197 - *
1198 - * @param bool $should_show_lite_upgrade
1199 - * @return void
1200 - */
1201 - public static function print_admin_banner( $should_show_lite_upgrade ) {
1202 - if ( ! current_user_can( 'administrator' ) ) {
1203 - FrmInbox::maybe_show_banner();
1204 - return;
1205 - }
1206 -
1207 - if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1208 - // Print license warning or inbox banner and exit if either prints.
1209 - // And exit before printing the upgrade bar if it shouldn't be shown.
1210 - return;
1211 - }
1212 - ?>
1213 - <div class="frm-upgrade-bar">
1214 - <span>You're using Formidable Forms Lite. To unlock more features consider</span>
1215 - <a href="<?php echo esc_url( self::admin_upgrade_link( 'top-bar' ) ); ?>" target="_blank" rel="noopener">upgrading to Pro</a>.
1216 - </div>
1217 - <?php
1218 - }
1219 -
1220 - /**
1221 - * @since 5.4.2
1222 - *
1223 - * @return bool True if a banner is available and shown.
1224 - */
1225 - private static function maybe_show_license_warning() {
1226 - return is_callable( 'FrmProAddonsController::admin_banner' ) && FrmProAddonsController::admin_banner();
1227 - }
1228 -
1229 - /**
1230 - * Render a button for a new item (Form, Application, etc).
1231 - *
1232 1088 * @since 3.0
1233 - * @param array $atts {
1234 - * @type array $link_hook Custom link hook, calls do_action and exits early.
1235 - * @type string $new_link Href value, default #.
1236 - * @type string $class Custom class names, space separated.
1237 - * @type string $button_text Button text. Default "Add New".
1238 - * }
1239 - * @return void
1089 + * @param array $atts
1240 1090 */
1241 1091 public static function add_new_item_link( $atts ) {
1242 - if ( isset( $atts['link_hook'] ) ) {
1092 + if ( ! empty( $atts['new_link'] ) ) {
1093 + ?>
1094 + <a href="<?php echo esc_url( $atts['new_link'] ); ?>" class="button button-primary frm-button-primary frm-with-plus">
1095 + <?php self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' ); ?>
1096 + <?php esc_html_e( 'Add New', 'formidable' ); ?>
1097 + </a>
1098 + <?php
1099 + } elseif ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1100 + ?>
1101 + <a href="#" class="button button-primary frm-button-primary frm-with-plus frm-trigger-new-form-modal">
1102 + <?php
1103 + self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' );
1104 + esc_html_e( 'Add New', 'formidable' );
1105 + ?>
1106 + </a>
1107 + <?php
1108 + } elseif ( isset( $atts['link_hook'] ) ) {
1243 1109 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1244 - return;
1245 1110 }
1246 -
1247 - if ( empty( $atts['new_link'] ) && empty( $atts['trigger_new_form_modal'] ) && empty( $atts['class'] ) ) {
1248 - // Do not render a button if none of these attributes are set.
1249 - return;
1250 - }
1251 -
1252 - $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1253 - $class = 'button button-primary frm-button-primary';
1254 -
1255 - if ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1256 - $class .= ' frm-trigger-new-form-modal';
1257 - }
1258 -
1259 - if ( ! empty( $atts['class'] ) ) {
1260 - $class .= ' ' . $atts['class'];
1261 - }
1262 -
1263 - $button_text = ! empty( $atts['button_text'] ) ? $atts['button_text'] : __( 'Add New', 'formidable' );
1264 -
1265 - require self::plugin_path() . '/classes/views/shared/add-button.php';
1266 1111 }
1267 1112
1268 1113 /**
1269 1114 * @since 3.06
@@ -1321,14 +1166,11 @@
1321 1166 }
1322 1167 }
1323 1168
1324 1169 /**
1325 - * Save all front-end js scripts into a single file.
1326 - * And save an additional single file of all front-end Stripe JS scripts.
1170 + * Save all front-end js scripts into a single file
1327 1171 *
1328 1172 * @since 3.0
1329 - *
1330 - * @return void
1331 1173 */
1332 1174 public static function save_combined_js() {
1333 1175 $file_atts = apply_filters(
1334 1176 'frm_js_location',
@@ -1341,34 +1183,10 @@
1341 1183
1342 1184 $files = array(
1343 1185 self::plugin_path() . '/js/formidable.min.js',
1344 1186 );
1345 - /**
1346 - * @param array $files
1347 - */
1348 1187 $files = apply_filters( 'frm_combined_js_files', $files );
1349 1188 $new_file->combine_files( $files );
1350 -
1351 - // Create the minified Stripe Script.
1352 - $file_atts = apply_filters(
1353 - 'frm_stripe_js_location',
1354 - array(
1355 - 'file_name' => 'frmstrp.min.js',
1356 - 'new_file_path' => self::plugin_path() . '/js',
1357 - )
1358 - );
1359 - $new_file = new FrmCreateFile( $file_atts );
1360 - $files = array(
1361 - FrmStrpLiteAppHelper::plugin_path() . 'js/frmstrp.min.js',
1362 - );
1363 -
1364 - /**
1365 - * @since 6.5
1366 - *
1367 - * @param array $files
1368 - */
1369 - $files = apply_filters( 'frm_stripe_combined_js_files', $files );
1370 - $new_file->combine_files( $files );
1371 1189 }
1372 1190
1373 1191 /**
1374 1192 * Check a value from a shortcode to see if true or false.
@@ -1529,8 +1347,9 @@
1529 1347 public static function post_edit_link( $post_id ) {
1530 1348 $post = get_post( $post_id );
1531 1349 if ( $post ) {
1532 1350 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1351 + $post_url = self::maybe_full_screen_link( $post_url );
1533 1352
1534 1353 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
1535 1354 }
1536 1355
@@ -1540,64 +1359,25 @@
1540 1359 /**
1541 1360 * Hide the WordPress menus on some pages.
1542 1361 *
1543 1362 * @since 4.0
1544 - *
1545 - * @return bool
1546 1363 */
1547 1364 public static function is_full_screen() {
1548 - return self::is_form_builder_page() ||
1549 - self::is_style_editor_page() ||
1550 - self::is_full_screen_view_builder_page();
1551 - }
1365 + $full_builder = self::is_form_builder_page();
1366 + $styler = self::is_admin_page( 'formidable-styles' ) || self::is_admin_page( 'formidable-styles2' );
1367 + $full_entries = self::simple_get( 'frm-full', 'absint' );
1552 1368
1553 - /**
1554 - * Check if user is on the style editor or its alternative URL.
1555 - * The first URL is a submenu "Styles" in the Formidable menu /wp-admin/admin.php?page=formidable-styles.
1556 - * The alternative URL is linked as a submenu "Forms" item of the Appearance menu /wp-admin/themes.php?page=formidable-styles2.
1557 - *
1558 - * @since 5.5.3
1559 - * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
1560 - *
1561 - * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
1562 - * @return bool
1563 - */
1564 - public static function is_style_editor_page( $view = '' ) {
1565 - if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
1566 - return false;
1567 - }
1568 -
1569 - if ( ! in_array( $view, array( 'list', 'edit' ), true ) ) {
1570 - return true;
1571 - }
1572 -
1573 - $action = self::simple_get( 'frm_action' );
1574 - $is_edit_mode = 'edit' === $action || ( ! $action && ! self::simple_get( 'id' ) && ! self::simple_get( 'form' ) );
1575 -
1576 - if ( ! $is_edit_mode && class_exists( 'FrmProStylesController' ) && in_array( $action, array( 'new_style', 'duplicate' ), true ) ) {
1577 - $is_edit_mode = true;
1578 - }
1579 -
1580 - $checking_for_edit_mode = 'edit' === $view;
1581 -
1582 - return $is_edit_mode === $checking_for_edit_mode;
1369 + return $full_builder || $full_entries || $styler || self::is_view_builder_page();
1583 1370 }
1584 1371
1585 1372 /**
1586 - * @since 5.5.3
1587 - *
1588 - * @return bool
1589 - */
1590 - private static function is_full_screen_view_builder_page() {
1591 - return self::is_admin_page( 'formidable-views-editor' );
1592 - }
1593 -
1594 - /**
1595 1373 * @since 4.0
1596 - * @deprecated 5.5.3
1597 1374 */
1598 1375 public static function maybe_full_screen_link( $link ) {
1599 - _deprecated_function( __METHOD__, '5.5.3' );
1376 + $is_full = self::simple_get( 'frm-full', 'absint' );
1377 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1378 + $link .= '&frm-full=1';
1379 + }
1600 1380 return $link;
1601 1381 }
1602 1382
1603 1383 /**
@@ -1657,10 +1437,19 @@
1657 1437 * @param string $type Supports `auto`, `pro`, or `pro_only`.
1658 1438 * @return array
1659 1439 */
1660 1440 public static function frm_capabilities( $type = 'auto' ) {
1661 - if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
1662 - return self::get_lite_capabilities();
1441 + $cap = array(
1442 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1443 + 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1444 + 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1445 + 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1446 + 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1447 + 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1448 + );
1449 +
1450 + if ( ! self::pro_is_installed() && 'pro' !== $type && 'pro_only' !== $type ) {
1451 + return $cap;
1663 1452 }
1664 1453
1665 1454 $pro_cap = array(
1666 1455 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
@@ -1667,41 +1456,17 @@
1667 1456 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
1668 1457 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1669 1458 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
1670 1459 );
1671 - /**
1672 - * @since 5.3.1
1673 - *
1674 - * @param array<string,string> $pro_cap
1675 - */
1676 - $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
1677 1460
1678 1461 if ( 'pro_only' === $type ) {
1679 1462 return $pro_cap;
1680 1463 }
1681 1464
1682 - return self::get_lite_capabilities() + $pro_cap;
1465 + return $cap + $pro_cap;
1683 1466 }
1684 1467
1685 1468 /**
1686 - * Get the list of lite plugin capabilities.
1687 - *
1688 - * @since 5.3.1
1689 - *
1690 - * @return array<string,string>
1691 - */
1692 - private static function get_lite_capabilities() {
1693 - return array(
1694 - 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1695 - 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1696 - 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1697 - 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1698 - 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1699 - 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1700 - );
1701 - }
1702 -
1703 - /**
1704 1469 * Call the WordPress current_user_can but also validate empty strings as true for any logged in user
1705 1470 *
1706 1471 * @since 4.06.03
1707 1472 *
@@ -1901,9 +1666,9 @@
1901 1666 foreach ( $array as $key => $value ) {
1902 1667 if ( is_array( $value ) ) {
1903 1668 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
1904 1669 } else {
1905 - if ( $keys === 'keep' ) {
1670 + if ( $keys == 'keep' ) {
1906 1671 $return[ $key ] = $value;
1907 1672 } else {
1908 1673 $return[] = $value;
1909 1674 }
@@ -1987,9 +1752,9 @@
1987 1752 return $user_id;
1988 1753 }
1989 1754
1990 1755 $user_id = sanitize_text_field( $user_id );
1991 - if ( $user_id === 'current' ) {
1756 + if ( $user_id == 'current' ) {
1992 1757 $user_id = get_current_user_id();
1993 1758 } else {
1994 1759 if ( is_email( $user_id ) ) {
1995 1760 $user = get_user_by( 'email', $user_id );
@@ -2457,9 +2222,9 @@
2457 2222 *
2458 2223 * @return string $time_ago
2459 2224 */
2460 2225 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
2461 - if ( empty( $to ) && 0 !== $to ) {
2226 + if ( empty( $to ) ) {
2462 2227 $now = new DateTime();
2463 2228 } else {
2464 2229 $now = new DateTime( '@' . $to );
2465 2230 }
@@ -2710,9 +2475,8 @@
2710 2475 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
2711 2476 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <[email protected]> or [email protected].', 'formidable' ),
2712 2477 /* translators: %1$s: Form name, %2$s: Date */
2713 2478 '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() ) ),
2714 - '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' ),
2715 2479 );
2716 2480
2717 2481 if ( ! isset( $tooltips[ $name ] ) ) {
2718 2482 return;
@@ -2739,12 +2503,8 @@
2739 2503 return;
2740 2504 }
2741 2505
2742 2506 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
2743 - if ( 'lite-reports' === $frm_action ) {
2744 - $frm_action = 'reports';
2745 - }
2746 -
2747 2507 if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
2748 2508 echo ' class="current_page"';
2749 2509 }
2750 2510 }
@@ -2801,15 +2561,12 @@
2801 2561 }
2802 2562 }
2803 2563
2804 2564 /**
2805 - * Check for either json or serialized data. This is temporary while transitioning
2565 + * Check for either json or serilized data. This is temporary while transitioning
2806 2566 * all data to json.
2807 2567 *
2808 2568 * @since 4.02.03
2809 - *
2810 - * @param array|string $value
2811 - * @return void
2812 2569 */
2813 2570 public static function unserialize_or_decode( &$value ) {
2814 2571 if ( is_array( $value ) ) {
2815 2572 return;
@@ -2815,9 +2572,9 @@
2815 2572 return;
2816 2573 }
2817 2574
2818 2575 if ( is_serialized( $value ) ) {
2819 - $value = self::maybe_unserialize_array( $value );
2576 + $value = maybe_unserialize( $value );
2820 2577 } else {
2821 2578 $value = self::maybe_json_decode( $value, false );
2822 2579 }
2823 2580 }
@@ -2822,35 +2579,8 @@
2822 2579 }
2823 2580 }
2824 2581
2825 2582 /**
2826 - * Safely unserialize an array if necessary.
2827 - * This function doesn't actually use unserialize. The string is parsed instead.
2828 - *
2829 - * @since 6.2
2830 - *
2831 - * @param mixed $value
2832 - * @return mixed
2833 - */
2834 - public static function maybe_unserialize_array( $value ) {
2835 - if ( ! is_string( $value ) ) {
2836 - return $value;
2837 - }
2838 -
2839 - // Since we only expect an array, skip anything that doesn't start with a:.
2840 - if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
2841 - return $value;
2842 - }
2843 -
2844 - $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
2845 - if ( is_array( $parsed ) ) {
2846 - $value = $parsed;
2847 - }
2848 -
2849 - return $value;
2850 - }
2851 -
2852 - /**
2853 2583 * Decode a JSON string.
2854 2584 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
2855 2585 *
2856 2586 * @param mixed $string
@@ -2877,36 +2607,8 @@
2877 2607 return $string;
2878 2608 }
2879 2609
2880 2610 /**
2881 - * @since 6.2.3
2882 - *
2883 - * @param string $value
2884 - * @return string
2885 - */
2886 - public static function maybe_utf8_encode( $value ) {
2887 - $from_format = 'ISO-8859-1';
2888 - $to_format = 'UTF-8';
2889 -
2890 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
2891 - if ( mb_check_encoding( $value, $from_format ) ) {
2892 - return mb_convert_encoding( $value, $to_format, $from_format );
2893 - }
2894 - return $value;
2895 - }
2896 -
2897 - if ( function_exists( 'iconv' ) ) {
2898 - $converted = iconv( $from_format, $to_format, $value );
2899 - // Value is false if $value is not ISO-8859-1.
2900 - if ( false !== $converted ) {
2901 - return $converted;
2902 - }
2903 - }
2904 -
2905 - return $value;
2906 - }
2907 -
2908 - /**
2909 2611 * Reformat the json serialized array in name => value array.
2910 2612 *
2911 2613 * @since 4.02.03
2912 2614 */
@@ -2972,17 +2674,14 @@
2972 2674 $version = self::plugin_version();
2973 2675 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
2974 2676
2975 2677 $global_strings = array(
2976 - 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2977 - 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2978 - 'url' => self::plugin_url(),
2979 - 'app_url' => 'https://formidableforms.com/',
2980 - 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
2981 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
2982 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
2983 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
2984 - 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
2678 + 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2679 + 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2680 + 'url' => self::plugin_url(),
2681 + 'app_url' => 'https://formidableforms.com/',
2682 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2683 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2985 2684 );
2986 2685 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
2987 2686
2988 2687 if ( $load ) {
@@ -3002,10 +2701,13 @@
3002 2701 */
3003 2702 public static function localize_script( $location ) {
3004 2703 global $wp_scripts;
3005 2704
2705 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2706 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2707 +
3006 2708 $script_strings = array(
3007 - 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
2709 + 'ajax_url' => $ajax_url,
3008 2710 'images_url' => self::plugin_url() . '/images',
3009 2711 'loading' => __( 'Loading&hellip;', 'formidable' ),
3010 2712 'remove' => __( 'Remove', 'formidable' ),
3011 2713 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
@@ -3019,72 +2721,69 @@
3019 2721 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3020 2722 );
3021 2723
3022 2724 $data = $wp_scripts->get_data( 'formidable', 'data' );
3023 - if ( ! $data ) {
2725 + if ( empty( $data ) ) {
3024 2726 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3025 2727 }
3026 2728
3027 - if ( $location === 'admin' ) {
2729 + if ( $location == 'admin' ) {
3028 2730 $frm_settings = self::get_settings();
3029 2731 $admin_script_strings = array(
3030 - 'desc' => __( '(Click to add description)', 'formidable' ),
3031 - 'blank' => __( '(Blank)', 'formidable' ),
3032 - 'no_label' => __( '(no label)', 'formidable' ),
3033 - 'ok' => __( 'OK', 'formidable' ),
3034 - 'cancel' => __( 'Cancel', 'formidable' ),
3035 - 'default_label' => __( 'Default', 'formidable' ),
3036 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3037 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3038 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3039 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3040 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3041 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3042 - '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' ),
3043 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3044 - 'default_unique' => $frm_settings->unique_msg,
3045 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3046 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3047 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3048 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3049 - 'new_option' => __( 'New Option', 'formidable' ),
3050 - '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' ),
3051 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3052 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3053 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3054 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3055 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3056 - 'private_label' => __( 'Private', 'formidable' ),
3057 - 'jquery_ui_url' => '',
3058 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3059 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3060 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3061 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3062 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3063 - 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
3064 - 'unsafe_params' => FrmFormsHelper::reserved_words(),
2732 + 'desc' => __( '(Click to add description)', 'formidable' ),
2733 + 'blank' => __( '(Blank)', 'formidable' ),
2734 + 'no_label' => __( '(no label)', 'formidable' ),
2735 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2736 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2737 + 'ok' => __( 'OK', 'formidable' ),
2738 + 'cancel' => __( 'Cancel', 'formidable' ),
2739 + 'default_label' => __( 'Default', 'formidable' ),
2740 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2741 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2742 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2743 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2744 + 'caution' => __( 'Heads up', 'formidable' ),
2745 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2746 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2747 + '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' ),
2748 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2749 + 'default_unique' => $frm_settings->unique_msg,
2750 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2751 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2752 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2753 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2754 + 'new_option' => __( 'New Option', 'formidable' ),
2755 + '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' ),
2756 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2757 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2758 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2759 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2760 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2761 + 'private_label' => __( 'Private', 'formidable' ),
2762 + 'jquery_ui_url' => '',
2763 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2764 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2765 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2766 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2767 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2768 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2769 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3065 2770 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3066 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
2771 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3067 2772 /* 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. */
3068 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3069 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3070 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3071 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3072 - 'install' => __( 'Install', 'formidable' ),
3073 - 'active' => __( 'Active', 'formidable' ),
3074 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3075 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3076 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3077 - 'saving' => '', // Deprecated in 6.0.
3078 - 'saved' => '', // Deprecated in 6.0.
2773 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2774 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2775 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2776 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2777 + 'install' => __( 'Install', 'formidable' ),
2778 + 'active' => __( 'Active', 'formidable' ),
2779 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2780 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3079 2781 );
3080 - /**
3081 - * @param array $admin_script_strings
3082 - */
3083 2782 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3084 2783
3085 2784 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3086 - if ( ! $data ) {
2785 + if ( empty( $data ) ) {
3087 2786 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3088 2787 }
3089 2788 }
3090 2789 }
@@ -3089,24 +2788,8 @@
3089 2788 }
3090 2789 }
3091 2790
3092 2791 /**
3093 - * @since 6.5
3094 - *
3095 - * @return string
3096 - */
3097 - public static function get_ajax_url() {
3098 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
3099 -
3100 - /**
3101 - * @since 2.0.13
3102 - *
3103 - * @param string $ajax_url
3104 - */
3105 - return apply_filters( 'frm_ajax_url', $ajax_url );
3106 - }
3107 -
3108 - /**
3109 2792 * Returns whether or not the first errored input should be auto-focused (default true).
3110 2793 *
3111 2794 * @since 5.2.05
3112 2795 *
@@ -3151,10 +2834,8 @@
3151 2834 /**
3152 2835 * If Pro is far outdated, show a message.
3153 2836 *
3154 2837 * @since 4.0.01
3155 - *
3156 - * @return void
3157 2838 */
3158 2839 public static function min_pro_version_notice( $min_version ) {
3159 2840 if ( ! self::is_formidable_admin() ) {
3160 2841 // Don't show admin-wide.
@@ -3170,9 +2851,9 @@
3170 2851
3171 2852 $pro_version = FrmProDb::$plug_version;
3172 2853 $expired = FrmAddonsController::is_license_expired();
3173 2854 ?>
3174 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2855 + <div class="error frm_previous_install">
3175 2856 <?php
3176 2857 esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3177 2858 if ( empty( $expired ) ) {
3178 2859 echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
@@ -3211,9 +2892,9 @@
3211 2892 }
3212 2893
3213 2894 foreach ( $message as $m ) {
3214 2895 ?>
3215 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2896 + <div class="error frm_previous_install">
3216 2897 <?php echo esc_html( $m ); ?>
3217 2898 </div>
3218 2899 <?php
3219 2900 }
@@ -3218,25 +2899,17 @@
3218 2899 <?php
3219 2900 }
3220 2901 }
3221 2902
3222 - /**
3223 - * @param string $type
3224 - * @return array<string,string>
3225 - */
3226 2903 public static function locales( $type = 'date' ) {
3227 2904 $locales = array(
3228 2905 'en' => __( 'English', 'formidable' ),
3229 2906 'af' => __( 'Afrikaans', 'formidable' ),
3230 2907 'sq' => __( 'Albanian', 'formidable' ),
3231 - 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
3232 - 'am' => __( 'Amharic', 'formidable' ),
3233 2908 'ar' => __( 'Arabic', 'formidable' ),
3234 2909 'hy' => __( 'Armenian', 'formidable' ),
3235 2910 'az' => __( 'Azerbaijani', 'formidable' ),
3236 2911 'eu' => __( 'Basque', 'formidable' ),
3237 - 'be' => __( 'Belarusian', 'formidable' ),
3238 - 'bn' => __( 'Bengali', 'formidable' ),
3239 2912 'bs' => __( 'Bosnian', 'formidable' ),
3240 2913 'bg' => __( 'Bulgarian', 'formidable' ),
3241 2914 'ca' => __( 'Catalan', 'formidable' ),
3242 2915 'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
@@ -3255,15 +2928,12 @@
3255 2928 'fi' => __( 'Finnish', 'formidable' ),
3256 2929 'fr' => __( 'French', 'formidable' ),
3257 2930 'fr-CA' => __( 'French/Canadian', 'formidable' ),
3258 2931 'fr-CH' => __( 'French/Swiss', 'formidable' ),
3259 - 'gl' => __( 'Galician', 'formidable' ),
3260 - 'ka' => __( 'Georgian', 'formidable' ),
3261 2932 'de' => __( 'German', 'formidable' ),
3262 2933 'de-AT' => __( 'German/Austria', 'formidable' ),
3263 2934 'de-CH' => __( 'German/Switzerland', 'formidable' ),
3264 2935 'el' => __( 'Greek', 'formidable' ),
3265 - 'gu' => __( 'Gujarati', 'formidable' ),
3266 2936 'he' => __( 'Hebrew', 'formidable' ),
3267 2937 'iw' => __( 'Hebrew', 'formidable' ),
3268 2938 'hi' => __( 'Hindi', 'formidable' ),
3269 2939 'hu' => __( 'Hungarian', 'formidable' ),
@@ -3270,74 +2940,44 @@
3270 2940 'is' => __( 'Icelandic', 'formidable' ),
3271 2941 'id' => __( 'Indonesian', 'formidable' ),
3272 2942 'it' => __( 'Italian', 'formidable' ),
3273 2943 'ja' => __( 'Japanese', 'formidable' ),
3274 - 'kn' => __( 'Kannada', 'formidable' ),
3275 - 'kk' => __( 'Kazakh', 'formidable' ),
3276 - 'km' => __( 'Khmer', 'formidable' ),
3277 2944 'ko' => __( 'Korean', 'formidable' ),
3278 - 'ky' => __( 'Kyrgyz', 'formidable' ),
3279 - 'lo' => __( 'Laothian', 'formidable' ),
3280 2945 'lv' => __( 'Latvian', 'formidable' ),
3281 2946 'lt' => __( 'Lithuanian', 'formidable' ),
3282 - 'lb' => __( 'Luxembourgish', 'formidable' ),
3283 - 'mk' => __( 'Macedonian', 'formidable' ),
3284 - 'ml' => __( 'Malayalam', 'formidable' ),
3285 2947 'ms' => __( 'Malaysian', 'formidable' ),
3286 - 'mr' => __( 'Marathi', 'formidable' ),
3287 2948 'no' => __( 'Norwegian', 'formidable' ),
3288 - 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
3289 - 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
3290 2949 'pl' => __( 'Polish', 'formidable' ),
3291 2950 'pt' => __( 'Portuguese', 'formidable' ),
3292 2951 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3293 2952 'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
3294 - 'rm' => __( 'Romansh', 'formidable' ),
3295 2953 'ro' => __( 'Romanian', 'formidable' ),
3296 2954 'ru' => __( 'Russian', 'formidable' ),
3297 2955 'sr' => __( 'Serbian', 'formidable' ),
3298 2956 'sr-SR' => __( 'Serbian', 'formidable' ),
3299 - 'si' => __( 'Sinhalese', 'formidable' ),
3300 2957 'sk' => __( 'Slovak', 'formidable' ),
3301 2958 'sl' => __( 'Slovenian', 'formidable' ),
3302 2959 'es' => __( 'Spanish', 'formidable' ),
3303 2960 'es-419' => __( 'Spanish/Latin America', 'formidable' ),
3304 - 'sw' => __( 'Swahili', 'formidable' ),
3305 2961 'sv' => __( 'Swedish', 'formidable' ),
3306 2962 'ta' => __( 'Tamil', 'formidable' ),
3307 - 'te' => __( 'Telugu', 'formidable' ),
3308 2963 'th' => __( 'Thai', 'formidable' ),
3309 - 'tj' => __( 'Tajiki', 'formidable' ),
3310 2964 'tr' => __( 'Turkish', 'formidable' ),
3311 2965 'uk' => __( 'Ukrainian', 'formidable' ),
3312 - 'ur' => __( 'Urdu', 'formidable' ),
3313 2966 'vi' => __( 'Vietnamese', 'formidable' ),
3314 - 'cy-GB' => __( 'Welsh', 'formidable' ),
3315 - 'zu' => __( 'Zulu', 'formidable' ),
3316 2967 );
3317 2968
3318 2969 if ( $type === 'captcha' ) {
3319 2970 // remove the languages unavailable for the captcha
3320 - $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
2971 + $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
3321 2972 } else {
3322 2973 // remove the languages unavailable for the datepicker
3323 - $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' );
2974 + $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
3324 2975 }
3325 2976
3326 2977 $locales = array_diff_key( $locales, array_flip( $unset ) );
2978 + $locales = apply_filters( 'frm_locales', $locales );
3327 2979
3328 - /**
3329 - * Filter available locale options.
3330 - *
3331 - * @since 5.4.5 Added $args parameter with type.
3332 - *
3333 - * @param array<string,string> $locales
3334 - * @param array $args {
3335 - * @type string $type
3336 - * }
3337 - */
3338 - $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3339 -
3340 2980 return $locales;
3341 2981 }
3342 2982
3343 2983 /**
@@ -3643,12 +3283,11 @@
3643 3283 * @return array
3644 3284 */
3645 3285 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
3646 3286 $params = array(
3647 - 'medium' => $medium,
3648 - 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
3649 - 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
3650 - 'screenshot' => 'landing.png',
3287 + 'medium' => $medium,
3288 + 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
3289 + 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
3651 3290 );
3652 3291 return self::get_upgrade_data_params( 'landing', $params );
3653 3292 }
3654 3293
@@ -3730,8 +3369,36 @@
3730 3369 set_current_screen();
3731 3370 }
3732 3371
3733 3372 /**
3373 + * @since 4.07
3374 + * @deprecated 4.09.01
3375 + */
3376 + public static function renewal_message() {
3377 + if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
3378 + FrmProAddonsController::renewal_message();
3379 + return;
3380 + }
3381 +
3382 + if ( ! FrmAddonsController::is_license_expired() ) {
3383 + return;
3384 + }
3385 +
3386 + ?>
3387 + <div class="frm_error_style" style="text-align:left">
3388 + <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
3389 + &nbsp;
3390 + <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
3391 + <div style="float:right">
3392 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
3393 + <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
3394 + </a>
3395 + </div>
3396 + </div>
3397 + <?php
3398 + }
3399 +
3400 + /**
3734 3401 * Shows pill text.
3735 3402 *
3736 3403 * @since 5.2.02
3737 3404 *
@@ -3744,246 +3411,213 @@
3744 3411 echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
3745 3412 }
3746 3413
3747 3414 /**
3748 - * Count the number of decimals digits.
3749 - *
3750 - * @since 5.2.07
3751 - *
3752 - * @param mixed $num Number.
3753 - * @return int|false Returns `false` if the passed parameter is not number.
3415 + * @since 4.08
3416 + * @deprecated 4.09.01
3754 3417 */
3755 - public static function count_decimals( $num ) {
3756 - if ( ! is_numeric( $num ) ) {
3757 - return false;
3418 + public static function expiring_message() {
3419 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3420 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3421 + FrmProAddonsController::expiring_message();
3758 3422 }
3759 -
3760 - $num = (string) $num;
3761 - $parts = explode( '.', $num );
3762 - if ( 1 === count( $parts ) ) {
3763 - return 0;
3764 - }
3765 -
3766 - return strlen( $parts[ count( $parts ) - 1 ] );
3767 3423 }
3768 3424
3769 3425 /**
3770 - * Prevent a fatal error in PHP8 if gmt_offset happens to be set an empty string.
3771 - * This is a bug in WordPress. It isn't safe to call current_time( 'timestamp' ) without this with an empty string offset.
3772 - * In the future this might be safe to remove. Keep an eye on the current_time function in functions.php.
3426 + * Use the WP 4.7 wp_doing_ajax function
3773 3427 *
3774 - * @since 5.3.1
3775 - *
3776 - * @return void
3428 + * @since 2.05.07
3429 + * @deprecated 4.04.04
3777 3430 */
3778 - public static function filter_gmt_offset() {
3779 - if ( self::$added_gmt_offset_filter ) {
3780 - // Avoid adding twice.
3781 - return;
3782 - }
3431 + public static function wp_doing_ajax() {
3432 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3433 + return wp_doing_ajax();
3434 + }
3783 3435
3784 - add_filter(
3785 - 'option_gmt_offset',
3786 - function( $offset ) {
3787 - if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
3788 - // Leave a valid value alone.
3789 - return $offset;
3790 - }
3791 -
3792 - return 0;
3793 - }
3794 - );
3795 - self::$added_gmt_offset_filter = true;
3436 + /**
3437 + * @deprecated 4.0
3438 + */
3439 + public static function insert_opt_html( $args ) {
3440 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3441 + FrmFormsHelper::insert_opt_html( $args );
3796 3442 }
3797 3443
3798 3444 /**
3799 - * @since 5.3.1
3445 + * Used to filter shortcode in text widgets
3800 3446 *
3801 - * @return bool
3447 + * @deprecated 2.5.4
3448 + * @codeCoverageIgnore
3802 3449 */
3803 - public static function on_form_listing_page() {
3804 - if ( ! self::is_admin_page( 'formidable' ) ) {
3805 - return false;
3806 - }
3450 + public static function widget_text_filter_callback( $matches ) {
3451 + return FrmDeprecated::widget_text_filter_callback( $matches );
3452 + }
3807 3453
3808 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
3809 - return ! $action || in_array( $action, self::get_form_listing_page_actions(), true );
3454 + /**
3455 + * @deprecated 3.01
3456 + * @codeCoverageIgnore
3457 + */
3458 + public static function sanitize_array( &$values ) {
3459 + FrmDeprecated::sanitize_array( $values );
3810 3460 }
3811 3461
3812 3462 /**
3813 - * Get all actions that also display the forms list.
3463 + * @param array $settings
3464 + * @param string $group
3814 3465 *
3815 - * @since 5.3.1
3816 - *
3817 - * @return array<string>
3466 + * @since 2.0.6
3467 + * @deprecated 2.05.06
3468 + * @codeCoverageIgnore
3818 3469 */
3819 - private static function get_form_listing_page_actions() {
3820 - return array( 'list', 'trash', 'untrash', 'destroy' );
3470 + public static function save_settings( $settings, $group ) {
3471 + return FrmDeprecated::save_settings( $settings, $group );
3821 3472 }
3822 3473
3823 3474 /**
3824 - * Safely call get_plugins, importing the required files if they are not yet loaded.
3825 - *
3826 - * @since 5.5
3827 - *
3828 - * @return array
3475 + * @since 2.0.4
3476 + * @deprecated 2.05.06
3477 + * @codeCoverageIgnore
3829 3478 */
3830 - public static function get_plugins() {
3831 - if ( ! function_exists( 'get_plugins' ) ) {
3832 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
3833 - }
3834 - return get_plugins();
3479 + public static function save_json_post( $settings ) {
3480 + return FrmDeprecated::save_json_post( $settings );
3835 3481 }
3836 3482
3837 3483 /**
3838 - * 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.
3839 - * This is to make sure that the URL can't be exploited for a SSRF attack.
3484 + * @since 2.0
3485 + * @deprecated 2.05.06
3486 + * @codeCoverageIgnore
3840 3487 *
3841 - * @since 5.5.5
3488 + * @param string $cache_key The unique name for this cache
3489 + * @param string $group The name of the cache group
3490 + * @param string $query If blank, don't run a db call
3491 + * @param string $type The wpdb function to use with this query
3842 3492 *
3843 - * @param string $url
3844 - * @param string $expected_extension
3845 - * @return bool
3493 + * @return mixed $results The cache or query results
3846 3494 */
3847 - public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
3848 - $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
3849 - if ( ! $file_is_in_expected_s3_bucket ) {
3850 - return false;
3851 - }
3852 -
3853 - $parsed = parse_url( $url );
3854 - if ( ! is_array( $parsed ) ) {
3855 - // URL is malformed.
3856 - return false;
3857 - }
3858 -
3859 - $path = $parsed['path'];
3860 - $ext = pathinfo( $path, PATHINFO_EXTENSION );
3861 - if ( $expected_extension !== $ext ) {
3862 - // The URL isn't to an XML file.
3863 - return false;
3864 - }
3865 -
3866 - return true;
3495 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3496 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3867 3497 }
3868 3498
3869 3499 /**
3870 - * @since 4.08
3871 - * @deprecated 4.09.01
3500 + * @deprecated 2.05.06
3501 + * @codeCoverageIgnore
3872 3502 */
3873 - public static function expiring_message() {
3874 - _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3875 - if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3876 - FrmProAddonsController::expiring_message();
3877 - }
3503 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3504 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
3878 3505 }
3879 3506
3880 3507 /**
3881 - * Use the WP 4.7 wp_doing_ajax function
3882 - *
3883 - * @since 2.05.07
3884 - * @deprecated 4.04.04
3508 + * @deprecated 2.05.06
3509 + * @codeCoverageIgnore
3885 3510 */
3886 - public static function wp_doing_ajax() {
3887 - _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3888 - return wp_doing_ajax();
3511 + public static function add_key_to_group_cache( $key, $group ) {
3512 + FrmDeprecated::add_key_to_group_cache( $key, $group );
3889 3513 }
3890 3514
3891 3515 /**
3892 - * @deprecated 4.0
3516 + * @deprecated 2.05.06
3517 + * @codeCoverageIgnore
3893 3518 */
3894 - public static function insert_opt_html( $args ) {
3895 - _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3896 - FrmFormsHelper::insert_opt_html( $args );
3519 + public static function get_group_cached_keys( $group ) {
3520 + return FrmDeprecated::get_group_cached_keys( $group );
3897 3521 }
3898 3522
3899 3523 /**
3900 - * @deprecated 3.01
3524 + * @since 2.0
3525 + * @deprecated 2.05.06
3901 3526 * @codeCoverageIgnore
3527 + * @return mixed The cached value or false
3902 3528 */
3903 - public static function sanitize_array( &$values ) {
3904 - FrmDeprecated::sanitize_array( $values );
3529 + public static function check_cache_and_transient( $cache_key ) {
3530 + return FrmDeprecated::check_cache( $cache_key );
3905 3531 }
3906 3532
3907 3533 /**
3908 3534 * @since 2.0
3909 - * @deprecated 5.0.13
3535 + * @deprecated 2.05.06
3536 + * @codeCoverageIgnore
3910 3537 *
3911 - * @return string The base Google APIS url for the current version of jQuery UI
3538 + * @param string $cache_key
3912 3539 */
3913 - public static function jquery_ui_base_url() {
3914 - _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3915 - return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
3540 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3541 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
3916 3542 }
3917 3543
3918 3544 /**
3919 - * @since 4.07
3920 - * @deprecated 6.0
3545 + * @since 2.0
3546 + * @deprecated 2.05.06
3547 + * @codeCoverageIgnore
3548 + *
3549 + * @param string $group The name of the cache group
3921 3550 */
3922 - public static function renewal_message() {
3923 - _deprecated_function( __METHOD__, '6.0', 'FrmProAddonsController::renewal_message' );
3551 + public static function cache_delete_group( $group ) {
3552 + FrmDeprecated::cache_delete_group( $group );
3924 3553 }
3925 3554
3926 3555 /**
3927 - * Display a dismissable warning message and save its dismissal state.
3556 + * @since 1.07.10
3557 + * @deprecated 2.05.06
3558 + * @codeCoverageIgnore
3928 3559 *
3929 - * @since 6.3
3560 + * @param string $term The value to escape
3930 3561 *
3931 - * @param string $message The warning message to display.
3932 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
3933 - * @return void
3562 + * @return string The escaped value
3934 3563 */
3935 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
3936 - if ( ! $message || ! $option ) {
3937 - return;
3938 - }
3564 + public static function esc_like( $term ) {
3565 + return FrmDeprecated::esc_like( $term );
3566 + }
3939 3567
3940 - $ajax_callback = function() use ( $option ) {
3941 - self::dismiss_warning_message( $option );
3942 - };
3568 + /**
3569 + * @param string $order_query
3570 + *
3571 + * @deprecated 2.05.06
3572 + * @codeCoverageIgnore
3573 + */
3574 + public static function esc_order( $order_query ) {
3575 + return FrmDeprecated::esc_order( $order_query );
3576 + }
3943 3577
3944 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
3945 - // To prevent any issues, we add 'frm_' from the beginning of the action.
3946 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
3578 + /**
3579 + * @deprecated 2.05.06
3580 + * @codeCoverageIgnore
3581 + */
3582 + public static function esc_order_by( &$order_by ) {
3583 + FrmDeprecated::esc_order_by( $order_by );
3584 + }
3947 3585
3948 - add_filter(
3949 - 'frm_message_list',
3950 - function( $show_messages ) use ( $message, $option ) {
3951 - if ( get_option( $option, false ) ) {
3952 - return $show_messages;
3953 - }
3586 + /**
3587 + * @param string $limit
3588 + *
3589 + * @deprecated 2.05.06
3590 + * @codeCoverageIgnore
3591 + */
3592 + public static function esc_limit( $limit ) {
3593 + return FrmDeprecated::esc_limit( $limit );
3594 + }
3954 3595
3955 - $dismiss_icon = self::icon_by_class(
3956 - 'frmfont frm_close_icon',
3957 - array(
3958 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
3959 - 'echo' => false,
3960 - )
3961 - );
3596 + /**
3597 + * @since 2.0
3598 + * @deprecated 2.05.06
3599 + * @codeCoverageIgnore
3600 + */
3601 + public static function prepare_array_values( $array, $type = '%s' ) {
3602 + return FrmDeprecated::prepare_array_values( $array, $type );
3603 + }
3962 3604
3963 - $show_messages[] = $message;
3964 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
3965 -
3966 - return $show_messages;
3967 - }
3968 - );
3605 + /**
3606 + * @deprecated 2.05.06
3607 + * @codeCoverageIgnore
3608 + */
3609 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3610 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
3969 3611 }
3970 3612
3971 3613 /**
3972 - * Dismiss a warning message and update the dismissal state.
3614 + * @since 2.0
3615 + * @deprecated 5.0.13
3973 3616 *
3974 - * @since 6.3
3975 - *
3976 - * @param string $option The unique identifier for the dismissal state of the message.
3977 - * @return void
3617 + * @return string The base Google APIS url for the current version of jQuery UI
3978 3618 */
3979 - public static function dismiss_warning_message( $option = '' ) {
3980 - self::permission_check( 'frm_change_settings' );
3981 - check_ajax_referer( 'frm_ajax', 'nonce' );
3982 -
3983 - if ( $option ) {
3984 - update_option( $option, true, 'no' );
3985 - }
3986 -
3987 - wp_send_json_success();
3619 + public static function jquery_ui_base_url() {
3620 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3621 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
3988 3622 }
3989 3623 }