いうわけで、コマンドを実行してスキーマとフィクスチャーを読み込ませましょう。databases.ymlは各環境に合わせて設定してください。今回はちょっとしたサンプルなのでSQLiteを使います。cc細かいオプションなどが知りたい場合は、以下のコマンドを実行してヘルプを参照してください。doctrine:buildこれで、データベースとテーブルの作成、モデル・フォーム・フォームフィルタークラスの作成、フィクスチャーの読み込みが行われました。毎度のことながら楽にできて助かります。フォームフィルタークラスはlib/filter/doctrineディレクトリ内にあります。モデルに対応したフォームフィルタークラスになります。クラスファイルを見てもいいのですが、動かすほうが楽しいと思うので、一気にモジュールとアクションを作成して動かしましょう。methodgenerate:appタスクですが、1.3/1.4からはデフォルトでエスケーピングの有効化とCSRFトークンの指定を行ってくれるようになりました。この状態でXSSとCSRF対策はされています。これでmethodモジュールができたのでindexアクション内で検索ロジックを実装しましょう。$this->form_filter->getQuery()->execute();}}}}フォームオブジェクトをご存知の方ならば見慣れたコードでしょう。う流れはフォームオブジェクトとほぼ同じです。検索なのでPOSTではなくGETで行うため、値が渡ってきているかどうかで判定しています。フォームと違うのはフォームフィルターオブジェクトに対してgetQuery()というメソッドを発行しているところでしょう。フォームでは通常、バリデーションをパスした後にsave()メソッドを実行して、入力内容をデータベースに保存します。ジェクトを取得します。今回は触れませんが、Propelの場合はQueryがCriteriaになると思ってください。残るはテンプレートです。早く動かしたいのでできる限り簡潔にします。?>フォームフィルターはフォームを継承しているため、フォームのようにオブジェクト自身をechoすることでウィジェットのレンダリングをまとめて行えます。後はアクションですでに取得しているメソッドオブジェクトのコレクションを表示するためのものです。クラス名の表示をしている個所がありますが、今回は名前空間に対応したテーブル定義をおこなっているので、修飾されたクラス名を出すようにしましょう。getQualifiedName()メソッドがそれです。sfClassクラスに実装しましょう。$this->getQualifiedName();}}__toString()マジックメソッドも、修飾名を返すようにオーバーライドしておきます。これでひとまず実装完了です。ブラウザからこのアクションを確認してみると、検索フォームが出来上がっていると思います。◆フォームフィルターの仕組みと拡張方法フォームフィルターの内部を探るため、フォームとフォームフィルターを見比べてみましょう。lib/filter/doctrine/base/BasesfMethodFormFilter.class.phpとlib/form/doctrine/base/BasesfMethodForm.class.phpを開いてみてください。ウィジェットとバリデータの定義が違います。入力された値の使い方が違うのでこれは当然ですね。with_emptyオプションをtrueにすると、値が空であるかどうかを判定するためのチェックボックスが付くようになります。descriptionに対してwith_emptyをtrueに設定してみると、ブラウザでは以下のようになります。これではルーティングのsf_methodとかぶるので、nameFormatを変更するなりしないといけないですね。語なのでsfを付けてみたのですが、アダになっちゃいましたね。今回はsfMethodFormは使わないのでこのまま進めます。)この2つのクラスファイルの中でもっとも異なる部分と言えば、フォームフィルター側にあるgetFields()メソッドの存在でしょう。'Text',);}これはそれぞれのフィールドが、どのようにして入力された値を検索条件としてクエリ−に追加するかを指定しています。メソッド名で実装されています。1.4.0では以下のようなものが実装されています。◆addDateQueryfromとtoに対してどちらもis_emptyにチェックが入っている場合はNULLかどうか、それ以外の場合はfromに入力があればそれ以降、toに入力があればそれ以前の日付を指定なお、TextとNumberの場合は必ずsfWidgetFormFilterInputウィジェットを、Dateの場合はsfWidgetFormFilterDateを使うようにしてください。それ以外ではこの2つのウィジェットは使用してはいけません。is_emptyが入る関係で、method[name][text]に値が、method[name][is_empty]に空かどうかのフラグが入って渡されるので、うまく条件指定ができなくなってしまいます。値が空の場合はそもそもメソッドが呼ばれずに処理が飛ばされます。空であることに対して処理を追加することはできません。null)となり空とは判定されないので、拡張をする場合には注意が必要です。ちなみにこれらのデフォルトのタイプがどのように判定されるかは、sfDoctrineFormFilterGenerator::getType($column)に記述されています。以下のような条件でカラムの型を判定して設定しています。'Text';}}ちなみにこれらの汎用的な条件指定メソッドはもちろん自分で追加することができます。add{$type}Queryメソッドを実装すれば、それらが使えるようになります。BaseFormFilterDoctrineに実装する例です。$values['text'].'%');}}といってもaddTextQuery()をパクってきただけですが。引数として、ベースとなるクエリ−オブジェクト、フィールド名、値が渡されます。らをもとにしてクエリ−を変更していきます。ここで注意したいのは、クエリ−のルートとなるモデルのみにしか指定ができないことです。sfMethodFormFilterでsfClassのnamespaceを検索対象にするにはどうすればいいのでしょうか。namespaceを指定するかの2点になります。(1)のクエリ−オブジェクトにJOINする方法です。作成しているのは、実際にクエリーの構築を行っている、sfFormFilterDoctrine::doBuildQuery()メソッドになります。クエリーを作成している部分をみてみましょう。...}オプションにqueryがセットされていればそのクエリーが使われ、デフォルトでは対応するモデルのテーブルからcreateQuery()メソッドでクエリーを作成しています。デフォルトではrというエイリアスが割り当てられています。$this->getTableMethod()からメソッド名を取得して、クエリーに処理をフックさせることも可能なようです。getTableMethod()メソッドはオプションにtable_methodがセットされている場合はそれを取得するようです。formattersymfonyのフォームライブラリsfFormを使ってフォームを表示する場合、フォームの各要素はデフォルトではテーブルの行として以下のようなHTMLタグで出力されます。/></td></tr>フォーマッタは、デフォルトの「table」以外に「list」も用意されています。(これらはそれぞれ、sfWidgetFormSchemaFormatterTableとsfWidgetFormSchemaFormatterListに対応します)フォーマットをlistに変更するには、フォームの設定を行っている部分で以下のようにします。:こうすると、次のようなHTMLタグで出力されます。/></li>出力されるタグのカスタマイズさて、出力されるタグを、独自クラスを指定したdivタグに変更する場合はどうするのでしょうか。Action)では、「テンプレートのカスタマイズ」のやり方しか書かれていません。Frameworkこの方法ではテンプレートに直接フォーム要素を埋め込んでいくので、デザインに対しては柔軟になるのですが、フォーム要素を追加したり変更したりする場合にはテンプレートも合わせて修正しなくてはならないので、開発効率はかなり低下します。フォーマッタの出力とテンプレートのカスタマイズの中間くらいのことをやりたいですよね。そこで、sfWidgetFormSchemaFormatterListクラスを真似た、myWidgetFormSchemaFormatterDivクラスを次のように作成します。class=\"formcontent\">\n%content%\n</div>\n";}このフォーマッタを使用するために、formクラスのsetupメソッドで、次のようにフォーマッタを追加してデフォルトに設定します。:こうすると、myWidgetFormSchemaFormatterDivクラスのフォーマット設定でフォームがレンダリングされます。上のサンプルコードではsetDefaultFormFormatterNameメソッドでフォーマッタを変更しましたが、同じような機能を持つsetFormFormatterNameメソッドがあります。2つの違いは、クラスのスタティック変数としてフォーマッタ名を保存するか、インスタンスのメンバ変数として保存するかです。ムオブジェクトを使用し、それぞれで別のフォーマッタを利用したい場合は、setFormFormatterNameを使用するということですね。1.2ライセンス:GFDL原文の最新バージョンはhttp://www.symfony-project.org/book/forms/1_2/を参照して下さい。フォームのテンプレートフォームのテンプレートフォームがカスタマイズされたので、表示する必要があります。フォーム用の~テンプレート~は新しい求人を作るもしくは既存のものを作りたい場合は同じです。~パーシャル~でレンダリングされます。必要なJavaScriptとスタイルシートをインクルードします。POSTもしくはPUTへの~HTTPメソッド~を変更します。フォームがファイル入力タグを持つ場合これはmultipart属性も考慮します。?>はフォームウィジェットをレンダリングします。?>はフォームウィジェットをテーブルの列としてレンダリングします。場合、フォームのレイアウトをカスタマイズすることが必要になります。グローバルエラーの配列をレンダリングするフォームはフィールドの配列のようにも振る舞います。$form['company']でcompanyフィールドにアクセスできます。?>フォームのアクションフォームクラスをこれをレンダリングするテンプレートが用意されました。これを~アクション~と実際に連携させてみましょう。uzuralife.com。