diff --git a/ife.module b/ife.module index 5e738b6..a1d0f98 100644 --- a/ife.module +++ b/ife.module @@ -258,43 +258,76 @@ function ife_errors($op = 'get', $id = NULL, $message = NULL) { } } -function ife_element_errors_set($element, $display) { +function ife_element_errors_set($form, $display) { + if (!isset($_SESSION['messages'])) { return; } - // Recurse through all children. - foreach (element_children($element) as $key) { - if (isset($element[$key]) && $element[$key]) { - ife_element_errors_set($element[$key], $display); - } - } - - // Check for errors and settings + // Receive form errors $errors = form_get_errors(); - $element_id = implode('][', $element['#parents']); - if (!empty($errors[$element_id])) { - $error_message = $errors[$element_id]; - // Get error id - $error_id = array_search($error_message, $_SESSION['messages']['error']); + // Check for complexer fields, used later for proper rendering + $field_types_complex = array('radios' => FALSE,); + drupal_alter('ife_complex_types' , $field_types_complex); - if ($error_id !== FALSE) { - if (isset($display) && $display != 0) { - unset($_SESSION['messages']['error'][$error_id]); - $_SESSION['messages']['error'] = array_values($_SESSION['messages']['error']); - } - if (count($_SESSION['messages']['error']) <= 0) { - unset($_SESSION['messages']['error']); - } + // Go through all children of form + foreach (element_children($form) as $field_name) { + + // Go through all the errors + foreach ($errors as $error_anchor => $error_message) { + + // Compare if error for given field has been set. + if (strstr($error_anchor, $field_name . ']', true) === '') { + + // Get error id + $error_id = array_search($error_message, $_SESSION['messages']['error']); - // Set error message in session, so it can be used in our theming. - ife_errors('set', $element['#id'], $error_message); + if ($error_id !== FALSE) { + if (isset($display) && $display != 0) { + unset($_SESSION['messages']['error'][$error_id]); + $_SESSION['messages']['error'] = array_values($_SESSION['messages']['error']); + } + + if (count($_SESSION['messages']['error']) <= 0) { + unset($_SESSION['messages']['error']); + } + + // Extract the latest element of field. + $element = $form[$field_name]; + unset($element_id); + while ($element_child = element_children($element)) { + $element_child = array_pop($element_child); + $element = $element[$element_child]; + + // Check if a complexer type of field is used here + if (isset($element['#type']) && + array_key_exists($element['#type'], $field_types_complex)) { + + // Execute function to gain the right #id css selector + if (function_exists($field_types_complex[$element['#type']])) { + $element_id = call_user_func($field_types_complex[$element['#type']], $element); + } + + break; + } + } + + // Fill element_id with standard + if (!isset($element_id)) { + $element_id = $element['#id']; + } + + // Set error message in session, so it can be used in our theming. + ife_errors('set', $element_id , $error_message); + } + } } } } + /** * Implements hook_commerce_checkout_pane_info_alter(). */