Zend_Form::setElementsBelongTo()

http://d.hatena.ne.jp/noopable/20090117/1232166473
ここで、ElementにsetNameした理由というのが、Zend_Dojo_FormなどのAjaxを利用した画面構成を行う時に、同一の要素名を持ったエレメントを"ドキュメント内"に複数持つことができないため。
Zend_Formは1.5のころからこの問題をsetElementsBelongToで解決している。
このメソッドに引数を渡すことで、ID属性、Name属性を配列記法で解決してくれる。
setElementsBelongToに関しては、フォーム作成段階でsetNameしたうえで
$form->setElementsBelongTo($form->getName());
としておけばよさそうだ。

マニュアルの例では同一フォーム内に、同じスーパークラスを持つコンクリートクラスでBelongToを使い分けることで、重複を避けるという使い方になっている。
shipping[address] vs billing[address]
しかし、もう一つの用途としては、フォーム自体はiniファイル等から育成しておくが、別のインスタンスである個別のサブフォームをレンダリングしたい場合。所属する親が違うというよりも、同一の親に対する別のインスタンスという意味をIDに付加したいところだ。

たとえば、アイテムフォームなどで、複数アイテムのフォームをグリッドに配置したいとか。そうすると
item[1][title] item[2][title]
といった形にインスタンスを追加した段階で、なんらかのIdentifierを元にスタックしていきたい。また、要素だけではなく、そもそもサブフォームの名前を配列にしたいという気もする。
なぜなら、同一のコンフィグを元に作られたフォームの名前は同一になってしまうが、これもDOM上よろしくない。
コンフィグ上はitemという名前のフォームであったとしても、親フォームに登録したときにitem[1]という名前にsetNameできればいいのだが、Zend_Form::setNameの仕様でarrayNotationがフィルターされて使えない。
setAttribすれば、使えるには使えるが、こんな抜け道の使い方でいいのかどうか。

さて具体的な実装としてはaddSubForm段階で意味のない固有のシーケンスを振っていく方法と、コントローラーでシーケンスを発生させて与えていく方法があるかもしれない。
なるべく拡張せずに実装していく方法をちょっと検討してみる。


setElementsBelongToに関しては、
http://framework.zend.com/manual/ja/zend.form.advanced.html
http://framework.zend.com/issues/browse/ZF-5222
これも一応目を通しておく