HTML_Template_Flexy は、HTML_Template_Xipe をシンプルにするところから始められました。 しかし、Flexy の長期的な目標は、PHP ネイティブでコンパイルを行うタイプのテンプレートに対する 汎用的な基礎 API を作り上げることにあります。
Flexy は、現在いくつかのバックエンド (テンプレート書式) をサポートしています。 また、より多くをサポートするできるよう拡張性を考慮して設計されています。 キーとなる書式は以下のとおりです。
flexy におけるデータの代入には二種類の方法があります。 どちらを使用するかはあなたの好みによります。
これらの柔軟性に加え、さらに以下のようなことが実現できています。
PHP には様々なテンプレートシステムがありますが、おおよそ 「置換型」もしくは 「PHP コード生成型」のシステムに二分できます。
置換型のテンプレートエンジンには、 たとえば HTML_Template_IT、 FastTemplate、PhpLib テンプレートがあります。 この種のテンプレートは、総体的に、ブロックや入れ子構造において 実行速度が遅く、変数の指定にもコードを多く書く手間がかかりがちです。
PHP コード生成型のテンプレートエンジンには Flexy、Smarty、 SimpleTemplate (HTML_Template_Xipe に改名) などがあります。 これらは、複雑なテンプレートでもうまく扱うことができ、 拡張性にも優れています。 (Flexy の長期的な目標は、これらの PHP コード生成型のテンプレートの サポートをひとつのパッケージで行うという所にあります。)
標準のコンパイルバックエンドは Tokenizer を使用しており、 HTML のタグと属性を使用してループや条件分岐処理を行えます。 また、HTML フォームは動的な XML_Tree 風の要素で管理し、 コード内で操作することができます (この変換は、テンプレートを コンパイルする際に一度だけ行われます)。
Flexy のテンプレートは、通常、(MVC モデルでいう)コントローラクラスからコールされます。 結果を出力するには、HTML_Template_Flexy に、テンプレートの名前と出力対象のオブジェクトを渡すだけです。 テンプレートで出力に用いられる変数はこのオブジェクトにセットされている必要があります。
HTML_Template_Flexy の使用法
<?php
/* アプリケーションの設定 - この処理は別ファイルに分けて記述するのが適当 */
require_once 'HTML/Template/Flexy.php';
require_once 'PEAR.php';
$options = &PEAR::getStaticProperty('HTML_Template_Flexy','options');
$config = parse_ini_file('example.ini',TRUE);
$options = $config['HTML_Template_Flexy'];
/* ページコントローラークラス */
class controller_test
{
var $template = "home.html"; // テンプレートの名前
var $title; // {title} の内容
var $numbers = array(); // {numbers} の内容、foreach を取る
var $anObject;
var $elements = array(); // ここに要素を保存していく
/* セットアップセクション - POST された値や変数を取得する */
function controller_test()
{
$this->start();
$this->output();
}
function start()
{
// タイトルの設定
$this->title = "Hello World";
// オブジェクトを保存
$this->anObject = new StdClass;
// メンバーに値を代入
$this->anObject->member = 'Object Member';
// フォーム要素が必要な場合は、これをインクルードしなければなりません
require_once 'HTML/Template/Flexy/Element.php';
// form 要素用のオブジェクトを生成
$this->elements['input'] = new HTML_Template_Flexy_Element;
// 値の代入
$this->elements['input']->setValue('Hello');
for ($i = 1;$i< 5;$i++) {
$this->numbers[$i] = "Number $i";
}
}
/* 出力セクション - この部分は default_controller クラス内に実装すると良い */
function output() {
$output = new HTML_Template_Flexy();
$output->compile($this->template);
$output->outputObject($this,$this->elements);
}
function someMethod() {
return "<B>Hello From A Method</B>";
}
}
/* ページコントローラーのインスタンスを生成 - ファクトリーメソッドを適用し、ページコントローラークラスを管理統括するページでの実装が適当 */
new controller_test();
?>
次に、テンプレートの例を示します。
HTML_Template_Flexy テンプレートの例
//このコメントより前の php タグについては無視します
<html>
<head>
<title>{title}</title>
</head>
<body>
<H1>{title}</H1>
<form name="form">
<table>
<tr>
<td>
<?php /* $elements['input'] オブジェクトの内容とマージされます。 */ ?>
Input Box: <input name="input">
</td>
</tr>
<?php /* flexy:foreach により属性値を入れています。 */ ?>
<tr flexy:foreach="numbers,number,string">
<td>
<?php /* flexy:foreach により属性値を入れています。 */ ?>
<a href="mypage.html?id=%7Bnumber%7D">{string}</a>
</td>
</tr>
</table>
<?php /* 限定的ながら配列へのアクセスもサポートしています */ ?>
this is number 2 : {numbers[2]}
<?php /* note that full stops seperate object and variables or methods */ ?>
This is a {anObject.member}
<?php /* オブジェクト内のメソッドを実行する事もできます */ ?>
{someMethod()}
<?php /* デフォルトでは変数は全て htmlspecialchars() によりエスケープされます。変数をエスケープしたくない場合は修飾子 :h を使ってください */ ?>
{someMethod():h}
</body>
</html>
<?php /* ここではコメントを PHP で埋め込んでいます。
これは PHPDocumentor によるマニュアル生成に対応するためです。
テンプレートエンジンは HTML 形式のコメントを無視しますが PHPDoc 形式のマニュアル生成に対応しません。*/ ?>
出力は、このようになります。
HTML_Template_Flexy の出力例
Hello World Input Box : [Hello ] Number 1 Number 2 Number 3 Number 4 this is number 2 : Number 2 This is a member Variable <B>Hello From A Method</B> Hello From A Method