Коротко про Batch API

19.04.2011
Автор:

Пакетні операції дають можливість обробляти форми на протязі декількох запитів. Це попереджує обривання обробки через тайм-аут РНР. Також користувачу надається інформація про хід здійснення таких операцій.

Стверджують, що batch був розроблений, в першу чергу, для гармонійної інтеграції з Forms API, хоча часто його використовують в звичайних скриптах, таких як update.php.

Уявімо, що нам необхідно здійснити обробку великої кількості даних. Для початку веб розробнику необхідно створити сторінку в hook_menu.

/**
* Batch form
*/
function module_brand_batch(&$form_state) {
  $form['submit'] = array(
    '#type'         => 'submit',
    '#value'        => t('Start batch'),
    '#description' => t("Make some operations"),
    '#submit'      => array('module_batch_submit'),
  );
  return $form;
}

На формі відобразили форму для запуска пакетних операцій. Для зручності на формі можна розміщувати 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);
}

Функція завершення провіряє чи успішно пройшли операції обробки і видає повідомлення.

Голосів: 1 Рейтинг: 5

Також по темі

1

В цій статті я розкажу і розпишу як оперувати основними хуками із розділів Field API.

Field API - один з розділів Drupal 7 API, які дозволяють нам:

  • створювати поля, що...
2

Швидкість завантежння сторінки в браузері кінцевого користувача - один із ключових факторів популярності вашого сайту. Користувач може не дочекатися...

3

SSH - мережевий протокол рівня сеансів, з його допомогою виконується віддалене управління операційною системою і тунелювання ТСР-з'єднань (наприклад, для передачі файлів).

...

4

Якщо ви знаєте що таке jQuery чи починаєте його вивчати, то напевне вас зацікавить знання про те, як написати свій jQuery плагін. Зробити це досить просто. Прочитавши цю статтю ви зможете...

5

В Drupal по замовчуванню поставлена перевірка пароля користувача при реєстрації. Для її усунення потрібно виконати наступне:

Subscribe to our blog updates