diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/form.inc | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/includes/form.inc b/includes/form.inc index a57ffa2b2..300b78267 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -145,6 +145,24 @@ function _form_validate($elements, $form_id = NULL) { if ($elements['#required'] && empty($elements['#value']) && $elements['#value'] !== '0') { form_error($elements, t('%name field is required', array('%name' => $elements['#title']))); } + + // Add legal choice check if element has #options. + if (isset($elements['#options']) && isset($elements['#value'])) { + $message = t('Illegal choice in %title.', array('%title' => theme('placeholder', $elements['#title']))); + if (is_array($elements['#value'])) { + $value = $elements['#type'] == 'checkboxes' ? array_keys(array_filter($elements['#value'])) : $elements['#value']; + foreach ($value as $v) { + if (!isset($elements['#options'][$v])) { + form_error($elements, $message); + } + } + } + elseif (!isset($elements['#options'][$elements['#value']])) { + form_error($elements, $message); + } + } + + // User-applied checks. if (isset($elements['#validate'])) { foreach ($elements['#validate'] as $function => $args) { $args = array_merge(array($elements), $args); |