今回はZend_View_Interfaceを実装してSmartyに対応させたビューをZend_Layoutへ対応させてみようという試みです。 使用するSmartyのクラスはこれ(ViewSmarty)です。 まずはZend_Layoutにviewを登録する方法ですが、以下のどちらかの方法でViewSmartyのクラスを登録します(まだ他にもあるかもしれません)。
- Zend_Layoutの$_viewプロパティに設定する
- Zend_Controller_Action_Helper_ViewRendererに登録する
・Zend_Layoutの$_viewプロパティに設定する``` require_once ‘Zend/Layout.php’; require_once ‘ViewSmarty.php’;
Zend_Layout::startMvc(array( ‘view’ => new ViewSmarty(), ));
もしくは
require_once ‘Zend/Layout.php’;
require_once ‘ViewSmarty.php’;
Zend_Layout::startMvc(); $layout = Zend_Layout::getMvcInstance(); $layout->setView(new ViewSmarty());
・Zend\_Controller\_Action\_Helper\_ViewRendererに登録する
require_once ‘Zend/Controller/Action/Helper/ViewRenderer.php’;
require_once ‘Zend/Layout.php’;
require_once ‘ViewSmarty.php’;
Zend_Controller_Action_HelperBroker::addHelper( new Zend_Controller_Action_Helper_ViewRenderer(new ViewSmarty()) ); Zend_Layout::startMvc();
この記述は [bootstrap.php](http://wadslab.net/2008/05/zend_controller-5/)に書くと良いでしょう。 これで実行すると、addScriptPath()がないというエラーが出ます。 addScriptPath()関数はZend\_View\_Abstract関数で実装されています。これは指定したパスを現在のビュースクリプトを走査するパスへ追加します。Smatryをざっと見たところ、複数のパスを設定することはできなさそうでした。ViewSmatyのほうで仕掛けを作ってやる必要がありそうです。 今回ところは、Zend\_View\_Interfaceにも規定されているsetScriptPath()関数のエイリアスとしておきます。
/**
* Zend_Layout対応
* Smartyではスクリプトパス(template_dir)は複数指定で
* きないので、setScriptPath()のエイリアスとしておく。
* 配列が渡された場合は最初の要素をパラメタとする。
*
* @return string|array $path
*/
public function addScriptPath($path) {
if(is_array($path)) {
$path = array_shift($path);
}
return $this->setScriptPath($path);
}
続いて、スクリプトファイル内でZend\_Layoutのオブジェクトを参照できるようにしておきます。render()関数を修正します
public function render($name) {
// 以下の記述を追加
$this->_smarty->assign(
‘layout’,
Zend_Layout::getMvcInstance()
);
return $this->\_smarty->fetch($name);
}
スクリプトファイルの書き方は[前回](http://wadslab.net/2008/05/zend_layout-2/)のレイアウトスクリプトを例に修正します。
Zend\_Layout Test Page
目次
Zend_Layout Test Page
{$layout->menu}
{$layout->content}