diff options
-rw-r--r-- | CHANGELOG.txt | 2 | ||||
-rw-r--r-- | includes/form.inc | 37 | ||||
-rw-r--r-- | modules/simpletest/tests/form.test | 2 | ||||
-rw-r--r-- | modules/simpletest/tests/form_test.module | 6 |
4 files changed, 27 insertions, 20 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 2fd31b396..a344cc588 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -33,6 +33,8 @@ Drupal 7.15, xxxx-xx-xx (development version) translated into a particular language. - Reorganized the testing framework to split setUp() into specific sub-methods and fix several regressions in the process. +- Fixed regression: Optional radio buttons with an empty, non-NULL default + value led to an illegal choice error when none were selected. Drupal 7.14 2012-05-02 ---------------------- diff --git a/includes/form.inc b/includes/form.inc index bea4914b0..12d90053d 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -2351,30 +2351,27 @@ function form_type_tableselect_value($element, $input = FALSE) { */ function form_type_radios_value(&$element, $input = FALSE) { if ($input !== FALSE) { - // There may not be a submitted value for multiple radio buttons, if none of - // the options was checked by default. If there is no submitted input value - // for this element (NULL), _form_builder_handle_input_element() - // automatically attempts to use the #default_value (if set) or an empty - // string (''). However, an empty string would fail validation in - // _form_validate(), in case it is not contained in the list of allowed - // values in #options. - if (!isset($input)) { - // Signify a garbage value to disable the #default_value handling and take - // over NULL as #value. - $element['#has_garbage_value'] = TRUE; - // There was a user submission so validation is a must. If this element is - // #required, then an appropriate error message will be output. While an - // optional #type 'radios' does not necessarily make sense from a user - // interaction perspective, there may be use-cases for that and it is not - // the job of Form API to artificially limit possibilities. + // When there's user input (including NULL), return it as the value. + // However, if NULL is submitted, _form_builder_handle_input_element() will + // apply the default value, and we want that validated against #options + // unless it's empty. (An empty #default_value, such as NULL or FALSE, can + // be used to indicate that no radio button is selected by default.) + if (!isset($input) && !empty($element['#default_value'])) { $element['#needs_validation'] = TRUE; } - // The value stays the same, but the flags above will ensure it is - // processed properly. return $input; } - elseif (isset($element['#default_value'])) { - return $element['#default_value']; + else { + // For default value handling, simply return #default_value. Additionally, + // for a NULL default value, set #has_garbage_value to prevent + // _form_builder_handle_input_element() converting the NULL to an empty + // string, so that code can distinguish between nothing selected and the + // selection of a radio button whose value is an empty string. + $value = isset($element['#default_value']) ? $element['#default_value'] : NULL; + if (!isset($value)) { + $element['#has_garbage_value'] = TRUE; + } + return $value; } } diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test index 2f5a9cd14..5aa7e4aa3 100644 --- a/modules/simpletest/tests/form.test +++ b/modules/simpletest/tests/form.test @@ -173,6 +173,8 @@ class FormsTestCase extends DrupalWebTestCase { $this->assertNoFieldChecked('edit-radios-bar'); $this->assertNoFieldChecked('edit-radios-optional-foo'); $this->assertNoFieldChecked('edit-radios-optional-bar'); + $this->assertNoFieldChecked('edit-radios-optional-default-value-false-foo'); + $this->assertNoFieldChecked('edit-radios-optional-default-value-false-bar'); // Submit again with required fields set and verify that there are no // error messages. diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module index 43a6cbecb..a6b21a41a 100644 --- a/modules/simpletest/tests/form_test.module +++ b/modules/simpletest/tests/form_test.module @@ -372,6 +372,12 @@ function form_test_validate_required_form($form, &$form_state) { '#title' => 'Radios (optional)', '#options' => $options, ); + $form['radios_optional_default_value_false'] = array( + '#type' => 'radios', + '#title' => 'Radios (optional, with a default value of FALSE)', + '#options' => $options, + '#default_value' => FALSE, + ); $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit'); return $form; |