be10 : テンプレートエンジン

created: 2006-02-19 | modified: 2008-03-23

機能と特徴

  • 開始タグと終了タグを置き換えるだけの、とてもシンプルなテンプレートエンジンです。ある程度コードが書ける方なら、このくらいシンプルなものが良いかも。
  • テンプレートでの開始タグは、"{%" または "<!--{%" 、終了タグは、"%}" または "%}-->" です。
  • なにせ開始タグと終了タグしか置き換えないので、これに挟まれた部分は完全なPHPコードである必要があります。
  • 何のメリットがあるかというと、ブラウザでPHPのコードを見てもPHPタグは無視され中身をうかがい知ることができませんのが、それが見えるので画面デザインが少しやりやすくなります。
  • パースされたテンプレートはキャッシュされます。同じテンプレートファイルが呼ばれた際は、パースが行われない分早く動作します。
  • デバッグ用メソッド beTemplate::debugInfo() で、各パラメータやパースされたコードが確認できます。
  • OOP をちょこっと使っています。
  • be10 は、PHPファイルそのものをテンプレートとするテンプレートエンジン beTemplate(自作)を継承し、parse メソッドに開始タグと終了タグの置き換え処理をコーティングして生まれたテンプレートエンジンです。 親クラス beTemplate は、『テンプレートのパース』以外の、処理や入出力メソッドを備えた、テンプレートエンジンのベースクラスとしての役割を持っています。

ダウンロード

  • 以前のバージョンは archives にあります。

設置環境

  • モジュール版PHP(4.3.0 ~ )が動作するウェブサーバー(PHP5は試してません)

設置手順

1.ファイル構成

解凍後作成されるファイルは以下の通り。改行コードは CR + LF です。

  • beTemplate.inc.php - ベースのテンプレートエンジン
  • be10.inc.php - Be10テンプレートエンジン

2.アップロードと cacheディレクトリの属性設定

2つのファイルを任意の同じディレクトリにアップロードします。be10 はライブラリですので、include_path の通ったところに置いておくと使い勝手が良いと思います。

例) include/ 以下にファイルを設置する場合

  • include
    • beTemplate.inc.php
    • be10.inc.php
    • cache : 属性を 706 や 707 に設定

be10 はコンパイル済みのキャッシュファイルを一時的に保存しておく作業用ディレクトリを必要とします。作業用ディレクトリは実行時に設定できますので、ディレクトリの場所や名前は任意ですが、あらかじめウェブサーバの権限で書き込めるよう属性を設定しておく必要があります。

実行時に作業用ディレクトリが指定されなかった場合、beTemplate.inc.php と同じ階層の cache という名のディレクトリを作業用ディレクトリとして使いますので一応用意しておくと良いと思います。


be10の簡単な使い方

必要なのは、テンプレートファイルと実行コードを書いたスクリプトファイルです。

/home/yourname/template/testpage.html (テンプレートファイル)

<html>
<head>
  <title>{% echo $title; %}</title>
</head>
<body>
<h1>{% echo $title; %}</h1>
<hr>
<p>
    {% echo $comment; %}
</p>
<hr>
<p>
    只今の時刻:{% echo date('Y-m-d H:i:s', $time); %}<br>
<--{% $hour = date('H', $time);
    if (0 < $hour && $hour < 4): %}-->
    もう寝たらどう?
<--{% endif; %}-->
</p>
</body>
</html>

/home/yourname/htdocs/test.php (実行ファイルの例)

<?php
// be10 のファイルをインクルード
require_once '/home/yourname/include/be10.inc.php';

// インスタンス生成
$be10 = new be10();

// エラーメッセージを獲得する場合は True にする
// デフォルトは False
// $be10->setDebugMode(true);

// 毎回パースし直す場合は False にする
// デフォルトは True
// $be10->setCacheMode(false);

// キャッシュディレクトリ指定(あらかじめ用意しておく)
$be10->setCacheDir('/home/yourname/temp/');

// テンプレートディレクトリ指定
$be10->setTemplateDir('/home/yourname/template/');

// テンプレートファイル指定
$be10->setTemplateFile('testpage.html');

// ↓このようにフルパス指定もOK
// $be10->setTemplateFile('/home/yourname/template/testpage.html');

// テンプレートに関連付けるパラメータをセット
// 以下の場合は、$title, $comment, $date として
// テンプレートファイルで参照可能になる
$be10->setParam('title', 'シンプルテンプレートエンジン - Be10');
$be10->setParam('comment', 'PHPの開始タグと終了タグを置き換えるだけ');
$be10->setParam('time', time());

// 表示
$be10->execute();

// 表示せず後々利用するなら
// $view = $be10->getContents();
// echo $view;

// エラーメッセージやパラメータの値を確認したい時は
// $be10->debugInfo();
?>

test.php を実行するとこんなHTMLが出力されます。

<html>
<head>
  <title>シンプルテンプレートエンジン - Be10</title>
