やり直しましょう。
モジュール作成
例/example.info
name = example description = "example batch" core = 7.x version = "7.x-0.1"
例/example.module
<?php function example_menu() { $items["example"] = array( "title" => "Example", "type" => MENU_NORMAL_ITEM, "page callback" => "drupal_get_form", // , "page arguments" => array('example_form'), // 'access arguments' => array('administer site configuration'), ); return $items; } // , example_form function example_form($form, &$form_state) { $form["submit"] = array( '#type' => 'submit', '#value' => t('Submit') ); $form["#action"] = url("example"); return $form; }
ここには、システムにメニュー項目を登録する基本モジュールがあり、クリックするとボタンのあるフォームが表示されます。 このアイテムは、サイトを構成する権限を持つユーザー、つまり、リンクはもちろん、ページはもちろん、Drupalも表示されないユーザーのみが利用できます。
フォーム処理とバッチ操作の登録
例/example.module
// function example_form_submit() { $batch = array( 'title' => t('import'), 'operations' => array( array('example_batch_0', array($_SERVER['REQUEST_TIME'])), // array('example_batch_1', array($_SERVER['REQUEST_TIME'])), // ... , ), 'finished' => 'example_batch_finished', ); batch_set($batch);// batch_process();// }
バッチ操作
例/example.module
// , , , &$context function example_batch_0($time, &$context) { if (empty($context['sandbox'])) { // , example_batch_0 $context['sandbox']['progress'] = 0; $context['sandbox']['max'] = 100500; // , } // - // , - $context["result"] $context['message'] = $context['sandbox']['progress']. "/" . $context['sandbox']['max'] ." - ". ($_SERVER['REQUEST_TIME'] - $time) . " sec"; $context['sandbox']['progress']++; if ($context['sandbox']['progress'] < $context['sandbox']['max']) { $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max']; } }
$ context ['sandbox']-サンドボックス、パッケージのこの関数にのみ属するデータ、
(もし)example_batch_1になると、サンドボックスは再びクリーンになります。これにより、現在の操作のどのステップであるかを知ることができます
$ context ['result']-パッケージのすべての機能が実行されるときに利用できるデータの一部
$ context ['message']-ブラウザに送信される文字列。この場合、現在の操作の経過時間と一般的な進行状況が表示されます
$ context ['finished']-この値により、システムは現在の操作が完了したかどうかを把握できます。1または結果が存在しないことは、すべてがここで既に行われていることを意味し、0から1の値はバッチ操作全体の進行状況を表示するために使用されます
バッチ操作の完了
function example_batch_finished($success, $results, $operations) { if ($success) { drupal_set_message('yep'); } else { drupal_set_message('nope', 'error'); } }
$ success-パッケージがエラーなしで完了したことを意味します
$ results-私たちの結果
$オペレーション-異なるパッケージに同じ仕上げを使用できるため、オペレーション
最後に
大きなデータ構造を引数として渡したり、サンドボックスに保存したり、結果に出力したりしないでください。 Drupalは1回の実行で操作を接着できますが、実行間でこれらの構造はデータベースに保存されます。 データベース内の大量のデータは送信されません。
次回、中間データを保存できる場所について。