Zend Framework と Smarty と Layout 機能その1

PHPの種 ブログさん経由。

簡単な Zend_Layout Example | プログラムの種 ブログ


Zend Framework には symfonyCakePHP にある Layout 機能が標準ではない。
PHP の種ブログさんで紹介されているのは、Zend_View を使用した Layout を実現しようとするもの。
Zend_View を使用する場合には参考になると思う。

そもそも Layout とは

Zend Framework にはその機能がないため、ドキュメントには
記載されていないので、CakePHP のドキュメントから引用すると、

レイアウト(layout)とは、ビューの周りの部分を囲む、外観すべてのコードを含んだものです。

http://www.cakephp.jp/doc/views.html#id4808138

とある。


いちいち共通のヘッダやらフッタをそれぞれのテンプレートに
書くのは非効率なので、Layout という共通のテンプレートを作り、
その中に個別のコンテンツを埋め込む。
Smarty で Layout 機能を実現するには、いくつか方法がある。

Smarty の テンプレートファイル内で include file を使う方法
  1. コンテンツとなるテンプレートのファイルパスを取得する
  2. Layout テンプレートにコンテンツのファイルパスをアサインする
  3. コンテンツに値をアサインする
  4. Layout テンプレートを Smarty の fetch メソッドを使用して取得する
  5. fetch した Layout テンプレートを echo する
<?php
$smarty->template_dir = "layout.tpl";
$contents = "contents.tpl";
$title = "タイトル";
$smarty->assign("title", $title);
$smarty->assign("param", "this is a content");
$smarty->assign("contents", $contents);
echo $smarty->fetch("layout.tpl");

layout.tpl

<html>
  <head>
    <title>{$title|escape}</title>
</head>
<body>
<div id="header">ヘッダー</div>
  <div id="contents">
    {include file=$contents}
  </div>
<div id="header">フッター</div>
</body>
</html>

contents.tpl

{$param|escape}

include file を使用して、テンプレートを埋め込むやり方。

コンテンツとなるテンプレートファイルの中身を取得し、コンテンツ自体を assign してしまう方法

この方法はウノウラボに詳細な記述があるので、そちらを参照。
http://labs.unoh.net/2007/06/smartyrails.html


上記の違いは、include file を使ってコンテンツを取得するのか、
コンテンツを fetch してコンテンツを取得するのかの違いだけで、
結局の所はコンテンツを取得して、レイアウトのテンプレートに
アサインするには変わらない。
# 他にも方法があるのかな。。。

Zend Framework を絡めた Layout の設定はまた後で記述する。