4A.3 Smartyの仕組み
Smartyの仕組みを以下に図示します。
Smartyのテンプレートは、最初のリクエストでPHPスクリプトにコンパイルされます。 その後は、テンプレートが更新されない限り、コンパイル処理は発生しません。 プログラムのロジック部分は、テンプレートと実際のデータを結合します。 これは、以下のようなコードで記述されます。
$objSmarty =& new Smarty; // Smatyオブジェクトの作成
objSmarty->assign('title',"MyPage"); // テンプレート変数と実データの結合
次に、プログラムロジックはコンパイルされたテンプレートを呼び出す事によってHTMLを作成します。
$objSmarty->display('template.html'); // HTMLの生成
ここが「実行処理」の行われるタイミングです。上のコード ( displayメソッド ) を実行することにより、 「実行処理」は完結します。
また、Smartyでは、実行処理 によって生成されたHTMLをページキャッシュとして(一定時間の間)保存することができます。 そして、リクエスト時、このページキャッシュをHTTP応答として返すこともできます。 リアルタイム性の少ないコンテンツではキャッシュが有効になるかもしれません。 しかし、ページキャッシュの使用はプログラムを複雑なものにする傾向があり、本編では推奨しません。
実例:コンパイルされたテンプレート
上で説明したように、Smartyの基本的な挙動を理解する鍵は、「コンパイル処理」と「実行処理」の違いを理解する事です。 「コンパイル処理」は最初のリクエストで1回、「実行処理」は毎回のリクエストで発生します。 百聞は一見に如かず。以下にコンパイルされたテンプレートの例を示します。
<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 /* Smarty version 2.6.14, created on 2006-07-24 16:48:22
compiled from template.html */ ?>
<html>
<head>
<title><?php echo $this->_tpl_vars['title']; ?>
</title>
</head>
<body>
<div id="header">
<h1><?php echo $this->_tpl_vars['header']; ?>
</h1>
</div>
<div id="contents">
<?php echo $this->_tpl_vars['contents']; ?>
</div>
<div id="footer">
<?php echo $this->_tpl_vars['footer']; ?>
</div>
</body>
</html>
例えば、コンパイルされたテンプレートの次の部分に着目して見ましょう。
<?php echo $this->_tpl_vars['title']; ?>
これは、プログラムロジックの以下の部分に対応しています。
$objSmarty->assign('title' ,"MyPage");
両者を比較すると、Smartyオブジェクトの(内部的な)メンバ変数 $_tpl_vars によってテンプレート変数が管理されている事が分かります。 また、予約語thisが使用されていることから、コンパイルされたテンプレートは、 Smartyオブジェクト内部(おそらくdisplay関数の内部)からinclude(またはrequire)されていることも推測できます。
