Hello Worldのプログラムに、表示しているブラウザーの種類を表示する処理を追加してみます。
ブラウザーの種類は、PHP定義済変数の$_SERVER['HTTP_USER_AGENT']に定義されているので、プログラムには$_SERVER['HTTP_USER_AGENT']をアサインするコードを追加します。
HelloWorld.php
$Smarty->assign('title', 'Smarty予約変数の参照');
$Smarty->assign('contents', 'Hello World');
$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の予約変数として登録されているので、アサインしなくてもテンプレート側で使用することができます。
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予約変数 |
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'}
便利なのに意外に見過ごされているのが、$smarty.const変数です。可愛そうなので、取り上げておきます。
$smarty.const変数によってphpでdefine定義した定数をテンプレート内で参照する事ができます。
php サイド
define('_URL_','http://www.google.co.jp/');
テンプレート サイド
<a href="{$smarty.const._URL_}" shape="rect" >ググれ!</a>
以前は、定数もassign関数で割り付けていたので、これを知ったときには、orz.な感じでした(笑)。