テンプレートエンジンの利用
今までの説明では、ビューに関する部分を直接PHPで書く前提で話を進めてきました。しかし、生産性や管理の手間を考えると、テンプレートエンジンを使ってビューの部分を生成したいと思われるかもしれません。Zend_View は特定のテンプレートエンジンに依存していないため、さまざまなテンプレートエンジンと連携することが可能です。
テンプレートエンジンとZend Frameworkを連携させる方法にはいくつかあります。ここでは、Smartyを題材に、直接Smartyを呼び出す方法と、Zend View の「自動レンダリングモード」から利用する方法と、2通り説明します。
Smarty の設定
SmartyはPHPのためのテンプレートエンジンです。今回の解説では、Smartyの設定方法や利用方法については必要最低限のことしか触れません。Smarty に関する日本語のドキュメントもありますので、必要に応じて参照してください。
Smarty は「C:\Smarty-2.6.19」以下に展開されているとします。また、php.iniでSmartyへのパスが指定されているとします。筆者の場合の設定は次のようになっています:
include_path = ".;C:\Program Files\PHP\pear;C:\ZendFramework-1.5.2\library;C:\Smarty-2.6.19\libs"
今回の例で使うSmartyのためのファイルは「C:\codezine\smarty」以下に設置するとします。このフォルダの下にSmartyで使う 4つのフォルダ(cache, configs, templates, templates_c)を作成します。また、例で使うテンプレートindex.tplをtemplatesの下に配置します。
{* コメント *} こんにちは、{$name}。 Smarty とZend Frameworkの連携成功です!
また、Smarty が動作しているか確認するためのスクリプト「test_smarty.php」を「C:\codezine\smarty」の下に配置します。
<?php require_once('Smarty.class.php'); $smarty = new Smarty(); $smarty->assign('name','codezine'); echo $smarty->fetch('index.tpl'); ?>
この時点でのファイルの配置は次のようになっているはずです:
C:\codezine\smarty cache/ configs/ templates/ index.tpl templates_c/ test_smarty.php
ここで「test_smarty.php」を実行すると次のようになるはずです:
C:\codezine\smarty>php test_smarty.php こんにちは、codezine。 Smarty とZend Frameworkの連携成功です!
(注:この時点ではまだ連携には成功していないです)
Smartyに描画を任せる
それではまず、Smartyに描画を任せる方法について説明します。この方法ではZend_Viewによる描画を無効にし、Smartyからの結果をそのまま出力します:
<?php require_once 'Zend/Controller/Action.php'; class SmartyController extends Zend_Controller_Action { ... public function noviewAction() { //Zend_View による自動レンダリングを無効にする Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true); require_once('Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = '/codezine/smarty/templates/'; $smarty->compile_dir = '/codezine/smarty/templates_c/'; $smarty->config_dir = '/codezine/smarty/configs/'; $smarty->cache_dir = '/codezine/smarty/cache/'; //変数の設定 $smarty->assign('name','codezine'); echo $smarty->fetch('index.tpl'); } }
実行結果です:
この方法では、Zend_Viewの機能との互換性はないため、アクションコントローラでの記述をSmartyに合わせた形式にする必要があります。