PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.23
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.23
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/controllers/FrmStylesController.php +158 -55 6.56.23 View file →
@@ -5,19 +5,19 @@
5 5
6 6 class FrmStylesController {
7 7
8 8 /**
9 - * @var string $post_type
9 + * @var string
10 10 */
11 11 public static $post_type = 'frm_styles';
12 12
13 13 /**
14 - * @var string $screen
14 + * @var string
15 15 */
16 16 public static $screen = 'formidable_page_formidable-styles';
17 17
18 18 /**
19 - * @var string|null $message
19 + * @var string|null
20 20 */
21 21 private static $message;
22 22
23 23 public static function load_pro_hooks() {
@@ -95,9 +95,9 @@
95 95 *
96 96 * @return void
97 97 */
98 98 private static function disable_form_css() {
99 - add_filter( 'get_frm_stylesheet', '__return_false' );
99 + add_filter( 'get_frm_stylesheet', '__return_empty_array' );
100 100 }
101 101
102 102 /**
103 103 * Removing this action prevents front end JavaScript from loading.
@@ -119,12 +119,12 @@
119 119 if ( ! FrmAppHelper::is_style_editor_page() ) {
120 120 return;
121 121 }
122 122
123 + FrmStyleComponent::register_assets();
123 124 self::load_pro_hooks();
124 125
125 126 $version = FrmAppHelper::plugin_version();
126 - wp_enqueue_script( 'jquery-ui-datepicker' );
127 127
128 128 if ( FrmAppHelper::is_style_editor_page( 'edit' ) ) {
129 129 wp_enqueue_style( 'wp-color-picker' );
130 130 }
@@ -152,9 +152,9 @@
152 152 'frm_update_settings',
153 153 /**
154 154 * Update the form data on the "Manage Styles" tab after global settings are saved.
155 155 */
156 - function() {
156 + function () {
157 157 self::manage_styles();
158 158 }
159 159 );
160 160 }
@@ -191,9 +191,9 @@
191 191 wp_register_style( $css_key, $file, array(), $this_version );
192 192 }
193 193
194 194 $load_on_all = ! FrmAppHelper::is_admin() && 'all' === $frm_settings->load_style;
195 - if ( $load_on_all || $register != 'register' ) {
195 + if ( $load_on_all || $register !== 'register' ) {
196 196 wp_enqueue_style( $css_key );
197 197 }
198 198 unset( $css_key, $file );
199 199 }
@@ -200,9 +200,9 @@
200 200
201 201 if ( $frm_settings->load_style === 'all' ) {
202 202 $frm_vars['css_loaded'] = true;
203 203 }
204 - }
204 + }//end if
205 205 unset( $css );
206 206
207 207 add_filter( 'style_loader_tag', 'FrmStylesController::add_tags_to_css', 10, 2 );
208 208 }
@@ -264,14 +264,17 @@
264 264
265 265 return $this_version;
266 266 }
267 267
268 + /**
269 + * @param string $tag
270 + * @param string $handle
271 + * @return string
272 + */
268 273 public static function add_tags_to_css( $tag, $handle ) {
269 - if ( ( 'formidable' == $handle || 'jquery-theme' == $handle ) && strpos( $tag, ' property=' ) === false ) {
274 + if ( ( 'formidable' === $handle || 'jquery-theme' === $handle ) && strpos( $tag, ' property=' ) === false ) {
270 275 $frm_settings = FrmAppHelper::get_settings();
271 - if ( $frm_settings->use_html ) {
272 - $tag = str_replace( ' type="', ' property="stylesheet" type="', $tag );
273 - }
276 + $tag = str_replace( ' type="', ' property="stylesheet" type="', $tag );
274 277 }
275 278
276 279 return $tag;
277 280 }
@@ -320,9 +323,15 @@
320 323 self::setup_styles_and_scripts_for_styler();
321 324
322 325 $style_id = self::get_style_id_for_styler();
323 326 if ( ! $style_id ) {
324 - wp_die( esc_html__( 'Invalid route', 'formidable' ), esc_html__( 'Invalid route', 'formidable' ), 400 );
327 + $error_args = array(
328 + 'title' => __( 'No styles', 'formidable' ),
329 + 'body' => __( 'You must have a style to use the Visual Styler.', 'formidable' ),
330 + 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
331 + );
332 + FrmAppController::show_error_modal( $error_args );
333 + return;
325 334 }
326 335
327 336 $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
328 337 if ( ! $form_id ) {
@@ -329,10 +338,17 @@
329 338 $form_id = self::get_form_id_for_style( $style_id );
330 339 }
331 340
332 341 $form = FrmForm::getOne( $form_id );
342 +
333 343 if ( ! is_object( $form ) ) {
334 - wp_die( esc_html__( 'Invalid route', 'formidable' ), esc_html__( 'Invalid route', 'formidable' ), 400 );
344 + $error_args = array(
345 + 'title' => __( 'No forms', 'formidable' ),
346 + 'body' => __( 'You must have a form to use the Visual Styler.', 'formidable' ),
347 + 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
348 + );
349 + FrmAppController::show_error_modal( $error_args );
350 + return;
335 351 }
336 352
337 353 $frm_style = new FrmStyle( $style_id );
338 354 $active_style = $frm_style->get_one();
@@ -342,11 +358,9 @@
342 358
343 359 /**
344 360 * @since 6.0
345 361 *
346 - * @param array {
347 - * @type stdClass $form
348 - * }
362 + * @param array{form:\stdClass} $data
349 363 */
350 364 do_action( 'frm_before_render_style_page', compact( 'form' ) );
351 365
352 366 self::render_style_page( $active_style, $form, $default_style );
@@ -399,11 +413,12 @@
399 413
400 414 if ( ! $form_id ) {
401 415 // TODO: Show a message why a random form is being shown (because no form is assigned to the style).
402 416 // Fallback to any form.
403 - $where = array(
417 + $where = array(
404 418 'status' => 'published',
405 - 'parent_form_id' => array( null, 0 ), // Make sure it's not a repeater.
419 + // Make sure it's not a repeater.
420 + 'parent_form_id' => array( null, 0 ),
406 421 );
407 422 $form_id = FrmDb::get_var( 'frm_forms', $where, 'id' );
408 423 }
409 424
@@ -417,9 +432,9 @@
417 432 */
418 433 private static function disable_admin_page_styling_on_submit_buttons() {
419 434 add_filter(
420 435 'frm_submit_button_class',
421 - function( $classes ) {
436 + function ( $classes ) {
422 437 $classes[] = 'frm_no_style_button';
423 438 return $classes;
424 439 }
425 440 );
@@ -463,15 +478,15 @@
463 478 * @param int $style_id
464 479 */
465 480 $style_id = apply_filters( 'frm_saved_form_style_id', $style_id );
466 481
467 - if ( ! $style_id && '0' !== FrmAppHelper::get_post_param( 'style_id', 'sanitize_text_field', '' ) ) {
482 + if ( ! $style_id && '0' !== FrmAppHelper::get_post_param( 'style_id', '', 'sanitize_text_field' ) ) {
468 483 // "0" is a special value used for the enable/disable toggle.
469 484 wp_die( esc_html__( 'Invalid style value', 'formidable' ), esc_html__( 'Invalid style value', 'formidable' ), 400 );
470 485 return;
471 486 }
472 487
473 - $form_id = FrmAppHelper::get_post_param( 'form_id', 'absint', 0 );
488 + $form_id = FrmAppHelper::get_post_param( 'form_id', 0, 'absint' );
474 489 if ( ! $form_id ) {
475 490 wp_die( esc_html__( 'No form specified', 'formidable' ), esc_html__( 'No form specified', 'formidable' ), 400 );
476 491 return;
477 492 }
@@ -489,9 +504,10 @@
489 504 if ( $style_id === $default_style->ID && empty( $form->options['chat'] ) ) {
490 505 $style_id = 1;
491 506 }
492 507
493 - $form->options['custom_style'] = (string) $style_id; // We want to save a string for consistency. FrmStylesHelper::get_form_count_for_style expects the custom style ID is a string.
508 + // We want to save a string for consistency. FrmStylesHelper::get_form_count_for_style expects the custom style ID is a string.
509 + $form->options['custom_style'] = (string) $style_id;
494 510
495 511 global $wpdb;
496 512 $wpdb->update( $wpdb->prefix . 'frm_forms', array( 'options' => maybe_serialize( $form->options ) ), array( 'id' => $form->id ) );
497 513
@@ -523,9 +539,9 @@
523 539 $plugin_url = FrmAppHelper::plugin_url();
524 540 $version = FrmAppHelper::plugin_version();
525 541 $js_dependencies = array( 'wp-i18n', 'wp-hooks', 'formidable_dom' );
526 542
527 - if ( FrmAppHelper::pro_is_installed() ) {
543 + if ( FrmAppHelper::pro_is_installed() && is_callable( 'FrmProAppHelper::use_jquery_datepicker' ) && FrmProAppHelper::use_jquery_datepicker() ) {
528 544 $js_dependencies[] = 'jquery-ui-datepicker';
529 545 }
530 546
531 547 wp_register_script( 'formidable_style', $plugin_url . '/js/admin/style.js', $js_dependencies, $version );
@@ -533,8 +549,9 @@
533 549 wp_print_styles( 'formidable_style' );
534 550
535 551 wp_print_styles( 'formidable' );
536 552 wp_enqueue_script( 'formidable_style' );
553 + wp_set_script_translations( 'formidable_style', 'formidable' );
537 554 }
538 555
539 556 /**
540 557 * Render the style page (with a more limited and typed scope than calling it from self::style directly).
@@ -541,9 +558,8 @@
541 558 *
542 559 * @since 6.0
543 560 *
544 561 * @param stdClass|WP_Post $active_style
545 - * @param array<WP_Post> $styles
546 562 * @param stdClass $form
547 563 * @param WP_Post $default_style
548 564 * @return void
549 565 */
@@ -548,13 +564,15 @@
548 564 * @return void
549 565 */
550 566 private static function render_style_page( $active_style, $form, $default_style ) {
551 567 $style_views_path = self::get_views_path();
552 - $view = FrmAppHelper::simple_get( 'frm_action', 'sanitize_text_field', 'list' ); // edit, list (default), new_style.
553 - $frm_style = new FrmStyle( $active_style->ID );
568 + // Edit, list (default), new_style.
569 + $view = FrmAppHelper::simple_get( 'frm_action', 'sanitize_text_field', 'list' );
570 + $frm_style = new FrmStyle( $active_style->ID );
554 571
555 572 if ( 'new_style' !== $view && ! FrmAppHelper::simple_get( 'form' ) && ! FrmAppHelper::simple_get( 'style_id' ) ) {
556 - $view = 'edit'; // Have the Appearance > Forms link fallback to the edit view. Otherwise we want to use 'list' as the default.
573 + // Have the Appearance > Forms link fallback to the edit view. Otherwise we want to use 'list' as the default.
574 + $view = 'edit';
557 575 }
558 576
559 577 if ( in_array( $view, array( 'edit', 'new_style', 'duplicate' ), true ) ) {
560 578 self::add_meta_boxes();
@@ -617,21 +635,21 @@
617 635 * Filter form classes so the form uses the preview style, not the form's active style.
618 636 *
619 637 * @since 6.0
620 638 *
621 - * @param WP_Post|stdClass $style A new style is not a WP_Post object.
639 + * @param stdClass|WP_Post $style A new style is not a WP_Post object.
622 640 * @return void
623 641 */
624 642 private static function force_form_style( $style ) {
625 643 add_filter(
626 644 'frm_add_form_style_class',
627 - function( $class ) use ( $style ) {
628 - $split = array_filter(
645 + function ( $class ) use ( $style ) {
646 + $split = array_filter(
629 647 explode( ' ', $class ),
630 648 /**
631 649 * @param string $class
632 650 */
633 - function( $class ) {
651 + function ( $class ) {
634 652 return $class && 0 !== strpos( $class, 'frm_style_' );
635 653 }
636 654 );
637 655 $split[] = 'frm_style_' . $style->post_name;
@@ -648,9 +666,8 @@
648 666 * @return void
649 667 */
650 668 public static function save_style() {
651 669 $frm_style = new FrmStyle();
652 - $message = '';
653 670 $post_id = FrmAppHelper::get_post_param( 'ID', false, 'sanitize_title' );
654 671 $style_nonce = FrmAppHelper::get_post_param( 'frm_style', '', 'sanitize_text_field' );
655 672
656 673 if ( $post_id === false || ! wp_verify_nonce( $style_nonce, 'frm_style_nonce' ) ) {
@@ -661,9 +678,10 @@
661 678
662 679 $id = $frm_style->update( $post_id );
663 680 if ( ! $post_id && $id ) {
664 681 self::maybe_redirect_after_save( $id );
665 - $post_id = reset( $id ); // Set the post id to the new style so it will be loaded for editing.
682 + // Set the post id to the new style so it will be loaded for editing.
683 + $post_id = reset( $id );
666 684 }
667 685
668 686 self::$message = __( 'Your styling settings have been saved.', 'formidable' );
669 687 }
@@ -706,9 +724,9 @@
706 724 return;
707 725 }
708 726
709 727 parse_str( $query, $parsed_query );
710 - $form_id = ! empty( $parsed_query['form'] ) ? absint( $parsed_query['form'] ) : 0;
728 + $form_id = ! empty( $parsed_query['form'] ) ? absint( $parsed_query['form'] ) : 0;
711 729
712 730 $style = new stdClass();
713 731 $style->ID = end( $ids );
714 732 wp_safe_redirect( esc_url_raw( FrmStylesHelper::get_edit_url( $style, $form_id ) ) );
@@ -725,8 +743,9 @@
725 743 public static function manage( $message = '', $forms = array() ) {
726 744 $frm_style = new FrmStyle();
727 745 $styles = $frm_style->get_all();
728 746 $default_style = $frm_style->get_default_style( $styles );
747 + $frm_settings = FrmAppHelper::get_settings();
729 748
730 749 if ( ! $forms ) {
731 750 $forms = FrmForm::get_published_forms();
732 751 }
@@ -744,14 +763,14 @@
744 763 global $wpdb;
745 764
746 765 $forms = FrmForm::get_published_forms();
747 766 foreach ( $forms as $form ) {
748 - $new_style = ( isset( $_POST['style'] ) && isset( $_POST['style'][ $form->id ] ) ) ? sanitize_text_field( wp_unslash( $_POST['style'][ $form->id ] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
749 - $previous_style = ( isset( $_POST['prev_style'] ) && isset( $_POST['prev_style'][ $form->id ] ) ) ? sanitize_text_field( wp_unslash( $_POST['prev_style'][ $form->id ] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
750 - if ( $new_style == $previous_style ) {
767 + if ( ! isset( $_POST['style'] ) || ! isset( $_POST['style'][ $form->id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
751 768 continue;
752 769 }
753 770
771 + $new_style = sanitize_text_field( wp_unslash( $_POST['style'][ $form->id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
772 +
754 773 $form->options['custom_style'] = $new_style;
755 774 $wpdb->update( $wpdb->prefix . 'frm_forms', array( 'options' => maybe_serialize( $form->options ) ), array( 'id' => $form->id ) );
756 775 unset( $form );
757 776 }
@@ -885,22 +904,26 @@
885 904 echo json_encode( $defaults );
886 905 wp_die();
887 906 }
888 907
889 - $frm_style = new FrmStyle();
890 - $defaults = $frm_style->get_defaults();
891 - $default_post_content = FrmAppHelper::prepare_and_encode( $defaults );
892 - $where = array(
908 + $frm_style = new FrmStyle();
909 + $default_template_style = $frm_style->get_default_template_style( $style_id );
910 + $where = array(
893 911 'ID' => $style_id,
894 912 'post_type' => self::$post_type,
895 913 );
914 +
915 + $style_object = $frm_style->get_new();
916 + $style_object->post_content = json_decode( $default_template_style, true );
917 +
896 918 global $wpdb;
897 - $wpdb->update( $wpdb->posts, array( 'post_content' => $default_post_content ), $where );
919 + $wpdb->update( $wpdb->posts, array( 'post_content' => $default_template_style ), $where );
898 920
899 - $frm_style->save_settings(); // Save the settings after resetting to default or the old style will still appear.
921 + // Save the settings after resetting to default or the old style will still appear.
922 + $frm_style->save_settings();
900 923
901 924 $data = array(
902 - 'style' => FrmStylesCardHelper::get_style_param_for_card( $frm_style->get_new() ),
925 + 'style' => FrmStylesCardHelper::get_style_param_for_card( $style_object ),
903 926 );
904 927 wp_send_json_success( $data );
905 928 wp_die();
906 929 }
@@ -915,12 +938,15 @@
915 938 public static function change_styling() {
916 939 FrmAppHelper::permission_check( 'frm_change_settings' );
917 940 check_ajax_referer( 'frm_ajax', 'nonce' );
918 941
919 - $frm_style = new FrmStyle();
920 - $defaults = array(); // Intentionally avoid defaults here so nothing gets removed from our style.
921 - $style = '';
942 + $is_loaded_via_ajax = true;
943 + $frm_style = new FrmStyle();
922 944
945 + // Intentionally avoid defaults here so nothing gets removed from our style.
946 + $defaults = array();
947 + $style = '';
948 +
923 949 echo '<style type="text/css">';
924 950 include FrmAppHelper::plugin_path() . '/css/_single_theme.css.php';
925 951 echo '</style>';
926 952 wp_die();
@@ -1025,9 +1051,9 @@
1025 1051 }
1026 1052
1027 1053 /**
1028 1054 * Add an extra style rule to hide a broken style warning.
1029 - * To avoid cluttering the front end with any unecessary styles this is only added when the referer URL matches the styler.
1055 + * To avoid cluttering the front end with any unnecessary styles this is only added when the referer URL matches the styler.
1030 1056 *
1031 1057 * @since 6.2.3
1032 1058 *
1033 1059 * @return void
@@ -1078,9 +1104,9 @@
1078 1104 return;
1079 1105 }
1080 1106
1081 1107 $frm_settings = FrmAppHelper::get_settings();
1082 - if ( $frm_settings->load_style != 'none' ) {
1108 + if ( $frm_settings->load_style !== 'none' ) {
1083 1109 wp_enqueue_style( 'formidable' );
1084 1110 $frm_vars['css_loaded'] = true;
1085 1111 }
1086 1112 }
@@ -1099,9 +1125,9 @@
1099 1125
1100 1126 /**
1101 1127 * Get the style post object for a target form.
1102 1128 *
1103 - * @param object|string|boolean $form
1129 + * @param bool|object|string $form
1104 1130 * @return WP_Post|null
1105 1131 */
1106 1132 public static function get_form_style( $form = 'default' ) {
1107 1133 $style = FrmFormsHelper::get_form_style( $form );
@@ -1134,12 +1160,11 @@
1134 1160 return $class;
1135 1161 }
1136 1162
1137 1163 /**
1164 + * @since 3.0
1138 1165 * @param object $style
1139 1166 * @param string $class
1140 - *
1141 - * @since 3.0
1142 1167 */
1143 1168 private static function maybe_add_rtl_class( $style, &$class ) {
1144 1169 $is_rtl = isset( $style->post_content['direction'] ) && 'rtl' === $style->post_content['direction'];
1145 1170 if ( $is_rtl ) {
@@ -1184,10 +1209,88 @@
1184 1209
1185 1210 return $important;
1186 1211 }
1187 1212
1188 - public static function do_accordion_sections( $screen, $context, $object ) {
1189 - return do_accordion_sections( $screen, $context, $object );
1213 + /**
1214 + * Duplicate of WordPress do_accordion_section function, it adds an additional svg icon support.
1215 + *
1216 + * @since 6.8.3
1217 + *
1218 + * @return int
1219 + */
1220 + public static function do_accordion_sections( $screen, $context, $data_object ) {
1221 + global $wp_meta_boxes;
1222 +
1223 + // the symbol id from icons.svg
1224 + $icon_ids = array(
1225 + 'ranking-fields-style' => 'frm_chart_bar_icon',
1226 + 'section-fields-style' => 'frm-form-title-style',
1227 + );
1228 +
1229 + wp_enqueue_script( 'accordion' );
1230 +
1231 + if ( empty( $screen ) ) {
1232 + $screen = get_current_screen();
1233 + } elseif ( is_string( $screen ) ) {
1234 + $screen = convert_to_screen( $screen );
1235 + }
1236 +
1237 + $page = $screen->id;
1238 +
1239 + ?>
1240 + <div id="side-sortables" class="accordion-container">
1241 + <ul class="outer-border">
1242 + <?php
1243 + $i = 0;
1244 + $first_open = false;
1245 +
1246 + if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
1247 + foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
1248 + if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
1249 + foreach ( $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {
1250 + if ( false === $box || ! $box['title'] ) {
1251 + continue;
1252 + }
1253 +
1254 + ++$i;
1255 + $icon_id = array_key_exists( $box['id'], $icon_ids ) ? $icon_ids[ $box['id'] ] : 'frm-' . $box['id'];
1256 +
1257 + $open_class = '';
1258 + if ( ! $first_open ) {
1259 + $first_open = true;
1260 + $open_class = 'open';
1261 + }
1262 +
1263 + $accordion_content_id = 'frm_style_section_' . $box['id'];
1264 + ?>
1265 + <li class="control-section accordion-section <?php echo esc_attr( $open_class ); ?> <?php echo esc_attr( $box['id'] ); ?>" id="<?php echo esc_attr( $box['id'] ); ?>">
1266 + <h3 class="accordion-section-title hndle">
1267 + <?php
1268 + FrmAppHelper::icon_by_class( 'frmfont ' . $icon_id );
1269 + echo esc_html( $box['title'] );
1270 + ?>
1271 + <button type="button" aria-expanded="<?php echo esc_attr( 'open' === $open_class ? 'true' : 'false' ); ?>" aria-controls="<?php echo esc_attr( $accordion_content_id ); ?>" aria-label="<?php echo esc_attr( $box['title'] ); ?>">
1272 + <?php
1273 + FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown8_icon' );
1274 + ?>
1275 + </button>
1276 + </h3>
1277 + <div class="accordion-section-content <?php postbox_classes( $box['id'], $page ); ?>" id="<?php echo esc_attr( $accordion_content_id ); ?>">
1278 + <div class="inside">
1279 + <?php call_user_func( $box['callback'], $data_object, $box ); ?>
1280 + </div><!-- .inside -->
1281 + </div><!-- .accordion-section-content -->
1282 + </li><!-- .accordion-section -->
1283 + <?php
1284 + }//end foreach
1285 + }//end if
1286 + }//end foreach
1287 + }//end if
1288 + ?>
1289 + </ul><!-- .outer-border -->
1290 + </div><!-- .accordion-container -->
1291 + <?php
1292 + return $i;
1190 1293 }
1191 1294
1192 1295 /**
1193 1296 * Rename a style via an AJAX action.