Ethna_Renderer_Flexy(alpha)を作ってみた
EthnaでHTML_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タグとの連結をうまくラッピング出来れば、より使いやすくなりそうなので、引き続き改良してみます。