Zend_Layout の高度な使用法Zend_Layout には、高度な使用法がいろいろあります。 たとえばさまざまなビューの実装やファイルシステム上のレイアウトに対応させたりといったことです。 主な拡張ポイントは次のとおりです。
ビューオブジェクトのカスタマイズZend_Layout では、 Zend_View_Interface を実装した任意のクラスや Zend_View_Abstract を継承した任意のクラスを用いて レイアウトスクリプトをレンダリングできます。 独自のビューオブジェクトを単純に コンストラクタ/ startMvc() のパラメータとして渡すか、 あるいはアクセサ setView() で設定します。
フロントコントローラプラグインのカスタマイズMVC コンポーネントと組み合わせて使用するときに、 Zend_Layout はフロントコントローラプラグインを登録します。 このプラグインは、ディスパッチループを抜ける前の最後のアクションで レイアウトをレンダリングします。 ほとんどの場合はデフォルトのプラグインで十分でしょうが、 もし独自のプラグインを作成したい場合は、 作成したプラグインクラスの名前を startMvc() メソッドの pluginClass オプションで指定します。 ここで使用するプラグインクラスは Zend_Controller_Plugin_Abstract を継承したものでなければなりません。また、コンストラクタの引数で レイアウトオブジェクトのインスタンスを受け取れるようにする必要があります。 それ以外の実装内容については自由に決めることができます。 デフォルトのプラグインは Zend_Layout_Controller_Plugin_Layout です。 アクションヘルパーのカスタマイズMVC コンポーネントと組み合わせて使用するときに、 Zend_Layout はアクションコントローラヘルパーを ヘルパーブローカに登録します。デフォルトのヘルパーである Zend_Layout_Controller_Action_Helper_Layout は、レイアウトオブジェクトのインスタンス自身に対する (何もしない) プロキシとしてはたらきます。 たいていの場合はこれで十分でしょう。 独自の機能を書きたい場合は、 Zend_Controller_Action_Helper_Abstract を継承したアクションヘルパークラスを作成します。 そして、そのクラス名を startMvc() メソッドの helperClass オプションに指定します。 実装の詳細は自由に決められます。 レイアウトスクリプトのパス解決方法のカスタマイズ: インフレクタの使用法Zend_Layout は、Zend_Filter_Inflector を使用して確立したフィルタチェインで レイアウト名からレイアウトスクリプトのパスへの変換を行います。 デフォルトで使用するルールは、まず 'Word_CamelCaseToDash'、 その後に 'StringToLower'、そして最後にサフィックス 'phtml' を追加してパスを作成します。たとえば次のようになります。
これを変更するには三通りの手段があります。 インフレクションのターゲットやビューのサフィックスを Zend_Layout のアクセサで変更すること、 Zend_Layout のインスタンスに関連づけられている インフレクタのルールを変更すること、 あるいは独自のインフレクタのインスタンスを作成してそれを Zend_Layout::setInflector() で渡すことです。 Example #1 Zend_Layout のアクセサでインフレクタを変更する デフォルトの Zend_Layout のインフレクタは、 ターゲットやビュースクリプトのサフィックスに静的な参照を用い、 それらの値を設定するためのアクセサを提供しています。
Example #2 Zend_Layout のインフレクタを直接変更する インフレクタは、ターゲットと (ひとつあるいは複数の) ルールを持っています。Zend_Layout が使用するデフォルトのターゲットは ':script.:suffix' です。':script' には登録されているレイアウト名、そして ':suffix' にはインフレクタの静的なルールが渡されます。 たとえば、レイアウトスクリプトのサフィックスを 'html' に変更して、MixedCase および camelCase 形式の名前をダッシュではなくアンダースコアで区切るようにし、 かつ小文字への変換もやめてみましょう。 さらに、スクリプトの格納先を 'layouts' サブディレクトリに変更します。
Example #3 インフレクタのカスタマイズ ほとんどの場合は、既存のインフレクタを修正するだけで十分でしょう。 しかし、さまざまな場所で別の形式のオブジェクトを使い分けたいこともあります。 Zend_Layout はそんな場合にも対応しています。
|