Index: trunk/sites/all/modules/flexifield/flexifield-widget.inc =================================================================== --- trunk/sites/all/modules/flexifield/flexifield-widget.inc (revision 6) +++ trunk/sites/all/modules/flexifield/flexifield-widget.inc (working copy) @@ -40,10 +40,41 @@ // the widgets' #process functions. _flexifield_setup_form_field_info_hack($aElement, $aContentTypeInfo['fields']); + // Prevent empty submited sub form element to have any required elements + if (!empty($aSubmittedElementData)) { + // Construct pseudo item + $sItem = array( + 'value' => $aSubmittedElementData, + 'type' => $sContentType, + ); + $sFieldSettings = $aForm['#field_info'][$aElement['#field_name']]; + if (flexifield_content_is_empty($sItem, $sFieldSettings)) { + _flexifield_fieldset_clear_required($aElement); + } + } + return $aElement; } /** + * Clear required flag of a field and all its children + */ +function _flexifield_fieldset_clear_required(&$elements) { + // Recurse through all children. + foreach (element_children($elements) as $key) { + if (isset($elements[$key]) && $elements[$key]) { + _flexifield_fieldset_clear_required($elements[$key], $form_state); + } + } + if (isset($elements['#required']) && $elements['#required']) { + $elements['#required'] = FALSE; + } + if (isset($elements['#flexifield_storage']['#field_info']['required']) && $elements['#flexifield_storage']['#field_info']['required']) { + $elements['#flexifield_storage']['#field_info']['required'] = FALSE; + } +} + +/** * Setup the result of content_multiple_values_form() for both the * flexifield field and child fields to have some extra stuff happen * during form building (#process). @@ -62,6 +93,8 @@ $aElement['#flexifield_value_original'] = isset($aElement['#value']) ? $aElement['#value'] : null; if (!isset($aElement['#type'])) { $aElement['#type'] = 'markup'; + // Prevent vlaidation errors + $aElement['#validated'] = TRUE; } } }