Smarty:修飾子

最終更新日時:2017-06-28 19:03:19
Smarty

Smarty には修飾子という概念があり、大変便利です。
変数/関数/文字列などを修飾して出力する時に使用します。
以下のように、"|"(パイプ)指定することにより修飾子を指定することが出来ます。

 {$smarty.now|date_format:"%Y/%m/%d"}


上記の例は、$smarty.now により取得できる現在時刻を yyyy/mm/dd の形式で表示するよう date_format という修飾子を指定したものとなります。
上記の例のように、修飾子に ":"(コロン)を指定することにより、修飾子にパラメータを指定することが出来ます。
上記の例では、"%Y/%m/%d" というパラメータを指定することにより yyyy/mm/dd という形式を指定したことになります。

修飾子に PHP の関数を使う


Smarty では、PHP の関数を修飾子に指定することが出来ます。
以下のように、"@"(アットマーク)を PHP 関数の前に指定します。

 {$lines|@count}


上記の例では、修飾子として PHP の count() 関数を指定したことになります。


独自の修飾子


Smarty では、独自の修飾子を使用することも可能です。
例えば、Smarty には truncate という修飾子がありますが、マルチバイト対応していないので日本語では全く使い物になりません。
以下、mytruncate というマルチバイト対応した独自の truncate を作る例を紹介します。

Smarty の独自修飾子を作成するには、smarty のディレクトリにある libs/plugins/ 配下に modifier.xxxxx.php という名前でプラグインファイルを作成します。
xxxxx は修飾子名なので、mytruncate という修飾子であれば、modifier.mytruncate.php となります。
内容は以下のように作成しました。
※HTML ベースかつ UTF-8 でしか使わない想定です

 function smarty_modifier_mytruncate($string, $length = 80, $etc = '...') {
    if ($length == 0) return '';
 
    $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
    $string = trim($string);
 
    if (mb_strlen($string) > $length) {
        $string = mb_substr($string, 0, $length) . $etc;
    }
    return  htmlentities($string, ENT_QUOTES);
 }


重要な点は以下となります。
・smarty_modifier_xxxxx という関数を作成する(xxxxx は修飾子名)
・パラメータが必要であれば、関数にパラメータの設定も記載する
・修飾した結果を return で返す

上記で作成した mytruncate は以下のように使用することが出来ます。

 {$body|mytruncate}
 {$body|mytruncate:'100'}
 {$body|mytruncate:'100':'---'}
お問い合わせは 掲示板 にて。