Пакетные операции
Функции позволяют растянуть обработку форм на несколько запросов, предотвращая таким образом прерывание обработки из-за тайм-аута 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;
}
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 | Создать новый пакет (список) операций. |