summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
Diffstat (limited to 'includes')
-rw-r--r--includes/form.inc18
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);