PHP DOMパーサを使ってテンプレートエンジンを作ってみる
男なら一度はテンプレートエンジンの作成に挑戦してみるよね!
ということで PHP Simple HTML DOM Parser を使って、DOMパーサ利用ならではのテンプレートエンジンを作ってみました。
ひとまずはテンプレート変数の利用だけ。クラス名とかは考えるのが面倒だったのでひとまず Template で。
PHP
<?php
require_once 'Template.php';
$variables = new stdClass();
$variables->foo = 'AAA';
$variables->bar = array(1, 2);
$variables->baz->quux = 'BBB';
$template = new Template('./templates', './caches');
$template->assign($variables);
$template->renderer('Example');
?>
Template (Example.html)
<html> <head> </head> <body> <span key="foo">hoge</span> <div key="bar.0">hoge</div> <p key="bar.1">hoge</p> <p key="bar.2">hoge</p> <font color="#FF0000" key="baz.quux">hoge</font> </body> </html>
結果
<html> <head> </head> <body> <span key="foo">AAA</span> <div key="bar.0">1</div> <p key="bar.1">2</p> <p key="bar.2">hoge</p> <font color="#FF0000" key="baz.quux">BBB</font> </body> </html>
割り当てたオブジェクト(もしくは連想配列)のプロパティが、タグ内の「key=***」という属性で指定されている箇所をテンプレート変数として置換。変数としても配列、オブジェクトともに利用可能。あと「key」という属性名も好きな名称に指定可能。
PHPTALってよりmayaaに近い?(使ったことないのでよくわからない。中間層の XML もないけど。)
まだまだ途中段階だし、コードもベタに書いて一切見直ししていないのでアレな内容ですが。
ちなみにアーカイブ内の specs ディレクトリ内は、PHPSpecによるファイル群(スペック、テスト)で、ここを見れば&動かせば、現在の仕様や利用方法などが分かります。
なお現在の状態はこんな感じ。
テンプレート変数割り当て - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される - 連想配列を割り当てると、配列キーがテンプレート変数として利用される - テンプレート変数として配列が利用できる - テンプレート変数としてオブジェクトが利用できる - テンプレート変数は配列とオブジェクトが混合で利用できる - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる - テンプレート変数に対して関数が利用できる (ERROR) - タグ内のテンプレート変数の要素名が変更できる - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる - 置換されるテンプレート変数に対して個別にurlencodeできる - 置換されるテンプレート変数に対して個別にnl2brできる - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える テンプレートエンジンの利用 - 利用するとキャッシュができる - キャッシュデータがあるとそれが描写で再利用される - キャッシュデータ作成後にテンプレートが更新されると、キャッシュを作り直して描写する - テンプレートファイルの拡張子が変更できる 17 examples, 0 failures, 1 error
関数利用を作ってる最中でタイムアップ。また後日にでも。
トラックバック(0)
このブログ記事を参照しているブログ一覧: PHP DOMパーサを使ってテンプレートエンジンを作ってみる
このブログ記事に対するトラックバックURL: http://hatotech.org/mt-admin/mt-tb.cgi/720

mayaaに近いね(経験あり)。
PHPTAL改造してこういうの作ろうと思ってた。
keyじゃなくて"id"にしたら?HTML内で一意のエレメントを特定できて便利かも。
id探してなかったらkeyを探すとか。
...と、まだソース見てないのに思いついたことを書いてみる。
テンプレート変数の要素名をidではないものにしたのは、
(1) DOM Elementのidはdocumen内においてユニークである。したがって同一テンプレート内で一つの変数を2箇所以上で利用しようとすると矛盾する。
(2) 変数名として () や . などが利用する用途が登場する(予定)ので、これら値を使用した途端に CSS セレクタに影響する。
などが理由です。
ただし例では示していないですが、このテンプレート変数の要素名(現在 key)は自由に変更可能で、もちろんidに変更して利用しても動作します。
mayaaでも同様の問題に困っていましたね<開発者の方が。
mayaaでは、'_'を使うとかnameも併用するとかしてたkなあ。
参考までに。
Mayaa では namespace を使う方法を推奨しています。m:id のような形になります。テンプレートに namespace 宣言が必要などの手間がやや増えますけど、仕様的にきれいなのはこの形だと思います。(使いやすさは別な軸)
ちなみに Mayaa も設定で独自属性を使うことができます。
まあ Dreamweaver が namespace に対応していないので、独自属性と同じく警告がでるのですけどね。
'-' や name の併用は Teeda ですね。('_' ではありません)