CodeZine(コードジン)

特集ページ一覧

Zend Framework入門(13):
共通レイアウトによるウェブサイトの管理 - Zend_Layout-

Zend Frameworkによる実践的なPHPアプリケーション開発 13

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/12/22 14:00
目次

Zend_Layoutの作成

 Zend_Layoutのインスタンスを作成するには、Zend_Layoutの静的メソッドであるZend_Layout::startMvcを利用します(リスト2)。

[リスト2]Zend_Layoutの作成(index.phpより)
//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を利用して取得する方法です。

[リスト3]Zend_Layoutのインスタンスの取得
//getMvcInstanceメソッドを利用した例
$layout = Zend_Layout::getMvcInstance();  //…(1)
//アクションコントローラ内でのインスタンスの取得法の例
$layout = $this->_helper->layout;  //…(2)
Zend_Layoutの静的メソッド
メソッド名 引数 説明
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に登録しています。

[リスト4]部品の作成(IndexController.phpより)
...
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のようになります。

[リスト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)を描画した結果になります。

[リスト6]ビュースクリプトでの本文の作成(index.phtml)
<p>
  ここに本文が来ます。
<p>

 この本文に相当する部分は、標準ではZend_Layoutの「メンバ変数content」に格納されています。

レイアウトスクリプトの実行

 最後にレイアウトスクリプトでこれらの部品を配置します。標準では「layout.phtml」がレイアウトスクリプトとして呼び出されます。Zend_Layoutのメンバ変数はレイアウトスクリプトからは「$this->layout->変数名」で参照することができます。サンプルのレイアウトスクリプトをリスト7に示します。

[リスト7]レイアウトスクリプト(layout.phtml)
<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」で呼び出しています)。

図4 他のアクションを描画した出力
図4 他のアクションを描画した出力

 図2と図4とを比べると、本文に相当する部分が「ここに本文が来ます。」から「ここに別の文章が来ます。」になっていることが分かると思います。このようにZend_Layoutを利用すれば、まわりの部品は共用しつつ中の本文だけを変えることが可能になります。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2010/11/23 11:57 リスト10に誤りがあったのを修正

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5