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