SplDoublyLinkedListでZend_Form_DisplayGroupを拡張する

http://d.hatena.ne.jp/noopable/20090122/1232588081
ここの続きで、

同種のフォームインスタンスを複数格納させる

Zend_Formに複数のSubFormを同一クラスからのインスタンスとして追加していく際、名前の衝突を避けるために連番を実装する必要がある。

それには、コントローラー側でインスタンスを作成するときにどこかにスタティックな連番を保持する機構を作るか、フォームに現在登録されたインスタンス数を問い合わせるような実装で可能ではある。
しかし、連番管理機能に関して言えば、DisplayGroupをうまく調整すればできるのではないか。
フォームにDisplayGroup_Stackを追加し、$stackGroup->append(new Zend_Form_Subform());
このとき、このDisplayGroupの機能として、サブフォームのオリジナル名を取得して配列記法の名前で上書きする。いずれ、SplDoublyLinkedListをコンポジットすることになるかもしれないが、とりあえずArrayObjectでいいか。
で、追加したサブフォームにアクセスする必要があるとすると、appendした時にそのサブフォームを参照で返すか、作成したインデックスを返す。
また、送信された後の検証時にも同じフォームが同じインデックスで追加されていないと具合が悪い。

複数登録させる目的

さて、目的を再確認しておく。

  • 複数のフォームの状態を保持できることを前提として、その中の要素にグリッドが存在したときに、複数の同種フォームを並列操作する
    • たとえば、Zend_Db_Tableで作成したアイテムクラスを用いて、最新10アイテムを取得して同時に複数のアイテムを編集できるようなグリッドフォームを作成するとか。
  • アイテムの作成画面や編集画面で同種のフォームクラスを使うためエレメント名の重複を避ける
  • 同時に複数のアイテムを詳細に編集したり、非アクティブな状態でウインドウ内に保持する。JSのスタックコンテナー的な動きを静的HTMLで実現する(CSSでもできるが)