2006-06-12

Smartyを使う

Smartyを英和辞書で引くと「うぬぼれ屋」とか「知ったかぶり」となっています。「Smarty Jones:うぬぼれ屋のジョーンズ」なる英語の歌もあります。しかし、PHPの世界でSmartyと言えば、テンプレートエンジンの事です。私はSmartyについて実はあまり詳しくありませんが「知ったかぶり」で説明します。

システムにテンプレートエンジンを導入する目的は、プレゼンテーション層(ブラウザに出力する部分)とアプリケーション層(問題領域のロジック部分)を分離することです。特にWebプログラミングの世界では、プレゼンテーションはデザイナ、アプリケーションはプログラマという具合に別々の担当者が受け持つのが普通です。テンプレートエンジンによって両者の作業は物理的に分離でき、プログラマは厄介なバージョン管理から開放されます。

また、ソフトウエアの品質特性から考えると「プレゼンテーション層とアプリケーション層の分離」は保守性や拡張性からの発想です。しかし、Webプログラミングの世界では、別の観点もあります。それは、プレゼンテーション自体を時間的、空間的、またはユーザごとに選択できるという事です。この機能を使えば、春夏秋冬で、地域毎に、またはユーザ毎に個別の概観を提供できます。なんともすばらしいことです。是非ともテンプレートエンジンの利用をお勧めします。

本編では、PHPのテンプレートエンジンとしてSmartyを推薦します。他にもテンプレートエンジン( REAR::HTML_Templateなど)はありますが、Smartyは次の点で他よりも優位であると考えられます。

  • コンパイル方式なので処理が早い
  • 複雑な制御構造(if、foreach)が組める
  • 拡張性に優れている(独自のプラグインやフィルタの利用が可能)
  • デバッグが容易(エラーメッセージが親切)

Smartyの公式サイトは、

です。ネット上では日本語の情報はまだ少ないです。

本編でインストールするSmartyとその必要条件を示します。

Smarty 2.6.14
PHP 4.0.6以降が必要です

Smartyの入手

Smarty: TEMPLATE ENGINE( http://smarty.php.net/ )にアクセスします。

smarty01.gif

サイト内のダウンロードページ( http://smarty.php.net/download.php )に進みます。

smarty02.gif

[ Smarty 2.6.14 Source] をクリックすればダウンロードできます。ここでダウンロードしたファイルは

Smarty-2.6.14.tar.tar

です。

Smartyのインストール

まず、ダウンロードしたファイル(Smarty-2.6.14.tar.tar)を解凍します。解凍後のSmarty-2.6.14の中には多くのファイルが含まれていますが、必要なのはlibs\以下のファイルだけです。本編では、

Smarty-2.6.14\libs

の中の全てのファイルを以下にコピーします。

C:\php5mb\includes\Smarty ※SmartyのSは大文字です。

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;
  }
}
?>
$template_dir
テンプレートファイルを置くディレクトリ(デフォルトは ./templates です)
$compile_dir
コンパイルされたテンプレートが置かれるディレクトリ(デフォルトは ./templates_c です)
$config_dir
テンプレート用の設定ファイルを置くディレクトリ(デフォルトは ./templates です)
$cache_dir
テンプレートのキャッシュが格納されるディレクトリ(デフォルトは ./cache です)
$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');
?>
  • assign()メソッドはテンプレート変数($name)に値('Smarty Jones')を割り当てます
  • display()メソッドはテンプレート('hello.html')を表示します

templates/hello.html

<html>
<head>
<title>Hello World</title>
</head>
<body>
{* Smarty *}
Hello, {$name}!
</body>
</html>
  • テンプレートタグを表すブラケットは { と } です。これは変更できます。
  • {* これはコメントです *}
  • $nameはテンプレート変数です。プログラムで値を割り当てます

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が埋め込まれます。このページが表示されるとき別ウインドウが開きテンプレート変数などのデバッグ情報が表示されます。

smarty03.gif

設定ファイルの利用

設定ファイルは、静的なテンプレート変数を管理する便利な方法です。これは主にデザイナーにとって有用なものになるはずです。例えば、サイトの配色を変更する場合などを考えて下さい。全てのテンプレートを変更する代わりに設定ファイルの内容を変更するだけで済みます。

色つきの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>
  • 設定ファイル名はテンプレート関数config_loadで指定します
    ※ディレクトリはSmarty::compile_dir()メソッド で指定します。
  • 設定ファイルから読み込む変数は # で囲みます

configs/hello.conf

pageTitle  = "Hello World"
helloColor = red
  • (テンプレート変数)=(値) の形式でテンプレート変数を設定します
  • (値)空白がある場合にはシングルクォートまたはダブルクォートが使用できます。

キャシュの利用

Smartyはキャッシュにも対応しています。これは、出力内容をファイルに保存する事によって、display()又はfetch()を呼び出す速度を上げるために使用されます。キャッシュを使用する事で表示速度は上昇しますが、動的コンテンツの場合、何をどれくらいの間キャッシュするのか注意が必要です。

キャッシュ機能は、日に1回程度の新着ニュースには有効ですが、通販や予約ページには当然キャッシュ機能は使えません。運用面から考えるとキャッシュはデフォルトで無効にしておくのが無難です。



最終更新のRSS Last-modified: Thu, 15 Jun 2006 16:38:32 JST (4058d)