Пакетные операции

Хочешь помочь с переводом? Это очень просто и быстро. Лишь зарегистрируйся, и можешь тут же начать переводить.

Функции позволяют растянуть обработку форм на несколько запросов, предотвращая таким образом прерывание обработки из-за тайм-аута PHP, позволяя при этом пользователю получать информацию о ходе осуществления текущих операций.

В первую очередь это API разработано для красивой интеграции с Forms API, но также может быть использовано и в обычных скриптах (например, update.php).

Пример:

$batch = array(
  'title' => t('Exporting'),
  'operations' => array(
    array('my_function_1', array($account->uid, 'story')),
    array('my_function_2', array()),
  ),
  'finished' => 'my_finished_callback',
);
batch_set($batch);
// нужно только, если код не в '_submit' обработчике форм
batch_process();

Простая пакетная операция:

// Простой и надуманный пример: загрузить ноды заданного типа для заданного пользователя
function my_function_1($uid, $type, &$context) {
  // Массив $context объединяет в себе контекстную batch-информацию про выполнение (чтение) и
  // 'return values' для текущей операции (запись)
  // Есть такие ключи:
  // 'results' (чтение / запись): Массив результатов gathered so far by
  //   the batch processing, for the current operation to append its own.
  // 'message' (запись): Текстовое сообщение, которое показывается на странице с прогрессом.
  // Следующие ключи доступны в случае многошаговых операций:
  // 'sandbox' (чтение / запись): Массив, который может быть свободно использован для
  //   хранения неизменных данных между итерациями. Рекомендуется  использовать этот массив, 
  //   а не $_SESSION, который небезопасен, если пользователь
  //   продолжает серфить в отдельном окне, в то время как идет пакетная обработка.
  // 'finished' (запись): Число с плавающей точкой от 0 до 1, которое информирует
  //   движок про степень завершения операции.
  //   1 (или, если значение явно не указано) означает, что операция завершена
  //   и пакетный движок может перейти к следующей операции.
 
  $node = node_load(array('uid' => $uid, 'type' => $type));
  $context['results'][] = $node->nid .' : '. $node->title;
  $context['message'] = $node->title;
}
// Более сложный пример: многошаговая операция - загрузить все ноды по 5 штук
function my_function_2(&$context) {
  if (empty($context['sandbox'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node}'));
  }
  $limit = 5;
  $result = db_query_range("SELECT nid FROM {node} WHERE nid > %d ORDER BY nid ASC", $context['sandbox']['current_node'], 0, $limit);
  while ($row = db_fetch_array($result)) {
    $node = node_load($row['nid'], NULL, TRUE);
    $context['results'][] = $node->nid .' : '. $node->title;
    $context['sandbox']['progress']++;
    $context['sandbox']['current_node'] = $node->nid;
    $context['message'] = $node->title;
  }
  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
}

Простой 'finished' коллбек
function batch_test_finished($success, $results, $operations) {
  if ($success) {
    $message = format_plural(count($results), 'One post processed.', '@count posts processed.');
  }
  else {
    $message = t('Finished with an error.');
  }
  drupal_set_message($message);
  // Providing data for the redirected page is done through $_SESSION.
  foreach ($results as $result) {
    $items[] = t('Loaded node %title.', array('%title' => $result));
  }
  $_SESSION['my_batch_results'] = $items;
}

Функции

ИмяОписание
batch_get
includes/form.inc
Получает текущий пакет операций.
batch_process
includes/form.inc
Process the batch.
batch_set
includes/form.inc
Создать новый пакет (список) операций.
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вход в систему