diff --git a/core/modules/system/src/Tests/Form/FormTest.php b/core/modules/system/src/Tests/Form/FormTest.php index 098751a..8bafe7e 100644 --- a/core/modules/system/src/Tests/Form/FormTest.php +++ b/core/modules/system/src/Tests/Form/FormTest.php @@ -299,8 +299,7 @@ function testCheckboxProcessing() { * Tests validation of #type 'select' elements. */ function testSelect() { - $form = $form_state = array(); - $form = form_test_select($form, $form_state); + $form = \Drupal::formBuilder()->getForm('Drupal\form_test\Form\FormTestSelectForm'); $error = '!name field is required.'; $this->drupalGet('form-test/select'); diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module index 340c1f9..88d9245 100644 --- a/core/modules/system/tests/modules/form_test/form_test.module +++ b/core/modules/system/tests/modules/form_test/form_test.module @@ -39,18 +39,6 @@ function _form_test_submit_values_json($form, &$form_state) { } /** - * Form builder for testing hook_form_alter() and hook_form_FORM_ID_alter(). - * - * @deprecated Use \Drupal\form_test\alterForm() - */ -function form_test_alter_form($form, &$form_state) { - // Elements can be added as needed for future testing needs, but for now, - // we're only testing alter hooks that do not require any elements added by - // this function. - return $form; -} - -/** * Implements hook_form_FORM_ID_alter() on behalf of block.module. */ function block_form_form_test_alter_form_alter(&$form, &$form_state) { @@ -81,111 +69,6 @@ function system_form_form_test_alter_form_alter(&$form, &$form_state) { } /** - * Form builder for testing drupal_validate_form(). - * - * Serves for testing form processing and alterations by form validation - * handlers, especially for the case of a validation error: - * - form_set_value() should be able to alter submitted values in - * $form_state['values'] without affecting the form element. - * - #element_validate handlers should be able to alter the $element in the form - * structure and the alterations should be contained in the rebuilt form. - * - #validate handlers should be able to alter the $form and the alterations - * should be contained in the rebuilt form. - * - * @deprecated Use \Drupal\form_test\validateForm() - */ -function form_test_validate_form($form, &$form_state) { - $object = new Callbacks(); - - $form['name'] = array( - '#type' => 'textfield', - '#title' => 'Name', - '#default_value' => '', - '#element_validate' => array(array($object, 'validateName')), - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => 'Save', - ); - - // To simplify this test, enable form caching and use form storage to - // remember our alteration. - $form_state['cache'] = TRUE; - - return $form; -} - -/** - * Form validation handler for form_test_validate_form(). - */ -function form_test_validate_form_validate(&$form, &$form_state) { - if ($form_state['values']['name'] == 'validate') { - // Alter the form element. - $form['name']['#value'] = '#value changed by #validate'; - // Alter the submitted value in $form_state. - form_set_value($form['name'], 'value changed by form_set_value() in #validate', $form_state); - // Output the element's value from $form_state. - drupal_set_message(t('@label value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name']))); - - // Trigger a form validation error to see our changes. - form_set_error('', $form_state); - } -} - -/** - * Form constructor to test the #required property. - * - * @deprecated Use \Drupal\form_test\validateRequiredForm() - */ -function form_test_validate_required_form($form, &$form_state) { - $options = array('foo' => 'foo', 'bar' => 'bar'); - $validate = array('form_test_validate_required_form_element_validate'); - - $form['textfield'] = array( - '#type' => 'textfield', - '#title' => 'Name', - '#required' => TRUE, - '#required_error' => t('Please enter a name.'), - ); - $form['checkboxes'] = array( - '#type' => 'checkboxes', - '#title' => 'Checkboxes', - '#options' => $options, - '#required' => TRUE, - '#form_test_required_error' => t('Please choose at least one option.'), - '#element_validate' => $validate, - ); - $form['select'] = array( - '#type' => 'select', - '#title' => 'Select', - '#options' => $options, - '#required' => TRUE, - '#form_test_required_error' => t('Please select something.'), - '#element_validate' => $validate, - ); - $form['radios'] = array( - '#type' => 'radios', - '#title' => 'Radios', - '#options' => $options, - '#required' => TRUE, - ); - $form['radios_optional'] = array( - '#type' => 'radios', - '#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; -} - -/** * Form element validation handler for 'Name' field in form_test_validate_required_form(). */ function form_test_validate_required_form_element_validate($element, &$form_state) { @@ -196,100 +79,6 @@ function form_test_validate_required_form_element_validate($element, &$form_stat } /** - * Form submission handler for form_test_validate_required_form(). - */ -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. - * - * @deprecated Use \Drupal\form_test\validateRequiredFormNoTitle() - */ -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. - * - * @deprecated Use \Drupal\form_test\validateFormWithErrorSuppression() - */ -function form_test_limit_validation_errors_form($form, &$form_state) { - $form['title'] = array( - '#type' => 'textfield', - '#title' => 'Title', - '#required' => TRUE, - ); - - $form['test'] = array( - '#title' => 'Test', - '#type' => 'textfield', - '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), - ); - $form['test_numeric_index'] = array( - '#tree' => TRUE, - ); - $form['test_numeric_index'][0] = array( - '#title' => 'Test (numeric index)', - '#type' => 'textfield', - '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), - ); - - $form['test_substring'] = array( - '#tree' => TRUE, - ); - $form['test_substring']['foo'] = array( - '#title' => 'Test (substring) foo', - '#type' => 'textfield', - '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), - ); - $form['test_substring']['foobar'] = array( - '#title' => 'Test (substring) foobar', - '#type' => 'textfield', - '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), - ); - - $form['actions']['partial'] = array( - '#type' => 'submit', - '#limit_validation_errors' => array(array('test')), - '#submit' => array('form_test_limit_validation_errors_form_partial_submit'), - '#value' => t('Partial validate'), - ); - $form['actions']['partial_numeric_index'] = array( - '#type' => 'submit', - '#limit_validation_errors' => array(array('test_numeric_index', 0)), - '#submit' => array('form_test_limit_validation_errors_form_partial_submit'), - '#value' => t('Partial validate (numeric index)'), - ); - $form['actions']['substring'] = array( - '#type' => 'submit', - '#limit_validation_errors' => array(array('test_substring', 'foo')), - '#submit' => array('form_test_limit_validation_errors_form_partial_submit'), - '#value' => t('Partial validate (substring)'), - ); - $form['actions']['full'] = array( - '#type' => 'submit', - '#value' => t('Full validate'), - ); - return $form; -} - -/** * Form element validation handler for the 'test' element. */ function form_test_limit_validation_errors_element_validate_test(&$element, &$form_state) { @@ -299,54 +88,6 @@ function form_test_limit_validation_errors_element_validate_test(&$element, &$fo } /** - * Form submit handler for the partial validation submit button. - */ -function form_test_limit_validation_errors_form_partial_submit($form, $form_state) { - // The title has not been validated, thus its value - in case of the test case - // an empty string - may not be set. - if (!isset($form_state['values']['title']) && isset($form_state['values']['test'])) { - drupal_set_message('Only validated values appear in the form values.'); - } -} - -/** - * Builds a simple form using the FAPI #pattern proterty. - * - * @deprecated Use \Drupal\form_test\validatePattern() - */ -function form_test_pattern_form($form, &$form_state) { - $form['textfield'] = array( - '#type' => 'textfield', - '#title' => 'One digit followed by lowercase letters', - '#pattern' => '[0-9][a-z]+', - ); - $form['tel'] = array( - '#type' => 'tel', - '#title' => 'Everything except numbers', - '#pattern' => '[^\d]*', - ); - $form['password'] = array( - '#type' => 'password', - '#title' => 'Password', - '#pattern' => '[01]+', - ); - $form['url'] = array( - '#type' => 'url', - '#title' => 'Client side validation', - '#decription' => 'Just client side validation, using the #pattern attribute.', - '#attributes' => array( - 'pattern' => '.*foo.*', - ), - '#pattern' => 'ignored', - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => 'Submit', - ); - return $form; -} - -/** * Create a header and options array. Helper function for callbacks. */ function _form_test_tableselect_get_data() { @@ -385,75 +126,6 @@ function _form_test_tableselect_get_data() { } /** - * A multistep form for testing the form storage. - * - * It uses two steps for editing a virtual "thing". Any changes to it are saved - * in the form storage and have to be present during any step. By setting the - * request parameter "cache" the form can be tested with caching enabled, as - * it would be the case, if the form would contain some #ajax callbacks. - * - * @see form_test_storage_form_submit() - * - * @deprecated Use \Drupal\form_test\testStorage() - */ -function form_test_storage_form($form, &$form_state) { - if ($form_state['rebuild']) { - $form_state['input'] = array(); - } - // Initialize - if (empty($form_state['storage'])) { - if (empty($form_state['input'])) { - $_SESSION['constructions'] = 0; - } - // Put the initial thing into the storage - $form_state['storage'] = array( - 'thing' => array( - 'title' => 'none', - 'value' => '', - ), - ); - } - // Count how often the form is constructed. - $_SESSION['constructions']++; - drupal_set_message("Form constructions: " . $_SESSION['constructions']); - - $form['title'] = array( - '#type' => 'textfield', - '#title' => 'Title', - '#default_value' => $form_state['storage']['thing']['title'], - '#required' => TRUE, - ); - $form['value'] = array( - '#type' => 'textfield', - '#title' => 'Value', - '#default_value' => $form_state['storage']['thing']['value'], - '#element_validate' => array('form_test_storage_element_validate_value_cached'), - ); - $form['continue_button'] = array( - '#type' => 'button', - '#value' => 'Reset', - // Rebuilds the form without keeping the values. - ); - $form['continue_submit'] = array( - '#type' => 'submit', - '#value' => 'Continue submit', - '#submit' => array('form_storage_test_form_continue_submit'), - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => 'Save', - ); - - if (\Drupal::request()->get('cache')) { - // Manually activate caching, so we can test that the storage keeps working - // when it's enabled. - $form_state['cache'] = TRUE; - } - - return $form; -} - -/** * Form element validation handler for 'value' element in form_test_storage_form(). * * Tests updating of cached form storage during validation. @@ -478,18 +150,6 @@ function form_storage_test_form_continue_submit($form, &$form_state) { } /** - * Form submit handler to finish multi-step form. - */ -function form_test_storage_form_submit($form, &$form_state) { - drupal_set_message("Title: " . String::checkPlain($form_state['values']['title'])); - drupal_set_message("Form constructions: " . $_SESSION['constructions']); - if (isset($form_state['storage']['thing']['changed'])) { - drupal_set_message("The thing has been changed."); - } - $form_state['redirect_route']['route_name'] = ''; -} - -/** * A form for testing form labels and required marks. * * @deprecated Use \Drupal\form_test\testLabel() @@ -582,227 +242,6 @@ function form_label_test_form() { } /** - * Form builder for form_state_values_clean() test. - * - * @deprecated Use \Drupal\form_test\testFormStateClean() - */ -function form_test_form_state_values_clean_form($form, &$form_state) { - // Build an example form containing multiple submit and button elements; not - // only on the top-level. - $form = array('#tree' => TRUE); - $form['foo'] = array('#type' => 'submit', '#value' => t('Submit')); - $form['bar'] = array('#type' => 'submit', '#value' => t('Submit')); - $form['beer'] = array('#type' => 'value', '#value' => 1000); - $form['baz']['foo'] = array('#type' => 'button', '#value' => t('Submit')); - $form['baz']['baz'] = array('#type' => 'submit', '#value' => t('Submit')); - $form['baz']['beer'] = array('#type' => 'value', '#value' => 2000); - return $form; -} - -/** - * Form submit handler for form_state_values_clean() test form. - */ -function form_test_form_state_values_clean_form_submit($form, &$form_state) { - form_state_values_clean($form_state); - // This won't have a proper JSON header, but Drupal doesn't check for that - // anyway so this is fine until it's replaced with a JsonResponse. - print Json::encode($form_state['values']); - exit; -} - -/** - * Form constructor for the form_state_values_clean() test. - * - * @deprecated Use \Drupal\form_test\testFormStateCleanAdvanced() - */ -function form_test_form_state_values_clean_advanced_form($form, &$form_state) { - // Build an example form containing a managed file and a submit form element. - $form['image'] = array( - '#type' => 'managed_file', - '#title' => t('Image'), - '#upload_location' => 'public://', - '#default_value' => 0, - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('Submit'), - ); - return $form; -} - -/** - * Form submission handler for form_test_form_state_values_clean_advanced_form(). - */ -function form_test_form_state_values_clean_advanced_form_submit($form, &$form_state) { - form_state_values_clean($form_state); - print t('You WIN!'); - exit; -} - -/** - * Builds a form to test #type 'select' validation. - * - * @deprecated Use \Drupal\form_test\testSelect() - */ -function form_test_select($form, &$form_state) { - $form['#submit'] = array('_form_test_submit_values_json'); - - $base = array( - '#type' => 'select', - '#options' => array('one' => 'one', 'two' => 'two', 'three' => 'three'), - ); - - $form['select'] = $base + array( - '#title' => '#default_value one', - '#default_value' => 'one', - ); - $form['select_required'] = $base + array( - '#title' => '#default_value one, #required', - '#required' => TRUE, - '#default_value' => 'one', - ); - $form['select_optional'] = $base + array( - '#title' => '#default_value one, not #required', - '#required' => FALSE, - '#default_value' => 'one', - ); - $form['empty_value'] = $base + array( - '#title' => '#default_value one, #required, #empty_value 0', - '#required' => TRUE, - '#default_value' => 'one', - '#empty_value' => 0, - ); - $form['empty_value_one'] = $base + array( - '#title' => '#default_value = #empty_value, #required', - '#required' => TRUE, - '#default_value' => 'one', - '#empty_value' => 'one', - ); - - $form['no_default'] = $base + array( - '#title' => 'No #default_value, #required', - '#required' => TRUE, - ); - $form['no_default_optional'] = $base + array( - '#title' => 'No #default_value, not #required', - '#required' => FALSE, - '#description' => 'Should result in "one" because it is not required and there is no #empty_value requested, so default browser behavior of preselecting first option is in effect.', - ); - $form['no_default_optional_empty_value'] = $base + array( - '#title' => 'No #default_value, not #required, #empty_value empty string', - '#empty_value' => '', - '#required' => FALSE, - '#description' => 'Should result in an empty string (due to #empty_value) because it is optional.', - ); - - $form['no_default_empty_option'] = $base + array( - '#title' => 'No #default_value, #required, #empty_option', - '#required' => TRUE, - '#empty_option' => '- Choose -', - ); - $form['no_default_empty_option_optional'] = $base + array( - '#title' => 'No #default_value, not #required, #empty_option', - '#empty_option' => '- Dismiss -', - '#description' => 'Should result in an empty string (default of #empty_value) because it is optional.', - ); - - $form['no_default_empty_value'] = $base + array( - '#title' => 'No #default_value, #required, #empty_value 0', - '#required' => TRUE, - '#empty_value' => 0, - '#description' => 'Should never result in 0.', - ); - $form['no_default_empty_value_one'] = $base + array( - '#title' => 'No #default_value, #required, #empty_value one', - '#required' => TRUE, - '#empty_value' => 'one', - '#description' => 'A mistakenly assigned #empty_value contained in #options should not be valid.', - ); - $form['no_default_empty_value_optional'] = $base + array( - '#title' => 'No #default_value, not #required, #empty_value 0', - '#required' => FALSE, - '#empty_value' => 0, - '#description' => 'Should result in 0 because it is optional.', - ); - - $form['multiple'] = $base + array( - '#title' => '#multiple, #default_value two', - '#default_value' => array('two'), - '#multiple' => TRUE, - ); - $form['multiple_no_default'] = $base + array( - '#title' => '#multiple, no #default_value', - '#multiple' => TRUE, - ); - $form['multiple_no_default_required'] = $base + array( - '#title' => '#multiple, #required, no #default_value', - '#required' => TRUE, - '#multiple' => TRUE, - ); - - $form['submit'] = array('#type' => 'submit', '#value' => 'Submit'); - return $form; -} - -/** - * Builds a form to test select elements when #options is not an array. - * - * @deprecated Use \Drupal\form_test\testEmptySelect() - */ -function form_test_empty_select($form, &$form_state) { - $form['empty_select'] = array( - '#type' => 'select', - '#title' => t('Empty Select'), - '#multiple' => FALSE, - '#options' => NULL, - ); - return $form; -} - -/** - * Builds a form to test the language select form element. - * - * @deprecated Use \Drupal\form_test\testLanguageSelect() - */ -function form_test_language_select() { - $form['#submit'] = array('_form_test_submit_values_json'); - - $form['languages_all'] = array( - '#title' => t('Languages: All'), - '#type' => 'language_select', - '#languages' => LanguageInterface::STATE_ALL, - '#default_value' => 'xx', - ); - $form['languages_configurable'] = array( - '#title' => t('Languages: Configurable'), - '#type' => 'language_select', - '#languages' => LanguageInterface::STATE_CONFIGURABLE, - '#default_value' => 'en', - ); - $form['languages_locked'] = array( - '#title' => t('Languages: Locked'), - '#type' => 'language_select', - '#languages' => LanguageInterface::STATE_LOCKED, - ); - $form['languages_config_and_locked'] = array( - '#title' => t('Languages: Configurable and locked'), - '#type' => 'language_select', - '#languages' => LanguageInterface::STATE_CONFIGURABLE | LanguageInterface::STATE_LOCKED, - '#default_value' => 'dummy_value', - ); - $form['language_custom_options'] = array( - '#title' => t('Languages: Custom'), - '#type' => 'language_select', - '#languages' => LanguageInterface::STATE_CONFIGURABLE | LanguageInterface::STATE_LOCKED, - '#options' => array('opt1' => 'First option', 'opt2' => 'Second option', 'opt3' => 'Third option'), - '#default_value' => 'opt2', - ); - - $form['submit'] = array('#type' => 'submit', '#value' => 'Submit'); - return $form; -} - -/** * Builds a form to test #type 'number' and 'range' validation. * * @param $element @@ -925,55 +364,6 @@ function form_test_number($form, &$form_state, $element = 'number') { } /** - * Form constructor for testing #type 'range' elements. - * - * @see form_test_range_submit() - * - * @deprecated Use \Drupal\form_test\testRange() - */ -function form_test_range($form, &$form_state) { - $form['#submit'] = array('_form_test_submit_values_json'); - - $form['with_default_value'] = array( - '#type' => 'range', - '#title' => 'Range with default value', - '#min' => 10, - '#max' => 20, - '#step' => 2, - '#default_value' => 18, - '#description' => 'The default value is 18.', - ); - $form['float'] = array( - '#type' => 'range', - '#title' => 'Float', - '#min' => 10, - '#max' => 11, - '#step' => 'any', - '#description' => 'Floating point number between 10 and 11.', - ); - $form['integer'] = array( - '#type' => 'range', - '#title' => 'Integer', - '#min' => 2, - '#max' => 8, - '#step' => 2, - '#description' => 'Even integer between 2 and 8.', - ); - $form['offset'] = array( - '#type' => 'range', - '#title' => 'Offset', - '#min' => 2.9, - '#max' => 10.9, - '#description' => 'Value between 2.9 and 10.9.', - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => 'Submit', - ); - return $form; -} - -/** * Form constructor for testing invalid #type 'range' elements. * * @deprecated Use \Drupal\form_test\testRangeInvalid() diff --git a/core/modules/system/tests/modules/form_test/form_test.routing.yml b/core/modules/system/tests/modules/form_test/form_test.routing.yml index 56bd2d5..015cb97 100644 --- a/core/modules/system/tests/modules/form_test/form_test.routing.yml +++ b/core/modules/system/tests/modules/form_test/form_test.routing.yml @@ -71,7 +71,7 @@ form_test.autocomplete_2: form_test.alter_form: path: '/form-test/alter' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::alterForm' + _form: '\Drupal\form_test\Form\FormTestAlterForm' _title: 'Form altering test' requirements: _access: 'TRUE' @@ -79,7 +79,7 @@ form_test.alter_form: form_test.validate_form: path: '/form-test/validate' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::validateForm' + _form: '\Drupal\form_test\Form\FormTestValidateForm' _title: 'Form validation handlers test' requirements: _access: 'TRUE' @@ -87,7 +87,7 @@ form_test.validate_form: form_test.validate_required: path: '/form-test/validate-required' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::validateRequiredForm' + _form: '\Drupal\form_test\Form\FormTestValidateRequiredForm' _title: 'Form #required validation' requirements: _access: 'TRUE' @@ -95,7 +95,7 @@ form_test.validate_required: form_test.validate_required_no_title: path: '/form-test/validate-required-no-title' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::validateRequiredFormNoTitle' + _form: '\Drupal\form_test\Form\FormTestValidateRequiredNoTitleForm' _title: 'Form #required validation without #title' requirements: _access: 'TRUE' @@ -103,7 +103,7 @@ form_test.validate_required_no_title: form_test.validate_with_error_suppresion: path: '/form-test/limit-validation-errors' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::validateFormWithErrorSuppression' + _form: '\Drupal\form_test\Form\FormTestLimitValidationErrorsForm' _title: 'Form validation with some error suppression' requirements: _access: 'TRUE' @@ -111,7 +111,7 @@ form_test.validate_with_error_suppresion: form_test.pattern: path: '/form-test/pattern' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::validatePattern' + _form: '\Drupal\form_test\Form\FormTestPatternForm' _title: 'Pattern validation' requirements: _access: 'TRUE' @@ -167,7 +167,7 @@ form_test.vertical_tabs: form_test.storage: path: '/form_test/form-storage' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testStorage' + _form: '\Drupal\form_test\Form\FormTestStorageForm' _title: 'Form storage test' requirements: _access: 'TRUE' @@ -175,7 +175,7 @@ form_test.storage: form_test.state_clean: path: '/form_test/form-state-values-clean' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testFormStateClean' + _form: '\Drupal\form_test\Form\FormTestFormStateValuesCleanForm' _title: 'Form state values clearance test' requirements: _access: 'TRUE' @@ -183,7 +183,7 @@ form_test.state_clean: form_test.state_clean_advanced: path: '/form_test/form-state-values-clean-advanced' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testFormStateCleanAdvanced' + _form: '\Drupal\form_test\Form\FormTestFormStateValuesCleanAdvancedForm' _title: 'Form state values clearance advanced test' requirements: _access: 'TRUE' @@ -199,7 +199,7 @@ form_test.checkbox: form_test.select: path: '/form-test/select' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testSelect' + _form: '\Drupal\form_test\Form\FormTestSelectForm' _title: 'Select' requirements: _access: 'TRUE' @@ -207,7 +207,7 @@ form_test.select: form_test.empty_select: path: '/form-test/empty-select' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testEmptySelect' + _form: '\Drupal\form_test\Form\FormTestEmptySelectForm' _title: 'Empty Select Element' requirements: _access: 'TRUE' @@ -215,7 +215,7 @@ form_test.empty_select: form_test.language_select: path: '/form-test/language_select' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testLanguageSelect' + _form: '\Drupal\form_test\Form\FormTestLanguageSelectForm' _title: 'Language Select' requirements: _access: 'TRUE' @@ -247,7 +247,7 @@ form_test.number_range: form_test.range: path: '/form-test/range' defaults: - _content: '\Drupal\form_test\Form\FormTestForm::testRange' + _form: '\Drupal\form_test\Form\FormTestRangeForm' _title: 'Range' requirements: _access: 'TRUE' diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestAlterForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestAlterForm.php new file mode 100644 index 0000000..3052d76 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestAlterForm.php @@ -0,0 +1,40 @@ + 'select', + '#title' => t('Empty Select'), + '#multiple' => FALSE, + '#options' => NULL, + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestForm.php index c777732..7481792 100644 --- a/core/modules/system/tests/modules/form_test/src/Form/FormTestForm.php +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestForm.php @@ -13,114 +13,6 @@ class FormTestForm { /** - * Wraps form_test_alter_form(). - * - * @todo Remove form_test_alter_form(). - */ - public function alterForm() { - return \Drupal::formBuilder()->getForm('form_test_alter_form'); - } - - /** - * Wraps form_test_validate_form(). - * - * @todo Remove form_test_validate_form(). - */ - public function validateForm() { - return \Drupal::formBuilder()->getForm('form_test_validate_form'); - } - - /** - * Wraps form_test_validate_required_form(). - * - * @todo Remove form_test_validate_required_form(). - */ - public function validateRequiredForm() { - return \Drupal::formBuilder()->getForm('form_test_validate_required_form'); - } - - /** - * Wraps form_test_validate_required_form_no_title(). - * - * @todo Remove form_test_validate_required_form_no_title(). - */ - public function validateRequiredFormNoTitle() { - return \Drupal::formBuilder()->getForm('form_test_validate_required_form_no_title'); - } - - /** - * Wraps form_test_limit_validation_errors_form(). - * - * @todo Remove form_test_limit_validation_errors_form(). - */ - public function validateFormWithErrorSuppression() { - return \Drupal::formBuilder()->getForm('form_test_limit_validation_errors_form'); - } - - /** - * Wraps form_test_pattern_form(). - * - * @todo Remove form_test_pattern_form(). - */ - public function validatePattern() { - return \Drupal::formBuilder()->getForm('form_test_pattern_form'); - } - - /** - * Wraps form_test_storage_form(). - * - * @todo Remove form_test_storage_form(). - */ - public function testStorage() { - return \Drupal::formBuilder()->getForm('form_test_storage_form'); - } - - /** - * Wraps form_test_form_state_values_clean_form(). - * - * @todo Remove form_test_form_state_values_clean_form(). - */ - public function testFormStateClean() { - return \Drupal::formBuilder()->getForm('form_test_form_state_values_clean_form'); - } - - /** - * Wraps form_test_form_state_values_clean_advanced_form(). - * - * @todo Remove form_test_form_state_values_clean_advanced_form(). - */ - public function testFormStateCleanAdvanced() { - return \Drupal::formBuilder()->getForm('form_test_form_state_values_clean_advanced_form'); - } - - /** - * Wraps form_test_select(). - * - * @todo Remove form_test_select(). - */ - public function testSelect() { - return \Drupal::formBuilder()->getForm('form_test_select'); - } - - /** - * Wraps form_test_empty_select(). - * - * @todo Remove form_test_empty_select(). - */ - public function testEmptySelect() { - return \Drupal::formBuilder()->getForm('form_test_empty_select'); - } - - /** - * Wraps form_test_language_select(). - * - * @todo Remove form_test_language_select(). - */ - public function testLanguageSelect() { - return \Drupal::formBuilder()->getForm('form_test_language_select'); - } - - /** * Wraps form_test_placeholder_test(). * * @todo Remove form_test_placeholder_test(). @@ -148,15 +40,6 @@ public function testNumberRange() { } /** - * Wraps form_test_range(). - * - * @todo Remove form_test_range(). - */ - public function testRange() { - return \Drupal::formBuilder()->getForm('form_test_range'); - } - - /** * Wraps form_test_range_invalid(). * * @todo Remove form_test_range_invalid(). diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanAdvancedForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanAdvancedForm.php new file mode 100644 index 0000000..879d7b3 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanAdvancedForm.php @@ -0,0 +1,51 @@ + 'managed_file', + '#title' => t('Image'), + '#upload_location' => 'public://', + '#default_value' => 0, + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + form_state_values_clean($form_state); + print t('You WIN!'); + exit; + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanForm.php new file mode 100644 index 0000000..5c258d4 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestFormStateValuesCleanForm.php @@ -0,0 +1,52 @@ + TRUE); + $form['foo'] = array('#type' => 'submit', '#value' => t('Submit')); + $form['bar'] = array('#type' => 'submit', '#value' => t('Submit')); + $form['beer'] = array('#type' => 'value', '#value' => 1000); + $form['baz']['foo'] = array('#type' => 'button', '#value' => t('Submit')); + $form['baz']['baz'] = array('#type' => 'submit', '#value' => t('Submit')); + $form['baz']['beer'] = array('#type' => 'value', '#value' => 2000); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + form_state_values_clean($form_state); + // This won't have a proper JSON header, but Drupal doesn't check for that + // anyway so this is fine until it's replaced with a JsonResponse. + print Json::encode($form_state['values']); + exit; + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestLanguageSelectForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestLanguageSelectForm.php new file mode 100644 index 0000000..711b369 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestLanguageSelectForm.php @@ -0,0 +1,72 @@ + t('Languages: All'), + '#type' => 'language_select', + '#languages' => LanguageInterface::STATE_ALL, + '#default_value' => 'xx', + ); + $form['languages_configurable'] = array( + '#title' => t('Languages: Configurable'), + '#type' => 'language_select', + '#languages' => LanguageInterface::STATE_CONFIGURABLE, + '#default_value' => 'en', + ); + $form['languages_locked'] = array( + '#title' => t('Languages: Locked'), + '#type' => 'language_select', + '#languages' => LanguageInterface::STATE_LOCKED, + ); + $form['languages_config_and_locked'] = array( + '#title' => t('Languages: Configurable and locked'), + '#type' => 'language_select', + '#languages' => LanguageInterface::STATE_CONFIGURABLE | LanguageInterface::STATE_LOCKED, + '#default_value' => 'dummy_value', + ); + $form['language_custom_options'] = array( + '#title' => t('Languages: Custom'), + '#type' => 'language_select', + '#languages' => LanguageInterface::STATE_CONFIGURABLE | LanguageInterface::STATE_LOCKED, + '#options' => array('opt1' => 'First option', 'opt2' => 'Second option', 'opt3' => 'Third option'), + '#default_value' => 'opt2', + ); + + $form['submit'] = array('#type' => 'submit', '#value' => 'Submit'); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $form_state['response'] = new JsonResponse($form_state['values']); + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestLimitValidationErrorsForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestLimitValidationErrorsForm.php new file mode 100644 index 0000000..3838b5e --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestLimitValidationErrorsForm.php @@ -0,0 +1,104 @@ + 'textfield', + '#title' => 'Title', + '#required' => TRUE, + ); + + $form['test'] = array( + '#title' => 'Test', + '#type' => 'textfield', + '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), + ); + $form['test_numeric_index'] = array( + '#tree' => TRUE, + ); + $form['test_numeric_index'][0] = array( + '#title' => 'Test (numeric index)', + '#type' => 'textfield', + '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), + ); + + $form['test_substring'] = array( + '#tree' => TRUE, + ); + $form['test_substring']['foo'] = array( + '#title' => 'Test (substring) foo', + '#type' => 'textfield', + '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), + ); + $form['test_substring']['foobar'] = array( + '#title' => 'Test (substring) foobar', + '#type' => 'textfield', + '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'), + ); + + $form['actions']['partial'] = array( + '#type' => 'submit', + '#limit_validation_errors' => array(array('test')), + '#submit' => array(array($this, 'partialSubmitForm')), + '#value' => t('Partial validate'), + ); + $form['actions']['partial_numeric_index'] = array( + '#type' => 'submit', + '#limit_validation_errors' => array(array('test_numeric_index', 0)), + '#submit' => array(array($this, 'partialSubmitForm')), + '#value' => t('Partial validate (numeric index)'), + ); + $form['actions']['substring'] = array( + '#type' => 'submit', + '#limit_validation_errors' => array(array('test_substring', 'foo')), + '#submit' => array(array($this, 'partialSubmitForm')), + '#value' => t('Partial validate (substring)'), + ); + $form['actions']['full'] = array( + '#type' => 'submit', + '#value' => t('Full validate'), + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + } + + /** + * {@inheritdoc} + */ + public function partialSubmitForm(array &$form, array &$form_state) { + // The title has not been validated, thus its value - in case of the test case + // an empty string - may not be set. + if (!isset($form_state['values']['title']) && isset($form_state['values']['test'])) { + drupal_set_message('Only validated values appear in the form values.'); + } + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestPatternForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestPatternForm.php new file mode 100644 index 0000000..7df5f7a --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestPatternForm.php @@ -0,0 +1,65 @@ + 'textfield', + '#title' => 'One digit followed by lowercase letters', + '#pattern' => '[0-9][a-z]+', + ); + $form['tel'] = array( + '#type' => 'tel', + '#title' => 'Everything except numbers', + '#pattern' => '[^\d]*', + ); + $form['password'] = array( + '#type' => 'password', + '#title' => 'Password', + '#pattern' => '[01]+', + ); + $form['url'] = array( + '#type' => 'url', + '#title' => 'Client side validation', + '#decription' => 'Just client side validation, using the #pattern attribute.', + '#attributes' => array( + 'pattern' => '.*foo.*', + ), + '#pattern' => 'ignored', + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Submit', + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestRangeForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestRangeForm.php new file mode 100644 index 0000000..fff5126 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestRangeForm.php @@ -0,0 +1,75 @@ + 'range', + '#title' => 'Range with default value', + '#min' => 10, + '#max' => 20, + '#step' => 2, + '#default_value' => 18, + '#description' => 'The default value is 18.', + ); + $form['float'] = array( + '#type' => 'range', + '#title' => 'Float', + '#min' => 10, + '#max' => 11, + '#step' => 'any', + '#description' => 'Floating point number between 10 and 11.', + ); + $form['integer'] = array( + '#type' => 'range', + '#title' => 'Integer', + '#min' => 2, + '#max' => 8, + '#step' => 2, + '#description' => 'Even integer between 2 and 8.', + ); + $form['offset'] = array( + '#type' => 'range', + '#title' => 'Offset', + '#min' => 2.9, + '#max' => 10.9, + '#description' => 'Value between 2.9 and 10.9.', + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Submit', + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $form_state['response'] = new JsonResponse($form_state['values']); + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php new file mode 100644 index 0000000..5227ae4 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php @@ -0,0 +1,133 @@ + 'select', + '#options' => array('one' => 'one', 'two' => 'two', 'three' => 'three'), + ); + + $form['select'] = $base + array( + '#title' => '#default_value one', + '#default_value' => 'one', + ); + $form['select_required'] = $base + array( + '#title' => '#default_value one, #required', + '#required' => TRUE, + '#default_value' => 'one', + ); + $form['select_optional'] = $base + array( + '#title' => '#default_value one, not #required', + '#required' => FALSE, + '#default_value' => 'one', + ); + $form['empty_value'] = $base + array( + '#title' => '#default_value one, #required, #empty_value 0', + '#required' => TRUE, + '#default_value' => 'one', + '#empty_value' => 0, + ); + $form['empty_value_one'] = $base + array( + '#title' => '#default_value = #empty_value, #required', + '#required' => TRUE, + '#default_value' => 'one', + '#empty_value' => 'one', + ); + + $form['no_default'] = $base + array( + '#title' => 'No #default_value, #required', + '#required' => TRUE, + ); + $form['no_default_optional'] = $base + array( + '#title' => 'No #default_value, not #required', + '#required' => FALSE, + '#description' => 'Should result in "one" because it is not required and there is no #empty_value requested, so default browser behavior of preselecting first option is in effect.', + ); + $form['no_default_optional_empty_value'] = $base + array( + '#title' => 'No #default_value, not #required, #empty_value empty string', + '#empty_value' => '', + '#required' => FALSE, + '#description' => 'Should result in an empty string (due to #empty_value) because it is optional.', + ); + + $form['no_default_empty_option'] = $base + array( + '#title' => 'No #default_value, #required, #empty_option', + '#required' => TRUE, + '#empty_option' => '- Choose -', + ); + $form['no_default_empty_option_optional'] = $base + array( + '#title' => 'No #default_value, not #required, #empty_option', + '#empty_option' => '- Dismiss -', + '#description' => 'Should result in an empty string (default of #empty_value) because it is optional.', + ); + + $form['no_default_empty_value'] = $base + array( + '#title' => 'No #default_value, #required, #empty_value 0', + '#required' => TRUE, + '#empty_value' => 0, + '#description' => 'Should never result in 0.', + ); + $form['no_default_empty_value_one'] = $base + array( + '#title' => 'No #default_value, #required, #empty_value one', + '#required' => TRUE, + '#empty_value' => 'one', + '#description' => 'A mistakenly assigned #empty_value contained in #options should not be valid.', + ); + $form['no_default_empty_value_optional'] = $base + array( + '#title' => 'No #default_value, not #required, #empty_value 0', + '#required' => FALSE, + '#empty_value' => 0, + '#description' => 'Should result in 0 because it is optional.', + ); + + $form['multiple'] = $base + array( + '#title' => '#multiple, #default_value two', + '#default_value' => array('two'), + '#multiple' => TRUE, + ); + $form['multiple_no_default'] = $base + array( + '#title' => '#multiple, no #default_value', + '#multiple' => TRUE, + ); + $form['multiple_no_default_required'] = $base + array( + '#title' => '#multiple, #required, no #default_value', + '#required' => TRUE, + '#multiple' => TRUE, + ); + + $form['submit'] = array('#type' => 'submit', '#value' => 'Submit'); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $form_state['response'] = new JsonResponse($form_state['values']); + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestStorageForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestStorageForm.php new file mode 100644 index 0000000..9106013 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestStorageForm.php @@ -0,0 +1,102 @@ + array( + 'title' => 'none', + 'value' => '', + ), + ); + } + // Count how often the form is constructed. + $_SESSION['constructions']++; + drupal_set_message("Form constructions: " . $_SESSION['constructions']); + + $form['title'] = array( + '#type' => 'textfield', + '#title' => 'Title', + '#default_value' => $form_state['storage']['thing']['title'], + '#required' => TRUE, + ); + $form['value'] = array( + '#type' => 'textfield', + '#title' => 'Value', + '#default_value' => $form_state['storage']['thing']['value'], + '#element_validate' => array('form_test_storage_element_validate_value_cached'), + ); + $form['continue_button'] = array( + '#type' => 'button', + '#value' => 'Reset', + // Rebuilds the form without keeping the values. + ); + $form['continue_submit'] = array( + '#type' => 'submit', + '#value' => 'Continue submit', + '#submit' => array('form_storage_test_form_continue_submit'), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Save', + ); + + if (\Drupal::request()->get('cache')) { + // Manually activate caching, so we can test that the storage keeps working + // when it's enabled. + $form_state['cache'] = TRUE; + } + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + drupal_set_message("Title: " . String::checkPlain($form_state['values']['title'])); + drupal_set_message("Form constructions: " . $_SESSION['constructions']); + if (isset($form_state['storage']['thing']['changed'])) { + drupal_set_message("The thing has been changed."); + } + $form_state['redirect_route']['route_name'] = ''; + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php new file mode 100644 index 0000000..50cf98f --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateForm.php @@ -0,0 +1,81 @@ + 'textfield', + '#title' => 'Name', + '#default_value' => '', + '#element_validate' => array(array($object, 'validateName')), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Save', + ); + + // To simplify this test, enable form caching and use form storage to + // remember our alteration. + $form_state['cache'] = TRUE; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, array &$form_state) { + if ($form_state['values']['name'] == 'validate') { + // Alter the form element. + $form['name']['#value'] = '#value changed by #validate'; + // Alter the submitted value in $form_state. + form_set_value($form['name'], 'value changed by form_set_value() in #validate', $form_state); + // Output the element's value from $form_state. + drupal_set_message(t('@label value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name']))); + + // Trigger a form validation error to see our changes. + form_set_error('', $form_state); + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredForm.php new file mode 100644 index 0000000..e25d18f --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredForm.php @@ -0,0 +1,82 @@ + 'foo', 'bar' => 'bar'); + $validate = array('form_test_validate_required_form_element_validate'); + + $form['textfield'] = array( + '#type' => 'textfield', + '#title' => 'Name', + '#required' => TRUE, + '#required_error' => t('Please enter a name.'), + ); + $form['checkboxes'] = array( + '#type' => 'checkboxes', + '#title' => 'Checkboxes', + '#options' => $options, + '#required' => TRUE, + '#form_test_required_error' => t('Please choose at least one option.'), + '#element_validate' => $validate, + ); + $form['select'] = array( + '#type' => 'select', + '#title' => 'Select', + '#options' => $options, + '#required' => TRUE, + '#form_test_required_error' => t('Please select something.'), + '#element_validate' => $validate, + ); + $form['radios'] = array( + '#type' => 'radios', + '#title' => 'Radios', + '#options' => $options, + '#required' => TRUE, + ); + $form['radios_optional'] = array( + '#type' => 'radios', + '#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; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + drupal_set_message('The form_test_validate_required_form form was submitted successfully.'); + } + +} diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredNoTitleForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredNoTitleForm.php new file mode 100644 index 0000000..25e5076 --- /dev/null +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredNoTitleForm.php @@ -0,0 +1,44 @@ + 'textfield', + '#required' => TRUE, + ); + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit'); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + drupal_set_message('The form_test_validate_required_form_no_title form was submitted successfully.'); + } + +}