SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

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を利用すれば、まわりの部品は共用しつつ中の本文だけを変えることが可能になります。

次のページ
Zend_Layoutのメソッド

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3339 2010/11/23 11:57

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング