肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

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() を呼んでる

という感じでどうですかね。