xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Выполнить очередь с помощью Batch API

Опубликовано

Пример выполнения очереди products_import с помощью Batch API:

class ProductsImportForm extends FormBase {
 
  /**
   * {@inheritDoc}
   */
  public function getFormId() {
    return 'products_import_form';
  }
 
  /**
   * {@inheritDoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Start'),
    ];
 
    return $form;
  }
 
  /**
   * {@inheritDoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    batch_set([
      'title' => $this->t('Products import'),
      'operations' => [
        // Operation 1
        [
          // Operation callback
          [static::class, 'processQueue'],
          // Operation data
          []
        ]
      ],
    ]);
  }
 
  /**
   * Batch operation.
   */
  public static function processQueue(&$context) {
    $queue = \Drupal::queue('products_import');
    $queue_worker_manager = \Drupal::service('plugin.manager.queue_worker'); /** @var QueueWorkerManagerInterface $queue_worker_manager */
    $queue_worker = $queue_worker_manager->createInstance('products_import');
 
    if (empty($context['sandbox'])) {
      $context['sandbox']['max'] = $queue->numberOfItems();
    }
 
    /** @see \Drupal\Core\Cron::processQueues() */
    if ($item = $queue->claimItem()) {
      $queue_worker->processItem($item->data, $forced_update);
      $queue->deleteItem($item);
    }
 
    if ($queue_items_count = $queue->numberOfItems()) {
      $context['finished'] = ($context['sandbox']['max'] - $queue_items_count) / $context['sandbox']['max'];
      $context['finished'] = min($context['finished'], 0.99);
    }
  }
 
}

При этом очередь products_import уже должна быть наполнена и у неё должен быть рабочий воркер.

Написанное актуально для Drupal 8
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании