・速度が遅い
・テンプレートが汚くなり(ロジックが書けてしまう)、デザイナーとの協業がしにくい
・再利用性が低い
などがありますが、2番目の「テンプレート汚染」についてはPHPTALやKwartzを使うことである程度解決できます。
しかし3番目の「再利用性」について考えられているテンプレートシステムはあまりなく、考えられていたとしてもそれはテンプレートファイルの再利用であり、ビジュアルコードの再利用についてまで考えられたテンプレートシステムはPHPでは私の知る範囲では皆無です。
そこで、下記のようなテンプレートシステムを考案しました。
・テンプレートファイルはプレーンなHTML
・ビジュアルコードは「ウィジェット」と呼ばれるクラスにまとめられる
・ウィジェットのテンプレートHTML内の要素へのバインドはXMLを使う
こうすることで、テンプレートとロジックの分離とともにビジュアルコードの再利用性も高められるわけです。このXMLを冒頭で紹介した「CSML(Chacoal Screen Markup Language)と名づけました。
下記はCSMLとテンプレート(HTML)のサンプルです。
[CSML]
<?xml version="1.0" encoding="utf-8"?> <csml:page xmlns:csml="http://charcoal.net/csml/ns/"> <csml:widget id="header_panel" class="HeaderPanelWidget"> <csml:widget id="menu" class="MenuWidget"> <csml:widget id="main_panel" class="MainPanelWidget"> <csml:widget id="footer_panel" class="FooterPanelWidget"> </csml:page>
[HTMLテンプレート]
<html> <body> <div id="header_panel"></div> <div id="menu"></div> <div id="main_panel"></div> <div id="footer_panel"></div> </body> </html>
実際、レンダリングを行う時はCSMLとHTMLを関連付けする必要がありますが、それはレイアウトマネージャの方で行います。ですので同じCSMLを異なるHTMLテンプレートに関連付けることも出来ます。タスクの実行結果によって見栄えを大きく変更する場合などに便利な機能です。
HTMLテンプレートの要素とCSML要素の対応はid属性で行います。同じidのHTML要素の位置に、CSMLに記述されたウィジェットクラスのコードが展開されます。コードは描画時に評価されますが、Smartyなどと同じように、展開後のコードはキャッシュされるため、展開にかかるコストは最初の1回だけになります。
ビューコードを記述するウィジェットクラスでは直接HTMLを出力できるほか、更にCSMLを適用すると言った使い方ができます。この方法を使うと、ウィジェットを「塊」で管理することができるようになり、部品の再利用性が高まります。
まだ構想段階ではありますが、CharcoalPHPの次期バージョン(0.7.0)では基本的な機能を実装できればと思っています。