2009/02/22

mergeFormかembedFormか

フォームオブジェクトを使う際にはどちらを使うのがいいのかな、と私も瞬間悩んだけど、sfForm.class.phpやsfPropelForm.class.phpを読んでみると、結構動作が違うね。embedFormForEachはembedFormをかぶせただけなので、それほど違いはないとは思う。未だにバグがあると私は思っているので、使う予定はないけども。

mergeFormの場合

  • 単純にフォームをくっつけたいときに使う
  • 具体的には、FormオブジェクトのDefault値とwidgetSchema、widgetValidatorのみmergeをしている
  • mergeをしているという名前のごとく、widgetのfield値が同じであった場合には、mergeされてしまうので、複数追加することができない
  • mergeされたFormオブジェクトの更新系のメソッド(updateObjectとかdoSave)が呼ばれることはないので、手元のフォームで呼んであげないといけないupdateDefaultFromObjectは、呼ばれる。コンストラクタ内なので

embedFormの場合

  • フォームを入れ子にしたいときに使う
  • embedされたFormオブジェクトは、sfFormクラスのインスタンスオブジェクト$embedFormsに格納される
  • 新しくfieldを指定して、その中にembedするので、embedFormの中のwidgetのfield値が同じであっても構わない(新しいfieldはユニークでなければいけないが)
  • embedされたFormオブジェクトのupdateObject, doSaveが呼ばれる

パッと見た感じ、似たようなもんかなー、と思っていたら、データの保存とかが結構違うのでmergeされたFormクラスのupdateObjectなどを独自で書いている際には、明示してあげないと呼ばれないので、ちょっとビックリする。呼ばれることを前提として書いていたので。。。

あと、sfGuardPluginのsfGuardUserAdminForm.class.phpには、mergeFormが出てくるけど、このupdateObjectってトランザクションを持たずにsaveメソッドを呼んでいるような気がするのだが。。。

というわけでちょっとした自分用のメモ。

Leave a comment

Bloglines feedburner