PHP DOMパーサを使ってテンプレートエンジンを作ってみる2
前回のエントリの続きです。
前回からの進展としては、時間切れで出来なかった関数実行、指定する DOM Element の要素書き換えや、繰り返し処理の実装。そしてここまで来るとコードがさらにゴチャゴチャとしてくるので、若干のリファクタリング作業をば。
繰り返し処理は PHP の foreach ~ as みたいなのができるように、例えば次のようにテンプレート側で foreach , as 要素を準備しといて、
<table>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
<tr foreach="persons" as="person">
<td key="person.id"></td>
<td key="person.name"></td>
<td key="person.email.pc"></td>
</tr>
</table>
persons 変数に配列を assign すれば、こんな感じに置換される。
<table>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
<tr >
<td key="person.id">1</td>
<td key="person.name">foo</td>
<td key="person.email.pc">foo@example.com</td>
</tr><tr >
<td key="person.id">2</td>
<td key="person.name">bar</td>
<td key="person.email.pc">bar@example.com</td>
</tr>
</table>
一方、DOM Element の要素書き換えはテンプレート側の準備一切なしで PHP 側から Element指定+内容適応。なお Element の指定方法はひとまず DOM パーサ仕様で。jquery like なものなのでスムーズに使えそう。
<?php $template = new Template(); $element = new stdClass(); $element->class = 'example'; $element->aaa = 'AAA'; /* id="foo" の Elememt に class="example", aaa="AAA" を追加 */$template->setElement('#foo', $element);$template->setAttribute('#foo', $element); /* メソッド名変更予定 */ $template->renderer('Example'); ?>
なお現在の仕様はこちら。
テンプレート変数割り当て - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される - 連想配列を割り当てると、配列キーがテンプレート変数として利用される - テンプレート変数として配列が利用できる - テンプレート変数としてオブジェクトが利用できる - テンプレート変数は配列とオブジェクトが混合で利用できる - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる - テンプレート変数に対して関数が利用できる - タグ内のテンプレート変数の要素名が変更できる - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える - 値がassignされていないテンプレート変数は無視される エレメント操作 - セレクタによる指定ノードのエレメントが追加、変更できる - セレクタによる複数対象のエレメントが追加、変更できる - エレメントの各要素のうち、今のところタグ名は変えれない 繰り返し処理 - phpのforeach_as_valueのような処理ができる - phpのforeach_as_key_valueのような処理ができる - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ れる - 繰り返し対象の展開変数がオブジェクトや配列も利用できる - 繰り返し処理はネストできる 20 examples, 0 failures
実は前回の仕様ではテンプレートはキャッシュするようになってたんですが、その機構はひとまずカットしました。毎度テンプレートを DOM パースする必要はないなと思って準備してたんですが、PHPコード側から動的に値が適応される「Element 書き換え」を行う場合は結局毎回パースしなおさなければならず、その辺非常にややこしい処理になりそうだったので、現時点ではあまり深く考えなくてよいよう機構そのものをなくしました。
まあ Element 書き換えが発生しない場合も当然あるでしょうから、後々キャッシュできる機能とそうでない機能をきちんと分けた上で改めて再考すればいいかな。
あと、ちゃんとカッコイイ名前をつけたほうがよいとのことで、どうしたもんかと思っているわけです。ネタでいくならKumartyだな!
トラックバック(0)
このブログ記事を参照しているブログ一覧: PHP DOMパーサを使ってテンプレートエンジンを作ってみる2
このブログ記事に対するトラックバックURL: http://hatotech.org/mt-admin/mt-tb.cgi/721

エレメント操作の setElement メソッドは、setAttribute という名前に変えます。