Drupalのようなバッチ操作

プロジェクトを開発する場合、名刺サイトよりも困難です。多くの場合、大量のデータを処理する必要があります。 多くの場合、顧客は1Cとの統合、既存の価格のインポート、Yandexマーケットへのアップロード、どこからでも移行することを望んでいます。 明らかに、1回の実行で1000個のノードを作成しても機能しません。もしそうであれば、別名バッチ操作役立ちます

やり直しましょう。



モジュール作成


例/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回の実行で操作を接着できますが、実行間でこれらの構造はデータベースに保存されます。 データベース内の大量のデータは送信されません。



次回、中間データを保存できる場所について。



All Articles