Hiroshi Ayukawa氏により作成された、所定の記法で作成されたテンプレートからHTMLを生成するプログラム(テンプレートエンジンと呼びます)です。
テンプレートエンジンを使用することで、処理を行うPHPと表示内容となるhtmlテンプレートのファイルを分けることで、サイトの作成や変更を効率よく行うことが出来ます。
オリジナルは、次のURLからダウンロードできます。
利用ライセンスについては、上記アーカイブ内にありますので、それを御覧ください。
上記のサイトからダウンロードできるhtmltemplate.inc
は、PHP4用のものです。
PHP5以降で実行するには、修正が必要です。
PHP5以降に対応したhtmltemplate.inc
は、次のURLからダウンロードできます。
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 |