Symfony2のフォームの仕組みはけっこう複雑だ。
- FormType 、FormBuilder、FormViewといった段階的なフォーム生成
- ModelData、NormData、ViewDataという三段階のデータ構造
- handleRequest() した後は値を変更できない
- Entity のプロパティとのひもづけ
関与するクラス、メソッドも多いし、ルールも多い。効率よくトラブルなくフォームを扱うためにはいろいろ必要、というのは、次第に分かってはくるものの、学習コストの高さはいかんともしがたい。
融通を効かせたい場面もある
動的に生成、というほど大げさな話でなかったとしても、場合に応じてフォームの仕様に融通を効かせたい場面はある。
既存のEntityに紐付けられた2つの必須項目テキスト'hoge' 'fuga' があるとする。プラグインによって、これをAコースとし、フォームを減らしたBコースCコースを作りたい。Aコースでは入力必須項目は'hoge' 'fuga' 、Bコースでは'hoge'、Cコースでは入力必須項目はなし。
恐らく普通は、ドロップダウンメニューで選んだコースに合わせて、'hoge' 'fuga' をdisplay:noneにすることで使い分けようとする。
ところがSymfony2は頑強にこれを認めない(ように見える)。
- Cコースでフォームを保存しようとすると画面が動かない。よくよく調べるとdisplay:noneにしたフォームがrequiredで「値がないので保存できない」ことがわかる(しかもdisplay:noneなのでエラー表示も画面に出ない!)
- それでは、とrequiredを外そうとするとできない。データベースの'hoge' 'fuga' の値はnull不可になっている。
つまりデータベースに手を加えるか、コアコードに手を加えるかしなければならない。それが無理なら、ダミーの値を入れるとか。
たしかにデータベースがnull不可なので筋は通っている。
ただ、プラグイン側から手を加えていくと、データベースからHTMLまで、全長を把握して設計しないといけないし、フォームのルールに縛られるので、初心者は戸惑う。