導入
導入 –
HTML_Template_Flexy に出来ること
導入
HTML_Template_Flexy は、HTML_Template_Xipe をシンプルにするところから始められました。
しかし、Flexy の長期的な目標は、PHP
ネイティブでコンパイルを行うタイプのテンプレートに対する
汎用的な基礎 API を作り上げることにあります。
Flexy は、現在いくつかのバックエンド (テンプレート書式) をサポートしています。
また、より多くをサポートするできるよう拡張性を考慮して設計されています。
キーとなる書式は以下のとおりです。
-
Standard - リッチなトークナイザー駆動のエンジンです。{variable_placeholders}
のような変数プレースホルダ、属性 (flexy:foreach="....")
そしてカスタムタグ <flexy:tojavascript ... を使用することで、
単純なマークアップからすばやく PHP コードを作成します。
このテンプレートは、タグを破壊することなしに WYSIWYG HTML
エディタで編集できるように設計されています。
-
Regex - 古くからあるテンプレートバックエンドで、Smarty や Xipe、
そして Email 型を PHP のコードに変換します。
-
Raw - コンパイルを行わないバックエンドで、
PHP を使用してテンプレートを作成できるようになります。
作成したアプリケーションを再配布する場合など、
コンパイルできるかどうか心配な場合に有用です。
flexy におけるデータの代入には二種類の方法があります。
どちらを使用するかはあなたの好みによります。
-
Push - $flexy->setData() および $flexy->setDataByRef()
を使用してデータをテンプレートエンジンに送ります。
これは、Smarty やその他のテンプレートと似ている方法です。
-
Push/Pull - 出力にデータプロバイダオブジェクト (Data Object あるいは Controller
のいずれか) を送ります。このオブジェクトには、表示するデータ
(およびコールされるメソッドを含むオブジェクト) が含まれます。
これを使用すると、PEAR 標準
(例えば PHPDoc コメントなど)
を用いてテンプレート内の変数を文書化できるという利点があります、
これらの柔軟性に加え、さらに以下のようなことが実現できています。
HTML_Template_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
に、テンプレートの名前と出力対象のオブジェクトを渡すだけです。
テンプレートで出力に用いられる変数はこのオブジェクトにセットされている必要があります。
<?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 形式のマニュアル生成に対応しません。*/ ?>
出力は、このようになります。
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