diff --git a/includes/batch.inc b/includes/batch.inc index 5cdcec0bd905543cf1a2ac05c087ffa743ecdcf2..095b9e78b9f6568081220eccd2952928b131c86e 100644 --- a/includes/batch.inc +++ b/includes/batch.inc @@ -445,7 +445,10 @@ function _batch_finished() { // If no redirection happened, save the final $form_state value to be // retrieved by drupal_get_form() and redirect to the originating page. $_SESSION['batch_form_state'] = $_batch['form_state']; - drupal_goto($_batch['source_page']); + $function = $_batch['redirect_callback']; + if (function_exists($function)) { + $function($_batch['source_url'], array('op' => 'finish', 'id' => $_batch['id'])); + } } } diff --git a/includes/form.inc b/includes/form.inc index 82d84b4f8f5c7636bf5d221ff918adf4a77bc885..ce7171e28ba31569730173cba8688bf73eab74ce 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -2895,25 +2895,34 @@ function batch_set($batch_definition) { * @param $url * (optional - should only be used for separate scripts like update.php) * URL of the batch processing page. + * @param $redirect_callback + * (optional) Specify a function to be called to redirect to the progressive + * processing page. By default drupal_goto() will be used to redirect to a + * page which will do the progressive page. Specifying another function will + * allow the progressive processing to be processed differently. */ -function batch_process($redirect = NULL, $url = NULL) { +function batch_process($redirect = NULL, $url = 'batch', $redirect_callback = 'drupal_goto') { $batch =& batch_get(); drupal_theme_initialize(); if (isset($batch)) { // Add process information - $url = isset($url) ? $url : 'batch'; $process_info = array( 'current_set' => 0, 'progressive' => TRUE, - 'url' => isset($url) ? $url : 'batch', + 'url' => $url, 'source_page' => $_GET['q'], 'redirect' => $redirect, 'theme' => $GLOBALS['theme_key'], + 'redirect_callback' => $redirect_callback, ); $batch += $process_info; + // The batch is now completely built. Allow other modules to make changes to the + // batch so that it is easier to reuse batch processes in other enviroments. + drupal_alter('batch', $batch); + if ($batch['progressive']) { // Clear the way for the drupal_goto() redirection to the batch processing // page, by saving and unsetting the 'destination', if there is any. @@ -2948,7 +2957,10 @@ function batch_process($redirect = NULL, $url = NULL) { // Set the batch number in the session to guarantee that it will stay alive. $_SESSION['batches'][$batch['id']] = TRUE; - drupal_goto($batch['url'], array('op' => 'start', 'id' => $batch['id'])); + $function = $batch['redirect_callback']; + if (function_exists($function)) { + $function($batch['url'], array('op' => 'start', 'id' => $batch['id'])); + } } else { // Non-progressive execution: bypass the whole progressbar workflow diff --git a/includes/update.inc b/includes/update.inc index 89deb3ba91d5c0e0169c7195ba4d1d1422196e15..a4005d3ef21393502e2c74f38ae1652088714281 100644 --- a/includes/update.inc +++ b/includes/update.inc @@ -361,8 +361,11 @@ class DrupalUpdateException extends Exception { } * scripts like update.php). * @param $batch * Optional parameters to pass into the batch API. + * @param $redirect_callback + * (optional) Specify a function to be called to redirect to the progressive + * processing page. */ -function update_batch($start, $redirect = NULL, $url = NULL, $batch = array()) { +function update_batch($start, $redirect = NULL, $url = NULL, $batch = array(), $redirect_callback = 'drupal_goto') { // During the update, bring the site offline so that schema changes do not // affect visiting users. $_SESSION['maintenance_mode'] = variable_get('maintenance_mode', FALSE); @@ -393,7 +396,7 @@ function update_batch($start, $redirect = NULL, $url = NULL, $batch = array()) { 'file' => 'includes/update.inc', ); batch_set($batch); - batch_process($redirect, $url); + batch_process($redirect, $url, $redirect_callback); } /**