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