</head>
<body>
<h1>シンプルテンプレートエンジン - Be10</h1>
<hr>
<p>
    PHPの開始タグと終了タグを置き換えるだけ
</p>
<hr>
<p>
    只今の時刻:2006-02-20 01:35:12<br>
    もう寝たらどう?
</p>
</body>
</html>


クラス相関図

親クラスの beTemplate に、プロパティと基本機能、インターフェースとなるメソッドを持たせ、核となる parse メソッドを子クラスの be10 が受け持つという関係です。

+------------------------+
|       beTemplate       |
+------------------------+
| - debugMode            |
| - cacheMode            |
| - errorMessages        |
| - cacheDir             |
| - templateDir          |
| - templateFile         |
| - params               |
| + _loadTemplate()      |
+------------------------+
| + initialize()         |
| + parse()              |
+------------------------+
| + setDebugMode()       |
| + setCacheMode()       |
| + debugInfo()          |
| + beTemplate()         |
| + setDebugMode()       |
| + debugInfo()          |
| + execute()            |
| + getContents()        |
| + setCacheDir()        |
| + setTemplateDir()     |
| + setTemplateFile()    |
| + setParam()           |
| + setParamRef()        |
| + setParamAll()        |
| + setParamAllRef()     |
| + addParam()           |
| + addParamAll()        |
| + hasParam()           |
| + getParam()           |
| + getParamRef()        |
| + getParamAll()        |
| + getParamAllRef()     |
| + removeParam()        |
| + removeParamAll()     |
+------------------------+
            △
            |
            |
+------------------------+
|          be10          |
+------------------------+
|                        |
+------------------------+
| + parse()              |
+------------------------+
|                        |
+------------------------+


class beTemplate : テンプレートエンジンベースクラス

コンパイルしたテンプレートのキャッシュ機能、キャッシュディレクトリやテンプレートファイルの設定メソッド、パラメータの入出力メソッド、デバッグメソッドを備えたテンプレートエンジンのベースクラスです。

