diff options
author | Dries Buytaert <dries@buytaert.net> | 2010-07-17 18:52:39 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2010-07-17 18:52:39 +0000 |
commit | ecc7ce08754ca321110c25ca29567f9726813637 (patch) | |
tree | c9781c6024097514ee4de2babdd9ba63f06806c6 | |
parent | 67317ecc01211d791697dfce662346ab621a31e3 (diff) | |
download | brdo-ecc7ce08754ca321110c25ca29567f9726813637.tar.gz brdo-ecc7ce08754ca321110c25ca29567f9726813637.tar.bz2 |
- Patch #561226 by fago, effulgentsia, sun, YesCT, marcingy: orms (elements) need to able to specify include files to be loaded for building.
-rw-r--r-- | includes/form.inc | 22 | ||||
-rw-r--r-- | modules/simpletest/tests/form.test | 34 | ||||
-rw-r--r-- | modules/simpletest/tests/form_test.file.inc | 40 | ||||
-rw-r--r-- | modules/simpletest/tests/form_test.info | 1 | ||||
-rw-r--r-- | modules/simpletest/tests/form_test.module | 34 |
5 files changed, 125 insertions, 6 deletions
diff --git a/includes/form.inc b/includes/form.inc index b214b673c..f41cce4a7 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -207,7 +207,10 @@ function drupal_get_form($form_id) { * rebuild the form from cache when the original context may no longer be * available: * - args: An array of arguments to pass to the form builder. - * - file: An optional include file that contains the form and is + * - files: An optional array defining include files that need to be loaded + * for building the form. Each array entry may be the path to a file or + * another array containing values for the parameters 'type', 'module' and + * 'name' as needed by module_load_include(). The files listed here are * automatically loaded by form_get_cache(). Defaults to the current menu * router item's 'file' definition, if existent. * - rebuild: Normally, after the entire form processing is completed and @@ -298,10 +301,10 @@ function drupal_build_form($form_id, &$form_state) { // rebuilt from cache on a different path (such as 'system/ajax'). See // form_get_cache(). // $menu_get_item() is not available at installation time. - if (!isset($form_state['build_info']['file']) && !defined('MAINTENANCE_MODE')) { + if (!isset($form_state['build_info']['files']['menu']) && !defined('MAINTENANCE_MODE')) { $item = menu_get_item(); if (!empty($item['include_file'])) { - $form_state['build_info']['file'] = $item['include_file']; + $form_state['build_info']['files']['menu'] = $item['include_file']; } } @@ -474,10 +477,17 @@ function form_get_cache($form_build_id, &$form_state) { // Re-populate $form_state for subsequent rebuilds. $form_state = $cached->data + $form_state; - // If the original form is contained in an include file, load the file. + // If the original form is contained in include files, load the files. // See drupal_build_form(). - if (!empty($form_state['build_info']['file']) && file_exists($form_state['build_info']['file'])) { - require_once DRUPAL_ROOT . '/' . $form_state['build_info']['file']; + $form_state['build_info'] += array('files' => array()); + foreach ($form_state['build_info']['files'] as $file) { + if (is_array($file)) { + $file += array('type' => 'inc', 'name' => $file['module']); + module_load_include($file['type'], $file['module'], $file['name']); + } + elseif (file_exists($file)) { + require_once DRUPAL_ROOT . '/' . $file; + } } } return $form; diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test index 29fb5eb53..d139f4dcb 100644 --- a/modules/simpletest/tests/form.test +++ b/modules/simpletest/tests/form.test @@ -1175,3 +1175,37 @@ class FormsArbitraryRebuildTestCase extends DrupalWebTestCase { $this->assertFieldByName('mail', 'bar@example.com', 'Entered mail address has been kept.'); } } + +/** + * Tests form API file inclusion. + */ +class FormsFileInclusionTestCase extends DrupalWebTestCase { + + public static function getInfo() { + return array( + 'name' => 'Form API file inclusion', + 'description' => 'Tests form API file inclusion.', + 'group' => 'Form API', + ); + } + + function setUp() { + parent::setUp('form_test'); + } + + /** + * Tests loading an include specified in hook_menu(). + */ + function testLoadMenuInclude() { + $this->drupalPostAJAX('form-test/load-include-menu', array(), array('op' => t('Save')), 'system/ajax', array(), array(), 'form-test-load-include-menu'); + $this->assertText('Submit callback called.'); + } + + /** + * Tests loading a custom specified inlcude. + */ + function testLoadCustomInclude() { + $this->drupalPost('form-test/load-include-custom', array(), t('Save')); + $this->assertText('Submit callback called.'); + } +} diff --git a/modules/simpletest/tests/form_test.file.inc b/modules/simpletest/tests/form_test.file.inc new file mode 100644 index 000000000..96681eaa8 --- /dev/null +++ b/modules/simpletest/tests/form_test.file.inc @@ -0,0 +1,40 @@ +<?php +// $Id$ + +/** + * @file + * An include file to test loading it with the form API. + */ + +/** + * Form constructor for testing FAPI file inclusion of the file specified in + * hook_menu(). + */ +function form_test_load_include_menu($form, &$form_state) { + // Submit the form via AJAX. That way the FAPI has to care about including + // the file specified in hook_menu(). + $form['button'] = array( + '#type' => 'submit', + '#value' => t('Save'), + '#submit' => array('form_test_load_include_submit'), + '#ajax' => array( + 'callback' => 'form_test_load_include_menu_ajax', + ), + ); + return $form; +} + +/** + * Submit callback for the form API file inclusion test forms. + */ +function form_test_load_include_submit($form, $form_state) { + drupal_set_message('Submit callback called.'); +} + +/** + * Ajax callback for the file inclusion via menu test. We don't need to return + * anything as the messages are added automatically. + */ +function form_test_load_include_menu_ajax($form) { + return ''; +} diff --git a/modules/simpletest/tests/form_test.info b/modules/simpletest/tests/form_test.info index d138f15cc..b7030c339 100644 --- a/modules/simpletest/tests/form_test.info +++ b/modules/simpletest/tests/form_test.info @@ -5,4 +5,5 @@ package = Testing version = VERSION core = 7.x files[] = form_test.module +files[] = form_test.file.inc hidden = TRUE diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module index cbc4c0ead..64360f93f 100644 --- a/modules/simpletest/tests/form_test.module +++ b/modules/simpletest/tests/form_test.module @@ -153,6 +153,23 @@ function form_test_menu() { ); } + $items['form-test/load-include-menu'] = array( + 'title' => 'FAPI test loading includes', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('form_test_load_include_menu'), + 'access callback' => TRUE, + 'file' => 'form_test.file.inc', + 'type' => MENU_CALLBACK, + ); + + $items['form-test/load-include-custom'] = array( + 'title' => 'FAPI test loading includes', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('form_test_load_include_custom'), + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + return $items; } @@ -1182,3 +1199,20 @@ function form_test_two_instances() { $return['node_form_2'] = drupal_get_form('page_node_form', $node2); return $return; } + +/** + * Menu callback for testing custom form includes. + */ +function form_test_load_include_custom($form, &$form_state) { + $form['button'] = array( + '#type' => 'submit', + '#value' => t('Save'), + '#submit' => array('form_test_load_include_submit'), + ); + // Specify the include file and enable form caching. That way the form is + // cached when it is submitted, but needs to find the specified submit handler + // in the include. + $form_state['build_info']['files'][] = array('module' => 'form_test', 'name' => 'form_test.file'); + $form_state['cache'] = TRUE; + return $form; +} |