PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.5.4
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.5.4
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 +163 -1024 6.305.5.4 View file →
@@ -3,27 +3,11 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmStylesController {
7 -
8 - /**
9 - * @var string
10 - */
11 7 public static $post_type = 'frm_styles';
12 -
13 - /**
14 - * @var string
15 - */
16 8 public static $screen = 'formidable_page_formidable-styles';
17 9
18 - /**
19 - * @var string|null
20 - */
21 - private static $message;
22 -
23 - /**
24 - * @return void
25 - */
26 10 public static function load_pro_hooks() {
27 11 if ( FrmAppHelper::pro_is_installed() ) {
28 12 FrmProStylesController::load_pro_hooks();
29 13 }
@@ -28,11 +12,8 @@
28 12 FrmProStylesController::load_pro_hooks();
29 13 }
30 14 }
31 15
32 - /**
33 - * @return void
34 - */
35 16 public static function register_post_types() {
36 17 register_post_type(
37 18 self::$post_type,
38 19 array(
@@ -64,119 +45,48 @@
64 45 )
65 46 );
66 47 }
67 48
68 - /**
69 - * Add two links for the visual styler.
70 - * There's a "Styles" submenu in the Formidable menu.
71 - * There's a second alternative "Forms" submenu in the Appearance menu.
72 - * This submenu links to a page to edit a form with the default style.
73 - *
74 - * @return void
75 - */
76 49 public static function menu() {
77 - add_submenu_page( 'formidable', 'Formidable | ' . __( 'Styles', 'formidable' ), __( 'Styles', 'formidable' ), 'frm_change_settings', 'formidable-styles', 'FrmStylesController::route' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
78 - add_submenu_page( 'themes.php', 'Formidable | ' . __( 'Styles', 'formidable' ), __( 'Forms', 'formidable' ), 'frm_change_settings', 'formidable-styles2', 'FrmStylesController::route' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
50 + add_submenu_page( 'formidable', 'Formidable | ' . __( 'Styles', 'formidable' ), __( 'Styles', 'formidable' ), 'frm_change_settings', 'formidable-styles', 'FrmStylesController::route' );
51 + add_submenu_page( 'themes.php', 'Formidable | ' . __( 'Styles', 'formidable' ), __( 'Forms', 'formidable' ), 'frm_change_settings', 'formidable-styles2', 'FrmStylesController::route' );
79 52 }
80 53
81 54 /**
82 - * Remove filters for the visual styler preview.
83 - * This triggers earlier than self::admin_init which is called too late.
84 - *
85 55 * @return void
86 56 */
87 - public static function plugins_loaded() {
57 + public static function admin_init() {
88 58 if ( ! FrmAppHelper::is_style_editor_page() ) {
89 59 return;
90 60 }
91 61
92 - self::disable_form_css();
93 - self::prevent_form_scripts_from_loading();
94 - }
62 + self::load_pro_hooks();
95 63
96 - /**
97 - * Avoid loading CSS the normal way with the preview in the styler.
98 - * It gets loaded instead with the frmpro_css action set to the #frm-custom-theme-css element.
99 - *
100 - * @since 6.0
101 - *
102 - * @return void
103 - */
104 - private static function disable_form_css() {
105 - add_filter( 'get_frm_stylesheet', '__return_empty_array' );
106 - }
107 -
108 - /**
109 - * Removing this action prevents front end JavaScript from loading.
110 - *
111 - * @since 6.0
112 - *
113 - * @return void
114 - */
115 - private static function prevent_form_scripts_from_loading() {
116 - remove_action( 'init', 'FrmFormsController::front_head' );
117 - }
118 -
119 - /**
120 - * @return void
121 - */
122 - public static function admin_init() {
123 - self::maybe_hook_into_global_settings_save();
124 -
125 - if ( ! FrmAppHelper::is_style_editor_page() ) {
64 + $style_tab = FrmAppHelper::get_param( 'frm_action', '', 'get', 'sanitize_title' );
65 + if ( $style_tab === 'manage' || $style_tab === 'custom_css' ) {
66 + // we only need to load these styles/scripts on the styler page
126 67 return;
127 68 }
128 69
129 - FrmStyleComponent::register_assets();
130 - self::load_pro_hooks();
131 -
132 70 $version = FrmAppHelper::plugin_version();
71 + wp_enqueue_script( 'jquery-ui-datepicker' );
72 + wp_enqueue_style( 'wp-color-picker' );
73 + wp_enqueue_style( 'frm-custom-theme', admin_url( 'admin-ajax.php?action=frmpro_css' ), array(), $version );
133 74
134 - if ( FrmAppHelper::is_style_editor_page( 'edit' ) ) {
135 - wp_enqueue_style( 'wp-color-picker' );
136 - }
137 -
138 - wp_enqueue_style( 'frm-custom-theme', admin_url( 'admin-ajax.php?action=frmpro_css&frm_scope_custom_css=1' ), array(), $version );
139 -
140 75 $style = apply_filters( 'frm_style_head', false );
141 -
142 76 if ( $style ) {
143 - wp_enqueue_style( 'frm-single-custom-theme', admin_url( 'admin-ajax.php?action=frmpro_load_css&flat=1' ) . '&' . http_build_query( $style->post_content ), array(), $version ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
77 + wp_enqueue_style( 'frm-single-custom-theme', admin_url( 'admin-ajax.php?action=frmpro_load_css&flat=1' ) . '&' . http_build_query( $style->post_content ), array(), $version );
144 78 }
145 79 }
146 80
147 81 /**
148 - * @since 6.0
149 - *
150 - * @return void
151 - */
152 - private static function maybe_hook_into_global_settings_save() {
153 - if ( empty( $_POST ) || ! isset( $_POST['style'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
154 - // Avoid changing any style data if the style array is not sent in the request.
155 - return;
156 - }
157 -
158 - add_action(
159 - 'frm_update_settings',
160 - /**
161 - * Update the form data on the "Manage Styles" tab after global settings are saved.
162 - */
163 - function () {
164 - self::manage_styles();
165 - }
166 - );
167 - }
168 -
169 - /**
170 82 * @param string $register Either 'enqueue' or 'register'.
171 83 * @param bool $force True to enqueue/register the style if a form has not been loaded.
172 - *
173 - * @return void
174 84 */
175 85 public static function enqueue_css( $register = 'enqueue', $force = false ) {
176 86 global $frm_vars;
177 87
178 - $register_css = $register === 'register';
88 + $register_css = ( $register == 'register' );
179 89 $should_load = $force || ( ( $frm_vars['load_css'] || $register_css ) && ! FrmAppHelper::is_admin() );
180 90
181 91 if ( ! $should_load ) {
182 92 return;
@@ -182,17 +92,17 @@
182 92 return;
183 93 }
184 94
185 95 $frm_settings = FrmAppHelper::get_settings();
186 -
187 - if ( $frm_settings->load_style === 'none' ) {
96 + if ( $frm_settings->load_style == 'none' ) {
188 97 return;
189 98 }
190 99
191 100 $css = apply_filters( 'get_frm_stylesheet', self::custom_stylesheet() );
192 101
193 - if ( $css ) {
194 - $css = (array) $css;
102 + if ( ! empty( $css ) ) {
103 + $css = (array) $css;
104 +
195 105 $version = FrmAppHelper::plugin_version();
196 106
197 107 foreach ( $css as $css_key => $file ) {
198 108 if ( $register_css ) {
@@ -199,34 +109,30 @@
199 109 $this_version = self::get_css_version( $css_key, $version );
200 110 wp_register_style( $css_key, $file, array(), $this_version );
201 111 }
202 112
203 - $load_on_all = ! FrmAppHelper::is_admin() && 'all' === $frm_settings->load_style;
204 -
205 - if ( $load_on_all || $register !== 'register' ) {
113 + $load_on_all = ! FrmAppHelper::is_admin() && 'all' == $frm_settings->load_style;
114 + if ( $load_on_all || $register != 'register' ) {
206 115 wp_enqueue_style( $css_key );
207 116 }
208 117 unset( $css_key, $file );
209 118 }
210 119
211 - if ( $frm_settings->load_style === 'all' ) {
120 + if ( $frm_settings->load_style == 'all' ) {
212 121 $frm_vars['css_loaded'] = true;
213 122 }
214 - }//end if
123 + }
215 124 unset( $css );
216 125
217 126 add_filter( 'style_loader_tag', 'FrmStylesController::add_tags_to_css', 10, 2 );
218 127 }
219 128
220 - /**
221 - * @return array<string,string>
222 - */
223 129 public static function custom_stylesheet() {
224 130 global $frm_vars;
225 131 $stylesheet_urls = array();
226 132
227 - if ( empty( $frm_vars['css_loaded'] ) ) {
228 - // Include css in head.
133 + if ( ! isset( $frm_vars['css_loaded'] ) || ! $frm_vars['css_loaded'] ) {
134 + //include css in head
229 135 self::get_url_to_custom_style( $stylesheet_urls );
230 136 }
231 137
232 138 return $stylesheet_urls;
@@ -231,22 +137,15 @@
231 137
232 138 return $stylesheet_urls;
233 139 }
234 140
235 - /**
236 - * @param array $stylesheet_urls
237 - *
238 - * @return void
239 - */
240 141 private static function get_url_to_custom_style( &$stylesheet_urls ) {
241 142 $file_name = '/css/' . self::get_file_name();
242 -
243 143 if ( is_readable( FrmAppHelper::plugin_path() . $file_name ) ) {
244 144 $url = FrmAppHelper::plugin_url() . $file_name;
245 145 } else {
246 146 $url = admin_url( 'admin-ajax.php?action=frmpro_css' );
247 147 }
248 -
249 148 $stylesheet_urls['formidable'] = $url;
250 149 }
251 150
252 151 /**
@@ -252,694 +151,202 @@
252 151 /**
253 152 * Use a different stylesheet per site in a multisite install
254 153 *
255 154 * @since 3.0.03
256 - *
257 - * @return string
258 155 */
259 156 public static function get_file_name() {
260 157 if ( is_multisite() ) {
261 - return 'formidableforms' . absint( get_current_blog_id() ) . '.css';
158 + $blog_id = get_current_blog_id();
159 + $name = 'formidableforms' . absint( $blog_id ) . '.css';
160 + } else {
161 + $name = 'formidableforms.css';
262 162 }
263 163
264 - return 'formidableforms.css';
164 + return $name;
265 165 }
266 166
267 - /**
268 - * @param string $css_key
269 - * @param string $version
270 - *
271 - * @return string
272 - */
273 167 private static function get_css_version( $css_key, $version ) {
274 - if ( 'formidable' !== $css_key ) {
275 - return $version;
168 + if ( 'formidable' == $css_key ) {
169 + $this_version = get_option( 'frm_last_style_update' );
170 + if ( ! $this_version ) {
171 + $this_version = $version;
172 + }
173 + } else {
174 + $this_version = $version;
276 175 }
277 176
278 - $this_version = get_option( 'frm_last_style_update' );
279 -
280 - return $this_version ? $this_version : $version;
177 + return $this_version;
281 178 }
282 179
283 - /**
284 - * @param string $tag
285 - * @param string $handle
286 - *
287 - * @return string
288 - */
289 180 public static function add_tags_to_css( $tag, $handle ) {
290 - if ( ( 'formidable' === $handle || 'jquery-theme' === $handle ) && ! str_contains( $tag, ' property=' ) ) {
291 - return str_replace( ' type="', ' property="stylesheet" type="', $tag );
181 + if ( ( 'formidable' == $handle || 'jquery-theme' == $handle ) && strpos( $tag, ' property=' ) === false ) {
182 + $frm_settings = FrmAppHelper::get_settings();
183 + if ( $frm_settings->use_html ) {
184 + $tag = str_replace( ' type="', ' property="stylesheet" type="', $tag );
185 + }
292 186 }
293 187
294 188 return $tag;
295 189 }
296 190
297 - /**
298 - * Route the edit route to the style function.
299 - *
300 - * @since 6.0 this function no longer has any parameter values.
301 - *
302 - * @return void
303 - */
304 - public static function edit() {
305 - self::load_styler();
191 + public static function new_style( $return = '' ) {
192 + self::load_styler( 'default' );
306 193 }
307 194
308 - /**
309 - * When a new style route is hit, show a new style with the defaults. There is no ID yet, it is created after the first save event.
310 - *
311 - * @return void
312 - */
313 - public static function new_style() {
314 - self::load_styler();
315 - }
316 -
317 - /**
318 - * When the duplicate route is hit, it just shows the visual styler with a copy of the target style. There is no ID yet, it is created after the first save event.
319 - *
320 - * @return void
321 - */
322 195 public static function duplicate() {
323 - self::load_styler();
196 + self::load_styler( 'default' );
324 197 }
325 198
326 - /**
327 - * Render the style page for a form for assigning a style to a form, and for updating a target style.
328 - *
329 - * @since 6.0 this function no longer takes parameters.
330 - *
331 - * @return void
332 - */
333 - public static function load_styler() {
334 - if ( 'assign_style' === FrmAppHelper::get_post_param( 'frm_action' ) ) {
335 - self::save_form_style();
336 - }
337 -
338 - self::setup_styles_and_scripts_for_styler();
339 -
340 - $style_id = self::get_style_id_for_styler();
341 -
199 + public static function edit( $style_id = false, $message = '' ) {
342 200 if ( ! $style_id ) {
343 - $error_args = array(
344 - 'title' => __( 'No styles', 'formidable' ),
345 - 'body' => __( 'You must have a style to use the Visual Styler.', 'formidable' ),
346 - 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
347 - );
348 - FrmAppController::show_error_modal( $error_args );
349 - return;
350 - }
351 -
352 - $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
353 -
354 - if ( ! $form_id ) {
355 - $form_id = self::get_form_id_for_style( $style_id );
356 - }
357 -
358 - $form = FrmForm::getOne( $form_id );
359 -
360 - if ( ! is_object( $form ) ) {
361 - $error_args = array(
362 - 'title' => __( 'No forms', 'formidable' ),
363 - 'body' => __( 'You must have a form to use the Visual Styler.', 'formidable' ),
364 - 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
365 - );
366 - FrmAppController::show_error_modal( $error_args );
367 - return;
368 - }
369 -
370 - $frm_style = new FrmStyle( $style_id );
371 - $active_style = $frm_style->get_one();
372 -
373 - self::disable_admin_page_styling_on_submit_buttons();
374 -
375 - /**
376 - * @since 6.0
377 - *
378 - * @param array{form:\stdClass} $data
379 - */
380 - do_action( 'frm_before_render_style_page', compact( 'form' ) );
381 -
382 - self::render_style_page( $active_style, $form, self::get_default_style() );
383 - }
384 -
385 - /**
386 - * @since 6.0
387 - *
388 - * @return int
389 - */
390 - private static function get_style_id_for_styler() {
391 - $action = FrmAppHelper::simple_get( 'frm_action' );
392 -
393 - if ( 'duplicate' === $action ) {
394 - // The duplicate action uses style_id instead of id for better backward compatibility.
395 - return FrmAppHelper::simple_get( 'style_id', 'absint', 0 );
396 - }
397 -
398 - $style_id = FrmAppHelper::simple_get( 'id', 'absint', 0 );
399 -
400 - if ( $style_id ) {
401 - // Always use the style ID from the URL if one is specified.
402 - return $style_id;
403 - }
404 -
405 - $request_form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
406 -
407 - if ( $request_form_id && is_callable( 'FrmProStylesController::get_active_style_for_form' ) ) {
408 - return FrmProStylesController::get_active_style_for_form( $request_form_id )->ID;
409 - }
410 -
411 - return self::get_default_style()->ID;
412 - }
413 -
414 - /**
415 - * If a form ID is not being passed in the URL, try to get the best match.
416 - *
417 - * @since 6.0
418 - *
419 - * @param int $style_id
420 - *
421 - * @return int
422 - */
423 - private static function get_form_id_for_style( $style_id ) {
424 - $check = serialize( array( 'custom_style' => (string) $style_id ) );
425 - $check = substr( $check, 5, -1 );
426 - $form_id = FrmDb::get_var(
427 - 'frm_forms',
428 - array(
429 - 'options LIKE' => $check,
430 - 'status' => 'published',
431 - )
432 - );
433 -
434 - if ( ! $form_id ) {
435 - // Fallback to any form.
436 - $where = array(
437 - 'status' => 'published',
438 - // Make sure it's not a repeater.
439 - 'parent_form_id' => array( null, 0 ),
440 - );
441 - $form_id = FrmDb::get_var( 'frm_forms', $where, 'id' );
442 - }
443 -
444 - return $form_id;
445 - }
446 -
447 - /**
448 - * Add a frm_no_style_button class to all buttons to avoid some style rules like border-radius: 30px.
449 - *
450 - * @return void
451 - */
452 - private static function disable_admin_page_styling_on_submit_buttons() {
453 - add_filter(
454 - 'frm_submit_button_class',
455 - function ( $classes ) {
456 - $classes[] = 'frm_no_style_button';
457 - return $classes;
201 + $style_id = FrmAppHelper::get_param( 'id', '', 'get', 'absint' );
202 + if ( empty( $style_id ) ) {
203 + $style_id = 'default';
458 204 }
459 - );
460 - }
461 -
462 - /**
463 - * @since 6.0
464 - *
465 - * @return WP_Post
466 - */
467 - private static function get_default_style() {
468 - $frm_style = new FrmStyle( 'default' );
469 - return $frm_style->get_one();
470 - }
471 -
472 - /**
473 - * Save style for form (from Styler list page) via a POST action.
474 - *
475 - * @since 6.0
476 - *
477 - * @return void
478 - */
479 - private static function save_form_style() {
480 - $permission_error = FrmAppHelper::permission_nonce_error( 'frm_edit_forms', 'frm_save_form_style', 'frm_save_form_style_nonce' );
481 -
482 - if ( $permission_error !== false ) {
483 - wp_die( 'Unable to save form', '', 403 );
484 205 }
485 206
486 - $style_id = FrmAppHelper::get_post_param( 'style_id', 0, 'absint' );
487 -
488 - if ( $style_id && ! self::confirm_style_exists_before_setting( $style_id ) ) {
489 - wp_die( esc_html__( 'Invalid target style', 'formidable' ), esc_html__( 'Invalid target style', 'formidable' ), 400 );
490 - return;
207 + if ( 'default' == $style_id ) {
208 + $style = 'default';
209 + } else {
210 + $frm_style = new FrmStyle( $style_id );
211 + $style = $frm_style->get_one();
212 + $style = $style->ID;
491 213 }
492 214
493 - /**
494 - * Hook into the saved style ID so Pro can import a style template by its key and return a new style ID.
495 - *
496 - * @since 6.0
497 - *
498 - * @param int $style_id
499 - */
500 - $style_id = apply_filters( 'frm_saved_form_style_id', $style_id );
501 -
502 - if ( ! $style_id && '0' !== FrmAppHelper::get_post_param( 'style_id', '', 'sanitize_text_field' ) ) {
503 - // "0" is a special value used for the enable/disable toggle.
504 - wp_die( esc_html__( 'Invalid style value', 'formidable' ), esc_html__( 'Invalid style value', 'formidable' ), 400 );
505 - return;
506 - }
507 -
508 - $form_id = FrmAppHelper::get_post_param( 'form_id', 0, 'absint' );
509 -
510 - if ( ! $form_id ) {
511 - wp_die( esc_html__( 'No form specified', 'formidable' ), esc_html__( 'No form specified', 'formidable' ), 400 );
512 - return;
513 - }
514 -
515 - $form = FrmForm::getOne( $form_id );
516 -
517 - if ( ! $form ) {
518 - wp_die( esc_html__( 'Form does not exist', 'formidable' ), esc_html__( 'Form does not exist', 'formidable' ), 400 );
519 - return;
520 - }
521 -
522 - $previous_style_id = $form->options['custom_style'];
523 -
524 - // If the default style is selected, use the "Always use default" legacy option instead of the default style.
525 - // There's also a check here for conversational forms.
526 - // Without the check it isn't possible to select "Default" because "Always use default" will convert to "Lines" dynamically.
527 -
528 - if ( $style_id === self::get_default_style()->ID && empty( $form->options['chat'] ) ) {
529 - $style_id = 1;
530 - }
531 -
532 - // We want to save a string for consistency. FrmStylesHelper::get_form_count_for_style expects the custom style ID is a string.
533 - $form->options['custom_style'] = (string) $style_id;
534 -
535 - if ( $previous_style_id === $form->options['custom_style'] ) {
536 - // Exit early before updating DB if nothing actually changed.
537 - self::$message = __( 'Successfully updated style.', 'formidable' );
538 - return;
539 - }
540 -
541 - global $wpdb;
542 - $wpdb->update( $wpdb->prefix . 'frm_forms', array( 'options' => maybe_serialize( $form->options ) ), array( 'id' => $form->id ) );
543 -
544 - FrmForm::clear_form_cache();
545 -
546 - /**
547 - * @since 6.25.1
548 - *
549 - * @param int $form_id
550 - * @param int $style_id
551 - */
552 - do_action( 'frm_after_changed_form_style', absint( $form_id ), absint( $style_id ) );
553 -
554 - self::$message = __( 'Successfully updated style.', 'formidable' );
215 + self::load_styler( $style, $message );
555 216 }
556 217
557 - /**
558 - * Validate that we're assigning a form to a style that actually exists before assigning it to a form.
559 - *
560 - * @param int $style_id
561 - *
562 - * @return bool True if the style actually exists.
563 - */
564 - private static function confirm_style_exists_before_setting( $style_id ) {
565 - global $wpdb;
566 - $post_type = FrmDb::get_var( $wpdb->posts, array( 'ID' => $style_id ), 'post_type' );
567 - return self::$post_type === $post_type;
568 - }
569 -
570 - /**
571 - * Register and enqueue styles and scripts for the style tab page.
572 - *
573 - * @since 6.0
574 - *
575 - * @return void
576 - */
577 - private static function setup_styles_and_scripts_for_styler() {
578 - $plugin_url = FrmAppHelper::plugin_url();
579 - $version = FrmAppHelper::plugin_version();
580 - $js_dependencies = array( 'wp-i18n', 'wp-hooks', 'formidable_dom' );
581 -
582 - if ( FrmAppHelper::pro_is_installed() && is_callable( 'FrmProAppHelper::use_jquery_datepicker' ) && FrmProAppHelper::use_jquery_datepicker() ) {
583 - $js_dependencies[] = 'jquery-ui-datepicker';
584 - }
585 -
586 - wp_register_script( 'formidable_style', $plugin_url . '/js/admin/style.js', $js_dependencies, $version );
587 - wp_register_style( 'formidable_style', $plugin_url . '/css/admin/style.css', array(), $version );
588 - wp_print_styles( 'formidable_style' );
589 -
590 - wp_print_styles( 'formidable' );
591 - wp_enqueue_script( 'formidable_style' );
592 - wp_set_script_translations( 'formidable_style', 'formidable' );
593 - }
594 -
595 - /**
596 - * Render the style page (with a more limited and typed scope than calling it from self::style directly).
597 - *
598 - * @since 6.0
599 - *
600 - * @param stdClass|WP_Post $active_style
601 - * @param stdClass $form
602 - * @param WP_Post $default_style
603 - *
604 - * @return void
605 - */
606 - private static function render_style_page( $active_style, $form, $default_style ) {
607 - $style_views_path = self::get_views_path();
608 - // Edit, list (default), new_style.
609 - $view = FrmAppHelper::simple_get( 'frm_action', 'sanitize_text_field', 'list' );
610 - $frm_style = new FrmStyle( $active_style->ID );
611 -
612 - if ( 'new_style' !== $view && ! FrmAppHelper::simple_get( 'form' ) && ! FrmAppHelper::simple_get( 'style_id' ) ) {
613 - // Have the Appearance > Forms link fallback to the edit view. Otherwise we want to use 'list' as the default.
614 - $view = 'edit';
615 - }
616 -
617 - if ( in_array( $view, array( 'edit', 'new_style', 'duplicate' ), true ) ) {
618 - self::add_meta_boxes();
619 - }
620 -
621 - switch ( $view ) {
622 - case 'edit':
623 - $style = $active_style;
624 - break;
625 -
626 - case 'duplicate':
627 - $style = clone $active_style;
628 - $new_style = $frm_style->get_new();
629 - $style->ID = $new_style->ID;
630 - $style->post_name = $new_style->post_name;
631 - unset( $new_style );
632 - break;
633 -
634 - case 'new_style':
635 - $style = $frm_style->get_new();
636 - break;
637 - }
638 -
639 - if ( in_array( $view, array( 'duplicate', 'new_style' ), true ) ) {
640 - $style->post_title = FrmAppHelper::simple_get( 'style_name' );
641 - $style->menu_order = 0;
642 - }
643 -
644 - if ( ! isset( $style ) ) {
645 - $style = $active_style;
646 - }
647 -
648 - self::force_form_style( $style );
649 -
650 - if ( isset( self::$message ) ) {
651 - $message = self::$message;
652 - }
653 -
654 - $preview_helper = new FrmStylesPreviewHelper( $form->id );
655 - $preview_helper->adjust_form_for_preview();
656 -
657 - // Get form HTML before displaying warnings and notes so we can check global $frm_vars data without adding extra database calls.
658 - $target_form_preview_html = $preview_helper->get_html_for_form_preview();
659 - $warnings = $preview_helper->get_warnings_for_styler_preview( $style, $default_style, $view );
660 - $notes = $preview_helper->get_notes_for_styler_preview();
661 -
662 - include $style_views_path . 'show.php';
663 - }
664 -
665 - /**
666 - * @since 6.0
667 - *
668 - * @return string
669 - */
670 - private static function get_views_path() {
671 - return FrmAppHelper::plugin_path() . '/classes/views/styles/';
672 - }
673 -
674 - /**
675 - * Filter form classes so the form uses the preview style, not the form's active style.
676 - *
677 - * @since 6.0
678 - *
679 - * @param stdClass|WP_Post $style A new style is not a WP_Post object.
680 - *
681 - * @return void
682 - */
683 - private static function force_form_style( $style ) {
684 - add_filter(
685 - 'frm_add_form_style_class',
686 - function ( $class ) use ( $style ) {
687 - $split = array_filter(
688 - explode( ' ', $class ),
689 - /**
690 - * @param string $class
691 - */
692 - function ( $class ) {
693 - return $class && ! str_starts_with( $class, 'frm_style_' );
694 - }
695 - );
696 - $split[] = 'frm_style_' . $style->post_name;
697 - return implode( ' ', $split );
698 - }
699 - );
700 - }
701 -
702 - /**
703 - * Save style post object via a POST request submitted from the Visual styler "edit" page.
704 - *
705 - * @since 6.0
706 - *
707 - * @return void
708 - */
709 - public static function save_style() {
710 - FrmAppHelper::permission_check( 'frm_change_settings' );
711 -
218 + public static function save() {
712 219 $frm_style = new FrmStyle();
220 + $message = '';
713 221 $post_id = FrmAppHelper::get_post_param( 'ID', false, 'sanitize_title' );
714 222 $style_nonce = FrmAppHelper::get_post_param( 'frm_style', '', 'sanitize_text_field' );
715 223
716 - if ( $post_id === false || ! wp_verify_nonce( $style_nonce, 'frm_style_nonce' ) ) {
717 - // Exit early if the request isn't valid.
718 - // Since we're not dying, it should just reload the visual styler without any message.
719 - return;
224 + if ( $post_id !== false && wp_verify_nonce( $style_nonce, 'frm_style_nonce' ) ) {
225 + $id = $frm_style->update( $post_id );
226 + if ( empty( $post_id ) && ! empty( $id ) ) {
227 + // set the post id to the new style so it will be loaded for editing
228 + $post_id = reset( $id );
229 + }
230 + // include the CSS that includes this style
231 + echo '<link href="' . esc_url( admin_url( 'admin-ajax.php?action=frmpro_css' ) ) . '" type="text/css" rel="Stylesheet" class="frm-custom-theme" />';
232 + $message = __( 'Your styling settings have been saved.', 'formidable' );
720 233 }
721 234
722 - $id = $frm_style->update( $post_id );
723 -
724 - if ( ! $post_id && $id ) {
725 - self::maybe_redirect_after_save( $id );
726 - // Set the post id to the new style so it will be loaded for editing.
727 - $post_id = reset( $id );
728 - }
729 -
730 - /**
731 - * @since 6.25.1
732 - *
733 - * @param int $post_id
734 - */
735 - do_action( 'frm_after_saved_style', absint( $post_id ) );
736 -
737 - self::$message = __( 'Your styling settings have been saved.', 'formidable' );
235 + return self::edit( $post_id, $message );
738 236 }
739 237
740 - /**
741 - * Show the edit view after saving.
742 - * The save event is triggered earlier, on admin init where self::save_style is called.
743 - * This happens earlier because there is a possible redirect (to adjust the URL for a new or duplicated style).
744 - *
745 - * @return void
746 - */
747 - public static function save() {
748 - self::edit();
749 - }
238 + public static function load_styler( $style, $message = '' ) {
239 + global $frm_settings;
750 240
751 - /**
752 - * Force a redirect after duplicating or creating a new style to avoid an old stale URL that could result in more styles than intended.
753 - *
754 - * @since 6.0
755 - *
756 - * @param array $ids
757 - *
758 - * @return void
759 - */
760 - private static function maybe_redirect_after_save( $ids ) {
761 - $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
762 - $parsed = parse_url( $referer );
763 - $query = $parsed['query'];
764 - $current_action = false;
765 - $actions_to_redirect = array( 'duplicate', 'new_style' );
241 + $frm_style = new FrmStyle();
242 + $styles = $frm_style->get_all();
766 243
767 - foreach ( $actions_to_redirect as $action ) {
768 - if ( str_contains( $query, 'frm_action=' . $action ) ) {
769 - $current_action = $action;
770 - break;
771 - }
244 + if ( is_numeric( $style ) ) {
245 + $style = $styles[ $style ];
246 + } elseif ( 'default' == $style ) {
247 + $style = $frm_style->get_default_style( $styles );
772 248 }
773 249
774 - if ( false === $current_action ) {
775 - // Do not redirect as the referer URL did not match $actions_to_redirect.
776 - return;
777 - }
250 + self::add_meta_boxes();
778 251
779 - parse_str( $query, $parsed_query );
780 - $form_id = ! empty( $parsed_query['form'] ) ? absint( $parsed_query['form'] ) : 0;
781 - $style = new stdClass();
782 - $style->ID = end( $ids );
783 - wp_safe_redirect( esc_url_raw( FrmStylesHelper::get_edit_url( $style, $form_id ) ) );
784 - die();
252 + include( FrmAppHelper::plugin_path() . '/classes/views/styles/show.php' );
785 253 }
786 254
787 255 /**
788 - * @since 6.0
789 - *
790 - * @param string $message
256 + * @param string $message
791 257 * @param array|object $forms
792 - *
793 - * @return void
794 258 */
795 - public static function manage( $message = '', $forms = array() ) {
259 + private static function manage( $message = '', $forms = array() ) {
796 260 $frm_style = new FrmStyle();
797 261 $styles = $frm_style->get_all();
798 262 $default_style = $frm_style->get_default_style( $styles );
799 - $frm_settings = FrmAppHelper::get_settings();
800 263
801 - if ( ! $forms ) {
264 + if ( empty( $forms ) ) {
802 265 $forms = FrmForm::get_published_forms();
803 266 }
804 267
805 - include FrmAppHelper::plugin_path() . '/classes/views/styles/manage.php';
268 + include( FrmAppHelper::plugin_path() . '/classes/views/styles/manage.php' );
806 269 }
807 270
808 - /**
809 - * Handle saving for the page rendered in self::manage which is included in Global Settings in the "Manage Styles" tab.
810 - * This gets called from the frm_update_settings hook which is called after saving Global settings.
811 - *
812 - * @return void
813 - */
814 271 private static function manage_styles() {
272 + $style_nonce = FrmAppHelper::get_post_param( 'frm_manage_style', '', 'sanitize_text_field' );
273 + // phpcs:ignore WordPress.Security.NonceVerification.Missing
274 + if ( ! $_POST || ! isset( $_POST['style'] ) || ! wp_verify_nonce( $style_nonce, 'frm_manage_style_nonce' ) ) {
275 + return self::manage();
276 + }
277 +
815 278 global $wpdb;
816 279
817 280 $forms = FrmForm::get_published_forms();
818 -
819 281 foreach ( $forms as $form ) {
820 - if ( ! isset( $_POST['style'] ) || ! isset( $_POST['style'][ $form->id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
282 + $new_style = ( isset( $_POST['style'] ) && isset( $_POST['style'][ $form->id ] ) ) ? sanitize_text_field( wp_unslash( $_POST['style'][ $form->id ] ) ) : '';
283 + $previous_style = ( isset( $_POST['prev_style'] ) && isset( $_POST['prev_style'][ $form->id ] ) ) ? sanitize_text_field( wp_unslash( $_POST['prev_style'][ $form->id ] ) ) : '';
284 + if ( $new_style == $previous_style ) {
821 285 continue;
822 286 }
823 287
824 - $new_style = sanitize_text_field( wp_unslash( $_POST['style'][ $form->id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
288 + $form->options['custom_style'] = $new_style;
825 289
826 - $form->options['custom_style'] = $new_style;
827 290 $wpdb->update( $wpdb->prefix . 'frm_forms', array( 'options' => maybe_serialize( $form->options ) ), array( 'id' => $form->id ) );
828 291 unset( $form );
829 292 }
293 +
294 + $message = __( 'Your form styles have been saved.', 'formidable' );
295 +
296 + return self::manage( $message, $forms );
830 297 }
831 298
832 299 /**
833 - * Echo content for the Custom CSS page.
834 - *
835 - * @param string $message
836 - * @param array $extra_args An array of extra arguments.
837 - *
300 + * @param string $message
301 + * @param FrmStyle|null $style
838 302 * @return void
839 303 */
840 - public static function custom_css( $message = '', $extra_args = array() ) {
841 - $id = $extra_args['id'] ?? 'frm_codemirror_box';
842 - $settings = self::enqueue_codemirror( $id, $extra_args['placeholder'] ?? '' );
843 - $id = $settings ? $id : 'frm_custom_css_box';
844 - $show_errors = $extra_args['show_errors'] ?? true;
845 - $custom_css = $extra_args['custom_css'] ?? self::get_custom_css();
846 - $heading = $extra_args['heading'] ?? __( 'You can add custom css here or in your theme style.css. Any CSS added here will be used anywhere the Formidable CSS is loaded.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
847 - $textarea_params = ! empty( $extra_args['textarea_params'] ) ? $extra_args['textarea_params'] : array(
848 - 'name' => 'frm_custom_css',
849 - 'id' => $id,
850 - );
851 -
852 - if ( $settings ) {
853 - $textarea_params['class'] = 'hide-if-js';
304 + public static function custom_css( $message = '', $style = null ) {
305 + if ( function_exists( 'wp_enqueue_code_editor' ) ) {
306 + $id = 'frm_codemirror_box';
307 + $settings = wp_enqueue_code_editor(
308 + array(
309 + 'type' => 'text/css',
310 + 'codemirror' => array(
311 + 'indentUnit' => 2,
312 + 'tabSize' => 2,
313 + ),
314 + )
315 + );
316 + } else {
317 + $settings = false;
854 318 }
855 319
856 - include FrmAppHelper::plugin_path() . '/classes/views/styles/custom_css.php';
857 - }
858 -
859 - /**
860 - * Get custom CSS code entered in the Custom CSS page.
861 - *
862 - * @since 6.0
863 - *
864 - * @param array|null $single_style_settings The single style settings.
865 - *
866 - * @return string
867 - */
868 - public static function get_custom_css( $single_style_settings = null ) {
869 - if ( $single_style_settings ) {
870 - // If the single style settings are passed, return the custom CSS from the single style settings.
871 - if ( ! empty( $single_style_settings['single_style_custom_css'] ) && ! empty( $single_style_settings['enable_style_custom_css'] ) ) {
872 - return $single_style_settings['single_style_custom_css'];
873 - }
874 -
875 - return '';
320 + if ( empty( $settings ) ) {
321 + $id = 'frm_custom_css_box';
876 322 }
877 323
878 - $settings = FrmAppHelper::get_settings();
879 -
880 - if ( is_string( $settings->custom_css ) ) {
881 - return $settings->custom_css;
324 + if ( ! isset( $style ) ) {
325 + $frm_style = new FrmStyle();
326 + $style = $frm_style->get_default_style();
882 327 }
883 328
884 - // If it does not exist, check the default style as a fallback.
885 - $frm_style = new FrmStyle();
886 - $style = $frm_style->get_default_style();
887 -
888 - return $style->post_content['custom_css'];
329 + include FrmAppHelper::plugin_path() . '/classes/views/styles/custom_css.php';
889 330 }
890 331
891 332 /**
892 - * Enqueue assets for codemirror, built into WordPress since 4.9.
893 - * The Custom CSS page uses codemirror.
894 - *
895 - * @since 6.0 Previously this code was embedded in self::custom_css.
896 - *
897 - * @param string $id The ID of the codemirror box.
898 - * @param string $placeholder The placeholder text for the codemirror box.
899 - *
900 - * @return array|false
333 + * @return void
901 334 */
902 - private static function enqueue_codemirror( $id = 'frm_codemirror_box', $placeholder = '' ) {
903 - if ( ! function_exists( 'wp_enqueue_code_editor' ) ) {
904 - // The WordPress version is likely older than 4.9.
905 - return false;
906 - }
335 + public static function save_css() {
336 + $frm_style = new FrmStyle();
907 337
908 - $settings = wp_enqueue_code_editor(
909 - array(
910 - 'type' => 'text/css',
911 - 'codemirror' => array(
912 - 'indentUnit' => 2,
913 - 'tabSize' => 2,
914 - // As the codemirror box only appears once you click into the Custom CSS tab, we need to auto-refresh.
915 - // Otherwise the line numbers all end up with a 1px width causing overlap issues with the text in the content.
916 - 'autoRefresh' => true,
917 - 'placeholder' => $placeholder,
918 - ),
919 - )
920 - );
921 -
922 - if ( $settings ) {
923 - wp_add_inline_script(
924 - 'code-editor',
925 - sprintf(
926 - 'jQuery( function() { window.%s_wp_editor = wp.codeEditor.initialize( \'%s\', %s ); } );',
927 - $id,
928 - $id,
929 - wp_json_encode( $settings )
930 - )
931 - );
338 + $message = '';
339 + $post_id = FrmAppHelper::get_post_param( 'ID', false, 'sanitize_text_field' );
340 + $nonce = FrmAppHelper::get_post_param( 'frm_custom_css', '', 'sanitize_text_field' );
341 + if ( wp_verify_nonce( $nonce, 'frm_custom_css_nonce' ) ) {
342 + $frm_style->update( $post_id );
343 + $message = __( 'Your styling settings have been saved.', 'formidable' );
932 344 }
933 345
934 - return $settings;
346 + self::custom_css( $message );
935 347 }
936 348
937 - /**
938 - * Handling routing for the visual styler.
939 - *
940 - * @return void
941 - */
942 349 public static function route() {
943 350 $action = FrmAppHelper::get_param( 'frm_action', '', 'get', 'sanitize_title' );
944 351 FrmAppHelper::include_svg();
945 352
@@ -945,102 +352,54 @@
945 352
946 353 switch ( $action ) {
947 354 case 'edit':
948 355 case 'save':
949 - self::$action();
950 - return;
356 + case 'manage':
357 + case 'manage_styles':
358 + case 'custom_css':
359 + case 'save_css':
360 + return self::$action();
951 361 default:
952 362 do_action( 'frm_style_action_route', $action );
953 -
954 363 if ( apply_filters( 'frm_style_stop_action_route', false, $action ) ) {
955 364 return;
956 365 }
957 366
958 - if ( in_array( $action, array( 'new_style', 'duplicate' ), true ) ) {
959 - self::$action();
960 - return;
367 + if ( 'new_style' == $action || 'duplicate' == $action ) {
368 + return self::$action();
961 369 }
962 370
963 - self::edit();
964 - return;
371 + return self::edit();
965 372 }
966 373 }
967 374
968 - /**
969 - * Handle AJAX routing for frm_settings_reset for resetting styles to the default settings.
970 - * From the edit view, it will return default styles and not actually update the style.
971 - * On the list view, it does update the style immediately, and returns the default card style attributes so the style card can be reset as well.
972 - *
973 - * @since 6.0 When a style_id is passed to this action, the style will actually be reset.
974 - *
975 - * @return void
976 - */
977 375 public static function reset_styling() {
978 376 FrmAppHelper::permission_check( 'frm_change_settings' );
979 377 check_ajax_referer( 'frm_ajax', 'nonce' );
980 378
981 - $style_id = FrmAppHelper::get_post_param( 'style_id', '', 'absint' );
379 + $frm_style = new FrmStyle();
380 + $defaults = $frm_style->get_defaults();
982 381
983 - if ( ! $style_id ) {
984 - // A style ID is not sent when resetting on the edit page.
985 - // Instead of resetting the style, send the defaults back so the inputs can be updated with JavaScript.
986 - $frm_style = new FrmStyle();
987 - echo json_encode( $frm_style->get_defaults() );
988 - wp_die();
989 - }
990 -
991 - $frm_style = new FrmStyle();
992 - $default_template_style = $frm_style->get_default_template_style( $style_id );
993 - $where = array(
994 - 'ID' => $style_id,
995 - 'post_type' => self::$post_type,
996 - );
997 -
998 - $style_object = $frm_style->get_new();
999 - $style_object->post_content = json_decode( $default_template_style, true );
1000 -
1001 - global $wpdb;
1002 - $wpdb->update( $wpdb->posts, array( 'post_content' => $default_template_style ), $where );
1003 -
1004 - // Save the settings after resetting to default or the old style will still appear.
1005 - $frm_style->save_settings();
1006 -
1007 - $data = array(
1008 - 'style' => FrmStylesCardHelper::get_style_param_for_card( $style_object ),
1009 - );
1010 - wp_send_json_success( $data );
382 + echo json_encode( $defaults );
1011 383 wp_die();
1012 384 }
1013 385
1014 - /**
1015 - * Handle routing for the frm_change_styling AJAX action.
1016 - * This doesn't actually change styling. It just handles the events when someone changes a style.
1017 - * It responds with the new CSS required for the updated styler preview in the edit page.
1018 - *
1019 - * @return void
1020 - */
1021 386 public static function change_styling() {
1022 - FrmAppHelper::permission_check( 'frm_change_settings' );
1023 387 check_ajax_referer( 'frm_ajax', 'nonce' );
1024 388
1025 - $is_loaded_via_ajax = true;
1026 - $frm_style = new FrmStyle();
389 + $frm_style = new FrmStyle();
390 + $defaults = $frm_style->get_defaults();
391 + $style = '';
1027 392
1028 - // Intentionally avoid defaults here so nothing gets removed from our style.
1029 - $defaults = array();
1030 - $style = '';
1031 -
1032 393 echo '<style type="text/css">';
1033 - include FrmAppHelper::plugin_path() . '/css/_single_theme.css.php';
394 + include( FrmAppHelper::plugin_path() . '/css/_single_theme.css.php' );
1034 395 echo '</style>';
1035 396 wp_die();
1036 397 }
1037 398
1038 - /**
1039 - * @return void
1040 - */
1041 - public static function add_meta_boxes() {
1042 - // Setup meta boxes
399 + private static function add_meta_boxes() {
400 +
401 + // setup meta boxes
1043 402 $meta_boxes = array(
1044 403 'general' => __( 'General', 'formidable' ),
1045 404 'form-title' => __( 'Form Title', 'formidable' ),
1046 405 'form-description' => __( 'Form Description', 'formidable' ),
@@ -1056,10 +415,8 @@
1056 415 /**
1057 416 * Add custom boxes to the styling settings
1058 417 *
1059 418 * @since 2.3
1060 - *
1061 - * @param array $meta_boxes
1062 419 */
1063 420 $meta_boxes = apply_filters( 'frm_style_boxes', $meta_boxes );
1064 421
1065 422 foreach ( $meta_boxes as $nicename => $name ) {
@@ -1067,14 +424,8 @@
1067 424 unset( $nicename, $name );
1068 425 }
1069 426 }
1070 427
1071 - /**
1072 - * @param array $atts
1073 - * @param array $sec
1074 - *
1075 - * @return void
1076 - */
1077 428 public static function include_style_section( $atts, $sec ) {
1078 429 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
1079 430 $style = $atts['style'];
1080 431 FrmStylesHelper::prepare_color_output( $style->post_content, false );
@@ -1091,9 +442,9 @@
1091 442 */
1092 443 $file_name = apply_filters( 'frm_style_settings_' . $sec['args'], $file_name );
1093 444
1094 445 echo '<div class="frm_grid_container">';
1095 - include $file_name;
446 + include( $file_name );
1096 447 echo '</div>';
1097 448 }
1098 449
1099 450 public static function load_css() {
@@ -1127,37 +478,17 @@
1127 478 */
1128 479 $output = apply_filters( 'frm_saved_css', $output );
1129 480
1130 481 echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1131 -
1132 - self::maybe_hide_sample_form_error_message();
1133 -
1134 482 wp_die();
1135 483 }
1136 484
1137 485 /**
1138 - * Add an extra style rule to hide a broken style warning.
1139 - * To avoid cluttering the front end with any unnecessary styles this is only added when the referer URL matches the styler.
1140 - *
1141 - * @since 6.2.3
1142 - *
1143 - * @return void
1144 - */
1145 - public static function maybe_hide_sample_form_error_message() {
1146 - $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1147 -
1148 - if ( str_contains( $referer, 'admin.php?page=formidable-styles' ) ) {
1149 - echo '#frm_broken_styles_warning { display: none; }';
1150 - }
1151 - }
1152 -
1153 - /**
1154 486 * Replaces relative URL with absolute URL.
1155 487 *
1156 488 * @since 4.11.03
1157 489 *
1158 490 * @param string $css CSS content.
1159 - *
1160 491 * @return string
1161 492 */
1162 493 public static function replace_relative_url( $css ) {
1163 494 $plugin_url = trailingslashit( FrmAppHelper::plugin_url() );
@@ -1180,55 +511,43 @@
1180 511 * Check if the Formidable styling should be loaded,
1181 512 * then enqueue it for the footer
1182 513 *
1183 514 * @since 2.0
1184 - *
1185 - * @return void
1186 515 */
1187 516 public static function enqueue_style() {
1188 517 global $frm_vars;
1189 518
1190 - if ( ! empty( $frm_vars['css_loaded'] ) ) {
519 + if ( isset( $frm_vars['css_loaded'] ) && $frm_vars['css_loaded'] ) {
1191 520 // The CSS has already been loaded.
1192 521 return;
1193 522 }
1194 523
1195 524 $frm_settings = FrmAppHelper::get_settings();
1196 -
1197 - if ( $frm_settings->load_style === 'none' ) {
1198 - return;
525 + if ( $frm_settings->load_style != 'none' ) {
526 + wp_enqueue_style( 'formidable' );
527 + $frm_vars['css_loaded'] = true;
1199 528 }
1200 -
1201 - wp_enqueue_style( 'formidable' );
1202 - $frm_vars['css_loaded'] = true;
1203 529 }
1204 530
1205 531 /**
1206 532 * Get the stylesheets for the form settings page
1207 - *
1208 - * @return array<WP_Post>
1209 533 */
1210 534 public static function get_style_opts() {
1211 535 $frm_style = new FrmStyle();
1212 - return $frm_style->get_all();
536 + $styles = $frm_style->get_all();
537 +
538 + return $styles;
1213 539 }
1214 540
1215 - /**
1216 - * Get the style post object for a target form.
1217 - *
1218 - * @param bool|object|string $form
1219 - *
1220 - * @return WP_Post|null
1221 - */
1222 541 public static function get_form_style( $form = 'default' ) {
1223 542 $style = FrmFormsHelper::get_form_style( $form );
1224 543
1225 - // phpcs:ignore Universal.Operators.StrictComparisons
1226 - if ( ! $style || 1 == $style ) {
544 + if ( empty( $style ) || 1 == $style ) {
1227 545 $style = 'default';
1228 546 }
1229 547
1230 548 $frm_style = new FrmStyle( $style );
549 +
1231 550 return $frm_style->get_one();
1232 551 }
1233 552
1234 553 /**
@@ -1233,13 +552,10 @@
1233 552
1234 553 /**
1235 554 * @param string $class
1236 555 * @param string $style
1237 - *
1238 - * @return string
1239 556 */
1240 557 public static function get_form_style_class( $class, $style ) {
1241 - // phpcs:ignore Universal.Operators.StrictComparisons
1242 558 if ( 1 == $style ) {
1243 559 $style = 'default';
1244 560 }
1245 561
@@ -1254,18 +570,15 @@
1254 570 return $class;
1255 571 }
1256 572
1257 573 /**
1258 - * @since 3.0
1259 - *
1260 574 * @param object $style
1261 575 * @param string $class
1262 576 *
1263 - * @return void
577 + * @since 3.0
1264 578 */
1265 579 private static function maybe_add_rtl_class( $style, &$class ) {
1266 580 $is_rtl = isset( $style->post_content['direction'] ) && 'rtl' === $style->post_content['direction'];
1267 -
1268 581 if ( $is_rtl ) {
1269 582 $class .= ' frm_rtl';
1270 583 }
1271 584 }
@@ -1270,28 +583,17 @@
1270 583 }
1271 584 }
1272 585
1273 586 /**
1274 - * @param string $val Style setting key.
1275 - * @param int|string $form Form ID or 'default'.
1276 - *
1277 - * @return mixed
587 + * @param string $val
1278 588 */
1279 589 public static function get_style_val( $val, $form = 'default' ) {
1280 590 $style = self::get_form_style( $form );
1281 -
1282 591 if ( $style && isset( $style->post_content[ $val ] ) ) {
1283 592 return $style->post_content[ $val ];
1284 593 }
1285 -
1286 - return null;
1287 594 }
1288 595
1289 - /**
1290 - * @param array $default_styles
1291 - *
1292 - * @return array
1293 - */
1294 596 public static function show_entry_styles( $default_styles ) {
1295 597 $frm_style = new FrmStyle( 'default' );
1296 598 $style = $frm_style->get_one();
1297 599
@@ -1300,15 +602,13 @@
1300 602 }
1301 603
1302 604 foreach ( $default_styles as $name => $val ) {
1303 605 $setting = $name;
1304 -
1305 - if ( 'border_width' === $name ) {
606 + if ( 'border_width' == $name ) {
1306 607 $setting = 'field_border_width';
1307 - } elseif ( 'alt_bg_color' === $name ) {
608 + } elseif ( 'alt_bg_color' == $name ) {
1308 609 $setting = 'bg_color_active';
1309 610 }
1310 -
1311 611 $default_styles[ $name ] = $style->post_content[ $setting ];
1312 612 unset( $name, $val );
1313 613 }
1314 614
@@ -1314,175 +614,14 @@
1314 614
1315 615 return $default_styles;
1316 616 }
1317 617
1318 - /**
1319 - * @param string $important
1320 - * @param array $field
1321 - *
1322 - * @return string
1323 - */
1324 - public static function important_style( $important, $field ) {
1325 - return self::get_style_val( 'important_style', $field['form_id'] );
1326 - }
618 + public static function &important_style( $important, $field ) {
619 + $important = self::get_style_val( 'important_style', $field['form_id'] );
1327 620
1328 - /**
1329 - * Duplicate of WordPress do_accordion_section function, it adds an additional svg icon support.
1330 - *
1331 - * @since 6.8.3
1332 - *
1333 - * @param string|WP_Screen $screen Screen ID or screen object.
1334 - * @param string $context Meta box context.
1335 - * @param mixed $data_object Data object passed to callbacks.
1336 - *
1337 - * @return int
1338 - */
1339 - public static function do_accordion_sections( $screen, $context, $data_object ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh
1340 - global $wp_meta_boxes;
1341 -
1342 - // The symbol id from icons.svg
1343 - $icon_ids = array(
1344 - 'ranking-fields-style' => 'frm_chart_bar_icon',
1345 - 'section-fields-style' => 'frm-form-title-style',
1346 - );
1347 -
1348 - wp_enqueue_script( 'accordion' );
1349 -
1350 - if ( ! $screen ) {
1351 - $screen = get_current_screen();
1352 - } elseif ( is_string( $screen ) ) {
1353 - $screen = convert_to_screen( $screen );
1354 - }
1355 -
1356 - $page = $screen->id;
1357 -
1358 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1359 - ?>
1360 - <div id="side-sortables" class="accordion-container">
1361 - <ul class="outer-border">
1362 - <?php
1363 - $i = 0;
1364 - $first_open = false;
1365 -
1366 - if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
1367 - foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
1368 - if ( ! isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
1369 - continue;
1370 - }
1371 -
1372 - foreach ( $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {
1373 - if ( false === $box || ! $box['title'] ) {
1374 - continue;
1375 - }
1376 -
1377 - ++$i;
1378 - $icon_id = array_key_exists( $box['id'], $icon_ids ) ? $icon_ids[ $box['id'] ] : 'frm-' . $box['id'];
1379 - $open_class = '';
1380 -
1381 - if ( ! $first_open ) {
1382 - $first_open = true;
1383 - $open_class = 'open';
1384 - }
1385 -
1386 - $accordion_content_id = 'frm_style_section_' . $box['id'];
1387 - ?>
1388 - <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'] ); ?>"><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1389 - <h3 class="accordion-section-title hndle">
1390 - <?php
1391 - FrmAppHelper::icon_by_class( 'frmfont ' . $icon_id . ' frm_svg24' );
1392 - echo esc_html( $box['title'] );
1393 - ?>
1394 - <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'] ); ?>"><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1395 - <?php FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown8_icon' ); ?>
1396 - </button>
1397 - </h3>
1398 - <div class="accordion-section-content <?php postbox_classes( $box['id'], $page ); ?>" id="<?php echo esc_attr( $accordion_content_id ); ?>">
1399 - <div class="inside">
1400 - <?php call_user_func( $box['callback'], $data_object, $box ); ?>
1401 - </div><!-- .inside -->
1402 - </div><!-- .accordion-section-content -->
1403 - </li><!-- .accordion-section -->
1404 - <?php
1405 - }//end foreach
1406 - }//end foreach
1407 - }//end if
1408 - ?>
1409 - </ul><!-- .outer-border -->
1410 - </div><!-- .accordion-container -->
1411 - <?php
1412 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1413 - return $i;
621 + return $important;
1414 622 }
1415 623
1416 - /**
1417 - * Rename a style via an AJAX action.
1418 - *
1419 - * @since 6.0
1420 - *
1421 - * @return void
1422 - */
1423 - public static function rename_style() {
1424 - $permission_error = FrmAppHelper::permission_nonce_error( 'frm_edit_forms', 'nonce', 'frm_ajax' );
1425 -
1426 - if ( $permission_error !== false ) {
1427 - $data = array(
1428 - 'message' => __( 'Unable to rename style', 'formidable' ),
1429 - );
1430 - wp_send_json_error( $data, 403 );
1431 - die();
1432 - }
1433 -
1434 - $style_id = FrmAppHelper::get_post_param( 'style_id', 0, 'absint' );
1435 - $style_name = FrmAppHelper::get_post_param( 'style_name', '', 'sanitize_text_field' );
1436 -
1437 - if ( ! $style_id || ! $style_name ) {
1438 - $data = array(
1439 - 'message' => __( 'Invalid route', 'formidable' ),
1440 - );
1441 - wp_send_json_error( $data, 400 );
1442 - die();
1443 - }
1444 -
1445 - $post = get_post( $style_id );
1446 -
1447 - if ( ! $post || $post->post_type !== self::$post_type ) {
1448 - $data = array(
1449 - 'message' => __( 'The style you are renaming either does not exist or it is not a style', 'formidable' ),
1450 - );
1451 - wp_send_json_error( $data, 404 );
1452 - die();
1453 - }
1454 -
1455 - global $wpdb;
1456 - $wpdb->update( $wpdb->posts, array( 'post_title' => $style_name ), array( 'ID' => $post->ID ) );
1457 -
1458 - $data = array();
1459 - wp_send_json_success( $data );
1460 - }
1461 -
1462 - /**
1463 - * Prevent the WordPress edit.css file from loading on the visual styler page.
1464 - * This way .form-field elements do not have border styles applied to them.
1465 - *
1466 - * @since 6.0
1467 - *
1468 - * @param WP_Styles $styles
1469 - *
1470 - * @return void
1471 - */
1472 - public static function disable_conflicting_wp_admin_css( $styles ) {
1473 - if ( ! FrmAppHelper::is_style_editor_page() ) {
1474 - return;
1475 - }
1476 -
1477 - FrmStylesPreviewHelper::disable_conflicting_wp_admin_css( $styles );
1478 - }
1479 -
1480 - /**
1481 - * @deprecated 6.1 Saving custom CSS has been moved into Global Settings.
1482 - *
1483 - * @return void
1484 - */
1485 - public static function save_css() {
1486 - _deprecated_function( __METHOD__, '6.1' );
624 + public static function do_accordion_sections( $screen, $context, $object ) {
625 + return do_accordion_sections( $screen, $context, $object );
1487 626 }
1488 627 }