- Patch #1174938 by ericduran, aspilicious, voxpelli: natively support the HTML5 #required FAPI property. Woot!

8.0.x
Dries 2011-12-14 07:56:07 -05:00
parent 3b3798f251
commit 8945bee7fd
3 changed files with 54 additions and 0 deletions

View File

@ -1942,6 +1942,15 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
}
}
// The 'required' attribute should only be printed when #required is true.
// The presence of a boolean attribute on an element represents the true
// value, and the absence of the attribute represents the false value.
// http://www.w3.org/TR/html5/common-microsyntaxes.html#boolean-attribute.
if (!empty($element['#required'])) {
$element['#attributes']['required'] = 'required';
$element['#attributes']['aria-required'] = 'true';
}
// With JavaScript or other easy hacking, input can be submitted even for
// elements with #access=FALSE or #disabled=TRUE. For security, these must
// not be processed. Forms that set #disabled=TRUE on an element do not

View File

@ -366,6 +366,29 @@ class FormsTestCase extends DrupalWebTestCase {
$this->drupalPost(NULL, array('checkboxes[one]' => TRUE, 'checkboxes[two]' => TRUE), t('Submit'));
$this->assertText('An illegal choice has been detected.', t('Input forgery was detected.'));
}
/**
* Tests required attribute.
*/
function testRequiredAttribute() {
$this->drupalGet('form-test/required-attribute');
$expected = 'required';
// Test to make sure the elements have the proper required attribute.
foreach (array('textfield', 'password') as $type) {
$element = $this->xpath('//input[@id=:id and @required=:expected]', array(
':id' => 'edit-' . $type,
':expected' => $expected,
));
$this->assertTrue(!empty($element), t('The @type has the proper required attribute.', array('@type' => $type)));
}
// Test to make sure textarea has the proper required attribute.
$element = $this->xpath('//textarea[@id=:id and @required=:expected]', array(
':id' => 'edit-textarea',
':expected' => $expected,
));
$this->assertTrue(!empty($element), t('Placeholder text placed in textarea.'));
}
}
/**

View File

@ -210,6 +210,13 @@ function form_test_menu() {
'type' => MENU_CALLBACK,
);
$items['form-test/required-attribute'] = array(
'title' => 'Required',
'page callback' => 'drupal_get_form',
'page arguments' => array('form_test_required_attribute'),
'access callback' => TRUE,
);
return $items;
}
@ -1683,3 +1690,18 @@ function form_test_checkboxes_zero($form, &$form_state, $json = TRUE) {
function _form_test_checkboxes_zero_no_redirect($form, &$form_state) {
$form_state['redirect'] = FALSE;
}
/**
* Builds a form to test the placeholder attribute.
*/
function form_test_required_attribute($form, &$form_state) {
foreach (array('textfield', 'textarea', 'password') as $type) {
$form[$type] = array(
'#type' => $type,
'#required' => TRUE,
'#title' => $type,
);
}
return $form;
}