PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.12
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.12
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
formidable / classes / helpers / FrmStylesHelper.php

FrmStylesHelper.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.12, at classes/helpers/FrmStylesHelper.php

751 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmStylesHelper {
7
8 public static function get_upload_base() {
9 $uploads = wp_upload_dir();
10 if ( is_ssl() && ! preg_match( '/^https:\/\/.*\..*$/', $uploads['baseurl'] ) ) {
11 $uploads['baseurl'] = str_replace( 'http://', 'https://', $uploads['baseurl'] );
12 }
13
14 return $uploads;
15 }
16
17 /**
18 * Called from the admin header.
19 *
20 * @since 4.0
21 */
22 public static function save_button() {
23 ?>
24 <input type="submit" name="submit" class="button button-primary frm-button-primary" value="<?php esc_attr_e( 'Update', 'formidable' ); ?>" />
25 <?php
26 }
27
28 /**
29 * @since 2.05
30 */
31 public static function get_css_label_positions() {
32 return array(
33 'none' => __( 'top', 'formidable' ),
34 'left' => __( 'left', 'formidable' ),
35 'right' => __( 'right', 'formidable' ),
36 'no_label' => __( 'none', 'formidable' ),
37 'inside' => __( 'inside', 'formidable' ),
38 );
39 }
40
41 /**
42 * @since 6.11 Added $field param.
43 *
44 * @param array|object $field
45 *
46 * @return array
47 */
48 public static function get_single_label_positions( $field = array() ) {
49 $label_positions = array(
50 'top' => __( 'Top', 'formidable' ),
51 'left' => __( 'Left', 'formidable' ),
52 'right' => __( 'Right', 'formidable' ),
53 'inline' => __( 'Inline (left without a set width)', 'formidable' ),
54 'none' => __( 'None', 'formidable' ),
55 'hidden' => __( 'Hidden (but leave the space)', 'formidable' ),
56 'inside' => __( 'Placeholder inside the field', 'formidable' ),
57 );
58
59 /**
60 * Allows updating label positions in field settings.
61 *
62 * @since 6.11
63 *
64 * @param array $label_positions
65 * @param array|object $field
66 */
67 return apply_filters( 'frm_single_label_positions', $label_positions, $field );
68 }
69
70 public static function minus_icons() {
71 return array(
72 0 => array(
73 '-' => '62e',
74 '+' => '62f',
75 ),
76 1 => array(
77 '-' => '600',
78 '+' => '602',
79 ),
80 2 => array(
81 '-' => '604',
82 '+' => '603',
83 ),
84 3 => array(
85 '-' => '633',
86 '+' => '632',
87 ),
88 4 => array(
89 '-' => '613',
90 '+' => '60f',
91 ),
92 );
93 }
94
95 public static function arrow_icons() {
96 $minus_icons = self::minus_icons();
97
98 return array(
99 6 => array(
100 '-' => '62d',
101 '+' => '62a',
102 ),
103 0 => array(
104 '-' => '60d',
105 '+' => '609',
106 ),
107 1 => array(
108 '-' => '60e',
109 '+' => '60c',
110 ),
111 2 => array(
112 '-' => '630',
113 '+' => '631',
114 ),
115 3 => array(
116 '-' => '62b',
117 '+' => '628',
118 ),
119 4 => array(
120 '-' => '62c',
121 '+' => '629',
122 ),
123 5 => array(
124 '-' => '635',
125 '+' => '634',
126 ),
127 'p0' => $minus_icons[0],
128 'p1' => $minus_icons[1],
129 'p2' => $minus_icons[2],
130 'p3' => $minus_icons[3],
131 'p4' => $minus_icons[4],
132 );
133 }
134
135 /**
136 * @since 2.0
137 * @return string The class for this icon.
138 */
139 public static function icon_key_to_class( $key, $icon = '+', $type = 'arrow' ) {
140 if ( 'arrow' === $type && is_numeric( $key ) ) {
141 // frm_arrowup6_icon.
142 $arrow = array(
143 '-' => 'down',
144 '+' => 'up',
145 );
146 $class = 'frm_arrow' . $arrow[ $icon ];
147 } else {
148 // frm_minus1_icon.
149 $key = str_replace( 'p', '', $key );
150 $plus = array(
151 '-' => 'minus',
152 '+' => 'plus',
153 );
154 $class = 'frm_' . $plus[ $icon ];
155 }
156
157 if ( $key ) {
158 $class .= $key;
159 }
160 $class .= '_icon';
161
162 return $class;
163 }
164
165 /**
166 * @param WP_Post $style
167 * @param FrmStyle $frm_style
168 * @param string $type
169 * @return void
170 */
171 public static function bs_icon_select( $style, $frm_style, $type = 'arrow' ) {
172 $function_name = $type . '_icons';
173 $icons = self::$function_name();
174 unset( $function_name );
175
176 $name = 'arrow' === $type ? 'collapse_icon' : 'repeat_icon';
177 ?>
178 <div class="btn-group" id="frm_<?php echo esc_attr( $name ); ?>_select">
179 <button class="multiselect dropdown-toggle btn btn-default" data-toggle="dropdown" type="button">
180 <?php FrmAppHelper::icon_by_class( 'frmfont ' . self::icon_key_to_class( $style->post_content[ $name ], '+', $type ) ); ?>
181 <?php FrmAppHelper::icon_by_class( 'frmfont ' . self::icon_key_to_class( $style->post_content[ $name ], '-', $type ) ); ?>
182 <b class="caret"></b>
183 </button>
184 <ul class="multiselect-container frm-dropdown-menu">
185 <?php foreach ( $icons as $key => $icon ) { ?>
186 <li <?php echo $style->post_content['collapse_icon'] == $key ? 'class="active"' : ''; ?>>
187 <a href="javascript:void(0);">
188 <label>
189 <input type="radio" value="<?php echo esc_attr( $key ); ?>" name="<?php echo esc_attr( $frm_style->get_field_name( $name ) ); ?>" <?php checked( $style->post_content[ $name ], $key ); ?> />
190 <span>
191 <?php
192 FrmAppHelper::icon_by_class( 'frmfont ' . self::icon_key_to_class( $key, '+', $type ) );
193 FrmAppHelper::icon_by_class( 'frmfont ' . self::icon_key_to_class( $key, '-', $type ) );
194 ?>
195 </span>
196 </label>
197 </a>
198 </li>
199 <?php } ?>
200 </ul>
201 </div>
202 <?php
203 }
204
205 /**
206 * Convert a color setting to a RGB CSV (without the rgb()/rgba() wrapper).
207 *
208 * @since 2.0
209 *
210 * @param string $color Color setting value. This could be hex or rgb.
211 * @return string RGB value without the rgb() wrapper.
212 */
213 public static function hex2rgb( $color ) {
214 if ( 0 === strpos( $color, 'rgb' ) ) {
215 $rgb = self::get_rgb_array_from_rgb( $color );
216 } else {
217 $rgb = self::get_rgb_array_from_hex( $color );
218 }
219 return implode( ',', $rgb );
220 }
221
222 /**
223 * Remove the rgb()/rgba() wrapper from a RGB color and return its R, G and B values as an array.
224 *
225 * @since 6.8.3
226 *
227 * @param string $rgb RGB value including the rgb() or rgba() wrapper.
228 * @return array<string> including three numeric values for R, G, and B.
229 */
230 private static function get_rgb_array_from_rgb( $rgb ) {
231 $rgb = str_replace( array( 'rgb(', 'rgba(', ')' ), '', $rgb );
232 $rgb = explode( ',', $rgb );
233 if ( 4 === count( $rgb ) ) {
234 // Drop the alpha. The function is expected to only return r,g,b with no alpha.
235 array_pop( $rgb );
236 }
237 return $rgb;
238 }
239
240 /**
241 * Get the R, G, and B array values from a Hex color code.
242 *
243 * @since 6.8.3
244 *
245 * @param string $hex A hex color string.
246 * @return array<string> Including three numeric values for R, G, and B.
247 */
248 private static function get_rgb_array_from_hex( $hex ) {
249 $hex = str_replace( '#', '', $hex );
250 list( $r, $g, $b ) = sscanf( $hex, '%02x%02x%02x' );
251 return array( $r, $g, $b );
252 }
253
254 /**
255 * @since 4.0
256 */
257 public static function hex2rgba( $hex, $a ) {
258 $rgb = self::hex2rgb( $hex );
259
260 return 'rgba(' . $rgb . ',' . $a . ')';
261 }
262
263 /**
264 * @since 6.0
265 *
266 * @param string $rgba Color setting value. This could be hex or rgb.
267 * @return string Hex color value.
268 */
269 private static function rgb_to_hex( $rgba ) {
270 if ( strpos( $rgba, '#' ) === 0 ) {
271 // Color is already hex.
272 return $rgba;
273 }
274 preg_match( '/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i', $rgba, $by_color );
275 return sprintf( '%02x%02x%02x', $by_color[1], $by_color[2], $by_color[3] );
276 }
277
278 /**
279 * @since 6.8
280 *
281 * @param string $hsl
282 * @return string|null Null if it fails to parse the HSL string.
283 */
284 private static function hsl_to_hex( $hsl ) {
285 // Convert hsla to hsl.
286 $hsl = preg_replace( '/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/', 'hsl($1, $2%, $3%)', $hsl );
287
288 // Extract HSL components from the color string.
289 preg_match( '/hsl\((\d+),\s*(\d+)%,\s*(\d+)%\)/', $hsl, $matches );
290
291 if ( count( $matches ) !== 4 ) {
292 // Invalid HSL string format.
293 return null;
294 }
295
296 // Extract HSL values.
297 $h = (int) $matches[1];
298 $s = (int) $matches[2] / 100;
299 $l = (int) $matches[3] / 100;
300
301 // Calculate RGB values.
302 $c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
303 $x = $c * ( 1 - abs( ( (int) ( $h / 60 ) % 2 ) - 1 ) );
304 $m = $l - $c / 2;
305 $r = 0;
306 $g = 0;
307 $b = 0;
308
309 if ( $h >= 0 && $h < 60 ) {
310 $r = $c;
311 $g = $x;
312 } elseif ( $h >= 60 && $h < 120 ) {
313 $r = $x;
314 $g = $c;
315 } elseif ( $h >= 120 && $h < 180 ) {
316 $g = $c;
317 $b = $x;
318 } elseif ( $h >= 180 && $h < 240 ) {
319 $g = $x;
320 $b = $c;
321 } elseif ( $h >= 240 && $h < 300 ) {
322 $r = $x;
323 $b = $c;
324 } elseif ( $h >= 300 && $h < 360 ) {
325 $r = $c;
326 $b = $x;
327 }//end if
328
329 // Convert RGB to 8-bit values
330 $r = round( ( $r + $m ) * 255 );
331 $g = round( ( $g + $m ) * 255 );
332 $b = round( ( $b + $m ) * 255 );
333
334 // Convert RGB to hex
335 $hex = sprintf( '%02x%02x%02x', $r, $g, $b );
336
337 return $hex;
338 }
339
340 /**
341 * @since 2.3
342 * @param string $hex string The original color in hex format #ffffff.
343 * @param int $steps integer Should be between -255 and 255. Negative = darker, positive = lighter.
344 */
345 public static function adjust_brightness( $hex, $steps ) {
346 $steps = max( - 255, min( 255, $steps ) );
347
348 if ( 0 === strpos( $hex, 'rgba(' ) ) {
349 $rgba = str_replace( ')', '', str_replace( 'rgba(', '', $hex ) );
350 list ( $r, $g, $b, $a ) = array_map( 'trim', explode( ',', $rgba ) );
351 $r = max( 0, min( 255, $r + $steps ) );
352 $g = max( 0, min( 255, $g + $steps ) );
353 $b = max( 0, min( 255, $b + $steps ) );
354 return 'rgba(' . $r . ',' . $g . ',' . $b . ',' . $a . ')';
355 }
356
357 // Normalize into a six character long hex string
358 $hex = str_replace( '#', '', $hex );
359 self::fill_hex( $hex );
360
361 // Split into three parts: R, G and B
362 $color_parts = str_split( $hex, 2 );
363 $return = '#';
364
365 foreach ( $color_parts as $color ) {
366 // Convert to decimal.
367 $color = hexdec( $color );
368 // Adjust color.
369 $color = max( 0, min( 255, $color + $steps ) );
370
371 // Make two char hex code.
372 $return .= str_pad( dechex( $color ), 2, '0', STR_PAD_LEFT );
373 }
374
375 return $return;
376 }
377
378 /**
379 * @since 6.0
380 *
381 * @param string $color
382 * @return int
383 */
384 public static function get_color_brightness( $color ) {
385 if ( 0 === strpos( $color, 'rgb' ) ) {
386 $color = self::rgb_to_hex( $color );
387 }
388
389 if ( 0 === strpos( $color, 'hsl' ) ) {
390 $hsl_to_hex = self::hsl_to_hex( $color );
391 if ( is_null( $hsl_to_hex ) ) {
392 // Fallback if we cannot convert the HSL value.
393 return 0;
394 }
395 $color = $hsl_to_hex;
396 }
397
398 self::fill_hex( $color );
399
400 $c_r = hexdec( substr( $color, 0, 2 ) );
401 $c_g = hexdec( substr( $color, 2, 2 ) );
402 $c_b = hexdec( substr( $color, 4, 2 ) );
403 $brightness = ( ( $c_r * 299 ) + ( $c_g * 587 ) + ( $c_b * 114 ) ) / 1000;
404
405 return $brightness;
406 }
407
408 /**
409 * Change a 3 character hex color to a 6 character one.
410 *
411 * @since 6.0
412 *
413 * @return void
414 */
415 private static function fill_hex( &$color ) {
416 if ( 3 === strlen( $color ) ) {
417 $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2];
418 }
419 }
420
421 /**
422 * @since 4.05.02
423 */
424 public static function get_css_vars( $vars = array() ) {
425 $vars = apply_filters( 'frm_css_vars', $vars );
426 return array_unique( $vars );
427 }
428
429 /**
430 * @since 4.05.02
431 */
432 public static function output_vars( $settings, $defaults = array(), $vars = array() ) {
433 if ( empty( $vars ) ) {
434 $vars = self::get_css_vars( array_keys( $settings ) );
435 }
436 $remove = array( 'remove_box_shadow', 'remove_box_shadow_active', 'theme_css', 'theme_name', 'theme_selector', 'important_style', 'submit_style', 'collapse_icon', 'center_form', 'custom_css', 'style_class', 'submit_bg_img', 'change_margin', 'repeat_icon' );
437 $vars = array_diff( $vars, $remove );
438
439 foreach ( $vars as $var ) {
440 if ( ! isset( $settings[ $var ] ) ) {
441 continue;
442 }
443 if ( ! isset( $defaults[ $var ] ) ) {
444 $defaults[ $var ] = '';
445 }
446 $show = empty( $defaults ) || ( $settings[ $var ] !== '' && $settings[ $var ] !== $defaults[ $var ] );
447 if ( $show ) {
448 echo '--' . esc_html( str_replace( '_', '-', $var ) ) . ':' . ( $var === 'font' ? FrmAppHelper::kses( $settings[ $var ] ) : esc_html( $settings[ $var ] ) ) . ';'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
449 }
450 }
451 }
452
453 /**
454 * @since 2.3
455 *
456 * @param WP_Post $style
457 * @return array
458 */
459 public static function get_settings_for_output( $style ) {
460 if ( self::previewing_style() ) {
461 $frm_style = new FrmStyle();
462 if ( isset( $_POST['frm_style_setting'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
463
464 // Sanitizing is done later.
465 $posted = wp_unslash( $_POST['frm_style_setting'] ); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
466 if ( ! is_array( $posted ) ) {
467 $posted = json_decode( $posted, true );
468 FrmAppHelper::format_form_data( $posted );
469 $settings = $frm_style->sanitize_post_content( $posted['frm_style_setting']['post_content'] );
470 $style_name = sanitize_title( $posted['style_name'] );
471 } else {
472 $settings = $frm_style->sanitize_post_content( $posted['post_content'] );
473 $style_name = FrmAppHelper::get_post_param( 'style_name', '', 'sanitize_title' );
474 }
475 } else {
476 $settings = $frm_style->sanitize_post_content( wp_unslash( $_GET ) );
477 $style_name = FrmAppHelper::get_param( 'style_name', '', 'get', 'sanitize_title' );
478 }
479
480 FrmAppHelper::sanitize_value( 'sanitize_text_field', $settings );
481
482 $settings['style_class'] = '';
483 if ( ! empty( $style_name ) ) {
484 $settings['style_class'] = $style_name . '.';
485 }
486 } else {
487 $settings = $style->post_content;
488 $settings['style_class'] = 'frm_style_' . $style->post_name . '.';
489 }//end if
490
491 $settings['style_class'] .= 'with_frm_style';
492 $settings['font'] = stripslashes( $settings['font'] );
493 $settings['change_margin'] = self::description_margin_for_screensize( $settings['width'] );
494
495 $checkbox_opts = array( 'important_style', 'auto_width', 'submit_style', 'collapse_icon', 'center_form' );
496 foreach ( $checkbox_opts as $opt ) {
497 if ( ! isset( $settings[ $opt ] ) ) {
498 $settings[ $opt ] = 0;
499 }
500 }
501
502 self::prepare_color_output( $settings );
503
504 $settings['field_height'] = $settings['field_height'] === '' ? 'auto' : $settings['field_height'];
505 $settings['field_width'] = $settings['field_width'] === '' ? 'auto' : $settings['field_width'];
506 $settings['auto_width'] = $settings['auto_width'] ? 'auto' : $settings['field_width'];
507 $settings['box_shadow'] = ! empty( $settings['remove_box_shadow'] ) ? 'none' : '0 1px 2px 0 rgba(18, 18, 23, 0.05)';
508
509 if ( ! isset( $settings['repeat_icon'] ) ) {
510 $settings['repeat_icon'] = 1;
511 }
512
513 return $settings;
514 }
515
516 /**
517 * @since 2.3
518 */
519 public static function prepare_color_output( &$settings, $allow_transparent = true ) {
520 $colors = self::allow_color_override();
521 foreach ( $colors as $css => $opts ) {
522 if ( $css === 'transparent' && ! $allow_transparent ) {
523 $css = '';
524 }
525 foreach ( $opts as $opt ) {
526 self::get_color_output( $css, $settings[ $opt ] );
527 }
528 }
529 }
530
531 /**
532 * @since 2.3
533 *
534 * @return array
535 */
536 private static function allow_color_override() {
537 $frm_style = new FrmStyle();
538 $colors = $frm_style->get_color_settings();
539
540 $transparent = array(
541 'fieldset_color',
542 'fieldset_bg_color',
543 'bg_color',
544 'bg_color_active',
545 'bg_color_disabled',
546 'section_bg_color',
547 'error_bg',
548 'success_bg_color',
549 'progress_bg_color',
550 'progress_active_bg_color',
551 'submit_border_color',
552 'submit_hover_border_color',
553 'submit_active_border_color',
554 'submit_hover_bg_color',
555 'submit_active_bg_color',
556 );
557
558 return array(
559 'transparent' => $transparent,
560 '' => array_diff( $colors, $transparent ),
561 );
562 }
563
564 /**
565 * @since 2.3
566 */
567 private static function get_color_output( $default, &$color ) {
568 $color = trim( $color );
569 if ( empty( $color ) ) {
570 $color = $default;
571 } elseif ( false !== strpos( $color, 'rgb(' ) ) {
572 $color = str_replace( 'rgb(', 'rgba(', $color );
573 $color = str_replace( ')', ',1)', $color );
574 } elseif ( strpos( $color, '#' ) === false && self::is_hex( $color ) ) {
575 $color = '#' . $color;
576 }
577 }
578
579 /**
580 * If a color looks like a hex code without the #, prepend the #.
581 * A color looks like a hex code if it does not contain the substrings "rgb", "rgba", "hsl", "hsla", or "hwb".
582 *
583 * @since 6.8
584 *
585 * @param string $color
586 * @return bool
587 */
588 private static function is_hex( $color ) {
589 $non_hex_substrings = array(
590 'rgba(',
591 'hsl(',
592 'hsla(',
593 'hwb(',
594 );
595
596 foreach ( $non_hex_substrings as $substring ) {
597 if ( false !== strpos( $color, $substring ) ) {
598 return false;
599 }
600 }
601
602 return true;
603 }
604
605 /**
606 * If left/right label is over a certain size,
607 * adjust the field description margin at a different screen size
608 *
609 * @since 2.3
610 */
611 private static function description_margin_for_screensize( $width ) {
612 $temp_label_width = str_replace( 'px', '', $width );
613 $change_margin = false;
614 if ( $temp_label_width >= 230 ) {
615 $change_margin = '800px';
616 } elseif ( $width >= 215 ) {
617 $change_margin = '700px';
618 } elseif ( $width >= 180 ) {
619 $change_margin = '650px';
620 }
621
622 return $change_margin;
623 }
624
625 /**
626 * @since 2.3
627 *
628 * @return bool
629 */
630 public static function previewing_style() {
631 $ajax_change = isset( $_POST['action'] ) && $_POST['action'] === 'frm_change_styling' && isset( $_POST['frm_style_setting'] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
632
633 return $ajax_change || isset( $_GET['flat'] );
634 }
635
636 /**
637 * Get the URL for the Styler page list view (where you can assign styles to a form and view style templates) for a target form.
638 *
639 * @since 6.0
640 *
641 * @param int|string $form_id
642 * @return string
643 */
644 public static function get_list_url( $form_id ) {
645 return admin_url( 'admin.php?page=formidable-styles&form=' . absint( $form_id ) );
646 }
647
648 /**
649 * Get a link to edit a target style post object in the visual styler.
650 *
651 * @param stdClass|WP_Post $style
652 * @param int|string $form_id Used for the back button and preview form target.
653 * @return string
654 */
655 public static function get_edit_url( $style, $form_id = 0 ) {
656 $query_args = array(
657 'page' => 'formidable-styles',
658 'frm_action' => 'edit',
659 'id' => $style->ID,
660 );
661
662 if ( $form_id ) {
663 // We include &form_id for the back button to know where to point to.
664 $query_args['form'] = $form_id;
665 }
666
667 return add_query_arg( $query_args, admin_url( 'admin.php' ) );
668 }
669
670 /**
671 * Get a count of the number of forms assigned to a target style ID.
672 * All unassigned forms are included in the count for the default style.
673 *
674 * @since 6.0
675 *
676 * @param int|string $style_id
677 * @param bool $is_default
678 * @return int
679 */
680 public static function get_form_count_for_style( $style_id, $is_default ) {
681 $serialized = serialize( array( 'custom_style' => (string) $style_id ) );
682 // Chop off the "a:1:{" from the front and the "}" from the back.
683 $substring = substr( $serialized, 5, -1 );
684 $number_of_forms = FrmDb::get_count(
685 'frm_forms',
686 array(
687 'status' => 'published',
688 'options LIKE' => $substring,
689 )
690 );
691
692 if ( ! $is_default ) {
693 // Exit early as the rest of the code is about including the default count.
694 return $number_of_forms;
695 }
696
697 $conversational_style_id = FrmDb::get_var( 'posts', array( 'post_name' => 'lines-no-boxes' ), 'ID' );
698 $number_of_forms += self::get_default_style_count( $style_id, $conversational_style_id );
699
700 return $number_of_forms;
701 }
702
703 /**
704 * Get the number of forms that use the default style.
705 *
706 * @since 6.0
707 *
708 * @param int|string $style_id
709 * @param mixed $conversational_style_id
710 * @return int
711 */
712 private static function get_default_style_count( $style_id, $conversational_style_id ) {
713 $substrings = array_map(
714 function ( $value ) {
715 $substring = serialize( array( 'custom_style' => $value ) );
716 return substr( $substring, 5, -1 );
717 },
718 array( '1', 1 )
719 );
720 $where = array(
721 'status' => 'published',
722 0 => array(
723 'options NOT LIKE' => 'custom_style',
724 'or' => 1,
725 'options LIKE' => $substrings,
726 ),
727 );
728
729 if ( $conversational_style_id ) {
730 // When a conversational style is set, check for it in the query by wrapping the where and adding a conversational option check.
731 $is_conversational_style = (int) $style_id === (int) $conversational_style_id;
732 $where[0] = array(
733 // The chat option doesn't exist if it isn't on.
734 ( $is_conversational_style ? 'options LIKE' : 'options NOT LIKE' ) => ';s:4:"chat";',
735 $where[0],
736 );
737 }
738
739 return FrmDb::get_count( 'frm_forms', $where );
740 }
741
742 /**
743 * @since 5.5.1
744 * @deprecated 6.10
745 * @return void
746 */
747 public static function maybe_include_font_icon_css() {
748 _deprecated_function( __METHOD__, '6.10' );
749 }
750 }
751