WordPressのプラグイン開発でビューとロジックを分離するためにテンプレートエンジンを使いたくなった。
PHPのテンプレートエンジンでは、Smartyが有名だが、WordPressのプラグインに同梱するにはあまりにも高機能すぎるしファイル数も多い。
そこで、できれば1ファイルで構成されていて、シンプルで簡単なテンプレートエンジンはないものかと探してみたら、bTemplateというのがあった。
このbTemplateは、わずか289行のPHPで書かれたテンプレートエンジンで、思わず未完成のものではないかと心配してしまうぐらいシンプルなソースで記述されているが、ほぼ期待通りの動作を確認できた。
実装は、なんとなくPerlのHTML::Templateと似ている。
ちなみに、本家で配布しているファイルは、最終行に余分な改行が含まれており、そのままでは空白が出力されてしまうので使用する前に削除しておく必要がある。
主な機能
- 変数の割り当て
- ループ
- 条件分岐(ifまたはelseのみ)
Smartyなどのような高機能なテンプレートエンジンとは違い、キャッシュ機能は実装されていないが、そのためにパーミッションの設定などに煩わされることがない。
やや残念なのが、条件分岐が変数のtrueまたはfalseによるifまたはelseしか実装されていない点であるが、これはロジック側で頑張れば良いことなので問題なさそう。
サンプル
単純なテンプレート
<html>
<head>
<title><tag:title /></title>
</head>
<body>
<p>Hello, <tag:name /></p>
</body>
</html>
上記テンプレート用のロジック(PHP)
<?php
$title = 'My Simple Template Example';
$name = 'L.E. Modesitt, Jr.';
include_once('bTemplate.php');
$tpl = new bTemplate();
$tpl->set('title', $title);
$tpl->set('name', $name);
echo $tpl->fetch('simple.tpl');
?>
シンプルなループ
<ul>
<loop:names>
<li><tag:names[] /></li>
</loop:names>
</ul>
上記テンプレート用のロジック(PHP)
<?php
$names = array('Tom', 'Dick, 'Harry');
include_once('bTemplate.php');
$tpl = new bTemplate();
$tpl->set('names', $names);
echo $tpl->fetch('loop.tpl');
?>
SQLで得た結果をテーブルに出力
<table border="1">
<tr>
<td><b>id</b></td>
<td><b>last_name</b></td>
<td><b>first_name</b></td>
<td><b>phone_number</b></td>
</tr>
<loop:users>
<tr>
<td><tag:users[].id /></td>
<td><tag:users[].last_name /></td>
<td><tag:users[].first_name /></td>
<td><tag:users[].phone_number /></td>
</tr>
</loop:users>
</table>
PHP側
<?php
// Assuming you've already connected to the database
$result = mysql_query('SELECT * FROM users');
// This loop populates an array with the data from the query
while($row = mysql_fetch_assoc($result)) {
$users[] = $row;
}
include_once('bTemplate.php');
$tpl = new bTemplate();
$title = 'Database Results';
$tpl->set('title', $title);
// Now we set the array we populated
$tpl->set('users', $users);
// And here we fetch the users.tpl file and set it to content
$tpl->set('content', $tpl->fetch('users.tpl'));
echo $tpl->fetch('master.tpl');
?>
ちなみに、テンプレートのHTMLをファイルからではなく、変数から取得したい場合は、以下のようにすればいい。
echo $tpl->parse($content);