На формі відобразили форму для запуска пакетних операцій. Для зручності на формі можна розміщувати submit'и для всіх обробок, що застосовуються. Після submit'а форми виконується функція module_batch_submit().
/**
* batch submit function
*/
function module_batch_submit($form, &$form_state) {
$batch = array(
'title' => t('Process'),
'init_message' => t('Process'),
//В следующем парметре возможно использования таких placeholders: @current, @remaining, @total, @percentage, @estimate and @elapsed. По умолчанию - t('Completed @current of @total.')
'progress_message' => t('In progress @current'),
//По умолчанию значение - t('An error has occurred.')
'error_message' => t('Warning! Error!'),
'operations' => array(
array('operations_function', array()),
),
'finished' => 'module_finished_callback',
//Путь к файлу где находится функция указанная в 'operations' и 'finished'
'file' => 'module.inc',
);
batch_set($batch);
batch_process();
}
Такий запис забезпечує виклик обробки. Формуємо масив $batch, в якому вказуємо назву, функцію, що виконує обробку і функцію завершення обробки. batch_set() - відкриває нову обробку. batch_process() - здійснює обробку.
/**
* batch
*/
function operations_function(&$context) {
if (empty($context['sandbox'])) {
//задаем стартовые переменные, в переменной $context['sandbox']['max'] указываем
//количество элементов
$context['sandbox']['progress'] = 0;
$context['sandbox']['current_node'] = 0;
$context['sandbox']['max'] = db_result(db_query("SELECT COUNT(`nid`) FROM {node}"));
}
$limit = 10;
// указываем количество обратавыемых элементов за шаг. Чем меньше тем медленее но
//надежнее
$result = db_query_range("SELECT `nid` FROM {node} WHERE `nid` > %d", $context['sandbox']['current_node'], 0, $limit);
while ($row = db_fetch_object($result)) {
$node = node_load($row->nid, NULL, TRUE);
$context['results'][] = $title . '-' . $nid;
$context['sandbox']['progress']++;
$context['sandbox']['current_node'] = $nid;
$context['message'] = $node->title
}
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
Також описуємо функцію завершення операцій.
/**
* finishig of batch
*/
function module_finished_callback($success, $results, $operations) {
if ($success) {
$message = 'Process finished success';
}
else {
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
}
drupal_set_message($message);
}
Функція завершення провіряє чи успішно пройшли операції обробки і видає повідомлення.