フォーム要素のグループ化
フォームに含まれる要素をいくつかのグループにまとめておくのに、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に登録されている要素が一つずつ取り出され、処理が行われます。その際表示グループに登録されている要素は通常どおり処理されますが、サブフォームについてはサブフォーム自体が一つの要素として処理され、サブフォームに登録されている要素が直接取り出されることはありません。



