PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.2
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/helpers/FrmFormsHelper.php +382 -807 6.336.2 View file →
@@ -5,43 +5,21 @@
5 5
6 6 class FrmFormsHelper {
7 7
8 8 /**
9 - * Store and re-use field type data for the insert_opt_html function (to avoid multiple calls to FrmField::all_field_selection).
10 - *
11 - * @since 6.10
12 - *
13 - * @var array|null
14 - */
15 - private static $field_type_data_for_insert_opt_html;
16 -
17 - /**
18 9 * @since 2.2.10
19 - *
20 - * @return string
21 10 */
22 11 public static function form_error_class() {
23 12 return apply_filters( 'frm_form_error_class', 'frm_error_style' );
24 13 }
25 14
26 - /**
27 - * @param string $key
28 - * @param false|object $form
29 - *
30 - * @return string
31 - */
32 15 public static function get_direct_link( $key, $form = false ) {
33 16 $target_url = esc_url( admin_url( 'admin-ajax.php?action=frm_forms_preview&form=' . $key ) );
34 - return apply_filters( 'frm_direct_link', $target_url, $key, $form );
17 + $target_url = apply_filters( 'frm_direct_link', $target_url, $key, $form );
18 +
19 + return $target_url;
35 20 }
36 21
37 - /**
38 - * @param string $field_name
39 - * @param int|string $field_value
40 - * @param array $args
41 - *
42 - * @return void
43 - */
44 22 public static function forms_dropdown( $field_name, $field_value = '', $args = array() ) {
45 23 $defaults = array(
46 24 'blank' => true,
47 25 'field_id' => false,
@@ -56,9 +34,8 @@
56 34 $args['field_id'] = $field_name;
57 35 }
58 36
59 37 $query = array();
60 -
61 38 if ( $args['exclude'] ) {
62 39 $query['id !'] = $args['exclude'];
63 40 }
64 41
@@ -67,47 +44,41 @@
67 44 $add_html = array();
68 45 self::add_html_attr( $args['onchange'], 'onchange', $add_html );
69 46 self::add_html_attr( $args['class'], 'class', $add_html );
70 47
71 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
72 48 ?>
73 49 <select name="<?php echo esc_attr( $field_name ); ?>"
74 50 id="<?php echo esc_attr( $args['field_id'] ); ?>"
75 51 <?php echo wp_strip_all_tags( implode( ' ', $add_html ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
76 52 <?php if ( $args['blank'] ) { ?>
77 - <option value=""><?php echo $args['blank'] == 1 ? ' ' : '- ' . esc_attr( $args['blank'] ) . ' -'; // phpcs:ignore Universal.Operators.StrictComparisons ?></option>
53 + <option value=""><?php echo ( $args['blank'] == 1 ) ? ' ' : '- ' . esc_attr( $args['blank'] ) . ' -'; ?></option>
78 54 <?php } ?>
79 55 <?php foreach ( $forms as $form ) { ?>
80 56 <option value="<?php echo esc_attr( $form->id ); ?>" <?php selected( $field_value, $form->id ); ?>>
81 - <?php echo esc_html( '' === $form->name ? self::get_no_title_text() : FrmAppHelper::truncate( $form->name, 50 ) . ( $form->parent_form_id ? __( ' (child)', 'formidable' ) : '' ) ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
57 + <?php echo esc_html( '' === $form->name ? __( '(no title)', 'formidable' ) : FrmAppHelper::truncate( $form->name, 50 ) . ( $form->parent_form_id ? __( ' (child)', 'formidable' ) : '' ) ); ?>
82 58 </option>
83 59 <?php } ?>
84 60 </select>
85 61 <?php
86 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
87 62 }
88 63
89 64 /**
90 - * @since 2.0.6
91 - *
92 65 * @param string $class
93 66 * @param string $param
94 - * @param array $add_html
67 + * @param array $add_html
95 68 *
96 - * @return void
69 + * @since 2.0.6
97 70 */
98 71 public static function add_html_attr( $class, $param, &$add_html ) {
99 - if ( $class ) {
100 - $add_html[ $param ] = sanitize_title( $param ) . '="' . esc_attr( sanitize_text_field( $class ) ) . '"';
72 + if ( ! empty( $class ) ) {
73 + $add_html[ $param ] = sanitize_title( $param ) . '="' . esc_attr( trim( sanitize_text_field( $class ) ) ) . '"';
101 74 }
102 75 }
103 76
104 77 /**
105 - * @param false|object|string $selected - The label for the placeholder, or the form object.
106 - *
107 - * @return void
78 + * @param string|object|false $selected - The label for the placeholder, or the form object.
108 79 */
109 - public static function form_switcher( $selected = false ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh, Generic.Metrics.CyclomaticComplexity.MaxExceeded, SlevomatCodingStandard.Files.LineLength.LineTooLong
80 + public static function form_switcher( $selected = false ) {
110 81 $where = apply_filters( 'frm_forms_dropdown', array(), '' );
111 82 $forms = FrmForm::get_published_forms( $where );
112 83
113 84 $args = array(
@@ -113,9 +84,8 @@
113 84 $args = array(
114 85 'id' => 0,
115 86 'form' => 0,
116 87 );
117 -
118 88 if ( isset( $_GET['id'] ) && ! isset( $_GET['form'] ) ) {
119 89 unset( $args['form'] );
120 90 } elseif ( isset( $_GET['form'] ) && ! isset( $_GET['id'] ) ) {
121 91 unset( $args['id'] );
@@ -121,43 +91,37 @@
121 91 unset( $args['id'] );
122 92 }
123 93
124 94 $frm_action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
125 -
126 - if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) && in_array( $frm_action, array( 'edit', 'show', 'destroy', 'destroy_all' ), true ) ) {
95 + if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) && in_array( $frm_action, array( 'edit', 'show', 'destroy', 'destroy_all' ) ) ) {
127 96 $args['frm_action'] = 'list';
128 97 $args['form'] = 0;
129 - } elseif ( FrmAppHelper::is_admin_page( 'formidable' ) && in_array( $frm_action, array( 'new', 'duplicate' ), true ) ) {
98 + } elseif ( FrmAppHelper::is_admin_page( 'formidable' ) && in_array( $frm_action, array( 'new', 'duplicate' ) ) ) {
130 99 $args['frm_action'] = 'edit';
131 100 } elseif ( FrmAppHelper::is_style_editor_page() ) {
132 - // Avoid passing style into form switcher on style page.
133 - unset( $args['id'] );
101 + unset( $args['id'] ); // Avoid passing style into form switcher on style page.
134 102 $query_args = array(
135 103 'page' => 'formidable-styles',
136 104 );
137 -
138 105 if ( $frm_action ) {
139 106 $query_args['frm_action'] = $frm_action;
140 107 }
141 -
142 108 $base = add_query_arg( $query_args, admin_url( 'admin.php' ) );
143 109 } elseif ( isset( $_GET['post'] ) ) {
144 110 $args['form'] = 0;
145 111 $base = admin_url( 'edit.php?post_type=frm_display' );
146 - }//end if
112 + }
147 113
148 114 $form_id = 0;
149 -
150 115 if ( is_object( $selected ) ) {
151 116 $form_id = $selected->id;
152 117 $selected = $selected->name;
153 118 }
154 119
155 - $name = $selected === false ? __( 'Switch Form', 'formidable' ) : $selected;
156 - $name = '' === $name || is_null( $name ) ? self::get_no_title_text() : strip_tags( $name );
120 + $name = ( $selected === false ) ? __( 'Switch Form', 'formidable' ) : $selected;
121 + $name = '' === $name ? __( '(no title)', 'formidable' ) : strip_tags( $name );
157 122 $truncated_name = FrmAppHelper::truncate( $name, 25 );
158 123
159 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
160 124 if ( count( $forms ) < 2 ) {
161 125 ?>
162 126 <div id="frm_bs_dropdown">
163 127 <h1>
@@ -187,10 +151,8 @@
187 151 array(
188 152 'input_id' => 'dropform',
189 153 'placeholder' => __( 'Search Forms', 'formidable' ),
190 154 'tosearch' => 'frm-dropdown-form',
191 - // Specify a value to avoid the $_REQUEST['s'] default value.
192 - 'value' => '',
193 155 )
194 156 );
195 157 ?>
196 158 </li>
@@ -204,15 +166,14 @@
204 166
205 167 if ( isset( $args['id'] ) ) {
206 168 $args['id'] = $form->id;
207 169 }
208 -
209 170 if ( isset( $args['form'] ) ) {
210 171 $args['form'] = $form->id;
211 172 }
212 173
213 174 $url = isset( $base ) ? add_query_arg( $args, $base ) : add_query_arg( $args );
214 - $form_name = ! empty( $form->name ) ? $form->name : self::get_no_title_text();
175 + $form_name = empty( $form->name ) ? __( '(no title)', 'formidable' ) : $form->name;
215 176 ?>
216 177 <li class="frm-dropdown-form">
217 178 <a href="<?php echo esc_url( $url ); ?>" tabindex="-1" class="frm-justify-between">
218 179 <?php echo esc_html( $form_name ); ?>
@@ -229,48 +190,54 @@
229 190 </a>
230 191 </li>
231 192 <?php
232 193 unset( $form );
233 - }//end foreach
194 + }
234 195 ?>
235 196 </ul>
236 197 </div>
237 198 <?php
238 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
239 199 }
240 200
241 201 /**
242 - * @param string $col
243 - * @param string $sort_col
244 - * @param string $sort_dir
202 + * @since 3.05
203 + * @deprecated 4.0
245 204 *
246 - * @return void
205 + * @param array $values - The form array
247 206 */
207 + public static function builder_submit_button( $values ) {
208 + FrmDeprecated::builder_submit_button( $values );
209 + }
210 +
248 211 public static function get_sortable_classes( $col, $sort_col, $sort_dir ) {
249 - echo $sort_col == $col ? 'sorted' : 'sortable'; // phpcs:ignore Universal.Operators.StrictComparisons
250 - echo $sort_col == $col && $sort_dir === 'desc' ? ' asc' : ' desc'; // phpcs:ignore Universal.Operators.StrictComparisons
212 + echo ( $sort_col == $col ) ? 'sorted' : 'sortable';
213 + echo ( $sort_col == $col && $sort_dir == 'desc' ) ? ' asc' : ' desc';
251 214 }
252 215
253 216 /**
254 217 * @since 3.0
255 - *
256 - * @param array|string $field_type
257 - *
258 - * @return string
259 218 */
260 219 public static function get_field_link_name( $field_type ) {
261 - return is_array( $field_type ) ? $field_type['name'] : $field_type;
220 + if ( is_array( $field_type ) ) {
221 + $field_label = $field_type['name'];
222 + } else {
223 + $field_label = $field_type;
224 + }
225 +
226 + return $field_label;
262 227 }
263 228
264 229 /**
265 230 * @since 3.0
266 - *
267 - * @param array|string $field_type
268 - *
269 - * @return string
270 231 */
271 232 public static function get_field_link_icon( $field_type ) {
272 - return is_array( $field_type ) && isset( $field_type['icon'] ) ? $field_type['icon'] : 'frmfont frm_pencil_icon';
233 + if ( is_array( $field_type ) && isset( $field_type['icon'] ) ) {
234 + $icon = $field_type['icon'];
235 + } else {
236 + $icon = 'frm_icon_font frm_pencil_icon';
237 + }
238 +
239 + return $icon;
273 240 }
274 241
275 242 /**
276 243 * Get the invalid form error message
@@ -282,71 +249,44 @@
282 249 * @return string
283 250 */
284 251 public static function get_invalid_error_message( $args ) {
285 252 $settings_args = $args;
286 -
287 253 if ( isset( $args['form'] ) ) {
288 254 $settings_args['current_form'] = $args['form']->id;
289 255 }
290 256
291 257 $frm_settings = FrmAppHelper::get_settings( $settings_args );
292 - $invalid_msg = do_shortcode( $frm_settings->invalid_msg );
258 + $invalid_msg = do_shortcode( $frm_settings->invalid_msg );
293 259 return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args );
294 260 }
295 261
296 262 /**
297 263 * @param array $atts {
298 - * The success message details.
299 - *
300 264 * @type string $message
301 265 * @type stdClass $form
302 266 * @type int $entry_id
303 267 * @type string $class
304 268 * }
305 - *
306 269 * @return string
307 270 */
308 271 public static function get_success_message( $atts ) {
309 272 $message = apply_filters( 'frm_content', $atts['message'], $atts['form'], $atts['entry_id'] );
310 -
311 - // Only autop if the message includes line breaks.
312 - $autop = str_contains( $message, "\n" );
313 -
314 - /**
315 - * Filters whether to autop the success message.
316 - * This is false by default if the message does not include line breaks.
317 - *
318 - * @since 6.23
319 - *
320 - * @param bool $autop
321 - * @param string $message
322 - * @param object $form
323 - */
324 - $autop = (bool) apply_filters( 'frm_wpautop_success_message', $autop, $message, $atts['form'] );
325 -
326 - if ( $autop ) {
327 - $message = FrmAppHelper::use_wpautop( $message );
328 - }
329 -
330 - $message = do_shortcode( $message );
331 - return '<div class="' . esc_attr( $atts['class'] ) . '" role="status">' . $message . '</div>';
273 + $message = do_shortcode( FrmAppHelper::use_wpautop( $message ) );
274 + $message = '<div class="' . esc_attr( $atts['class'] ) . '" role="status">' . $message . '</div>';
275 + return $message;
332 276 }
333 277
334 278 /**
335 279 * Used when a form is created
336 - *
337 - * @param array $values
338 - *
339 - * @return array
340 280 */
341 281 public static function setup_new_vars( $values = array() ) {
342 282 global $wpdb;
343 283
344 - if ( $values ) {
284 + if ( ! empty( $values ) ) {
345 285 $post_values = $values;
346 286 } else {
347 287 $values = array();
348 - $post_values = ! empty( $_POST ) ? $_POST : array(); // phpcs:ignore WordPress.Security.NonceVerification.Missing
288 + $post_values = isset( $_POST ) ? $_POST : array(); // phpcs:ignore WordPress.Security.NonceVerification.Missing
349 289 }
350 290
351 291 $defaults = array(
352 292 'name' => '',
@@ -351,9 +291,8 @@
351 291 $defaults = array(
352 292 'name' => '',
353 293 'description' => '',
354 294 );
355 -
356 295 foreach ( $defaults as $var => $default ) {
357 296 if ( ! isset( $values[ $var ] ) ) {
358 297 $values[ $var ] = FrmAppHelper::get_param( $var, $default, 'get', 'sanitize_text_field' );
359 298 }
@@ -368,9 +307,8 @@
368 307 'is_template' => 0,
369 308 'status' => 'published',
370 309 'parent_form_id' => 0,
371 310 );
372 -
373 311 foreach ( $defaults as $var => $default ) {
374 312 if ( ! isset( $values[ $var ] ) ) {
375 313 $values[ $var ] = FrmAppHelper::get_param( $var, $default, 'get', 'sanitize_text_field' );
376 314 }
@@ -377,9 +315,9 @@
377 315 }
378 316 unset( $defaults );
379 317
380 318 if ( ! isset( $values['form_key'] ) ) {
381 - $values['form_key'] = $post_values && isset( $post_values['form_key'] ) ? $post_values['form_key'] : FrmAppHelper::get_unique_key( '', $wpdb->prefix . 'frm_forms', 'form_key' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
319 + $values['form_key'] = ( $post_values && isset( $post_values['form_key'] ) ) ? $post_values['form_key'] : FrmAppHelper::get_unique_key( '', $wpdb->prefix . 'frm_forms', 'form_key' );
382 320 }
383 321
384 322 $values = self::fill_default_opts( $values, false, $post_values );
385 323 $values['custom_style'] = FrmAppHelper::custom_style_value( $post_values );
@@ -388,22 +326,16 @@
388 326 }
389 327
390 328 /**
391 329 * Used when editing a form
392 - *
393 - * @param array $values
394 - * @param object $record
395 - * @param array $post_values
396 - *
397 - * @return array
398 330 */
399 331 public static function setup_edit_vars( $values, $record, $post_values = array() ) {
400 - if ( ! $post_values ) {
332 + if ( empty( $post_values ) ) {
401 333 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
402 334 }
403 335
404 - $values['form_key'] = $post_values['form_key'] ?? $record->form_key;
405 - $values['is_template'] = $post_values['is_template'] ?? $record->is_template;
336 + $values['form_key'] = isset( $post_values['form_key'] ) ? $post_values['form_key'] : $record->form_key;
337 + $values['is_template'] = isset( $post_values['is_template'] ) ? $post_values['is_template'] : $record->is_template;
406 338 $values['status'] = $record->status;
407 339
408 340 $values = self::fill_default_opts( $values, $record, $post_values );
409 341
@@ -409,29 +341,23 @@
409 341
410 342 return apply_filters( 'frm_setup_edit_form_vars', $values );
411 343 }
412 344
413 - /**
414 - * @param array $values
415 - * @param false|object $record
416 - * @param array|false $post_values
417 - *
418 - * @return array
419 - */
420 - public static function fill_default_opts( $values, $record, $post_values ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh
345 + public static function fill_default_opts( $values, $record, $post_values ) {
421 346
422 - foreach ( self::get_default_opts() as $var => $default ) {
347 + $defaults = self::get_default_opts();
348 + foreach ( $defaults as $var => $default ) {
423 349 if ( is_array( $default ) ) {
424 350 if ( ! isset( $values[ $var ] ) ) {
425 - $values[ $var ] = $record && isset( $record->options[ $var ] ) ? $record->options[ $var ] : array();
351 + $values[ $var ] = ( $record && isset( $record->options[ $var ] ) ) ? $record->options[ $var ] : array();
426 352 }
427 353
428 354 foreach ( $default as $k => $v ) {
429 - $values[ $var ][ $k ] = $post_values && isset( $post_values[ $var ][ $k ] ) ? $post_values[ $var ][ $k ] : ( $record && isset( $record->options[ $var ] ) && isset( $record->options[ $var ][ $k ] ) ? $record->options[ $var ][ $k ] : $v ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
355 + $values[ $var ][ $k ] = ( $post_values && isset( $post_values[ $var ][ $k ] ) ) ? $post_values[ $var ][ $k ] : ( ( $record && isset( $record->options[ $var ] ) && isset( $record->options[ $var ][ $k ] ) ) ? $record->options[ $var ][ $k ] : $v );
430 356
431 357 if ( is_array( $v ) ) {
432 358 foreach ( $v as $k1 => $v1 ) {
433 - $values[ $var ][ $k ][ $k1 ] = $post_values && isset( $post_values[ $var ][ $k ][ $k1 ] ) ? $post_values[ $var ][ $k ][ $k1 ] : ( $record && isset( $record->options[ $var ] ) && isset( $record->options[ $var ][ $k ] ) && isset( $record->options[ $var ][ $k ][ $k1 ] ) ? $record->options[ $var ][ $k ][ $k1 ] : $v1 ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
359 + $values[ $var ][ $k ][ $k1 ] = ( $post_values && isset( $post_values[ $var ][ $k ][ $k1 ] ) ) ? $post_values[ $var ][ $k ][ $k1 ] : ( ( $record && isset( $record->options[ $var ] ) && isset( $record->options[ $var ][ $k ] ) && isset( $record->options[ $var ][ $k ][ $k1 ] ) ) ? $record->options[ $var ][ $k ][ $k1 ] : $v1 );
434 360 unset( $k1, $v1 );
435 361 }
436 362 }
437 363
@@ -437,13 +363,13 @@
437 363
438 364 unset( $k, $v );
439 365 }
440 366 } else {
441 - $values[ $var ] = $post_values && isset( $post_values['options'][ $var ] ) ? $post_values['options'][ $var ] : ( $record && isset( $record->options[ $var ] ) ? $record->options[ $var ] : $default ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
367 + $values[ $var ] = ( $post_values && isset( $post_values['options'][ $var ] ) ) ? $post_values['options'][ $var ] : ( ( $record && isset( $record->options[ $var ] ) ) ? $record->options[ $var ] : $default );
442 368 }
443 369
444 370 unset( $var, $default );
445 - }//end foreach
371 + }
446 372
447 373 return $values;
448 374 }
449 375
@@ -458,9 +384,9 @@
458 384 'success_action' => 'message',
459 385 'success_msg' => $frm_settings->success_msg,
460 386 'show_form' => 0,
461 387 'akismet' => '',
462 - 'stopforumspam' => 0,
388 + 'honeypot' => 'basic',
463 389 'antispam' => 0,
464 390 'no_save' => 0,
465 391 'ajax_load' => 0,
466 392 'js_validate' => 0,
@@ -475,18 +401,17 @@
475 401 );
476 402 }
477 403
478 404 /**
479 - * @since 2.0.6
480 - *
481 405 * @param array $options
482 406 * @param array $values
483 407 *
484 - * @return void
408 + * @since 2.0.6
485 409 */
486 410 public static function fill_form_options( &$options, $values ) {
487 - foreach ( self::get_default_opts() as $var => $default ) {
488 - $options[ $var ] = $values['options'][ $var ] ?? $default;
411 + $defaults = self::get_default_opts();
412 + foreach ( $defaults as $var => $default ) {
413 + $options[ $var ] = isset( $values['options'][ $var ] ) ? $values['options'][ $var ] : $default;
489 414 unset( $var, $default );
490 415 }
491 416 }
492 417
@@ -491,24 +416,22 @@
491 416 }
492 417
493 418 /**
494 419 * @param string $loc
495 - *
496 - * @return string
497 420 */
498 421 public static function get_default_html( $loc ) {
499 - if ( $loc === 'submit' ) {
422 + if ( $loc == 'submit' ) {
500 423 $draft_link = self::get_draft_link();
501 424 $start_over = self::get_start_over_shortcode();
502 425 $default_html = <<<SUBMIT_HTML
503 -<div class="frm_submit frm_flex">
426 +<div class="frm_submit">
427 +[if back_button]<button type="submit" name="frm_prev_page" formnovalidate="formnovalidate" class="frm_prev_page" [back_hook]>[back_label]</button>[/if back_button]
504 428 <button class="frm_button_submit" type="submit" [button_action]>[button_label]</button>
505 -[if back_button]<button type="submit" name="frm_prev_page" formnovalidate="formnovalidate" class="frm_prev_page" [back_hook]>[back_label]</button>[/if back_button]
506 429 $draft_link
507 430 $start_over
508 431 </div>
509 432 SUBMIT_HTML;
510 - } elseif ( $loc === 'before' ) {
433 + } elseif ( $loc == 'before' ) {
511 434 $default_html = <<<BEFORE_HTML
512 435 <legend class="frm_screen_reader">[form_name]</legend>
513 436 [if form_name]<h3 class="frm_form_title">[form_name]</h3>[/if form_name]
514 437 [if form_description]<div class="frm_description">[form_description]</div>[/if form_description]
@@ -519,13 +442,12 @@
519 442
520 443 return $default_html;
521 444 }
522 445
523 - /**
524 - * @return string
525 - */
526 446 public static function get_draft_link() {
527 - return '[if save_draft]<button class="frm_save_draft" [draft_hook]>[draft_label]</button>[/if save_draft]';
447 + $link = '[if save_draft]<a href="#" tabindex="0" class="frm_save_draft" [draft_hook]>[draft_label]</a>[/if save_draft]';
448 +
449 + return $link;
528 450 }
529 451
530 452 /**
531 453 * Gets start over button shortcode.
@@ -537,21 +459,11 @@
537 459 public static function get_start_over_shortcode() {
538 460 return '[if start_over]<a href="#" tabindex="0" class="frm_start_over" [start_over_hook]>[start_over_label]</a>[/if start_over]';
539 461 }
540 462
541 - /**
542 - * @param string $html
543 - * @param object $form
544 - * @param string $submit
545 - * @param object|null $form_action
546 - * @param array $values
547 - *
548 - * @return void
549 - */
550 463 public static function get_custom_submit( $html, $form, $submit, $form_action, $values ) {
551 464 $button = self::replace_shortcodes( $html, $form, $submit, $form_action, $values );
552 -
553 - if ( ! str_contains( $button, '[button_action]' ) ) {
465 + if ( ! strpos( $button, '[button_action]' ) ) {
554 466 echo FrmAppHelper::maybe_kses( $button ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
555 467 return;
556 468 }
557 469
@@ -558,21 +470,18 @@
558 470 /**
559 471 * @since 5.0.06
560 472 */
561 473 $button = apply_filters( 'frm_submit_button_html', $button, compact( 'form' ) );
562 -
563 474 if ( FrmAppHelper::should_never_allow_unfiltered_html() ) {
564 475 $button = FrmAppHelper::kses_submit_button( $button );
565 476 }
566 -
567 477 $button_parts = explode( '[button_action]', $button );
568 - $classes = apply_filters( 'frm_submit_button_class', array(), $form );
569 478
570 - if ( $classes ) {
479 + $classes = apply_filters( 'frm_submit_button_class', array(), $form );
480 + if ( ! empty( $classes ) ) {
571 481 $classes = implode( ' ', $classes );
572 - $button_class = 'frm_button_submit';
573 -
574 - if ( preg_match( '/\bclass="[^"]*?\b' . preg_quote( $button_class, '/' ) . '\b[^"]*?"/', $button_parts[0] ) ) {
482 + $button_class = ' class="frm_button_submit';
483 + if ( strpos( $button_parts[0], $button_class ) !== false ) {
575 484 $button_parts[0] = str_replace( $button_class, $button_class . ' ' . esc_attr( $classes ), $button_parts[0] );
576 485 } else {
577 486 $button_parts[0] .= ' class="' . esc_attr( $classes ) . '"';
578 487 }
@@ -584,56 +493,54 @@
584 493 }
585 494
586 495 /**
587 496 * @since 4.0
588 - *
589 - * @return array
590 497 */
591 498 public static function html_shortcodes() {
592 499 $codes = array(
593 - 'id' => array(
500 + 'id' => array(
594 501 'label' => __( 'Field ID', 'formidable' ),
595 502 'class' => 'show_field_custom_html',
596 503 ),
597 - 'key' => array(
504 + 'key' => array(
598 505 'label' => __( 'Field Key', 'formidable' ),
599 506 'class' => 'show_field_custom_html',
600 507 ),
601 - 'field_name' => array(
508 + 'field_name' => array(
602 509 'label' => __( 'Field Name', 'formidable' ),
603 510 'class' => 'show_field_custom_html',
604 511 ),
605 - 'description' => array(
512 + 'description' => array(
606 513 'label' => __( 'Field Description', 'formidable' ),
607 514 'class' => 'show_field_custom_html',
608 515 ),
609 - 'label_position' => array(
516 + 'label_position' => array(
610 517 'label' => __( 'Label Position', 'formidable' ),
611 518 'class' => 'show_field_custom_html',
612 519 ),
613 - 'required_label' => array(
520 + 'required_label' => array(
614 521 'label' => __( 'Required Label', 'formidable' ),
615 522 'class' => 'show_field_custom_html',
616 523 ),
617 - 'input' => array(
524 + 'input' => array(
618 525 'label' => __( 'Input Field', 'formidable' ),
619 526 'class' => 'show_field_custom_html',
620 527 ),
621 - 'input opt=1' => array(
528 + 'input opt=1' => array(
622 529 'label' => __( 'Single Option', 'formidable' ),
623 530 'title' => __( 'Show a single radio or checkbox option by replacing 1 with the order of the option', 'formidable' ),
624 531 'class' => 'show_field_custom_html',
625 532 ),
626 - 'input label=0' => array(
533 + 'input label=0' => array(
627 534 'label' => __( 'Hide Option Label', 'formidable' ),
628 535 'class' => 'show_field_custom_html',
629 536 ),
630 - 'required_class' => array(
537 + 'required_class' => array(
631 538 'label' => __( 'Required Class', 'formidable' ),
632 539 'title' => __( 'Add class name if field is required', 'formidable' ),
633 540 'class' => 'show_field_custom_html',
634 541 ),
635 - 'error_class' => array(
542 + 'error_class' => array(
636 543 'label' => __( 'Error Class', 'formidable' ),
637 544 'title' => __( 'Add class name if field has an error on form submit', 'formidable' ),
638 545 'class' => 'show_field_custom_html',
639 546 ),
@@ -654,13 +561,13 @@
654 561 'label' => __( 'Delete Entry Link', 'formidable' ),
655 562 'class' => 'show_before_html show_after_html',
656 563 ),
657 564
658 - 'button_label' => array(
565 + 'button_label' => array(
659 566 'label' => __( 'Button Label', 'formidable' ),
660 567 'class' => 'show_submit_html',
661 568 ),
662 - 'button_action' => array(
569 + 'button_action' => array(
663 570 'label' => __( 'Button Hook', 'formidable' ),
664 571 'class' => 'show_submit_html',
665 572 ),
666 573 );
@@ -672,17 +579,14 @@
672 579 }
673 580
674 581 /**
675 582 * @since 4.0
676 - *
677 583 * @param array $args
678 - *
679 - * @return void
680 584 */
681 585 public static function insert_opt_html( $args ) {
682 - $class = $args['class'] ?? '';
683 - $fields = self::get_field_type_data_for_insert_opt_html();
684 - $field = $fields[ $args['type'] ] ?? array();
586 + $class = isset( $args['class'] ) ? $args['class'] : '';
587 + $fields = FrmField::all_field_selection();
588 + $field = isset( $fields[ $args['type'] ] ) ? $fields[ $args['type'] ] : array();
685 589
686 590 self::prepare_field_type( $field );
687 591
688 592 if ( ! isset( $field['icon'] ) ) {
@@ -689,9 +593,8 @@
689 593 $field['icon'] = 'frmfont frm_pencil_icon';
690 594 }
691 595
692 596 $possible_email_field = FrmFieldFactory::field_has_property( $args['type'], 'holds_email_values' );
693 -
694 597 if ( $possible_email_field ) {
695 598 $class .= ' show_frm_not_email_to';
696 599 }
697 600
@@ -697,60 +600,31 @@
697 600
698 601 if ( 'url' === $args['type'] ) {
699 602 $class .= ' frm_insert_url';
700 603 }
701 -
702 - $truncated_name = FrmAppHelper::truncate( $args['name'], 60 );
703 -
704 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
705 604 ?>
706 605 <li class="<?php echo esc_attr( $class ); ?>">
707 - <a href="javascript:void(0)" class="frmids frm_insert_code" data-code="<?php echo esc_attr( $args['id'] ); ?>">
708 - <?php
709 - if ( isset( $field['icon'] ) ) {
710 - FrmAppHelper::icon_by_class( $field['icon'], array( 'aria-hidden' => 'true' ) );
711 - }
712 -
713 - echo esc_html( $truncated_name );
714 - ?>
715 - <span>[<?php echo esc_html( $args['id_label'] ?? $args['id'] ); ?>]</span>
606 + <a href="javascript:void(0)" class="frmids frm_insert_code"
607 + data-code="<?php echo esc_attr( $args['id'] ); ?>">
608 + <?php FrmAppHelper::icon_by_class( $field['icon'], array( 'aria-hidden' => 'true' ) ); ?>
609 + <?php echo esc_attr( FrmAppHelper::truncate( $args['name'], 60 ) ); ?>
610 + <span>[<?php echo esc_attr( isset( $args['id_label'] ) ? $args['id_label'] : $args['id'] ); ?>]</span>
716 611 </a>
717 - <a href="javascript:void(0)" class="frmkeys frm_insert_code frm_hidden" data-code="<?php echo esc_attr( $args['key'] ); ?>">
718 - <?php
719 - if ( isset( $field['icon'] ) ) {
720 - FrmAppHelper::icon_by_class( $field['icon'], array( 'aria-hidden' => 'true' ) );
721 - }
722 -
723 - echo esc_html( $truncated_name );
724 - ?>
725 - <span>[<?php echo esc_html( FrmAppHelper::truncate( $args['key_label'] ?? $args['key'], 7 ) ); ?>]</span>
612 + <a href="javascript:void(0)" class="frmkeys frm_insert_code frm_hidden"
613 + data-code="<?php echo esc_attr( $args['key'] ); ?>">
614 + <?php if ( isset( $field['icon'] ) ) { ?>
615 + <?php FrmAppHelper::icon_by_class( $field['icon'], array( 'aria-hidden' => 'true' ) ); ?>
616 + <?php } ?>
617 + <?php echo esc_attr( FrmAppHelper::truncate( $args['name'], 60 ) ); ?>
618 + <span>[<?php echo esc_attr( FrmAppHelper::truncate( isset( $args['key_label'] ) ? $args['key_label'] : $args['key'], 7 ) ); ?>]</span>
726 619 </a>
727 620 </li>
728 621 <?php
729 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
730 622 }
731 623
732 624 /**
733 - * Store and re-use field selection data for use when outputting shortcodes options in shortcode pop up.
734 - * This significantly improves performance by avoiding repeat calls to FrmField::all_field_selection.
735 - *
736 - * @since 6.10
737 - *
738 - * @return array
739 - */
740 - private static function get_field_type_data_for_insert_opt_html() {
741 - if ( ! isset( self::$field_type_data_for_insert_opt_html ) ) {
742 - self::$field_type_data_for_insert_opt_html = FrmField::all_field_selection();
743 - }
744 - return self::$field_type_data_for_insert_opt_html;
745 - }
746 -
747 - /**
748 625 * @since 4.0
749 - *
750 626 * @param array $args
751 - *
752 - * @return void
753 627 */
754 628 public static function insert_code_html( $args ) {
755 629 $defaults = array(
756 630 'class' => '',
@@ -761,22 +635,20 @@
761 635
762 636 $args = array_merge( $defaults, $args );
763 637 $has_tooltip = ! empty( $args['title'] );
764 638
765 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
766 639 ?>
767 640 <li class="<?php echo esc_attr( $args['class'] ); ?>">
768 641 <a href="javascript:void(0)" class="frm_insert_code <?php echo $has_tooltip ? 'frm_help' : ''; ?>"
769 642 <?php echo $has_tooltip ? 'title="' . esc_attr( $args['title'] ) . '"' : ''; ?>
770 643 data-code="<?php echo esc_attr( $args['code'] ); ?>">
771 - <?php echo esc_html( FrmAppHelper::truncate( $args['label'], 60 ) ); ?>
644 + <?php echo esc_attr( FrmAppHelper::truncate( $args['label'], 60 ) ); ?>
772 645 <span>
773 - [<?php echo esc_html( FrmAppHelper::truncate( $args['code'], 10 ) ); ?>]
646 + [<?php echo esc_attr( FrmAppHelper::truncate( $args['code'], 10 ) ); ?>]
774 647 </span>
775 648 </a>
776 649 </li>
777 650 <?php
778 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
779 651 }
780 652
781 653 /**
782 654 * Some field types in add-ons may have been added with only
@@ -782,18 +654,14 @@
782 654 * Some field types in add-ons may have been added with only
783 655 * a field type and name.
784 656 *
785 657 * @since 4.0
786 - *
787 - * @param array|string $field
788 - *
789 - * @return void
790 658 */
791 659 public static function prepare_field_type( &$field ) {
792 660 if ( ! is_array( $field ) ) {
793 661 $field = array(
794 662 'name' => $field,
795 - 'icon' => 'frmfont frm_pencil_icon',
663 + 'icon' => 'frm_icon_font frm_pencil_icon',
796 664 );
797 665 }
798 666 }
799 667
@@ -801,16 +669,12 @@
801 669 * Automatically add end section fields if they don't exist (2.0 migration)
802 670 *
803 671 * @since 2.0
804 672 *
805 - * @param object $form
806 - * @param array $fields
807 - * @param bool $reset_fields
808 - *
809 - * @return void
673 + * @param boolean $reset_fields
810 674 */
811 675 public static function auto_add_end_section_fields( $form, $fields, &$reset_fields ) {
812 - if ( ! $fields ) {
676 + if ( empty( $fields ) ) {
813 677 return;
814 678 }
815 679
816 680 $end_section_values = apply_filters( 'frm_before_field_created', FrmFieldsHelper::setup_new_vars( 'end_divider', $form->id ) );
@@ -817,12 +681,11 @@
817 681 $open = false;
818 682 $prev_order = false;
819 683 $add_order = 0;
820 684 $last_field = false;
821 -
822 685 foreach ( $fields as $field ) {
823 686 if ( $prev_order === $field->field_order ) {
824 - ++$add_order;
687 + $add_order ++;
825 688 }
826 689
827 690 if ( $add_order ) {
828 691 $reset_fields = true;
@@ -849,14 +712,14 @@
849 712 }
850 713
851 714 // There is already an end section here, so there is no need to create one.
852 715 $open = false;
853 - }//end switch
716 + }
854 717 $prev_order = $field->field_order;
855 718
856 719 $last_field = $field;
857 720 unset( $field );
858 - }//end foreach
721 + }
859 722
860 723 self::maybe_create_end_section( $open, $reset_fields, $add_order, $end_section_values, $last_field );
861 724 }
862 725
@@ -862,17 +725,8 @@
862 725
863 726 /**
864 727 * Create end section field if it doesn't exist. This is for migration from < 2.0
865 728 * Fix any ordering that may be messed up
866 - *
867 - * @param bool $open
868 - * @param bool $reset_fields
869 - * @param int $add_order
870 - * @param array $end_section_values
871 - * @param object $field
872 - * @param string $move
873 - *
874 - * @return void
875 729 */
876 730 public static function maybe_create_end_section( &$open, &$reset_fields, &$add_order, $end_section_values, $field, $move = 'no' ) {
877 731 if ( ! $open ) {
878 732 return;
@@ -881,27 +735,18 @@
881 735 $end_section_values['field_order'] = $field->field_order + 1;
882 736
883 737 FrmField::create( $end_section_values );
884 738
885 - if ( $move === 'move' ) {
886 - // Bump the order of current field unless we're at the end of the form
739 + if ( $move == 'move' ) {
740 + // bump the order of current field unless we're at the end of the form
887 741 FrmField::update( $field->id, array( 'field_order' => $field->field_order + 2 ) );
888 742 }
889 743
890 - $add_order += 2;
744 + $add_order += 2;
891 745 $open = false;
892 746 $reset_fields = true;
893 747 }
894 748
895 - /**
896 - * @param string $html
897 - * @param object $form
898 - * @param bool $title
899 - * @param bool $description
900 - * @param array $values
901 - *
902 - * @return string
903 - */
904 749 public static function replace_shortcodes( $html, $form, $title = false, $description = false, $values = array() ) {
905 750 $codes = array(
906 751 'form_name' => $title,
907 752 'form_description' => $description,
@@ -906,30 +751,29 @@
906 751 'form_name' => $title,
907 752 'form_description' => $description,
908 753 'entry_key' => true,
909 754 );
910 -
911 755 foreach ( $codes as $code => $show ) {
912 756 if ( $code === 'form_name' ) {
913 757 $replace_with = $form->name;
914 758 } elseif ( $code === 'form_description' ) {
915 759 $replace_with = FrmAppHelper::use_wpautop( $form->description );
916 - } elseif ( $code === 'entry_key' && ! empty( $_GET ) && isset( $_GET['entry'] ) ) {
760 + } elseif ( $code === 'entry_key' && isset( $_GET ) && isset( $_GET['entry'] ) ) {
917 761 $replace_with = FrmAppHelper::simple_get( 'entry' );
918 762 } else {
919 763 $replace_with = '';
920 764 }
921 765
922 - FrmShortcodeHelper::remove_inline_conditions( FrmAppHelper::is_true( $show ) && $replace_with != '', $code, $replace_with, $html ); // phpcs:ignore Universal.Operators.StrictComparisons, SlevomatCodingStandard.Files.LineLength.LineTooLong
766 + FrmShortcodeHelper::remove_inline_conditions( ( FrmAppHelper::is_true( $show ) && $replace_with != '' ), $code, $replace_with, $html );
923 767 }
924 768
925 - // Replace [form_key].
769 + //replace [form_key]
926 770 $html = str_replace( '[form_key]', $form->form_key, $html );
927 771
928 - // Replace [frmurl].
772 + //replace [frmurl]
929 773 $html = str_replace( '[frmurl]', FrmFieldsHelper::dynamic_default_values( 'frmurl' ), $html );
930 774
931 - if ( str_contains( $html, '[button_label]' ) ) {
775 + if ( strpos( $html, '[button_label]' ) ) {
932 776 add_filter( 'frm_submit_button', 'FrmFormsHelper::submit_button_label', 1 );
933 777 $submit_label = apply_filters( 'frm_submit_button', $title, $form );
934 778 $submit_label = esc_attr( do_shortcode( $submit_label ) );
935 779 $html = str_replace( '[button_label]', $submit_label, $html );
@@ -936,32 +780,27 @@
936 780 }
937 781
938 782 $html = apply_filters( 'frm_form_replace_shortcodes', $html, $form, $values );
939 783
940 - if ( str_contains( $html, '[if back_button]' ) ) {
784 + if ( strpos( $html, '[if back_button]' ) ) {
941 785 $html = preg_replace( '/(\[if\s+back_button\])(.*?)(\[\/if\s+back_button\])/mis', '', $html );
942 786 }
943 787
944 - if ( str_contains( $html, '[if save_draft]' ) ) {
788 + if ( strpos( $html, '[if save_draft]' ) ) {
945 789 $html = preg_replace( '/(\[if\s+save_draft\])(.*?)(\[\/if\s+save_draft\])/mis', '', $html );
946 790 }
947 791
948 - if ( str_contains( $html, '[if start_over]' ) ) {
792 + if ( strpos( $html, '[if start_over]' ) ) {
949 793 $html = preg_replace( '/(\[if\s+start_over\])(.*?)(\[\/if\s+start_over\])/mis', '', $html );
950 794 }
951 795
952 796 if ( apply_filters( 'frm_do_html_shortcodes', true ) ) {
953 - return do_shortcode( $html );
797 + $html = do_shortcode( $html );
954 798 }
955 799
956 800 return $html;
957 801 }
958 802
959 - /**
960 - * @param string $submit
961 - *
962 - * @return string
963 - */
964 803 public static function submit_button_label( $submit ) {
965 804 if ( ! $submit ) {
966 805 $frm_settings = FrmAppHelper::get_settings();
967 806 $submit = $frm_settings->submit_value;
@@ -974,32 +813,28 @@
974 813 * If the Formidable styling isn't being loaded,
975 814 * use inline styling to hide the element
976 815 *
977 816 * @since 2.03.05
978 - *
979 - * @return void
980 817 */
981 818 public static function maybe_hide_inline() {
982 819 $frm_settings = FrmAppHelper::get_settings();
983 -
984 - if ( $frm_settings->load_style === 'none' ) {
820 + if ( $frm_settings->load_style == 'none' ) {
985 821 echo ' style="display:none;"';
986 - } elseif ( $frm_settings->load_style === 'dynamic' ) {
822 + } elseif ( $frm_settings->load_style == 'dynamic' ) {
987 823 FrmStylesController::enqueue_style();
988 824 }
989 825 }
990 826
991 - /**
992 - * @param array|bool|int|object|string $form
993 - *
994 - * @return string|null
995 - */
996 827 public static function get_form_style_class( $form = false ) {
997 828 $style = self::get_form_style( $form );
998 829 $class = ' with_frm_style';
999 830
1000 - if ( ! $style ) {
1001 - return FrmAppHelper::is_admin_page( 'formidable-entries' ) ? $class : null;
831 + if ( empty( $style ) ) {
832 + if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) ) {
833 + return $class;
834 + } else {
835 + return;
836 + }
1002 837 }
1003 838
1004 839 // If submit button needs to be inline or centered.
1005 840 if ( is_object( $form ) ) {
@@ -1020,9 +855,11 @@
1020 855 } elseif ( 'center' === $submit_align ) {
1021 856 $class .= ' frm_center_submit';
1022 857 }
1023 858
1024 - return apply_filters( 'frm_add_form_style_class', $class, $style, compact( 'form' ) );
859 + $class = apply_filters( 'frm_add_form_style_class', $class, $style, compact( 'form' ) );
860 +
861 + return $class;
1025 862 }
1026 863
1027 864 /**
1028 865 * In order for frm_inline_submit to inline the submit button the form must also have the frm_inline_form that adds the grid-column style rules required for it to work.
@@ -1029,23 +866,22 @@
1029 866 *
1030 867 * @since 5.0.12
1031 868 *
1032 869 * @param array $form
1033 - *
1034 870 * @return bool
1035 871 */
1036 872 private static function form_should_be_inline_and_missing_class( $form ) {
1037 - if ( isset( $form['form_class'] ) && str_contains( ' ' . $form['form_class'] . ' ', ' frm_inline_form ' ) ) {
1038 - // Not missing class, avoid adding it twice.
873 + if ( isset( $form['form_class'] ) && false !== strpos( ' ' . $form['form_class'] . ' ', ' frm_inline_form ' ) ) {
874 + // not missing class, avoid adding it twice.
1039 875 return false;
1040 876 }
1041 - return ! empty( $form['submit_html'] ) && str_contains( $form['submit_html'], 'frm_inline_submit' );
877 + return ! empty( $form['submit_html'] ) && false !== strpos( $form['submit_html'], 'frm_inline_submit' );
1042 878 }
1043 879
1044 880 /**
1045 881 * Returns appropriate class if form has top labels
1046 882 *
1047 - * @param array $form
883 + * @param $form
1048 884 *
1049 885 * @return string
1050 886 */
1051 887 private static function maybe_align_fields_top( $form ) {
@@ -1054,9 +890,9 @@
1054 890
1055 891 /**
1056 892 * Determine if a form has fields with top labels so submit button can be aligned properly
1057 893 *
1058 - * @param array $form
894 + * @param $form
1059 895 *
1060 896 * @return bool
1061 897 */
1062 898 private static function form_has_top_labels( $form ) {
@@ -1064,20 +900,16 @@
1064 900 return false;
1065 901 }
1066 902
1067 903 $fields = $form['fields'];
1068 -
1069 904 if ( count( $fields ) <= 0 ) {
1070 905 return false;
1071 906 }
1072 907
1073 - // Start from the fields closest to the submit button.
1074 - $fields = array_reverse( $fields );
1075 -
908 + $fields = array_reverse( $fields ); // start from the fields closest to the submit button
1076 909 foreach ( $fields as $field ) {
1077 - $type = $field['original_type'] ?? $field['type'];
910 + $type = isset( $field['original_type'] ) ? $field['original_type'] : $field['type'];
1078 911 $has_input = FrmFieldFactory::field_has_property( $type, 'has_input' );
1079 -
1080 912 if ( $has_input ) {
1081 913 return self::field_has_top_label( $field, $form );
1082 914 }
1083 915 }
@@ -1087,63 +919,61 @@
1087 919
1088 920 /**
1089 921 * Check if a field's label position is set to "top"
1090 922 *
1091 - * @param array $field
1092 - * @param bool|object|string $form
923 + * @param $field
924 + * @param $form
1093 925 *
1094 926 * @return bool
1095 927 */
1096 928 private static function field_has_top_label( $field, $form ) {
1097 929 $label_position = FrmFieldsHelper::label_position( $field['label'], $field, $form );
1098 - return in_array( $label_position, array( 'top', 'inside', 'hidden' ), true );
930 +
931 + return in_array( $label_position, array( 'top', 'inside', 'hidden' ) );
1099 932 }
1100 933
1101 934 /**
1102 - * @param array|bool|int|object|string $form
935 + * @param object|string|boolean $form
1103 936 *
1104 - * @return int|string
937 + * @return string
1105 938 */
1106 939 public static function get_form_style( $form ) {
1107 940 $style = 1;
1108 -
1109 - if ( ! $form || 'default' === $form ) {
941 + if ( empty( $form ) || 'default' === $form ) {
1110 942 return $style;
1111 - }
1112 -
1113 - if ( is_object( $form ) && $form->parent_form_id ) {
1114 - // Get the parent form if this is a child
943 + } elseif ( is_object( $form ) && $form->parent_form_id ) {
944 + // get the parent form if this is a child
1115 945 $form = $form->parent_form_id;
1116 - } elseif ( is_array( $form ) && ! empty( $form['parent_form_id'] ) ) {
946 + } elseif ( is_array( $form ) && isset( $form['parent_form_id'] ) && $form['parent_form_id'] ) {
1117 947 $form = $form['parent_form_id'];
1118 948 } elseif ( is_array( $form ) && isset( $form['custom_style'] ) ) {
1119 949 $style = $form['custom_style'];
1120 950 }
1121 951
1122 - if ( $form && ( is_string( $form ) || is_int( $form ) ) ) {
952 + if ( $form && is_string( $form ) ) {
1123 953 $form = FrmForm::getOne( $form );
1124 954 }
1125 955
1126 - return $form && is_object( $form ) && isset( $form->options['custom_style'] ) ? $form->options['custom_style'] : $style;
956 + $style = ( $form && is_object( $form ) && isset( $form->options['custom_style'] ) ) ? $form->options['custom_style'] : $style;
957 +
958 + return $style;
1127 959 }
1128 960
1129 961 /**
1130 962 * Display the validation error messages when an entry is submitted
1131 963 *
964 + * @param array $args - includes img, errors
965 + *
1132 966 * @since 2.0.6
1133 - *
1134 - * @param array $args Includes img, errors.
1135 - *
1136 - * @return void
1137 967 */
1138 968 public static function show_errors( $args ) {
1139 969 $invalid_msg = self::get_invalid_error_message( $args );
1140 970
1141 - if ( $invalid_msg ) {
971 + if ( empty( $invalid_msg ) ) {
972 + $show_img = false;
973 + } else {
1142 974 echo wp_kses_post( $invalid_msg );
1143 975 $show_img = true;
1144 - } else {
1145 - $show_img = false;
1146 976 }
1147 977
1148 978 self::show_error(
1149 979 array(
@@ -1158,22 +988,19 @@
1158 988 * Display the error message in the front-end along with the image if set
1159 989 * The image was removed from the styling settings, but it may still be set with a hook
1160 990 * If the message in the global settings is empty, show every validation message in the error box
1161 991 *
992 + * @param array $args - includes img, errors, and show_img
993 + *
1162 994 * @since 2.0.6
1163 - *
1164 - * @param array $args Includes img, errors, and show_img.
1165 - *
1166 - * @return void
1167 995 */
1168 996 public static function show_error( $args ) {
1169 - // Remove any blank messages
997 + // remove any blank messages
1170 998 $args['errors'] = array_filter( (array) $args['errors'] );
1171 999
1172 1000 $line_break_first = $args['show_img'];
1173 -
1174 1001 foreach ( $args['errors'] as $error_key => $error ) {
1175 - if ( $line_break_first && ! is_numeric( $error_key ) && ( $error_key === 'cptch_number' || str_starts_with( $error_key, 'field' ) ) ) {
1002 + if ( $line_break_first && ! is_numeric( $error_key ) && ( $error_key == 'cptch_number' || strpos( $error_key, 'field' ) === 0 ) ) {
1176 1003 continue;
1177 1004 }
1178 1005
1179 1006 $id = str_replace( 'field', 'field_', $error_key );
@@ -1179,9 +1006,9 @@
1179 1006 $id = str_replace( 'field', 'field_', $error_key );
1180 1007 echo '<div id="' . esc_attr( $id ) . '_error">';
1181 1008
1182 1009 if ( $args['show_img'] && ! empty( $args['img'] ) ) {
1183 - echo '<img src="' . esc_url( $args['img'] ) . '" alt="" />';
1010 + echo '<img src="' . esc_attr( $args['img'] ) . '" alt="" />';
1184 1011 } else {
1185 1012 $args['show_img'] = true;
1186 1013 }
1187 1014
@@ -1190,38 +1017,34 @@
1190 1017 echo '</div>';
1191 1018 }
1192 1019 }
1193 1020
1194 - /**
1195 - * @param int|string $id
1196 - *
1197 - * @return void
1198 - */
1199 1021 public static function maybe_get_scroll_js( $id ) {
1200 1022 $offset = apply_filters( 'frm_scroll_offset', 4, array( 'form_id' => $id ) );
1201 -
1202 - // phpcs:ignore Universal.Operators.StrictComparisons
1203 1023 if ( $offset != - 1 ) {
1204 1024 self::get_scroll_js( $id );
1205 1025 }
1206 1026 }
1207 1027
1028 + public static function get_scroll_js( $form_id ) {
1029 + echo '<script type="text/javascript">document.addEventListener(\'DOMContentLoaded\',function(){frmFrontForm.scrollMsg(' . (int) $form_id . ');})</script>';
1030 + }
1031 +
1208 1032 /**
1209 - * @param int|string $form_id
1210 - *
1211 - * @return void
1033 + * @since 3.0
1212 1034 */
1213 - public static function get_scroll_js( $form_id ) {
1214 - echo '<script type="text/javascript">document.addEventListener(\'DOMContentLoaded\',function(){frmFrontForm.scrollMsg(' . (int) $form_id . ');})</script>';
1035 + public static function actions_dropdown( $atts ) {
1036 + if ( FrmAppHelper::is_admin_page( 'formidable' ) ) {
1037 + $status = $atts['status'];
1038 + $form_id = isset( $atts['id'] ) ? $atts['id'] : FrmAppHelper::get_param( 'id', 0, 'get', 'absint' );
1039 + $trash_link = self::delete_trash_info( $form_id, $status );
1040 + $links = self::get_action_links( $form_id, $status );
1041 + include( FrmAppHelper::plugin_path() . '/classes/views/frm-forms/actions-dropdown.php' );
1042 + }
1215 1043 }
1216 1044
1217 1045 /**
1218 1046 * @since 3.0
1219 - *
1220 - * @param int|object|string $form_id
1221 - * @param mixed $form
1222 - *
1223 - * @return array
1224 1047 */
1225 1048 public static function get_action_links( $form_id, $form ) {
1226 1049 if ( ! is_object( $form ) ) {
1227 1050 $form = FrmForm::getOne( $form_id );
@@ -1228,10 +1051,9 @@
1228 1051 }
1229 1052
1230 1053 $actions = array();
1231 1054 $trash_links = self::delete_trash_links( $form_id );
1232 -
1233 - if ( 'trash' === $form->status ) {
1055 + if ( 'trash' == $form->status ) {
1234 1056 $actions['restore'] = $trash_links['restore'];
1235 1057
1236 1058 if ( current_user_can( 'frm_delete_forms' ) ) {
1237 1059 $actions['trash'] = $trash_links['delete'];
@@ -1237,34 +1059,28 @@
1237 1059 $actions['trash'] = $trash_links['delete'];
1238 1060 }
1239 1061 } elseif ( current_user_can( 'frm_edit_forms' ) ) {
1240 1062 $duplicate_link = '?page=formidable&frm_action=duplicate&id=' . $form_id;
1241 -
1242 1063 if ( $form->is_template ) {
1243 1064 $actions['frm_duplicate'] = array(
1244 1065 'url' => wp_nonce_url( $duplicate_link ),
1245 1066 'label' => __( 'Create Form from Template', 'formidable' ),
1246 - 'icon' => 'frmfont frm_clone_icon',
1067 + 'icon' => 'frm_icon_font frm_clone_icon',
1247 1068 );
1248 1069 } else {
1249 1070 $actions['duplicate'] = array(
1250 1071 'url' => wp_nonce_url( $duplicate_link ),
1251 - 'label' => __( 'Duplicate', 'formidable' ),
1252 - 'icon' => 'frmfont frm_clone_icon',
1072 + 'label' => __( 'Duplicate Form', 'formidable' ),
1073 + 'icon' => 'frm_icon_font frm_clone_icon',
1253 1074 );
1254 1075 }
1255 1076
1256 1077 $actions['trash'] = self::delete_trash_info( $form_id, $form->status );
1257 - }//end if
1078 + }
1258 1079
1259 1080 return $actions;
1260 1081 }
1261 1082
1262 - /**
1263 - * @param int|object|string $data
1264 - *
1265 - * @return string
1266 - */
1267 1083 public static function edit_form_link( $data ) {
1268 1084 $form_id = self::get_form_id_from_data( $data );
1269 1085
1270 1086 if ( ! $form_id ) {
@@ -1271,122 +1087,94 @@
1271 1087 return '';
1272 1088 }
1273 1089
1274 1090 $label = self::edit_form_link_label( $data );
1275 - return '<a href="' . esc_url( FrmForm::get_edit_link( $form_id ) ) . '">' . esc_html( $label ) . '</a>';
1091 + $link = '<a href="' . esc_url( FrmForm::get_edit_link( $form_id ) ) . '">' . esc_html( $label ) . '</a>';
1092 + return $link;
1276 1093 }
1277 1094
1278 - /**
1279 - * Returns a text used when no title is set.
1280 - *
1281 - * @since 6.16.1
1282 - *
1283 - * @return string
1284 - */
1285 - public static function get_no_title_text() {
1286 - return __( '(no title)', 'formidable' );
1287 - }
1288 -
1289 - /**
1290 - * @param int|object|string $data
1291 - *
1292 - * @return string
1293 - */
1294 1095 public static function edit_form_link_label( $data ) {
1295 1096 $name = self::get_form_name_from_data( $data );
1296 -
1297 1097 if ( ! $name ) {
1298 - return self::get_no_title_text();
1098 + return __( '(no title)', 'formidable' );
1299 1099 }
1300 -
1301 1100 return FrmAppHelper::truncate( $name, 40 );
1302 1101 }
1303 1102
1304 1103 /**
1305 - * @param int|object|string $data
1306 - *
1307 - * @return int|string
1104 + * @param mixed data
1105 + * @return int
1308 1106 */
1309 1107 private static function get_form_id_from_data( $data ) {
1310 - return is_object( $data ) ? $data->id : $data;
1108 + if ( is_object( $data ) ) {
1109 + $form_id = $data->id;
1110 + } else {
1111 + $form_id = $data;
1112 + }
1113 + return $form_id;
1311 1114 }
1312 1115
1313 1116 /**
1314 1117 * @param mixed $data
1315 - *
1316 1118 * @return string
1317 1119 */
1318 1120 private static function get_form_name_from_data( $data ) {
1319 1121 if ( is_object( $data ) ) {
1320 - return $data->name;
1122 + $form_name = $data->name;
1123 + } else {
1124 + $form_id = $data;
1125 + $form_name = FrmForm::getName( $form_id );
1321 1126 }
1322 -
1323 - $form_id = $data;
1324 - return FrmForm::getName( $form_id );
1127 + return $form_name;
1325 1128 }
1326 1129
1327 - /**
1328 - * @param int $id
1329 - * @param string $status
1330 - * @param string $length
1331 - *
1332 - * @return string
1333 - */
1334 1130 public static function delete_trash_link( $id, $status, $length = 'label' ) {
1335 1131 $link_details = self::delete_trash_info( $id, $status );
1132 +
1336 1133 return self::format_link_html( $link_details, $length );
1337 1134 }
1338 1135
1339 1136 /**
1340 1137 * @since 3.0
1341 - *
1342 - * @param array $link_details
1343 - * @param string $length
1344 - *
1345 - * @return string
1346 1138 */
1347 1139 public static function format_link_html( $link_details, $length = 'label' ) {
1348 1140 $link = '';
1141 + if ( ! empty( $link_details ) ) {
1142 + $link = '<a href="' . esc_url( $link_details['url'] ) . '" class="frm-trash-link"';
1143 + if ( isset( $link_details['data'] ) ) {
1144 + foreach ( $link_details['data'] as $data => $value ) {
1145 + $link .= ' data-' . esc_attr( $data ) . '="' . esc_attr( $value ) . '"';
1146 + }
1147 + } elseif ( isset( $link_details['confirm'] ) ) {
1148 + $link .= ' onclick="return confirm(\'' . esc_attr( $link_details['confirm'] ) . '\')"';
1149 + }
1349 1150
1350 - if ( ! $link_details ) {
1351 - return $link;
1352 - }
1353 -
1354 - $link = '<a href="' . esc_url( $link_details['url'] ) . '" class="frm-trash-link"';
1355 -
1356 - if ( isset( $link_details['data'] ) ) {
1357 - foreach ( $link_details['data'] as $data => $value ) {
1358 - $link .= ' data-' . esc_attr( $data ) . '="' . esc_attr( $value ) . '"';
1151 + $label = ( isset( $link_details[ $length ] ) ? $link_details[ $length ] : $link_details['label'] );
1152 + if ( $length == 'icon' && isset( $link_details[ $length ] ) ) {
1153 + $label = '<span class="' . $label . '" title="' . esc_attr( $link_details['label'] ) . '" aria-hidden="true"></span>';
1154 + $link .= ' aria-label="' . esc_attr( $link_details['label'] ) . '"';
1359 1155 }
1360 - } elseif ( isset( $link_details['confirm'] ) ) {
1361 - $link .= ' onclick="return confirm(\'' . esc_attr( $link_details['confirm'] ) . '\')"';
1362 - }
1363 1156
1364 - $label = $link_details[ $length ] ?? $link_details['label'];
1365 -
1366 - if ( $length === 'icon' && isset( $link_details[ $length ] ) ) {
1367 - $label = '<span class="' . $label . '" title="' . esc_attr( $link_details['label'] ) . '" aria-hidden="true"></span>';
1368 - $link .= ' aria-label="' . esc_attr( $link_details['label'] ) . '"';
1157 + $link .= '>' . $label . '</a>';
1369 1158 }
1370 1159
1371 - return $link . ( '>' . $label . '</a>' );
1160 + return $link;
1372 1161 }
1373 1162
1374 1163 /**
1375 1164 * @since 3.0
1376 - *
1377 - * @param int $id
1378 - * @param string $status
1379 - *
1380 - * @return array
1381 1165 */
1382 1166 public static function delete_trash_info( $id, $status ) {
1383 1167 $labels = self::delete_trash_links( $id );
1384 1168
1385 - if ( 'trash' === $status ) {
1169 + if ( 'trash' == $status ) {
1386 1170 $info = $labels['restore'];
1387 1171 } elseif ( current_user_can( 'frm_delete_forms' ) ) {
1388 - $info = EMPTY_TRASH_DAYS ? $labels['trash'] : $labels['delete'];
1172 + if ( EMPTY_TRASH_DAYS ) {
1173 + $info = $labels['trash'];
1174 + } else {
1175 + $info = $labels['delete'];
1176 + }
1389 1177 } else {
1390 1178 $info = array();
1391 1179 }
1392 1180
@@ -1394,14 +1182,10 @@
1394 1182 }
1395 1183
1396 1184 /**
1397 1185 * @since 3.0
1398 - *
1399 - * @param int $id
1400 - *
1401 - * @return array
1402 1186 */
1403 - public static function delete_trash_links( $id ) {
1187 + private static function delete_trash_links( $id ) {
1404 1188 $current_page = FrmAppHelper::get_simple_request( array( 'param' => 'form_type' ) );
1405 1189 $base_url = '?page=formidable&form_type=' . $current_page . '&id=' . $id;
1406 1190
1407 1191 return array(
@@ -1413,9 +1197,9 @@
1413 1197 'trash' => array(
1414 1198 'label' => __( 'Move Form to Trash', 'formidable' ),
1415 1199 'short' => __( 'Trash', 'formidable' ),
1416 1200 'url' => wp_nonce_url( $base_url . '&frm_action=trash', 'trash_form_' . absint( $id ) ),
1417 - 'icon' => 'frmfont frm_delete_icon',
1201 + 'icon' => 'frm_icon_font frm_delete_icon',
1418 1202 'data' => array(
1419 1203 'frmverify' => __( 'Do you want to move this form to the trash?', 'formidable' ),
1420 1204 'frmverify-btn' => 'frm-button-red',
1421 1205 ),
@@ -1424,9 +1208,9 @@
1424 1208 'label' => __( 'Delete Permanently', 'formidable' ),
1425 1209 'short' => __( 'Delete', 'formidable' ),
1426 1210 'url' => wp_nonce_url( $base_url . '&frm_action=destroy', 'destroy_form_' . absint( $id ) ),
1427 1211 'confirm' => __( 'Are you sure you want to delete this form and all its entries?', 'formidable' ),
1428 - 'icon' => 'frmfont frm_delete_icon',
1212 + 'icon' => 'frm_icon_font frm_delete_icon',
1429 1213 'data' => array(
1430 1214 'frmverify' => __( 'This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?', 'formidable' ),
1431 1215 'frmverify-btn' => 'frm-button-red',
1432 1216 ),
@@ -1435,38 +1219,36 @@
1435 1219 }
1436 1220
1437 1221 /**
1438 1222 * @since 3.0
1439 - *
1440 - * @return array
1441 1223 */
1442 1224 public static function css_classes() {
1443 1225 $classes = array(
1444 - 'frm_total' => array(
1226 + 'frm_total' => array(
1445 1227 'label' => __( 'Total', 'formidable' ),
1446 1228 'title' => __( 'Add this to a read-only field to display the text in bold without a border or background.', 'formidable' ),
1447 1229 ),
1448 - 'frm_total_big' => array(
1230 + 'frm_total_big' => array(
1449 1231 'label' => __( 'Big Total', 'formidable' ),
1450 1232 'title' => __( 'Add this to a read-only field to display the text in large, bold text without a border or background.', 'formidable' ),
1451 1233 ),
1452 - 'frm_scroll_box' => array(
1234 + 'frm_scroll_box' => array(
1453 1235 'label' => __( 'Scroll Box', 'formidable' ),
1454 - 'title' => __( 'If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
1236 + 'title' => __( 'If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field.', 'formidable' ),
1455 1237 ),
1456 - 'frm_first' => array(
1238 + 'frm_first' => array(
1457 1239 'label' => __( 'First', 'formidable' ),
1458 1240 'title' => __( 'Add this to the first field in each row along with a width. ie frm_first frm4', 'formidable' ),
1459 1241 ),
1460 - 'frm_alignright' => __( 'Right', 'formidable' ),
1461 - 'frm_grid_first' => __( 'First Grid Row', 'formidable' ),
1462 - 'frm_grid' => __( 'Even Grid Row', 'formidable' ),
1463 - 'frm_grid_odd' => __( 'Odd Grid Row', 'formidable' ),
1242 + 'frm_alignright' => __( 'Right', 'formidable' ),
1243 + 'frm_grid_first' => __( 'First Grid Row', 'formidable' ),
1244 + 'frm_grid' => __( 'Even Grid Row', 'formidable' ),
1245 + 'frm_grid_odd' => __( 'Odd Grid Row', 'formidable' ),
1464 1246 'frm_color_block' => array(
1465 1247 'label' => __( 'Color Block', 'formidable' ),
1466 1248 'title' => __( 'Add a background color to the field or section.', 'formidable' ),
1467 1249 ),
1468 - 'frm_capitalize' => array(
1250 + 'frm_capitalize' => array(
1469 1251 'label' => __( 'Capitalize', 'formidable' ),
1470 1252 'title' => __( 'Automatically capitalize the first letter in each word.', 'formidable' ),
1471 1253 ),
1472 1254 );
@@ -1473,11 +1255,8 @@
1473 1255
1474 1256 return apply_filters( 'frm_layout_classes', $classes );
1475 1257 }
1476 1258
1477 - /**
1478 - * @return array
1479 - */
1480 1259 public static function grid_classes() {
1481 1260 return array(
1482 1261 'frm_half' => '1/2',
1483 1262 'frm_third' => '1/3',
@@ -1491,18 +1270,12 @@
1491 1270 }
1492 1271
1493 1272 /**
1494 1273 * @since 3.0
1495 - *
1496 - * @param mixed $style
1497 - * @param string $class
1498 - *
1499 - * @return string
1500 1274 */
1501 1275 public static function style_class_label( $style, $class ) {
1502 1276 $label = '';
1503 -
1504 - if ( ! $style ) {
1277 + if ( empty( $style ) ) {
1505 1278 $label = $class;
1506 1279 } elseif ( ! is_array( $style ) ) {
1507 1280 $label = $style;
1508 1281 } elseif ( isset( $style['label'] ) ) {
@@ -1511,13 +1284,8 @@
1511 1284
1512 1285 return $label;
1513 1286 }
1514 1287
1515 - /**
1516 - * @param string $status
1517 - *
1518 - * @return string
1519 - */
1520 1288 public static function status_nice_name( $status ) {
1521 1289 $nice_names = array(
1522 1290 'draft' => __( 'Draft', 'formidable' ),
1523 1291 'trash' => __( 'Trash', 'formidable' ),
@@ -1523,107 +1291,111 @@
1523 1291 'trash' => __( 'Trash', 'formidable' ),
1524 1292 'publish' => __( 'Published', 'formidable' ),
1525 1293 );
1526 1294
1527 - if ( ! array_key_exists( $status, $nice_names ) ) {
1295 + if ( ! in_array( $status, array_keys( $nice_names ) ) ) {
1528 1296 $status = 'publish';
1529 1297 }
1530 1298
1531 - return $nice_names[ $status ];
1299 + $name = $nice_names[ $status ];
1300 +
1301 + return $name;
1532 1302 }
1533 1303
1534 1304 /**
1535 - * Renders a template icon based on the given categories.
1536 - *
1537 - * @param array $categories The categories to render the icon for.
1305 + * @param array $categories
1538 1306 * @param array $atts {
1539 - * Optional. An array of attributes for rendering.
1540 - *
1541 - * @type string $html 'span' or 'div'. Default 'span'.
1542 - * @type bool $bg Whether to add a background color or not. Default false.
1307 + * @type string $html 'span' or 'div'.
1308 + * @type boolean $bg Whether to add a bg color or not.
1543 1309 * }
1544 1310 *
1545 1311 * @return void
1546 1312 */
1547 1313 public static function template_icon( $categories, $atts = array() ) {
1548 - // Define defaults.
1549 1314 $defaults = array(
1550 - 'bg' => true,
1315 + 'html' => 'span',
1316 + 'bg' => false,
1551 1317 );
1552 - $atts = array_merge( $defaults, $atts );
1318 + $atts = array_merge( $defaults, $atts );
1553 1319
1554 - // Filter out ignored categories.
1555 - $ignore = self::get_license_types();
1320 + $ignore = self::ignore_template_categories();
1556 1321 $categories = array_diff( $categories, $ignore );
1557 1322
1558 - // Define icons mapping.
1559 1323 $icons = array(
1560 - 'WooCommerce' => array( 'woocommerce', 'var(--purple)' ),
1561 - 'Post' => array( 'wordpress', 'rgb(0,160,210)' ),
1562 - 'User Registration' => array( 'register', 'var(--pink)' ),
1324 + 'WooCommerce' => array( 'woocommerce', 'var(--purple)' ),
1325 + 'Post' => array( 'wordpress', 'rgb(0,160,210)' ),
1326 + 'User Registration' => array( 'register', 'var(--pink)' ),
1563 1327 'Registration and Signup' => array( 'register', 'var(--pink)' ),
1564 - 'PayPal' => array( 'paypal' ),
1565 - 'Stripe' => array( 'credit_card', 'var(--green)' ),
1566 - 'Twilio' => array( 'sms' ),
1567 - 'Payment' => array( 'credit_card' ),
1568 - 'Order Form' => array( 'product' ),
1569 - 'Finance' => array( 'total' ),
1570 - 'Health and Wellness' => array( 'heart', 'var(--pink)' ),
1571 - 'Event Planning' => array( 'calendar', 'var(--orange)' ),
1572 - 'Real Estate' => array( 'house' ),
1573 - 'Nonprofit' => array( 'heart_solid' ),
1574 - 'Calculator' => array( 'calculator', 'var(--purple)' ),
1575 - 'Quiz' => array( 'percent' ),
1576 - 'Registrations' => array( 'address_card' ),
1577 - 'Customer Service' => array( 'users_solid' ),
1578 - 'Education' => array( 'pencil' ),
1579 - 'Marketing' => array( 'eye' ),
1580 - 'Feedback' => array( 'smile' ),
1581 - 'Business Operations' => array( 'case' ),
1582 - 'Contact Form' => array( 'email' ),
1583 - 'Conversational Forms' => array( 'chat_forms' ),
1584 - 'Survey' => array( 'chat_forms', 'var(--orange)' ),
1585 - 'Application' => array( 'align_right' ),
1586 - 'Signature' => array( 'signature' ),
1587 - '' => array( 'align_right' ),
1328 + 'PayPal' => array( 'paypal' ),
1329 + 'Stripe' => array( 'credit_card', 'var(--green)' ),
1330 + 'Twilio' => array( 'sms' ),
1331 + 'Payment' => array( 'credit_card' ),
1332 + 'Order Form' => array( 'product' ),
1333 + 'Finance' => array( 'total' ),
1334 + 'Health and Wellness' => array( 'heart', 'var(--pink)' ),
1335 + 'Event Planning' => array( 'calendar', 'var(--orange)' ),
1336 + 'Real Estate' => array( 'house' ),
1337 + 'Nonprofit' => array( 'heart_solid' ),
1338 + 'Calculator' => array( 'calculator', 'var(--purple)' ),
1339 + 'Quiz' => array( 'percent' ),
1340 + 'Registrations' => array( 'address_card' ),
1341 + 'Customer Service' => array( 'users_solid' ),
1342 + 'Education' => array( 'pencil' ),
1343 + 'Marketing' => array( 'eye' ),
1344 + 'Feedback' => array( 'smile' ),
1345 + 'Business Operations' => array( 'case' ),
1346 + 'Contact Form' => array( 'email' ),
1347 + 'Conversational Forms' => array( 'chat_forms' ),
1348 + 'Survey' => array( 'chat_forms', 'var(--orange)' ),
1349 + 'Application' => array( 'align_right' ),
1350 + 'Signature' => array( 'signature' ),
1351 + '' => array( 'align_right' ),
1588 1352 );
1589 1353
1590 - // Determine the icon to be used.
1354 + $icons[ __( 'My Templates', 'formidable' ) ] = array( 'user', 'var(--orange)' );
1355 +
1591 1356 $icon = $icons[''];
1592 1357
1593 1358 if ( count( $categories ) === 1 ) {
1594 1359 $category = reset( $categories );
1595 - $icon = $icons[ $category ] ?? $icon;
1596 - } elseif ( $categories ) {
1597 - $icons = array_intersect_key( $icons, array_flip( $categories ) );
1598 - $icon = reset( $icons );
1360 + $icon = isset( $icons[ $category ] ) ? $icons[ $category ] : $icon;
1361 + } elseif ( ! empty( $categories ) ) {
1362 + foreach ( $icons as $cat => $icon ) {
1363 + if ( ! in_array( $cat, $categories ) ) {
1364 + unset( $icons[ $cat ] );
1365 + }
1366 + }
1367 + $icon = reset( $icons );
1599 1368 }
1600 1369
1601 - // Prepare variables for output.
1602 - $icon_name = $icon[0];
1603 - $bg_color = $icon[1] ?? '';
1370 + $bg = isset( $icon[1] ) ? $icon[1] : '';
1604 1371
1605 - // Render the icon.
1606 - echo '<span class="frm-category-icon frm-icon-wrapper"';
1607 -
1608 - if ( $bg_color && $atts['bg'] ) {
1609 - echo ' style="background-color:' . esc_attr( $bg_color ) . '"';
1372 + if ( $atts['html'] === 'div' ) {
1373 + echo '<div class="frm-category-icon frm-icon-wrapper" role="button"';
1374 + } else {
1375 + echo '<span class="frm-inner-circle"';
1610 1376 }
1377 + echo empty( $bg ) || empty( $atts['bg'] ) ? '' : ' style="background-color:' . esc_attr( $bg ) . '"';
1378 + echo '>';
1611 1379
1612 - echo '>';
1613 - FrmAppHelper::icon_by_class( 'frmfont frm_' . $icon_name . '_icon' );
1380 + FrmAppHelper::icon_by_class( 'frmfont frm_' . $icon[0] . '_icon' );
1381 + echo '<span class="frm_hidden">';
1382 + FrmAppHelper::icon_by_class( 'frmfont frm_lock_icon' );
1614 1383 echo '</span>';
1384 + echo '</' . esc_attr( $atts['html'] ) . '>';
1615 1385 }
1616 1386
1617 1387 /**
1618 - * Get template install link.
1388 + * @since 4.03.01
1619 1389 *
1390 + * @return array<string>
1391 + */
1392 + public static function ignore_template_categories() {
1393 + return array( 'Business', 'Elite', 'Personal', 'Creator', 'Basic', 'free' );
1394 + }
1395 +
1396 + /**
1620 1397 * @since 4.02
1621 - *
1622 - * @param array $template Template details.
1623 - * @param array $args Additional arguments.
1624 - *
1625 - * @return array The link attributes.
1626 1398 */
1627 1399 public static function get_template_install_link( $template, $args ) {
1628 1400 $defaults = array(
1629 1401 'class' => 'install-now',
@@ -1638,8 +1410,13 @@
1638 1410 'class' => 'frm-install-template',
1639 1411 'href' => 'rel',
1640 1412 'atts' => '',
1641 1413 );
1414 + } elseif ( self::plan_is_allowed( $args ) ) {
1415 + $link = array(
1416 + 'url' => FrmAppHelper::admin_upgrade_link( 'addons', 'account/downloads/' ) . '&utm_content=' . $template['slug'],
1417 + 'label' => __( 'Renew', 'formidable' ),
1418 + );
1642 1419 } else {
1643 1420 $link = array(
1644 1421 'url' => $args['pricing'],
1645 1422 'label' => __( 'Upgrade', 'formidable' ),
@@ -1662,23 +1439,20 @@
1662 1439 if ( empty( $args['license_type'] ) ) {
1663 1440 return false;
1664 1441 }
1665 1442
1666 - $plans = array( 'free', 'personal', 'business', 'elite' );
1667 - $license_type = strtolower( $args['license_type'] );
1668 - $plan_required = strtolower( $args['plan_required'] );
1669 - $included = $license_type === $plan_required;
1443 + $included = $args['license_type'] === strtolower( $args['plan_required'] );
1670 1444
1671 - if ( $included || ! in_array( $plan_required, $plans, true ) ) {
1445 + $plans = array( 'free', 'personal', 'business', 'elite' );
1446 + if ( $included || ! in_array( strtolower( $args['plan_required'] ), $plans, true ) ) {
1672 1447 return $included;
1673 1448 }
1674 1449
1675 1450 foreach ( $plans as $plan ) {
1676 - if ( $included || $plan === $license_type ) {
1451 + if ( $included || $plan === $args['license_type'] ) {
1677 1452 break;
1678 1453 }
1679 -
1680 - $included = $plan === $plan_required;
1454 + $included = $plan === strtolower( $args['plan_required'] );
1681 1455 }
1682 1456
1683 1457 return $included;
1684 1458 }
@@ -1683,33 +1457,34 @@
1683 1457 return $included;
1684 1458 }
1685 1459
1686 1460 /**
1461 + * @since 4.02
1462 + */
1463 + public static function template_install_html( $link, $class = '' ) {
1464 + $link['class'] .= ' ' . $class;
1465 + echo '<a ' . esc_attr( $link['href'] ) . '="' . esc_url( $link['url'] ) . '" class="' . esc_attr( $link['class'] ) . ' " aria-label="' . esc_attr( $link['label'] ) . '"' . ( $link['atts'] ? ' target="_blank" rel="noopener"' : '' ) . '>';
1466 + }
1467 +
1468 + /**
1687 1469 * If a template or add-on cannot be installed, show a message
1688 1470 * about which plan is required.
1689 1471 *
1690 1472 * @since 4.0
1691 - *
1692 - * @param string $requires
1693 - * @param string $link
1694 - *
1695 - * @return void
1696 1473 */
1697 1474 public static function show_plan_required( $requires, $link ) {
1698 - if ( ! $requires ) {
1475 + if ( empty( $requires ) ) {
1699 1476 return;
1700 1477 }
1701 1478
1702 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1703 1479 ?>
1704 1480 <p class="frm_plan_required">
1705 - <?php esc_html_e( 'Plan required:', 'formidable' ); ?>
1481 + <?php esc_html_e( 'License plan required:', 'formidable' ); ?>
1706 1482 <a href="<?php echo esc_url( $link ); ?>" target="_blank" rel="noopener">
1707 1483 <?php echo esc_html( $requires ); ?>
1708 1484 </a>
1709 1485 </p>
1710 1486 <?php
1711 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1712 1487 }
1713 1488
1714 1489 /**
1715 1490 * @since 4.0
@@ -1714,10 +1489,9 @@
1714 1489 /**
1715 1490 * @since 4.0
1716 1491 *
1717 1492 * @param array $item
1718 - *
1719 - * @return false|string
1493 + * @return string|false
1720 1494 */
1721 1495 public static function get_plan_required( &$item ) {
1722 1496 if ( ! isset( $item['categories'] ) || ! is_array( $item['categories'] ) || ! empty( $item['url'] ) ) {
1723 1497 return false;
@@ -1722,14 +1496,20 @@
1722 1496 if ( ! isset( $item['categories'] ) || ! is_array( $item['categories'] ) || ! empty( $item['url'] ) ) {
1723 1497 return false;
1724 1498 }
1725 1499
1726 - $plans = self::get_license_types();
1500 + $plans = array( 'free', 'Basic', 'Personal', 'Plus', 'Creator', 'Business', 'Elite' );
1727 1501
1728 1502 foreach ( $item['categories'] as $k => $category ) {
1729 1503 if ( in_array( $category, $plans, true ) ) {
1730 1504 unset( $item['categories'][ $k ] );
1731 - return self::convert_legacy_package_names( $category );
1505 +
1506 + if ( in_array( $category, array( 'Creator', 'Personal' ), true ) ) {
1507 + // Show the current package name.
1508 + $category = 'Plus';
1509 + }
1510 +
1511 + return $category;
1732 1512 }
1733 1513 }
1734 1514
1735 1515 return false;
@@ -1735,53 +1515,8 @@
1735 1515 return false;
1736 1516 }
1737 1517
1738 1518 /**
1739 - * Converts legacy package names to the current standard package name.
1740 - *
1741 - * @since 6.15
1742 - *
1743 - * @param string $package_name
1744 - *
1745 - * @return string The updated package name.
1746 - */
1747 - public static function convert_legacy_package_names( $package_name ) {
1748 - if ( in_array( $package_name, array( 'Creator', 'Personal' ), true ) ) {
1749 - return 'Plus';
1750 - }
1751 -
1752 - return $package_name;
1753 - }
1754 -
1755 - /**
1756 - * Get the license types.
1757 - *
1758 - * @since 6.15
1759 - *
1760 - * @param array $args
1761 - *
1762 - * @return array
1763 - */
1764 - public static function get_license_types( $args = array() ) {
1765 - $defaults = array(
1766 - 'include_all' => true,
1767 - 'case_lower' => false,
1768 - );
1769 - $args = wp_parse_args( $args, $defaults );
1770 - $license_types = array( 'Basic', 'Plus', 'Business', 'Elite' );
1771 -
1772 - if ( $args['include_all'] ) {
1773 - $license_types = array_merge( array( 'free', 'Personal', 'Creator' ), $license_types );
1774 - }
1775 -
1776 - if ( $args['case_lower'] ) {
1777 - return array_map( 'strtolower', $license_types );
1778 - }
1779 -
1780 - return $license_types;
1781 - }
1782 -
1783 - /**
1784 1519 * Checks for warnings to be displayed after form settings are saved.
1785 1520 *
1786 1521 * @since 4.04
1787 1522 *
@@ -1789,9 +1524,10 @@
1789 1524 *
1790 1525 * @return array An array of warnings or an empty array.
1791 1526 */
1792 1527 public static function check_for_warnings( $values ) {
1793 - $warnings = array();
1528 + $warnings = array();
1529 +
1794 1530 $redirect_warning = self::check_redirect_url_for_unsafe_params( $values );
1795 1531
1796 1532 if ( $redirect_warning ) {
1797 1533 $warnings[] = $redirect_warning;
@@ -1816,9 +1552,9 @@
1816 1552
1817 1553 $options = $values['options'];
1818 1554 FrmAppHelper::sanitize_with_html( $options );
1819 1555
1820 - if ( ! isset( $options['success_action'] ) || $options['success_action'] !== 'redirect' || ! isset( $options['success_url'] ) ) {
1556 + if ( ( ! isset( $options['success_action'] ) ) || $options['success_action'] !== 'redirect' || ! isset( $options['success_url'] ) ) {
1821 1557 return false;
1822 1558 }
1823 1559
1824 1560 $unsafe_params_in_redirect = self::get_unsafe_params( $options['success_url'] );
@@ -1836,16 +1572,15 @@
1836 1572 * @return array An array of params whose names are reserved words or an empty array.
1837 1573 */
1838 1574 private static function get_unsafe_params( $url ) {
1839 1575 $redirect_components = parse_url( $url );
1840 -
1841 1576 if ( empty( $redirect_components['query'] ) ) {
1842 1577 return array();
1843 1578 }
1844 -
1845 1579 parse_str( $redirect_components['query'], $redirect_params );
1846 1580 $redirect_param_names = array_keys( $redirect_params );
1847 - $unsafe_params_in_redirect = array_intersect( $redirect_param_names, self::reserved_words() );
1581 + $reserved_words = self::reserved_words();
1582 + $unsafe_params_in_redirect = array_intersect( $redirect_param_names, $reserved_words );
1848 1583
1849 1584 return array_values( $unsafe_params_in_redirect );
1850 1585 }
1851 1586
@@ -1858,27 +1593,26 @@
1858 1593 *
1859 1594 * @return bool|string A string with an unsafe param message or false.
1860 1595 */
1861 1596 private static function create_unsafe_param_warning( $unsafe_params_in_redirect ) {
1862 - $count = count( $unsafe_params_in_redirect );
1597 + $count = count( $unsafe_params_in_redirect );
1598 + $caution = esc_html__( 'Is this intentional?', 'formidable' );
1599 + $reserved_words_intro = esc_html__( 'See the list of reserved words in WordPress.', 'formidable' );
1600 + $reserved_words_link = '<a href="https://codex.wordpress.org/WordPress_Query_Vars" target="_blank"> ' . $reserved_words_intro . '</a>';
1863 1601
1864 1602 if ( $count === 0 ) {
1865 1603 return false;
1866 1604 }
1867 1605
1868 - $caution = esc_html__( 'Is this intentional?', 'formidable' );
1869 - $reserved_words_intro = esc_html__( 'See the list of reserved words in WordPress.', 'formidable' );
1870 - $reserved_words_link = '<a href="https://codex.wordpress.org/WordPress_Query_Vars" target="_blank"> ' . $reserved_words_intro . '</a>';
1871 -
1872 - if ( $count === 1 ) {
1606 + if ( $count == 1 ) {
1873 1607 /* translators: %s: the name of a single parameter in the redirect URL */
1874 - return sprintf( esc_html__( 'The redirect URL is using the parameter "%s", which is reserved by WordPress. ', 'formidable' ), $unsafe_params_in_redirect[0] ) . $caution . $reserved_words_link; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
1608 + return sprintf( esc_html__( 'The redirect URL is using the parameter "%s", which is reserved by WordPress. ', 'formidable' ), $unsafe_params_in_redirect[0] ) . $caution . $reserved_words_link;
1875 1609 }
1876 1610
1877 1611 $unsafe_params_string = implode( '", "', $unsafe_params_in_redirect );
1878 1612
1879 1613 /* translators: %s: the names of two or more parameters in the redirect URL, separated by commas */
1880 - return sprintf( esc_html__( 'The redirect URL is using the parameters "%s", which are reserved by WordPress. ', 'formidable' ), $unsafe_params_string ) . $caution . $reserved_words_link; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
1614 + return sprintf( esc_html__( 'The redirect URL is using the parameters "%s", which are reserved by WordPress. ', 'formidable' ), $unsafe_params_string ) . $caution . $reserved_words_link;
1881 1615 }
1882 1616
1883 1617 /**
1884 1618 * Returns an array of common reserved words in WordPress.
@@ -1937,8 +1671,34 @@
1937 1671 );
1938 1672 }
1939 1673
1940 1674 /**
1675 + * Check an array of templates, determine how many the logged in user can use
1676 + *
1677 + * @param array $templates
1678 + * @param array $args
1679 + * @return int
1680 + */
1681 + public static function available_count( $templates, $args ) {
1682 + return array_reduce(
1683 + $templates,
1684 + function( $total, $template ) use ( $args ) {
1685 + if ( ! empty( $template['url'] ) ) {
1686 + return $total + 1;
1687 + }
1688 +
1689 + $args['plan_required'] = self::get_plan_required( $template );
1690 + if ( self::plan_is_allowed( $args ) ) {
1691 + return $total + 1;
1692 + }
1693 +
1694 + return $total;
1695 + },
1696 + 0
1697 + );
1698 + }
1699 +
1700 + /**
1941 1701 * Make sure the field shortcodes in a url always add the sanitize_url=1 option if nothing is defined.
1942 1702 * This is to prevent some field characters like ', @, and | from being stripped from the redirect URL.
1943 1703 *
1944 1704 * @since 5.0.16
@@ -1944,19 +1704,17 @@
1944 1704 * @since 5.0.16
1945 1705 *
1946 1706 * @param string $url
1947 1707 * @param int $form_id
1948 - *
1949 1708 * @return string
1950 1709 */
1951 1710 public static function maybe_add_sanitize_url_attr( $url, $form_id ) {
1952 - if ( ! str_contains( $url, '[' ) ) {
1711 + if ( false === strpos( $url, '[' ) ) {
1953 1712 // Do nothing if no shortcodes are detected.
1954 1713 return $url;
1955 1714 }
1956 1715
1957 1716 $parsed = wp_parse_url( $url );
1958 -
1959 1717 if ( empty( $parsed['query'] ) ) {
1960 1718 // Do nothing if no query can be detected in the url string.
1961 1719 return $url;
1962 1720 }
@@ -1962,10 +1720,10 @@
1962 1720 }
1963 1721
1964 1722 $original_query = $parsed['query'];
1965 1723 $query = $parsed['query'];
1966 - $shortcodes = FrmFieldsHelper::get_shortcodes( $query, $form_id );
1967 1724
1725 + $shortcodes = FrmFieldsHelper::get_shortcodes( $query, $form_id );
1968 1726 if ( empty( $shortcodes[0] ) ) {
1969 1727 // No shortcodes found, do nothing.
1970 1728 return $url;
1971 1729 }
@@ -1977,22 +1735,21 @@
1977 1735 // Skip if shortcodes.
1978 1736 continue;
1979 1737 }
1980 1738
1981 - if ( str_contains( $options, 'sanitize_url=' ) || str_contains( $options, 'sanitize=' ) ) {
1739 + if ( false !== strpos( $options, 'sanitize_url=' ) || false !== strpos( $options, 'sanitize=' ) ) {
1982 1740 // A sanitize option is already set so leave it alone.
1983 1741 continue;
1984 1742 }
1985 1743
1986 1744 $new_shortcode = '[' . $shortcodes[2][ $key ];
1987 -
1988 1745 if ( $options ) {
1989 1746 $new_shortcode .= ' ' . $options;
1990 1747 }
1748 + $new_shortcode .= ' sanitize_url=1]';
1991 1749
1992 - $new_shortcode .= ' sanitize_url=1]';
1993 - $query = str_replace( $shortcode, $new_shortcode, $query );
1994 - }//end foreach
1750 + $query = str_replace( $shortcode, $new_shortcode, $query );
1751 + }
1995 1752
1996 1753 if ( $query === $original_query ) {
1997 1754 return $url;
1998 1755 }
@@ -2000,197 +1757,15 @@
2000 1757 return str_replace( $original_query, $query, $url );
2001 1758 }
2002 1759
2003 1760 /**
2004 - * Outputs the appropriate button text in the publish box.
1761 + * Check if Pro isn't up to date yet.
1762 + * If Pro is active but using a version earlier than v6.2 fallback to Pro for AJAX submit (so things don't all happen twice).
2005 1763 *
2006 - * @return void
2007 - */
2008 - public static function publish_box_button_text() {
2009 - $is_new_template = FrmAppHelper::simple_get( 'new_template' );
2010 - $action = FrmAppHelper::simple_get( 'frm_action' );
2011 -
2012 - if ( ( 'edit' === $action || 'settings' === $action ) && $is_new_template ) {
2013 - esc_html_e( 'Save', 'formidable' );
2014 - } else {
2015 - esc_html_e( 'Update', 'formidable' );
2016 - }
2017 - }
2018 -
2019 - /**
2020 - * Strip characters similar to the WordPress sanitize_html_class function, but allow for [ and ].
2021 - * This allows shortcodes inside of the layout classes setting.
1764 + * @since 6.2
2022 1765 *
2023 - * @since 6.16
2024 - *
2025 - * @param string $classname
2026 - *
2027 - * @return string
2028 - */
2029 - public static function sanitize_layout_class( $classname ) {
2030 - // Strip out any percent-encoded characters.
2031 - $sanitized = preg_replace( '|%[a-fA-F0-9][a-fA-F0-9]|', '', $classname );
2032 -
2033 - // Limit to A-Z, a-z, 0-9, '_', '-', '[', ']'.
2034 - return preg_replace( '/[^A-Za-z0-9_\-\[\]]/', '', $sanitized );
2035 - }
2036 -
2037 - /**
2038 - * Returns true if the preview should be blocked.
2039 - *
2040 - * @since 6.20
2041 - *
2042 - * @param string $form_key
2043 - *
2044 1766 * @return bool
2045 1767 */
2046 - public static function should_block_preview( $form_key ) {
2047 - $should_block = in_array( $form_key, array( 'contact-form', 'contact-us' ), true ) && ! current_user_can( 'frm_view_forms' );
2048 - /**
2049 - * Filters whether the form preview should be blocked.
2050 - *
2051 - * @since 6.20
2052 - *
2053 - * @param bool $should_block
2054 - * @param string $form_key
2055 - */
2056 - return (bool) apply_filters( 'frm_block_preview', $should_block, $form_key );
2057 - }
2058 -
2059 - /**
2060 - * Checks if the form is loaded by API.
2061 - *
2062 - * @since 6.21
2063 - *
2064 - * @return bool
2065 - */
2066 - public static function form_is_loaded_by_api() {
2067 - global $frm_vars;
2068 -
2069 - if ( ! empty( $frm_vars['inplace_edit'] ) ) {
2070 - return true;
2071 - }
2072 -
2073 - return self::is_formidable_api_form() || self::is_block_or_page_builder_preview();
2074 - }
2075 -
2076 - /**
2077 - * Checks if the form is rendered inside a block editor or page builder preview.
2078 - *
2079 - * @since 6.29
2080 - *
2081 - * @return bool
2082 - */
2083 - public static function is_block_or_page_builder_preview() {
2084 - return self::is_gutenberg_editor() || self::is_elementor_ajax() || self::is_visual_views_preview();
2085 - }
2086 -
2087 - /**
2088 - * @since 6.21
2089 - *
2090 - * @return bool
2091 - */
2092 - private static function is_visual_views_preview() {
2093 - return 'frm_views_process_box_preview' === FrmAppHelper::get_post_param( 'action' );
2094 - }
2095 -
2096 - /**
2097 - * @since 6.21
2098 - *
2099 - * @return bool
2100 - */
2101 - private static function is_elementor_ajax() {
2102 - return 'elementor_ajax' === FrmAppHelper::get_post_param( 'action' );
2103 - }
2104 -
2105 - /**
2106 - * @since 6.21
2107 - *
2108 - * @return bool
2109 - */
2110 - private static function is_gutenberg_editor() {
2111 - $url = FrmAppHelper::get_server_value( 'REQUEST_URI' );
2112 -
2113 - if ( str_contains( $url, '/wp-json/wp/v2/block-renderer/formidable/simple-form' ) ) {
2114 - return true;
2115 - }
2116 -
2117 - if ( str_contains( urldecode( $url ), 'rest_route=/wp/v2/block-renderer/formidable/' ) ) {
2118 - return true;
2119 - }
2120 -
2121 - global $pagenow;
2122 - return 'post.php' === $pagenow;
2123 - }
2124 -
2125 - /**
2126 - * @since 6.21
2127 - *
2128 - * @return bool
2129 - */
2130 - private static function is_formidable_api_form() {
2131 - if ( ! class_exists( 'FrmAPIAppController' ) ) {
2132 - return false;
2133 - }
2134 -
2135 - $url = FrmAppHelper::get_server_value( 'REQUEST_URI' );
2136 -
2137 - if ( str_contains( $url, '/wp-json/frm/v2/forms/' ) ) {
2138 - // Prevent the honeypot from appearing for an API loaded form.
2139 - // This is to prevent conflicts where the script is not working.
2140 - return true;
2141 - }
2142 -
2143 - if ( is_callable( 'FrmProFormState::get_from_request' ) ) {
2144 - $api = FrmProFormState::get_from_request( 'a', 0 );
2145 -
2146 - if ( $api ) {
2147 - return true;
2148 - }
2149 - }
2150 -
2151 - return false;
2152 - }
2153 -
2154 - /**
2155 - * @since 6.30
2156 - *
2157 - * @return void
2158 - */
2159 - public static function load_currency_js() {
2160 - global $frm_vars;
2161 -
2162 - if ( empty( $frm_vars['currency'] ) ) {
2163 - return;
2164 - }
2165 -
2166 - echo '<script>';
2167 - echo 'var frmcurrency=' . json_encode( $frm_vars['currency'] ) . ";\n";
2168 - echo 'if(typeof __FRMCURR == "undefined"){__FRMCURR=frmcurrency;}';
2169 - echo 'else{__FRMCURR=jQuery.extend(true,{},__FRMCURR,frmcurrency);}';
2170 - echo '</script>';
2171 - }
2172 -
2173 - /**
2174 - * Returns the form name or the no title text if the form name is empty.
2175 - *
2176 - * @since 6.30
2177 - *
2178 - * @param array|stdClass $form The form data.
2179 - * @param int $length The form name length to truncate to.
2180 - *
2181 - * @return string
2182 - */
2183 - public static function get_form_name( $form, $length = 0 ) {
2184 - $form_name = is_object( $form ) ? $form->name : $form['name'];
2185 -
2186 - if ( '' === $form_name || null === $form_name ) {
2187 - return self::get_no_title_text();
2188 - }
2189 -
2190 - if ( ! $length ) {
2191 - return $form_name;
2192 - }
2193 -
2194 - return FrmAppHelper::truncate( $form_name, $length );
1768 + public static function should_use_pro_for_ajax_submit() {
1769 + return is_callable( 'FrmProForm::is_ajax_on' ) && ! is_callable( 'FrmProFormsHelper::lite_supports_ajax_submit' );
2195 1770 }
2196 1771 }