1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20774 -->
4 <sect1 id="zend.form.forms">
5 <title>Zend_Form によるフォームの作成</title>
8 <classname>Zend_Form</classname> クラスは、フォームの要素や
9 表示グループ、そしてサブフォームの集約を行います。
10 そして、その要素に対して次のような操作を行います。
19 値の集約 (すべての項目についてのフィルタリング前/
25 登録した順、あるいは各項目から取得した順序ヒントに従った順での処理
29 フォーム全体のレンダリング。デコレータでレンダリング方法をカスタマイズしたり、
35 <classname>Zend_Form</classname> で作成したフォームが複雑なものになることもありますが、
36 シンプルなフォームで使用するのがもっともよくある使用例でしょう。
37 手早いアプリケーション開発 (RAD) やプロトタイピングでの使用に最適です。
41 もっとも基本的な使用法は、単にフォームオブジェクトを作成するものです。
44 <programlisting language="php"><![CDATA[
46 $form = new Zend_Form();
53 <classname>Zend_Config</classname> のインスタンスあるいは配列で設定を渡すことができます。
54 これを使用すると、オブジェクトの状態を設定したり新しい要素を作成したりできます。
57 <programlisting language="php"><![CDATA[
59 $form = new Zend_Form($config);
63 <classname>Zend_Form</classname> は順次処理が可能です。
64 各要素や表示グループ、サブフォームごとに処理できます。
65 処理順は、登録した順番および各項目に設定されている順番となります。
66 これは、各要素のレンダリングを適切な順で行いたいときに便利です。
70 <classname>Zend_Form</classname> は、要素や表示グループのファクトリとして使用できると同時に
71 デコレータで自分自身をレンダリングすることもできます。
74 <sect2 id="zend.form.forms.plugins">
75 <title>プラグインローダー</title>
77 <classname>Zend_Form</classname> では、
78 <classname>Zend_Loader_PluginLoader</classname> を使用することで
80 それぞれにプラグインローダーを関連づけることができ、
81 汎用的なアクセサを使用してそれを取得したり変更したりします。
85 使用できるローダーの型は 'element' と 'decorator'
86 です。さまざまなプラグインローダーメソッドが用意されています。
91 プラグインローダーで使用できるメソッドは、次のとおりです。
96 <methodname>setPluginLoader($loader, $type)</methodname>:
97 $loader はプラグインローダーオブジェクトで、type
100 指定したローダーオブジェクトに設定します。
104 <methodname>getPluginLoader($type)</methodname>:
105 $type に関連づけられたプラグインローダーを取得します。
109 <methodname>addPrefixPath($prefix, $path, $type = null)</methodname>:
110 プレフィックスとパスの関連づけを、$type で指定したローダーに指定します。
111 $type が <constant>NULL</constant> の場合はそのパスをすべてのローダーに追加します。この場合、
112 プレフィックスの後に "_Element" および
113 "_Decorator" を追加し、パスに "Element/" および
114 "Decorator/" を追加します。追加のフォーム要素クラス群をすべて同じ階層に配置した場合は、
115 このメソッドを使用すると簡単に基底プレフィックスを設定できます。
119 <methodname>addPrefixPaths(array $spec)</methodname>:
120 複数のパスを、ひとつあるは複数のプラグインローダーに一度に追加します。
121 配列の各要素は、キー 'path'、'prefix' および
127 さらに、<classname>Zend_Form</classname>
128 のインスタンスで作成したすべての要素や表示グループ用のプレフィックスパスを設定するには
134 <methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname>:
135 <methodname>addPrefixPath()</methodname> と同じですが、
136 クラスのプレフィックスとパスを指定しなければなりません。
137 <code>$type</code> を指定する場合は、それは
138 <classname>Zend_Form_Element</classname>
139 で指定したプラグインローダーの型のひとつでなければなりません。
140 <code>$type</code> にどんな値が指定できるのかについては <link
141 linkend="zend.form.elements.loaders">要素のプラグインのセクション</link>
142 を参照ください。<code>$type</code> を省略した場合は、
143 すべての型で用いる全般的なプレフィックスとみなします。
147 <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>:
148 <methodname>addPrefixPath()</methodname> と似ていますが、
149 クラスのプレフィックスとパスを指定しなければなりません。
150 しかし、表示グループではプラグインとして対応しているのはデコレータだけなので、
151 <code>$type</code> は不要です。
158 独自の機能をカプセル化したりできるようになります。
159 独自の要素を既存の標準クラスに置き換えて使用する例については、
161 <link linkend="zend.form.elements.loaders.customLabel">独自のラベルを作る例</link>
166 <sect2 id="zend.form.forms.elements">
169 <classname>Zend_Form</classname> では、フォームに要素を追加したり
170 フォームから要素を削除したりするためのアクセサを提供しています。
171 これらは要素オブジェクトのインスタンスを受け取ることもできますし、
172 ファクトリとして要素オブジェクトのインスタンスを作成させることもできます。
177 <methodname>addElement()</methodname> です。
178 このメソッドは、 <classname>Zend_Form_Element</classname> 型
179 (あるいは <classname>Zend_Form_Element</classname> を継承したクラス) のオブジェクト
181 (要素の型や名前、設定オプション) を受け取ります。
188 <programlisting language="php"><![CDATA[
190 $element = new Zend_Form_Element_Text('foo');
191 $form->addElement($element);
195 // Zend_Form_Element_Text 型で
196 // 'foo' という名前の要素を作成します
197 $form->addElement('text', 'foo');
199 // 要素の label オプションを渡します
200 $form->addElement('text', 'foo', array('label' => 'Foo:'));
204 <title>addElement() における「流れるようなインターフェイス」の実装</title>
207 <methodname>addElement()</methodname> は「流れるようなインターフェイス」
208 を実装しています。つまり、このメソッドは要素ではなく
209 <classname>Zend_Form</classname> オブジェクトを返すということです。
210 これによって、複数の addElement() メソッドやその他のフォームメソッド
211 (<classname>Zend_Form</classname> のすべてのセッターは流れるようなインターフェイスを実装しています)
217 <methodname>createElement()</methodname> を使いましょう。
219 <methodname>createElement()</methodname> は要素をフォームにアタッチしないことに注意しましょう。
223 内部的には、<methodname>addElement()</methodname> は実際には
224 <methodname>createElement()</methodname> をコールして作成した要素をフォームにアタッチしています。
229 要素をフォームに追加したら、名前を指定してそれを取得できます。
230 取得するには、<methodname>getElement()</methodname> メソッドを使用するか
231 オブジェクトのプロパティとして要素にアクセスします。
235 <programlisting language="php"><![CDATA[
237 $foo = $form->getElement('foo');
244 時には、フォームにアタッチせずに要素を作成したいこともあるでしょう
245 (フォームに登録されているさまざまなプラグインパスを使いたいけれど、
246 そのオブジェクトは後でサブフォームにアタッチしたい場合など)。
247 そんな場合は <methodname>createElement()</methodname> メソッドを使用します。
250 <programlisting language="php"><![CDATA[
251 // $username は Zend_Form_Element_Text オブジェクトとなります
252 $username = $form->createElement('text', 'username');
255 <sect3 id="zend.form.forms.elements.values">
256 <title>値の設定と取得</title>
259 フォームの検証をすませたら、通常は値を取得することになるでしょう。
260 その値を用いてデータベースの更新なりウェブサービスの操作なりといった作業を行います。
261 すべての要素の値を取得するには <methodname>getValues()</methodname> を使用します。
262 <methodname>getValue($name)</methodname> を使用すると、
263 要素名を指定して特定の要素の値を取得できます。
266 <programlisting language="php"><![CDATA[
268 $values = $form->getValues();
270 // 'foo' 要素の値のみを取得します
271 $value = $form->getValue('foo');
275 レンダリング前に、フォームに特定の値を設定したいこともあるでしょう。
276 これを行うには <methodname>setDefaults()</methodname> メソッドあるいは
277 <methodname>populate()</methodname> メソッドを使用します。
280 <programlisting language="php"><![CDATA[
281 $form->setDefaults($data);
282 $form->populate($data);
286 逆に、値を設定したり検証したりした後でフォームをクリアしたいこともあるでしょう。
287 これを行うには <methodname>reset()</methodname> メソッドを使用します。
290 <programlisting language="php"><![CDATA[
295 <sect3 id="zend.form.forms.elements.global">
296 <title>グローバルな操作</title>
299 時には、すべての要素に対して何らかの操作を行いたくなることもあります。
300 ありがちな例としては、すべての要素に対してプラグインのプレフィックスを設定したり
301 デコレータを設定したり、フィルタを設定したりといったものがあります。
305 <example id="zend.form.forms.elements.global.allpaths">
306 <title>すべての要素に対するプレフィックスパスの設定</title>
309 型を指定してすべての要素に対するプレフィックスパスを設定したり、
310 グローバルプレフィックスを使用したりする例です。
313 <programlisting language="php"><![CDATA[
314 // グローバルプレフィックスパスの設定:
315 // プレフィックス My_Foo_Filter、My_Foo_Validate、
316 // My_Foo_Decorator のパスを作成します。
317 $form->addElementPrefixPath('My_Foo', 'My/Foo/');
320 $form->addElementPrefixPath('My_Foo_Filter',
325 $form->addElementPrefixPath('My_Foo_Validate',
330 $form->addElementPrefixPath('My_Foo_Decorator',
336 <example id="zend.form.forms.elements.global.decorators">
337 <title>すべての要素に対するデコレータの設定</title>
340 すべての要素に対するデコレータを設定できます。
341 <methodname>setElementDecorators()</methodname> に
342 <methodname>setDecorators()</methodname>
344 各要素にそれまで設定されていたすべてのデコレータを上書きします。
345 この例では、単純に ViewHelper デコレータと
349 <programlisting language="php"><![CDATA[
350 $form->setElementDecorators(array(
357 <example id="zend.form.forms.elements.global.decoratorsFilter">
358 <title>いくつかの要素に対するデコレータの設定</title>
361 設定したい要素、あるいは設定したくない要素を指定することで、
362 一部の要素にだけデコレータを設定することもできます。
363 <methodname>setElementDecorators()</methodname> の 2 番目の引数に要素名の配列を指定します。
364 デフォルトでは、ここで指定した要素にのみデコレータが設定されます。
366 これは、設定「したい」要素なのか設定「したくない」
368 <constant>FALSE</constant> を渡すと、指定した
369 <emphasis>以外の</emphasis> すべての要素にデコレータを設定します。
371 各要素にそれまで設定されていたすべてのデコレータを上書きします。
376 ViewHelper デコレータと Label デコレータを
377 要素 'foo' および 'bar' に対してのみ使用するものです。
380 <programlisting language="php"><![CDATA[
381 $form->setElementDecorators(
394 一方、この例では、ViewHelper デコレータと Label
395 デコレータを 'foo' と 'bar' <emphasis>以外の</emphasis>
399 <programlisting language="php"><![CDATA[
400 $form->setElementDecorators(
415 <title>要素によっては不適切なデコレータもある</title>
418 <methodname>setElementDecorators()</methodname>
419 はよい方法に見えますが、時には予期せぬ結果を引き起こすこともあります。
420 たとえば、ボタン系の要素 (Submit, Button, Reset)
421 では現在ラベルをボタンの値として使用しています。
422 そして ViewHelper デコレータや DtDdWrapper デコレータは、
423 余計なラベルやエラー、ヒントをレンダリングしないためにのみ用います。
424 上の例ではいくつかのラベルが重複してしまいます。
428 先ほどの例に示したように、設定したい要素/したくない要素
429 を配列で指定するようにすれば、この問題を回避できます。
433 したがって、このメソッドは注意して使うようにしましょう。
434 場合によっては、いくつかの要素を除外するか、
435 そののデコレータを変更して予期せぬ結果を防ぐ必要があります。
439 <example id="zend.form.forms.elements.global.filters">
440 <title>すべての要素に対するフィルタの設定</title>
443 すべての要素に対して同じフィルタを適用したくなることもよくあります。
444 たとえば、すべての値を <methodname>trim()</methodname> するなどです。
447 <programlisting language="php"><![CDATA[
448 $form->setElementFilters(array('StringTrim'));
453 <sect3 id="zend.form.forms.elements.methods">
454 <title>要素を操作するためのメソッド</title>
457 次のメソッドを使用して、要素を操作します。
462 <methodname>createElement($element, $name = null, $options = null)</methodname>
466 <methodname>addElement($element, $name = null, $options = null)</methodname>
470 <methodname>addElements(array $elements)</methodname>
474 <methodname>setElements(array $elements)</methodname>
478 <methodname>getElement($name)</methodname>
482 <methodname>getElements()</methodname>
486 <methodname>removeElement($name)</methodname>
490 <methodname>clearElements()</methodname>
494 <methodname>setDefaults(array $defaults)</methodname>
498 <methodname>setDefault($name, $value)</methodname>
502 <methodname>getValue($name)</methodname>
506 <methodname>getValues()</methodname>
510 <methodname>getUnfilteredValue($name)</methodname>
514 <methodname>getUnfilteredValues()</methodname>
518 <methodname>setElementFilters(array $filters)</methodname>
522 <methodname>setElementDecorators(array $decorators)</methodname>
526 <methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname>
530 <methodname>addElementPrefixPaths(array $spec)</methodname>
536 <sect2 id="zend.form.forms.displaygroups">
537 <title>表示グループ</title>
540 表示グループを使用すると、複数の要素を仮想的にグループ化して
542 フォーム内の各要素に対しては名前を指定してアクセスできますが、
543 フォームの要素を順次処理したりレンダリングしたりするときは
546 フィールドセット内の要素をグループ化することです。
550 表示グループの基底クラスは <classname>Zend_Form_DisplayGroup</classname> です。
551 このクラスのインスタンスを直接作成することもできますが、
552 一般的には <classname>Zend_Form</classname> の
553 <methodname>addDisplayGroup()</methodname> メソッドでインスタンスを作成することになります。
554 このメソッドの最初の引数には要素の配列を渡し、
555 表示グループの名前を 2 番目の引数で指定します。
556 オプションの 3 番目の引数で、設定の配列や
557 <classname>Zend_Config</classname> オブジェクトを渡すこともできます。
561 'username' と 'password' という要素がすでにフォームに登録済みである場合に、
562 次のコードを使用するとそれらを表示グループ
563 'login' にまとめることができます。
566 <programlisting language="php"><![CDATA[
567 $form->addDisplayGroup(array('username', 'password'), 'login');
572 <methodname>getDisplayGroup()</methodname> メソッドを使用するか
576 <programlisting language="php"><![CDATA[
577 // getDisplayGroup() の使用
578 $login = $form->getDisplayGroup('login');
581 $login = $form->login;
585 <title>読み込み不要なデフォルトのデコレータ</title>
589 オブジェクトの初期化時に読み込まれるようになっています。
590 この機能を無効にするには、表示グループの作成時にオプション
591 'disableLoadDefaultDecorators' を指定します。
594 <programlisting language="php"><![CDATA[
595 $form->addDisplayGroup(
598 array('disableLoadDefaultDecorators' => true)
603 このオプションは、他のオプションと混用することもできます。
604 その場合はオプションの配列や <classname>Zend_Config</classname>
609 <sect3 id="zend.form.forms.displaygroups.global">
610 <title>グローバルな操作</title>
613 要素と同様、表示グループに対しても全体に共通の操作があるでしょう。
614 デコレータを設定したり、デコレータを探すプラグインパスを設定したりといったものです。
617 <example id="zend.form.forms.displaygroups.global.paths">
618 <title>すべての表示グループに対するデコレータプレフィックスパスの設定</title>
621 デフォルトでは、表示グループはフォームが使用しているデコレータパスを継承します。
623 <methodname>addDisplayGroupPrefixPath()</methodname> メソッドを使用します。
626 <programlisting language="php"><![CDATA[
627 $form->addDisplayGroupPrefixPath('My_Foo_Decorator', 'My/Foo/Decorator');
631 <example id="zend.form.forms.displaygroups.global.decorators">
632 <title>すべての表示グループに対するデコレータの設定</title>
635 すべての表示グループに対するデコレータを設定できます。
636 <methodname>setDisplayGroupDecorators()</methodname> に
637 <methodname>setDecorators()</methodname>
639 各表示グループにそれまで設定されていたすべてのデコレータを上書きします。
640 この例では、単純に fieldset デコレータ
641 (FormElements デコレータは、要素を順次処理するために必須です)
645 <programlisting language="php"><![CDATA[
646 $form->setDisplayGroupDecorators(array(
654 <sect3 id="zend.form.forms.displaygroups.customClasses">
655 <title>独自の表示グループクラスの使用</title>
658 デフォルトでは、<classname>Zend_Form</classname> は
659 表示グループ用に <classname>Zend_Form_DisplayGroup</classname>
661 このクラスを継承すれば、独自の機能を持つクラスを作成できます。
662 <methodname>addDisplayGroup()</methodname>
663 には具象インスタンスを渡すことはできませんが、
664 どのクラスを使用するのかをオプションで指定できます。
665 このときに使用するキーは 'displayGroupClass' です。
668 <programlisting language="php"><![CDATA[
669 // 'My_DisplayGroup' クラスを使用します
670 $form->addDisplayGroup(
671 array('username', 'password'),
673 array('displayGroupClass' => 'My_DisplayGroup')
678 そのクラスがまだ読み込まれていない場合は、<classname>Zend_Form</classname>
679 は <classname>Zend_Loader</classname> を使ってクラスを読み込みます。
684 そのフォームオブジェクトで作成するすべての表示グループで
688 <programlisting language="php"><![CDATA[
689 // すべての表示グループで 'My_DisplayGroup' クラスを使用します
690 $form->setDefaultDisplayGroupClass('My_DisplayGroup');
695 'defaultDisplayGroupClass' で指定することもできます。
696 そうすれば、事前にこのクラスが読み込まれて
697 すべての表示グループでこのクラスを使うようになります。
701 <sect3 id="zend.form.forms.displaygroups.interactionmethods">
702 <title>表示グループを操作するためのメソッド</title>
705 次のメソッドを使用して、表示グループを操作します。
710 <methodname>addDisplayGroup(array $elements, $name, $options = null)</methodname>
714 <methodname>addDisplayGroups(array $groups)</methodname>
718 <methodname>setDisplayGroups(array $groups)</methodname>
722 <methodname>getDisplayGroup($name)</methodname>
726 <methodname>getDisplayGroups()</methodname>
730 <methodname>removeDisplayGroup($name)</methodname>
734 <methodname>clearDisplayGroups()</methodname>
738 <methodname>setDisplayGroupDecorators(array $decorators)</methodname>
742 <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>
746 <methodname>setDefaultDisplayGroupClass($class)</methodname>
750 <methodname>getDefaultDisplayGroupClass($class)</methodname>
755 <sect3 id="zend.form.forms.displaygroups.methods">
756 <title>Zend_Form_DisplayGroup のメソッド</title>
759 <classname>Zend_Form_DisplayGroup</classname> には次のようなメソッドがあります。
764 <listitem><para>設定</para>
766 <listitem><para><methodname>setOptions(array $options)</methodname></para></listitem>
768 <listitem><para><methodname>setConfig(Zend_Config $config)</methodname></para></listitem>
772 <listitem><para>メタデータ</para>
774 <listitem><para><methodname>setAttrib($key, $value)</methodname></para></listitem>
776 <listitem><para><methodname>addAttribs(array $attribs)</methodname></para></listitem>
778 <listitem><para><methodname>setAttribs(array $attribs)</methodname></para></listitem>
780 <listitem><para><methodname>getAttrib($key)</methodname></para></listitem>
782 <listitem><para><methodname>getAttribs()</methodname></para></listitem>
784 <listitem><para><methodname>removeAttrib($key)</methodname></para></listitem>
786 <listitem><para><methodname>clearAttribs()</methodname></para></listitem>
788 <listitem><para><methodname>setName($name)</methodname></para></listitem>
790 <listitem><para><methodname>getName()</methodname></para></listitem>
792 <listitem><para><methodname>setDescription($value)</methodname></para></listitem>
794 <listitem><para><methodname>getDescription()</methodname></para></listitem>
796 <listitem><para><methodname>setLegend($legend)</methodname></para></listitem>
798 <listitem><para><methodname>getLegend()</methodname></para></listitem>
800 <listitem><para><methodname>setOrder($order)</methodname></para></listitem>
802 <listitem><para><methodname>getOrder()</methodname></para></listitem>
806 <listitem><para>要素</para>
808 <listitem><para><methodname>createElement($type, $name, array $options = array())</methodname></para></listitem>
810 <listitem><para><methodname>addElement($typeOrElement, $name, array $options = array())</methodname></para></listitem>
812 <listitem><para><methodname>addElements(array $elements)</methodname></para></listitem>
814 <listitem><para><methodname>setElements(array $elements)</methodname></para></listitem>
816 <listitem><para><methodname>getElement($name)</methodname></para></listitem>
818 <listitem><para><methodname>getElements()</methodname></para></listitem>
820 <listitem><para><methodname>removeElement($name)</methodname></para></listitem>
822 <listitem><para><methodname>clearElements()</methodname></para></listitem>
826 <listitem><para>プラグインローダー</para>
828 <listitem><para><methodname>setPluginLoader(Zend_Loader_PluginLoader $loader)</methodname></para></listitem>
830 <listitem><para><methodname>getPluginLoader()</methodname></para></listitem>
832 <listitem><para><methodname>addPrefixPath($prefix, $path)</methodname></para></listitem>
834 <listitem><para><methodname>addPrefixPaths(array $spec)</methodname></para></listitem>
838 <listitem><para>デコレータ</para>
840 <listitem><para><methodname>addDecorator($decorator, $options = null)</methodname></para></listitem>
842 <listitem><para><methodname>addDecorators(array $decorators)</methodname></para></listitem>
844 <listitem><para><methodname>setDecorators(array $decorators)</methodname></para></listitem>
846 <listitem><para><methodname>getDecorator($name)</methodname></para></listitem>
848 <listitem><para><methodname>getDecorators()</methodname></para></listitem>
850 <listitem><para><methodname>removeDecorator($name)</methodname></para></listitem>
852 <listitem><para><methodname>clearDecorators()</methodname></para></listitem>
856 <listitem><para>レンダリング</para>
858 <listitem><para><methodname>setView(Zend_View_Interface $view = null)</methodname></para></listitem>
860 <listitem><para><methodname>getView()</methodname></para></listitem>
862 <listitem><para><methodname>render(Zend_View_Interface $view = null)</methodname></para></listitem>
866 <listitem><para>I18n</para>
868 <listitem><para><methodname>setTranslator(Zend_Translate_Adapter $translator = null)</methodname></para></listitem>
870 <listitem><para><methodname>getTranslator()</methodname></para></listitem>
872 <listitem><para><methodname>setDisableTranslator($flag)</methodname></para></listitem>
874 <listitem><para><methodname>translatorIsDisabled()</methodname></para></listitem>
881 <sect2 id="zend.form.forms.subforms">
882 <title>サブフォーム</title>
885 サブフォームの役割は、次のようなものです。
892 サブフォームを独立したエンティティとして検証できます。
898 ページごとに別々のサブフォームを表示させて複数ページのフォームを作成し、
899 各ページで独自のバリデーションを行うことができます。
900 すべてのサブフォームの検証に成功した時点ではじめて
906 表示グループと同様、サブフォームについても
907 フォーム内でのレンダリングの際にはひとつの要素として扱われます。
909 親フォームからはサブフォームの要素にはアクセスできません。
914 サブフォームは <classname>Zend_Form</classname> のオブジェクトです。一般的には
915 <classname>Zend_Form_SubForm</classname> のオブジェクトとなります。
916 後者のクラスには、大きなフォームに含めるのに適したデコレータが含まれています
917 (HTML の form タグをレンダリングせず、要素をグループ化するものです)。
918 サブフォームをアタッチするには、単にそれを要素に追加して名前を指定するだけです。
921 <programlisting language="php"><![CDATA[
922 $form->addSubForm($subForm, 'subform');
927 <methodname>getSubForm($name)</methodname> を使用するかあるいはサブフォームの名前を使用します。
930 <programlisting language="php"><![CDATA[
932 $subForm = $form->getSubForm('subform');
935 $subForm = $form->subform;
939 サブフォームは、親フォームの要素のひとつとして順次処理できます。
943 <sect3 id="zend.form.forms.subforms.global">
944 <title>グローバルな操作</title>
947 要素や表示グループと同様、サブフォームに対しても全体に共通の操作があるでしょう。
949 サブフォームは親フォームのほとんどの機能を継承しています。
950 グローバルな操作として本当に必要なのは、サブフォーム用のデコレータの設定くらいです。
951 そんな場合には <methodname>setSubFormDecorators()</methodname>
952 メソッドを使用します。次の例では、すべてのサブフォームに対して
953 単純に fieldset デコレータを設定します
954 (FormElements デコレータは、要素を順次処理するために必須です)。
957 <programlisting language="php"><![CDATA[
958 $form->setSubFormDecorators(array(
965 <sect3 id="zend.form.forms.subforms.methods">
966 <title>サブフォームを操作するためのメソッド</title>
969 次のメソッドを使用して、サブフォームを操作します。
974 <methodname>addSubForm(Zend_Form $form, $name, $order = null)</methodname>
978 <methodname>addSubForms(array $subForms)</methodname>
982 <methodname>setSubForms(array $subForms)</methodname>
986 <methodname>getSubForm($name)</methodname>
990 <methodname>getSubForms()</methodname>
994 <methodname>removeSubForm($name)</methodname>
998 <methodname>clearSubForms()</methodname>
1002 <methodname>setSubFormDecorators(array $decorators)</methodname>
1008 <sect2 id="zend.form.forms.metadata">
1009 <title>メタデータおよび属性</title>
1012 フォームで一番大切なのはフォームが含む要素ですが、
1013 フォームにはそれ以外のメタデータも含まれます。たとえばフォームの名前
1014 (この名前は、HTML のマークアップ時に ID として用いられます)
1016 要素や表示グループ、サブフォームの数も含まれます。
1017 それ以外にも任意のメタデータを含めることができます
1018 (通常は、form タグで指定する HTML 属性などをここに含めます)。
1022 フォームの名前を設定したり取得したりするには name アクセサを使用します。
1025 <programlisting language="php"><![CDATA[
1027 $form->setName('registration');
1030 $name = $form->getName();
1031 ]]></programlisting>
1034 アクション (フォームを送信したときに進む URL)
1035 やメソッド (送信する方法。たとえば 'POST' あるいは 'GET')
1036 を設定するには、それぞれ action アクセサおよび
1040 <programlisting language="php"><![CDATA[
1042 $form->setAction('/user/login')
1043 ->setMethod('post');
1044 ]]></programlisting>
1049 <classname>Zend_Form</classname> では 2 つの定数
1050 <constant>Zend_Form::ENCTYPE_URLENCODED</constant> と
1051 <constant>Zend_Form::ENCTYPE_MULTIPART</constant> を定義しており、
1052 これらはそれぞれ 'application/x-www-form-urlencoded' と
1053 'multipart/form-data' に対応します。
1054 しかし、これ以外にも任意のエンコード形式を指定できます。
1057 <programlisting language="php"><![CDATA[
1058 // アクションとメソッド、そして enctype を設定します
1059 $form->setAction('/user/login')
1061 ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
1062 ]]></programlisting>
1066 メソッドやアクション、enctype はレンダリングの際に内部的に使われるものであり、
1072 <classname>Zend_Form</classname> は <code>Countable</code>
1073 インターフェイスを実装しており、count 関数の引数として使用できます。
1076 <programlisting language="php"><![CDATA[
1077 $numItems = count($form);
1078 ]]></programlisting>
1081 任意のメタデータを設定するには attribs アクセサを使用します。
1082 <classname>Zend_Form</classname> ではオーバーロードを使用して
1083 要素や表示グループそしてサブフォームにアクセスしているので、
1084 これがメタデータにアクセスするための唯一の方法となります。
1087 <programlisting language="php"><![CDATA[
1089 $form->setAttrib('class', 'zend-form')
1091 'id' => 'registration',
1092 'onSubmit' => 'validate(this)',
1096 $class = $form->getAttrib('class');
1097 $attribs = $form->getAttribs();
1100 $form->removeAttrib('onSubmit');
1103 $form->clearAttribs();
1104 ]]></programlisting>
1107 <sect2 id="zend.form.forms.decorators">
1108 <title>デコレータ</title>
1111 フォームのマークアップを作成するのは手間のかかる作業です。
1112 特に、検証エラーの表示や値の送信などの決まりきった処理を何度も行うのは大変なことです。
1113 この問題に対する <classname>Zend_Form</classname>
1114 からの回答が <emphasis>デコレータ</emphasis> です。
1118 <classname>Zend_Form</classname> オブジェクトのデコレータを使用して、
1120 FormElements デコレータは、フォームのすべての項目
1122 を順次処理し、それらをレンダリングした結果を返します。
1123 それ以外のデコレータを使用して、コンテンツをラップしたり
1128 <classname>Zend_Form</classname> のデフォルトのデコレータは、FormElements と
1129 HtmlTag (定義リストによるラッピングをします)、そして Form です。
1133 <programlisting language="php"><![CDATA[
1134 $form->setDecorators(array(
1136 array('HtmlTag', array('tag' => 'dl')),
1139 ]]></programlisting>
1145 <programlisting language="html"><![CDATA[
1146 <form action="/form/action" method="post">
1151 ]]></programlisting>
1154 フォームオブジェクトに設定した任意の属性は、
1155 HTML の <code><form></code> タグの属性となります。
1159 <title>読み込み不要なデフォルトのデコレータ</title>
1163 オブジェクトの初期化時に読み込まれるようになっています。
1164 この機能を無効にするには、コンストラクタでオプション
1165 'disableLoadDefaultDecorators' を指定します。
1168 <programlisting language="php"><![CDATA[
1169 $form = new Zend_Form(array('disableLoadDefaultDecorators' => true));
1170 ]]></programlisting>
1173 このオプションは、他のオプションと混用することもできます。
1174 その場合はオプションの配列や <classname>Zend_Config</classname>
1180 <title>同じ型の複数のデコレータの使用法</title>
1183 内部的には、<classname>Zend_Form</classname>
1184 はデコレータのクラスをもとにデコレータを取得しています。
1185 その結果、同じ型のデコレータを複数使うことができなくなります。
1187 後から指定したものが先に指定したものを上書きします。
1191 これを回避するにはエイリアスを使用します。
1192 デコレータやデコレータ名を <methodname>addDecorator()</methodname>
1193 の最初の引数として渡すのではなく、ひとつの要素からなる配列を渡します。
1194 この配列には、デコレータオブジェクトあるいはデコレータ名を指すエイリアスを指定します。
1197 <programlisting language="php"><![CDATA[
1199 $form->addDecorator(array('FooBar' => 'HtmlTag'), array('tag' => 'div'));
1202 $form = $element->getDecorator('FooBar');
1203 ]]></programlisting>
1206 <methodname>addDecorators()</methodname> メソッドおよび
1207 <methodname>setDecorators()</methodname> メソッドでは、
1208 デコレータを表す配列を 'decorator' オプションに渡す必要があります。
1211 <programlisting language="php"><![CDATA[
1212 // ふたつの 'HtmlTag' デコレータを使用するため、片方に 'FooBar' というエイリアスを指定します
1213 $form->addDecorators(
1214 array('HtmlTag', array('tag' => 'div')),
1216 'decorator' => array('FooBar' => 'HtmlTag'),
1217 'options' => array('tag' => 'dd')
1222 $htmlTag = $form->getDecorator('HtmlTag');
1223 $fooBar = $form->getDecorator('FooBar');
1224 ]]></programlisting>
1228 独自のデコレータを使用してフォームを作成することもできます。
1229 一般的な使用例としては、作成したい HTML が厳密に決まっている場合などがあります。
1230 デコレータでそれとまったく同じ HTML を作成し、単純にそれを返せばいいのです。
1231 個々の要素や表示グループに対してもそれぞれデコレータを使用できます。
1235 デコレータ関連のメソッドを以下にまとめます。
1240 <methodname>addDecorator($decorator, $options = null)</methodname>
1244 <methodname>addDecorators(array $decorators)</methodname>
1248 <methodname>setDecorators(array $decorators)</methodname>
1252 <methodname>getDecorator($name)</methodname>
1256 <methodname>getDecorators()</methodname>
1260 <methodname>removeDecorator($name)</methodname>
1264 <methodname>clearDecorators()</methodname>
1269 <classname>Zend_Form</classname> は、
1270 オーバーロードを使用して特定のデコレータをレンダリングすることもできます。
1271 'render' で始まる名前のメソッドを <methodname>__call()</methodname>
1272 で捕捉し、メソッド名の残りの部分にもとづいてデコレータを探します。
1274 <emphasis>だけ</emphasis> をレンダリングします。
1276 <methodname>render()</methodname> メソッドにコンテンツとして渡されます。次の例を参照ください。
1279 <programlisting language="php"><![CDATA[
1280 // FormElements デコレータのみをレンダリングします
1281 echo $form->renderFormElements();
1283 // fieldset デコレータのみ、コンテンツを渡してレンダリングします
1284 echo $form->renderFieldset("<p>This is fieldset content</p>");
1285 ]]></programlisting>
1288 デコレータが存在しない場合は、例外が発生します。
1292 <sect2 id="zend.form.forms.validation">
1293 <title>バリデーション</title>
1296 フォームの主な使用法は、送信されたデータを検証することです。
1297 <classname>Zend_Form</classname> は、フォーム全体あるいはその一部を一度に検証したり、
1298 XmlHttpRequests (AJAX) のレスポンスを自動的に検証したりできます。
1301 検証エラーのコードやメッセージを取得するメソッドが用意されています。
1305 フォーム全体のバリデーションを行うには <methodname>isValid()</methodname> メソッドを使用します。
1308 <programlisting language="php"><![CDATA[
1309 if (!$form->isValid($_POST)) {
1312 ]]></programlisting>
1315 <methodname>isValid()</methodname> はすべての必須要素の検証を行います。
1316 また非必須要素の中で値が送信された要素についても検証します。
1320 時には一部のデータだけを検証したいこともあるでしょう。そんな場合には
1321 <methodname>isValidPartial($data)</methodname> を使用します。
1324 <programlisting language="php"><![CDATA[
1325 if (!$form->isValidPartial($data)) {
1328 ]]></programlisting>
1331 <methodname>isValidPartial()</methodname> は、
1332 data の項目にマッチする要素についてのみ検証を行います。
1333 マッチする要素がなかった場合は処理をスキップします。
1337 <acronym>AJAX</acronym> リクエストの要素や要素グループを検証する際は、
1338 通常はフォームの一部を検証してその結果を <acronym>JSON</acronym> で返すことになります。
1339 <methodname>processAjax()</methodname> が、まさにその作業を行うメソッドです。
1342 <programlisting language="php"><![CDATA[
1343 $json = $form->processAjax($data);
1344 ]]></programlisting>
1347 こうすれば、単純に <acronym>JSON</acronym> レスポンスをクライアントに返すことができます。
1348 フォームの検証に成功した場合は、この結果は <constant>TRUE</constant> となります。
1349 失敗した場合は、キーとメッセージのペアを含む javascript
1350 オブジェクトを返します。個々の 'message'
1351 が検証エラーメッセージの配列となります。
1355 フォームの検証に失敗した場合は、エラーコードとエラーメッセージをそれぞれ
1356 <methodname>getErrors()</methodname> と
1357 <methodname>getMessages()</methodname> で取得できます。
1360 <programlisting language="php"><![CDATA[
1361 $codes = $form->getErrors();
1362 $messages = $form->getMessages();
1363 ]]></programlisting>
1367 <methodname>getMessages()</methodname> が返すメッセージは エラーコード/エラーメッセージ
1368 の配列なので、<methodname>getErrors()</methodname> は通常は不要です。
1373 個々の要素のコードとエラーメッセージを取得するには、
1377 <programlisting language="php"><![CDATA[
1378 $codes = $form->getErrors('username');
1379 $messages = $form->getMessages('username');
1380 ]]></programlisting>
1384 注意: 要素を検証する際、<classname>Zend_Form</classname> は各要素の
1385 <methodname>isValid()</methodname> メソッドに 2 番目の引数を渡します。
1387 これを使用すると、他の要素の入力内容をもとにした検証を
1389 例としては、「パスワード」欄と「パスワード(確認)」
1390 があるユーザ登録フォームがあります。「パスワード」
1391 要素の検証には「パスワード(確認)」の入力内容を使用することになるでしょう。
1395 <sect3 id="zend.form.forms.validation.errors">
1396 <title>独自のエラーメッセージ</title>
1399 時には、要素にアタッチされたバリデータが生成するエラーメッセージではなく
1400 独自のエラーメッセージを指定したくなることもあるでしょう。
1401 さらに、時には自分自身でフォームを無効だとマークしたいこともあるでしょう。
1407 <methodname>addErrorMessage($message)</methodname>:
1408 フォームの検証エラーの際に表示するエラーメッセージを追加します。
1409 複数回コールすると、新しいメッセージはスタックに追加されます。
1413 <methodname>addErrorMessages(array $messages)</methodname>:
1414 フォームの検証エラーの際に表示する複数のエラーメッセージを追加します。
1418 <methodname>setErrorMessages(array $messages)</methodname>:
1419 フォームの検証エラーの際に表示する複数のエラーメッセージを追加します。
1420 それまでに設定されていたすべてのメッセージを上書きします。
1424 <methodname>getErrorMessages()</methodname>:
1425 定義済みのカスタムエラーメッセージの一覧を取得します。
1429 <methodname>clearErrorMessages()</methodname>:
1430 定義済みのカスタムエラーメッセージをすべて削除します。
1434 <methodname>markAsError()</methodname>:
1435 検証に失敗したものとしてフォームにマークします。
1439 <methodname>addError($message)</methodname>:
1440 エラーメッセージをカスタムエラーメッセージスタックに追加し、
1445 <methodname>addErrors(array $messages)</methodname>:
1446 複数のエラーメッセージをカスタムエラーメッセージスタックに追加し、
1451 <methodname>setErrors(array $messages)</methodname>:
1452 指定したメッセージでカスタムエラーメッセージスタックを上書きし、
1458 この方式で設定したすべてのエラーは翻訳されることになります。
1462 <!-- TODO : to be translated -->
1463 <sect3 id="zend.form.forms.validation.values">
1464 <title>Retrieving Valid Values Only</title>
1467 There are scenarios when you want to allow your user to work on a valid form
1468 in several steps. Meanwhile you allow the user to save the form with any
1469 set of values inbetween. Then if all the data is specified you can transfer
1470 the model from the building or prototying stage to a valid stage.
1474 You can retrieve all the valid values that match the submitted data by calling:
1477 <programlisting language="php"><![CDATA[
1478 $validValues = $form->getValidValues($_POST);
1479 ]]></programlisting>
1483 <sect2 id="zend.form.forms.methods">
1487 以下の一覧は、<classname>Zend_Form</classname> のメソッドをタイプ別にまとめたものです。
1491 <listitem><para>設定</para>
1493 <listitem><para><methodname>setOptions(array $options)</methodname></para></listitem>
1495 <listitem><para><methodname>setConfig(Zend_Config $config)</methodname></para></listitem>
1499 <listitem><para>プラグインローダーおよびパス</para>
1501 <listitem><para><methodname>setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type = null)</methodname></para></listitem>
1503 <listitem><para><methodname>getPluginLoader($type = null)</methodname></para></listitem>
1505 <listitem><para><methodname>addPrefixPath($prefix, $path, $type = null) </methodname></para></listitem>
1507 <listitem><para><methodname>addPrefixPaths(array $spec)</methodname></para></listitem>
1509 <listitem><para><methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname></para></listitem>
1511 <listitem><para><methodname>addElementPrefixPaths(array $spec)</methodname></para></listitem>
1513 <listitem><para><methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname></para></listitem>
1517 <listitem><para>メタデータ</para>
1519 <listitem><para><methodname>setAttrib($key, $value)</methodname></para></listitem>
1521 <listitem><para><methodname>addAttribs(array $attribs)</methodname></para></listitem>
1523 <listitem><para><methodname>setAttribs(array $attribs)</methodname></para></listitem>
1525 <listitem><para><methodname>getAttrib($key)</methodname></para></listitem>
1527 <listitem><para><methodname>getAttribs()</methodname></para></listitem>
1529 <listitem><para><methodname>removeAttrib($key)</methodname></para></listitem>
1531 <listitem><para><methodname>clearAttribs()</methodname></para></listitem>
1533 <listitem><para><methodname>setAction($action)</methodname></para></listitem>
1535 <listitem><para><methodname>getAction()</methodname></para></listitem>
1537 <listitem><para><methodname>setMethod($method)</methodname></para></listitem>
1539 <listitem><para><methodname>getMethod()</methodname></para></listitem>
1541 <listitem><para><methodname>setName($name)</methodname></para></listitem>
1543 <listitem><para><methodname>getName()</methodname></para></listitem>
1547 <listitem><para>要素</para>
1549 <listitem><para><methodname>addElement($element, $name = null, $options = null)</methodname></para></listitem>
1551 <listitem><para><methodname>addElements(array $elements)</methodname></para></listitem>
1553 <listitem><para><methodname>setElements(array $elements)</methodname></para></listitem>
1555 <listitem><para><methodname>getElement($name)</methodname></para></listitem>
1557 <listitem><para><methodname>getElements()</methodname></para></listitem>
1559 <listitem><para><methodname>removeElement($name)</methodname></para></listitem>
1561 <listitem><para><methodname>clearElements()</methodname></para></listitem>
1563 <listitem><para><methodname>setDefaults(array $defaults)</methodname></para></listitem>
1565 <listitem><para><methodname>setDefault($name, $value)</methodname></para></listitem>
1567 <listitem><para><methodname>getValue($name)</methodname></para></listitem>
1569 <listitem><para><methodname>getValues()</methodname></para></listitem>
1571 <listitem><para><methodname>getUnfilteredValue($name)</methodname></para></listitem>
1573 <listitem><para><methodname>getUnfilteredValues()</methodname></para></listitem>
1575 <listitem><para><methodname>setElementFilters(array $filters)</methodname></para></listitem>
1577 <listitem><para><methodname>setElementDecorators(array $decorators)</methodname></para></listitem>
1581 <listitem><para>サブフォーム</para>
1583 <listitem><para><methodname>addSubForm(Zend_Form $form, $name, $order = null)</methodname></para></listitem>
1585 <listitem><para><methodname>addSubForms(array $subForms)</methodname></para></listitem>
1587 <listitem><para><methodname>setSubForms(array $subForms)</methodname></para></listitem>
1589 <listitem><para><methodname>getSubForm($name)</methodname></para></listitem>
1591 <listitem><para><methodname>getSubForms()</methodname></para></listitem>
1593 <listitem><para><methodname>removeSubForm($name)</methodname></para></listitem>
1595 <listitem><para><methodname>clearSubForms()</methodname></para></listitem>
1597 <listitem><para><methodname>setSubFormDecorators(array $decorators)</methodname></para></listitem>
1601 <listitem><para>表示グループ</para>
1603 <listitem><para><methodname>addDisplayGroup(array $elements, $name, $options = null)</methodname></para></listitem>
1605 <listitem><para><methodname>addDisplayGroups(array $groups)</methodname></para></listitem>
1607 <listitem><para><methodname>setDisplayGroups(array $groups)</methodname></para></listitem>
1609 <listitem><para><methodname>getDisplayGroup($name)</methodname></para></listitem>
1611 <listitem><para><methodname>getDisplayGroups()</methodname></para></listitem>
1613 <listitem><para><methodname>removeDisplayGroup($name)</methodname></para></listitem>
1615 <listitem><para><methodname>clearDisplayGroups()</methodname></para></listitem>
1617 <listitem><para><methodname>setDisplayGroupDecorators(array $decorators)</methodname></para></listitem>
1621 <listitem><para>検証</para>
1623 <listitem><para><methodname>populate(array $values)</methodname></para></listitem>
1625 <listitem><para><methodname>isValid(array $data)</methodname></para></listitem>
1627 <listitem><para><methodname>isValidPartial(array $data)</methodname></para></listitem>
1629 <listitem><para><methodname>processAjax(array $data)</methodname></para></listitem>
1631 <listitem><para><methodname>persistData()</methodname></para></listitem>
1633 <listitem><para><methodname>getErrors($name = null)</methodname></para></listitem>
1635 <listitem><para><methodname>getMessages($name = null)</methodname></para></listitem>
1639 <listitem><para>レンダリング</para>
1641 <listitem><para><methodname>setView(Zend_View_Interface $view = null)</methodname></para></listitem>
1643 <listitem><para><methodname>getView()</methodname></para></listitem>
1645 <listitem><para><methodname>addDecorator($decorator, $options = null)</methodname></para></listitem>
1647 <listitem><para><methodname>addDecorators(array $decorators)</methodname></para></listitem>
1649 <listitem><para><methodname>setDecorators(array $decorators)</methodname></para></listitem>
1651 <listitem><para><methodname>getDecorator($name)</methodname></para></listitem>
1653 <listitem><para><methodname>getDecorators()</methodname></para></listitem>
1655 <listitem><para><methodname>removeDecorator($name)</methodname></para></listitem>
1657 <listitem><para><methodname>clearDecorators()</methodname></para></listitem>
1659 <listitem><para><methodname>render(Zend_View_Interface $view = null)</methodname></para></listitem>
1663 <listitem><para>I18n</para>
1665 <listitem><para><methodname>setTranslator(Zend_Translate_Adapter $translator = null)</methodname></para></listitem>
1667 <listitem><para><methodname>getTranslator()</methodname></para></listitem>
1669 <listitem><para><methodname>setDisableTranslator($flag)</methodname></para></listitem>
1671 <listitem><para><methodname>translatorIsDisabled()</methodname></para></listitem>
1677 <sect2 id="zend.form.forms.config">
1681 <classname>Zend_Form</classname> は、
1682 <methodname>setOptions()</methodname> や <methodname>setConfig()</methodname> を用いて
1684 <classname>Zend_Config</classname> オブジェクトを渡して)
1686 これらのメソッドを使用して、フォームの要素や表示グループ、デコレータ、
1691 全般的なルールとして、もし 'set' + オプションのキー
1692 という名前のメソッドが <classname>Zend_Form</classname>
1693 にあった場合は、そのメソッドを使用するとオプションを設定できます。
1696 <methodname>setAttrib()</methodname> に渡されます。
1700 このルールには、次のような例外があります。
1705 <code>prefixPaths</code> は
1706 <methodname>addPrefixPaths()</methodname> に渡されます。
1710 <code>elementPrefixPaths</code> は
1711 <methodname>addElementPrefixPaths()</methodname> に渡されます。
1715 <code>displayGroupPrefixPaths</code> は
1716 <methodname>addDisplayGroupPrefixPaths()</methodname> に渡されます。
1720 <para>以下のセッターはこの方式では設定できません。</para>
1723 <listitem><para><code>setAttrib (ただし、setAttribs は動作します)</code></para></listitem>
1725 <listitem><para><code>setConfig</code></para></listitem>
1727 <listitem><para><code>setDefault</code></para></listitem>
1729 <listitem><para><code>setOptions</code></para></listitem>
1731 <listitem><para><code>setPluginLoader</code></para></listitem>
1733 <listitem><para><code>setSubForms</code></para></listitem>
1735 <listitem><para><code>setTranslator</code></para></listitem>
1737 <listitem><para><code>setView</code></para></listitem>
1743 例として、すべての型の設定データを渡すファイルを見てみましょう。
1746 <programlisting language="ini"><![CDATA[
1748 name = "registration"
1749 action = "/user/register"
1751 attribs.class = "zend_form"
1752 attribs.onclick = "validate(this)"
1754 disableTranslator = 0
1756 prefixPath.element.prefix = "My_Element"
1757 prefixPath.element.path = "My/Element/"
1758 elementPrefixPath.validate.prefix = "My_Validate"
1759 elementPrefixPath.validate.path = "My/Validate/"
1760 displayGroupPrefixPath.prefix = "My_Group"
1761 displayGroupPrefixPath.path = "My/Group/"
1763 elements.username.type = "text"
1764 elements.username.options.label = "Username"
1765 elements.username.options.validators.alpha.validator = "Alpha"
1766 elements.username.options.filters.lcase = "StringToLower"
1767 ; more elements, of course...
1769 elementFilters.trim = "StringTrim"
1770 ;elementDecorators.trim = "StringTrim"
1772 displayGroups.login.elements.username = "username"
1773 displayGroups.login.elements.password = "password"
1774 displayGroupDecorators.elements.decorator = "FormElements"
1775 displayGroupDecorators.fieldset.decorator = "Fieldset"
1777 decorators.elements.decorator = "FormElements"
1778 decorators.fieldset.decorator = "FieldSet"
1779 decorators.fieldset.decorator.options.class = "zend_form"
1780 decorators.form.decorator = "Form"
1781 ]]></programlisting>
1784 これは、<acronym>XML</acronym> や <acronym>PHP</acronym>
1785 の配列形式の設定ファイルにも簡単に置き換えることができます。
1789 <sect2 id="zend.form.forms.custom">
1790 <title>カスタムフォーム</title>
1793 独自の設定のフォームを使用するもうひとつの方法は、
1794 <classname>Zend_Form</classname> のサブクラスを作成することです。
1800 フォームのユニットテストを容易に行うことができ、
1801 検証やレンダリングが期待通りのものかを確認しやすくなる。
1805 個々の要素に対する決め細やかな制御ができる。
1809 フォームオブジェクトの再利用がしやすくなり、移植性が高まる
1810 (設定ファイルの内容を気にする必要がなくなる)。
1819 一般的な使用法としては、<methodname>init()</methodname>
1820 メソッドでフォーム要素などの設定を行います。
1823 <programlisting language="php"><![CDATA[
1824 class My_Form_Login extends Zend_Form
1826 public function init()
1828 $username = new Zend_Form_Element_Text('username');
1829 $username->class = 'formtext';
1830 $username->setLabel('Username:')
1831 ->setDecorators(array(
1833 array('helper' => 'formText')),
1835 array('class' => 'label'))
1838 $password = new Zend_Form_Element_Password('password');
1839 $password->class = 'formtext';
1840 $password->setLabel('Username:')
1841 ->setDecorators(array(
1843 array('helper' => 'formPassword')),
1845 array('class' => 'label'))
1848 $submit = new Zend_Form_Element_Submit('login');
1849 $submit->class = 'formsubmit';
1850 $submit->setValue('Login')
1851 ->setDecorators(array(
1853 array('helper' => 'formSubmit'))
1856 $this->addElements(array(
1862 $this->setDecorators(array(
1869 ]]></programlisting>
1872 このフォームのインスタンスを作成するのは、次のように簡単です。
1875 <programlisting language="php"><![CDATA[
1876 $form = new My_Form_Login();
1877 ]]></programlisting>
1880 そして、すべての機能はすでに準備済みの状態で、
1881 設定ファイルは不要です (この例はかなり単純化していることに注意しましょう。
1882 バリデーションや要素のフィルタなどは省略しています)。
1886 独自のフォームを作成する理由としてもうひとつよくあるのが、
1887 デフォルトのデコレータを定義したいというものです。
1888 この場合は <methodname>loadDefaultDecorators()</methodname> メソッドを上書きします。
1891 <programlisting language="php"><![CDATA[
1892 class My_Form_Login extends Zend_Form
1894 public function loadDefaultDecorators()
1896 $this->setDecorators(array(
1903 ]]></programlisting>
1907 vim:se ts=4 sw=4 et: