SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

Zend Framework入門(12):
フォームのカスタマイズ - Zend_Form -(後編)

Zend Frameworkによる実践的なPHPアプリケーション開発 12

  • X ポスト
  • このエントリーをはてなブックマークに追加

フォーム要素のグループ化

 フォームに含まれる要素をいくつかのグループにまとめておくのに、Zend_Formには2つの方法が準備されています。表示上だけのグループ化したい場合のための表示グループと、管理を分けたい場合に利用するサブフォームです。

 表示グループは、いくつかのフォーム要素を一つのfieldset内に入れておくための仕組みです。一方でサブフォームは、ある程度親フォームから独立したフォームとしてふるまいます。

 ここでは、テキスト要素 user、パスワード要素 pass、そして送信ボタン要素 sendを一つずつ含む例を考えます(リスト1)。グループ化を行わない状態での描画の様子は図1のようになります。

図1 グループ化を行わない状態
グループ化を行わない状態
リスト1 要素の登録(IndexController.php)
...
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は表示グループを作成し、更にフォームに登録するためのメソッドです。addDisplayGroupaddDisplayGroup($elements, $name, $options)のように3つの引数を取ります(ただし、最後の$optionsは省略可能です)。

addDisplayGroupメソッドの引数
引数名 説明
$elements この表示グループに含まれる要素の名前(配列)
$name この表示グループの名前
$options この表示グループへのオプション(省略可能)

 例をリスト2に示します。

リスト2 addDisplayGroupによる表示グループの作成と登録の例
public function groupAction()
{
    $form = new Zend_Form;
    $this->addElements($form);

    $form->addDisplayGroup(array('user', 'pass'), 'login');
    $form->addDisplayGroup(array('send'), 'misc');
    ...
}

 この表示グループによるグループ化を描画した様子は図2のようになり、標準では表示グループごとに線で囲われます。

図2 表示グループによる要素のグループ化
表示グループによる要素のグループ化

サブフォーム

 サブフォームも表示グループ同様、フォーム要素をまとめておくための仕組みですが、少し毛色が異なります。表示グループは表示の際だけのグループ化なのに対し、サブフォームは名前のとおり、"親"フォームから独立したフォームとして扱われます。

 サブフォームはZend_FormのaddSubFormメソッドで登録することができます。addSubForm($subform, $name, $order)のように、3つの引数を取ります(ただし、最後の$orderは省略可能です)。

addSubFormメソッドの引数
引数名 説明
$subform 加えるサブフォームそのもの
$name サブフォームの名前
$order サブフォームが描画される順番(省略可能)

 サブフォームは表示グループと違い、独立したフォームとしてふるまいます。なので、作成する方法も通常のフォームと同様、まずインスタンスを作成した後に、そのインスタンスへフォーム要素の追加を行う手順をとります。そして、この作成されたサブフォームをaddSubFormメソッドで登録することができます。

 なお、通常サブフォームはZend_Form_SubFormのインスタンスとして作成します。というのも、Zend_Formのインスタンスで作成してしまうとサブフォームもformタグで囲われてしまい、"親"フォームのformタグと二重になってしまうからです。Zend_Form_Subformを利用すれば、サブフォームはfieldsetタグで囲まれます。Zend_Form_Subformを利用した例をリスト3に示します:

リスト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のようになり、標準ではサブフォームが線で囲われます。

図3 サブフォームによる要素のグループ化
サブフォームによる要素のグループ化
表示グループとサブフォームの違い

 表示グループもサブフォーム(Zend_Form_Subformを利用した場合)もfieldsetタグで要素のグループ化を行います。では表示グループとサブグループではどのような違いがあるのでしょうか?

 最も異なるのは要素に対する反復を行ったときの挙動です。Zend_Formに対して反復処理を行うと、そのZend_Formに登録されている要素が一つずつ取り出され、処理が行われます。その際表示グループに登録されている要素は通常どおり処理されますが、サブフォームについてはサブフォーム自体が一つの要素として処理され、サブフォームに登録されている要素が直接取り出されることはありません。

次のページ
Zend_Formのデコレータ

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3185 2008/11/14 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング