4A テンプレートの利用
本編ではSmartyを題材としてPHPにおけるテンプレートエンジンについて説明します。
4A.1 テンプレートエンジンの必要性
システムにテンプレートエンジンを導入する目的は、 プレゼンテーション層(ブラウザに出力する部分)とアプリケーション層(問題領域のロジック部分)を分離することです。 一言でいうと
「プレゼンテーションとロジックの分離」これがテンプレート導入の理由です。 一般に、中規模以上のWebプログラムは3層モデルでシステムを構成します。 3層モデルとは、下図のようにプレゼンテーション層、アプリケーション層、データベース層の3つの層(レイヤ) でシステムを構成するモデルです。下図に於いて、アプリケーション層のViewを受け持つのがテンプレートエンジンです。
PHPを使った簡易テンプレート
PHPはHTML埋め込み型のスクリプト言語なので、小規模なWebプログラムでは、 PHPスクリプトを工夫すれば、簡易的なテンプレートシステムは直ぐにできます。 以下にその例を挙げます。
<?php
$title = "MyPage";
$header = "MyHeader";
$contents = "What's Template?";
$footer = "MyFooter";
require('template.php');
?>
<html> <head> <title><?= $title ?></title> </head> <body> <div id="header"> <h1><?= $header ?></h1> </div> <div id="contents"> <?= $contents ?> </div> <div id="footer"> <?= $footer ?> </div> </body> </html>
通常のアプリケーションを開発する感覚では、上で示した簡易的なテンプレートシステムでも十分と思われます。 しかし、WEBプログラミングでは違います。Webプログラミングの世界では、プレゼンテーションはデザイナ、 アプリケーションはプログラマという具合に別々の担当者が受け持つのが普通です。 従って、なるべくPHP的要素を排除したテンプレートシステムが望まれます。
Smartyを使ったテンプレート
Smartyは独自のテンプレート言語をもった本格的なテンプレートエンジンです。 Smatryの特徴や動作原理については次節を参照してもらうことにして、まずは、以下を見て下さい。
<?php
require('Smarty/Smarty.class.php');
$objSmarty =& new Smarty;
$objSmarty->assign('title' ,"MyPage");
$objSmarty->assign('header' ,"MyHeader");
$objSmarty->assign('contents',"What's Template?");
$objSmarty->assign('footer' ,"MyFooter");
$objSmarty->display('template.html');
?>
<html>
<head>
<title>{$title}</title>
</head>
<body>
<div id="header">
<h1>{$header}</h1>
</div>
<div id="contents">
{$contents}
</div>
<div id="footer">
{$footer}
</div>
</body>
</html>
先の「PHPを使った簡易テンプレート」の例と良く似ていますが、PHP自体を利用したテンプレートシステムではなく、 PHPとテンプレートの間に「何か」いるのが分かってもらえると思います。その「何か」がSmatryなのです。 テンプレートはもはや単なるPHPファイルではなく、独自のテンプレート言語で記述されています。 Smartyではカーリーブラケット {} の中にテンプレート言語を記述する方式が取られています。
このように専用のテンプレートエンジンを導入する事によって両者(プログラマーとデサイナー)の作業は物理的に分離でき、 専門の作業に注力する事ができます。また、設計段階でプレゼンテーション層の仕様が明確になりという副産物を得ることができます。
一般的なソフトウエアの品質特性から考えると 「プレゼンテーション層とアプリケーション層の分離」は保守性や拡張性からの要求です。 しかし、Webプログラミングの世界では、別の観点もあります。 それは、操作性です。即ち、プレゼンテーション自体を時間的、空間的、 またはユーザごとに選択できるという事です。この機能を使えば、春夏秋冬で、地域毎に、 またはユーザ毎に個別の概観を提供できます。なんともすばらしいことです。 是非ともテンプレートエンジンの利用をお勧めします。
