From 5f0e0f364964b46bbaea3390acfe3628d32b0c07 Mon Sep 17 00:00:00 2001 From: Steven Wittens Date: Thu, 13 Oct 2005 10:02:31 +0000 Subject: - #33433: More form API fixes, and error handling improvements by Chx. --- includes/form.inc | 100 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 45 deletions(-) (limited to 'includes/form.inc') diff --git a/includes/form.inc b/includes/form.inc index 2074d6e51..a70e00039 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -134,7 +134,7 @@ function _form_validate(&$elements) { /* Validate the current input */ if (!$elements['#validated'] && $elements['#input']) { - if ($elements['#required'] && !$elements['#value']) { + if ($elements['#required'] && !isset($elements['#value'])) { form_error($elements, t('%name field is required', array('%name' => $elements['#title']))); } if ($elements['#valid']) { @@ -157,16 +157,53 @@ function _form_validate(&$elements) { } } +/** + * File an error against a form element. If the name of the element is + * edit[foo][bar] then you may pass either foo or foo][bar as $name + * foo will set an error for all its children. + */ +function form_set_error($name = NULL, $message = NULL) { + static $form = array(); + if (isset($name) && !isset($form[$name])) { + $form[$name] = $message; + drupal_set_message($message, 'error'); + } + return $form; +} + +/** + * Return an associative array of all errors. + */ +function form_get_errors() { + $form = form_set_error(); + if (!empty($form)) { + return $form; + } +} + +/** + * Return the error message filed against the form with the specified name. + */ +function form_get_error($element) { + $form = form_set_error(); + $key = $element['#parents'][0]; + if (isset($form[$key])) { + return $form[$key]; + } + $key = implode('][', $element['#parents']); + if (isset($form[$key])) { + return $form[$key]; + } +} + /** * Flag an element as having an error. */ function form_error(&$element, $message) { $element['#error'] = TRUE; - $GLOBALS['form'][$element['#name']] = $message; - drupal_set_message($message, 'error'); + form_set_error(implode('][', $element['#parents']), $message); } - /** * Adds some required properties to each form element, which are used internally in the form api. * This function also automatically assigns the value property from the $edit array, provided the @@ -348,7 +385,7 @@ function theme_select($element) { $select .= ''; } } - return theme('form_element', $element['#title'], '', $element['#description'], $element['#name'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], '', $element['#description'], $element['#name'], $element['#required'], form_get_error($element)); } /** @@ -386,7 +423,7 @@ function theme_fieldset($element) { */ function theme_radio($element) { $output = ''; } - return theme('form_element', NULL, $output, $element['#description'], $element['#name'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', NULL, $output, $element['#description'], $element['#name'], $element['#required'], form_get_error($element)); } /** @@ -408,7 +445,7 @@ function theme_radio($element) { */ function theme_radios($element) { if ($element['#title'] || $element['#description']) { - return theme('form_element', $element['#title'], $element['#children'], $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], $element['#children'], $element['#description'], $element['#id'], $element['#required'], form_get_error($element)); } else { return $element['#children']; @@ -426,7 +463,7 @@ function theme_radios($element) { */ function theme_date($element) { $output = '
' . $element['#children'] . '
'; - return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element)); } /** @@ -512,7 +549,7 @@ function theme_item($element) { function theme_checkbox($element) { $checkbox = ''; } - return theme('form_element', NULL, $checkbox, $element['#description'], $element['#name'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', NULL, $checkbox, $element['#description'], $element['#name'], $element['#required'], form_get_error($element)); } /** @@ -536,7 +573,7 @@ function theme_checkbox($element) { */ function theme_checkboxes($element) { if ($element['#title'] || $element['#description']) { - return theme('form_element', $element['#title'], $element['#children'], $element['#description'], 'edit-'. $element['#name'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], $element['#children'], $element['#description'], 'edit-'. $element['#name'], $element['#required'], form_get_error($element)); } else { return $element['#children']; @@ -597,8 +634,8 @@ function theme_textfield($element) { $extra = ''; } - $output = ''; - return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])). $extra; + $output = ''; + return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element)). $extra; } /** @@ -629,7 +666,7 @@ function theme_form($element) { function theme_textarea($element) { $cols = $element['#cols'] ? ' cols="'. $element['#cols'] .'"' : ''; - return theme('form_element', $element['#title'], ''. check_plain($element['#value']) .'', $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], ''. check_plain($element['#value']) .'', $element['#description'], $element['#id'], $element['#required'], form_get_error($element)); } /** @@ -662,9 +699,9 @@ function theme_markup($element) { function theme_password($element) { $size = $element['#size'] ? ' size="'. $element['#size'] .'" ' : ''; - $output = ''; + $output = ''; - return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])); + return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element)); } /** @@ -686,23 +723,6 @@ function theme_weight($element) { return form_render($element); } -/** - * File an error against the form element with the specified name. - */ -function form_set_error($name, $message) { - $GLOBALS['form'][$name] = $message; - drupal_set_message($message, 'error'); -} - -/** - * Return an associative array of all errors. - */ -function form_get_errors() { - if (array_key_exists('form', $GLOBALS)) { - return $GLOBALS['form']; - } -} - /** * Format a file upload field. * @@ -723,18 +743,8 @@ function form_get_errors() { * provided by file.inc. */ function theme_file($element) { - return theme('form_element', $element['#title'], '\n", $element['#description'], $element['#id'], $element['#required'], _form_get_error($element['#name'])); -} - -/** - * Return the error message filed against the form with the specified name. - */ -function _form_get_error($name) { - if (array_key_exists('form', $GLOBALS)) { - return $GLOBALS['form'][$name]; - } + return theme('form_element', $element['#title'], '\n", $element['#description'], $element['#id'], $element['#required'], form_get_error($element)); } - function _form_get_class($name, $required, $error) { return $name. ($required ? ' required' : '') . ($error ? ' error' : ''); } -- cgit v1.2.3