Smartyの予約変数を使う

ブラウザーの種類を表示してみる

Hello Worldのプログラムに、表示しているブラウザーの種類を表示する処理を追加してみます。

ブラウザーの種類は、PHP定義済変数の$_SERVER['HTTP_USER_AGENT']に定義されているので、プログラムには$_SERVER['HTTP_USER_AGENT']をアサインするコードを追加します。

HelloWorld.php
$Smarty->assign('title', 'Smarty予約変数の参照');
$Smarty->assign('contents', 'Hello World');
// $_SERVER['HTTP_USER_AGENT']をアサイン
$Smarty->assign('HTTP_USER_AGENT',htmlspecialchars($_SERVER['HTTP_USER_AGENT'],"ENT_QUOTES"));
	  
// 指定したテンプレートを展開 
$Smarty->display('HelloWorld.tpl');

そして、テンプレートで{$HTTP_USER_AGENT}を追加すればOKです。

HelloWorld.tpl
    <h1>{$title}</h1>
    {$contents}
    あなたのブラウザーは {$HTTP_USER_AGENT} です。

しかし、Smartyでは$_SERVER,$_POST,$_SESSIONなどのPHP定義済変数Smartyの予約変数として登録されているので、アサインしなくてもテンプレート側で使用することができます。

$smarty.serverを使ってみる

PHPの$_SERVER変数は、$smarty.server.hash_keyとしてテンプレート内でアクセスする事ができます。$_SERVER['HTTP_USER_AGENT']の値を使用したい場合は、{$smarty.server.HTTP_USER_AGENT}となります。

これを使用して書き直すと、プログラム側の変更は必要無くなり、テンプレートに次のような修正を行なうだけです。

HelloWorld.tpl ($smarty.serverを使用した場合)
    <h1>{$title}</h1>
    {$contents}
    あなたのブラウザーは {$smarty.server.HTTP_USER_AGENT|escape:"html"} です。

Smarty予約変数

頻繁に使用されるSmarty予約変数を挙げておきます。

良く使用されるSmarty予約変数
Smarty予約変数 PHP定義済変数
$smarty.server.key サーバー変数 $_SERVER['key']の値
$smarty.get.key HTTP GET変数 $_GET['key']の値
$smarty.post.key HTTP POST変数 $_POST['key']の値
$smarty.cookies.key HTTP クッキー $_COOKIE['key']の値
$smarty.request.key リクエスト変数 $_REQUEST['key']の値
$smarty.session.key セッション変数 $_SESSION['key']の値
$smarty.const.define_name phpでのdefineの値
$smarty.now unixタイプスタンプ形式の現在時刻

$smarty.getや$smarty.post等は結構便利なのですが、外部から渡される変数には、悪意のある閲覧者によって変数が汚染されている可能性があります。それを考慮せず、下記のようにテンプレートを書いてしまうと、クロス サイト スクリプティングの危険性が発生してしまいます。

{$smarty.get.hoge}

汚染の可能性がある変数を扱う場合は、escape修飾子を使用し変数の内容を、エスケープする習慣をつけた方が良いと思います。

{$smarty.get.hoge|escape:'html'}

PHP 定数(define)の参照

便利なのに意外に見過ごされているのが、$smarty.const変数です。可愛そうなので、取り上げておきます。

$smarty.const変数によってphpでdefine定義した定数をテンプレート内で参照する事ができます。

php サイド
// phpでdefineした値
define('_URL_','http://www.google.co.jp/');	
テンプレート サイド
{* $smarty.const._URL_ で定数が参照できます。 *}
<a href="{$smarty.const._URL_}" shape="rect" >ググれ!</a>

以前は、定数もassign関数で割り付けていたので、これを知ったときには、orz.な感じでした(笑)。

Last modified: Thu Feb 21 15:04:00 2008 JST