フォームフレームワークを使おう!
フォーム要素の登録方法
スクリプトを見るとわかるとおり、アクション・テンプレート内ではフォームの設定はされません。というのも、フォームの設定はすべてフォームクラスで行うからです。デフォルトのフォームクラスを拡張して要素を登録する方法については、自動生成されたlib/form/base/BasePostForm.class.phpが参考になります。
BasePostFormクラスを継承したPostFormを拡張することで、フォーム要素やバリデーションを追加することができます。まず、フォーム要素の追加についてですが、ウィジェット(Widget)と呼ばれウィジェットオブジェクトをフォームクラスに追加します。setWidgetsメソッドの配列形式で定義されたウィジェットが登録されます。バリデーションについても同様に、バリデーションオブジェクトをフォームクラスに追加します(図2)。あとはテンプレートで$form['sample']を出力すればタグが追加されます。
このようにして追加した独自のフォーム要素をデータベース登録時に使用する場合は、PostFormクラスのupdateObjectメソッドを拡張します。
バリデーションの方法
現状ではsymfony 1.0のようにYAMLでバリデーションを定義できず、フォームクラス内でバリデーションの定義を行います。複数のバリデーションを実行する場合は、すべてのバリデーションがエラーが発生しないことを確認するか、ひとつでもバリデーションを通ればエラーを発生させないようにするかを選択することができるようになっています。
複数のバリデーションを定義するには、図2のようにバリデータを定義します。
sfValidatorAndを使用するとすべてのバリデータが実行されて、1つでもエラーがあればエラーを返します。sfValidatorOrを使用すると、順番にバリデータが実行され、1つでもエラーが発生しないものがあれば、エラーとはみなされません。