From 1999c881ec992c69a73448768dd8d689807ec642 Mon Sep 17 00:00:00 2001 From: Angie Byron <webchick@24967.no-reply.drupal.org> Date: Mon, 2 Nov 2009 20:31:49 +0000 Subject: [PATCH] #569542 by bjaspan and Mike Wacker: Auto-select single option if only one is available. --- modules/field/modules/options/options.module | 14 +++++++- modules/field/modules/options/options.test | 37 ++++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/modules/field/modules/options/options.module b/modules/field/modules/options/options.module index 709e0bd8d578..22083fd3c093 100644 --- a/modules/field/modules/options/options.module +++ b/modules/field/modules/options/options.module @@ -129,6 +129,7 @@ function options_buttons_elements_process($element, &$form_state, $form) { $element['#value'] = options_data2form($element, $element['#default_value'], $field); } $options = options_options($field, $instance); + $required = isset($element['#required']) ? $element['#required'] : $instance['required']; $multiple = isset($element['#multiple']) ? $element['#multiple'] : $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; // Incoming #value is an array (checkboxes) or integer (radios). @@ -150,12 +151,23 @@ function options_buttons_elements_process($element, &$form_state, $form) { break; } } + + // If required and there is one option, make it the default. + if ($required && count($options) == 1) { + $keys = array_keys($options); + if ($multiple) { + $value = $keys; + } + else { + $value = $keys[0]; + } + } $element[$field_key] = array( '#type' => $multiple ? 'checkboxes' : 'radios', '#title' => $element['#title'], '#description' => $element['#description'], - '#required' => isset($element['#required']) ? $element['#required'] : $instance['required'], + '#required' => $required, '#multiple' => $multiple, '#options' => $options, '#default_value' => $value, diff --git a/modules/field/modules/options/options.test b/modules/field/modules/options/options.test index 1d93bfe46458..101b3befe43c 100644 --- a/modules/field/modules/options/options.test +++ b/modules/field/modules/options/options.test @@ -13,7 +13,6 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { function setUp() { parent::setUp('field_test'); - $this->list_values = array(1 => 'One', 2 => 'Two', 3 => 'Three'); $this->card_1 = array( 'field_name' => 'card_1', 'type' => 'list', @@ -59,7 +58,7 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { } /** - * Assert that a checkbox identified by $id is not checked. + * Assert that a checkbox identified by $id is found but is not checked. */ function assertIsNotChecked($html, $id) { $input = $this->getTagById($html, $id); @@ -91,7 +90,7 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { } /** - * Assert that an <option> for value $value is not selected. + * Assert that an <option> for value $value is found but is not selected. */ function assertIsNotSelected($html, $value) { $input = $this->getOptionByValue($html, $value); @@ -130,6 +129,15 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { $this->assertIsNotChecked($render, 'edit-card-1-zxx-value-1'); $this->assertIsChecked($render, 'edit-card-1-zxx-value-2'); $this->assertIsNotChecked($render, 'edit-card-1-zxx-value-3'); + + // Required radios with one option is auto-selected. + $instance['required'] = TRUE; + field_update_instance($instance); + $this->card_1['settings']['allowed_values'] = '99|Only allowed value for radios'; + field_update_field($this->card_1); + $form = drupal_get_form('field_test_entity_form', $entity); + $render = drupal_render($form); + $this->assertIsChecked($render, 'edit-card-1-zxx-value-99'); } function testCheckBoxes() { @@ -160,6 +168,16 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { $this->assertIsNotChecked($render, 'edit-card-2-zxx-value-1'); $this->assertIsChecked($render, 'edit-card-2-zxx-value-2'); $this->assertIsChecked($render, 'edit-card-2-zxx-value-3'); + + // Required checkbox with one option is auto-selected. + $instance['required'] = TRUE; + field_update_instance($instance); + $this->card_2['settings']['allowed_values'] = '99|Only allowed value for checkboxes'; + field_update_field($this->card_2); + unset($entity->card_2); + $form = drupal_get_form('field_test_entity_form', $entity); + $render = drupal_render($form); + $this->assertIsChecked($render, 'edit-card-2-zxx-value-99'); } function testSelectList() { @@ -190,6 +208,19 @@ class OptionsWidgetsTestCase extends DrupalWebTestCase { $this->assertIsSelected($render, 1); $this->assertIsSelected($render, 2); $this->assertIsNotSelected($render, 3); + + // A non-required select list has an empty key. + $form = drupal_get_form('field_test_entity_form', $entity); + $this->assertTrue(isset($form['card_2'][FIELD_LANGUAGE_NONE]['value']['#options']['']), 'A non-required select list has an empty key.'); + + // A required select list does not have an empty key. + $instance['required'] = TRUE; + field_update_instance($instance); + $form = drupal_get_form('field_test_entity_form', $entity); + $this->assertTrue(!isset($form['card_2'][FIELD_LANGUAGE_NONE]['value']['#options']['']), 'A required select list does not have an empty key.'); + + // We don't have to test that a required select list with one + // option is auto-selected because the browser does it for us. } /** -- GitLab