Ethnaでxoopsみたいなテンプレートの使い方をする:ビュー内でテーマ変更
(追記 2007/08/05)
Ethna-2.3.2用レイアウトテンプレートの作り方 で、もうちょいスマートなやり方かいてます。
- -
Ethnaでxoopsみたいなテンプレートの使い方をする - 肉とご飯と甘いもの @ sotarok
の記事で書いたことに追記。
同じアプリケーションの中で、複数のテーマファイルを使いたい場合。
- 何も指定しなかった場合は theme.tpl
- 指定した場合はそのテンプレート
としたいので、
前のエントリでの「MyEthna_Renderer_Smarty」をちょっと変更。
<?php require_once 'Smarty/Smarty.class.php'; require_once ETHNA_BASE . '/class/Ethna_SmartyPlugin.php'; require_once ETHNA_BASE . '/class/Renderer/Ethna_Renderer_Smarty.php'; class MyEthna_Renderer_Smarty extends Ethna_Renderer_Smarty { // デフォルトで使用されるテーマは「theme.tpl」 var $theme = 'theme.tpl'; function perform($template = null) { if ($template === null && $this->template === null) { return Ethna::raiseWarning('template is not defined'); } if ($template !== null) { $this->template = $template; } if ((is_absolute_path($this->template) && is_readable($this->template)) || is_readable($this->template_dir . $this->template)) { // ここで、<{$content}> というタグの中に、遷移先で指定されたテンプレートを突っ込む。 $this->engine->assign("content", $this->engine->fetch($this->template)); // ここを変更 // 今回もエラー処理は施してませんよ。w $this->engine->display($this->theme); } else { return Ethna::raiseWarning('template not found ' . $this->template); } } }
といったカンジに変更。
それで、テーマを変更した View の preforward 内で、
<?php ... function preforward() { ... $this->_getRenderer()->theme = 'theme_wide.tpl'; }
みたいに記述してやれば変更ができましたとさ。
例えば、管理画面とその他の画面ではインターフェースを分けたいとか、そういう要望にうってつけ!
ところで、MyEthna_* っていう名称ダサいな。(笑)自分好みにカスタマイズしたときの命名規則作ろうかな。そうすればなんか自分のライブラリみたいでカッコイイ?笑 んなことないか。。
追記。
preforward()内で、_getRenderer() しちゃったんだけど、実際は
<?php ... function preforward() { ... $this->backend->ctl->getRenderer()->theme = 'theme_wide.tpl'; }
としたほうがいいのかも?
自分なりに考えて、理由は
- _getRenderer() は
プライベートプロテクテッドなメソッド?(アンダースコアついてるしw) - どうせ view::_getRenderer() でコントローラ内の getRenderer() を呼んでる
という感じでどうですかね。