とっても便利なTransitionコンポーネント

昨日のブログでもちらっと書いたけど、仕事で便利に使わせてもらっているTransitionコンポーネントについていくつかの記事に分けて書いてみる。本当に便利なのにあまり情報がないのは、みんななんの問題もなくさらっと導入できているからなのかな?

Transitionコンポーネントid:hiromi2424 さんによるCakePHPコンポーネントです。

24時間CakePHP:Transitionコンポーネント1.0をリリースします。

このコンポーネントがサポートするのは「入力→確認→完了」という流れの入力部分が複数になるパターン。ウィザード的な流れや項目が多くて複数ページにわたるアンケートとかがそういうものに当てはまると思う。
このコンポーネントCakePHPのコーディングスタイルをうまくパターン化できていて、入力部分が複数なくても使いたくなるコンポーネントだと思う。まぁ、日本では定番の確認画面を毎回毎回同じようなコードを書いているのはばからしくなるのでこういうものがあるととても便利だと思う。

実際に使用するのは以下のメソッドになる。

  • $this->Transition->checkData(...)
  • $this->Transition->automate(...)
  • $this->Transition->checkPrev(...)
  • $this->Transition->allData()
  • $this->Transition->mergedData()
  • $this->Transition->clearData()

これらを使って以下のように記述する。

class FooController extends AppController {
  public $uses = 'Foo';
  public $components = array('Transition');

  public function step1()
  {
    // Fooモデルでバリデーションして問題がなければ step2 へリダイレクト
    $this->Transition->checkData('step2');
  }

  public function step2()
  {
    // step1 から遷移したことをチェックし、
    // Barモデルでバリデーションして問題がなければ step3 へリダイレクト
    $this->Transition->automate('step3', 'Bar', 'step1');
  }

  public function step3()
  {
    // step2 から遷移したことをチェックし、
    // Bazモデルでバリデーションして問題がなければ confirm へリダイレクト
    this->Transition->automate('confirm', 'Baz', 'step2');
  }

  public function confirm()
  {
    // step3 から遷移したことをチェックし、add へリダイレクト
    this->Transition->automate('add', false, 'step3');
    // 各画面で入力されたデータをマージする
    $post = $this->Transition->mergedData();
    $this->set('post', $post);
  }

  public function add()
  {
    // step1/step2/step3 から遷移したことをチェック
    $this->Transition->checkPrev(array('step1', 'step2', 'step3'));
    $data = $this->Transition->mergedData();
    if ($this->Foo->saveAll($data)) {
      $this->Transition->clearData();
    } else {
      $this->redirect(array('action' => 'confirm'));
    }
  }
}

上記の例のように各画面ごとにアクションを割りあてて、1つのアクションごとにバリデーションするモデルを割り当てるとそれでチェックが働いて、問題があればそのアクションでエラー表示を行い、問題がなければ次の画面へリダイレクトするというとてもわかりやすく記述量もとても少ないものになっています。

それぞれのメソッドについては別の記事にして書く。