いろいろ準備中

[Zend Framework][php] Zend_Layout ② クイックスタート

5月 31st, 2008 Posted in Zend Framework

前回の続き。

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がレイアウトとして呼び出されます。このレイアウトが前回で言うところのouterスクリプトにあたるものです。

layout.phtml、another.phtmlはそれぞれ以下のようになっています。

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

<html>
  <head>
    <title>Zend_Layout Test Page</title>
  </head>
  <body>
    <h1>Zend_Layout Test Page</h1>
    < ?php echo $this->layout()->menu ?>
    < ?php echo $this->layout()->content ?>
  </body>
</html>

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

<html>
  <head>
    <title>Zend_Layout Test Page</title>
  </head>
  <body>
    <h1>Zend_Layout Another Test Page</h1>
    < ?php echo $this->layout()->menu ?>
    < ?php echo $this->layout()->content ?>
  </body>
</html>

デフォルトのレイアウト名は、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

<h3>contents</h3>
here is foo

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

<h3>contents</h3>
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');
    }
 
}

スクリプトをレイアウトに設定するためにrender()でバッファに書き出していますが、Zend_Viewのrender()を使うか、Zend_Layoutのrender()を使うかで使用されるスクリプトが変わります。今回の例では、Zend_Viewのrender()を用いた場合はviews/scripts にあるmenu.phtmlスクリプトが、Zend_Layoutのrender()を用いた場合はviews/layouts にあるmenu.phtmlが呼び出されることになります。また、Zend_Layoutを用いるときは、スクリプト名を指定するときに拡張子は必要ありません。

以上で表示をする準備ができました。実際に表示してみます。example.comはお使いの環境に合わせてください

http://example.com/index/foo

zend_layout_1.png

http://example.com/index/bar

zend_layout_2.png

たぶん次回に続く

コメントを投稿する