[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Layout-Advanced.xml
blob927a02440ace292cdd3e9c77aca440a01969fb12
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20792 -->
4 <sect1 id="zend.layout.advanced">
5     <title>Zend_Layout の高度な使用法</title>
7     <para>
8         <classname>Zend_Layout</classname> には、高度な使用法がいろいろあります。
9         たとえばさまざまなビューの実装やファイルシステム上のレイアウトに対応させたりといったことです。
10     </para>
12     <para>
13         主な拡張ポイントは次のとおりです。
14     </para>
16     <itemizedlist>
17         <listitem><para>
18                 <emphasis>ビューオブジェクトのカスタマイズ</emphasis>。
19                 <classname>Zend_Layout</classname> は、
20                 <classname>Zend_View_Interface</classname> を実装した任意のクラスを使用できます。
21         </para></listitem>
23         <listitem><para>
24                 <emphasis>フロントコントローラプラグインのカスタマイズ</emphasis>。
25                 <classname>Zend_Layout</classname> に標準で含まれているフロントコントローラプラグインは、
26                 レイアウトを自動的にレンダリングしてからレスポンスを返します。
27                 これを独自のプラグインで置き換えることができます。
28         </para></listitem>
30         <listitem><para>
31                 <emphasis>アクションヘルパーのカスタマイズ</emphasis>。
32                 <classname>Zend_Layout</classname> に標準で含まれているアクションヘルパーは、
33                 ほとんどの場合にそのまま使えるでしょう。
34                 これは、レイアウトオブジェクト自信へのプロキシとなっています。
35         </para></listitem>
37         <listitem><para>
38                 <emphasis>レイアウトスクリプトのパス解決方法のカスタマイズ</emphasis>。
39                 <classname>Zend_Layout</classname> では、独自の <link
40                     linkend="zend.filter.inflector">インフレクタ</link>
41                 を使用してレイアウトスクリプトのパス解決方法を行うことができます。
42                 あるいは、標準のインフレクタを設定して独自のルールを指定することもできます。
43         </para></listitem>
44     </itemizedlist>
46     <sect2 id="zend.layout.advanced.view">
47         <title>ビューオブジェクトのカスタマイズ</title>
49         <para>
50             <classname>Zend_Layout</classname> では、
51             <classname>Zend_View_Interface</classname> を実装した任意のクラスや
52             <classname>Zend_View_Abstract</classname> を継承した任意のクラスを用いて
53             レイアウトスクリプトをレンダリングできます。
54             独自のビューオブジェクトを単純に
55             コンストラクタ/<methodname>startMvc()</methodname> のパラメータとして渡すか、
56             あるいはアクセサ <methodname>setView()</methodname> で設定します。
57         </para>
59         <programlisting language="php"><![CDATA[
60 $view = new My_Custom_View();
61 $layout->setView($view);
62 ]]></programlisting>
64         <note>
65             <title>Zend_View の実装がすべて同じというわけではない</title>
67             <para>
68                 <classname>Zend_Layout</classname> では
69                 <classname>Zend_View_Interface</classname> を実装した任意のクラスを使用できますが、
70                 その中で様々な <classname>Zend_View</classname> ヘルパー
71                 (特にレイアウトヘルパーや
72                 <link linkend="zend.view.helpers.initial.placeholder">プレースホルダ</link>
73                 ヘルパー)
74                 が使用できなければ問題となることもあるでしょう。
75                 これは、<classname>Zend_Layout</classname>
76                 がオブジェクトの中の変数を自分自身と
77                 <link linkend="zend.view.helpers.initial.placeholder">プレースホルダ</link>
78                 で使えるようにしているからです。
79             </para>
81             <para>
82                 これらのヘルパーをサポートしていない <classname>Zend_View</classname>
83                 の実装を使用する場合は、レイアウト変数をビューに取り込む方法を見つける必要があります。
84                 たとえば <classname>Zend_Layout</classname> オブジェクトを継承して
85                 <methodname>render()</methodname> メソッドにビューへの変数を渡すようにするか、
86                 あるいは独自のプラグインクラスを作成して
87                 レイアウトのレンダリングの前に変数を渡すようにするといった方法があります。
88             </para>
90             <para>
91                 あるいは、もしあなたの使用するビュー実装が何らかのプラグイン機構をサポートしているのなら、
92                 'Zend_Layout' プレースホルダ経由で
93                 <link linkend="zend.view.helpers.initial.placeholder">
94                 プレースホルダヘルパー</link>
95                 を使用して変数にアクセスできます。
96             </para>
98             <programlisting language="php"><![CDATA[
99 $placeholders = new Zend_View_Helper_Placeholder();
100 $layoutVars   = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
101 ]]></programlisting>
102         </note>
103     </sect2>
105     <sect2 id="zend.layout.advanced.plugin">
106         <title>フロントコントローラプラグインのカスタマイズ</title>
108         <para>
109             <acronym>MVC</acronym> コンポーネントと組み合わせて使用するときに、
110             <classname>Zend_Layout</classname> はフロントコントローラプラグインを登録します。
111             このプラグインは、ディスパッチループを抜ける前の最後のアクションで
112             レイアウトをレンダリングします。
113             ほとんどの場合はデフォルトのプラグインで十分でしょうが、
114             もし独自のプラグインを作成したい場合は、
115             作成したプラグインクラスの名前を
116             <methodname>startMvc()</methodname> メソッドの
117             <code>pluginClass</code> オプションで指定します。
118         </para>
120         <para>
121             ここで使用するプラグインクラスは
122             <classname>Zend_Controller_Plugin_Abstract</classname>
123             を継承したものでなければなりません。また、コンストラクタの引数で
124             レイアウトオブジェクトのインスタンスを受け取れるようにする必要があります。
125             それ以外の実装内容については自由に決めることができます。
126         </para>
128         <para>
129             デフォルトのプラグインは
130             <classname>Zend_Layout_Controller_Plugin_Layout</classname>
131             です。
132         </para>
133     </sect2>
135     <sect2 id="zend.layout.advanced.helper">
136         <title>アクションヘルパーのカスタマイズ</title>
138         <para>
139             <acronym>MVC</acronym> コンポーネントと組み合わせて使用するときに、
140             <classname>Zend_Layout</classname> はアクションコントローラヘルパーを
141             ヘルパーブローカに登録します。デフォルトのヘルパーである
142             <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>
143             は、レイアウトオブジェクトのインスタンス自身に対する
144             (何もしない) プロキシとしてはたらきます。
145             たいていの場合はこれで十分でしょう。
146         </para>
148         <para>
149             独自の機能を書きたい場合は、
150             <classname>Zend_Controller_Action_Helper_Abstract</classname>
151             を継承したアクションヘルパークラスを作成します。
152             そして、そのクラス名を
153             <methodname>startMvc()</methodname> メソッドの
154             <code>helperClass</code> オプションに指定します。
155             実装の詳細は自由に決められます。
156         </para>
157     </sect2>
159     <sect2 id="zend.layout.advanced.inflector">
160         <title>レイアウトスクリプトのパス解決方法のカスタマイズ: インフレクタの使用法</title>
162         <para>
163             <classname>Zend_Layout</classname> は、<classname>Zend_Filter_Inflector</classname>
164             を使用して確立したフィルタチェインで
165             レイアウト名からレイアウトスクリプトのパスへの変換を行います。
166             デフォルトで使用するルールは、まず 'Word_CamelCaseToDash'、
167             その後に 'StringToLower'、そして最後にサフィックス 'phtml'
168             を追加してパスを作成します。たとえば次のようになります。
169         </para>
171         <itemizedlist>
172             <listitem><para>
173                     'foo' は 'foo.phtml' に変換されます。
174             </para></listitem>
176             <listitem><para>
177                     'FooBarBaz' は 'foo-bar-baz.phtml' に変換されます。
178             </para></listitem>
179         </itemizedlist>
181         <para>
182             これを変更するには三通りの手段があります。
183             インフレクションのターゲットやビューのサフィックスを
184             <classname>Zend_Layout</classname> のアクセサで変更すること、
185             <classname>Zend_Layout</classname> のインスタンスに関連づけられている
186             インフレクタのルールを変更すること、
187             あるいは独自のインフレクタのインスタンスを作成してそれを
188             <methodname>Zend_Layout::setInflector()</methodname> で渡すことです。
189         </para>
191         <example id="zend.layout.advanced.inflector.accessors">
192             <title>Zend_Layout のアクセサでインフレクタを変更する</title>
194             <para>
195                 デフォルトの <classname>Zend_Layout</classname> のインフレクタは、
196                 ターゲットやビュースクリプトのサフィックスに静的な参照を用い、
197                 それらの値を設定するためのアクセサを提供しています。
198             </para>
200             <programlisting language="php"><![CDATA[
201 // インフレクタのターゲットを設定します
202 $layout->setInflectorTarget('layouts/:script.:suffix');
204 // レイアウトビュースクリプトのサフィックスを設定します
205 $layout->setViewSuffix('php');
206 ]]></programlisting>
207         </example>
209         <example id="zend.layout.advanced.inflector.directmodification">
210             <title>Zend_Layout のインフレクタを直接変更する</title>
212             <para>
213                 インフレクタは、ターゲットと (ひとつあるいは複数の)
214                 ルールを持っています。<classname>Zend_Layout</classname>
215                 が使用するデフォルトのターゲットは ':script.:suffix'
216                 です。':script' には登録されているレイアウト名、そして
217                 ':suffix' にはインフレクタの静的なルールが渡されます。
218             </para>
220             <para>
221                 たとえば、レイアウトスクリプトのサフィックスを
222                 'html' に変更して、MixedCase および camelCase
223                 形式の名前をダッシュではなくアンダースコアで区切るようにし、
224                 かつ小文字への変換もやめてみましょう。
225                 さらに、スクリプトの格納先を 'layouts'
226                 サブディレクトリに変更します。
227             </para>
229             <programlisting language="php"><![CDATA[
230 $layout->getInflector()->setTarget('layouts/:script.:suffix')
231                        ->setStaticRule('suffix', 'html')
232                        ->setFilterRule(array('Word_CamelCaseToUnderscore'));
233 ]]></programlisting>
234         </example>
236         <example id="zend.layout.advanced.inflector.custom">
237             <title>インフレクタのカスタマイズ</title>
239             <para>
240                 ほとんどの場合は、既存のインフレクタを修正するだけで十分でしょう。
241                 しかし、さまざまな場所で別の形式のオブジェクトを使い分けたいこともあります。
242                 <classname>Zend_Layout</classname> はそんな場合にも対応しています。
243             </para>
245             <programlisting language="php"><![CDATA[
246 $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
247 $inflector->addRules(array(
248     ':script' => array('Word_CamelCaseToUnderscore'),
249     'suffix'  => 'html'
251 $layout->setInflector($inflector);
252 ]]></programlisting>
253         </example>
255         <note>
256             <title>インフレクションを無効にできます</title>
258             <para>
259                 インフレクションを無効にしたり有効にしたりするには、
260                 <classname>Zend_Layout</classname> オブジェクトのアクセサを使用します。
261                 これは、たとえばレイアウトビュースクリプトを絶対パスで指定したい場合などに便利です。
262                 また、レイアウトスクリプトを指定するためのインフレクションが特に不要な場合にも便利です。
263                 有効にしたり無効にしたりするには、単純に <methodname>enableInflection()</methodname> メソッドおよび
264                 <methodname>disableInflection()</methodname> メソッドを使用します。
265             </para>
266         </note>
267     </sect2>
268 </sect1>
269 <!--
270 vim:se ts=4 sw=4 et: