Zend_Layoutの作成
Zend_Layoutのインスタンスを作成するには、Zend_Layoutの静的メソッドであるZend_Layout::startMvc
を利用します(リスト2)。
//Zend_Layoutの作成 //レイアウトスクリプトの場所も指定している Zend_Layout::startMvc(array('layoutPath' => '../zendapps/views/layouts/')); //フロントコントローラの呼び出し Zend_Controller_Front::run('../zendapps/controls');
startMvc
は配列一つを引数として取ることができ,そこでZend_Layoutの設定を行うことができます。ここではレイアウトスクリプトが置いてある場所(layoutPath)を指定しています。
このように作成したZend_Layoutのインスタンスを取得する方法を説明します。一つはリスト3の(1)のように、Zend_Layoutの静的メソッドであるstartMvc
を利用する方法で、もう一つはリスト3の(2)のように、アクションヘルパーのlayout
を利用して取得する方法です。
//getMvcInstance
メソッドを利用した例
$layout = Zend_Layout::getMvcInstance(); //…(1)
//アクションコントローラ内でのインスタンスの取得法の例
$layout = $this->_helper->layout; //…(2)
メソッド名 | 引数 | 説明 |
Zend_Layout::startMvc | $options | Zend_Layoutのインスタンスを作成。$optionsは配列で、Zend_Layoutの設定が格納されている。 |
Zend_Layout::getMvcInstance | (なし) | Zend_Layoutのインスタンスの取得。 |
Zend_Layout::resetMvcInstance | (なし) | Zend_Layoutのインスタンスの初期化。 |
部品の作成と登録
次に配置すべき部品の生成と登録を行います。部品の生成はZend_Viewを使ってビュースクリプトを描画するのが一般的でしょう。例えばリスト4ではmenu.phtmlを描画し、それをZend_Layoutのメンバ変数menu
に登録しています。
... class IndexController extends Zend_Controller_Action { public function init() { //Zend_Layoutで使う変数 menu を menu.phtml から作成 $this->_helper->layout->assign('menu', $this->view->render('menu.phtml')); } ...
リスト4では1行で書きましたが、少し丁寧な書き方をするとリスト5のようになります。
//1. Zend_Layoutで使う変数 menu を menu.phtml から作成 $this->_helper->layout->assign('menu', $this->view->render('menu.phtml')); //2. 上と同じだが、分けて書いたもの //Zend_Layoutのインスタンスの取得 $layout = $this->_helper->layout; //部品の作成 $menu = $this->view->render('menu.phtml'); //部品の登録 $layout->assign('menu', $menu);
これで、Zend_Layoutのメンバ変数menu
にmenu.phtmlを描画した内容が格納されました。この例ではアクションスクリプト内で共通レイアウトに関する設定を行いましたが、実際には異なるアクションスクリプトでもレイアウトを共有したい場合が多いと思います。その場合にはアクションヘルパーなど、アクションスクリプトの外にこれらの記述を行う必要があります。
次に「本文」に相当する部分です。これは何が、どのように描画されるのでしょうか? 実は本文に相当する部分はZend_Layoutを使わなかった場合に描画される結果が入ります。この例ですと、indexコントローラのindexアクションが処理を行っているため、index.phtml(リスト6)を描画した結果になります。
<p> ここに本文が来ます。 <p>
この本文に相当する部分は、標準ではZend_Layoutの「メンバ変数content
」に格納されています。
レイアウトスクリプトの実行
最後にレイアウトスクリプトでこれらの部品を配置します。標準では「layout.phtml」がレイアウトスクリプトとして呼び出されます。Zend_Layoutのメンバ変数はレイアウトスクリプトからは「$this->layout->変数名
」で参照することができます。サンプルのレイアウトスクリプトをリスト7に示します。
<html> <head> <title>Zend Layout Test</title> <link href="/codezine.css" rel="stylesheet" type="text/css"> </head> <body> <div id="menu"><?php echo $this->layout()->menu ?></div> <!-- …(1)--> <div id="content"><?php echo $this->layout()->content ?></div> <!-- …(2)--> </body> </html>
リスト7の(1)でmenu.phtmlの内容を、リスト7の(2)で本文に相当する内容を配置しています。
他のアクションの描画
今見たのはindexコントローラのindexアクションを処理した例でした。では、ここで他のアクションを描画するとどうなるでしょう? 試しにindexコントローラのanotherアクションを呼び出します(ここでは「http://localhost/index/another」で呼び出しています)。
図2と図4とを比べると、本文に相当する部分が「ここに本文が来ます。」から「ここに別の文章が来ます。」になっていることが分かると思います。このようにZend_Layoutを利用すれば、まわりの部品は共用しつつ中の本文だけを変えることが可能になります。