Transition コンポーネント - 自分がはまったところ

とっても便利なTransitionコンポーネントですが、自分が使ったときには1つはまったことがありました。それは確認画面で Transtion#automate を使用した場合の流れです。
その前にちょっと説明しておかないといけないのは、このTransitionコンポーネントを使った場合のテンプレートの記述ですが、formのアクションの指定は自分自身のアクションになります。step1アクションに対するフォームは以下のようになると思います。

<div class="foo form">
    <?php e($this->Form->create('Foo', array('action' => 'step1')) . PHP_EOL); ?>
    <fieldset>
      <?php e($this->Form->input('first_name') . PHP_EOL); ?>
      <?php e($this->Form->input('last_name') . PHP_EOL); ?>
    </fieldset>
    <?php e($this->Form->end(__('Step2', true)) . PHP_EOL); ?>
</div>

すでに説明したように自分自身にデータをPOSTしてその結果アクション側で次のアクションへリダイレクトするので、このフォームで次のアクションを指定してはいけません。

で、問題の確認画面です。フォームの下には確認画面から完了画面へ遷移する次のようなフォームを書くと思うのですが・・・

<div class="foo form">
        :
      (入力されたデータの表示)
         :
    <p>上記の内容でよろしいですか?</p>
    <?php e($this->Form->create('Foo', array('action' => 'confirm')) . PHP_EOL); ?>
    <?php e($this->Form->end(__('Add', true)) . PHP_EOL); ?>
</div>

この確認でsubmitしても完了画面へ進まないんですよね。

ちなみに確認用のアクションの記述は以下のようになってましたね?

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

なぜダメなんだろうと結構悩みました。モデルの指定は false にしてるのでバリデーションはスルーさせているからバリデーションエラーが発生しているわけでもありません。

で、なぜダメかというとPOSTデータがないからです。Transition#automate 内でよばれる Transition#checkDataはPOSTデータがないとバリデーション→リダイレクトの処理を行ってくれないので、なんらかのPOSTデータ(正確に言うと$controller->data)が発生するようなフォームになってないとautomateはリダイレクトしてくれません。

というわけで、この部分はお気をつけを。