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/models/FrmFieldFormHtml.php +43 -179 6.286.2 View file →
@@ -5,18 +5,13 @@
5 5
6 6 /**
7 7 * @since 3.0
8 8 */
9 +
9 10 class FrmFieldFormHtml {
10 11
11 - /**
12 - * @var string
13 - */
14 12 private $html;
15 13
16 - /**
17 - * @var string
18 - */
19 14 private $html_id;
20 15
21 16 /**
22 17 * @var FrmFieldType
@@ -22,21 +17,12 @@
22 17 * @var FrmFieldType
23 18 */
24 19 private $field_obj;
25 20
26 - /**
27 - * @var int|string
28 - */
29 21 private $field_id;
30 22
31 - /**
32 - * @var array|object
33 - */
34 23 private $form = array();
35 24
36 - /**
37 - * @var array
38 - */
39 25 private $pass_args = array();
40 26
41 27 /**
42 28 * @since 3.0
@@ -55,11 +41,9 @@
55 41 /**
56 42 * @since 3.0
57 43 *
58 44 * @param string $param
59 - * @param array $atts
60 - *
61 - * @return void
45 + * @param array $atts
62 46 */
63 47 private function _set( $param, $atts ) {
64 48 if ( isset( $atts[ $param ] ) ) {
65 49 $this->{$param} = $atts[ $param ];
@@ -69,10 +53,8 @@
69 53 /**
70 54 * @since 3.0
71 55 *
72 56 * @param array $atts
73 - *
74 - * @return void
75 57 */
76 58 private function set_html( $atts ) {
77 59 $this->set_from_field(
78 60 $atts,
@@ -86,10 +68,8 @@
86 68 /**
87 69 * @since 3.0
88 70 *
89 71 * @param array $atts
90 - *
91 - * @return void
92 72 */
93 73 private function set_field_id( $atts ) {
94 74 $this->set_from_field(
95 75 $atts,
@@ -103,16 +83,13 @@
103 83 /**
104 84 * @since 3.0
105 85 *
106 86 * @param array $atts
107 - *
108 - * @return void
109 87 */
110 88 private function set_pass_args( $atts ) {
111 89 $this->pass_args = $atts;
112 90
113 91 $exclude = array( 'field_obj', 'html' );
114 -
115 92 foreach ( $exclude as $ex ) {
116 93 if ( isset( $atts[ $ex ] ) ) {
117 94 unset( $this->pass_args[ $ex ] );
118 95 }
@@ -123,10 +100,8 @@
123 100 * @since 3.0
124 101 *
125 102 * @param array $atts
126 103 * @param array $set
127 - *
128 - * @return void
129 104 */
130 105 private function set_from_field( $atts, $set ) {
131 106 if ( isset( $atts[ $set['param'] ] ) ) {
132 107 $this->{$set['param']} = $atts[ $set['param'] ];
@@ -134,11 +109,8 @@
134 109 $this->{$set['param']} = $this->field_obj->get_field_column( $set['default'] );
135 110 }
136 111 }
137 112
138 - /**
139 - * @return string
140 - */
141 113 public function get_html() {
142 114 $this->replace_shortcodes_before_input();
143 115 $this->replace_shortcodes_with_atts();
144 116 $this->replace_shortcodes_after_input();
@@ -147,10 +119,8 @@
147 119 }
148 120
149 121 /**
150 122 * @since 3.0
151 - *
152 - * @return void
153 123 */
154 124 private function replace_shortcodes_before_input() {
155 125 $this->html = apply_filters( 'frm_before_replace_shortcodes', $this->html, $this->field_obj->get_field(), $this->pass_args['errors'], $this->form );
156 126
@@ -166,35 +136,29 @@
166 136 $this->replace_entry_key();
167 137 $this->replace_form_shortcodes();
168 138 $this->process_wp_shortcodes();
169 139 $this->maybe_replace_description_shortcode( true );
170 -
171 - $this->add_multiple_input_attributes();
172 140 }
173 141
174 142 /**
175 143 * @since 3.0
176 - *
177 - * @return void
178 144 */
179 145 private function replace_field_values() {
180 - // Replace [id].
146 + //replace [id]
181 147 $this->html = str_replace( '[id]', $this->field_id, $this->html );
182 148
183 - // Set the label for
149 + // set the label for
184 150 $this->html = str_replace( 'field_[key]', $this->html_id, $this->html );
185 151
186 - // Replace [key].
152 + //replace [key]
187 153 $this->html = str_replace( '[key]', $this->field_obj->get_field_column( 'field_key' ), $this->html );
188 154
189 - // Replace [field_name].
155 + //replace [field_name]
190 156 $this->html = str_replace( '[field_name]', FrmAppHelper::maybe_kses( $this->field_obj->get_field_column( 'name' ) ), $this->html );
191 157 }
192 158
193 159 /**
194 160 * @since 3.0
195 - *
196 - * @return void
197 161 */
198 162 private function replace_required_label_shortcode() {
199 163 $required = FrmField::is_required( $this->field_obj->get_field() ) ? $this->field_obj->get_field_column( 'required_indicator' ) : '';
200 164 FrmShortcodeHelper::remove_inline_conditions( ! empty( $required ), 'required_label', $required, $this->html );
@@ -204,17 +168,12 @@
204 168 * If this is an HTML field, the values are included in the description.
205 169 * In this case, we don't want to run the wp shortcodes with the description included.
206 170 *
207 171 * @since 3.0
208 - *
209 - * @param bool $wp_processed
210 - *
211 - * @return void
212 172 */
213 173 private function maybe_replace_description_shortcode( $wp_processed = false ) {
214 174 $is_html = 'html' === $this->field_obj->get_field_column( 'type' );
215 - $should_replace = $is_html ? $wp_processed : ! $wp_processed;
216 -
175 + $should_replace = ( $is_html && $wp_processed ) || ( ! $is_html && ! $wp_processed );
217 176 if ( $should_replace ) {
218 177 $this->replace_description_shortcode();
219 178 }
220 179 }
@@ -220,16 +179,13 @@
220 179 }
221 180
222 181 /**
223 182 * @since 3.0
224 - *
225 - * @return void
226 183 */
227 184 private function replace_description_shortcode() {
228 185 $this->maybe_add_description_id();
229 186 $description = FrmAppHelper::maybe_kses( $this->field_obj->get_field_column( 'description' ) );
230 - // phpcs:ignore Universal.Operators.StrictComparisons
231 - FrmShortcodeHelper::remove_inline_conditions( $description && $description != '', 'description', $description, $this->html );
187 + FrmShortcodeHelper::remove_inline_conditions( ( $description && $description != '' ), 'description', $description, $this->html );
232 188 }
233 189
234 190 /**
235 191 * Add an ID to the description for aria-describedby.
@@ -235,15 +191,11 @@
235 191 * Add an ID to the description for aria-describedby.
236 192 * This ID was added to the HTML in v3.0.
237 193 *
238 194 * @since 3.0
239 - *
240 - * @return void
241 195 */
242 196 private function maybe_add_description_id() {
243 197 $description = $this->field_obj->get_field_column( 'description' );
244 -
245 - // phpcs:ignore Universal.Operators.StrictComparisons
246 198 if ( $description != '' ) {
247 199 $this->add_element_id( 'description', 'desc' );
248 200 }
249 201 }
@@ -251,17 +203,11 @@
251 203 /**
252 204 * Insert an ID if it doesn't exist.
253 205 *
254 206 * @since 3.06.02
255 - *
256 - * @param string $param
257 - * @param string $id
258 - *
259 - * @return void
260 207 */
261 208 private function add_element_id( $param, $id ) {
262 209 preg_match_all( '/(\[if\s+' . $param . '\])(.*?)(\[\/if\s+' . $param . '\])/mis', $this->html, $inner_html );
263 -
264 210 if ( ! isset( $inner_html[2] ) ) {
265 211 return;
266 212 }
267 213
@@ -268,35 +214,27 @@
268 214 if ( ! is_string( $inner_html[2] ) && count( $inner_html[2] ) === 1 ) {
269 215 $inner_html[2] = $inner_html[2][0];
270 216 }
271 217
272 - if ( ! is_string( $inner_html[2] ) ) {
273 - return;
218 + if ( is_string( $inner_html[2] ) ) {
219 + $has_id = strpos( $inner_html[2], ' id=' );
220 + if ( ! $has_id ) {
221 + $id = 'frm_' . $id . '_' . $this->html_id;
222 + $this->html = str_replace( 'class="frm_' . $param, 'id="' . esc_attr( $id ) . '" class="frm_' . esc_attr( $param ), $this->html );
223 + }
274 224 }
275 -
276 - $has_id = str_contains( $inner_html[2], ' id=' );
277 -
278 - if ( $has_id ) {
279 - return;
280 - }
281 -
282 - $id = 'frm_' . $id . '_' . $this->html_id;
283 - $this->html = str_replace( 'class="frm_' . $param, 'id="' . esc_attr( $id ) . '" class="frm_' . esc_attr( $param ), $this->html );
284 225 }
285 226
286 227 /**
287 228 * @since 3.0
288 - *
289 - * @return void
290 229 */
291 230 private function replace_error_shortcode() {
292 231 $this->maybe_add_error_id();
293 - $error = $this->pass_args['errors'][ 'field' . $this->field_id ] ?? false;
232 + $error = isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ? $this->pass_args['errors'][ 'field' . $this->field_id ] : false;
294 233
295 - if ( $error && ! str_contains( $this->html, 'role="alert"' ) && FrmAppHelper::should_include_alert_role_on_field_errors() ) {
234 + if ( ! empty( $error ) && false === strpos( $this->html, 'role="alert"' ) && FrmAppHelper::should_include_alert_role_on_field_errors() ) {
296 235 $error_body = self::get_error_body( $this->html );
297 -
298 - if ( is_string( $error_body ) && ! str_contains( $error_body, 'role=' ) ) {
236 + if ( is_string( $error_body ) && false === strpos( $error_body, 'role=' ) ) {
299 237 $new_error_body = preg_replace( '/class="frm_error/', 'role="alert" class="frm_error', $error_body, 1 );
300 238 $this->html = str_replace( '[if error]' . $error_body . '[/if error]', '[if error]' . $new_error_body . '[/if error]', $this->html );
301 239 }
302 240 }
@@ -307,25 +245,23 @@
307 245 /**
308 246 * Pull the HTML between [if error] and [/if error] shortcodes.
309 247 *
310 248 * @param string $html
311 - *
312 - * @return false|string
249 + * @return string|false
313 250 */
314 251 private static function get_error_body( $html ) {
315 252 $start = strpos( $html, '[if error]' );
316 -
317 253 if ( false === $start ) {
318 254 return false;
319 255 }
320 256
321 257 $end = strpos( $html, '[/if error]', $start );
322 -
323 258 if ( false === $end ) {
324 259 return false;
325 260 }
326 261
327 - return substr( $html, $start + 10, $end - $start - 10 );
262 + $error_body = substr( $html, $start + 10, $end - $start - 10 );
263 + return $error_body;
328 264 }
329 265
330 266 /**
331 267 * Add an ID to the error message for aria-describedby.
@@ -331,10 +267,8 @@
331 267 * Add an ID to the error message for aria-describedby.
332 268 * This ID was added to the HTML in v3.06.02.
333 269 *
334 270 * @since 3.06.02
335 - *
336 - * @return void
337 271 */
338 272 private function maybe_add_error_id() {
339 273 if ( ! isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ) {
340 274 return;
@@ -346,10 +280,8 @@
346 280 /**
347 281 * Replace [required_class]
348 282 *
349 283 * @since 3.0
350 - *
351 - * @return void
352 284 */
353 285 private function replace_required_class() {
354 286 $required_class = FrmField::is_required( $this->field_obj->get_field() ) ? ' frm_required_field' : '';
355 287 $this->html = str_replace( '[required_class]', $required_class, $this->html );
@@ -356,19 +288,17 @@
356 288 }
357 289
358 290 /**
359 291 * @since 3.0
360 - *
361 - * @return void
362 292 */
363 293 private function replace_form_shortcodes() {
364 294 if ( ! empty( $this->form ) ) {
365 295 $form = (array) $this->form;
366 296
367 - // Replace [form_key].
297 + //replace [form_key]
368 298 $this->html = str_replace( '[form_key]', $form['form_key'], $this->html );
369 299
370 - // Replace [form_name].
300 + //replace [form_name]
371 301 $this->html = str_replace( '[form_name]', $form['name'], $this->html );
372 302 }
373 303 }
374 304
@@ -373,16 +303,14 @@
373 303 }
374 304
375 305 /**
376 306 * @since 3.0
377 - *
378 - * @return void
379 307 */
380 308 public function replace_shortcodes_after_input() {
381 309 $this->html .= "\n";
382 310
383 311 // Stop html filtering on confirmation field to prevent loop
384 - if ( $this->field_obj->get_field_column( 'conf_field' ) !== 'stop' ) {
312 + if ( $this->field_obj->get_field_column( 'conf_field' ) != 'stop' ) {
385 313 $this->filter_for_more_shortcodes();
386 314 }
387 315 }
388 316
@@ -387,15 +315,13 @@
387 315 }
388 316
389 317 /**
390 318 * @since 3.0
391 - *
392 - * @return void
393 319 */
394 320 private function filter_for_more_shortcodes() {
395 321 $atts = $this->pass_args;
396 322
397 - // If field is not in repeating section.
323 + //If field is not in repeating section
398 324 if ( empty( $atts['section_id'] ) ) {
399 325 $atts = array(
400 326 'errors' => $this->pass_args['errors'],
401 327 'form' => $this->form,
@@ -409,13 +335,11 @@
409 335 *
410 336 * @since 3.0
411 337 *
412 338 * @param string $html
413 - *
414 - * @return void
415 339 */
416 340 public function remove_collapse_shortcode( &$html ) {
417 - if ( str_contains( $html, '[collapse_this]' ) ) {
341 + if ( strpos( $html, '[collapse_this]' ) ) {
418 342 $html = str_replace( '[collapse_this]', '', $html );
419 343 }
420 344 }
421 345
@@ -420,10 +344,8 @@
420 344 }
421 345
422 346 /**
423 347 * @since 3.0
424 - *
425 - * @return void
426 348 */
427 349 private function replace_shortcodes_with_atts() {
428 350 preg_match_all( "/\[(input|deletelink)\b(.*?)(?:(\/))?\]/s", $this->html, $shortcodes, PREG_PATTERN_ORDER );
429 351
@@ -429,13 +351,14 @@
429 351
430 352 foreach ( $shortcodes[0] as $short_key => $tag ) {
431 353 $shortcode_atts = FrmShortcodeHelper::get_shortcode_attribute_array( $shortcodes[2][ $short_key ] );
432 354 $tag = FrmShortcodeHelper::get_shortcode_tag( $shortcodes, $short_key );
433 - $replace_with = '';
434 355
435 - if ( $tag === 'deletelink' && FrmAppHelper::pro_is_installed() ) {
356 + $replace_with = '';
357 +
358 + if ( $tag == 'deletelink' && FrmAppHelper::pro_is_installed() ) {
436 359 $replace_with = FrmProEntriesController::entry_delete_link( $shortcode_atts );
437 - } elseif ( $tag === 'input' ) {
360 + } elseif ( $tag == 'input' ) {
438 361 $replace_with = $this->replace_input_shortcode( $shortcode_atts );
439 362 }
440 363
441 364 $this->html = str_replace( $shortcodes[0][ $short_key ], $replace_with, $this->html );
@@ -448,8 +371,9 @@
448 371 * @return string
449 372 */
450 373 private function replace_input_shortcode( $shortcode_atts ) {
451 374 $shortcode_atts = $this->prepare_input_shortcode_atts( $shortcode_atts );
375 +
452 376 return $this->field_obj->include_front_field_input( $this->pass_args, $shortcode_atts );
453 377 }
454 378
455 379 /**
@@ -458,12 +382,12 @@
458 382 * @return array
459 383 */
460 384 private function prepare_input_shortcode_atts( $shortcode_atts ) {
461 385 if ( isset( $shortcode_atts['opt'] ) ) {
462 - --$shortcode_atts['opt'];
386 + $shortcode_atts['opt'] --;
463 387 }
464 388
465 - $field_class = $shortcode_atts['class'] ?? '';
389 + $field_class = isset( $shortcode_atts['class'] ) ? $shortcode_atts['class'] : '';
466 390 $this->field_obj->set_field_column( 'input_class', $field_class );
467 391
468 392 if ( isset( $shortcode_atts['class'] ) ) {
469 393 unset( $shortcode_atts['class'] );
@@ -468,9 +392,9 @@
468 392 if ( isset( $shortcode_atts['class'] ) ) {
469 393 unset( $shortcode_atts['class'] );
470 394 }
471 395
472 - $this->field_obj->set_aria_invalid_error( $shortcode_atts, $this->pass_args );
396 + $shortcode_atts['aria-invalid'] = isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ? 'true' : 'false';
473 397
474 398 $this->field_obj->set_field_column( 'shortcodes', $shortcode_atts );
475 399
476 400 return $shortcode_atts;
@@ -480,10 +404,8 @@
480 404 * Add the label position class into the HTML
481 405 * If the label position is inside, add a class to show the label if the field has a value.
482 406 *
483 407 * @since 3.0
484 - *
485 - * @return void
486 408 */
487 409 private function add_class_to_label() {
488 410 $label_class = $this->field_obj->get_label_class();
489 411 $this->html = str_replace( '[label_position]', $label_class, $this->html );
@@ -492,10 +414,8 @@
492 414 /**
493 415 * Replace [entry_key]
494 416 *
495 417 * @since 3.0
496 - *
497 - * @return void
498 418 */
499 419 private function replace_entry_key() {
500 420 $entry_key = FrmAppHelper::simple_get( 'entry', 'sanitize_title' );
501 421 $this->html = str_replace( '[entry_key]', $entry_key, $this->html );
@@ -504,21 +424,17 @@
504 424 /**
505 425 * Add classes to a field div
506 426 *
507 427 * @since 3.0
508 - *
509 - * @return void
510 428 */
511 429 private function add_field_div_classes() {
512 430 $classes = $this->get_field_div_classes();
513 431
514 - if ( in_array( $this->field_obj->get_field_column( 'type' ), array( 'html', 'summary' ), true ) && ! str_contains( $this->html, '[error_class]' ) ) {
515 - // There is no error_class shortcode for HTML fields
516 - $this->html = str_replace( 'class="frm_form_field', 'class="frm_form_field ' . esc_attr( $classes ), $this->html );
517 - return;
432 + if ( $this->field_obj->get_field_column( 'type' ) == 'html' && strpos( $this->html, '[error_class]' ) === false ) {
433 + // there is no error_class shortcode for HTML fields
434 + $this->html = str_replace( 'class="frm_form_field', 'class="frm_form_field ' . $classes, $this->html );
518 435 }
519 -
520 - $this->html = str_replace( '[error_class]', esc_attr( $classes ), $this->html );
436 + $this->html = str_replace( '[error_class]', $classes, $this->html );
521 437 }
522 438
523 439 /**
524 440 * Get the classes for a field div
@@ -524,9 +440,9 @@
524 440 * Get the classes for a field div
525 441 *
526 442 * @since 3.0
527 443 *
528 - * @return string Classes.
444 + * @return string $classes
529 445 */
530 446 private function get_field_div_classes() {
531 447 // Add error class
532 448 $classes = isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ? ' frm_blank_field' : '';
@@ -532,12 +448,11 @@
532 448 $classes = isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ? ' frm_blank_field' : '';
533 449
534 450 // Add label position class
535 451 $settings = $this->field_obj->display_field_settings();
536 -
537 - if ( ! empty( $settings['label_position'] ) ) {
452 + if ( isset( $settings['label_position'] ) && $settings['label_position'] ) {
538 453 $label_position = $this->field_obj->get_field_column( 'label' );
539 - $classes .= ' frm_' . $label_position . '_container';
454 + $classes .= ' frm_' . $label_position . '_container';
540 455
541 456 // Add class if field has value, to be used for floating label styling.
542 457 if ( 'inside' === $label_position && $this->field_obj->get_field_column( 'value' ) ) {
543 458 $classes .= ' frm_label_float_top';
@@ -545,14 +460,12 @@
545 460 }
546 461
547 462 // Add CSS layout classes
548 463 $extra_classes = $this->field_obj->get_field_column( 'classes' );
549 -
550 - if ( $extra_classes ) {
551 - if ( ! str_contains( $this->html, 'frm_form_field ' ) ) {
464 + if ( ! empty( $extra_classes ) ) {
465 + if ( ! strpos( $this->html, 'frm_form_field ' ) ) {
552 466 $classes .= ' frm_form_field';
553 467 }
554 -
555 468 $classes .= ' ' . $extra_classes;
556 469 }
557 470
558 471 $classes .= $this->field_obj->get_container_class();
@@ -557,12 +470,9 @@
557 470
558 471 $classes .= $this->field_obj->get_container_class();
559 472
560 473 // Get additional classes
561 - $classes = apply_filters( 'frm_field_div_classes', $classes, $this->field_obj->get_field(), array( 'field_id' => $this->field_id ) );
562 -
563 - // Remove unexpected characters from class.
564 - return implode( ' ', array_map( 'FrmFormsHelper::sanitize_layout_class', explode( ' ', $classes ) ) );
474 + return apply_filters( 'frm_field_div_classes', $classes, $this->field_obj->get_field(), array( 'field_id' => $this->field_id ) );
565 475 }
566 476
567 477 /**
568 478 * This filters shortcodes in the field HTML
@@ -567,57 +477,11 @@
567 477 /**
568 478 * This filters shortcodes in the field HTML
569 479 *
570 480 * @since 3.0
571 - *
572 - * @return void
573 481 */
574 482 private function process_wp_shortcodes() {
575 483 if ( apply_filters( 'frm_do_html_shortcodes', true ) ) {
576 484 $this->html = do_shortcode( $this->html );
577 485 }
578 - }
579 -
580 - /**
581 - * Adds multiple input attributes.
582 - *
583 - * @since 6.4.1
584 - *
585 - * @return void
586 - */
587 - private function add_multiple_input_attributes() {
588 - $field_type = $this->field_obj->get_field_column( 'type' );
589 -
590 - // Check if the field type is one of the following.
591 - if ( ! in_array( $field_type, array( 'radio', 'checkbox', 'data', 'product', 'scale' ), true ) ) {
592 - return;
593 - }
594 -
595 - $field = (array) $this->field_obj->get_field();
596 - $attributes = array();
597 -
598 - // Check if the field type is 'data' or 'product'.
599 - if ( in_array( $field_type, array( 'data', 'product' ), true ) ) {
600 - $data_type = FrmField::get_option( $field, 'data_type' );
601 - $is_radio = 'radio' === $data_type;
602 - } else {
603 - $is_radio = 'radio' === $field_type || 'scale' === $field_type;
604 - }
605 -
606 - // Add 'role' attribute to the field.
607 - $attributes['role'] = $is_radio ? 'radiogroup' : 'group';
608 -
609 - // Add 'aria-required' attribute to the field if required.
610 - if ( $is_radio && '1' === $field['required'] ) {
611 - $attributes['aria-required'] = 'true';
612 - }
613 -
614 - // Add 'aria-invalid' attribute to the group if there are errors.
615 - if ( isset( $this->pass_args['errors'][ 'field' . $this->field_id ] ) ) {
616 - $attributes['aria-invalid'] = 'true';
617 - }
618 -
619 - // Concatenate attributes into a string, and replace the role="group" in the HTML with the attributes string.
620 - $html_attributes = FrmAppHelper::array_to_html_params( $attributes );
621 - $this->html = str_replace( ' role="group"', $html_attributes, $this->html );
622 486 }
623 487 }