diff --git a/conditional_fields.module b/conditional_fields.module index 56b65b5..66bd455 100644 --- a/conditional_fields.module +++ b/conditional_fields.module @@ -672,7 +672,40 @@ function conditional_fields_dependent_validate($element, &$form_state, $form) { $dependent = $element[$element['#language']]; // Check if this field's dependencies were triggered. - if (conditional_fields_evaluate_dependencies($dependent, $form, $form_state)) { + $triggered = conditional_fields_evaluate_dependencies($dependent, $form, $form_state); + $parents = $dependent['#parents']; + $error_key = array_shift($parents); + $error_key .= '[' . implode('][', $parents) . ']'; + + if ($evaluated_dependencies = conditional_fields_evaluate_dependencies($dependent, $form, $form_state, FALSE)) { + foreach ($evaluated_dependencies[$dependent['#field_name']] as $operator) { + foreach ($operator as $state => $result) { + if (($result && $state == 'required' && $triggered) || (!$result && $state == '!required' && !$triggered)) { + $input_state = drupal_array_get_nested_value($form_state['values'], $dependent['#parents']); + + if (isset($dependent['#field_name'])) { + $field = field_info_field($dependent['#field_name']); + $input_state = _field_filter_items($field, $input_state); + } + + if (empty($input_state)) { + $title = ''; + if (isset($dependent['#title'])) { + $title = $dependent['#title']; + } + else { + if (isset($dependent[0]['#title'])) { + $title = $dependent[0]['#title']; + } + } + form_set_error($error_key, t('The !title field is required', array('!title' => $title))); + } + } + } + } + } + + if ($triggered) { return; } @@ -683,7 +716,7 @@ function conditional_fields_dependent_validate($element, &$form_state, $form) { // Optional behavior: reset the field to its default values. // Default values are always valid, so it's safe to skip validation. - if (!empty($element['#conditional_fields_reset_if_untriggered'])) { + if (!empty($element['#conditional_fields_reset_if_untriggered']) && !$triggered) { $form_state_addition['reset'] = TRUE; } @@ -751,10 +784,7 @@ function conditional_fields_form_validate($form, &$form_state) { continue; } - if (empty($field['reset'])) { - unset($field_values_location[$dependent['#field_name']]); - } - else { + if (!empty($field['reset'])) { $dependent_info = field_form_get_state($dependent['#field_parents'], $dependent['#field_name'], $dependent['#language'], $form_state); $field_values_location[$dependent['#field_name']][$dependent['#language']] = field_get_default_value($dependent_info['instance']['entity_type'], NULL, $dependent_info['field'], $dependent_info['instance'], $dependent['#language']); } @@ -994,7 +1024,7 @@ function conditional_fields_evaluate_grouping($groups) { * @param $dependent * The field form element in the current language. */ -function conditional_fields_evaluate_dependencies($dependent, $form, $form_state) { +function conditional_fields_evaluate_dependencies($dependent, $form, $form_state, $grouping = TRUE) { $dependencies = $form['#conditional_fields'][$dependent['#field_name']]['dependees']; $evaluated_dependees = array(); @@ -1016,10 +1046,18 @@ function conditional_fields_evaluate_dependencies($dependent, $form, $form_state $values = $values[$dependee_parent[$dependee]['#language']]; } - $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']); + if ($grouping) { + $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']); + } + else { + $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][$dependency['options']['state']] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']); + } } - return conditional_fields_evaluate_grouping($evaluated_dependees[$dependent['#field_name']]); + if ($grouping) { + return conditional_fields_evaluate_grouping($evaluated_dependees[$dependent['#field_name']]); + } + return $evaluated_dependees; } /**