| @@ -55,9 +55,9 @@ | ||
| 55 | 55 | protected function register_sub_fields( array $sub_fields ) { |
| 56 | 56 | $defaults = $this->get_default_sub_field(); |
| 57 | 57 | |
| 58 | 58 | foreach ( $sub_fields as $name => $sub_field ) { |
| 59 | - if ( empty( $sub_field ) ) { | |
| 59 | + if ( ! $sub_field ) { | |
| 60 | 60 | continue; |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | if ( is_array( $sub_field ) ) { |
| @@ -224,9 +224,9 @@ | ||
| 224 | 224 | * |
| 225 | 225 | * @return array |
| 226 | 226 | */ |
| 227 | 227 | protected function field_settings_for_type() { |
| 228 | - $settings = array( | |
| 228 | + return array( | |
| 229 | 229 | 'description' => false, |
| 230 | 230 | 'default' => false, |
| 231 | 231 | // Don't use the regular placeholder option. |
| 232 | 232 | 'clear_on_focus' => false, |
| @@ -232,10 +232,8 @@ | ||
| 232 | 232 | 'clear_on_focus' => false, |
| 233 | 233 | 'logic' => true, |
| 234 | 234 | 'visibility' => true, |
| 235 | 235 | ); |
| 236 | - | |
| 237 | - return $settings; | |
| 238 | 236 | } |
| 239 | 237 | |
| 240 | 238 | /** |
| 241 | 239 | * Shows field on the form builder. |
| @@ -286,11 +284,10 @@ | ||
| 286 | 284 | $args['shortcode_atts'] = $shortcode_atts; |
| 287 | 285 | |
| 288 | 286 | ob_start(); |
| 289 | 287 | $this->load_field_output( $args ); |
| 290 | - $input_html = ob_get_clean(); | |
| 291 | 288 | |
| 292 | - return $input_html; | |
| 289 | + return ob_get_clean(); | |
| 293 | 290 | } |
| 294 | 291 | |
| 295 | 292 | /** |
| 296 | 293 | * Loads field output. |
| @@ -406,16 +403,19 @@ | ||
| 406 | 403 | |
| 407 | 404 | if ( ! empty( $sub_field['name'] ) ) { |
| 408 | 405 | $field['subfield_name'] = $sub_field['name']; |
| 409 | 406 | } |
| 407 | + | |
| 410 | 408 | do_action( 'frm_field_input_html', $field ); |
| 411 | 409 | |
| 412 | 410 | // Print custom attributes. |
| 413 | - if ( ! empty( $sub_field['atts'] ) && is_array( $sub_field['atts'] ) ) { | |
| 414 | - foreach ( $sub_field['atts'] as $att_name => $att_value ) { | |
| 415 | - echo esc_attr( trim( $att_name ) ) . '="' . esc_attr( trim( $att_value ) ) . '" '; | |
| 416 | - } | |
| 411 | + if ( empty( $sub_field['atts'] ) || ! is_array( $sub_field['atts'] ) ) { | |
| 412 | + return; | |
| 417 | 413 | } |
| 414 | + | |
| 415 | + foreach ( $sub_field['atts'] as $att_name => $att_value ) { | |
| 416 | + echo esc_attr( trim( $att_name ) ) . '="' . esc_attr( trim( $att_value ) ) . '" '; | |
| 417 | + } | |
| 418 | 418 | } |
| 419 | 419 | |
| 420 | 420 | /** |
| 421 | 421 | * Validate field. |
| @@ -434,22 +434,19 @@ | ||
| 434 | 434 | if ( class_exists( 'FrmProEntryMeta' ) && FrmProEntryMeta::skip_required_validation( $this->field ) ) { |
| 435 | 435 | return $errors; |
| 436 | 436 | } |
| 437 | 437 | |
| 438 | - if ( class_exists( 'FrmProFieldsHelper' ) && ! FrmProFieldsHelper::is_field_visible_to_user( $this->field ) ) { | |
| 439 | - return $errors; | |
| 440 | - } | |
| 441 | - | |
| 442 | - $blank_msg = FrmFieldsHelper::get_error_msg( $this->field, 'blank' ); | |
| 443 | - | |
| 438 | + $blank_msg = FrmFieldsHelper::get_error_msg( $this->field, 'blank' ); | |
| 444 | 439 | $sub_fields = $this->get_processed_sub_fields(); |
| 445 | 440 | |
| 446 | 441 | // Validate not empty. |
| 447 | 442 | foreach ( $sub_fields as $name => $sub_field ) { |
| 448 | - if ( empty( $sub_field['optional'] ) && empty( $args['value'][ $name ] ) ) { | |
| 449 | - $errors[ 'field' . $args['id'] . '-' . $name ] = ''; | |
| 450 | - $errors[ 'field' . $args['id'] ] = $blank_msg; | |
| 443 | + if ( ! empty( $sub_field['optional'] ) || ! empty( $args['value'][ $name ] ) ) { | |
| 444 | + continue; | |
| 451 | 445 | } |
| 446 | + | |
| 447 | + $errors[ 'field' . $args['id'] . '-' . $name ] = ''; | |
| 448 | + $errors[ 'field' . $args['id'] ] = $blank_msg; | |
| 452 | 449 | } |
| 453 | 450 | |
| 454 | 451 | return $errors; |
| 455 | 452 | } |
| @@ -460,15 +457,15 @@ | ||
| 460 | 457 | * @return array |
| 461 | 458 | */ |
| 462 | 459 | public function get_export_headings() { |
| 463 | 460 | $headings = array(); |
| 464 | - $field_id = $this->field->id ?? $this->field['id']; | |
| 465 | - $field_name = $this->field->name ?? $this->field['name']; | |
| 466 | - $field_key = $this->field->field_key ?? $this->field['field_key']; | |
| 461 | + $field_id = is_object( $this->field ) ? $this->field->id : $this->field['id']; | |
| 462 | + $field_name = is_object( $this->field ) ? $this->field->name : $this->field['name']; | |
| 467 | 463 | $sub_fields = $this->get_processed_sub_fields(); |
| 468 | 464 | |
| 465 | + // Include sub-field headings. | |
| 469 | 466 | foreach ( $sub_fields as $name => $sub_field ) { |
| 470 | - $headings[ $field_id . '_' . $name ] = $field_name . ' (' . $field_key . ') - ' . $sub_field['label']; | |
| 467 | + $headings[ $field_id . '_' . $name ] = $field_name . ' - ' . $sub_field['label']; | |
| 471 | 468 | } |
| 472 | 469 | |
| 473 | 470 | return $headings; |
| 474 | 471 | } |
| @@ -506,9 +503,9 @@ | ||
| 506 | 503 | * Gets inputs container attributes. |
| 507 | 504 | * |
| 508 | 505 | * @return array |
| 509 | 506 | */ |
| 510 | - protected function get_inputs_container_attrs() { | |
| 507 | + public function get_inputs_container_attrs() { | |
| 511 | 508 | return array( |
| 512 | 509 | 'class' => 'frm_combo_inputs_container', |
| 513 | 510 | 'id' => 'frm_combo_inputs_container_' . $this->field_id, |
| 514 | 511 | ); |