第4回 Smartyを使ってみる(その3:関数編) (その1)
前回は条件分岐やループといった制御構造について説明しました。今回は関数と修飾子について説明します。
関数を使う
Smartyで利用できる関数は以下のような記述で呼び出すことが出来ます。
{funcname attr1='val1' attr2='val2'}
上の例ではfuncnameが関数名、attr1,attr2が関数のパラメータとなる属性名、val1,val2がその属性値です。属性値は、変数の場合クォート('や")は必要ありませんが、静的な値(文字列や数値など)はクォートで囲むようにしてください。
また、PHPの文字列と同じように、ダブルクォートで囲まれた文字列中に変数を記述することでその値を展開することも出来ます。
{* $val1は変数の値に置き換えられるが、$val2は置き換えられない *}
{funcname attr1="$val1" attr2='$val2'}
但し、連想配列にアクセスする際に用いるピリオド(.)やオブジェクトメンバーへのアクセス(->)を含む場合は、その変数をバッククォートで囲む必要があります。
{* attr1は$val1のみ展開され、attr2は$val2.a2が展開される *}
{funcname attr1="aaa $val1.a1 bbb" attr2="ccc `$val2.a2` ddd"}
さて、この関数呼び出しの記述方法を見て何か気づいたことはありませんか? そう、前回説明した{foreach}や{section}と同じ記述方法です。実はSmartyでは{foreach}や{section}も関数なのです。{if}も条件式の記述方法は上記と異なりますが関数扱いです。

Smartyの関数には「組み込み関数」と「カスタム関数」の2種類があります。
「組み込み関数」はSmarty内部で定義されている関数で、これらは変更、修正することは出来ません。{if},{foreach},{section}などはこの組み込み関数になります。また第2回で設定ファイルの説明をしましたが、その設定ファイルを読み込むときに用いた{config_load}も組み込み関数です。
対して「カスタム関数」はプラグイン形式で用意された関数で、自由に修正したりまた関数を追加することも可能です。これらはPHPで作成することが出来ます。また、ユーザーが作成したカスタム関数のプラグインも数多く公開されています。(*1)
今回のSmarty講座では、プラグインの作成方法に関しての説明は省略しますが、もし興味のある方はマニュアルを参考に(*2)チャレンジしてみてはいかがでしょうか。
ここでは、よく使う関数をいくつか紹介したいと思います。
{include}
組み込み関数{include}は別のテンプレートファイルを指定位置に読み込みます。Webページを作る際、各ページ共通のヘッダやフッタを用意することが多いと思いますが、これらを別テンプレートファイルとして用意しておき、各ページのテンプレートの先頭と末尾で{include}を用いてヘッダやフッタを読み込むようにすることで、デザインの一元管理をすることが出来ます。読み込むテンプレートファイルはfileという属性で指定します。
また、任意の名前の属性を指定することも出来ます。これにより、読み込むテンプレートに変数を渡すことが出来ます。例えばヘッダファイルのタイトルなどを渡す時などに便利です。
{* ヘッダファイルを読み込む。title変数を渡す *}
{include file='header.tpl' title='ぺーじたいとる'}
{* ここにページの内容を記述 *}
{* フッタファイルを読み込む *}
{include file='footer.tpl'}
header.tplを以下のように用意しておくと、title属性で渡されたタイトルの値が{$title}に展開されます。
<html>
<head>
<title>{$title}</title>
</head>
<body>
{ldelim},{rdelim}
Smartyテンプレートで変数や関数を記述する際、{}を用いますが、ページ内で{}を記述したい場合はどうしたらいいでしょう?
例えば以下のようなSmartyテンプレートを出力しようとすると…
{ほげほげ}
Fatal error: Smarty error: [in file:/var/www/smarty/templates/test.tpl line 1]: syntax error: unrecognized tag: ほげほげ (Smarty_Compiler.class.php, line 446) in /usr/local/lib/Smarty-2.6.18/libs/Smarty.class.php on line 1095
Smartyはシンタックスエラーを出して正しく出力してくれません。
そこで{ldelim}{rdelim}という組み込み関数を用いることで、エスケープすることが出来ます。
{ldelim}ほげほげ{rdelim}
上記のように{}の代わりに用いることで、それぞれ{と}に置き換えられて正しく表示されるようになります。
{literal}
{ldelim}{rdelim}では1つずつしかエスケープすることが出来ません。したがって、JavascriptやCSSなど大量の{}が記述されているテンプレートでは、いちいち1つずつ置き換えていくのは大変ですし、また保守が困難になってしまいます。
そこで{literal}という組み込み関数を用います。{literal}と{/literal}で囲まれた間に記述されているすべての{}をSmartyのデリミタと見なさず、そのまま出力します。
{* literal内のデリミタがすべてそのまま出力されます *}
<script type="text/javascript">
{literal}
function test( a )
{
if( a > 0 ){
alert( 'aは0より大きい' );
}
else{
alert( 'aは0以下' );
}
}
{/literal}
</script>
{assign}
第2回でPHPからSmartyテンプレートに変数を受け渡し、それにアクセスする方法を説明しました。しかしPHPからではなく、どうしてもSmarty上で変数を定義したい時があります。その場合、カスタム関数の{assign}を用いることでSmartyから変数を定義することが出来ます。変数名はvar、値はvalueという属性に設定します。
{* 変数titleに値を設定 *}
{assign var="title" value="ぺーじたいとる"}
<title>{$title}</title>

他にも組み込み関数、カスタム関数がいくつか用意されています。HTMLの記述を支援する関数やデバッグ用の関数などが用意されていますので、是非一度マニュアルを読んでどのような関数が用意されているか確認してみてください。
----
(*1)http://www.smarty.incutio.com/?page=SmartyPlugins
(*2)http://www.smarty.net/manual/ja/plugins.php







