HTMLのテンプレートは、共通部分は複数ページで使いまわせるので便利です。
ヘッダやフッタ、メニューなどです。
いまやWebサイト作成ではテンプレート化は必須です。
そのテンプレートの作り方を分かりやすいように説明します。かんたんです。早い人は『あっ、そいうことね』ぐらいで2,3分で終わります。
そもそもテンプレートってなに?
CMSやフレームワークは、Webサイト作成でまず最初に使うことを考えるくらい中核になっています。WordPressやLaravelが有名です。
これらに共通しているのは、HTML文がテンプレート化されていることです。HTMLの共通部分をテンプレートにすることで同じコードを使いまわします。
いちからコードを書くよりも、よく使うコードはテンプレート化して、細かいところを修正するほうが作業は早いです。
そしてテンプレートには、変数や処理の関数が埋め込まれていて、自分用にカスタマイズできるような仕組みが用意されています。
LaravelのBradeはその仕組み用のプログラムです。
ここでは、Bradeの使い方の説明はしません。このようなテンプレートが、PHPプログラムでどのように作られているかを見ていきます。
テンプレートのしくみはバッファリング
PHPにはバッファリング機能があります。echoなどで標準出力した内容だけをメモリ上に保存します。
テンプレートはこのしくみを利用します。
テンプレートのしくみ
- バッファリング開始
- テンプレートファイル読み込み
- バッファリング終了
- バッファリング内容出力
- バッファリングのクリーンアップ
サンプルコードを見てみましょう。
<?php
require_once "load-template.php";
load_template("template.php");
<?php
?>
<div class="<?php echo get_class_type(); ?>">
<ul>
<li>sample 1</li>
<li>sample 2</li>
</ul>
</div>
<?php
function load_template($file){
ob_start();
require $file;
$html = ob_get_contents();
ob_end_clean();
echo $html;
}
サンプルコードの説明は、前にまったく同じコードを使って説明しています。読んでみて分からない人はそちらをどうぞ。
前の説明で足りないことを補足します。
と思った人もいるでしょう。テンプレートに変数を渡せないと意味がないですからね?
テンプレートファイルにパラメータを渡すのはかんたんです。テンプレートファイルを読み込むrequreの前に変数を用意するだけです。
<?php
function load_template($file, $attr){
ob_start();
require $file;
$html = ob_get_contents();
ob_end_clean();
echo $html;
}
load_template()にパラメータ$attrを追加しました。これでテンプレートファイルで$attrが参照できます。
requireの意味から考えると分かります。requireはPHPコードをコールした場所に挿入します。
requireで読み込んだテンプレートファイルの中身をrequireの場所にコーディングしているのと同じ。
なので、requireの前で宣言した変数はテンプレートファイルでも使えます。
まとめ
PHPプログラムのテンプレート化は、バッファリングを使ってテンプレートファイルのPHPのコード結果をまとめて保存、そして、あとでまとめて出力するだけです。
変数を渡すこともできますし、テンプレートファイル内でPHPコードを挿入することもできます。
また、定義したfunctionもテンプレートファイル内で使えます。変数と同じようにrequireの前で定義するだけ。
テンプレートファイルの仕組みはむずかしいようで、実はとてもかんたんです。これでオリジナルのフレームワークを作ることもできます。
ただし、フレームワークは高機能なコードの集まりなのでハイレベルですが。
- テンプレートファイルの読み込みにはバッファリングを使う。
- 変数・functionはrequireの前に定義すれば、テンプレートファイル内に渡すことができる。