第4回 Smartyを使ってみる(その3:関数編) - Smarty講座

PHP基礎編

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日」のようなフォーマットで表示します。

yossy先生

さて、修飾子が一番有効に活用できる場面は何でしょうか? 個人的は、セキュリティ対策として変数をエスケープして出力する場面が一番修飾子を有効活用できると考えています。

例えば掲示板のような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が盗まれたりウィルスに感染したり大きな被害をもたらしてしまいます。

埋め込まれたJavaScriptが実行される例

こうしたセキュリティ上の脆弱性をなくすため、表示する値に不正なスクリプトが埋め込まれている可能性がある場合にはエスケープをする必要があります。これを実現するために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引数は変換に使用される文字セットを指定します。

埋め込まれたJavaScriptをescapeした例

yossy先生

このあたりのセキュリティの話題は、がる先生のセキュリティ講座(*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
  • yossy先生

本名:吉武 正史

パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。 2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/

ご意見・感想フォーム

今回の「yossy先生のSmarty講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)