単一の操作でバッチを生成するコードがあります。 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
は発砲しないようです。
処理中にアイテムをバッチキューに動的に追加することは可能ですか?
私は本当にかなり近くにいました!いつものように、ここで質問をすると、答えが明らかになります。
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%と見なされ、開始する前に完了します。
これが他の人の役に立つことを願っています:)