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

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

Ethnaでxoopsみたいなテンプレートの使い方をする


(追記 2007/08/05)
Ethna-2.3.2用レイアウトテンプレートの作り方 で、もうちょいスマートなやり方かいてます。

  • -

xoopsEthna(というか、Smartyを普通に使って、ヘッダ・フッタを共通のファイルにし、includeで読み込ませた場合)が

こんな風になってて、どちらかというと私はxoopsのつくりが結構好きです。なぜかと言うと、すべてのテンプレートファイルに共通のヘッダとフッタを常に入れておきたいとき、

<{include file="header.tpl"}>

ほげ
...

<{include file="footer.tpl"}>

とやる必要がなくなるわけですね。

xoopsも構造がこんなんなってるんですよね。theme.html の中に、

<{$xoops_contents}>

てタグがあって、モジュールごとのテンプレートの内容はここに書き出されるカンジ。*1

なんていえばいいのかわかりませんが、ウノウの人が「Railsライクなレイアウトテンプレートを使う」と言っていたので、Ruby on Rails もそういうつくりなのかな?Railsは使ったことないので知りません。
でもxoopsなら知ってます。
要するに、テンプレートの構造が上画像なカンジになってます。ウノウラボの画像ほとんどそのままですが、まあオリジナルですよ(笑)ウノウの人画像きれいだなー。わざわざ私は画像作った意味あるんでしょうか。
というか余談ですが、「あー、xoopsみたいな構造にしたいなー、どうすればできるかなー、あ、footer.php でこんな処理してんのかーどれどれやってみよー実験しよー」って思って「やったー完成したーこれEthnaに応用させよう〜」って思ってた矢先にウノウさんであんな記事見つけましたよ。まるで私がウノウラボに載ってたからやったみたいですが、まぁそういうタイミングでした。笑 いい機会なのでトラバ飛ばしときました。




で具体的な実装をEthnaでやるには、Ethna_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
{
    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));
                
                // これはもちろん template ディレクトリに、外枠を作った theme.tpl があることが前提
                // もちろん面倒だからファイルの存在確認とかしてない。ごめんなさい。
                $this->engine->display('theme.tpl');
        } else {
            return Ethna::raiseWarning('template not found ' . $this->template);
        }
    }
}
?>

そんで、もちろん Controller で

<?php
...
    var $class = array(
        ...
        'renderer'      => 'MyEthna_Renderer_Smarty',
        ...

とかしてやって、あとは

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
...
</head>
<body>

<div id="header">
    <h1>Ethnabbs Theme</h1>
</div>
<div id="content">

<{$content}>

</div>
<div id="footer">
    Theme Powered By <a href="http://ethna.jp">Ethna</a>-<{$smarty.const.ETHNA_VERSION}>.
</div>
</body>
</html>

みたいな、theme.tpl を用意してやるだけ。


前述しましたが、私はこっちの構造のほうが好きなので今後もこれで行くと思います。

もっとスマートな方法があったら教えてください。

Ethnaでxoopsみたいなテンプレートの使い方をする:ビュー内でテーマ変更 - 肉とご飯と甘いもの @ sotarok に追記

*1:あ、左右のデリミタは <{ }> つかってます。これは私はEthnaでも使ってます。スタイルとかjsとか迂闊に埋め込めなくなるからですね。