Zend Framework入門(12):
フォームのカスタマイズ - Zend_Form -(後編)
Zend Frameworkによる実践的なPHPアプリケーション開発 12
ダウンロード サンプルファイル (4.2 KB)
フォーム要素のグループ化
フォームに含まれる要素をいくつかのグループにまとめておくのに、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に登録されている要素が一つずつ取り出され、処理が行われます。その際表示グループに登録されている要素は通常どおり処理されますが、サブフォームについてはサブフォーム自体が一つの要素として処理され、サブフォームに登録されている要素が直接取り出されることはありません。
- 修正履歴
-
- 2008/10/31 16:06 リスト10のインデントを変更
この記事は参考になりましたか?
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア



