Smarty入門

2007.07.12 Author: Jas

今日は社内ゼミの担当でSmartyについての発表をするので、ここに内容を少し紹介しておきます。

[今日のメニュー]

  • Smartyのメリット
  • 設置方法
  • Smartyの使い方
  • Smarty Tip

入門なので、導入から簡単な使い方までを説明します。

Smartyのメリット

  • 導入が簡単:PHPが実行できるディレクトリに設置するだけで使えるようになる
  • フレキシブル:関数やプラグインが豊富で、カスタマイズも可能
  • テンプレートの可読性UP:デザインとプログラムが分離できる
  • 早い!:コンパイル方式のため、処理が早い


ただし、Smartyでは変数を"{$var}"のように大かっこで囲って表示をするのですが、文字コードがSJISにする時には注意が必要です。というのは、SJISでは「須」や「本」などの2バイト目の文字コードが"{"と同じB7なので、Smartyが誤認識してしまうのです。
回避策としては、2バイト目が7Bの文字を{literal}本{/literal}のように書く方法もありますが、それでは面倒です。そこで、Smartyのプレフィルター(register_prefilter)とポストフィルター(register_postfilter()機能を使用して、テンプレートの文字コードをコンパイル前にEUCに変換し、コンパイル後にまたSJISにもどす処理を行えばより簡単にこの問題を回避できるようになります。

これと関連して、テンプレート中にJavaScriptやCSSを書き込む場合など、テンプレート中に"{"を書き込むと、Smartyがコンパイル時に誤認識してしまいます。ですので、JavaScriptなどは{literal}{/literal}で囲っておきましょう。

設置方法
ダウンロード: Smarty
解凍した中から、必要なのはlibフォルダの中身だけです。
libフォルダをPHPが実行できるディレクトリにコピーしてください。

次に、ディレクトリ設定ですが、適当な場所に下記の4つのディレクトリを作成してください。
cacheとtemplates_cにはSmartyが作成したファイルが入るので、ディレクトリ権限を777に設定してください。作成したテンプレートは"templates"ディレクトリに格納します。
+ cache : キャッシュディレクトリ(パーミッション:777)
+ configs : 設定ファイルディレクトリ
+ templates : テンプレートディレクトリ
+ templates_c : コンパイル済ファイルディレクトリ(パーミッション:777)

Smartyの使い方
PHPを書くときに、最初にSmartyを使う準備が必要です。


【test.php】
1. require('Smarty.class.php');
2. $smarty =new Smarty();

3. $smarty->template_dir = “../tpl/template/";
4. $smarty->compile_dir = “../tpl/template_c/";
5. $smarty->config_dir = “../tpl/configs/";
6. $smarty->cache_dir = “../tpl/cache/";

7. $name = "Jas";
8. $smarty->assign(“name”, $name);
9. $smarty->display(“test.tpl");


まず、1行目のrequire()でSmartyを呼び出し、2行目でSmartyの定義をしています。
3~6行目ではそれぞれ、先ほど作成したディレクトリのパスを指定してください。
これで、テンプレートでSmartyを利用できます。
8行目のassignをつかって、Smartyの変数(name)に$nameを代入しています。
9行目でテンプレートの呼び出し、test.tplの内容を表示できます。

【test.tpl】
Hello World
 Hello, {$name}!  

これを"templates"ディレクトリに保存して、test.phpを実行すると、ブラウザに"Hello, Jas!"と表示されるはずです。

Smarty Tip
最後に便利なプラグインをちょっとだけ紹介します。

{$var|default:"未記入"}
このように変数の後にパイプ(|)で変数のデフォルト値を指定してあげると、変数($var)が空の場合に"未記入"と表示することができます。

PHPからテンプレートに複数の変数を渡すときには、以下のように配列を利用してまとめて渡すこともできます。
$var = array("a"=>1, "b"=>2, "c"=>3);
$smarty->assign($var);
これでテンプレート内で{$a}, {$b}, {$c}が参照できます。

{$var|escape}
こう記述すると、$varにhtmlタグが含まれていてもエスケープされ、画面にそのまま表示されるようになります。クロスサイトスクリプティング対策に有効です。
Smartyにはデフォルトの修飾子(パイプのあとにつけるもの)を設定することができるので、default_modifiersでescapeをデフォルトの修飾子に指定しておけば、毎回書く必要がなくなり、書き忘れもなくなるので、便利です。

{$var|nl2br}
全ての改行文字を
タグに置換します。

{$smarty.post.name}
{$smarty.get.name}
このように書くと、POSTやGETで送信された値を参照できます。nameの部分をフォームのname値にします。その他にも、sessionやcookie、server関数なども同じように参照することができます。

{$smarty.now|date_format:"%Y/%m/%d"}
$smarty.nowは今のタイムスタンプを表示します。
data_formatで表示形式を指定できるので、上のように書けば今日の日付を表示できます。


簡単ですが、これでSmartyの入門編を終わりにします。
Smartyには他にも便利な機能やプラグインがあるので、詳しくはマニュアルをみてみてください。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