PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.14
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.14
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 +148 -51 6.36.14 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() {
@@ -119,8 +119,9 @@
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 127 wp_enqueue_script( 'jquery-ui-datepicker' );
@@ -152,9 +153,9 @@
152 153 'frm_update_settings',
153 154 /**
154 155 * Update the form data on the "Manage Styles" tab after global settings are saved.
155 156 */
156 - function() {
157 + function () {
157 158 self::manage_styles();
158 159 }
159 160 );
160 161 }
@@ -191,9 +192,9 @@
191 192 wp_register_style( $css_key, $file, array(), $this_version );
192 193 }
193 194
194 195 $load_on_all = ! FrmAppHelper::is_admin() && 'all' === $frm_settings->load_style;
195 - if ( $load_on_all || $register != 'register' ) {
196 + if ( $load_on_all || $register !== 'register' ) {
196 197 wp_enqueue_style( $css_key );
197 198 }
198 199 unset( $css_key, $file );
199 200 }
@@ -200,9 +201,9 @@
200 201
201 202 if ( $frm_settings->load_style === 'all' ) {
202 203 $frm_vars['css_loaded'] = true;
203 204 }
204 - }
205 + }//end if
205 206 unset( $css );
206 207
207 208 add_filter( 'style_loader_tag', 'FrmStylesController::add_tags_to_css', 10, 2 );
208 209 }
@@ -264,14 +265,17 @@
264 265
265 266 return $this_version;
266 267 }
267 268
269 + /**
270 + * @param string $tag
271 + * @param string $handle
272 + * @return string
273 + */
268 274 public static function add_tags_to_css( $tag, $handle ) {
269 - if ( ( 'formidable' == $handle || 'jquery-theme' == $handle ) && strpos( $tag, ' property=' ) === false ) {
275 + if ( ( 'formidable' === $handle || 'jquery-theme' === $handle ) && strpos( $tag, ' property=' ) === false ) {
270 276 $frm_settings = FrmAppHelper::get_settings();
271 - if ( $frm_settings->use_html ) {
272 - $tag = str_replace( ' type="', ' property="stylesheet" type="', $tag );
273 - }
277 + $tag = str_replace( ' type="', ' property="stylesheet" type="', $tag );
274 278 }
275 279
276 280 return $tag;
277 281 }
@@ -320,9 +324,15 @@
320 324 self::setup_styles_and_scripts_for_styler();
321 325
322 326 $style_id = self::get_style_id_for_styler();
323 327 if ( ! $style_id ) {
324 - wp_die( esc_html__( 'Invalid route', 'formidable' ), esc_html__( 'Invalid route', 'formidable' ), 400 );
328 + $error_args = array(
329 + 'title' => __( 'No styles', 'formidable' ),
330 + 'body' => __( 'You must have a style to use the Visual Styler.', 'formidable' ),
331 + 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
332 + );
333 + FrmAppController::show_error_modal( $error_args );
334 + return;
325 335 }
326 336
327 337 $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
328 338 if ( ! $form_id ) {
@@ -329,10 +339,17 @@
329 339 $form_id = self::get_form_id_for_style( $style_id );
330 340 }
331 341
332 342 $form = FrmForm::getOne( $form_id );
343 +
333 344 if ( ! is_object( $form ) ) {
334 - wp_die( esc_html__( 'Invalid route', 'formidable' ), esc_html__( 'Invalid route', 'formidable' ), 400 );
345 + $error_args = array(
346 + 'title' => __( 'No forms', 'formidable' ),
347 + 'body' => __( 'You must have a form to use the Visual Styler.', 'formidable' ),
348 + 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
349 + );
350 + FrmAppController::show_error_modal( $error_args );
351 + return;
335 352 }
336 353
337 354 $frm_style = new FrmStyle( $style_id );
338 355 $active_style = $frm_style->get_one();
@@ -342,11 +359,9 @@
342 359
343 360 /**
344 361 * @since 6.0
345 362 *
346 - * @param array {
347 - * @type stdClass $form
348 - * }
363 + * @param array{form:\stdClass} $data
349 364 */
350 365 do_action( 'frm_before_render_style_page', compact( 'form' ) );
351 366
352 367 self::render_style_page( $active_style, $form, $default_style );
@@ -399,11 +414,12 @@
399 414
400 415 if ( ! $form_id ) {
401 416 // TODO: Show a message why a random form is being shown (because no form is assigned to the style).
402 417 // Fallback to any form.
403 - $where = array(
418 + $where = array(
404 419 'status' => 'published',
405 - 'parent_form_id' => array( null, 0 ), // Make sure it's not a repeater.
420 + // Make sure it's not a repeater.
421 + 'parent_form_id' => array( null, 0 ),
406 422 );
407 423 $form_id = FrmDb::get_var( 'frm_forms', $where, 'id' );
408 424 }
409 425
@@ -417,9 +433,9 @@
417 433 */
418 434 private static function disable_admin_page_styling_on_submit_buttons() {
419 435 add_filter(
420 436 'frm_submit_button_class',
421 - function( $classes ) {
437 + function ( $classes ) {
422 438 $classes[] = 'frm_no_style_button';
423 439 return $classes;
424 440 }
425 441 );
@@ -463,15 +479,15 @@
463 479 * @param int $style_id
464 480 */
465 481 $style_id = apply_filters( 'frm_saved_form_style_id', $style_id );
466 482
467 - if ( ! $style_id && '0' !== FrmAppHelper::get_post_param( 'style_id', 'sanitize_text_field', '' ) ) {
483 + if ( ! $style_id && '0' !== FrmAppHelper::get_post_param( 'style_id', '', 'sanitize_text_field' ) ) {
468 484 // "0" is a special value used for the enable/disable toggle.
469 485 wp_die( esc_html__( 'Invalid style value', 'formidable' ), esc_html__( 'Invalid style value', 'formidable' ), 400 );
470 486 return;
471 487 }
472 488
473 - $form_id = FrmAppHelper::get_post_param( 'form_id', 'absint', 0 );
489 + $form_id = FrmAppHelper::get_post_param( 'form_id', 0, 'absint' );
474 490 if ( ! $form_id ) {
475 491 wp_die( esc_html__( 'No form specified', 'formidable' ), esc_html__( 'No form specified', 'formidable' ), 400 );
476 492 return;
477 493 }
@@ -489,9 +505,10 @@
489 505 if ( $style_id === $default_style->ID && empty( $form->options['chat'] ) ) {
490 506 $style_id = 1;
491 507 }
492 508
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.
509 + // We want to save a string for consistency. FrmStylesHelper::get_form_count_for_style expects the custom style ID is a string.
510 + $form->options['custom_style'] = (string) $style_id;
494 511
495 512 global $wpdb;
496 513 $wpdb->update( $wpdb->prefix . 'frm_forms', array( 'options' => maybe_serialize( $form->options ) ), array( 'id' => $form->id ) );
497 514
@@ -533,8 +550,9 @@
533 550 wp_print_styles( 'formidable_style' );
534 551
535 552 wp_print_styles( 'formidable' );
536 553 wp_enqueue_script( 'formidable_style' );
554 + wp_set_script_translations( 'formidable_style', 'formidable' );
537 555 }
538 556
539 557 /**
540 558 * Render the style page (with a more limited and typed scope than calling it from self::style directly).
@@ -541,9 +559,8 @@
541 559 *
542 560 * @since 6.0
543 561 *
544 562 * @param stdClass|WP_Post $active_style
545 - * @param array<WP_Post> $styles
546 563 * @param stdClass $form
547 564 * @param WP_Post $default_style
548 565 * @return void
549 566 */
@@ -548,13 +565,15 @@
548 565 * @return void
549 566 */
550 567 private static function render_style_page( $active_style, $form, $default_style ) {
551 568 $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 );
569 + // Edit, list (default), new_style.
570 + $view = FrmAppHelper::simple_get( 'frm_action', 'sanitize_text_field', 'list' );
571 + $frm_style = new FrmStyle( $active_style->ID );
554 572
555 573 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.
574 + // Have the Appearance > Forms link fallback to the edit view. Otherwise we want to use 'list' as the default.
575 + $view = 'edit';
557 576 }
558 577
559 578 if ( in_array( $view, array( 'edit', 'new_style', 'duplicate' ), true ) ) {
560 579 self::add_meta_boxes();
@@ -617,21 +636,21 @@
617 636 * Filter form classes so the form uses the preview style, not the form's active style.
618 637 *
619 638 * @since 6.0
620 639 *
621 - * @param WP_Post|stdClass $style A new style is not a WP_Post object.
640 + * @param stdClass|WP_Post $style A new style is not a WP_Post object.
622 641 * @return void
623 642 */
624 643 private static function force_form_style( $style ) {
625 644 add_filter(
626 645 'frm_add_form_style_class',
627 - function( $class ) use ( $style ) {
628 - $split = array_filter(
646 + function ( $class ) use ( $style ) {
647 + $split = array_filter(
629 648 explode( ' ', $class ),
630 649 /**
631 650 * @param string $class
632 651 */
633 - function( $class ) {
652 + function ( $class ) {
634 653 return $class && 0 !== strpos( $class, 'frm_style_' );
635 654 }
636 655 );
637 656 $split[] = 'frm_style_' . $style->post_name;
@@ -648,9 +667,8 @@
648 667 * @return void
649 668 */
650 669 public static function save_style() {
651 670 $frm_style = new FrmStyle();
652 - $message = '';
653 671 $post_id = FrmAppHelper::get_post_param( 'ID', false, 'sanitize_title' );
654 672 $style_nonce = FrmAppHelper::get_post_param( 'frm_style', '', 'sanitize_text_field' );
655 673
656 674 if ( $post_id === false || ! wp_verify_nonce( $style_nonce, 'frm_style_nonce' ) ) {
@@ -661,9 +679,10 @@
661 679
662 680 $id = $frm_style->update( $post_id );
663 681 if ( ! $post_id && $id ) {
664 682 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.
683 + // Set the post id to the new style so it will be loaded for editing.
684 + $post_id = reset( $id );
666 685 }
667 686
668 687 self::$message = __( 'Your styling settings have been saved.', 'formidable' );
669 688 }
@@ -706,9 +725,9 @@
706 725 return;
707 726 }
708 727
709 728 parse_str( $query, $parsed_query );
710 - $form_id = ! empty( $parsed_query['form'] ) ? absint( $parsed_query['form'] ) : 0;
729 + $form_id = ! empty( $parsed_query['form'] ) ? absint( $parsed_query['form'] ) : 0;
711 730
712 731 $style = new stdClass();
713 732 $style->ID = end( $ids );
714 733 wp_safe_redirect( esc_url_raw( FrmStylesHelper::get_edit_url( $style, $form_id ) ) );
@@ -744,10 +763,10 @@
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
767 + $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
768 + $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 769 if ( $new_style == $previous_style ) {
751 770 continue;
752 771 }
753 772
@@ -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 = false; // 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,82 @@
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 + <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'] ); ?>">
1264 + <h3 class="accordion-section-title hndle" tabindex="0">
1265 + <?php
1266 + FrmAppHelper::icon_by_class( 'frmfont ' . $icon_id );
1267 + echo esc_html( $box['title'] );
1268 + FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown8_icon' );
1269 + ?>
1270 + </h3>
1271 + <div class="accordion-section-content <?php postbox_classes( $box['id'], $page ); ?>">
1272 + <div class="inside">
1273 + <?php call_user_func( $box['callback'], $data_object, $box ); ?>
1274 + </div><!-- .inside -->
1275 + </div><!-- .accordion-section-content -->
1276 + </li><!-- .accordion-section -->
1277 + <?php
1278 + }//end foreach
1279 + }//end if
1280 + }//end foreach
1281 + }//end if
1282 + ?>
1283 + </ul><!-- .outer-border -->
1284 + </div><!-- .accordion-container -->
1285 + <?php
1286 + return $i;
1190 1287 }
1191 1288
1192 1289 /**
1193 1290 * Rename a style via an AJAX action.