Smarty と Zend Framework の連携
次に紹介する方法では、Zend_Viewと互換のあるラッパークラスを実装することで、SmartyとZend Frameworkを連携させます。Zend_Viweと互換のあるクラスを作成するには最低限、Zend_View_Interfaceに定義されているメソッドを実装する必要があります:
getEngine
setScriptPath, setBasePath, addBasePath, getScriptPaths;
__set, __get, __isset, __unset, assign, clearVars
render
Zend_View_Smartyの作成
ここで紹介するラッパーZend_View_SmartyはZend_View_Interfaceを継承しつつ、必要最低限の実装を行ったものです。Zend_View_SmartyはSmartyのラッパーとなっているので、受け取った情報をそのままSmartyのインスタンスに渡すような仕組みになっています。
処理の流れとしては、ますコンストラクタでSmartyのインスタンスを作成します。
... class Zend_View_Smarty implements Zend_View_Interface { protected $_smarty; public function __construct() { $this->_smarty = new Smarty; }
この他の処理は、ほとんど受け取った情報をSmartyのインスタンスに渡す処理です。パスまわりの設定は実質的にはsetBasePath
で処理しています:
public function setBasePath($path, $prefix = 'Zend_View') { $_basePath = $path; $this->_smarty->template_dir = $_basePath.'/templates/';; $this->_smarty->compile_dir = $_basePath.'/templates_c/'; $this->_smarty->config_dir = $_basePath.'/configs/'; $this->_smarty->cache_dir = $_basePath.'/cache/'; }
最後に、render
メソッドが呼び出されたときにはsmartyのfetch
メソッドを呼び出します:
//描画を行う public function render($name) { $name = preg_replace('/.+\//', '', $name); return $this->_smarty->fetch($name); }
なお、ここで$name
の先頭から'/'
までの部分を取り除く処理を行っているのは、Zend_Viewの通常のルータから渡される$nameはコントローラ名/アクション名という形で渡されるのに対し、今回のサンプルではSmartyはアクション名のみを利用しているからです。
Zend_View_Smartyの利用
次に、Zend_View を利用するかわりにZend_View_Smartyを利用するようにindex.phpを設定します:
<?php require_once 'Zend/Controller/Front.php'; require_once '/codezine/smarty/Zend_View_Smarty.php'; require_once 'Zend/Controller/Action/Helper/ViewRenderer.php'; //$view は Smartyのラッパー $view = new Zend_View_Smarty(); //$viwe を使い、.phtml のかわりに .tpl を探すように設定した // ViewRendererを作成 $viewHelper = new Zend_Controller_Action_Helper_ViewRenderer($view, array('viewSuffix'=>'tpl')); //この ViewRendererを登録 Zend_Controller_Action_HelperBroker::addHelper($viewHelper); Zend_Controller_Front::run('../zendapps/controls');
ここまで設定すれば、後はZend Frameworkのお作法そのままで、Smartyを利用できます。
<?php require_once 'Zend/Controller/Action.php'; class SmartyController extends Zend_Controller_Action { ... public function indexAction() { $this->view->setBasePath('/codezine/smarty'); $this->view->name = 'Codezine'; } ...
このとおり、アクションスクリプトまわりは通常のZend Framework のものとほぼ同じになっています。
今回のまとめ
今回はビューヘルパを自作する方法と、テンプレートエンジンのSmartyとZend_Viewの連携について説明しました。次回は Zend_Form についての解説を行います。今回紹介したビューヘルパーでもHTMLのフォームの作成はできましたが、Zend_Formはより器用にHTMLのフォームを扱うことができます。