Zend_Form_DisplayGroupを使った場合の要素追加

フォームの表示をカスタマイズしていくうえで、DisplayGroupはとても便利なのだが、DisplayGroupはSubFormと違って、要素自体は上位のFormに保持させたままにしたいというコンセプトのはず。
確かに初期的な使い方で、formに追加済みの要素を元にaddDisplayGroupした直後までは問題なく動作する。
問題は、DisplayGroupを追加済みでそのあとに要素を追加した場合。
DisplayGroupにはaddElementというメソッドがあるのだが、
$form->addElement($element);
$form->getDisplayGroup("hoge")->addElement($element->getName());
した場合は要素が2重に表示されてしまい、単純にグループにaddElementしただけでは全く表示されないし、データをロードできないので検証もできない。

ということで、ZF-3496に1票。
http://framework.zend.com/issues/browse/ZF-3496

ところで、$form->addDisplayGroupにはDisplayGroupのインスタンスは投入できない。その代わり、$form->addDisplayGroupsにならarray($group)することで、投入できる。
ただし、単純に投入しただけでは、ZF-3496と同じ問題が発生してしまうので、この件はZF-3496が修正されたら、あげてみることにする。

対応策を考えてみる

http://d.hatena.ne.jp/noopable/20090123/1232690745
ここでも言及したが、PrepareElements.phpと同じ動作をさせるようなデコレーターを用意してやる。
どのみちDisplayGroupは表示用なわけで、DisplayGroupの準備は要素追加がすべて終了してから行えばよいともいえる。
だとすれば、フォームオブジェクトからDisplayGroupへの要素移行は最終段階まで待って一気に処理するという手が考えられる。
もしくはaddElementでの処理漏れをケアできるデコレーターを割り当ててやればよい。
・・・ちょいとバッドノウハウ気味だが。