Private propeaty
bool beTemplate::debugMode
デバッグモード。True = エラーメッセージを捕捉する、False = エラーメッセージを捕捉しない(デフォルト)。
bool beTemplate::cacheMode
キャッシュモード。True = テンプレートファイルが更新された場合のみパースを実行する(デフォルト)、False = 毎回パースを実行する。
このプロパティは、ver.1.2 で追加しました。
array beTemplate::errorMessages
beTemplate 内部で捕捉したエラーメッセージを格納。
string beTemplate::cacheDir
パースされたテンプレートが保存されるディレクトリ名。
string beTemplate::templateDir
テンプレートファイルのあるディレクトリ名。
string beTemplate::templateFile
テンプレートファイル名。
array beTemplate::params
パラメータを格納する添え字配列。
Private Method
string beTemplate::_loadTemplate ( void )
beTemplate::execute (または、beTemplate::getContents)から呼び出され、テンプレートファイルの読み込み、パース実行、キャッシュ保存などの処理を一括して行います。戻り値はキャッシュされたファイル名です。 内部で使われるメソッドですので普通意識する必要はありません。
Protected Method
void beTemplate::initialize ( void )
beTemplate::beTemplate() によって呼び出される初期化用のメソッドです。beTemplate では何も行っていません。このクラスを継承した子クラスはコンストラクタを持たないことを前提にしてありますので、初期化が必要な場合にこのメソッドを上書きし、コンストラクタの代用とします。
string beTemplate::parse ( string $text )
テンプレートを、実行可能なPHPコードに変換する役割を持つ、テンプレートエンジンの核となるメソッドです。execute メソッド(または getContents メソッド)から呼ばれます。$text には、テンプレートファイルの中身が渡されます。beTemplate::parse() は、PHPがそのままテンプレートとなるよう $text をそのまま返しています。
継承した子クラスでこのメソッドを上書きし様々な手法を盛り込むことができます。上書きする場合は、読み込まれたテンプレートファイルの内容が $text として渡されますので、これに任意の加工を施し、実行可能なPHPコードを返すようコーティングします。
Constructer
void beTemplate::beTemplate ( void )
各プロパティの初期化後、beTemplate::initialize() の呼び出しを行っています。プロパティの初期化が必ず行われるよう、beTemplate を継承するクラスではコンストラクタの代わりに initialize() メソッドを上書きして代用します。
Public Method
void beTemplate::setDebugMode ( bool $mode )
beTemplate が出すエラーメッセージを、捕捉する場合は True を、捕捉しない場合は False を指定します。True の場合、若干処理速度が落ちますので、デバッグ以外の時は False にすることをおすすめします。デフォルトは False です。
テンプレートで PHP が出す Fortal Error や Parser Error は別ですが、$mode の設定にかかわらず beTemplate はエラーがあっても実行を続けます。
捕捉されたエラーメッセージを確認するには、beTemplate::debugInfo() を実行してください。
void beTemplate::setCacheMode ( bool $mode )
キャッシュの動作を設定します。デフォルトでは、True になっており、テンプレートファイルが更新された場合のみパースが実行されキャッシュを更新します。False に設定すると、テンプレートファイルの更新にかかわらず毎回パースが実行され、キャッシュも更新されます。 このメソッドは、ver.1.2 で追加しました。
void beTemplate::debugInfo ( void )
beTemplate::setDebugMode(True) によって捕捉されたエラーメッセージや、各プロパティーの値、テンプレートの内容、パースされた実行コードを表示します。
エラーメッセージを表示させたい場合は、あらかじめ beTemplate::setDebugMode(True) を指定しておく必要があります。
void beTemplate::execute ( void )
パース済のテンプレートにパラメータを関連付け実行し出力します。
string beTemplate::getContents ( void )
beTemplate::execute と同様パース済のテンプレートにパラメータを関連付け実行しますが、出力は行わず結果文字列を返します。
bool beTemplate::setCacheDir ( string $dirname )
キャッシュ用ディレクトリを指定します。成功時は True 、失敗時は False を返します。相対ディレクトリは指定できません。
bool beTemplate::setTemplateDir ( string $dirname )
テンプレートファイルのディレクトリを指定します。成功時は True 、失敗時は False を返します。相対ディレクトリは指定できません。
bool beTemplate::setTemplateFile ( string $filename )
テンプレートファイルを指定します。成功時は True 、失敗時は False を返します。
beTemplate::setTemplateDir() と beTemplate::setTemplateFile() を組み合わせてテンプレートファイルを指定する方法の他、"/home/user/template/template.php" のようにフルパスで指定することも可能です。もしすでに beTemplate::setTemplateDir() でディレクトリが指定されていた場合は、$filename に含まれるディレクトリ文字列でディレクトリの設定が上書きされます。
void beTemplate::setParam ( string $name, mix $param )
テンプレートに関連付けるパラメータ($param)とその名前($name)を設定します。$param は、PHPで用いることができる全ての型が使用可能です。
beTemplate::setParam('MyName', $param) とした場合、テンプレートファイルでは、$param の値を、$MyName で参照できます。大文字小文字は区別されます。
void beTemplate::setParamRef ( string $name, ref &$param )
$param にリファレンスを指定する部分が異なるだけで、beTemplate::setParam() と同じです。
void beTemplate::setParamAll ( array $params )
テンプレートに関連付けるパラメータを一括して指定します。$params は、'name' => 'param' のような、添え字配列の集合でなければなりません。
void beTemplate::setParamAllRef ( ref &$params )
$params にリファレンスを指定する部分が異なるだけで、beTemplate::setParamAll() と同じです。
void beTemplate::addParam ( string $name, array $params )
$name で指定するパラメータに $params を追加します。
void beTemplate::addParamAll ( array $params )
パラメータに $params を追加します。beTemplate::setParamAll() 同様、$params は、'name' => 'param' のような、添え字配列の集合でなければなりません。
bool beTemplate::hasParam ( string $name )
$name に一致するパラメータがあれば True を、無ければ False を返します。
mix beTemplate::getParam ( string $name )
$name に一致するパラメータを返します。無ければ何も返しません。
ref beTemplate::getParamRef ( string $name )
$name に一致するパラメータのリファレンスを返します。無ければ何も返しません。
array beTemplate::getParamAll ( void )
設定されている全てのパラメータを返します。戻り値は、'name' => 'param' のような添え字配列の集合です。パラメータに何も設定されていなければ、空の配列を返します。
beTemplate::getParamAllRef ( void )
設定されている全てのパラメータのリファレンスを返します。
void beTemplate::removeParam ( string $name )
$name で指定したパラメータを破棄します。
void beTemplate::removeParamAll ( void )
全てのパラメータを破棄します。

class be10 extends beTemplate

テンプレートタグに、開始タグ "{%" と "<!--{%" 、終了タグ "%}" と "%}-->" が使えるテンプレートエンジンとして動作します。

Protected Method
string be10::parse ( string $text )
テンプレートを実行可能なPHPコードに変換するための処理を行います。具体的には、テンプレートの開始タグ "{%" と "<!--{%" 、終了タグ "%}" と "%}-->" を PHP のタグ "<?php" と "?>" に置き換える処理をしています。
このように、新たなテンプレートエンジンを作る際プログラマは、『テンプレートを実行可能なPHPコードに変換する仕組み』を考え、parse メソッドにコーティングするだけで良いわけです。OOPではこうしたコードの再利用がしやすいです。

更新履歴

  • 2006-04-12 : ver.1.2
    • テンプレートファイルの更新にかかわらずキャッシュを更新するための beTemplate::setCacheMode メソッドを追加
    • 旧バージョンからアップデートする場合は、beTemplate.inc.php を差し替えるだけでOK。
  • 2006-02-19 : ver.1.1
    • 公開

TODO

beTemplate と Be10 は元々 OOP の勉強用に書き始めました。いろいろいじり倒していたら今の形に落ち着いたので公開してみました。このため今後の進展は特に考えてません。



ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録

Yahoo Search