PHP のテンプレートエンジンといえば smarty が有名なんだと思いますが、最近はあんまり見なくなったような気がします。
昨今の PHP なら標準関数でそれっぽいことが出来るっていうのが大きいんだと思います。
というわけで、PHPの標準機能でこさえたテンプレートエンジンクラスが以下です。
- テンプレート"ファイル"だけではなく、"文字列"をテンプレートエンジンに食わせたいこともあるだろうと思い、一応用意しています。
- エスケープ機能も(中途半端かもですが)一応入れてあります。
***クラス定義 [#m4f08a1d]
#prettify{{
<?php
class Render
{
// ファイル名を指定してレンダリングします
public static function File($templateFile,$params,$escape=false)
{
if( $escape ){
// エスケープ処理。中途半端なので適宜調整のこと。
$funcEscape = function( $funcEscape, $val )
{
if( is_string($val) ){
$val = htmlentities($val,ENT_QUOTES);
}elseif( is_array($val) ){
foreach( $val as $key => &$v ){
$v = $funcEscape($funcEscape,$v);
}
}
return $val;
};
$params = $funcEscape( $funcEscape, $params );
}
ob_start();
extract($params);
include $templateFile;
$result = ob_get_contents();
ob_end_clean();
return $result;
}
// 文字列を渡してレンダリングします
public static function String($string,$params,$escape=false)
{
$filepath = tmpfile();
fwrite($filepath,$string);
$metaData = stream_get_meta_data($filepath);
$result = self::File($metaData['uri'],$params,$escape);
return $result;
}
}
}}
***サンプルコード [#b99b9511]
#prettify{{
// サンプルコード
$template = <<< EOD
<table border="1">
<?php foreach(\$data as \$key => \$val ){ ?>
<tr>
<td>
<?php echo \$key; ?>
</td>
<td>
<?php echo \$val; ?>
</td>
</tr>
<?php } ?>
</table>
のゲッツー!
EOD;
$params['data'] = [ 4=>'遊<br>撃<br>手', 6=>'二<br>塁<br>手', 3=>'一<br>塁<br>手'];
echo Render::String( $template, $params, false );
echo Render::String( $template, $params, true );
}}
- (↑こういうときに PHP のヒアドキュメントは色分けが正しくされなくて見にくくなってしまいますがご了承下さい)
- 技術系備忘録/PHP/準備不要のテンプレートエンジン のバックアップソース(No. All)