|
2006-06-12
Smartyを使う †Smartyを英和辞書で引くと「うぬぼれ屋」とか「知ったかぶり」となっています。「Smarty Jones:うぬぼれ屋のジョーンズ」なる英語の歌もあります。しかし、PHPの世界でSmartyと言えば、テンプレートエンジンの事です。私はSmartyについて実はあまり詳しくありませんが「知ったかぶり」で説明します。 システムにテンプレートエンジンを導入する目的は、プレゼンテーション層(ブラウザに出力する部分)とアプリケーション層(問題領域のロジック部分)を分離することです。特にWebプログラミングの世界では、プレゼンテーションはデザイナ、アプリケーションはプログラマという具合に別々の担当者が受け持つのが普通です。テンプレートエンジンによって両者の作業は物理的に分離でき、プログラマは厄介なバージョン管理から開放されます。 また、ソフトウエアの品質特性から考えると「プレゼンテーション層とアプリケーション層の分離」は保守性や拡張性からの発想です。しかし、Webプログラミングの世界では、別の観点もあります。それは、プレゼンテーション自体を時間的、空間的、またはユーザごとに選択できるという事です。この機能を使えば、春夏秋冬で、地域毎に、またはユーザ毎に個別の概観を提供できます。なんともすばらしいことです。是非ともテンプレートエンジンの利用をお勧めします。 本編では、PHPのテンプレートエンジンとしてSmartyを推薦します。他にもテンプレートエンジン( REAR::HTML_Templateなど)はありますが、Smartyは次の点で他よりも優位であると考えられます。
Smartyの公式サイトは、
です。ネット上では日本語の情報はまだ少ないです。
本編でインストールするSmartyとその必要条件を示します。
Smartyの入手 †Smarty: TEMPLATE ENGINE( http://smarty.php.net/ )にアクセスします。 ![]() サイト内のダウンロードページ( http://smarty.php.net/download.php )に進みます。 ![]() [ Smarty 2.6.14 Source] をクリックすればダウンロードできます。ここでダウンロードしたファイルは
です。 Smartyのインストール †まず、ダウンロードしたファイル(Smarty-2.6.14.tar.tar)を解凍します。解凍後のSmarty-2.6.14の中には多くのファイルが含まれていますが、必要なのはlibs\以下のファイルだけです。本編では、
の中の全てのファイルを以下にコピーします。
C:\php5mb は本編でのPHPのインストールフォルダです。また C:\php5mb\includes は php.iniのinclude_pathディレクティブに設定されてるフォルダです。 php.ini include_path = ".;C:/php5mb/includes;C:/php5mb/PEAR" このようにSmartyにincludeパスを通しておくと便利がよいです。PHPスクリプトからは以下のようにしてSmartyをincludeできます。 require_once('Smarty/Smarty.class.php')
SmartyはSmartyのインストールディレクトリが定数SMARTY_DIRに保持されている事を前提にしています。利用者がこの定数を設定しなかった場合、SmartyはSMARTY_DIRを自動で設定します。 <?php
require_once('Smarty/Smarty.class.php');
echo SMARTY_DIR;
?>
上のスクリプトを実行すると、 c:\php5mb\includes\Smarty\ が表示されます。また、以下のようにSMARTY_DIRを手動で設定することもできます。この定数はSmarty自身も参照するので正しく設定する必要があります。SMARTY_DIR は必ず "/" で終わる必要があります。 <?php
define('SMARTY_DIR','C:php5mb/includes/Smarty/');
require_once( SMARTY_DIR . 'Smarty.class.php');
echo SMARTY_DIR;
?>
Smartyの使い方 †一般にSmartyクラスのインスタンスを直接作成する事はありません。 その代わりに、Smartyの派生クラスを作ってから、そのクラスのインスタンスを作ります。 Smartyの設定はこの派生クラスのコンストラクタの中で行います。 MySmarty.class.php <?php
require('Smarty/Smarty.class.php');
class MySmarty extends Smarty {
function MySmarty () {
$this->Smarty();
$mydir = dirname(__FILE__);
$this->template_dir = "$mydir/templates/";
$this->compile_dir = "$mydir/templates_c/";
$this->config_dir = "$mydir/configs/";
$this->cache_dir = "$mydir/cache/";
$this->caching = 0;
}
}
?>
Smaryクラスのインスタンスを直接使うよりも、上例のように派生クラスの中で初期設定をした方が拡張性に富んだコードになります。PHPの実行環境を移行する場合でも必要最小限の変更で済みます。 Hello World †上例を使ってお馴染みの「Hello World」を作って見ます。 hello.php <?php
require_once( 'MySmarty.class.php');
$objSmarty =& new MySmarty;
$objSmarty->assign('name','Smarty Jones');
$objSmarty->display('hello.html');
?>
templates/hello.html <html>
<head>
<title>Hello World</title>
</head>
<body>
{* Smarty *}
Hello, {$name}!
</body>
</html>
Smartyのデバッグ †Smartyの特徴に1つにデバックのし易さがあります。テンプレートでエラーが発生した場合、 Smartyは以下のようなエラーを出力します。このエラーメッセージの中にはテンプレートファイル中のエラーの箇所も表示されているので大変親切です。 Fatal error: Smarty error: [in hello.html line 7]: syntax error: unrecognized tag: $ name (Smarty_Compiler.class.php, line 439) in c:\php5mb\includes\Smarty\Smarty.class.php on line 1095 デバッギングコンソール †また、Smartyにはデバッギングコンソールの機能まであります。例えば、先の hello.php を次のように変更します。 hello.php <?php
require_once('MySmarty.class.php');
$objSmarty =& new MySmarty;
$objSmarty->debugging = true;
$objSmarty->assign('name','Smarty Jones');
$objSmarty->display('colored_hello.html');
?>
Smartyクラスのメンバ変数 $debugging をtrue にすると、display()メソッドで出力されるhtmlの中にデバッギングコンソールを表示するJavaScriptが埋め込まれます。このページが表示されるとき別ウインドウが開きテンプレート変数などのデバッグ情報が表示されます。 ![]() 設定ファイルの利用 †設定ファイルは、静的なテンプレート変数を管理する便利な方法です。これは主にデザイナーにとって有用なものになるはずです。例えば、サイトの配色を変更する場合などを考えて下さい。全てのテンプレートを変更する代わりに設定ファイルの内容を変更するだけで済みます。 色つきのHello World †先に示したHello Worldを「色付き」にして見ます。 collored_hello.php <?php
require_once('MySmarty.class.php');
$objSmarty =& new MySmarty;
$objSmarty->assign('name','Smarty Jones');
$objSmarty->display('colored_hello.html');
?>
templates/colored_hello.html {config_load file="hello.conf"}
<html>
<head>
<title>{#pageTitle#}</title>
</head>
<body>
{* Smarty *}
<span style="color:{#helloColor#}">Hello, {$name}!
</body>
</html>
configs/hello.conf pageTitle = "Hello World" helloColor = red
キャシュの利用 †Smartyはキャッシュにも対応しています。これは、出力内容をファイルに保存する事によって、display()又はfetch()を呼び出す速度を上げるために使用されます。キャッシュを使用する事で表示速度は上昇しますが、動的コンテンツの場合、何をどれくらいの間キャッシュするのか注意が必要です。 キャッシュ機能は、日に1回程度の新着ニュースには有効ですが、通販や予約ページには当然キャッシュ機能は使えません。運用面から考えるとキャッシュはデフォルトで無効にしておくのが無難です。 |