25行の軽量PHPテンプレートエンジン「Petitmpl」作りました。

必要最低限、でもループにも対応したテンプレートエンジンです。 クラスで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();

?>
Posted in PHP by admin at 1月 23rd, 2010.

Leave a Reply