diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2009-11-04 04:56:54 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2009-11-04 04:56:54 +0000 |
commit | 59b7e23b566013829bf628c2c188e02f776c965d (patch) | |
tree | 88c34c7b45a25cb158f563c03f0277bd5447f2dc /includes | |
parent | 5d001d94d64b1bd94e7b0064b72b06f68e0e2ed6 (diff) | |
download | brdo-59b7e23b566013829bf628c2c188e02f776c965d.tar.gz brdo-59b7e23b566013829bf628c2c188e02f776c965d.tar.bz2 |
#367567 by sun, effulgentsia, yched, and quicksketch: Use AJAX framework for 'Add more' links.
Diffstat (limited to 'includes')
-rw-r--r-- | includes/ajax.inc | 1 | ||||
-rw-r--r-- | includes/form.inc | 77 |
2 files changed, 37 insertions, 41 deletions
diff --git a/includes/ajax.inc b/includes/ajax.inc index 2701cb0ab..464a3c800 100644 --- a/includes/ajax.inc +++ b/includes/ajax.inc @@ -216,7 +216,6 @@ function ajax_get_form() { // The form needs to be processed; prepare for that by setting a few internal // variables. $form_state['input'] = $_POST; - $form_state['args'] = $form['#args']; $form_id = $form['#form_id']; return array($form, $form_state, $form_id, $form_build_id); diff --git a/includes/form.inc b/includes/form.inc index c3fa149a6..60b870709 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -72,7 +72,7 @@ function drupal_get_form($form_id) { $args = func_get_args(); // Remove $form_id from the arguments. array_shift($args); - $form_state['args'] = $args; + $form_state['build_info']['args'] = $args; return drupal_build_form($form_id, $form_state); } @@ -93,11 +93,17 @@ function drupal_get_form($form_id) { * search_forms(), and user_forms(). * @param &$form_state * An array which stores information about the form. This is passed as a - * reference so that the caller can use it to examine what the form changed + * reference so that the caller can use it to examine what in the form changed * when the form submission process is complete. * The following parameters may be set in $form_state to affect how the form * is rendered: - * - args: An array of arguments to pass to the form builder. + * - build_info: A keyed array of build information that is necessary to + * 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 + * automatically loaded by form_get_cache(). Defaults to the current menu + * router item's 'file' definition, if existent. * - input: An array of input that corresponds to $_POST or $_GET, depending * on the 'method' chosen (see below). * - method: The HTTP form method to use for finding the input for this form. @@ -161,23 +167,22 @@ function drupal_build_form($form_id, &$form_state) { // object, we're hitting the form for the first time and we need // to build it from scratch. if (!isset($form)) { - $form = drupal_retrieve_form($form_id, $form_state); - $form_build_id = 'form-' . md5(uniqid(mt_rand(), TRUE)); - $form['#build_id'] = $form_build_id; - // Record the filepath of the include file containing the original form, // so the form builder callbacks can be loaded when the form is being - // rebuilt on a different path (such as 'system/ajax'). + // rebuilt from cache on a different path (such as 'system/ajax'). // @see form_get_cache() - // @see drupal_retrieve_form() // menu_get_item() is not available at installation time. - if (!defined('MAINTENANCE_MODE')) { + if (!isset($form_state['build_info']['file']) && !defined('MAINTENANCE_MODE')) { $item = menu_get_item(); if (!empty($item['file'])) { - $form['#include_file'] = $item['file']; + $form_state['build_info']['file'] = $item['file']; } } + $form = drupal_retrieve_form($form_id, $form_state); + $form_build_id = 'form-' . md5(uniqid(mt_rand(), TRUE)); + $form['#build_id'] = $form_build_id; + // Fix the form method, if it is 'get' in $form_state, but not in $form. if ($form_state['method'] == 'get' && !isset($form['#method'])) { $form['#method'] = 'get'; @@ -217,7 +222,6 @@ function drupal_build_form($form_id, &$form_state) { // complete. We need to construct a fresh copy of the form, passing // in the latest $form_state in addition to any other variables passed // into drupal_get_form(). - if ((!empty($form_state['storage']) || $form_state['rebuild']) && $form_state['submitted'] && !form_get_errors()) { $form = drupal_rebuild_form($form_id, $form_state); } @@ -242,6 +246,7 @@ function form_state_defaults() { 'args' => array(), 'rebuild' => FALSE, 'redirect' => NULL, + 'build_info' => array(), 'storage' => NULL, 'submitted' => FALSE, 'programmed' => FALSE, @@ -265,9 +270,6 @@ function form_state_defaults() { * $form_state['clicked_button']['#array_parents'] will help you to find which * part. * - * When getting a form from the cache, the $form_id must be shifted off from - * $form['#args'], so the resulting array can be given to $form_state['args']. - * * @param $form_id * The unique string identifying the desired form. If a function * with that name exists, it is called to build the form array. @@ -323,19 +325,19 @@ function drupal_rebuild_form($form_id, &$form_state, $form_build_id = NULL) { function form_get_cache($form_build_id, &$form_state) { if ($cached = cache_get('form_' . $form_build_id, 'cache_form')) { $form = $cached->data; - // If the original form is contained in an optional include file, load the - // file and re-populate $form_state for subsequent rebuilds. - // @see drupal_build_form() - // @see drupal_retrieve_form() - if (!empty($form['#include_file']) && file_exists($form['#include_file'])) { - require_once DRUPAL_ROOT . '/' . $form['#include_file']; - $form_state['include_file'] = $form['#include_file']; - } global $user; if ((isset($form['#cache_token']) && drupal_valid_token($form['#cache_token'])) || (!isset($form['#cache_token']) && !$user->uid)) { - if ($cached = cache_get('storage_' . $form_build_id, 'cache_form')) { - $form_state['storage'] = $cached->data; + if ($cached = cache_get('form_state_' . $form_build_id, 'cache_form')) { + // Re-populate $form_state for subsequent rebuilds. + $form_state['build_info'] = $cached->data['build_info']; + $form_state['storage'] = $cached->data['storage']; + + // If the original form is contained in an include file, load the file. + // @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']; + } } return $form; } @@ -343,7 +345,7 @@ function form_get_cache($form_build_id, &$form_state) { } /** - * Store a form in the cache + * Store a form in the cache. */ function form_set_cache($form_build_id, $form, $form_state) { // 6 hours cache life time for forms should be plenty. @@ -353,8 +355,12 @@ function form_set_cache($form_build_id, $form, $form_state) { $form['#cache_token'] = drupal_get_token(); } cache_set('form_' . $form_build_id, $form, 'cache_form', REQUEST_TIME + $expire); - if (!empty($form_state['storage'])) { - cache_set('storage_' . $form_build_id, $form_state['storage'], 'cache_form', REQUEST_TIME + $expire); + if (!empty($form_state['build_info']) || !empty($form_state['storage'])) { + $data = array( + 'build_info' => $form_state['build_info'], + 'storage' => $form_state['storage'], + ); + cache_set('form_state_' . $form_build_id, $data, 'cache_form', REQUEST_TIME + $expire); } } @@ -403,11 +409,11 @@ function form_set_cache($form_build_id, $form, $form_state) { * @endcode */ function drupal_form_submit($form_id, &$form_state) { - if (!isset($form_state['args'])) { + if (!isset($form_state['build_info']['args'])) { $args = func_get_args(); array_shift($args); array_shift($args); - $form_state['args'] = $args; + $form_state['build_info']['args'] = $args; } $form = drupal_retrieve_form($form_id, $form_state); @@ -447,7 +453,7 @@ function drupal_retrieve_form($form_id, &$form_state) { // We save two copies of the incoming arguments: one for modules to use // when mapping form ids to constructor functions, and another to pass to // the constructor function itself. - $args = $form_state['args']; + $args = $form_state['build_info']['args']; // We first check to see if there's a function named after the $form_id. // If there is, we simply pass the arguments on to it to get the form. @@ -495,15 +501,6 @@ function drupal_retrieve_form($form_id, &$form_state) { // Otherwise, call the function named after the form id. $form = call_user_func_array(isset($callback) ? $callback : $form_id, $args); $form['#form_id'] = $form_id; - $form['#args'] = $form_state['args']; - - // Whenever this form is (re)built, restore the include file property from - // $form_state, if existent. - // @see drupal_build_form() - // @see form_get_cache() - if (!empty($form_state['include_file'])) { - $form['#include_file'] = $form_state['include_file']; - } return $form; } |