hideologie @ ウィキ
tinybutstrong
最終更新:
hideologie
-
view
日本語の情報が少ないお蔭で、tinybutstrongでgoogleと、
このページが一番上に出てきてしまう。のでもう少し真剣に書いてみる。
このページが一番上に出てきてしまう。のでもう少し真剣に書いてみる。
PHPでテンプレートエンジン
PHPは、HTMLタグの間に書くタイプのスクリプト言語で、そのお手軽さが売りの筈であったが、
中規模以上の開発になってくると、結局色々な点を鑑みて(何より読みにくい)、HTML部とプログラムは分離せざるを得なくなる。
中規模以上の開発になってくると、結局色々な点を鑑みて(何より読みにくい)、HTML部とプログラムは分離せざるを得なくなる。
テンプレートエンジン一般論
PHPの、に限らず、筆者がテンプレートエンジンで最も重要視しているのは
- 「ループの書きやすさ」、
- そして「CHECKBOX,RADIO,SELECTの書きやすさ」
である。
- 「検索一覧」を出すには大抵TABLEタグでレイアウトする。
- <TR>タグの範囲でループすることになるだろう。
- 「編集画面」で前のパラメタを引き継ぐには、INPUT(CHECKBOX,RADIO)タグのどれかにSELECTEDをつけなければならない。SELECTのOPTIONSに付けるのも地味に面倒である。
結論として、前述の様な点に困ってないのであれば、他のテンプレートエンジンを使った方が良いだろう。Smartyは日本語ドキュメントも豊富だし。
簡単だが強力
TinyButStrong http://www.tinybutstrong.com/ を推したい次第である。
このテンプレートエンジンは、前述2点について、画期的とも思える解決方法を示している。
このテンプレートエンジンは、前述2点について、画期的とも思える解決方法を示している。
PHP変数$customer_idの値に応じて、該当するradioボタンのinputタグにcheckedを付ける場合を考えてみる。
[var.customer_id;selected=id] [cust_radios;block=begin] <input name="id" value="[cust_radios.val]" type="radio"> [cust_radios;block=end]
肝は、
- 「radioのinputタグのココに、この状態の時にcheckedを挿入する」という記述を人間が指定する訳ではなく、
- 「同じvalueのinputタグを探してcheckedを挿入しておいてね」という定義になっているところ
鈎括弧による記述は独特ながら、全体的な見通しは悪くないと思うのだが、どうだろうか。
そんなに長い記述ではないので、意味は想像が付くかと思う。
- まず、tinybutstrongの変数展開は、鈎括弧で囲む。
- 各種の属性も、セミコロンで区切って、鈎括弧の中に並べる
- cust_radiosがradioボタンの選択肢で、
- block=begin〜block=endまでがその繰り返し範囲だ。
- 選択肢の内容は、連想配列で与えるので、cust_radios.valとは、連想配列の「値」を使う、の意味だ。同じように cust_radios.key で連想配列のキー値を埋め込む。
- varで始まる変数は、tinybutstrongが自動(というより暗黙的に)展開する。
- customer_idなるグローバル変数の値を勝手に使う訳だが
- selected=idの指定があるので、同名のinputタグを探して、checkedを付けてくれる。
- customer_idなるグローバル変数の値を勝手に使う訳だが
tinybutstrongは、「データをHTMLにマージする」という考え方で、
特定のメソッドを呼ぶ度に、内部で保持している(出力予定の)HTMLを
書換えてしまう。この点は、Smarty等のオーソドックスなテンプレートエンジンと発想がことなるところだ。
特定のメソッドを呼ぶ度に、内部で保持している(出力予定の)HTMLを
書換えてしまう。この点は、Smarty等のオーソドックスなテンプレートエンジンと発想がことなるところだ。
上の場合も、radioボタンの展開と、selected属性の付加は、別の手順で処理する。
まずは、radioボタンの展開
まずは、radioボタンの展開
$array = array( 〜 ); $TBS = new clstinybutstrong
$TBS->mergeblock("cust_radios", $array );
この時点で、$TBSが保持しているHTMLは、radioボタンの展開が終っていて、block=begin/block=endの記述も完全に置き換わっている。始めからその通りのHTMLが静的に書いてあったと同じことになる。
ちなみにこのお蔭で、mergeblockで展開した選択肢と、人間がHTMLに書き込んだ静的な選択肢とは混在して良い。これが地味に助かる時がままある。
例えば、selectの初期optionには「選択してください」と書いておきたいが、これをoptions選択肢展開のデータに入れるのは微妙。
例えば、selectの初期optionには「選択してください」と書いておきたいが、これをoptions選択肢展開のデータに入れるのは微妙。
肝心の$customer_idに応じてcheckedを挿入する処理が残っているが、
これはvarによる暗黙展開を使っているので、そのまま「出力」に進んでも良い。
これはvarによる暗黙展開を使っているので、そのまま「出力」に進んでも良い。
$TBS->show()
メソッド名は、見た通りオーソドックスなものだが、
tinybustrongでは内部でそのままexit()してしまう。
まあ、HTMLの出力は、一般的には最後の最後の筈なので、悪くはないが、
忘れた頃に面食らいそうなところではある。
tinybustrongでは内部でそのままexit()してしまう。
まあ、HTMLの出力は、一般的には最後の最後の筈なので、悪くはないが、
忘れた頃に面食らいそうなところではある。