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

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

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

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

このコンポーネントがサポートするのは「入力→確認→完了」という流れの入力部分が複数になるパターン。ウィザード的な流れや項目が多くて複数ページにわたるアンケートとかがそういうものに当てはまると思う。

続きを読む

Transitionコンポーネント - checkData() について

Transition#checkData は複数入力画面の1画面目で使用することになるメソッドです。

CakePHPでは以下のようなパターンのコードをよく書くと思う。同一アクションでGET/POSTで処理をわけて、POSTできたときは保存してリダイレクトみたいな感じ。

class FooController extends AppController {
  public $uses = 'Foo';
  public function add() {
    if (!empty($this->data)) {
      (POSTデータがきたときの処理)
    }
    (GETでデータがきた場合でも実行する処理)
  }
}
続きを読む

Transitionコンポーネント - checkPrev() について

最初に書いたサンプルでは完了画面に出てきた Transition#checkPrev だけど、この説明をした方が Transition#automate はわかりやすくなるのでこっちを先に。

Transition#checkPrev は引数に指定したアクションからちゃんときているかをチェックします。どうやってチェックしてるかは Transition コンポーネントが管理しているセッションのデータ構造をみた方がわかりやすいと思います。データ構造は以下のような形になってます。

続きを読む

Transitionコンポーネント - さらに込み入った使い方

というわけでTransitionコンポーネントを便利に使わせてもらっているのですが、このコンポーネントはその性格上以下のような制約があります。

- アクションごとにバリデーションを行う場合はそれごとにモデルが必要になる

画面ごとにきっちりとモデルが割り当てれればいいのですが、1つのモデルのフィールドが複数の画面にちらばるとか、全画面の項目を1つのモデルに割り当てたいとかいろいろな事情があると思います。

続きを読む

Transitionコンポーネント - 要望など

ここにも書きつつGithubの方にもpull requestをしてみようかと思ってるんですが、現状のTransitionコンポーネントで以下の点がちょっと困ったので手を入れました。

- 遷移元のアクションの指定がアクション名でしか行えない

続きを読む

ちなみに・・・

PHPMatsuriで断念したアプリは以下のような仕様だったんですよね・・・

  • 入力画面毎にactionを準備するんではなく、入力画面は1つのactionでうけて、たとえばform→confirm→add のように3つのアクションだけで処理する
  • 管理画面で自由に画面数を決めて、入力項目も各画面に自由に配置する
  • 入力画面のstepの切り替えはGETのパラメータで行う

で、なんで実現できないかというとセッションのキーがアクション名だから。まぁがんばって拡張すれば、キーをuriにしたりできたんだろうけど、気がついたのが朝の6時だったから(管理ツールを先に作ったためにこの部分が判明したのが最後の最後だった・・・)心が折れちゃったんですよね・・・

まぁ、そこでコードをしっかり読んだのでこんな記事が書けたんですけどね。まぁ、よしとしよう。