diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 903a24278f98465dc7499565cc001da4c670846b..10980a1e9377f6e7679ac84d3630cc2d76584daa 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,8 @@ Drupal 7.17, xxxx-xx-xx (development version) ----------------------- +- Fixed a bug which prevented required form elements without a title from being + given an "error" class when the form fails validation. - Prevented duplicate HTML IDs from appearing when two forms are displayed on the same page and one of them is submitted with invalid data (minor markup change). diff --git a/includes/form.inc b/includes/form.inc index fa49839e4570397e7c576b734fc4778c6d6563f1..aa90eca691ad4a23f76d574641311cb448b5aa5b 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -4199,7 +4199,7 @@ function _form_set_class(&$element, $class = array()) { if (!empty($element['#required'])) { $element['#attributes']['class'][] = 'required'; } - if (isset($element['#parents']) && form_get_error($element)) { + if (isset($element['#parents']) && form_get_error($element) !== NULL) { $element['#attributes']['class'][] = 'error'; } } diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test index 620621a69d349ef61e670e925dbce141288464cf..7eac198ad2c942e71929b9a4d044b81984cc525d 100644 --- a/modules/simpletest/tests/form.test +++ b/modules/simpletest/tests/form.test @@ -189,6 +189,38 @@ class FormsTestCase extends DrupalWebTestCase { $this->assertRaw("The form_test_validate_required_form form was submitted successfully.", 'Validation form submitted successfully.'); } + /** + * Tests validation for required textfield element without title. + * + * Submits a test form containing a textfield form elements without title. + * The form is submitted twice, first without value for the required field + * and then with value. Each submission is checked for relevant error + * messages. + * + * @see form_test_validate_required_form_no_title() + */ + function testRequiredTextfieldNoTitle() { + $form = $form_state = array(); + $form = form_test_validate_required_form_no_title($form, $form_state); + + // Attempt to submit the form with no required field set. + $edit = array(); + $this->drupalPost('form-test/validate-required-no-title', $edit, 'Submit'); + $this->assertNoRaw("The form_test_validate_required_form_no_title form was submitted successfully.", 'Validation form submitted successfully.'); + + // Check the page for the error class on the textfield. + $this->assertFieldByXPath('//input[contains(@class, "error")]', FALSE, 'Error input form element class found.'); + + // Submit again with required fields set and verify that there are no + // error messages. + $edit = array( + 'textfield' => $this->randomString(), + ); + $this->drupalPost(NULL, $edit, 'Submit'); + $this->assertNoFieldByXpath('//input[contains(@class, "error")]', FALSE, 'No error input form element class found.'); + $this->assertRaw("The form_test_validate_required_form_no_title form was submitted successfully.", 'Validation form submitted successfully.'); + } + /** * Test default value handling for checkboxes. * diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module index 6af18c6aff4c403961994c6ce79071b85c4aa88a..b4d2f54990048b5612611de77ef015a51880d856 100644 --- a/modules/simpletest/tests/form_test.module +++ b/modules/simpletest/tests/form_test.module @@ -30,6 +30,13 @@ function form_test_menu() { 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); + $items['form-test/validate-required-no-title'] = array( + 'title' => 'Form #required validation without #title', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('form_test_validate_required_form_no_title'), + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); $items['form-test/limit-validation-errors'] = array( 'title' => 'Form validation with some error suppression', 'page callback' => 'drupal_get_form', @@ -412,6 +419,26 @@ function form_test_validate_required_form_submit($form, &$form_state) { drupal_set_message('The form_test_validate_required_form form was submitted successfully.'); } +/** + * Form constructor to test the #required property without #title. + */ +function form_test_validate_required_form_no_title($form, &$form_state) { + $form['textfield'] = array( + '#type' => 'textfield', + '#required' => TRUE, + ); + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit'); + return $form; +} + +/** + * Form submission handler for form_test_validate_required_form_no_title(). + */ +function form_test_validate_required_form_no_title_submit($form, &$form_state) { + drupal_set_message('The form_test_validate_required_form_no_title form was submitted successfully.'); +} + /** * Builds a simple form with a button triggering partial validation. */