[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Controller-ActionHelpers-ViewRenderer.xml
bloba26979acb7c010ab88750cc226360b05acd520a9
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20765 -->
4 <sect3 id="zend.controller.actionhelpers.viewrenderer">
5     <title>ViewRenderer</title>
7     <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
8         <title>導入</title>
10         <para>
11             <emphasis>ViewRenderer</emphasis> ヘルパーは、
12             以下のような要件を満たすために作られたものです。
13         </para>
15         <itemizedlist>
16             <listitem>
17                 <para>
18                     コントローラ内でいちいちビューオブジェクトのインスタンスを
19                     作成しなくても済むようにする。
20                     ビューオブジェクトは自動的にコントローラに登録されます。
21                 </para>
22             </listitem>
24             <listitem>
25                 <para>
26                     ビュースクリプトやヘルパー、そしてフィルタのパスを
27                     現在のモジュールに基づいて自動的に設定し、
28                     モジュール名をヘルパーやフィルタのクラス名の先頭に自動的に関連付ける。
29                 </para>
30             </listitem>
32             <listitem>
33                 <para>
34                     すべてのコントローラとアクションで使用できる
35                     グローバルなビューオブジェクトを作成する。
36                 </para>
37             </listitem>
39             <listitem>
40                 <para>
41                     すべてのコントローラで使用する、
42                     デフォルトのビューレンダリングオプションを設定できるようにする。
43                 </para>
44             </listitem>
46             <listitem>
47                 <para>
48                     何も指定しなくても、
49                     自動的にビュースクリプトをレンダリングできる機能を追加する。
50                 </para>
51             </listitem>
53             <listitem>
54                 <para>
55                     ビューの基底パスやビュースクリプトのパスを
56                     独自に指定できるようにする。
57                 </para>
58             </listitem>
59         </itemizedlist>
61         <note>
62             <para>
63                 <methodname>_forward()</methodname> や <methodname>redirect()</methodname>、
64                 あるいは手動での <methodname>render()</methodname> を行う場合は、
65                 自動レンダリングは不要です。これらの処理を行う場合は、
66                 出力を自前で行うことを <emphasis>ViewRenderer</emphasis>
67                 に対して指示します。
68             </para>
69         </note>
71         <note>
72             <para>
73                 <emphasis>ViewRenderer</emphasis> はデフォルトで有効になっています。
74                 これを無効にするには、フロントコントローラのパラメータ
75                 <emphasis>noViewRenderer</emphasis> を指定する
76                 (<command>$front->setParam('noViewRenderer', true);</command>) か、
77                 あるいはヘルパーブローカからヘルパーを削除
78                 (<methodname>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</methodname>)
79                 します。
80             </para>
82             <para>
83                 フロントコントローラでのディスパッチ処理の前に
84                 <emphasis>ViewRenderer</emphasis> の設定を変更したい場合は、
85                 次のいずれかの方法を使用します。
86             </para>
88             <itemizedlist>
89                 <listitem>
90                     <para>
91                         独自の <emphasis>ViewRenderer</emphasis> のインスタンスを作成し、
92                         ヘルパーブローカにそれを渡して登録する。
93                     </para>
95                     <programlisting language="php"><![CDATA[
96 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
97 $viewRenderer->setView($view)
98              ->setViewSuffix('php');
99 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
100 ]]></programlisting>
101                 </listitem>
103                 <listitem>
104                     <para>
105                         <emphasis>ViewRenderer</emphasis> オブジェクトを、
106                         ヘルパーブローカから必要に応じて作成、取得する。
107                     </para>
109                     <programlisting language="php"><![CDATA[
110 $viewRenderer =
111     Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
112 $viewRenderer->setView($view)
113              ->setViewSuffix('php');
114 ]]></programlisting>
115                 </listitem>
116             </itemizedlist>
117         </note>
118     </sect4>
120     <sect4 id="zend.controller.actionhelper.viewrenderer.api">
121         <title>API</title>
123         <para>
124             もっとも基本的な使用法は、単に <emphasis>ViewRenderer</emphasis>
125             のインスタンスを作成してそれをヘルパーブローカに渡すというものです。
126             インスタンスの作成と登録を一度に行うには、ヘルパーブローカの
127             <methodname>getStaticHelper()</methodname> メソッドを使用するのがいちばん簡単です。
128         </para>
130         <programlisting language="php"><![CDATA[
131 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
132 ]]></programlisting>
134         <para>
135             アクションコントローラのインスタンスが最初に作成されたときに、
136             <emphasis>ViewRenderer</emphasis> がビューオブジェクトのインスタンスを作成します。
137             コントローラのインスタンスが作成されるたびに、<emphasis>ViewRenderer</emphasis>
138             の <methodname>init()</methodname> が呼び出されます。
139             ここでアクションコントローラのビュープロパティを設定し、
140             現在のモジュールからの相対パスを指定して
141             <methodname>addScriptPath()</methodname> を呼び出します。
142             これは現在のモジュール名に基づいたプレフィックスをクラス名の先頭につけて呼び出されるので、
143             ヘルパーやフィルタのクラスをモジュール内で効率的に管理できます。
144         </para>
146         <para>
147             <methodname>postDispatch()</methodname> が呼び出されるたびに、現在のアクションの
148             <methodname>render()</methodname> を自動的に呼び出します。
149         </para>
151         <para>
152             例として、次のようなクラスを考えてみましょう。
153         </para>
155         <programlisting language="php"><![CDATA[
156 // foo モジュールのコントローラクラス
157 class Foo_BarController extends Zend_Controller_Action
159     // デフォルトで bar/index.phtml をレンダリングするので、特に何もする必要はありません
160     public function indexAction()
161     {
162     }
164     // 変数 'foo' の値を 'bar' に設定して bar/populate.phtml をレンダリングします
165     // ビューオブジェクトは既に preDispatch() で定義されているので、既に使用可能です
166     public function populateAction()
167     {
168         $this->view->foo = 'bar';
169     }
174 // ビュースクリプトの中では、たとえば次のように書きます
175 $this->foo(); // Foo_View_Helper_Foo::foo() を呼び出します
176 ]]></programlisting>
178         <para>
179             <emphasis>ViewRenderer</emphasis> には、
180             ビューのオプションを取得したり設定したりするためのメソッドも豊富に用意されています。
181         </para>
183         <itemizedlist>
184             <listitem>
185                 <para>
186                     <methodname>setView($view)</methodname>
187                     は <emphasis>ViewRenderer</emphasis> が使用するビューオブジェクトを設定します。
188                     これは、クラスのプロパティ <varname>$view</varname> の値を設定します。
189                 </para>
190             </listitem>
192             <listitem>
193                 <para>
194                     <methodname>setNeverRender($flag = true)</methodname>
195                     を使用すると、自動レンダリング機能を全体的に
196                     (すべてのコントローラに対して)無効にしたり有効にしたりできます。
197                     <constant>TRUE</constant> を指定すると、そのコントローラの <methodname>postDispatch()</methodname>
198                     では <methodname>render()</methodname> を呼び出さなくなります。
199                     <methodname>getNeverRender()</methodname> は、現在の設定を取得します。
200                 </para>
201             </listitem>
203             <listitem>
204                 <para>
205                     <methodname>setNoRender($flag = true)</methodname>
206                     を使用すると、自動レンダリングを無効にしたり有効にしたりできます。
207                     <constant>TRUE</constant> を指定すると、現在のコントローラの <methodname>postDispatch()</methodname>
208                     では <methodname>render()</methodname> を呼び出さなくなります。
209                     この設定は、<methodname>preDispatch()</methodname>
210                     が呼び出されるたびにいったんリセットされます
211                     (つまり、自動レンダリングを無効にしたいすべてのコントローラで
212                     個々にこれを設定する必要があるということです)。
213                     <methodname>getNoRender()</methodname> は、現在の設定を取得します。
214                 </para>
215             </listitem>
217             <listitem>
218                 <para>
219                     <methodname>setNoController($flag = true)</methodname>
220                     を使用すると、<methodname>render()</methodname>
221                     がコントローラ名のサブディレクトリにあるアクションスクリプトを
222                     読みにいかなくできます (デフォルトでは読みにいきます)。
223                     <methodname>getNoController()</methodname> は、現在の設定を取得します。
224                 </para>
225             </listitem>
227             <listitem>
228                 <para>
229                     <methodname>setNeverController($flag = true)</methodname>
230                     は <methodname>setNoController()</methodname> と似ていますが、
231                     こちらは全体に影響を与えます。つまり、
232                     ディスパッチ処理を行っても設定はリセットされません。
233                     <methodname>getNeverController()</methodname> は、現在の設定を取得します。
234                 </para>
235             </listitem>
237             <listitem>
238                 <para>
239                     <methodname>setScriptAction($name)</methodname>
240                     を使用すると、レンダリングするアクションスクリプトを指定できます。
241                     <varname>$name</varname> は、スクリプト名から拡張子を除いたもの
242                     (そして、<emphasis>noController</emphasis> が指定されていない限り、
243                     コントローラのディレクトリ名も除いたもの) となります。
244                     指定しなかった場合は、リクエストオブジェクト内のアクションに基づいた名前の
245                     ビュースクリプトを探します。
246                     <methodname>getScriptAction()</methodname> は、現在の設定を取得します。
247                 </para>
248             </listitem>
250             <listitem>
251                 <para>
252                     <methodname>setResponseSegment($name)</methodname>
253                     を使用すると、レンダリング結果を出力する
254                     レスポンスオブジェクトのセグメント名を指定できます。
255                     指定しなかった場合は、デフォルトのセグメントにレンダリングします。
256                     <methodname>getResponseSegment()</methodname> は、現在の設定を取得します。
257                 </para>
258             </listitem>
260             <listitem>
261                 <para>
262                     <methodname>initView($path, $prefix, $options)</methodname>
263                     は、ビューの基底パスを指定します。
264                     また、ヘルパースクリプトとフィルタスクリプトの先頭につけるクラスプレフィックスや
265                     <emphasis>ViewRenderer</emphasis> のオプションも設定します。
266                     オプションには、
267                     <emphasis>neverRender</emphasis>、<emphasis>noRender</emphasis>、
268                     <emphasis>noController</emphasis>、<emphasis>scriptAction</emphasis>
269                     および <emphasis>responseSegment</emphasis>
270                     のいずれかのフラグを指定します。
271                 </para>
272             </listitem>
274             <listitem>
275                 <para>
276                     <methodname>setRender($action = null, $name = null, $noController
277                         = false)</methodname>
278                     を使用すると、<emphasis>scriptAction</emphasis> や <emphasis>responseSegment</emphasis>
279                     そして <emphasis>noController</emphasis> のいずれかまたは複数を
280                     一度に指定できます。<methodname>direct()</methodname>
281                     はこのメソッドのエイリアスで、コントローラ内から簡単にコールできます。
282                 </para>
284                 <programlisting language="php"><![CDATA[
285 // 現在のアクションスクリプトではなく 'foo' をレンダリングします
286 $this->_helper->viewRenderer('foo');
288 // form.phtml の内容をレスポンスセグメント 'html' にレンダリングします。
289 // コントローラのビュースクリプト用サブディレクトリは使用しません。
290 $this->_helper->viewRenderer('form', 'html', true);
291 ]]></programlisting>
293                 <note><para>
294                         <methodname>setRender()</methodname> および <methodname>direct()</methodname>
295                         は、実際にはビュースクリプトをレンダリングしません。
296                         実際にレンダリングを行うのは <methodname>postDispatch()</methodname>
297                         や <methodname>render()</methodname> で、
298                         それらのメソッドに対するヒントを指示するだけです。
299                 </para></note>
300             </listitem>
301         </itemizedlist>
303         <para>
304             コンストラクタのオプションとして、
305             ビューオブジェクトを渡したり <emphasis>ViewRenderer</emphasis>
306             のオプションを渡したりできます。
307             このオプションで指定できるのは、<methodname>initView()</methodname>
308             で説明したフラグと同じものです。
309         </para>
311         <programlisting language="php"><![CDATA[
312 $view    = new Zend_View(array('encoding' => 'UTF-8'));
313 $options = array('noController' => true, 'neverRender' => true);
314 $viewRenderer =
315     new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
316 ]]></programlisting>
318         <para>
319             さらに追加のメソッドがあり、
320             ビューオブジェクトで使用するビューの基底パスを変更できます。
321             また、ビュースクリプトが自動レンダリングを行う際に使用するパスも変更できます。
322             これらのメソッドでは、以下のプレースホルダのいずれかあるいは複数が使用できます。
323         </para>
325         <itemizedlist>
326             <listitem>
327                 <para>
328                     <emphasis>:moduleDir</emphasis> は、現在のモジュールの基底ディレクトリを指します
329                     (規約では、これはモジュールのコントローラディレクトリの親ディレクトリとなります)。
330                 </para>
331             </listitem>
333             <listitem>
334                 <para>
335                     <emphasis>:module</emphasis> は、現在のモジュール名を指します。
336                 </para>
337             </listitem>
339             <listitem>
340                 <para>
341                     <emphasis>:controller</emphasis> は、現在のコントローラ名を指します。
342                 </para>
343             </listitem>
345             <listitem>
346                 <para>
347                     <emphasis>:action</emphasis> は、現在のアクション名を指します。
348                 </para>
349             </listitem>
351             <listitem>
352                 <para>
353                     <emphasis>:suffix</emphasis> は、ビュースクリプトのサフィックス
354                     (<methodname>setViewSuffix()</methodname> で設定したもの) を指します。
355                 </para>
356             </listitem>
357         </itemizedlist>
359         <para>
360             パス指定を制御するメソッドは次のとおりです。
361         </para>
363         <itemizedlist>
364             <listitem>
365                 <para>
366                     <methodname>setViewBasePathSpec($spec)</methodname>
367                     は、ビューオブジェクトを追加する際に使用する基底パスを
368                     決める際に使用するパス指定を変更します。
369                     デフォルトの設定は <filename>:moduleDir/views</filename> です。
370                     現在の設定を取得するには
371                     <methodname>getViewBasePathSpec()</methodname> を使用します。
372                 </para>
373             </listitem>
375             <listitem>
376                 <para>
377                     <methodname>setViewScriptPathSpec($spec)</methodname>
378                     は、個々のビュースクリプトのパス
379                     (からビュースクリプトの基底パスを除いた部分)
380                     を決める際に使用するパス指定を変更します。
381                     デフォルトの設定は <filename>:controller/:action.:suffix</filename> です。
382                     現在の設定を取得するには
383                     <methodname>getViewScriptPathSpec()</methodname> を使用します。
384                 </para>
385             </listitem>
387             <listitem>
388                 <para>
389                     <methodname>setViewScriptPathNoControllerSpec($spec)</methodname>
390                     は、<emphasis>noController</emphasis> が有効な場合に
391                     個々のビュースクリプトのパス
392                     (からビュースクリプトの基底パスを除いた部分)
393                     を決める際に使用するパス指定を変更します。
394                     デフォルトの設定は <filename>:action.:suffix</filename> です。
395                     現在の設定を取得するには
396                     <methodname>getViewScriptPathNoControllerSpec()</methodname> を使用します。
397                 </para>
398             </listitem>
399         </itemizedlist>
401         <para>
402             パス指定をよりきめ細かく行うには、
403             <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link>
404             を使用します。実は、<emphasis>ViewRenderer</emphasis>
405             はパスのマッピングを行う際に既にインフレクタを使用しています。
406             インフレクタに手を入れたい (独自のインフレクタを使用したり、
407             デフォルトのインフレクタに手を加えたりしたい) 場合は、
408             以下のメソッドを使用します。
409         </para>
411         <itemizedlist>
412             <listitem>
413                 <para>
414                     <methodname>getInflector()</methodname> は、インフレクタを取得します。
415                     まだ <methodname>ViewRenderer</methodname> にインフレクタが存在しない場合は、
416                     デフォルトの規則にもとづいたインフレクタを作成します。
417                 </para>
419                 <para>
420                     デフォルトでは、サフィックスやモジュールディレクトリへの参照に静的ルールを使用します。
421                     また静的な対象を使用します。これにより、さまざまな
422                     <emphasis>ViewRenderer</emphasis> のプロパティから
423                     動的にインフレクタを変更できるようになります。
424                 </para>
425             </listitem>
427             <listitem><para>
428                     <methodname>setInflector($inflector, $reference)</methodname> は、
429                     <emphasis>ViewRenderer</emphasis> で使用する独自のインフレクタを設定します。
430                     <varname>$reference</varname> が <constant>TRUE</constant> の場合は、
431                     対象だけでなくサフィックスやモジュールディレクトリも
432                     <emphasis>ViewRenderer</emphasis> のプロパティへの静的な参照とします。
433             </para></listitem>
434         </itemizedlist>
436         <note>
437             <title>デフォルトの検索方式</title>
439             <para>
440                 <emphasis>ViewRenderer</emphasis> は、
441                 パスの正規化を行ってビュースクリプトによる検索を簡単にします。
442                 デフォルトのルールは次のようなものです。
443             </para>
445             <itemizedlist>
446                 <listitem>
447                     <para>
448                         <emphasis>:module</emphasis>:
449                         MixedCase および camelCase 形式の単語がダッシュで分割され、
450                         すべて小文字になります。たとえば
451                         "FooBarBaz" は "foo-bar-baz" となります。
452                     </para>
454                     <para>
455                         内部的には、インフレクタはフィルタ
456                         <classname>Zend_Filter_Word_CamelCaseToDash</classname> および
457                         <classname>Zend_Filter_StringToLower</classname> を使用します。
458                     </para>
459                 </listitem>
461                 <listitem>
462                     <para>
463                         <emphasis>:controller</emphasis>:
464                         MixedCase および camelCase 形式の単語がダッシュで分割され、
465                         アンダースコアはディレクトリ区切り文字に変換され、
466                         すべて小文字になります。たとえば
467                         "<classname>FooBar</classname>" は "foo-bar" となり、そして "<classname>FooBar_Admin</classname>"
468                         は "<filename>foo-bar/admin</filename>" となります。
469                     </para>
471                     <para>
472                         内部的には、インフレクタはフィルタ
473                         <classname>Zend_Filter_Word_CamelCaseToDash</classname>、
474                         <classname>Zend_Filter_Word_UnderscoreToSeparator</classname> および
475                         <classname>Zend_Filter_StringToLower</classname> を使用します。
476                     </para>
477                 </listitem>
479                 <listitem>
480                     <para>
481                         <emphasis>:action</emphasis>:
482                         MixedCase および camelCase 形式の単語がダッシュで分割され、
483                         英数字以外の文字はダッシュに変換され、
484                         すべて小文字になります。たとえば
485                         "fooBar" は "foo-bar" となり、"foo-barBaz"
486                         は "foo-bar-baz" となります。
487                     </para>
489                     <para>
490                         内部的には、インフレクタはフィルタ
491                         <classname>Zend_Filter_Word_CamelCaseToDash</classname>、
492                         <classname>Zend_Filter_PregReplace</classname> および
493                         <classname>Zend_Filter_StringToLower</classname> を使用します。
494                     </para>
495                 </listitem>
496             </itemizedlist>
497         </note>
499         <para>
500             <emphasis>ViewRenderer</emphasis> <acronym>API</acronym> の最後に紹介するのは、
501             実際にビュースクリプトのパスを決定するメソッドと
502             ビューのレンダリングを行うメソッドです。以下をご覧ください。
503         </para>
505         <itemizedlist>
506             <listitem>
507                 <para>
508                     <methodname>renderScript($script, $name)</methodname>
509                     は、指定したパスのスクリプトをレンダリングします。
510                     オプションで、パスセグメントの名前を指定することもできます。
511                     このメソッドを使用する際には、<emphasis>ViewRenderer</emphasis>
512                     はスクリプト名を自動的に決定することはありません。
513                     そのかわりに、<varname>$script</varname> で指定された内容を直接
514                     ビューオブジェクトの <methodname>render()</methodname> メソッドに渡します。
515                 </para>
517                 <note><para>
518                     レスポンスオブジェクトにビューがレンダリングされると、
519                     自動的に <emphasis>noRender</emphasis> を設定します。
520                     これにより、同じビュースクリプトを間違って複数回レンダリングしてしまうことを防ぎます。
521                 </para></note>
523                 <note>
524                     <para>
525                         デフォルトでは、
526                         <methodname>Zend_Controller_Action::renderScript()</methodname>
527                         は <emphasis>ViewRenderer</emphasis> の
528                         <methodname>renderScript()</methodname> メソッドへのプロキシとなります。
529                     </para>
530                 </note>
531             </listitem>
533             <listitem>
534                 <para>
535                     <methodname>getViewScript($action, $vars)</methodname>
536                     は、渡されたアクションや <varname>$vars</varname>
537                     で指定した変数の値に基づいてビュースクリプトのパスを作成します。
538                     <varname>$vars</varname> 配列のキーは、パスを指定するためのキー
539                     ('moduleDir'、'module'、'controller'、'action' および 'suffix')
540                     のいずれかとなります。渡された変数の値をもとにしてパスを作成します。
541                     なにも渡されなかった場合は、現在のリクエストの内容をもとにしてパスを作成します。
542                 </para>
544                 <para>
545                     <methodname>getViewScript()</methodname>
546                     は、<emphasis>noController</emphasis> フラグの内容によって
547                     <emphasis>viewScriptPathSpec</emphasis> あるいは
548                     <emphasis>viewScriptPathNoControllerSpec</emphasis> のいずれかを使用します。
549                 </para>
551                 <para>
552                     モジュール名やコントローラ名、アクション名にあらわれる
553                     単語の区切りは、ダッシュ ('-') に置き換えられます。
554                     したがって、たとえばコントローラ名が '<command>foo.bar</command>'
555                     でアクション名が '<command>baz:bat</command>' だったとすると、
556                     デフォルトのパス指定をもとにしたビュースクリプトのパスは
557                     '<filename>foo-bar/baz-bat.phtml</filename>' となります。
558                 </para>
560                 <note>
561                     <para>
562                         デフォルトでは、
563                         <methodname>Zend_Controller_Action::getViewScript()</methodname>
564                         は <emphasis>ViewRenderer</emphasis> の
565                         <methodname>getViewScript()</methodname> メソッドへのプロキシとなります。
566                     </para>
567                 </note>
568             </listitem>
570             <listitem>
571                 <para>
572                     <methodname>render($action, $name, $noController)</methodname>
573                     は、まず <varname>$name</varname> あるいは
574                     <varname>$noController</varname> が指定されているかどうかを調べます。
575                     指定されている場合は、ViewRenderer の対応するフラグ
576                     (それぞれ responseSegment と noController) を設定します。
577                     次に、<varname>$action</varname> 引数が指定されていれば、
578                     それを <methodname>getViewScript()</methodname> に渡します。
579                     最後に、取得したビュースクリプトのパスを
580                     <methodname>renderScript()</methodname> に渡します。
581                 </para>
583                 <note>
584                     <para>
585                         <methodname>render()</methodname> を使用する際には、その副作用に注意しましょう。
586                         レスポンスセグメント名や noController
587                         フラグに指定した内容は、そのオブジェクト内で残り続けます。
588                         さらに、レンダリングが完了した際に noRender
589                         も設定されます。
590                     </para>
591                 </note>
593                 <note>
594                     <para>
595                         デフォルトでは、
596                         <methodname>Zend_Controller_Action::render()</methodname> は
597                         <emphasis>ViewRenderer</emphasis> の <methodname>render()</methodname>
598                         メソッドへのプロキシとなります。
599                     </para>
600                 </note>
601             </listitem>
603             <listitem>
604                 <para>
605                     <methodname>renderBySpec($action, $vars, $name)</methodname>
606                     は、パス指定用の変数を渡してビュースクリプトのパスを決定します。
607                     <varname>$action</varname> および <varname>$vars</varname> の内容を
608                     <methodname>getScriptPath()</methodname> に、そしてその結果得られたスクリプトのパスと
609                     <varname>$name</varname> を <methodname>renderScript()</methodname> に渡します。
610                 </para>
611             </listitem>
612         </itemizedlist>
613     </sect4>
615     <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
616         <title>基本的な使用例</title>
618         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
619             <title>基本的な使用法</title>
621             <para>
622                 最も基本的な使用法は、起動ファイル内で <emphasis>ViewRenderer</emphasis>
623                 を作成してヘルパーブローカに登録し、
624                 アクションメソッドで変数の値を設定するというものです。
625             </para>
627             <programlisting language="php"><![CDATA[
628 // 起動ファイル内で
629 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
633 // 'foo' モジュールの 'bar' コントローラ
634 class Foo_BarController extends Zend_Controller_Action
636     // デフォルトで bar/index.phtml をレンダリングするので、特に何もする必要はありません
637     public function indexAction()
638     {
639     }
641     // 変数 'foo' の値を 'bar' に設定して bar/populate.phtml をレンダリングします
642     // ビューオブジェクトは既に preDispatch() で定義されているので、既に使用可能です
643     public function populateAction()
644     {
645         $this->view->foo = 'bar';
646     }
648     // 何もレンダリングせずに別のアクションに転送します
649     // 転送先のアクションで何らかのレンダリングを行います
650     public function bazAction()
651     {
652         $this->_forward('index');
653     }
655     // 何もレンダリングせず別の場所にリダイレクトします
656     public function batAction()
657     {
658         $this->_redirect('/index');
659     }
661 ]]></programlisting>
662         </example>
664         <note>
665             <title>命名規約: コントローラ名やアクション名の単語の区切り</title>
666             <para>
667                 コントローラやアクションの名前が複数の単語からなるものである場合、
668                 ディスパッチャには、特定のパスや区切り文字を使用して単語を区切った
669                 <acronym>URL</acronym> を指定しなければなりません。
670                 <emphasis>ViewRenderer</emphasis> は、コントローラ名の中にあるパス区切り文字を
671                 実際のパス区切り文字 ('/') に置き換え、単語区切り文字をダッシュ
672                 ('-') に置き換えてパスを作成します。したがって、
673                 アクション <filename>/foo.bar/baz.bat</filename> をコールすると
674                 <filename>FooBarController.php</filename> の
675                 <methodname>FooBarController::bazBatAction()</methodname> へディスパッチされ、
676                 <filename>foo-bar/baz-bat.phtml</filename> をレンダリングすることになります。
677                 また、アクション <filename>/bar_baz/baz-bat</filename> をコールすると
678                 <filename>Bar/BazController.php</filename> (パス区切り文字に注意) の
679                 <methodname>Bar_BazController::bazBatAction()</methodname>
680                 へディスパッチされ、<filename>bar/baz/baz-bat.phtml</filename>
681                 をレンダリングすることになります。
682             </para>
684             <para>
685                 二番目の例では、モジュールはデフォルトモジュールのままであることに注意しましょう。
686                 しかし、パス区切り文字があるために、
687                 <filename>Bar/BazController.php</filename> にある
688                 <classname>Bar_BazController</classname> を受け取ることになります。
689                 ビューレンダラはコントローラのディレクトリ階層を模倣します。
690             </para>
691         </note>
693         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
694             <title>自動レンダリングの無効化</title>
696             <para>
697                 アクションやコントローラによっては、自動レンダリングを無効にしたいこともあるでしょう。
698                 たとえば、HTML 以外 (<acronym>XML</acronym> や <acronym>JSON</acronym> など) を出力したい場合や
699                 単に何も出力したくない場合などです。
700                 そんな場合には以下のいずれかの方法を使用します。
701                 つまり、すべての自動レンダリングを無効にする
702                 (<methodname>setNeverRender()</methodname>) か、あるいは現在のアクションでだけ
703                 自動レンダリングを無効にする (<methodname>setNoRender()</methodname>) かです。
704             </para>
706             <programlisting language="php"><![CDATA[
707 // Bar モジュールの Baz コントローラクラス
708 class Bar_BazController extends Zend_Controller_Action
710     public function fooAction()
711     {
712         // このアクションでは自動レンダリングを行いません
713         $this->_helper->viewRenderer->setNoRender();
714     }
717 // Bar モジュールの Bat コントローラクラス
718 class Bar_BatController extends Zend_Controller_Action
720     public function preDispatch()
721     {
722         // このコントローラのアクションでは決して自動レンダリングを行いません
723         $this->_helper->viewRenderer->setNoRender();
724     }
726 ]]></programlisting>
727         </example>
729         <note>
730             <para>
731                 たいていの場合は、自動レンダリングを全体で無効にする
732                 (<methodname>setNeverRender()</methodname>) のは無意味です。
733                 なぜなら、<emphasis>ViewRenderer</emphasis> の唯一の存在意義が、
734                 ビューオブジェクトを自動的に設定することだからです。
735             </para>
736         </note>
738         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
739             <title>別のビュースクリプトの選択</title>
741             <para>
742                 アクション名から自動的に決まるスクリプトではなく、
743                 それ以外のものをレンダリングしたくなる場合もあるでしょう。
744                 たとえば、add アクションと edit アクションのふたつを持つコントローラがあったとしましょう。
745                 どちらのアクションも同じ 'form' ビューを表示しますが、
746                 そこに設定する値が異なります。
747                 そんな場合に、それぞれでスクリプト名を変えるのは簡単です。
748                 <methodname>setScriptAction()</methodname> や <methodname>setRender()</methodname>
749                 を使用するか、あるいはヘルパーをメソッドとして呼び出します。
750                 これは <methodname>setRender()</methodname> を起動します。
751             </para>
753             <programlisting language="php"><![CDATA[
754 // Foo モジュールの Bar コントローラクラス
755 class Foo_BarController extends Zend_Controller_Action
757     public function addAction()
758     {
759         // 'bar/add.phtml' ではなく 'bar/form.phtml' をレンダリングします
760         $this->_helper->viewRenderer('form');
761     }
763     public function editAction()
764     {
765         // 'bar/edit.phtml' ではなく 'bar/form.phtml' をレンダリングします
766         $this->_helper->viewRenderer->setScriptAction('form');
767     }
769     public function processAction()
770     {
771         // 何かのチェックをした後で...
772         if (!$valid) {
773             // 'bar/process.phtml' ではなく 'bar/form.phtml' をレンダリングします
774             $this->_helper->viewRenderer->setRender('form');
775             return;
776         }
778         // その他の処理を続けます...
779     }
782 ]]></programlisting>
783         </example>
785         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
786             <title>登録されているビューの変更</title>
788             <para>
789                 ビューオブジェクトの設定を変更したくなったとしましょう。
790                 たとえば、ヘルパーのパスやエンコーディングを変更したくなったらどうしますか?
791                 そんな場合は、コントローラに設定されているビューオブジェクトを変更するか、
792                 あるいは <emphasis>ViewRenderer</emphasis> の外部からビューオブジェクトを取得します。
793                 どちらも同じオブジェクトへの参照を取得することになります。
794             </para>
796             <programlisting language="php"><![CDATA[
797 // Foo モジュールの Bar コントローラクラス
798 class Foo_BarController extends Zend_Controller_Action
800     public function preDispatch()
801     {
802         // ビューのエンコーディングを変更します
803         $this->view->setEncoding('UTF-8');
804     }
806     public function bazAction()
807     {
808         // ビューオブジェクトを取得し、エスケープ用のコールバックを 'htmlspecialchars' に設定します
809         $view = $this->_helper->viewRenderer->view;
810         $view->setEscape('htmlspecialchars');
811     }
813 ]]></programlisting>
814         </example>
815     </sect4>
817     <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
818         <title>高度な使用例</title>
820         <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
821             <title>パスの指定方法の変更</title>
823             <para>
824                 場合によっては、デフォルトのパス指定があなたのサイトに
825                 うまく当てはまらないこともあるでしょう。
826                 たとえば、すべてのテンプレートを単一のディレクトリ配下にまとめ、
827                 デザイナにはそのディレクトリに対するアクセス権だけを与えたいといった場合です
828                 (<ulink url="http://smarty.php.net/">Smarty</ulink>
829                 を使用する場合などにありがちです)。
830                 そんな場合は、ビューの基底パスをハードコーディングし、
831                 それをアクションのビュースクリプトのパスとして使用することになります。
832             </para>
834             <para>
835                 この例では、ビューの基底パスを '<filename>/opt/vendor/templates</filename>'
836                 とし、ビュースクリプトのパスは '<filename>:moduleDir/:controller/:action.:suffix</filename>'
837                 となるようにします。<emphasis>noController</emphasis>
838                 フラグが設定されている場合は、サブディレクトリ ('<filename>:action.:suffix</filename>')
839                 からではなくトップディレクトリからのパスとして探すことになります。
840                 最後に、ビュースクリプトのファイルの拡張子として
841                 'tpl' を設定します。
842             </para>
844             <programlisting language="php"><![CDATA[
846  * 起動ファイル
847  */
849 // 別のビュー実装を使用します
850 $view = new ZF_Smarty();
852 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
853 $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
854              ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
855              ->setViewScriptPathNoControllerSpec(':action.:suffix')
856              ->setViewSuffix('tpl');
857 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
858 ]]></programlisting>
859         </example>
861         <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
862             <title>単一のアクションから複数のビュースクリプトをレンダリングする例</title>
864             <para>
865                 時には、複数のビュースクリプトをひとつのアクションで処理したいこともあるでしょう。
866                 これは、非常に直感的な方法で実現できます。単に
867                 <methodname>render()</methodname> を必要なだけコールすればいいのです。
868             </para>
870             <programlisting language="php"><![CDATA[
871 class SearchController extends Zend_Controller_Action
873     public function resultsAction()
874     {
875         // $this->model に現在のモデルが設定されているものとします
876         $this->view->results =
877             $this->model->find($this->_getParam('query', '');
879         // render() は、デフォルトでは ViewRenderer へのプロキシとなります。
880         // まず form を、そして results をレンダリングします
881         $this->render('form');
882         $this->render('results');
883     }
885     public function formAction()
886     {
887         // 何もしなくても、ViewRenderer が自動的にビュースクリプトをレンダリングします
888     }
890 ]]></programlisting>
891         </example>
892     </sect4>
893 </sect3>
894 <!--
895 vim:se ts=4 sw=4 et: