1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 21740 -->
4 <sect1 id="zend.view.helpers" xmlns:xi="http://www.w3.org/2001/XInclude">
8 ビュースクリプトの中で、複雑な関数を繰り返し実行しなければならないこともあるでしょう
9 (例えば日付のフォーマット、フォーム要素の作成、リンクの作成など)。
10 このような作業を行うために、ヘルパークラスを使用できます。
14 ヘルパーの正体は、単なるクラスです。たとえば 'fooBar' という名前のヘルパーを使用するとしましょう。
15 デフォルトでは、クラス名の先頭には 'Zend_View_Helper_'
16 がつきます (ヘルパーのパスを設定する際に、これは独自のものに変更できます)。
17 そしてクラス名の最後の部分がヘルパーの名前となります。
18 このとき、単語の先頭は大文字にしなければなりません。つまり、
19 ヘルパーのクラス名は <classname>Zend_View_Helper_FooBar</classname>
20 となります。このクラスには、最低限ヘルパー名と同じ名前 (camelCase 形式にしたもの)
21 のメソッド <methodname>fooBar()</methodname> が含まれていなければなりません。
25 <title>大文字小文字の扱い</title>
27 ヘルパー名は常に camelCase 形式となります。
29 クラス名は MixedCase 形式ですが、実際に実行されるメソッドは
35 <title>デフォルトのヘルパーのパス</title>
38 デフォルトのヘルパーのパスは常に Zend Framework
39 のビューヘルパーのパス、すなわち 'Zend/View/Helper/' となります。
40 <methodname>setHelperPath()</methodname> をコールして既存のパスを上書きしても、
42 デフォルトのヘルパーは常に動作することが保証されます。
47 ビュースクリプト内でヘルパーを使用するには、
48 <command>$this->helperName()</command> をコールします。これをコールすると、裏側では
49 <classname>Zend_View</classname> が <classname>Zend_View_Helper_HelperName</classname> クラスを読み込み、
50 そのクラスのインスタンスを作成して <methodname>helperName()</methodname> メソッドをコールします。
51 オブジェクトのインスタンスは <classname>Zend_View</classname> インスタンスの中に残り続け、
52 後で <command>$this->helperName()</command> がコールされたときには再利用されます。
55 <sect2 id="zend.view.helpers.initial">
56 <title>付属のヘルパー</title>
59 <classname>Zend_View</classname> には、はじめからいくつかのヘルパークラスが付属しています。
60 これらのほとんどはフォーム要素の生成に関するもので、
62 さらに、ルートにもとづいた <acronym>URL</acronym> と HTML の一覧を作成したり、
64 現在付属しているヘルパーは、次のとおりです。
70 <methodname>declareVars():</methodname>
71 <methodname>strictVars()</methodname> を使用する際に同時に使用します。
72 このヘルパーを使用すると、テンプレート変数を宣言できます。
73 この変数は、すでにビュースクリプトで設定されているものでもいないものでもかまいません。
75 このメソッドへの引数として配列を渡すとデフォルト値を設定します。
76 それ以外の場合は、もしその変数が存在しない場合は空文字列を設定します。
80 <methodname>fieldset($name, $content, $attribs):</methodname>
81 <acronym>XHTML</acronym> の fieldset を作成します。<varname>$attribs</varname> に
82 'legend' というキーが含まれる場合、その値をフィールドセットの説明として使用します。
83 フィールドセットで囲む内容は、このヘルパーに渡した
84 <varname>$content</varname> です。
88 <methodname>form($name, $attribs, $content):</methodname>
89 <acronym>XHTML</acronym> の form を作成します。すべての <varname>$attribs</varname>
90 はエスケープされ、form タグの <acronym>XHTML</acronym> 属性としてレンダリングされます。
91 <varname>$content</varname> が存在してその値が <constant>FALSE</constant> 以外の場合は、
92 その内容がフォームの開始タグと終了タグの間にレンダリングされます。
93 <varname>$content</varname> が <constant>FALSE</constant> (既定値) の場合は、
98 <methodname>formButton($name, $value, $attribs):</methodname> <button /> 要素を作成します。
103 <methodname>formCheckbox($name, $value, $attribs,
104 $options):</methodname>
105 <input type="checkbox" /> 要素を作成します。
109 デフォルトでは、$value を指定せず $options
110 が存在しなかった場合は、未チェックの値として '0'
111 そしてチェック状態の値として '1' を使用します。
112 $value が渡されたけれど $options が存在しなかった場合は、
113 渡された値をチェック状態の値とみなします。
117 $options は配列でなければなりません。
118 数値添字形式の配列の場合は、最初の要素がチェック状態の値となり、
119 その次の要素が未チェック状態の値となります。
121 キー 'checked' および 'unChecked' を持つ連想配列を指定することもできます。
125 $options を渡した場合は、$value
126 が「チェック状態の値」と一致した場合にその要素がチェック状態だとみなされます。
128 属性 'checked' に boolean 値を渡して指定することもできます。
132 これらの内容を簡単にまとめた例を示します。
135 <programlisting language="php"><![CDATA[
136 // '1' および '0' でチェック状態と未チェック状態を表します。これはチェックされていません
137 echo $this->formCheckbox('foo');
139 // '1' および '0' でチェック状態と未チェック状態を表します。これはチェックされています
140 echo $this->formCheckbox('foo', null, array('checked' => true));
142 // 'bar' および '0' でチェック状態と未チェック状態を表します。これはチェックされていません
143 echo $this->formCheckbox('foo', 'bar');
145 // 'bar' および '0' でチェック状態と未チェック状態を表します。これはチェックされています
146 echo $this->formCheckbox('foo', 'bar', array('checked' => true));
148 // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
149 echo $this->formCheckbox('foo', null, null, array('bar', 'baz'));
151 // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
152 echo $this->formCheckbox('foo', null, null, array(
157 // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされています
158 echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz'));
159 echo $this->formCheckbox('foo',
161 array('checked' => true),
162 array('bar', 'baz'));
164 // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
165 echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz'));
166 echo $this->formCheckbox('foo',
168 array('checked' => false),
169 array('bar', 'baz'));
173 どの場合についても、マークアップの先頭に hidden
174 要素を追加してそこに「未チェック状態」を表す値を保持します。
175 そうすることで、仮に未チェック状態であったとしても
176 フォームから何らかの値が返されるようになるのです。
182 <methodname>formErrors($errors, $options):</methodname>
183 エラーの表示用に、<acronym>XHTML</acronym> の順序なしリストを作成します。
184 <varname>$errors</varname> は、文字列あるいは文字列の配列となります。
185 <varname>$options</varname> は、リストの開始タグの属性として設定したい内容です。
189 エラー出力の開始時、終了時、そして各エラーの区切りとして使用する
191 そのためにはヘルパーのこれらのメソッドをコールします。
196 <methodname>setElementStart($string)</methodname>;
197 デフォルトは '<ul class="errors"%s"><li>'
198 で、%s の部分には <varname>$options</varname>
203 <methodname>setElementSeparator($string)</methodname>;
204 デフォルトは '</li><li>' です。
208 <methodname>setElementEnd($string)</methodname>;
209 デフォルトは '</li></ul>' です。
215 <methodname>formFile($name, $attribs):</methodname>
216 type="file" /> 要素を作成します。
220 <methodname>formHidden($name, $value, $attribs):</methodname> <input
221 type="hidden" /> 要素を作成します。
225 <methodname>formLabel($name, $value, $attribs):</methodname>
226 <label> 要素を作成します。<property>for</property> 属性の値は
227 <varname>$name</varname> に、そしてラベルのテキストは
228 <varname>$value</varname> になります。
229 <property>attribs</property> に <emphasis>disable</emphasis>
234 <methodname>formMultiCheckbox($name, $value, $attribs, $options,
235 $listsep):</methodname> チェックボックスのリストを作成します。
236 <varname>$options</varname> は連想配列で、任意の深さにできます。
237 <varname>$value</varname> は単一の値か複数の値の配列で、これが
238 <varname>$options</varname> 配列のキーにマッチします。
239 <varname>$listsep</varname> は、デフォルトでは HTML の改行
240 ("<br />") です。デフォルトでは、
242 つまり、すべてのチェックボックスは同じ名前となり、
247 <methodname>formPassword($name, $value, $attribs):</methodname> <input
248 type="password" /> 要素を作成します。
252 <methodname>formRadio($name, $value, $attribs, $options):</methodname>
253 一連の <input type="radio" /> 要素を、
254 $options の要素ごとに作成します。$options は、
255 ラジオボタンの値をキー、ラベルを値とする配列となります。
256 $value はラジオボタンの初期選択状態を設定します。
260 <methodname>formReset($name, $value, $attribs):</methodname> <input
261 type="reset" /> 要素を作成します。
265 <methodname>formSelect($name, $value, $attribs, $options):</methodname>
266 <select>...</select> ブロックを作成します。
267 $options の要素ごとに <option> を作成します。
269 ラベルを値とする配列となります。$value
274 <methodname>formSubmit($name, $value, $attribs):</methodname> <input
275 type="submit" /> 要素を作成します。
279 <methodname>formText($name, $value, $attribs):</methodname> <input
280 type="text" /> 要素を作成します。
284 <methodname>formTextarea($name, $value, $attribs):</methodname>
285 <textarea>...</textarea> ブロックを作成します。
289 <methodname>url($urlOptions, $name, $reset):</methodname>
290 指定したルートにもとづく <acronym>URL</acronym> 文字列を作成します。
291 <varname>$urlOptions</varname> は、そのルートで使用する
296 <methodname>htmlList($items, $ordered, $attribs, $escape):</methodname>
297 <varname>$items</varname> で渡した内容をもとに
298 順序つきリストあるいは順序なしリストを作成します。
299 <varname>$items</varname> が多次元配列の場合は、入れ子状のリストとなります。
300 <varname>$escape</varname> フラグを <constant>TRUE</constant> (既定値) にすると、
301 各項目はビューオブジェクトに登録されているエスケープ方式でエスケープされます。
302 リスト内でマークアップを行いたい場合は <constant>FALSE</constant> を渡します。
308 これらをビュースクリプト内で使用するのはとても簡単です。
309 以下に例を示します。ただ単に、ヘルパーをコールするだけでよいことに注意しましょう。
310 読み込みやインスタンス作成は、必要に応じて自動的に行われます。
313 <programlisting language="php"><![CDATA[
314 // ビュースクリプト内では、$this は Zend_View のインスタンスを指します。
316 // select の選択肢を、変数 $countries に
317 // array('us' => 'United States', 'il' => 'Israel', 'de' => 'Germany')
320 <form action="action.php" method="post">
322 <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
325 <?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
327 <p><label>メールを受け取りますか?
328 <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
334 ビュースクリプトの出力結果は、次のようになります。
337 <programlisting language="php"><![CDATA[
338 <form action="action.php" method="post">
340 <input type="text" name="email" value="you@example.com" size="32" />
343 <select name="country">
344 <option value="us" selected="selected">United States</option>
345 <option value="il">Israel</option>
346 <option value="de">Germany</option>
349 <p><label>メールを受け取りますか?
350 <input type="hidden" name="opt_in" value="no" />
351 <input type="checkbox" name="opt_in" value="yes" checked="checked" />
356 <xi:include href="Zend_View-Helpers-Action.xml" />
357 <xi:include href="Zend_View-Helpers-BaseUrl.xml" />
358 <xi:include href="Zend_View-Helpers-Currency.xml">
359 <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Currency.xml" /></xi:fallback>
361 <xi:include href="Zend_View-Helpers-Cycle.xml" />
362 <xi:include href="Zend_View-Helpers-Partial.xml" />
363 <xi:include href="Zend_View-Helpers-Placeholder.xml" />
364 <xi:include href="Zend_View-Helpers-Doctype.xml" />
365 <xi:include href="Zend_View-Helpers-HeadLink.xml" />
366 <xi:include href="Zend_View-Helpers-HeadMeta.xml" />
367 <xi:include href="Zend_View-Helpers-HeadScript.xml" />
368 <xi:include href="Zend_View-Helpers-HeadStyle.xml" />
369 <xi:include href="Zend_View-Helpers-HeadTitle.xml" />
370 <xi:include href="Zend_View-Helpers-HtmlObject.xml" />
371 <xi:include href="Zend_View-Helpers-InlineScript.xml" />
372 <xi:include href="Zend_View-Helpers-Json.xml" />
373 <xi:include href="Zend_View-Helpers-Navigation.xml">
374 <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Navigation.xml" /></xi:fallback>
376 <xi:include href="Zend_View-Helpers-Translate.xml" />
379 <sect2 id="zend.view.helpers.paths">
380 <title>ヘルパーのパス</title>
384 <classname>Zend_View</classname> がヘルパークラスを探すパスをコントローラから積み重ねて指定できます。
385 デフォルトでは、<classname>Zend_View</classname> は "Zend/View/Helper/*" からヘルパークラスを探します。
386 <classname>Zend_View</classname> に別の場所を探すように指定するには
387 <methodname>setHelperPath()</methodname> および <methodname>addHelperPath()</methodname> メソッドを使用します。
388 さらに、クラスプレフィックスを指定することもできます。
389 これにより、ヘルパークラスに名前空間を設定できるようになります。
390 デフォルトでクラスプレフィックスを指定しなかった場合は、
391 'Zend_View_Helper_' であると見なされます。
394 <programlisting language="php"><![CDATA[
395 $view = new Zend_View();
397 // パスを /path/to/more/helpers 、プレフィックスを 'My_View_Helper' と設定します
398 $view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
402 <methodname>addHelperPath()</methodname> メソッドを使用すると、検索パスを「積み重ねる」
403 ことができます。これを使用すると、<classname>Zend_View</classname>
404 は一番最後に追加されたパスからヘルパークラスを探し始めます。
405 これにより、付属しているヘルパーの内容を上書きしたり、
406 新しいヘルパーを追加したりすることができるようになります。
409 <programlisting language="php"><![CDATA[
410 $view = new Zend_View();
411 // /path/to/some/helpers をクラスプレフィックス 'My_View_Helper' で追加します
412 $view->addHelperPath('/path/to/some/helpers', 'My_View_Helper');
413 // /other/path/to/helpers をクラスプレフィックス 'Your_View_Helper' で追加します
414 $view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');
416 // $this->helperName() をコールすると、Zend_View は
417 // まず最初に "/path/to/some/helpers/HelperName" で
418 // "Your_View_Helper_HelperName" という名前のクラスを探し、
419 // 次に "/other/path/to/helpers/HelperName.php" で
420 // "My_View_Helper_HelperName" という名前のクラスを探し、
421 // そして最後に "Zend/View/Helpers/HelperName.php" で
422 // "Zend_View_Helper_HelperName" という名前のクラスを探します。
427 <sect2 id="zend.view.helpers.custom">
428 <title>独自のヘルパーを書く</title>
431 独自のヘルパーを書くのは簡単です。以下の規則に従ってください。
437 絶対条件というわけではありませんが、ヘルパーを作成する際には
438 <classname>Zend_View_Helper_Interface</classname> を実装するか
439 <classname>Zend_View_Helper_Abstract</classname> を継承することを推奨します。
440 1.6.0 以降、これらには <methodname>setView()</methodname> メソッドが定義されています。
441 しかし、将来のリリースでは Strategy パターンを実装することを検討しており、
442 以下に示す命名規約の多くを単純化する予定です。
444 将来のバージョンでもあなたの書いたコードがそのまま動くようになるでしょう。
448 クラス名は、少なくとも最後はヘルパーの名前と同じである必要があります。
449 MixedCaps 方式を使用します。たとえば
450 "specialPurpose" という名前のヘルパーを作成した場合は、そのクラス名には
451 最低限 "SpecialPurpose" が含まれている必要があります。
452 このクラス名にプレフィックスを指定できます。
453 プレフィックスの一部に 'View_Helper' を含めることを推奨します。たとえば
454 "My_View_Helper_SpecialPurpose" のようになります
455 (<methodname>addHelperPath()</methodname> や
456 <methodname>setHelperPath()</methodname> にはプレフィックスを指定する必要があります。
457 最後のアンダースコアは含めても含めなくてもかまいません)。
461 クラスは、ヘルパーと同じ名前の public メソッドを持っている必要があります。
462 テンプレートが "$this->specialPurpose()" をコールした際に、
463 このメソッドがコールされます。"specialPurpose" ヘルパーの例では、
464 "public function specialPurpose()" というメソッドが必要です。
468 一般に、クラスでは echo や print その他の出力を行ってはいけません。
469 その代わりに、print あるいは echo される内容を返します。
470 返り値は、適切にエスケープしなければなりません。
474 クラスは、ヘルパークラスと同じ名前のファイルに作成しなければなりません。
475 再び "specialPurpose" ヘルパーを例にとると、ファイル名は
476 "SpecialPurpose.php" でなければなりません。
481 指定したヘルパーパスのどこかにヘルパークラスのファイルを配置すると、
482 <classname>Zend_View</classname> は自動的にそれを読み込んでインスタンスを作成し、
487 <classname>SpecialPurpose</classname> ヘルパーのコードの例を示します。
490 <programlisting language="php"><![CDATA[
491 class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
493 protected $_count = 0;
494 public function specialPurpose()
497 $output = "'The Jerk' を {$this->_count} 回見ました。";
498 return htmlspecialchars($output);
504 そして、ビュースクリプト内で <classname>SpecialPurpose</classname>
505 ヘルパーを必要なだけコールします。いちどインスタンスが作成された後は、
506 <classname>Zend_View</classname> インスタンスの中でそれが持続します。
509 <programlisting language="php"><![CDATA[
510 // ビュースクリプト内では、$this は Zend_View インスタンスを指すことを覚えておきましょう。
511 echo $this->specialPurpose();
512 echo $this->specialPurpose();
513 echo $this->specialPurpose();
519 <programlisting language="php"><![CDATA[
520 'The Jerk' を 1 回見ました。
521 'The Jerk' を 2 回見ました。
522 'The Jerk' を 3 回見ました。
526 時には <classname>Zend_View</classname> オブジェクトを使用したくなることもあるでしょう。
527 たとえば登録されているエンコーディングを使用する必要があったり、
528 ヘルパー内で別のビュースクリプトをレンダリングしたくなったりといった場合です。
529 ビューオブジェクトにアクセスするには、ヘルパークラス内で次のような
530 <methodname>setView($view)</methodname> メソッドを定義しなければなりません。
533 <programlisting language="php"><![CDATA[
534 class My_View_Helper_ScriptPath
538 public function setView(Zend_View_Interface $view)
543 public function scriptPath($script)
545 return $this->view->getScriptPath($script);
551 ヘルパークラスで <methodname>setView()</methodname> メソッドを定義しておくと、
552 最初にインスタンスが作成される際に自動的にこのメソッドがコールされ、
553 現在のビューオブジェクトが引数として渡されます。
554 渡されたオブジェクトをクラス内でどのように管理するかは特に決まっていません。
559 <classname>Zend_View_Helper_Abstract</classname> を継承する場合は、
560 このメソッドはすでに定義済みであるため定義する必要はありません。
564 <sect2 id="zend.view.helpers.registering-concrete">
565 <title>Registering Concrete Helpers</title>
568 Sometimes it is convenient to instantiate a view helper, and then register it with the
569 view. As of version 1.10.0, this is now possible using the
570 <methodname>registerHelper()</methodname> method, which expects two arguments: the
571 helper object, and the name by which it will be registered.
574 <programlisting language="php"><![CDATA[
575 $helper = new My_Helper_Foo();
576 // ...do some configuration or dependency injection...
578 $view->registerHelper($helper, 'foo');
582 If the helper has a <methodname>setView()</methodname> method, the view object will call
583 this and inject itself into the helper on registration.
587 <title>Helper name should match a method</title>
590 The second argument to <methodname>registerHelper()</methodname> is the name of the
591 helper. A corresponding method name should exist in the helper; otherwise,
592 <classname>Zend_View</classname> will call a non-existent method when invoking the
593 helper, raising a fatal <acronym>PHP</acronym> error.