Zend_Layout クイックスタート
Zend_Layout の使用法は大きくふたつに分けられます。
Zend Framework の MVC を使用する方法とそれ以外の方法です。
レイアウトスクリプト
どちらにしても、まずはレイアウトスクリプトを作成しなければなりません。
レイアウトスクリプトは、単純に Zend_View
(あるいはその他のあなたが使用しているビュー実装) を用いて作成します。
レイアウト変数の登録には Zend_Layout の
プレースホルダ
を使用します。プレースホルダへのアクセスは、
プレースホルダヘルパーを使用するか、
あるいはレイアウトヘルパーのレイアウトオブジェクトのプロパティを使用します。
たとえばこのようになります。
私のサイト
layout()->content;
// プレースホルダヘルパーで 'foo' キーを取得します
echo $this->placeholder('Zend_Layout')->foo;
// レイアウトオブジェクトを取得し、そこから変数のキーを取得します
$layout = $this->layout();
echo $layout->bar;
echo $layout->baz;
?>
]]>
Zend_Layout は Zend_View
を用いてレンダリングをしているので、
登録されているビューヘルパーはすべて使用できます。
またビューに登録されている変数も使用できます。
特に便利なのは、さまざまな プレースホルダヘルパー
を使用できることでしょう。
これらを用いると、たとえば <head>
セクションやナビゲーション部などのコンテンツを取得できます。
headTitle() ?>
headScript() ?>
headStyle() ?>
render('header.phtml') ?>
placeholder('nav') ?>
layout()->content ?>
render('footer.phtml') ?>
]]>
Zend_Layout を Zend Framework の MVC で使用する方法
Zend_Controller には拡張用の機能が豊富に用意されています。
これは フロントコントローラ
プラグイン や アクションコントローラ
ヘルパー によって実現されているものです。
Zend_View にも ヘルパー は存在します。
Zend_Layout を MVC コンポーネントとともに使用すると、
これらのさまざまな拡張ポイントの恩恵を受けることになります。
Zend_Layout::startMvc() は、オプションの設定項目を指定して
Zend_Layout のインスタンスを作成します。
そして、フロントコントローラプラグインを登録し、
ディスパッチループの終了後にレイアウトの中身をレンダリングするようにします。
また、アクションヘルパーを登録して、
アクションコントローラからレイアウトオブジェクトにアクセスできるようにします。
さらに、ビュースクリプトからレイアウトのインスタンスを取得するには
Layout ビューヘルパーを使用します。
まずは、MVC と組み合わせるための Zend_Layout
のインスタンスの作成方法を見てみましょう。
startMvc() には、オプションの配列あるいは
Zend_Config オブジェクトを渡すことができます。
これによってインスタンスをカスタマイズします。
オプションの詳細については この節
を参照ください。
アクションコントローラからは、
アクションヘルパーでレイアウトのインスタンスにアクセスします。
_helper->layout->disableLayout();
}
public function bazAction()
{
// このアクションでは別のレイアウトスクリプトを使用します
$this->_helper->layout->setLayout('foobaz');
};
}
]]>
ビュースクリプトでは、Layout
ビューヘルパーを用いてレイアウトオブジェクトにアクセスします。
このビューヘルパーは、他のヘルパーとは異なり引数を受け取りません。
そして文字列ではなくオブジェクトを返します。
これにより、レイアウトオブジェクトのメソッドをすぐにコールできるようになります。
layout()->setLayout('foo'); // 別のレイアウトを設定します ?>
]]>
MVC に登録した Zend_Layout
のインスタンスを取得するには、静的メソッド
getMvcInstance() を使用します。
最後に、Zend_Layout
のフロントコントローラプラグインが持つ、
レイアウトのレンダリング以外の重要な機能をひとつ紹介します。
レスポンスオブジェクトから名前つきセグメントをすべて取得し、
それをレイアウトの変数に代入するというものです。
このとき 'default' セグメントは 'content' という名前の変数に代入します。
これにより、アプリケーションのコンテンツにアクセスして
それをビュースクリプト内でレンダリングできるようになります。
たとえば、こんな例を考えてみましょう。あなたの書いたコードがまず
FooController::indexAction() を実行し、
デフォルトのレスポンスセグメントに何らかのコンテンツをレンダリングしてから
NavController::menuAction() に転送します。
ここでは、レンダリングしたコンテンツをレスポンスセグメント
'nav' に格納します。最後に
CommentController::fetchAction()
に転送してコメントを取得しますが、その内容はデフォルトのレスポンスセグメントに
(追記する方式で) レンダリングします。
そして、ビュースクリプト側ではそれを個別にレンダリングします。
layout()->nav ?>
layout()->content ?>