Kwartzで実行時にテンプレートをコンパイルする方法
..
Kwartzはプレゼンテーションロジックとプレゼンテーションデータの分離を実現するテンプレートシステムです。本来テンプレートとはデザイナーとの分業が目的だったわけですが、Smartyなどではどうしてもテンプレートファイルにロジックが混入してしまうので、デザイナーと事前にロジック部分の扱いを取り決めておかなければならないなど、完全な分業が不可能です。
Kwartzはテンプレートファイルからロジック部分を完全に排除することができるため、デザイナーはHTMLとCSSのコーディングのみに集中し、プログラマはロジック部分のみに集中することができるわけです。
Kwartzは下記からダウンロードすることができます。
http://www.kuwata-lab.com/kwartz/
Ruby版、PHP版、Java版がありあますので、PHP版をダウンロードします。ダウンロードしたファイルを解凍後、Kwartzディレクトリ以下をPHPのinclude_path以下にコピーすればインストール完了です。
次に以下のファイルを作成してHTTPサーバのhtdocsに配置します。
[index.php]
require_once('Kwartz/Main.php');
$argv = array('kwartz-php', '-l', 'php', '-p', 'my.plogic', 'my.html' );
ob_start();
KwartzMain::main($argv);
$out = ob_get_clean();
/*
// こういう書き方もできるようです
$kwartz = new KwartzMain($argv);
$out = $kwartz->execute();
*/
file_put_contents('cache.php', $out);
$members = array( 'member1', 'member2', 'member3', );
include('cache.php');
[my.plogic]
/* The element which is marked by 'id="list1"' */
#list1 {
logic: {
foreach( $members as $member ){
_stag() // start tag
_cont() // content
_etag() // end tag
}
}
}
/* The element which is marked by 'id="mark:item1"' */
#item1 {
/* replace the content with value of a variable 'member' */
value: $member;
}
[my.html]
<table>
<tr id="list1">
<td id="mark:item1">foo</td>
</tr>
</table>
仕組みとしては、index.phpにアクセスするとまずKwartzによりmy.plogic(ロジック記述用ファイル)とmy.html(HTMLテンプレート)がコンパイルされ、PHPファイルが出力されます(cache.php)。次にテンプレート出力用の変数を用意して、cache.phpをincludeします。includeによりテンプレートPHPファイルが解釈され、変数の内容が出力されます。
このようにロジックファイルとテンプレートファイルが分離しているため、非常にメンテナンスはしやすいです。
なお、Kwartzにはコマンドラインツールも用意されていますので、テンプレートPHPファイルは事前にコンパイルしてもいいのですが、上記のようにすることでSmartyのように実行時にテンプレートファイルを更新することができます。