Smartyの使用
Zend FrameworkでSmartyを使用してみました。
Zend_View_InterfaceのSmarty用実装クラスを作成しての方法をとりました。
今回の環境はZend Frameworkのバージョンが1.6、Smartyは2.6です。
以下は、Zend_View_InterfaceのSmarty用実装クラスです。
ほとんどZend Framework徹底入門での例のまんまです。
<?php require_once 'Smarty/Smarty.class.php'; require_once 'Zend/View/Interface.php'; class Zend_View_Smarty implements Zend_View_Interface { protected $_view; /** * * @param $tmplPath テンプレートのパス * @param $params 追加パラメータ * @return void **/ public function __construct($tmplPath, $params=array()) { $this->_view = new Smarty(); //$this->setBasePath($basePath); $this->setScriptPath($tmplPath); if($params) { foreach( $params as $key => $value ) { $this->_view->$key = $value; } } } /** * @return void **/ public function setSmartyCompileDir($path) { $this->_view->compile_dir = $path; } /** * @return void **/ public function setSmartyCacheDir($path) { $this->_view->cache_dir = $path; } /** * @return void **/ public function setSmartyConfigDir($path) { $this->_view->config_dir = $path; } /** * Smarty用のベースパスを設定 * @return void **/ public function setBasePath($path, $prefix = 'Zend_View') { if(!is_readable($path) ) { throw new Exception("invalid smarty base path ( $path ) "); } $this->_view->compile_dir = $path . '/templates_c'; $this->_view->config_dir = $path . '/config'; $this->_view->cache_dir = $path . '/cache'; $this->_view->plugins_dir[] = $path . '/plugins'; } /** * View(Smarty)用のベースパスを設定 * @return void **/ public function addBasePath($path, $prefix = 'Zend_View') { $this->setBasePath($path, $prefix); } /** * テンプレートのパスを設定 * @return void **/ public function setScriptPath($path) { if(!is_readable($path) ) { throw new Exception("invalid view script path ( $path ) "); } $this->_view->template_dir = $path; } /** * テンプレートのパスを設定 * @return void **/ public function addScriptPath($path) { $this->setScriptPath($path); } /** * @return array テンプレートのパス(常に1要素の配列になる) **/ public function getScriptPaths() { //print_r($this->_view); return array($this->_view->template_dir); } /** * View(Smarty)の変数値を取得。 * * @param $key 変数のキー * @return 変数値 **/ public function __get($key) { return $this->_view->get_template_vars($key); } /** * このViewへのプロパティ設定時のフック。Smartyへの変数Assignを行う。 * * @param $key 変数キー * @param $value * @return void **/ public function __set($key, $value) { $this->_view->assign($key, $value); } /** * View(Smarty)の変数値をクリア。 * * @param $key 変数キー * @return void **/ public function __unset($key) { $this->_view->clear_assign($key); } /** * View(Smarty)の変数値の有無をテスト。 * * @return boolean **/ public function __isset($key) { return ( $this->_view->get_template_vars($key) != NULL); } /** * View(Smarty)変数のAssign * * @param $spac array or string Smartの変数のキーと値を組にした配列、または変数キー * @param $value 変数値 * @return void **/ public function assign($spec, $value=NULL) { if(is_array($spec) ) { foreach( $spec as $key => $v) { $this->_view->assign($key, $v); } } else { $this->_view->assign($spec, $value); } } /** * View(Smarty)変数の全クリア * * @return void **/ public function clearVars() { $this->_view->clear_all_assign(); } /** * Viewのレンダリング * * @param $name テンプレート名 * @return レンダリングされる内容 **/ public function render($name) { return $this->_view->fetch($name); } /** * @return View(Smarty)エンジン **/ public function getEngine() { return $this->_view; } } ?>
index.phpの初期化として上記で作成したクラスをインスタンス化とレンダラーへの登録を以下のような処理を追加しました。
defined('APPLICATION_PATH') or define('APPLICATION_PATH', dirname(__FILE__) . '/..'); defined('SMARTY_PATH') or define('SMARTY_PATH', APPLICATION_PATH . '/smarty'); defined('SMARTY_TEMPLATE_PATH') or define('SMARTY_TEMPLATE_PATH', APPLICATION_PATH . '/views/templates'); require_once 'Zend/View/Smarty.php'; require_once 'Zend/Controller/Action/HelperBroker.php'; require_once 'Zend/Controller/Action/Helper/ViewRenderer.php'; $view = new Zend_View_Smarty(SMARTY_TEMPLATE_PATH); $renderer = new Zend_Controller_Action_Helper_ViewRenderer(); $renderer->setView($view); $renderer->setViewSuffix('html') ->setViewBasePathSpec(SMARTY_PATH) ->setViewScriptPathSpec(':controller/:action.:suffix'); Zend_Controller_Action_HelperBroker::addHelper($renderer);
コントローラでの実装は、通常のphpでのViewを使う場合と同じです。