Ethna_Renderer_Flexy(alpha)を作ってみた

EthnaHTML_Template_Flexyをテンプレートとして使えるクラスを作成してみました。


Ethnaの古いバージョン用で使えるのを作っている方はいらしたのですが、Rendererの拡張形式ではなく、Smartyというクラス名でSmartyを偽装する感じでした。
Ethna Flexy API(Ethna HTML_Template_Flexy API) - PHP::PEAR - dozo PukiWiki


最新のEthna-2.3.2では、テンプレートエンジンを拡張できるようになっています。
Rachoのテンプレートエンジンを使えるものを作成されている方がいましたので、Flexy版を作ってみました。
404 Not Found


使い方は、以下から落としたファイルを libディレクトリの中において、XX_Controller.phpの中を設定するだけです。


http://maru.cc/files/20080403_ethna_renderer_flexy.zip


使い方。

■1.Ethna_Renderer_Flexy.php設置

Ethna_Renderer_Flexy.php をパスの通ったディレクトリに設置します。
Ethna内の class/Renderer/内でもいいと思いますが、とりあえず、プロジェクト直下の libディレクトリの中に置けば使えます。

■2.Controllerの設定

プロジェクトの appディレクトリ内の XX_Controller.php を修正します。
XXの部分は作成したプロジェクトのIDになっているはずです。
このファイルの 130行前後にあるクラス定義を修正します。

    /**
     *  @var    array   クラス定義
     */
    var $class = array(
        /*
         *  TODO: 設定クラス、ログクラス、SQLクラスをオーバーライド
         *  した場合は下記のクラス名を忘れずに変更してください
         */
        'class'         => 'Ethna_ClassFactory',
        (略)
        'view'          => 'Mm_ViewClass',
        'renderer'      => 'Ethna_Renderer_Flexy', // <-ここを修正
        'url_handler'   => 'Mm_UrlHandler',
    );

Ethna_Renderer_Smarty から Ethna_Renderer_Flexy に修正します。
これで設定完了です。


あとは、テンプレートを修正すればOK。


とりあえず、簡単な使い方。

■setApp、setAppNeの場合

setAppとsetAppNeは、Flexy側でエスケープをするので内部的に処理の違いは無くしてあります。


php側 perform内など

$this->af->setApp('var1', '<b>あいえうお</b>');
$this->af->setAppNe('var2', '<b>かきくけこ</b>');

テンプレート内の記述

{app[var1]}<br />
{app_ne[var2]}<br />
{app_ne[var2]:h}<br />

結果

<b>あいうえお</b>
<b>かきくけこ</b>
かきくけこ

appもapp_neも区別は無く、テンプレート側で :h を使うことでhtmlとして出力させることが出来ます。
エスケープする対象を、Ethna側で区別か、Flexy側で区別かどちらにしようか迷ったのですが、結局こうしました。

配列の場合

DBから値を取得したと想定して、以下のような配列をテンプレート側で一覧表示する方法です。
php

$list = array(
    array('id'=>1,'name'=>'あいえお'),
    array('id'=>2,'name'=>'かきくけこ'),
    );
$this->af->setApp('list', $list);

テンプレート側

<ul>
    <li flexy:foreach="app[list],k,v">{v[id]}:{v[name]}</li>
</ul>

これで一覧表示が出来ます。


テーブルの場合には、こんな感じ。

<table border="1">
    <tr>
        <th>ID</th>
        <th>name</th>
    </tr>
    <tr flexy:foreach="app[list],k,v">
        <td>{v[id]}</td>
        <td>{v[name]}</td>
    </tr>
</table>

定数

定数にアクセスする方法が無いので、拡張しました。
テンプレート内の記述

Ethna-{constant(#ETHNA_VERSION#)}.

結果

Ethna-2.3.2.

constantというメソッドを定義していますので、「#」で囲って文字列を渡すことで定数にアクセスできます。

その他

ifなどの書き方はFlexyのドキュメントを参考にしてみてください。
Manual :: HTML_Template_Flexy

さいごに

まだ、変数の展開だけなので、非力ですが、Form要素やinput,textarea,selectタグとの連結をうまくラッピング出来れば、より使いやすくなりそうなので、引き続き改良してみます。