必要最低限、でもループにも対応したテンプレートエンジンです。 クラスで25行程度で、正規表現は極力控え、可能な限りstrtr()とstr_replace()で書き換えしてます。
必要なのは、 Petitmpl本体(PHP、25行のクラスなので、改造してソースに入れてもOK)、 テンプレート(HTMLなど)、 設定ファイル(PHP)、 です。
クラスにHTML等のテンプレートファイルと、置換前と置換後の文字を連想配列形式で渡して使います。
ループはさらにその連想配列を配列に入れて渡します。詳しくはサンプル見てください。
今日3時間ぐらいで作って、今日公開なので、いろいろ問題ありそうです。
実行例
テンプレ(HTML) → 適応後
サンプルセットをダウンロード
◆本体(petitempl.php)
<?php
class petitmpl{
private $tpl_data;
function tpl_load($tpl_path){
$this->tpl_data=file_get_contents($tpl_path);
}
function repl($words=array()){
$tpld = strtr($this->tpl_data,$words);
$this->tpl_data =$tpld;
}
function repl_arr($id='',$roop=array()){
$tpld = $this->tpl_data;
$reg='/<!\-\-START\['.$id.'\]-\-\>(.*?)<!\-\-END\['.$id.'\]-\-\>/s';
preg_match_all($reg,$tpld,$repd);
$roopdata='';
foreach($roop as $item){
$roopdata.=strtr($repd[1][0],$item);
}
$this->tpl_data =str_replace($repd[0],$roopdata,$tpld);
}
function publish(){
return $this->tpl_data;
}
}
?>
◆テンプレートファイル(
tmpl.html)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>タイトル</title>
</head>
<body style="width: 800px;margin:auto;">
<h1>見出し1</h1>
<p>文書の内容1</p>
<p>文書の内容2</p>
<p>文書の内容3</p>
<h2>見出し2</h2>
<ul>
<!--START[rep1]-->
<li class="id" style="margin-bottom:10px;"><a href="linkurl">リスト</a></li>
<!--END[rep1]-->
</ul>
<h3>見出し3</h3>
<ol>
<!--START[rep2]-->
<li style="margin-bottom:10px;"><strong>記号</strong> 内容</li>
<!--END[rep2]-->
</ol>
<p style="text-align:right;">フッター</p>
</body>
</html>
◆設定例ファイル(sample.php)
テキストはデータベースから読み込んだもの等を使うので、こんな文字だらけにはならないはずです。
<?php
//classのファイル読み込みます
require_once('petitmpl.php');
//インスタンス作ります
$tple=new petitmpl();
//テンプレートファイルのパスを指定して読み込みます
$tple->tpl_load('tmpl.html');
/*「置換前=>置換後」の形式でテンプレにあわせて書いていきます。
一度置換されたワードはもう変換されないので順番は逆になっても大丈夫。
例えば「あああ」=>「いいい」を書いたあと、「いいい」=>「ううう」を書いても「いいい」のまんま
*/
$words=Array(
'タイトル'=>'テンプレートエンジン「Petitmpl」テスト',
'見出し1'=>'テンプレートエンジン「Petitmpl」とは',
'文書の内容1'=>'拡張を前提とした必要最低限なテンプレートエンジンです。25行程度のクラスですが、ループにも対応してます。',
'文書の内容2'=>'テンプレートは自然なhtmlのままデザインできます。ブラウザでそのまま確認できます。ループもHTMLのコメントを利用しており、置換後にコメントは消えます。',
'文書の内容3'=>'独自のテンプレートタグも特に決めてないので、必要に応じて決めてください。置換の正規表現はループで必要な箇所だけにして、他はstrtrを利用しています。速いかも。',
'見出し2'=>'ループの使用例',
'見出し3'=>'その他',
'フッター'=>'作成:ろっく 2010/01/22 <a href="http://petitec.17sai.jp/">http://petitec.17sai.jp/</a>',
);
$list=Array(
Array('linkurl'=>'#id1','リスト'=>'置換ワードは連想配列で渡します。リストの場合は、それらをさらに配列に入れます。','class="id"'=>'id="id1"'),
Array('linkurl'=>'#id2','リスト'=>'うまく説明できないのでサンプルとテンプレのソースを見てください。','class="id"'=>'id="id2"'),
Array('linkurl'=>'#id3','リスト'=>'それぞれのアイテムごとに、複数の置換も可能です。','class="id"'=>'id="id3"'),
Array('linkurl'=>'#id4','リスト'=>'このサンプルではリンク先のURLと、このテキスト,あとliのidを指定しています。','class="id"'=>'id="id4"'),
Array('linkurl'=>'#id5','リスト'=>'ループ回数の制限もできません。設定した配列の数だけ出ます。制限するときは配列自体を調整してください。','class="id"'=>'id="id5"'),
);
$vartext='これは変数に入れたテキストです';
$list2=Array(
Array('記号'=>'●','内容'=>'もちろん変数も指定できます。'),
Array('記号'=>'★','内容'=>$vartext),
Array('記号'=>'〓','内容'=>'エラー処理はしてないので、状況に応じてなんとかしてください。'),
Array('記号'=>'◆','内容'=>'常に動的な出力を考えたため、キャッシュも、ファイル書き出し機能も付いてません。<br />キャッシュはPEARのCache_Lite、書き出しはパス指定してfile_put_contents使えばすぐ出来そうです。'),
Array('記号'=>'◎','内容'=>'クラスを使い始めてまだ2日目で作ったものなので、改善点があれば教えてください'),
Array('記号'=>'△','内容'=>'GPLライセンスで自由に使って、改造して、公開して、配布してください。'),
);
$tple->repl($words);
//通常の単語は1個の配列にまとめられます
$tple->repl_arr('rep1',$list);
//ループは個数分設定が必要です。<!--START[●●]-->繰り返す内容<!--END[●●]-->の●●を第一引数に、置換するリストを第2引数に指定します。
$tple->repl_arr('rep2',$list2);
//終わったら↓すると変換された内容が帰ってくるので、echoするなり、ファイルに書きだすなりしてください
echo $tple->publish();
?>