diff options
author | Dries Buytaert <dries@buytaert.net> | 2009-11-28 14:39:31 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2009-11-28 14:39:31 +0000 |
commit | b6084826787b316595307d1dbbd6876508a60d28 (patch) | |
tree | 9d6688cc03f771f6b3982c41cc5832edd6f1fd00 /modules/simpletest/tests/form_test.module | |
parent | 0ba214f9436a3893c9e0a57f7caad56d07300f2f (diff) | |
download | brdo-b6084826787b316595307d1dbbd6876508a60d28.tar.gz brdo-b6084826787b316595307d1dbbd6876508a60d28.tar.bz2 |
- Patch #642702 by sun: form validation handlers cannot alter structure.
Diffstat (limited to 'modules/simpletest/tests/form_test.module')
-rw-r--r-- | modules/simpletest/tests/form_test.module | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module index 5c809580f..15a141f15 100644 --- a/modules/simpletest/tests/form_test.module +++ b/modules/simpletest/tests/form_test.module @@ -10,6 +10,14 @@ * Implement hook_menu(). */ function form_test_menu() { + $items['form-test/validate'] = array( + 'title' => 'Form validation handlers test', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('form_test_validate_form'), + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['form_test/tableselect/multiple-true'] = array( 'title' => 'Tableselect checkboxes test', 'page callback' => 'drupal_get_form', @@ -82,6 +90,88 @@ function form_test_menu() { } /** + * 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. + */ +function form_test_validate_form($form, &$form_state) { + $form['name'] = array( + '#type' => 'textfield', + '#title' => 'Name', + '#default_value' => '', + '#element_validate' => array('form_test_element_validate_name'), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Save', + ); + return $form; +} + +/** + * Form element validation handler for 'name' in form_test_validate_form(). + */ +function form_test_element_validate_name(&$element, &$form_state) { + $triggered = FALSE; + if ($form_state['values']['name'] == 'element_validate') { + // Alter the form element. + $element['#value'] = '#value changed by #element_validate'; + // Alter the submitted value in $form_state. + form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state); + + $triggered = TRUE; + } + if ($form_state['values']['name'] == 'element_validate_access') { + // To simplify this test, enable form caching and use form storage to + // remember our alteration. + $form_state['cache'] = TRUE; + $form_state['storage']['form_test_name'] = $form_state['values']['name']; + // Alter the form element. + $element['#access'] = FALSE; + + $triggered = TRUE; + } + elseif (!empty($form_state['storage']['form_test_name'])) { + // To simplify this test, just take over the element's value into $form_state. + form_set_value($element, $form_state['storage']['form_test_name'], $form_state); + + $triggered = TRUE; + } + + if ($triggered) { + // Output the element's value from $form_state. + drupal_set_message(t('@label value: @value', array('@label' => $element['#title'], '@value' => $form_state['values']['name']))); + + // Trigger a form validation error to see our changes. + form_set_error(''); + } +} + +/** + * 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(''); + } +} + +/** * Create a header and options array. Helper function for callbacks. */ function _form_test_tableselect_get_data() { |