Symfonyと格闘・・・

ここ何日かアレコレメモしながらSymfonyと格闘していて、特にフォーム周りの実装について研究していたのですが、ようやく出口が見えてきました・・。

おそらく多くの人も既に同じ問題に取り組んでいることだと思いますが、フォームの「確認画面」をスマートに表示するための仕組みをSymfonyの上に構築しようとして悪戦苦闘していました・・。

Symfonyの仕組みを素直に使う場合は、入力画面と確認画面とでアクションを分け、それぞれ別のテンプレートを用意するというのがオーソドックスな手法かと思います。
しかしこの方法だと、入力画面と確認画面とで(内容がほとんど同じで若干異なる)別のファイルを用意しなくてはならず、開発時に手間になってしまいます。(似て非なるものを複数用意するのは、メンテナンス性が非常に悪くなります・・・)


次にやるのが、1つのアクション(例えばindexアクション)で入力画面も確認画面も処理する方法で、この場合はテンプレートを1つのファイルにまとめて、テンプレートの中で入力画面なのか、確認画面なのかを判断してそれぞれのフォーム要素の表示を分岐させます。

フォームのhiddenやセッションなどに状態を持たせておけば、この切り替えフラグ自体は簡単に実装できます。

今回つまづいたのは、このフラグの値に応じてフォーム要素を「通常のタグ表示」と「値のみ表示+hidden埋め込み」とで切り替えようとしたからです。
フォーム要素を定義するsfForm派生クラス内で、各要素に対してsfWidgetFormInputなどのウィジェットオブジェクトを割り当てますが、このウィジェットは「表示をhiddenに切り替える」という処理には対応していないんです。
もちろん、要素の値そのものは取得できますから、テンプレートに無理やりhiddenタグを書くことはできますが、スマートじゃないですよね・・・。

そこで、HTML_QuickFormのfreezeをまねた内部にフラグを持つ派生クラスをアレコレ作りました。
テンプレート内では、通常の要素表示(sfFormField->renderが呼び出される)の記述のまま、freezeされた場合はinputタグなどの表示から、入力値+hiddenタグの表示に自動的に切り替わるようにしてみました。


# HTML_QuickFormを組み込め、と言われそうですが・・・w
# HTML_QuickFormとsymfornyのsfForm間での値の橋渡し/2重管理を避けたいと考え、
# このようにしました。


まだsymfonyの各クラスのソースを読み込めていないので、理解不足な点もいろいろありそうです。
(こうやれば簡単にできるよ!、とかありそうです)

とりあえず今回は一応出口が見えてきたので、このまま進んでみたいと思います。