第4回 Smartyを使ってみる(その3:関数編) - Smarty講座
yossy先生のSmarty講座
Lecutures on PHP
第4回 Smartyを使ってみる(その3:関数編) (その2)
修飾子を使う
続いて修飾子について説明します。修飾子とは、変数や文字列などに対して値を「修飾して」出力することが出来る機能です。「修飾して」といわれてもピンとこないかもしれませんので、例を挙げて説明します。
{* 変数strの値を大文字にする *}
{$str|upper}
$str変数のあとにパイプ(|)があり、そのあとにupperが指定されています。このupperは修飾子で、直前のパイプの前にある値のアルファベットを大文字に変換するという働きをします。
例として、PHPから変数strに対して以下のような値を設定します。
<?php
$smarty->assign( 'str', 'Smarty is a template engine for PHP.' );
?>
これを実行すると、変数strのアルファベットが全部大文字に変換されて「SMARTY IS A TEMPLATE ENGINE FOR PHP.」と表示されます。
この例のように、修飾子は与えられた変数や文字列などに対して、何らの処理を行った結果を出力するものです。
また修飾子は複数つなげることも可能です。
{* 変数strの値を大文字にして、文字の間にスペースを挿入する *}
{$str|upper|spacify}
spacifyは値の各文字の間にスペースを挿入する修飾子です。上の例では、変数$strを修飾子upperでアルファベットを大文字に変換しています。次にその結果を修飾子spacifyで文字の間にスペースを挿入しています。結果として、「S M A R T Y I S A T E M P L A T E E N G I N E F O R P H P .」という文字列が表示されます。
※ 但し、ひらがなや漢字などマルチバイト文字はうまく動作しません
また修飾子に対しパラメータを指定することが出来ます。パラメータは修飾子のあとにコロン(:)とパラメータ値をつなげて書くことで指定できます。パラメータを複数指定する場合は、それぞれコロンで区切ります。
今日は{$smarty.now|date_format:'%Y年%m月%d日'}です。
date_formatはPHP関数のstrftime()と同様に、日付や時間をフォーマットに基づいて表示する修飾子です。この修飾子は第1パラメータにフォーマット文字列を指定します(フォーマット文字列の詳細はPHPマニュアルでstrftime()の項を参照してください)。上記の例ではコロンの後にある「'%Y年%m月%d日'」というフォーマット文字列がパラメータになります。現在のタイムスタンプにアクセスする予約変数$smarty.nowの値を、「2007年10月3日」のようなフォーマットで表示します。

さて、修飾子が一番有効に活用できる場面は何でしょうか? 個人的は、セキュリティ対策として変数をエスケープして出力する場面が一番修飾子を有効活用できると考えています。
例えば掲示板のようなWebアプリケーションを考えてみます。ユーザーからPOSTされたタイトルと本文を表示するコードは(かなり大雑把ですが)以下のような感じになると思います。
<?php
$smarty->assign( 'title', $_POST['title'] );
$smarty->assign( 'text', $_POST['text'] );
?>
<dl>
<dt>タイトル</dt>
<dd>{$title}</dd>
<dt>本文</dt>
<dd>{$text|nl2br}</dd> {* nl2brは改行を<br />タグへ変換する修飾子 *}
</dl>
しかしこのコードには大きな問題があります。POSTされたタイトルや本文にActiveXやJavascriptなどを用いた悪意のあるスクリプトが埋め込まれていたらどうなるでしょうか? POSTされたデータがそのまま出力されているため、表示された瞬間に埋め込まれたスクリプトが実行され、Cookieが盗まれたりウィルスに感染したり大きな被害をもたらしてしまいます。
こうしたセキュリティ上の脆弱性をなくすため、表示する値に不正なスクリプトが埋め込まれている可能性がある場合にはエスケープをする必要があります。これを実現するためにescapeという修飾子が用意されています。
<dl>
<dt>タイトル</dt>
<dd>{$title|escape:'html':'UTF-8'}</dd>
<dt>本文</dt>
<dd>{$text|escape:'html':'UTF-8'|nl2br}</dd>
</dl>
escapeの第1パラメータはエスケープの種類で、html,url,javascriptなどが指定できます。htmlを指定した場合は、PHPのhtmlspecialchars($string, ENT_QUOTES, $char_set);と同様の処理が実行され、アンパサンド(&)、ダブルクォート(")、シングルクォート(')、不等号(<>)がエスケープされます。第2引数は変換に使用される文字セットを指定します。

このあたりのセキュリティの話題は、がる先生のセキュリティ講座(*3)でも触れられているので是非目を通しておいてください。そして、悪意のあるスクリプトが埋め込まれる可能性のある変数を表示する際は、必ずエスケープをするよう習慣づけるようにしてください。
さて、上記で紹介した他にも修飾子が最初からいくつか用意されています。是非マニュアル(*4)で確認をしてみてください。またカスタム関数と同様、プラグインとしてユーザーが作成した修飾子も公開されています。もし標準で用意されていない機能が必要になったときは、既に他の人が作ったプラグインがあるかもしれませんので探してみてください。
さて第4回はここまでです。今までSmartyの使い方や基本的な構文について説明してきましたが、次回からは実際にSmartyを使って、簡単で実用的なWebページを作ってみたいと思います。
----
(*3)http://www.phppro.jp/school/security/vol2/1
(*4)
http://www.smarty.net/manual/ja/language.modifiers.php
- 1
- 2
その他の記事も見る
- 第1回 Smartyの紹介
- 第2回 Smartyを使ってみる(その1:変数編)
- 第3回 Smartyを使ってみる(その2:制御構造編)
- 第4回 Smartyを使ってみる(その3:関数編)
- 第5回 Smartyを使って実用的なページを作ってみる(その1)
- 第6回 Smartyを使って実用的なページを作ってみる(その2)
- 第7回 Smartyの便利な機能を使いこなす(その1:キャッシュ前編)
- 第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編)
- 第9回 Smartyの便利な機能を使いこなす(その3:フィルタ編)
- 第10回 Smartyの便利な機能を使いこなす(その4:プラグイン編)
- 第11回 Smartyとフレームワーク(その1:CakePHP編)
- 第12回 Smartyとフレームワーク(その2:Zend Framework編)
- 第13回 次世代のSmarty - Smarty3の紹介
- 第14回 Smartyでケータイサイトを作ってみる
- >>「yossy先生のSmarty講座」一覧ページに戻る
- yossy先生
本名:吉武 正史
パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。
2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/




ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!