フォーム要素のグループ化
フォームに含まれる要素をいくつかのグループにまとめておくのに、Zend_Formには2つの方法が準備されています。表示上だけのグループ化したい場合のための表示グループと、管理を分けたい場合に利用するサブフォームです。
表示グループは、いくつかのフォーム要素を一つのfieldset内に入れておくための仕組みです。一方でサブフォームは、ある程度親フォームから独立したフォームとしてふるまいます。
ここでは、テキスト要素 user、パスワード要素 pass、そして送信ボタン要素 sendを一つずつ含む例を考えます(リスト1)。グループ化を行わない状態での描画の様子は図1のようになります。
... private function addElements($form) { ... $user = new Zend_Form_Element_Text('user'); ... $form->addElement($user); $pass = new Zend_Form_Element_Password('pass'); ... $form->addElement($pass); $send = new Zend_Form_Element_Submit('send'); $send->setLabel('送信'); $form->addElement($send); }
表示グループ
表示グループはフォーム要素をまとめて描画するための仕組みです。標準では、与えられた複数のフォーム要素を一つのfieldsetタグで囲います。表示グループを作成する方法はいくつかありますが、通常はZend_FormのaddDisplayGroup
メソッドを使用します。
addDisplayGroup
は表示グループを作成し、更にフォームに登録するためのメソッドです。addDisplayGroup
はaddDisplayGroup($elements, $name, $options)
のように3つの引数を取ります(ただし、最後の$options
は省略可能です)。
引数名 | 説明 |
$elements | この表示グループに含まれる要素の名前(配列) |
$name | この表示グループの名前 |
$options | この表示グループへのオプション(省略可能) |
例をリスト2に示します。
public function groupAction() { $form = new Zend_Form; $this->addElements($form); $form->addDisplayGroup(array('user', 'pass'), 'login'); $form->addDisplayGroup(array('send'), 'misc'); ... }
この表示グループによるグループ化を描画した様子は図2のようになり、標準では表示グループごとに線で囲われます。
サブフォーム
サブフォームも表示グループ同様、フォーム要素をまとめておくための仕組みですが、少し毛色が異なります。表示グループは表示の際だけのグループ化なのに対し、サブフォームは名前のとおり、"親"フォームから独立したフォームとして扱われます。
サブフォームはZend_FormのaddSubForm
メソッドで登録することができます。addSubForm($subform, $name, $order)
のように、3つの引数を取ります(ただし、最後の$order
は省略可能です)。
引数名 | 説明 |
$subform | 加えるサブフォームそのもの |
$name | サブフォームの名前 |
$order | サブフォームが描画される順番(省略可能) |
サブフォームは表示グループと違い、独立したフォームとしてふるまいます。なので、作成する方法も通常のフォームと同様、まずインスタンスを作成した後に、そのインスタンスへフォーム要素の追加を行う手順をとります。そして、この作成されたサブフォームをaddSubForm
メソッドで登録することができます。
なお、通常サブフォームはZend_Form_SubFormのインスタンスとして作成します。というのも、Zend_Formのインスタンスで作成してしまうとサブフォームもformタグで囲われてしまい、"親"フォームのformタグと二重になってしまうからです。Zend_Form_Subformを利用すれば、サブフォームはfieldsetタグで囲まれます。Zend_Form_Subformを利用した例をリスト3に示します:
public function subformAction() { $subform = new Zend_Form_SubForm; $this->addElements($subform); $form = new Zend_Form; $form->setAction('/index/hello') ->setMethod('post'); $form->addSubForm($subform, 'login'); ... }
リスト3の例では、まずサブフォームを通常のフォームと同様にaddElementsで設定しています。その上で"親"フォームにaddSubFormメソッドで登録しています。このサブフォームによるグループ化を描画した様子は図3のようになり、標準ではサブフォームが線で囲われます。
表示グループもサブフォーム(Zend_Form_Subformを利用した場合)もfieldsetタグで要素のグループ化を行います。では表示グループとサブグループではどのような違いがあるのでしょうか?
最も異なるのは要素に対する反復を行ったときの挙動です。Zend_Formに対して反復処理を行うと、そのZend_Formに登録されている要素が一つずつ取り出され、処理が行われます。その際表示グループに登録されている要素は通常どおり処理されますが、サブフォームについてはサブフォーム自体が一つの要素として処理され、サブフォームに登録されている要素が直接取り出されることはありません。