HTMLTemplateについて
HTMLTemplateとは
Hiroshi Ayukawa氏により作成された、所定の記法で作成されたテンプレートからHTMLを生成するプログラム(テンプレートエンジンと呼びます)です。
テンプレートエンジンを使用すると、処理を行うPHPと表示内容となるhtmlテンプレートのファイルを分けることで、サイトの作成や変更を効率よく行うことが出来ます。
オリジナルは、次のURLからダウンロードできます。
利用ライセンスについては、上記アーカイブ内にありますので、それを御覧ください。
上記のサイトからダウンロードできるhtmltemplate.inc
は、PHP4用のものです。
PHP5以降で実行するには、修正が必要です。
PHP5以降に対応したhtmltemplate.inc
は、次のURLからダウンロードできます。
このサイトで販売しているCMSでも、HTMLTemplate
を使用しています。
使用方法
参照方法
htmltemplateは、PHP環境下で動作します。
PHPプログラムから、次のように参照します。
require('htmltemplate.inc');
上記は、PHPプログラムと同じディレクトリに存在する場合で、必要によりディレクトリ指定を追加します。
例:includeの中にある場合:
require('include/htmltemplate.inc');
テンプレート処理
動作は、テンプレートファイル(または変数)を読み込んで、その中の決まった記法を規則に従って、HTMLに変換します。
テンプレートファイルを読み込む方法には、いくつかの方法があります。
htmltemplate::t_include("sample.html",$val);
これによりsample.html
ファイルを読み込んで、htmlに変換して出力します。
その際に、入力ファイル内にある変数などの記法で該当するものを$val
変数の内容に置き換えます。
$val
には、連想配列で出力するデータを入れておきます。
変数名は、$val
でなくても構いません。
直接出力せずに、htmlに変換した内容を変数に保存する場合は、次のようにします。
$html = htmltemplate::t_buffer("sample.html",$val); echo $html;
sample.html
ファイルを読み込んで、htmlに変換して$html
変数に保存します。
この例では、その次の行で、表示を行います。
この様な使い方は、htmlの内容を更に修正したい場合や、同じ内容を複数の場所に出力するなどの場合に有効です。
テンプレート用タグ
テンプレートファイルに、専用のタグを使用してデータを出力します。
変数の出力(改行あり)
{val one} {val two/three}
与えられた変数の中の要素名に対応するデータを出力します。対応するものがなければ、何も出力されません。
$val['one'] = 1; $val['tow']['three'] = "test";
この様に変数に値を設定すると、1行目は1
、2行目はtest
と出力されます。
変数の中に改行が含まれている場合、<br>
を出力します。
変数の出力(改行なし)
val
のかわりにrval
とすることで、変数の中に改行が含まれていても改行されません。
{rval one}
変数に改行を含むデータを入れておくと、
$val['one'] = "ここで 改行します。";
次のように出力されます。
ここで 改行します。
rval
の場合は、<br>
が出力されません。(ブラウザの表示では改行されない)
値が存在するか判定
変数の中に、特定の値が定義されているかを判定して、定義している場合だけ、出力を行います。
<!--{def one}--> {val one}が設定されています<br> <!--{/def}-->
この場合、one
が定義されている場合に、<!--{def one}-->
と<!--{/def}-->
の間の部分を出力します。
この間は複数行でも問題ありません。
入れ子にすることも出来ます。
<!--{def one}--> {val one}が設定されています<br> <!--{def two}--> {val two}も設定されています<br> <!--{/def}--> <!--{/def}-->
defでは、変数が空の場合は、定義されていないと判定します。
値が存在 しない か判定
def
の代わりにndef
を使用すると、値が定義されていない場合に出力を行います。
<!--{ndef one}--> 値が設定されていません<br> <!--{/ndef}-->
入れ子にすることも出来ます。
<!--{def one}--> {val one}が設定されています<br> <!--{ndef two}--> twoは設定されていません<br> <!--{/ndef}--> <!--{/def}-->
ndefでは、変数が空の場合は、定義されていないと判定します。
繰り返し
配列の内容を出力する場合に使用します。
<!--{each three}--> {val three}<br> <!--{/each}-->
この様にすると、配列three
の内容を順番に出力できます。
$val["three"][] = "one"; $val["three"][] = "two"; $val["three"][] = "three";
この様に変数に値が入っていると、
one<br> two<br> three<br>
と出力されます。
変数の中を配列にすることも出来ます。
<!--{each three}--> {val three/value}->{val three/text}<br> <!--{/each}-->
変数に次のように設定すると、
$val["three"][0]['value'] = 1 $val["three"][0]['text'] = "one";
この様に出力されます。
1->one<br>
コメント
comment
で囲った範囲は常に出力されません。
<!--{comment}--> this is a comment <!--{/comment}-->
<!--{comment}-->
と<!--{/comment}-->
の間は複数行にすることも出来ます。
その他
限られたタグですが、PHPの出力を工夫することで、いろいろな出力が可能です。
大小判定が必要な場合は、PHP内で大小判定をした結果をデータの有無で出力することなどです。
また、全く新しい機能を持ったタグを追加する機能もあります。
サンプルが、アーカイブに含まれていますので、PHPが記述できる方は、独自のタグを追加できます。
サンプル
テンプレートファイルsample.html
を次のようにします。
<!--{comment}--> this is a comment <!--{/comment}--> {val one}<br> {val two}<br> <!--{each three}--> {val three} <!--{/each}--> <!--{each address}--> ---------------------------------- ZIP:{val address/zip}<br> PREF:{val address/pref}<br> <!--{def address/zip}--> "address/zip" is defined.<br> <!--{/def}--> <!--{/each}--> <!--{def one}--> "one" is defined.<br> <!--{/def}--> <!--{def five}--> "five" is defined. !?<br> <!--{/def}--> <!--{def address}--> "address" is defined.<br> <!--{/def}--> <!--{def address/zip}--> OUT OF 'EACH'!! "address/zip" is defined.<br> <!--{/def}--> <!--{vdef address/zip}--> OUT OF 'EACH'!! "address/zip" is defined.<br> <!--{/vdef}--> VAL:<br> {val nl2brtest}<br><br> RVAL:<br> {rval nl2brtest}
PHPファイルの内容を次のようにします。
<?php $val=array( "one"=>"firstvalue", "two"=>"secondvalue", "three"=>array( "child_a", "child_b", "child_c", ), "address"=>array( array( "zip"=>"1112222", "pref"=>"Tokyo" ), array( "zip"=>"333666", "pref"=>"Osaka" ) ), "nl2brtest"=>"aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccccccc" ); require("htmltemplate.inc"); htmltemplate::t_include("sample.html",$val);
サーバーにファイルをアップロードして、PHPファイルをブラウザで開くと、結果は次のように出力されます。
firstvalue secondvalue child_a child_b child_c ---------------------------------- ZIP:1 PREF:Tokyo "address/zip" is defined. ---------------------------------- ZIP:3 PREF:Osaka "address/zip" is defined. "one" is defined. "address" is defined. VAL: aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccccccc RVAL: aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccccccc
応用例
htmltemplateには、基本的な限られたタグしか存在しませんが、PHPで出力を工夫することで、色々な使い方が可能です。
checkbox
radio
の出力
チェックボックスやラジオボタンの選択を行う。 フォームなどで、デフォルトや前回の入力状態にするために使います。
PHPでの処理です。
if (is_array($_REQUEST["check"])) { foreach ($_REQUEST["check"] as $v) { $form["check_" . $v] = "checked"; } } if ($_REQUEST["radio"]) { $form["radio_" . $_REQUEST["radio"]] = "checked"; } $val["form"] = $form;
テンプレートでは次の様にします。
<input type="checkbox" name="check[]" value="1" {val form/check_1}>1の場合<br> <input type="checkbox" name="check[]" value="2" {val form/check_2}>2の場合<br> <input type="checkbox" name="check[]" value="3" {val form/check_3}>3の場合<br> <input type="radio" name="radio" value="1" {val form/radio_1}>1の場合<br> <input type="radio" name="radio" value="2" {val form/radio_2}>2の場合<br> <input type="radio" name="radio" value="3" {val form/radio_3}>3の場合<br>
選択select
の出力
選択タグselect
でのデフォルトやフォーム入力を反映するものです。
PHPでの処理です。
if ($_REQUEST["select"]) { $form["select_" . $_REQUEST["select"]] = "selected"; } $val["form"] = $form;
テンプレートでは次の様にします。
<select name="select"> <option value="">選択してください</option> <option value="1" {val form/select_1}>1の場合</option> <option value="2" {val form/select_2}>2の場合</option> <option value="3" {val form/select_3}>3の場合</option> </select>
画像の出力
画像が登録されている場合画像を表示して、登録されていない場合にNO IMAGE
画像を出力するサンプルです。
<!--{def image1_file}--> <img src="user_data/{val image1_file}" alt="{val title1}"> <!--{/def}--> <!--{ndef image1_file}--> <img src="images/noimg.png" alt="{val title1}"> <!--{/ndef}-->
この例では、user_data
の中にimage1_file
があると想定しています。
image1_file
に画像ファイル名が入っている場合それを表示し、なければ、images/noimg.png
を表示します。
テーブル(表)の出力
テーブル用のデータを用意します。
$table["title"] = array("見出し", "内容"); $table["data"][0] = array("col1" => "color", "col2" => "red"); $table["data"][1] = array("col1" => "price", "col2" => "1,234"); $val["table"] = $table;
テンプレートでは、次のように記述します。
<table> <tr> <!--{each table/title}--> <th>{val table/title}</th> <!--{/each}--> </tr> <!--{each table/data}--> <tr> <td>{val table/data/col1}</td> <td>{val table/data/col2}</td> </tr> <!--{/each}--> </table>
結果は次のようになります。
見出し | 内容 |
---|---|
color | red |
price | 1,234 |
