今回は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}