[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ja / module_specs / Zend_Form-Forms.xml
blobbf85861da08ad5dd9d0fc3066da1532b1032ba26
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20774 -->
4 <sect1 id="zend.form.forms">
5     <title>Zend_Form によるフォームの作成</title>
7     <para>
8         <classname>Zend_Form</classname> クラスは、フォームの要素や
9         表示グループ、そしてサブフォームの集約を行います。
10         そして、その要素に対して次のような操作を行います。
11     </para>
13     <itemizedlist>
14         <listitem><para>
15             入力の検証、エラーコードやメッセージの取得
16         </para></listitem>
18         <listitem><para>
19             値の集約 (すべての項目についてのフィルタリング前/
20             フィルタリング後の値の取得など)
21         </para></listitem>
23         <listitem><para>
24             すべての項目についての反復処理。
25             登録した順、あるいは各項目から取得した順序ヒントに従った順での処理
26         </para></listitem>
28         <listitem><para>
29             フォーム全体のレンダリング。デコレータでレンダリング方法をカスタマイズしたり、
30             フォームの各項目を順次処理したりなど
31         </para></listitem>
32     </itemizedlist>
34     <para>
35         <classname>Zend_Form</classname> で作成したフォームが複雑なものになることもありますが、
36         シンプルなフォームで使用するのがもっともよくある使用例でしょう。
37         手早いアプリケーション開発 (RAD) やプロトタイピングでの使用に最適です。
38     </para>
40     <para>
41         もっとも基本的な使用法は、単にフォームオブジェクトを作成するものです。
42     </para>
44     <programlisting language="php"><![CDATA[
45 // 汎用的なフォームオブジェクト
46 $form = new Zend_Form();
48 // 独自のフォームオブジェクト
49 $form = new My_Form()
50 ]]></programlisting>
52     <para>
53         <classname>Zend_Config</classname> のインスタンスあるいは配列で設定を渡すことができます。
54         これを使用すると、オブジェクトの状態を設定したり新しい要素を作成したりできます。
55     </para>
57     <programlisting language="php"><![CDATA[
58 // 設定オプションを渡します
59 $form = new Zend_Form($config);
60 ]]></programlisting>
62     <para>
63         <classname>Zend_Form</classname> は順次処理が可能です。
64         各要素や表示グループ、サブフォームごとに処理できます。
65         処理順は、登録した順番および各項目に設定されている順番となります。
66         これは、各要素のレンダリングを適切な順で行いたいときに便利です。
67     </para>
69     <para>
70         <classname>Zend_Form</classname> は、要素や表示グループのファクトリとして使用できると同時に
71         デコレータで自分自身をレンダリングすることもできます。
72     </para>
74     <sect2 id="zend.form.forms.plugins">
75         <title>プラグインローダー</title>
76         <para>
77             <classname>Zend_Form</classname> では、
78             <classname>Zend_Loader_PluginLoader</classname> を使用することで
79             別の要素やデコレータの位置を指定できます。
80             それぞれにプラグインローダーを関連づけることができ、
81             汎用的なアクセサを使用してそれを取得したり変更したりします。
82         </para>
84         <para>
85             使用できるローダーの型は 'element' と 'decorator'
86             です。さまざまなプラグインローダーメソッドが用意されています。
87             型の名前は大文字小文字を区別しません。
88         </para>
90         <para>
91             プラグインローダーで使用できるメソッドは、次のとおりです。
92         </para>
94         <itemizedlist>
95             <listitem><para>
96                 <methodname>setPluginLoader($loader, $type)</methodname>:
97                 $loader はプラグインローダーオブジェクトで、type
98                 は先ほど説明した型のいずれかです。
99                 これは、指定した型のプラグインローダーを
100                 指定したローダーオブジェクトに設定します。
101             </para></listitem>
103             <listitem><para>
104                 <methodname>getPluginLoader($type)</methodname>:
105                 $type に関連づけられたプラグインローダーを取得します。
106             </para></listitem>
108             <listitem><para>
109                 <methodname>addPrefixPath($prefix, $path, $type = null)</methodname>:
110                 プレフィックスとパスの関連づけを、$type で指定したローダーに指定します。
111                 $type が <constant>NULL</constant> の場合はそのパスをすべてのローダーに追加します。この場合、
112                 プレフィックスの後に "_Element" および
113                 "_Decorator" を追加し、パスに "Element/" および
114                 "Decorator/" を追加します。追加のフォーム要素クラス群をすべて同じ階層に配置した場合は、
115                 このメソッドを使用すると簡単に基底プレフィックスを設定できます。
116             </para></listitem>
118             <listitem><para>
119                 <methodname>addPrefixPaths(array $spec)</methodname>:
120                 複数のパスを、ひとつあるは複数のプラグインローダーに一度に追加します。
121                 配列の各要素は、キー 'path'、'prefix' および
122                 'type' を持つ配列となります。
123             </para></listitem>
124         </itemizedlist>
126         <para>
127             さらに、<classname>Zend_Form</classname>
128             のインスタンスで作成したすべての要素や表示グループ用のプレフィックスパスを設定するには
129             次のメソッドを使用します。
130         </para>
132         <itemizedlist>
133             <listitem><para>
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                 すべての型で用いる全般的なプレフィックスとみなします。
144             </para></listitem>
146             <listitem><para>
147                 <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>:
148                 <methodname>addPrefixPath()</methodname> と似ていますが、
149                 クラスのプレフィックスとパスを指定しなければなりません。
150                 しかし、表示グループではプラグインとして対応しているのはデコレータだけなので、
151                 <code>$type</code> は不要です。
152             </para></listitem>
153         </itemizedlist>
155         <para>
156             独自の要素やデコレータを使用すると、
157             複数フォーム間で機能を共有したり
158             独自の機能をカプセル化したりできるようになります。
159             独自の要素を既存の標準クラスに置き換えて使用する例については、
160             要素のドキュメントの中の
161             <link linkend="zend.form.elements.loaders.customLabel">独自のラベルを作る例</link>
162             を参照ください。
163         </para>
164     </sect2>
166     <sect2 id="zend.form.forms.elements">
167         <title>要素</title>
168         <para>
169             <classname>Zend_Form</classname> では、フォームに要素を追加したり
170             フォームから要素を削除したりするためのアクセサを提供しています。
171             これらは要素オブジェクトのインスタンスを受け取ることもできますし、
172             ファクトリとして要素オブジェクトのインスタンスを作成させることもできます。
173         </para>
175         <para>
176             要素を追加するもっとも基本的なメソッドが
177             <methodname>addElement()</methodname> です。
178             このメソッドは、 <classname>Zend_Form_Element</classname> 型
179             (あるいは <classname>Zend_Form_Element</classname> を継承したクラス) のオブジェクト
180             あるいは新しい要素を作成するための引数
181             (要素の型や名前、設定オプション) を受け取ります。
182         </para>
184         <para>
185             例を示します。
186         </para>
188         <programlisting language="php"><![CDATA[
189 // 要素のインスタンスを使用します
190 $element = new Zend_Form_Element_Text('foo');
191 $form->addElement($element);
193 // ファクトリを使用します
195 // Zend_Form_Element_Text 型で
196 // 'foo' という名前の要素を作成します
197 $form->addElement('text', 'foo');
199 // 要素の label オプションを渡します
200 $form->addElement('text', 'foo', array('label' => 'Foo:'));
201 ]]></programlisting>
203         <note>
204             <title>addElement() における「流れるようなインターフェイス」の実装</title>
206             <para>
207                 <methodname>addElement()</methodname> は「流れるようなインターフェイス」
208                 を実装しています。つまり、このメソッドは要素ではなく
209                 <classname>Zend_Form</classname> オブジェクトを返すということです。
210                 これによって、複数の addElement() メソッドやその他のフォームメソッド
211                 (<classname>Zend_Form</classname> のすべてのセッターは流れるようなインターフェイスを実装しています)
212                 を連結させることができます。
213             </para>
215             <para>
216                 単に要素を返してほしい場合は、
217                 <methodname>createElement()</methodname> を使いましょう。
218                 概要は以下で説明します。しかし、
219                 <methodname>createElement()</methodname> は要素をフォームにアタッチしないことに注意しましょう。
220             </para>
222             <para>
223                 内部的には、<methodname>addElement()</methodname> は実際には
224                 <methodname>createElement()</methodname> をコールして作成した要素をフォームにアタッチしています。
225             </para>
226         </note>
228         <para>
229             要素をフォームに追加したら、名前を指定してそれを取得できます。
230             取得するには、<methodname>getElement()</methodname> メソッドを使用するか
231             オブジェクトのプロパティとして要素にアクセスします。
232             property:
233         </para>
235         <programlisting language="php"><![CDATA[
236 // getElement():
237 $foo = $form->getElement('foo');
239 // オブジェクトのプロパティとして
240 $foo = $form->foo;
241 ]]></programlisting>
243         <para>
244             時には、フォームにアタッチせずに要素を作成したいこともあるでしょう
245             (フォームに登録されているさまざまなプラグインパスを使いたいけれど、
246             そのオブジェクトは後でサブフォームにアタッチしたい場合など)。
247             そんな場合は <methodname>createElement()</methodname> メソッドを使用します。
248         </para>
250         <programlisting language="php"><![CDATA[
251 // $username は Zend_Form_Element_Text オブジェクトとなります
252 $username = $form->createElement('text', 'username');
253 ]]></programlisting>
255         <sect3 id="zend.form.forms.elements.values">
256             <title>値の設定と取得</title>
258             <para>
259                 フォームの検証をすませたら、通常は値を取得することになるでしょう。
260                 その値を用いてデータベースの更新なりウェブサービスの操作なりといった作業を行います。
261                 すべての要素の値を取得するには <methodname>getValues()</methodname> を使用します。
262                 <methodname>getValue($name)</methodname> を使用すると、
263                 要素名を指定して特定の要素の値を取得できます。
264             </para>
266             <programlisting language="php"><![CDATA[
267 // すべての値を取得します
268 $values = $form->getValues();
270 // 'foo' 要素の値のみを取得します
271 $value = $form->getValue('foo');
272 ]]></programlisting>
274             <para>
275                 レンダリング前に、フォームに特定の値を設定したいこともあるでしょう。
276                 これを行うには <methodname>setDefaults()</methodname> メソッドあるいは
277                 <methodname>populate()</methodname> メソッドを使用します。
278             </para>
280             <programlisting language="php"><![CDATA[
281 $form->setDefaults($data);
282 $form->populate($data);
283 ]]></programlisting>
285             <para>
286                 逆に、値を設定したり検証したりした後でフォームをクリアしたいこともあるでしょう。
287                 これを行うには <methodname>reset()</methodname> メソッドを使用します。
288             </para>
290             <programlisting language="php"><![CDATA[
291 $form->reset();
292 ]]></programlisting>
293         </sect3>
295         <sect3 id="zend.form.forms.elements.global">
296             <title>グローバルな操作</title>
298             <para>
299                 時には、すべての要素に対して何らかの操作を行いたくなることもあります。
300                 ありがちな例としては、すべての要素に対してプラグインのプレフィックスを設定したり
301                 デコレータを設定したり、フィルタを設定したりといったものがあります。
302                 以下に例を示します。
303             </para>
305             <example id="zend.form.forms.elements.global.allpaths">
306                 <title>すべての要素に対するプレフィックスパスの設定</title>
308                 <para>
309                     型を指定してすべての要素に対するプレフィックスパスを設定したり、
310                     グローバルプレフィックスを使用したりする例です。
311                 </para>
313                 <programlisting language="php"><![CDATA[
314 // グローバルプレフィックスパスの設定:
315 // プレフィックス My_Foo_Filter、My_Foo_Validate、
316 // My_Foo_Decorator のパスを作成します。
317 $form->addElementPrefixPath('My_Foo', 'My/Foo/');
319 // フィルタのパスのみ:
320 $form->addElementPrefixPath('My_Foo_Filter',
321                             'My/Foo/Filter',
322                             'filter');
324 // バリデータのパスのみ:
325 $form->addElementPrefixPath('My_Foo_Validate',
326                             'My/Foo/Validate',
327                             'validate');
329 // デコレータのパスのみ:
330 $form->addElementPrefixPath('My_Foo_Decorator',
331                             'My/Foo/Decorator',
332                             'decorator');
333 ]]></programlisting>
334             </example>
336             <example id="zend.form.forms.elements.global.decorators">
337                 <title>すべての要素に対するデコレータの設定</title>
339                 <para>
340                     すべての要素に対するデコレータを設定できます。
341                     <methodname>setElementDecorators()</methodname> に
342                     <methodname>setDecorators()</methodname>
343                     と同じようなデコレータの配列を渡すと、
344                     各要素にそれまで設定されていたすべてのデコレータを上書きします。
345                     この例では、単純に ViewHelper デコレータと
346                     Label デコレータを設定します。
347                 </para>
349                 <programlisting language="php"><![CDATA[
350 $form->setElementDecorators(array(
351     'ViewHelper',
352     'Label'
354 ]]></programlisting>
355             </example>
357             <example id="zend.form.forms.elements.global.decoratorsFilter">
358                 <title>いくつかの要素に対するデコレータの設定</title>
360                 <para>
361                     設定したい要素、あるいは設定したくない要素を指定することで、
362                     一部の要素にだけデコレータを設定することもできます。
363                     <methodname>setElementDecorators()</methodname> の 2 番目の引数に要素名の配列を指定します。
364                     デフォルトでは、ここで指定した要素にのみデコレータが設定されます。
365                     3 番目の引数を渡すこともできます。
366                     これは、設定「したい」要素なのか設定「したくない」
367                     要素なのかを表すフラグとなります。
368                     <constant>FALSE</constant> を渡すと、指定した
369                     <emphasis>以外の</emphasis> すべての要素にデコレータを設定します。
370                     このメソッドの標準的な使用法と同様、
371                     各要素にそれまで設定されていたすべてのデコレータを上書きします。
372                 </para>
374                 <para>
375                     次の例は、
376                     ViewHelper デコレータと Label デコレータを
377                     要素 'foo' および 'bar' に対してのみ使用するものです。
378                 </para>
380                 <programlisting language="php"><![CDATA[
381 $form->setElementDecorators(
382     array(
383         'ViewHelper',
384         'Label'
385     ),
386     array(
387         'foo',
388         'bar'
389     )
391 ]]></programlisting>
393                 <para>
394                     一方、この例では、ViewHelper デコレータと Label
395                     デコレータを 'foo' と 'bar' <emphasis>以外の</emphasis>
396                     すべての要素に対して使用します。
397                 </para>
399                 <programlisting language="php"><![CDATA[
400 $form->setElementDecorators(
401     array(
402         'ViewHelper',
403         'Label'
404     ),
405     array(
406         'foo',
407         'bar'
408     ),
409     false
411 ]]></programlisting>
412             </example>
414                 <note>
415                     <title>要素によっては不適切なデコレータもある</title>
417                     <para>
418                         <methodname>setElementDecorators()</methodname>
419                         はよい方法に見えますが、時には予期せぬ結果を引き起こすこともあります。
420                         たとえば、ボタン系の要素 (Submit, Button, Reset)
421                         では現在ラベルをボタンの値として使用しています。
422                         そして ViewHelper デコレータや DtDdWrapper デコレータは、
423                         余計なラベルやエラー、ヒントをレンダリングしないためにのみ用います。
424                         上の例ではいくつかのラベルが重複してしまいます。
425                     </para>
427                     <para>
428                         先ほどの例に示したように、設定したい要素/したくない要素
429                         を配列で指定するようにすれば、この問題を回避できます。
430                     </para>
432                     <para>
433                         したがって、このメソッドは注意して使うようにしましょう。
434                         場合によっては、いくつかの要素を除外するか、
435                         そののデコレータを変更して予期せぬ結果を防ぐ必要があります。
436                     </para>
437                 </note>
439             <example id="zend.form.forms.elements.global.filters">
440                 <title>すべての要素に対するフィルタの設定</title>
442                 <para>
443                     すべての要素に対して同じフィルタを適用したくなることもよくあります。
444                     たとえば、すべての値を <methodname>trim()</methodname> するなどです。
445                 </para>
447         <programlisting language="php"><![CDATA[
448 $form->setElementFilters(array('StringTrim'));
449 ]]></programlisting>
450             </example>
451         </sect3>
453         <sect3 id="zend.form.forms.elements.methods">
454             <title>要素を操作するためのメソッド</title>
456             <para>
457                 次のメソッドを使用して、要素を操作します。
458             </para>
460             <itemizedlist>
461                 <listitem><para>
462                     <methodname>createElement($element, $name = null, $options = null)</methodname>
463                 </para></listitem>
465                 <listitem><para>
466                     <methodname>addElement($element, $name = null, $options = null)</methodname>
467                 </para></listitem>
469                 <listitem><para>
470                     <methodname>addElements(array $elements)</methodname>
471                 </para></listitem>
473                 <listitem><para>
474                     <methodname>setElements(array $elements)</methodname>
475                 </para></listitem>
477                 <listitem><para>
478                     <methodname>getElement($name)</methodname>
479                 </para></listitem>
481                 <listitem><para>
482                     <methodname>getElements()</methodname>
483                 </para></listitem>
485                 <listitem><para>
486                     <methodname>removeElement($name)</methodname>
487                 </para></listitem>
489                 <listitem><para>
490                     <methodname>clearElements()</methodname>
491                 </para></listitem>
493                 <listitem><para>
494                     <methodname>setDefaults(array $defaults)</methodname>
495                 </para></listitem>
497                 <listitem><para>
498                     <methodname>setDefault($name, $value)</methodname>
499                 </para></listitem>
501                 <listitem><para>
502                     <methodname>getValue($name)</methodname>
503                 </para></listitem>
505                 <listitem><para>
506                     <methodname>getValues()</methodname>
507                 </para></listitem>
509                 <listitem><para>
510                     <methodname>getUnfilteredValue($name)</methodname>
511                 </para></listitem>
513                 <listitem><para>
514                     <methodname>getUnfilteredValues()</methodname>
515                 </para></listitem>
517                 <listitem><para>
518                     <methodname>setElementFilters(array $filters)</methodname>
519                 </para></listitem>
521                 <listitem><para>
522                     <methodname>setElementDecorators(array $decorators)</methodname>
523                 </para></listitem>
525                 <listitem><para>
526                     <methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname>
527                 </para></listitem>
529                 <listitem><para>
530                     <methodname>addElementPrefixPaths(array $spec)</methodname>
531                 </para></listitem>
532             </itemizedlist>
533         </sect3>
534     </sect2>
536     <sect2 id="zend.form.forms.displaygroups">
537         <title>表示グループ</title>
539         <para>
540             表示グループを使用すると、複数の要素を仮想的にグループ化して
541             表示させることができます。
542             フォーム内の各要素に対しては名前を指定してアクセスできますが、
543             フォームの要素を順次処理したりレンダリングしたりするときは
544             表示グループは一括して扱われます。
545             表示グループのもっとも一般的な使用例は、
546             フィールドセット内の要素をグループ化することです。
547         </para>
549         <para>
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> オブジェクトを渡すこともできます。
558         </para>
560         <para>
561             'username' と 'password' という要素がすでにフォームに登録済みである場合に、
562             次のコードを使用するとそれらを表示グループ
563             'login' にまとめることができます。
564         </para>
566         <programlisting language="php"><![CDATA[
567 $form->addDisplayGroup(array('username', 'password'), 'login');
568 ]]></programlisting>
570         <para>
571             表示グループにアクセスするには、
572             <methodname>getDisplayGroup()</methodname> メソッドを使用するか
573             あるいは表示グループ名を指定します。
574         </para>
576         <programlisting language="php"><![CDATA[
577 // getDisplayGroup() の使用
578 $login = $form->getDisplayGroup('login');
580 // オーバーロードの使用
581 $login = $form->login;
582 ]]></programlisting>
584         <note>
585             <title>読み込み不要なデフォルトのデコレータ</title>
587             <para>
588                 デフォルトのデコレータは、
589                 オブジェクトの初期化時に読み込まれるようになっています。
590                 この機能を無効にするには、表示グループの作成時にオプション
591                 'disableLoadDefaultDecorators' を指定します。
592             </para>
594             <programlisting language="php"><![CDATA[
595 $form->addDisplayGroup(
596     array('foo', 'bar'),
597     'foobar',
598     array('disableLoadDefaultDecorators' => true)
600 ]]></programlisting>
602             <para>
603                 このオプションは、他のオプションと混用することもできます。
604                 その場合はオプションの配列や <classname>Zend_Config</classname>
605                 オブジェクトを使用します。
606             </para>
607         </note>
609         <sect3 id="zend.form.forms.displaygroups.global">
610             <title>グローバルな操作</title>
612             <para>
613                 要素と同様、表示グループに対しても全体に共通の操作があるでしょう。
614                 デコレータを設定したり、デコレータを探すプラグインパスを設定したりといったものです。
615             </para>
617             <example id="zend.form.forms.displaygroups.global.paths">
618                 <title>すべての表示グループに対するデコレータプレフィックスパスの設定</title>
620                 <para>
621                     デフォルトでは、表示グループはフォームが使用しているデコレータパスを継承します。
622                     別の場所を探すようにしたい場合は
623                     <methodname>addDisplayGroupPrefixPath()</methodname> メソッドを使用します。
624                 </para>
626                 <programlisting language="php"><![CDATA[
627 $form->addDisplayGroupPrefixPath('My_Foo_Decorator', 'My/Foo/Decorator');
628 ]]></programlisting>
629             </example>
631             <example id="zend.form.forms.displaygroups.global.decorators">
632                 <title>すべての表示グループに対するデコレータの設定</title>
634                 <para>
635                     すべての表示グループに対するデコレータを設定できます。
636                     <methodname>setDisplayGroupDecorators()</methodname> に
637                     <methodname>setDecorators()</methodname>
638                     と同じようなデコレータの配列を渡すと、
639                     各表示グループにそれまで設定されていたすべてのデコレータを上書きします。
640                     この例では、単純に fieldset デコレータ
641                     (FormElements デコレータは、要素を順次処理するために必須です)
642                     を設定します。
643                 </para>
645                 <programlisting language="php"><![CDATA[
646 $form->setDisplayGroupDecorators(array(
647     'FormElements',
648     'Fieldset'
650 ]]></programlisting>
651             </example>
652         </sect3>
654         <sect3 id="zend.form.forms.displaygroups.customClasses">
655             <title>独自の表示グループクラスの使用</title>
657             <para>
658                 デフォルトでは、<classname>Zend_Form</classname> は
659                 表示グループ用に <classname>Zend_Form_DisplayGroup</classname>
660                 クラスを使用します。
661                 このクラスを継承すれば、独自の機能を持つクラスを作成できます。
662                 <methodname>addDisplayGroup()</methodname>
663                 には具象インスタンスを渡すことはできませんが、
664                 どのクラスを使用するのかをオプションで指定できます。
665                 このときに使用するキーは 'displayGroupClass' です。
666             </para>
668             <programlisting language="php"><![CDATA[
669 // 'My_DisplayGroup' クラスを使用します
670 $form->addDisplayGroup(
671     array('username', 'password'),
672     'user',
673     array('displayGroupClass' => 'My_DisplayGroup')
675 ]]></programlisting>
677             <para>
678                 そのクラスがまだ読み込まれていない場合は、<classname>Zend_Form</classname>
679                 は <classname>Zend_Loader</classname> を使ってクラスを読み込みます。
680             </para>
682             <para>
683                 デフォルトの表示グループクラスを指定し、
684                 そのフォームオブジェクトで作成するすべての表示グループで
685                 同じクラスを使わせることもできます。
686             </para>
688             <programlisting language="php"><![CDATA[
689 // すべての表示グループで 'My_DisplayGroup' クラスを使用します
690 $form->setDefaultDisplayGroupClass('My_DisplayGroup');
691 ]]></programlisting>
693             <para>
694                 これは、設定項目
695                 'defaultDisplayGroupClass' で指定することもできます。
696                 そうすれば、事前にこのクラスが読み込まれて
697                 すべての表示グループでこのクラスを使うようになります。
698             </para>
699         </sect3>
701         <sect3 id="zend.form.forms.displaygroups.interactionmethods">
702             <title>表示グループを操作するためのメソッド</title>
704             <para>
705                 次のメソッドを使用して、表示グループを操作します。
706             </para>
708             <itemizedlist>
709                 <listitem><para>
710                     <methodname>addDisplayGroup(array $elements, $name, $options = null)</methodname>
711                 </para></listitem>
713                 <listitem><para>
714                     <methodname>addDisplayGroups(array $groups)</methodname>
715                 </para></listitem>
717                 <listitem><para>
718                     <methodname>setDisplayGroups(array $groups)</methodname>
719                 </para></listitem>
721                 <listitem><para>
722                     <methodname>getDisplayGroup($name)</methodname>
723                 </para></listitem>
725                 <listitem><para>
726                     <methodname>getDisplayGroups()</methodname>
727                 </para></listitem>
729                 <listitem><para>
730                     <methodname>removeDisplayGroup($name)</methodname>
731                 </para></listitem>
733                 <listitem><para>
734                     <methodname>clearDisplayGroups()</methodname>
735                 </para></listitem>
737                 <listitem><para>
738                     <methodname>setDisplayGroupDecorators(array $decorators)</methodname>
739                 </para></listitem>
741                 <listitem><para>
742                     <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>
743                 </para></listitem>
745                 <listitem><para>
746                     <methodname>setDefaultDisplayGroupClass($class)</methodname>
747                 </para></listitem>
749                 <listitem><para>
750                     <methodname>getDefaultDisplayGroupClass($class)</methodname>
751                 </para></listitem>
752             </itemizedlist>
753         </sect3>
755         <sect3 id="zend.form.forms.displaygroups.methods">
756             <title>Zend_Form_DisplayGroup のメソッド</title>
758             <para>
759                 <classname>Zend_Form_DisplayGroup</classname> には次のようなメソッドがあります。
760                 タイプ別にまとめます。
761             </para>
763             <itemizedlist>
764                 <listitem><para>設定</para>
765                     <itemizedlist>
766                         <listitem><para><methodname>setOptions(array $options)</methodname></para></listitem>
768                         <listitem><para><methodname>setConfig(Zend_Config $config)</methodname></para></listitem>
769                     </itemizedlist>
770                 </listitem>
772                 <listitem><para>メタデータ</para>
773                     <itemizedlist>
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>
803                     </itemizedlist>
804                 </listitem>
806                 <listitem><para>要素</para>
807                     <itemizedlist>
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>
823                     </itemizedlist>
824                 </listitem>
826                 <listitem><para>プラグインローダー</para>
827                     <itemizedlist>
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>
835                     </itemizedlist>
836                 </listitem>
838                 <listitem><para>デコレータ</para>
839                     <itemizedlist>
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>
853                     </itemizedlist>
854                 </listitem>
856                 <listitem><para>レンダリング</para>
857                     <itemizedlist>
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>
863                     </itemizedlist>
864                 </listitem>
866                 <listitem><para>I18n</para>
867                     <itemizedlist>
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>
875                     </itemizedlist>
876                 </listitem>
877             </itemizedlist>
878         </sect3>
879     </sect2>
881     <sect2 id="zend.form.forms.subforms">
882         <title>サブフォーム</title>
884         <para>
885             サブフォームの役割は、次のようなものです。
886         </para>
888         <itemizedlist>
889             <listitem><para>
890                 論理的な要素グループの作成。
891                 サブフォームは単なるフォームであり、
892                 サブフォームを独立したエンティティとして検証できます。
893             </para></listitem>
895             <listitem><para>
896                 複数ページにまたがるフォームの作成。
897                 サブフォームは単なるフォームなので、
898                 ページごとに別々のサブフォームを表示させて複数ページのフォームを作成し、
899                 各ページで独自のバリデーションを行うことができます。
900                 すべてのサブフォームの検証に成功した時点ではじめて
901                 フォームの検証が完了したことになります。
902             </para></listitem>
904             <listitem><para>
905                 表示のグループ化。
906                 表示グループと同様、サブフォームについても
907                 フォーム内でのレンダリングの際にはひとつの要素として扱われます。
908                 しかし注意しましょう。
909                 親フォームからはサブフォームの要素にはアクセスできません。
910             </para></listitem>
911         </itemizedlist>
913         <para>
914             サブフォームは <classname>Zend_Form</classname> のオブジェクトです。一般的には
915             <classname>Zend_Form_SubForm</classname> のオブジェクトとなります。
916             後者のクラスには、大きなフォームに含めるのに適したデコレータが含まれています
917             (HTML の form タグをレンダリングせず、要素をグループ化するものです)。
918             サブフォームをアタッチするには、単にそれを要素に追加して名前を指定するだけです。
919         </para>
921         <programlisting language="php"><![CDATA[
922 $form->addSubForm($subForm, 'subform');
923 ]]></programlisting>
925         <para>
926             サブフォームを取得するには、
927             <methodname>getSubForm($name)</methodname> を使用するかあるいはサブフォームの名前を使用します。
928         </para>
930         <programlisting language="php"><![CDATA[
931 // getSubForm() の使用
932 $subForm = $form->getSubForm('subform');
934 // オーバーロードの使用
935 $subForm = $form->subform;
936 ]]></programlisting>
938         <para>
939             サブフォームは、親フォームの要素のひとつとして順次処理できます。
940             サブフォーム内の要素は処理できません。
941         </para>
943         <sect3 id="zend.form.forms.subforms.global">
944             <title>グローバルな操作</title>
946             <para>
947                 要素や表示グループと同様、サブフォームに対しても全体に共通の操作があるでしょう。
948                 しかし、表示グループや要素とは異なり、
949                 サブフォームは親フォームのほとんどの機能を継承しています。
950                 グローバルな操作として本当に必要なのは、サブフォーム用のデコレータの設定くらいです。
951                 そんな場合には <methodname>setSubFormDecorators()</methodname>
952                 メソッドを使用します。次の例では、すべてのサブフォームに対して
953                 単純に fieldset デコレータを設定します
954                 (FormElements デコレータは、要素を順次処理するために必須です)。
955             </para>
957             <programlisting language="php"><![CDATA[
958 $form->setSubFormDecorators(array(
959     'FormElements',
960     'Fieldset'
962 ]]></programlisting>
963         </sect3>
965         <sect3 id="zend.form.forms.subforms.methods">
966             <title>サブフォームを操作するためのメソッド</title>
968             <para>
969                 次のメソッドを使用して、サブフォームを操作します。
970             </para>
972             <itemizedlist>
973                 <listitem><para>
974                     <methodname>addSubForm(Zend_Form $form, $name, $order = null)</methodname>
975                 </para></listitem>
977                 <listitem><para>
978                     <methodname>addSubForms(array $subForms)</methodname>
979                 </para></listitem>
981                 <listitem><para>
982                     <methodname>setSubForms(array $subForms)</methodname>
983                 </para></listitem>
985                 <listitem><para>
986                     <methodname>getSubForm($name)</methodname>
987                 </para></listitem>
989                 <listitem><para>
990                     <methodname>getSubForms()</methodname>
991                 </para></listitem>
993                 <listitem><para>
994                     <methodname>removeSubForm($name)</methodname>
995                 </para></listitem>
997                 <listitem><para>
998                     <methodname>clearSubForms()</methodname>
999                 </para></listitem>
1001                 <listitem><para>
1002                     <methodname>setSubFormDecorators(array $decorators)</methodname>
1003                 </para></listitem>
1004             </itemizedlist>
1005         </sect3>
1006     </sect2>
1008     <sect2 id="zend.form.forms.metadata">
1009         <title>メタデータおよび属性</title>
1011         <para>
1012             フォームで一番大切なのはフォームが含む要素ですが、
1013             フォームにはそれ以外のメタデータも含まれます。たとえばフォームの名前
1014             (この名前は、HTML のマークアップ時に ID として用いられます)
1015             やアクション、そしてメソッドなどです。
1016             要素や表示グループ、サブフォームの数も含まれます。
1017             それ以外にも任意のメタデータを含めることができます
1018             (通常は、form タグで指定する HTML 属性などをここに含めます)。
1019         </para>
1021         <para>
1022             フォームの名前を設定したり取得したりするには name アクセサを使用します。
1023         </para>
1025         <programlisting language="php"><![CDATA[
1026 // 名前を設定します
1027 $form->setName('registration');
1029 // 名前を取得します
1030 $name = $form->getName();
1031 ]]></programlisting>
1033         <para>
1034             アクション (フォームを送信したときに進む URL)
1035             やメソッド (送信する方法。たとえば 'POST' あるいは 'GET')
1036             を設定するには、それぞれ action アクセサおよび
1037             method アクセサを使用します。
1038         </para>
1040         <programlisting language="php"><![CDATA[
1041 // アクションとメソッドを設定します
1042 $form->setAction('/user/login')
1043      ->setMethod('post');
1044 ]]></programlisting>
1046         <para>
1047             フォームのエンコード形式を設定するには
1048             enctype アクセサを使用します。
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             しかし、これ以外にも任意のエンコード形式を指定できます。
1055         </para>
1057         <programlisting language="php"><![CDATA[
1058 // アクションとメソッド、そして enctype を設定します
1059 $form->setAction('/user/login')
1060      ->setMethod('post')
1061      ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
1062 ]]></programlisting>
1064         <note>
1065             <para>
1066                 メソッドやアクション、enctype はレンダリングの際に内部的に使われるものであり、
1067                 バリデーション用のものではありません。
1068             </para>
1069         </note>
1071         <para>
1072             <classname>Zend_Form</classname> は <code>Countable</code>
1073             インターフェイスを実装しており、count 関数の引数として使用できます。
1074         </para>
1076         <programlisting language="php"><![CDATA[
1077 $numItems = count($form);
1078 ]]></programlisting>
1080         <para>
1081             任意のメタデータを設定するには attribs アクセサを使用します。
1082             <classname>Zend_Form</classname> ではオーバーロードを使用して
1083             要素や表示グループそしてサブフォームにアクセスしているので、
1084             これがメタデータにアクセスするための唯一の方法となります。
1085         </para>
1087         <programlisting language="php"><![CDATA[
1088 // 属性を設定します
1089 $form->setAttrib('class', 'zend-form')
1090      ->addAttribs(array(
1091          'id'       => 'registration',
1092          'onSubmit' => 'validate(this)',
1093      ));
1095 // 属性を取得します
1096 $class = $form->getAttrib('class');
1097 $attribs = $form->getAttribs();
1099 // 属性を削除します
1100 $form->removeAttrib('onSubmit');
1102 // すべての属性を削除します
1103 $form->clearAttribs();
1104 ]]></programlisting>
1105     </sect2>
1107     <sect2 id="zend.form.forms.decorators">
1108         <title>デコレータ</title>
1110         <para>
1111             フォームのマークアップを作成するのは手間のかかる作業です。
1112             特に、検証エラーの表示や値の送信などの決まりきった処理を何度も行うのは大変なことです。
1113             この問題に対する <classname>Zend_Form</classname>
1114             からの回答が <emphasis>デコレータ</emphasis> です。
1115         </para>
1117         <para>
1118             <classname>Zend_Form</classname> オブジェクトのデコレータを使用して、
1119             フォームをレンダリングします。
1120             FormElements デコレータは、フォームのすべての項目
1121             (要素、表示グループ、サブフォーム)
1122             を順次処理し、それらをレンダリングした結果を返します。
1123             それ以外のデコレータを使用して、コンテンツをラップしたり
1124             前後に何かを追加したりできます。
1125         </para>
1127         <para>
1128             <classname>Zend_Form</classname> のデフォルトのデコレータは、FormElements と
1129             HtmlTag (定義リストによるラッピングをします)、そして Form です。
1130             以下のコードと同様です。
1131         </para>
1133         <programlisting language="php"><![CDATA[
1134 $form->setDecorators(array(
1135     'FormElements',
1136     array('HtmlTag', array('tag' => 'dl')),
1137     'Form'
1139 ]]></programlisting>
1141         <para>
1142             これは、次のような出力をします。
1143         </para>
1145         <programlisting language="html"><![CDATA[
1146 <form action="/form/action" method="post">
1147 <dl>
1149 </dl>
1150 </form>
1151 ]]></programlisting>
1153         <para>
1154             フォームオブジェクトに設定した任意の属性は、
1155             HTML の <code>&lt;form&gt;</code> タグの属性となります。
1156         </para>
1158         <note>
1159             <title>読み込み不要なデフォルトのデコレータ</title>
1161             <para>
1162                 デフォルトのデコレータは、
1163                 オブジェクトの初期化時に読み込まれるようになっています。
1164                 この機能を無効にするには、コンストラクタでオプション
1165                 'disableLoadDefaultDecorators' を指定します。
1166             </para>
1168             <programlisting language="php"><![CDATA[
1169 $form = new Zend_Form(array('disableLoadDefaultDecorators' => true));
1170 ]]></programlisting>
1172             <para>
1173                 このオプションは、他のオプションと混用することもできます。
1174                 その場合はオプションの配列や <classname>Zend_Config</classname>
1175                 オブジェクトを使用します。
1176             </para>
1177         </note>
1179         <note>
1180             <title>同じ型の複数のデコレータの使用法</title>
1182             <para>
1183                 内部的には、<classname>Zend_Form</classname>
1184                 はデコレータのクラスをもとにデコレータを取得しています。
1185                 その結果、同じ型のデコレータを複数使うことができなくなります。
1186                 同じ型のデコレータを複数指定すると、
1187                 後から指定したものが先に指定したものを上書きします。
1188             </para>
1190             <para>
1191                 これを回避するにはエイリアスを使用します。
1192                 デコレータやデコレータ名を <methodname>addDecorator()</methodname>
1193                 の最初の引数として渡すのではなく、ひとつの要素からなる配列を渡します。
1194                 この配列には、デコレータオブジェクトあるいはデコレータ名を指すエイリアスを指定します。
1195             </para>
1197             <programlisting language="php"><![CDATA[
1198 // 'FooBar' へのエイリアス
1199 $form->addDecorator(array('FooBar' => 'HtmlTag'), array('tag' => 'div'));
1201 // 後で、このように取得できます
1202 $form = $element->getDecorator('FooBar');
1203 ]]></programlisting>
1205             <para>
1206                 <methodname>addDecorators()</methodname> メソッドおよび
1207                 <methodname>setDecorators()</methodname> メソッドでは、
1208                 デコレータを表す配列を 'decorator' オプションに渡す必要があります。
1209             </para>
1211             <programlisting language="php"><![CDATA[
1212 // ふたつの 'HtmlTag' デコレータを使用するため、片方に 'FooBar' というエイリアスを指定します
1213 $form->addDecorators(
1214     array('HtmlTag', array('tag' => 'div')),
1215     array(
1216         'decorator' => array('FooBar' => 'HtmlTag'),
1217         'options' => array('tag' => 'dd')
1218     ),
1221 // 後で、このように取得できます
1222 $htmlTag = $form->getDecorator('HtmlTag');
1223 $fooBar  = $form->getDecorator('FooBar');
1224 ]]></programlisting>
1225         </note>
1227         <para>
1228             独自のデコレータを使用してフォームを作成することもできます。
1229             一般的な使用例としては、作成したい HTML が厳密に決まっている場合などがあります。
1230             デコレータでそれとまったく同じ HTML を作成し、単純にそれを返せばいいのです。
1231             個々の要素や表示グループに対してもそれぞれデコレータを使用できます。
1232         </para>
1234         <para>
1235             デコレータ関連のメソッドを以下にまとめます。
1236         </para>
1238         <itemizedlist>
1239                 <listitem><para>
1240                     <methodname>addDecorator($decorator, $options = null)</methodname>
1241                 </para></listitem>
1243                 <listitem><para>
1244                     <methodname>addDecorators(array $decorators)</methodname>
1245                 </para></listitem>
1247                 <listitem><para>
1248                     <methodname>setDecorators(array $decorators)</methodname>
1249                 </para></listitem>
1251                 <listitem><para>
1252                     <methodname>getDecorator($name)</methodname>
1253                 </para></listitem>
1255                 <listitem><para>
1256                     <methodname>getDecorators()</methodname>
1257                 </para></listitem>
1259                 <listitem><para>
1260                     <methodname>removeDecorator($name)</methodname>
1261                 </para></listitem>
1263                 <listitem><para>
1264                     <methodname>clearDecorators()</methodname>
1265                 </para></listitem>
1266         </itemizedlist>
1268         <para>
1269             <classname>Zend_Form</classname> は、
1270             オーバーロードを使用して特定のデコレータをレンダリングすることもできます。
1271             'render' で始まる名前のメソッドを <methodname>__call()</methodname>
1272             で捕捉し、メソッド名の残りの部分にもとづいてデコレータを探します。
1273             見つかった場合は、そのデコレータ
1274             <emphasis>だけ</emphasis> をレンダリングします。
1275             引数を渡すと、それがデコレータの
1276             <methodname>render()</methodname> メソッドにコンテンツとして渡されます。次の例を参照ください。
1277         </para>
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>
1287         <para>
1288             デコレータが存在しない場合は、例外が発生します。
1289         </para>
1290     </sect2>
1292     <sect2 id="zend.form.forms.validation">
1293         <title>バリデーション</title>
1295         <para>
1296             フォームの主な使用法は、送信されたデータを検証することです。
1297             <classname>Zend_Form</classname> は、フォーム全体あるいはその一部を一度に検証したり、
1298             XmlHttpRequests (AJAX) のレスポンスを自動的に検証したりできます。
1299             送信されたデータが無効な場合は、
1300             要素やサブフォームについて
1301             検証エラーのコードやメッセージを取得するメソッドが用意されています。
1302         </para>
1304         <para>
1305             フォーム全体のバリデーションを行うには <methodname>isValid()</methodname> メソッドを使用します。
1306         </para>
1308         <programlisting language="php"><![CDATA[
1309 if (!$form->isValid($_POST)) {
1310     // 検証に失敗しました
1312 ]]></programlisting>
1314         <para>
1315             <methodname>isValid()</methodname> はすべての必須要素の検証を行います。
1316             また非必須要素の中で値が送信された要素についても検証します。
1317         </para>
1319         <para>
1320             時には一部のデータだけを検証したいこともあるでしょう。そんな場合には
1321             <methodname>isValidPartial($data)</methodname> を使用します。
1322         </para>
1324         <programlisting language="php"><![CDATA[
1325 if (!$form->isValidPartial($data)) {
1326     // 検証に失敗しました
1328 ]]></programlisting>
1330         <para>
1331             <methodname>isValidPartial()</methodname> は、
1332             data の項目にマッチする要素についてのみ検証を行います。
1333             マッチする要素がなかった場合は処理をスキップします。
1334         </para>
1336         <para>
1337             <acronym>AJAX</acronym> リクエストの要素や要素グループを検証する際は、
1338             通常はフォームの一部を検証してその結果を <acronym>JSON</acronym> で返すことになります。
1339             <methodname>processAjax()</methodname> が、まさにその作業を行うメソッドです。
1340         </para>
1342         <programlisting language="php"><![CDATA[
1343 $json = $form->processAjax($data);
1344 ]]></programlisting>
1346         <para>
1347             こうすれば、単純に <acronym>JSON</acronym> レスポンスをクライアントに返すことができます。
1348             フォームの検証に成功した場合は、この結果は <constant>TRUE</constant> となります。
1349             失敗した場合は、キーとメッセージのペアを含む javascript
1350             オブジェクトを返します。個々の 'message'
1351             が検証エラーメッセージの配列となります。
1352         </para>
1354         <para>
1355             フォームの検証に失敗した場合は、エラーコードとエラーメッセージをそれぞれ
1356             <methodname>getErrors()</methodname> と
1357             <methodname>getMessages()</methodname> で取得できます。
1358         </para>
1360         <programlisting language="php"><![CDATA[
1361 $codes = $form->getErrors();
1362 $messages = $form->getMessages();
1363 ]]></programlisting>
1365         <note>
1366             <para>
1367                 <methodname>getMessages()</methodname> が返すメッセージは エラーコード/エラーメッセージ
1368                 の配列なので、<methodname>getErrors()</methodname> は通常は不要です。
1369             </para>
1370         </note>
1372         <para>
1373             個々の要素のコードとエラーメッセージを取得するには、
1374             それぞれのメソッドに要素名を渡します。
1375         </para>
1377         <programlisting language="php"><![CDATA[
1378 $codes = $form->getErrors('username');
1379 $messages = $form->getMessages('username');
1380 ]]></programlisting>
1382         <note>
1383             <para>
1384                 注意: 要素を検証する際、<classname>Zend_Form</classname> は各要素の
1385                 <methodname>isValid()</methodname> メソッドに 2 番目の引数を渡します。
1386                 これは検証対象のデータの配列です。
1387                 これを使用すると、他の要素の入力内容をもとにした検証を
1388                 各要素で行うことができます。
1389                 例としては、「パスワード」欄と「パスワード(確認)」
1390                 があるユーザ登録フォームがあります。「パスワード」
1391                 要素の検証には「パスワード(確認)」の入力内容を使用することになるでしょう。
1392             </para>
1393         </note>
1395         <sect3 id="zend.form.forms.validation.errors">
1396             <title>独自のエラーメッセージ</title>
1398             <para>
1399                 時には、要素にアタッチされたバリデータが生成するエラーメッセージではなく
1400                 独自のエラーメッセージを指定したくなることもあるでしょう。
1401                 さらに、時には自分自身でフォームを無効だとマークしたいこともあるでしょう。
1402                 次のメソッドでこの機能を使用できます。
1403             </para>
1405             <itemizedlist>
1406                 <listitem><para>
1407                     <methodname>addErrorMessage($message)</methodname>:
1408                     フォームの検証エラーの際に表示するエラーメッセージを追加します。
1409                     複数回コールすると、新しいメッセージはスタックに追加されます。
1410                 </para></listitem>
1412                 <listitem><para>
1413                     <methodname>addErrorMessages(array $messages)</methodname>:
1414                     フォームの検証エラーの際に表示する複数のエラーメッセージを追加します。
1415                 </para></listitem>
1417                 <listitem><para>
1418                     <methodname>setErrorMessages(array $messages)</methodname>:
1419                     フォームの検証エラーの際に表示する複数のエラーメッセージを追加します。
1420                     それまでに設定されていたすべてのメッセージを上書きします。
1421                 </para></listitem>
1423                 <listitem><para>
1424                     <methodname>getErrorMessages()</methodname>:
1425                     定義済みのカスタムエラーメッセージの一覧を取得します。
1426                 </para></listitem>
1428                 <listitem><para>
1429                     <methodname>clearErrorMessages()</methodname>:
1430                     定義済みのカスタムエラーメッセージをすべて削除します。
1431                 </para></listitem>
1433                 <listitem><para>
1434                     <methodname>markAsError()</methodname>:
1435                     検証に失敗したものとしてフォームにマークします。
1436                 </para></listitem>
1438                 <listitem><para>
1439                     <methodname>addError($message)</methodname>:
1440                     エラーメッセージをカスタムエラーメッセージスタックに追加し、
1441                     フォームを無効とマークします。
1442                 </para></listitem>
1444                 <listitem><para>
1445                     <methodname>addErrors(array $messages)</methodname>:
1446                     複数のエラーメッセージをカスタムエラーメッセージスタックに追加し、
1447                     フォームを無効とマークします。
1448                 </para></listitem>
1450                 <listitem><para>
1451                     <methodname>setErrors(array $messages)</methodname>:
1452                     指定したメッセージでカスタムエラーメッセージスタックを上書きし、
1453                     フォームを無効とマークします。
1454                 </para></listitem>
1455             </itemizedlist>
1457             <para>
1458                 この方式で設定したすべてのエラーは翻訳されることになります。
1459             </para>
1460         </sect3>
1462         <!-- TODO : to be translated -->
1463         <sect3 id="zend.form.forms.validation.values">
1464             <title>Retrieving Valid Values Only</title>
1466             <para>
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.
1471             </para>
1473             <para>
1474                 You can retrieve all the valid values that match the submitted data by calling:
1475             </para>
1477             <programlisting language="php"><![CDATA[
1478 $validValues = $form->getValidValues($_POST);
1479 ]]></programlisting>
1480         </sect3>
1481     </sect2>
1483     <sect2 id="zend.form.forms.methods">
1484         <title>メソッド</title>
1486         <para>
1487             以下の一覧は、<classname>Zend_Form</classname> のメソッドをタイプ別にまとめたものです。
1488         </para>
1490         <itemizedlist>
1491             <listitem><para>設定</para>
1492                 <itemizedlist>
1493                     <listitem><para><methodname>setOptions(array $options)</methodname></para></listitem>
1495                     <listitem><para><methodname>setConfig(Zend_Config $config)</methodname></para></listitem>
1496                 </itemizedlist>
1497             </listitem>
1499             <listitem><para>プラグインローダーおよびパス</para>
1500                 <itemizedlist>
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>
1514                 </itemizedlist>
1515             </listitem>
1517             <listitem><para>メタデータ</para>
1518                 <itemizedlist>
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>
1544                 </itemizedlist>
1545             </listitem>
1547             <listitem><para>要素</para>
1548                 <itemizedlist>
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>
1578                 </itemizedlist>
1579             </listitem>
1581             <listitem><para>サブフォーム</para>
1582                 <itemizedlist>
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>
1598                 </itemizedlist>
1599             </listitem>
1601             <listitem><para>表示グループ</para>
1602                 <itemizedlist>
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>
1618                 </itemizedlist>
1619             </listitem>
1621             <listitem><para>検証</para>
1622                 <itemizedlist>
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>
1636                 </itemizedlist>
1637             </listitem>
1639             <listitem><para>レンダリング</para>
1640                 <itemizedlist>
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>
1660                 </itemizedlist>
1661             </listitem>
1663             <listitem><para>I18n</para>
1664                 <itemizedlist>
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>
1672                 </itemizedlist>
1673             </listitem>
1674         </itemizedlist>
1675     </sect2>
1677     <sect2 id="zend.form.forms.config">
1678         <title>設定</title>
1680         <para>
1681             <classname>Zend_Form</classname> は、
1682             <methodname>setOptions()</methodname> や <methodname>setConfig()</methodname> を用いて
1683             (あるいはコンストラクタでオプションや
1684             <classname>Zend_Config</classname> オブジェクトを渡して)
1685             さまざまに設定できます。
1686             これらのメソッドを使用して、フォームの要素や表示グループ、デコレータ、
1687             そしてメタデータを設定できます。
1688         </para>
1690         <para>
1691             全般的なルールとして、もし 'set' + オプションのキー
1692             という名前のメソッドが <classname>Zend_Form</classname>
1693             にあった場合は、そのメソッドを使用するとオプションを設定できます。
1694             アクセサが存在しない場合は
1695             キーが属性への参照とみなされ、
1696             <methodname>setAttrib()</methodname> に渡されます。
1697         </para>
1699         <para>
1700             このルールには、次のような例外があります。
1701         </para>
1703         <itemizedlist>
1704             <listitem><para>
1705                     <code>prefixPaths</code> は
1706                     <methodname>addPrefixPaths()</methodname> に渡されます。
1707             </para></listitem>
1709             <listitem><para>
1710                 <code>elementPrefixPaths</code> は
1711                 <methodname>addElementPrefixPaths()</methodname> に渡されます。
1712             </para></listitem>
1714             <listitem><para>
1715                 <code>displayGroupPrefixPaths</code> は
1716                 <methodname>addDisplayGroupPrefixPaths()</methodname> に渡されます。
1717             </para></listitem>
1719             <listitem>
1720                 <para>以下のセッターはこの方式では設定できません。</para>
1722                 <itemizedlist>
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>
1738                 </itemizedlist>
1739             </listitem>
1740         </itemizedlist>
1742         <para>
1743             例として、すべての型の設定データを渡すファイルを見てみましょう。
1744         </para>
1746         <programlisting language="ini"><![CDATA[
1747 [element]
1748 name = "registration"
1749 action = "/user/register"
1750 method = "post"
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>
1783         <para>
1784             これは、<acronym>XML</acronym> や <acronym>PHP</acronym>
1785             の配列形式の設定ファイルにも簡単に置き換えることができます。
1786         </para>
1787     </sect2>
1789     <sect2 id="zend.form.forms.custom">
1790         <title>カスタムフォーム</title>
1792         <para>
1793             独自の設定のフォームを使用するもうひとつの方法は、
1794             <classname>Zend_Form</classname> のサブクラスを作成することです。
1795             これには次のような利点があります。
1796         </para>
1798         <itemizedlist>
1799             <listitem><para>
1800                 フォームのユニットテストを容易に行うことができ、
1801                 検証やレンダリングが期待通りのものかを確認しやすくなる。
1802             </para></listitem>
1804             <listitem><para>
1805                 個々の要素に対する決め細やかな制御ができる。
1806             </para></listitem>
1808             <listitem><para>
1809                 フォームオブジェクトの再利用がしやすくなり、移植性が高まる
1810                 (設定ファイルの内容を気にする必要がなくなる)。
1811             </para></listitem>
1813             <listitem><para>
1814                 独自の機能を実装できる。
1815             </para></listitem>
1816         </itemizedlist>
1818         <para>
1819             一般的な使用法としては、<methodname>init()</methodname>
1820             メソッドでフォーム要素などの設定を行います。
1821         </para>
1823         <programlisting language="php"><![CDATA[
1824 class My_Form_Login extends Zend_Form
1826     public function init()
1827     {
1828         $username = new Zend_Form_Element_Text('username');
1829         $username->class = 'formtext';
1830         $username->setLabel('Username:')
1831                  ->setDecorators(array(
1832                      array('ViewHelper',
1833                            array('helper' => 'formText')),
1834                      array('Label',
1835                            array('class' => 'label'))
1836                  ));
1838         $password = new Zend_Form_Element_Password('password');
1839         $password->class = 'formtext';
1840         $password->setLabel('Username:')
1841                  ->setDecorators(array(
1842                      array('ViewHelper',
1843                            array('helper' => 'formPassword')),
1844                      array('Label',
1845                            array('class' => 'label'))
1846                  ));
1848         $submit = new Zend_Form_Element_Submit('login');
1849         $submit->class = 'formsubmit';
1850         $submit->setValue('Login')
1851                ->setDecorators(array(
1852                    array('ViewHelper',
1853                    array('helper' => 'formSubmit'))
1854                ));
1856         $this->addElements(array(
1857             $username,
1858             $password,
1859             $submit
1860         ));
1862         $this->setDecorators(array(
1863             'FormElements',
1864             'Fieldset',
1865             'Form'
1866         ));
1867     }
1869 ]]></programlisting>
1871         <para>
1872             このフォームのインスタンスを作成するのは、次のように簡単です。
1873         </para>
1875         <programlisting language="php"><![CDATA[
1876 $form = new My_Form_Login();
1877 ]]></programlisting>
1879         <para>
1880             そして、すべての機能はすでに準備済みの状態で、
1881             設定ファイルは不要です (この例はかなり単純化していることに注意しましょう。
1882             バリデーションや要素のフィルタなどは省略しています)。
1883         </para>
1885         <para>
1886             独自のフォームを作成する理由としてもうひとつよくあるのが、
1887             デフォルトのデコレータを定義したいというものです。
1888             この場合は <methodname>loadDefaultDecorators()</methodname> メソッドを上書きします。
1889         </para>
1891         <programlisting language="php"><![CDATA[
1892 class My_Form_Login extends Zend_Form
1894     public function loadDefaultDecorators()
1895     {
1896         $this->setDecorators(array(
1897             'FormElements',
1898             'Fieldset',
1899             'Form'
1900         ));
1901     }
1903 ]]></programlisting>
1904     </sect2>
1905 </sect1>
1906 <!--
1907 vim:se ts=4 sw=4 et: