PHPテンプレートエンジンを1行で自作する


概ねPHPで何か作るときはテンプレートエンジンSmartyにお世話になってます。
で下記の記事がありまして、クラスを使ってテンプレートエンジンを作るという事ができるのですね。基本phpのinclude文が極めて強力でこれを使えばテンプレート自体は取り込めますがスコープを付けたいですねという内容です。
PHPテンプレートエンジンを10行で自作する
PHP最小のテンプレートエンジン

ここではincludeをクラスから呼び出しています。include最強。スコープがあると内容を壊されたりしないので便利です。でももっと簡単にできるでしょうということで、焼き直してはありますがこれを1行で実行してみます。
まずテンプレート側のソースsample.htmlを書きます。PHPの部分は普通にPHPの全ての書式が使えます。require等でも書けますがエラーがあるとそこで止まってしまうのでincludeの方が良さげです。
テンプレート:sample.php


<html>
<meta charset="utf-8">
<h1>店名:<?php echo name; ?></h1>
<hr>
メニュー
<ul>
<?php for($i=0; $i<?php echo $foods[$i]; ?></li>
<?php } ?>
</ul>
</html>

これを呼び出すには関数を使います。
メイン:sample.php


function display($name,$foods){include('sample.html');};
$name  = '蓬莱';
$foods = array('大盛り炒飯', '餃子', 'ラーメン', '大盛り中華丼');
display($name,$foods);

これだけです。

関数にするとヘッダやテーブルなんかも自動的に作れます。
テンプレート:table.html


<table class="table">
<thead>
  <tr>
    <?php for($i=0; $i<count($tabledata[0]); $i++){ ?>
    <th><?php echo $tabledata[0][$i]; ?></th>
    <?php } ?>
  </tr>
</thead>
<tbody>
  <?php for($i=1; $i

メイン:menu.php


function header(){include('header.html');};
function table($tabledata){include('table.html');};
function footer(){include('footer.html');};
$menu = array(array('店名','ラーメン', '餃子', '焼き飯', '麻婆豆腐'),array('蓬莱','100円','200円','300円','400円'),array('ほていや','50円','60円','70円','80円'));

header();
table($menu);
footer();

headerやfooterは記載してませんがbootstrapを想定してます。このような関数群をまとめておけば色々使えるのではないでしょうか。
さらにテンプレートをスクリプト風に呼び出す事も可能です。
テンプレート:sample.html


<?php
   $data  = "\n";
   $data .= "\n";
   $data .= "\n";
   $data .= "{$name}\n";
   $data .= "\n";
   $data .= "\n";

メイン:main.php


function parts($name)
{
    include('sample.html');
    return $data;
}
$cmd = 'return parts("名前");';
echo eval($cmd);

テキスト中から特定のコマンドを切り出して置換すればWikiのようにもできるし、保存もできます。
要するにPHPのincludeはとても強力だということですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です