web-dev-qa-db-ja.com

その場でバッチキュー操作にアイテムを追加する

単一の操作でバッチを生成するコードがあります。 APIにアクセスしてデータを取得します。このデータは任意の数のアイテムである可能性があります。

最初の操作中に、バッチの残りの操作を入力できるようにしたいと思います。

私はこれを試しましたが、うまくいかないようです...

バッチ初期化(drushコマンドコールバック):

function example_drush_sync_entries() {
  $batch = array(
    'operations' => array(
      array('_example_fetch_data', array())
    ),
    'finished' => '_example_batch_finished',
    'title' => t('Processing'),
    'progress_message' => '',
    'error_message' => t('The update has encountered an error.'),
  );

  batch_set($batch);
  $batch = &batch_get();
  $batch['progressive'] = FALSE;

  drush_backend_batch_process();
}

function _example_fetch_data(&$context) {
  $response = drupal_http_request('http://blah.com/data');
  $data = $response->data;
  $data = drupal_json_decode($data);

  $batch = &batch_get();
  $batch_set = &$batch['sets'][$batch['current_set']];
  foreach ($data as $entry) {
    $batch_set['operations'][] = array('_example_process_entry', array($entry));
  }
  print_r($batch);

  _batch_populate_queue($batch, $batch['current_set']);
}

function _example_process_entry($entry, &$context) {
  print_r(func_get_args());
}

私は見えます $batchには新しい操作のロードがありますが、_example_process_entryは発砲しないようです。

処理中にアイテムをバッチキューに動的に追加することは可能ですか?

2
Nick

私は本当にかなり近くにいました!いつものように、ここで質問をすると、答えが明らかになります。

function example_drush_sync_entries() {
  $batch = array(
    'operations' => array(
      array('_example_fetch_data', array())
    ),
    'finished' => '_example_batch_finished',
    'title' => t('Processing'),
    'progress_message' => '',
    'error_message' => t('The update has encountered an error.'),
  );

  batch_set($batch);
  $batch = &batch_get();
  $batch['progressive'] = FALSE;

  drush_backend_batch_process();
}

function _example_fetch_data(&$context) {
  $response = drupal_http_request('http://blah.com/data');
  $data = $response->data;
  $data = drupal_json_decode($data);

  $batch = &batch_get();
  $batch_next_set = $batch['current_set'] + 1;
  $batch_set = &$batch['sets'][$batch_next_set];
  foreach ($data as $entry) {
    $batch_set['operations'][] = array('_example_process_entry', array($entry));
  }
  $batch_set['total'] = count($batch_set['operations']);
  $batch_set['count'] = $batch_set['total'];

  _batch_populate_queue($batch, $batch_next_set);
}

function _example_process_entry($entry, &$context) {
  var_dump($entry['id']);
}

注目すべき違い:*操作は、現在のセットではなく、次のセットに追加する必要があります。 *合計とカウントを定義する必要があります。そうしないと、進行状況のパーセンテージは100%と見なされ、開始する前に完了します。

これが他の人の役に立つことを願っています:)

3
Nick