1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20792 -->
4 <sect1 id="zend.layout.advanced">
5 <title>Zend_Layout の高度な使用法</title>
8 <classname>Zend_Layout</classname> には、高度な使用法がいろいろあります。
9 たとえばさまざまなビューの実装やファイルシステム上のレイアウトに対応させたりといったことです。
18 <emphasis>ビューオブジェクトのカスタマイズ</emphasis>。
19 <classname>Zend_Layout</classname> は、
20 <classname>Zend_View_Interface</classname> を実装した任意のクラスを使用できます。
24 <emphasis>フロントコントローラプラグインのカスタマイズ</emphasis>。
25 <classname>Zend_Layout</classname> に標準で含まれているフロントコントローラプラグインは、
26 レイアウトを自動的にレンダリングしてからレスポンスを返します。
27 これを独自のプラグインで置き換えることができます。
31 <emphasis>アクションヘルパーのカスタマイズ</emphasis>。
32 <classname>Zend_Layout</classname> に標準で含まれているアクションヘルパーは、
34 これは、レイアウトオブジェクト自信へのプロキシとなっています。
38 <emphasis>レイアウトスクリプトのパス解決方法のカスタマイズ</emphasis>。
39 <classname>Zend_Layout</classname> では、独自の <link
40 linkend="zend.filter.inflector">インフレクタ</link>
41 を使用してレイアウトスクリプトのパス解決方法を行うことができます。
42 あるいは、標準のインフレクタを設定して独自のルールを指定することもできます。
46 <sect2 id="zend.layout.advanced.view">
47 <title>ビューオブジェクトのカスタマイズ</title>
50 <classname>Zend_Layout</classname> では、
51 <classname>Zend_View_Interface</classname> を実装した任意のクラスや
52 <classname>Zend_View_Abstract</classname> を継承した任意のクラスを用いて
53 レイアウトスクリプトをレンダリングできます。
55 コンストラクタ/<methodname>startMvc()</methodname> のパラメータとして渡すか、
56 あるいはアクセサ <methodname>setView()</methodname> で設定します。
59 <programlisting language="php"><![CDATA[
60 $view = new My_Custom_View();
61 $layout->setView($view);
65 <title>Zend_View の実装がすべて同じというわけではない</title>
68 <classname>Zend_Layout</classname> では
69 <classname>Zend_View_Interface</classname> を実装した任意のクラスを使用できますが、
70 その中で様々な <classname>Zend_View</classname> ヘルパー
72 <link linkend="zend.view.helpers.initial.placeholder">プレースホルダ</link>
74 が使用できなければ問題となることもあるでしょう。
75 これは、<classname>Zend_Layout</classname>
77 <link linkend="zend.view.helpers.initial.placeholder">プレースホルダ</link>
82 これらのヘルパーをサポートしていない <classname>Zend_View</classname>
83 の実装を使用する場合は、レイアウト変数をビューに取り込む方法を見つける必要があります。
84 たとえば <classname>Zend_Layout</classname> オブジェクトを継承して
85 <methodname>render()</methodname> メソッドにビューへの変数を渡すようにするか、
87 レイアウトのレンダリングの前に変数を渡すようにするといった方法があります。
91 あるいは、もしあなたの使用するビュー実装が何らかのプラグイン機構をサポートしているのなら、
92 'Zend_Layout' プレースホルダ経由で
93 <link linkend="zend.view.helpers.initial.placeholder">
98 <programlisting language="php"><![CDATA[
99 $placeholders = new Zend_View_Helper_Placeholder();
100 $layoutVars = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
105 <sect2 id="zend.layout.advanced.plugin">
106 <title>フロントコントローラプラグインのカスタマイズ</title>
109 <acronym>MVC</acronym> コンポーネントと組み合わせて使用するときに、
110 <classname>Zend_Layout</classname> はフロントコントローラプラグインを登録します。
111 このプラグインは、ディスパッチループを抜ける前の最後のアクションで
113 ほとんどの場合はデフォルトのプラグインで十分でしょうが、
116 <methodname>startMvc()</methodname> メソッドの
117 <code>pluginClass</code> オプションで指定します。
122 <classname>Zend_Controller_Plugin_Abstract</classname>
123 を継承したものでなければなりません。また、コンストラクタの引数で
124 レイアウトオブジェクトのインスタンスを受け取れるようにする必要があります。
125 それ以外の実装内容については自由に決めることができます。
130 <classname>Zend_Layout_Controller_Plugin_Layout</classname>
135 <sect2 id="zend.layout.advanced.helper">
136 <title>アクションヘルパーのカスタマイズ</title>
139 <acronym>MVC</acronym> コンポーネントと組み合わせて使用するときに、
140 <classname>Zend_Layout</classname> はアクションコントローラヘルパーを
141 ヘルパーブローカに登録します。デフォルトのヘルパーである
142 <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>
143 は、レイアウトオブジェクトのインスタンス自身に対する
144 (何もしない) プロキシとしてはたらきます。
150 <classname>Zend_Controller_Action_Helper_Abstract</classname>
151 を継承したアクションヘルパークラスを作成します。
153 <methodname>startMvc()</methodname> メソッドの
154 <code>helperClass</code> オプションに指定します。
159 <sect2 id="zend.layout.advanced.inflector">
160 <title>レイアウトスクリプトのパス解決方法のカスタマイズ: インフレクタの使用法</title>
163 <classname>Zend_Layout</classname> は、<classname>Zend_Filter_Inflector</classname>
165 レイアウト名からレイアウトスクリプトのパスへの変換を行います。
166 デフォルトで使用するルールは、まず 'Word_CamelCaseToDash'、
167 その後に 'StringToLower'、そして最後にサフィックス 'phtml'
168 を追加してパスを作成します。たとえば次のようになります。
173 'foo' は 'foo.phtml' に変換されます。
177 'FooBarBaz' は 'foo-bar-baz.phtml' に変換されます。
182 これを変更するには三通りの手段があります。
183 インフレクションのターゲットやビューのサフィックスを
184 <classname>Zend_Layout</classname> のアクセサで変更すること、
185 <classname>Zend_Layout</classname> のインスタンスに関連づけられている
187 あるいは独自のインフレクタのインスタンスを作成してそれを
188 <methodname>Zend_Layout::setInflector()</methodname> で渡すことです。
191 <example id="zend.layout.advanced.inflector.accessors">
192 <title>Zend_Layout のアクセサでインフレクタを変更する</title>
195 デフォルトの <classname>Zend_Layout</classname> のインフレクタは、
196 ターゲットやビュースクリプトのサフィックスに静的な参照を用い、
197 それらの値を設定するためのアクセサを提供しています。
200 <programlisting language="php"><![CDATA[
201 // インフレクタのターゲットを設定します
202 $layout->setInflectorTarget('layouts/:script.:suffix');
204 // レイアウトビュースクリプトのサフィックスを設定します
205 $layout->setViewSuffix('php');
209 <example id="zend.layout.advanced.inflector.directmodification">
210 <title>Zend_Layout のインフレクタを直接変更する</title>
213 インフレクタは、ターゲットと (ひとつあるいは複数の)
214 ルールを持っています。<classname>Zend_Layout</classname>
215 が使用するデフォルトのターゲットは ':script.:suffix'
216 です。':script' には登録されているレイアウト名、そして
217 ':suffix' にはインフレクタの静的なルールが渡されます。
221 たとえば、レイアウトスクリプトのサフィックスを
222 'html' に変更して、MixedCase および camelCase
223 形式の名前をダッシュではなくアンダースコアで区切るようにし、
225 さらに、スクリプトの格納先を 'layouts'
229 <programlisting language="php"><![CDATA[
230 $layout->getInflector()->setTarget('layouts/:script.:suffix')
231 ->setStaticRule('suffix', 'html')
232 ->setFilterRule(array('Word_CamelCaseToUnderscore'));
236 <example id="zend.layout.advanced.inflector.custom">
237 <title>インフレクタのカスタマイズ</title>
240 ほとんどの場合は、既存のインフレクタを修正するだけで十分でしょう。
241 しかし、さまざまな場所で別の形式のオブジェクトを使い分けたいこともあります。
242 <classname>Zend_Layout</classname> はそんな場合にも対応しています。
245 <programlisting language="php"><![CDATA[
246 $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
247 $inflector->addRules(array(
248 ':script' => array('Word_CamelCaseToUnderscore'),
251 $layout->setInflector($inflector);
256 <title>インフレクションを無効にできます</title>
259 インフレクションを無効にしたり有効にしたりするには、
260 <classname>Zend_Layout</classname> オブジェクトのアクセサを使用します。
261 これは、たとえばレイアウトビュースクリプトを絶対パスで指定したい場合などに便利です。
262 また、レイアウトスクリプトを指定するためのインフレクションが特に不要な場合にも便利です。
263 有効にしたり無効にしたりするには、単純に <methodname>enableInflection()</methodname> メソッドおよび
264 <methodname>disableInflection()</methodname> メソッドを使用します。