Batch processing is the execution of a series of jobs in a site without manual intervention each on a set or “batch” of inputs, rather than a single input. Batch operations in Drupal API is primarily designed to integrate nicely with the Form API workflow, but can also be used by non-Form API scripts.
1) Build a url using hook_menu to execute batch process.
/**
* Implements hook_menu().
*/
function MYMODULE_menu() {
$items = array();
// Create a page with URL admin/batch
$items['admin/batch'] = array(
'title' => 'Demo Batch',
'description' => 'Run batch operations.',
'page callback' => 'drupal_get_form',
'page arguments' => array('MYMODULE_batch_form'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
2) Callback function for batch process MYMODULE_batch_form.
/**
* Callback function.
* Create submit button in the form on admin/batch page
*/
function MYMODULE_batch_form(){
$form = array();
$form['submit'] = array('#type' => 'submit', '#value' => t('Start batch process'));
return $form;
}
3) Submit function to set batch process. This just passes a function name to the batch API. The referenced function should build the array which tells batch API what to do.
/**
* Submit function for form.
* Set the batch process to start on form submit.
*/
function MYMODULE_batch_form_submit($form, $form_state){
batch_set(MYMODULE_build_batch());
}
4) Create the list of operations to call when the batch starts. Here we essentially build an array of future function calls, with arguments, and a finished function.
The important thing here is the $operations array. When the batch starts it will loop through $operations array.
/**
* Generate batch process & its operations.
*/
function MYMODULE_build_batch() {
$operations = array();
// Here we can add multiple operation
$operations[] = array('MYMODULE_process_data', array($arg1)); // operation with argument
$operations[] = array('MYMODULE_process_data'); // operation without argument
//Define your batch operation here
$batch = array(
'title' => t('Batch operation processing'),
'operations' => $operations,
'finished' => 'MYMODULE_build_batch_finished',
'init_message' => t('Initializing...'),
'progress_message' => t('Operation @current out of @total.'),
'error_message' => t('Found some error here.'),
'file' => drupal_get_path('module', 'MYMODULE') . 'MYMODULE.module',
);
return $batch;
}
5) Create the operation code. This is the actual operation part – the thing that does the work. The arguments it receives will come from the $operations[] loop in step 4 above. Note the additional $context argument. This is in addition to the ones we provided in step 4 and lets us converse with the batch. This is useful for passing back status messages, etc.
/**
* This is the function that is called on each operation of batch process.
*/
function avert_replace_url_ru_batch_process($arg1 = '', &$context) {
// Optional message displayed under the progressbar.
$context['message'] = t('Now Processing....');
$updated = FALSE;
try {
LOGIC FOR YOUR OPERATION...
$updated = TRUE;
}
catch (\PDOException $e) {
$error = $e->getMessage();
}
if ($updated) {
drupal_set_message("Updated.");
}
}
6) Let the user know we have finished and if there were any errors.
/**
* Batch finished
* Function runs after batch process finishes.
*/
function avert_replace_url_ru_build_batch_finished($success, $results, $operations) {
if ($success) {
// Here we could do something meaningful with the results.
// We just display the number of data we processed.
drupal_set_message(t('@count tables processed.', array('@count' => count($results))));
} else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
drupal_set_message(t('An error occurred while processing @operation with arguments : @args', array('@operation' => $error_operation[0], '@args' => print_r($error_operation[0], TRUE))));
}
}
Feel free to contact us in-case of any concern/queries regarding the shared Blog or Drupal Development Services.
Happy to help always 🙂