前回の続き。 Zend_LayoutをZend FrameworkのMVCを利用して使用し、ビューを表示する例を書きます。 今回使用するファイルおよびディレクトリ構成は以下のようになっています。``` AppBase/ application/ default/ controllers/ IndexController.php views/ layouts/ layout.phtml another.phtml scripts/ index/ foo.phtml bar.phtml menu.phtml bootstrap.php lib/ Zend/ public/ .htaccess index.php

順々に見ていこうと思います。 フロントコントローラの役割を果たすindex.phpは以下のようにbootstrap.phpを呼び出すだけです。 ここの詳細はこちらをご覧ください。 AppBase/public/index.php < ?php require ‘../application/bootstrap.php’;

bootstrap.phpにてZend\_Layoutのインスタンス化および設定を行います。 staticメソッドのstartMvc()を呼び出すと、Zend\_Layoutはインスタンスを生成し、クラスの内部に保持します。getMvcInstance()関数を使えばインスタンスを取得することができます。 startMvc()の引数にZend\_Configか配列を渡して、オプションの設定ができます。配列のキーに設定名、値に設定値を指定します。今回はレイアウトスクリプトの置き場所を指定するlayoutPathだけを設定しています。もし指定しない場合はZend\_Viewのスクリプトパスが使用されます。以下にbootstrap.phpの内容を書きます AppBase/application/bootstrap.php < ?php

// Zend_Layout の設定 require_once ‘Zend/Layout.php’; Zend_Layout::startMvc(array( ‘layoutPath’ => ‘../application/default/views/layouts’ ));

// Zend_Controllerなど、その他の設定は省略

このほかにもstartMvc()で指定できるオプション設定はいろいろありますが今回は割愛します。 続いてコントローラです。 AppBase/application/default/controllers/IndexController.php < ?php

require_once ‘Zend/Controller/Action.php’;

class IndexController extends Zend_Controller_Action { public function fooAction() { }

public function barAction() {

    $this->\_helper->layout->setLayout('another');
    
    // 別の方法
    //Zend\_Layout::getMvcInstance()->setLayout('another');
}

}

fooとbarの2つのアクションがあり、fooはそのままデフォルトのレイアウトを、barではanotherという他のレイアウトを使う設定をしています。Zend\_Layoutではデフォルトのレイアウト名がlayoutで、拡張子が.phtmlになっています。つまり、fooアクションではlayoutPathで指定したディレクトリ内のlayout.phtmlが、barアクションではanother.phtmlがレイアウトとして呼び出されます。このレイアウトが[前回](http://wadslab.net/2008/05/zend_layout/)で言うところのouterスクリプトにあたるものです。 layout.phtml、another.phtmlはそれぞれ以下のようになっています。 AppBase/application/default/views/layouts/layout.phtml

Zend\_Layout Test Page

Zend_Layout Test Page

< ?php echo $this->layout()->menu ?>
< ?php echo $this->layout()->content ?>

AppBase/application/default/views/layouts/another.phtml

Zend\_Layout Test Page

Zend_Layout Another Test Page

< ?php echo $this->layout()->menu ?>
< ?php echo $this->layout()->content ?>

デフォルトのレイアウト名は、startMvc()のオプションでlayoutというオプション名で設定するか(array('layout'=>'レイアウト名'))、setLayout()関数で変更できます。 拡張子名は、startMvc()のオプションでviewSuffixというオプション名で設定するか、setViewSuffix()関数で変更できます。 上の2つのレイアウトスクリプトでは、menuとcontentという2つの出力をしています。これがinnerスクリプトに当たります。Zend\_Layoutはデフォルトでcontentという名前で表示するスクリプトが設定されています。contentにあたるスクリプトは、Zend\_Viewでコントローラとアクション名から選択されるビュースクリプトと同じものになります。IndexControllerのfooアクションの場合は、views/scripts/index/foo.phtmlがこれにあたります。innerスクリプトファイルの内容を以下に記します。 AppBase/application/default/views/scripts/index/foo.phtml

contents

here is foo

AppBase/application/default/views/scripts/index/bar.phtml

contents

here is bar

menuのほうについては実はまだ何も設定していません。デフォルトのinnerスクリプト以外のスクリプトを表示するためには、HTTPレスポンスオブジェクト(Zend\_Controller\_Response\_Http)を用いて設定する方法と、Zend\_Layoutを用いて設定する方法があります。IndexContorller.phpを書き換えてmenuを表示できるようにしたものを以下に示します。 AppBase/application/default/controllers/IndexController.php class IndexController extends Zend_Controller_Action { public function init() { // HTTPレスポンスから設定 $response = $this->getResponse(); $response->insert(‘menu’, $this->view->render(‘menu.phtml’)); // Zend_ViewのscriptPath //$response->insert(‘menu’, Zend_Layout::getMvcInstance()->render(‘menu’)); // Zend_LayoutのlayoutPath

    // Zend\_Layoutから設定
    //$layout = Zend\_Layout::getMvcInstance();
    //$layout->assign('menu', $this->view->render('menu.phtml')); // Zend\_ViewのscriptPath
    //$layout->assign('menu', $layout->render('menu')); // Zend\_LayoutのlayoutPath
}

public function fooAction() {
}

public function barAction() {

    $this->\_helper->layout->setLayout('another');
    
    // 別の方法
    //Zend\_Layout::getMvcInstance()->setLayout('another');
}

}