前回の記事で書いたことを試してみました。
私がsmartyとZendを合わせて使う上で、実現したいのは以下
1.テンプレートの配置をURLからイメージしやすいようにしたい
http://test.com/aaa/ の場合は、templates/aaa.html
http://test.com/aaa/bbb/の場合は、templates/aaa/bbb.html
2.プログラムが必要ない場合は、Actionコントローラーを書きたくない
(Actionメソッドがなくても、テンプレートが表示されるようにしたい)
3.テンプレートもないURLが指定されたら、トップページなど指定のURLに遷移させたい
1.は、renderのnoControllerがtrueのときのテンプレート作成ルールを、
コントローラー名+指定拡張子とすることで解決。
ただし、render呼び出しの際に、
$this->render(コントローラー名, null, true)
とする必要がありますが、この部分を簡略化できないかが今後の課題です。
2.はまだ試せてません。しかし、前々回の記事の方法が応用できそうです。
3.も2.と同様に前々回の記事の方法で実現できそうです。
しかし、前回と同様の方法だと、Zend_Controller_Actionのサブクラスを基底クラスとして
作成することになるので、これはできれば避けたいところです。
会員サイトとかなら、基底クラス作るのはいいのですが、Smarty使いたいだけで、
基底クラスを作るとなると、ログインセッション管理をやろうと思ったときに、
テンプレートエンジンに関わるファイルを修正することになりかねません。
index.phpにつぎたした部分は以下です。
require_once('Zend/Controller/Action/Helper/ViewRenderer.php');
require_once('Custom/View/Smarty.php');
$view = new Zend_View_Smarty(null, $smartyConfig);
$viewHelper = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewHelper->setViewBasePathSpec($smartyConfig['template_dir'])
->setViewSuffix('html');
Zend_Controller_Action_HelperBroker::addHelper($viewHelper);
$smartyConfigは、Smartyの設定値の配列です。
Custom/View/Smarty.phpは、Zend_View_Interfaceに沿って、
Smartyが使えるようにしたViewクラスです。
中身は、ここの最後の方にのっているSmartyラッパークラスと同様です。
ただ、function getScriptPaths()に誤りがあります。
return $this->_smarty->template_dir;
↓
return array($this->_smarty->template_dir);
とする必要があります。
getScriptPaths()なので、パスが配列で複数取得されることが想定されて、
Zend_Controller_Action_Helper_ViewRendererが作成されているためです。
これでより少ないソースで、smartyと連携できるようになりました。
より手間を少なくする方法がないか、もうちょっと試してみる予定です。
ViewRendererヘルパーと、ErrorHanderプラグインあたりを組み合わせると、
なんとかなりそうな気がドキュメントを読んでいるとするのですが、どうなんでしょう。
あたりがついたら、試してみます。