summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.txt2
-rw-r--r--includes/form.inc37
-rw-r--r--modules/simpletest/tests/form.test2
-rw-r--r--modules/simpletest/tests/form_test.module6
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;