メニュー

Home >freo講座>初心者の為のfreoテンプレート編集講座> 【基本編(07)】修飾子について

【freo講座】【初心者の為のfreoテンプレート編集講座】【基本編(07)】修飾子について

2012/08/29 00:23|タグ:smarty修飾子smarty:nodefaultsグッジョブ表示 45

smartyでは、修飾子を使うことができます。
と言われても、「修飾子」なんて言葉はこれまで聞いたことがありません。
変数なんかはまだなんとなく理解できるとしても、「修飾子」なんて一発変換でも出てきません。
という具合に苦手意識を持ってしまいがちな修飾子ですが、これがなかなか使えるものなので、ぜひ覚えてやってください。

修飾子とは

smartyでは、修飾子を使うことができます。
修飾子とは変数につける飾りのようなもののことで、それを使うと、値の内容はそのままで、値の表示方法に変化を与えることができます。
(freo公式サイトの説明だと、「表示内容に影響を与えることができ」ると書かれていますが、要するに、あくまで値に変化はなくて、どういう風に表示されるかにだけ変化があるという風に理解すればOKかと思います。)

どういうことかというと、例えば、{$sample.url}という変数に、「http://32877.xii.jp/」という値が含まれていたとします。
テンプレートに単純に{$sample.url}と記述すると、「http://32877.xii.jp/」という値がテキストのままで出力されます。
そして、変数に「|autolink」という修飾子をつけると、テキスト内にURLがあるかどうかを自動で判断し、URLがあれば、自動で「http://32877.xii.jp」のようにリンクを貼った状態で出力されます。

これをテンプレートで書こうとすると、

<p><a href="{$sample.url}">{$sample.url}</a></p>

になるのですが、修飾子を使えば

<p>{$sample.url|autolink}</p>

になるんですね。便利です。

修飾子の種類

修飾子については、freo公式サイトでも解説されています。
どんな修飾子があるのかは、そちらを参考にするとよいかと思います。

freo:変数の修飾子について

ここに載っている以外(smartyのマニュアルに載っています)で個人的に覚えておいて損はない修飾子は以下の通りです。

nl2br
連続する改行を段落に変換します。

date_format
日付を整形するための修飾子です。
通常、「|date_format」と記載した後に、「:'%Y/%m/%d %H:%M'」などと記述して、日付をどのように表示するかを指定します。
ここをいじれば、たとえば日付だけ表示したり、時間だけ表示したりすることができます。
どう整形すればどんな風に表示されるのかは、こちらを参考にしてください。

smarty:nodefaults
公式サイトの変数の修飾子についてを見ると、「freoではすべての変数に escape (HTMLを無効にする修飾子)が自動で反映されます。これを無効にするには、smarty:nodefaults という修飾子を使用します。」とあります。
つまり、smarty:nodefaultsをつければ、変数に格納されている情報いHTMLタグが含まれていた場合、テキストとして出力されるのではなく、タグはタグとして表示されます。

ただし、公式でも注意喚起されていますが、コメント等誰でも投稿可能な変数にsmarty:nodefaultsをつけると、有害なJAVAスクリプト等を書かれてしまったりして、大変危険です。
smarty:nodefaultsは、管理人など責任が負える人だけが編集可能な変数にのみつけるのがベターです。

さて、どうして「smarty:nodefaults」を覚えておいた方がいいかというと、今後解説する「配列」をテンプレートで利用する際に必要になるからです。
配列の繰り返しを利用するとき、foreachという関数を使うのですが、freoでは全ての変数にescapeが自動で反映されるので、エスケープを回避しないとエラーになってしまう場合があります。
まあとりあえず、foreachを使えなかったときはもしかしたらsmarty:nodefaultsがついていない可能性がある」、ということだけ覚えておくだけでも十分かもしれません。

修飾子の書き方

今更ですが、修飾子の書き方です。
修飾子は変数の飾りなので、変数につけます。

{$ある変数|修飾子}

↑のような感じです。
もし修飾子を複数つけたい場合は、

{$ある変数|修飾子|修飾子|修飾子|修飾子…}

のように、「|」をつけるのを忘れずに、連続して記載するようにしてください。

修飾子の使用例

実際修飾子がどのように使われているのかを見てみます。
[freo/templates/internals/default/default.html]をエディタで開いてください。

24行目あたりに、

<!--{if $information_entry_text.excerpt}--><p>{$information_entry_text.excerpt|smarty:nodefaults|strip_tags|mb_truncate:200:'...'|escape}</p><!--{/if}-->

と書かれています。
<!--{if $information_entry_text.excerpt}-->~<!--{/if}-->は、インフォメーション機能を使って、エントリーを表示する場合の条件分岐です。
$information_entry_text.excerptというのが、インフォメーションエントリーの本文(続きを読むで分割されていない部分)を示す変数です。

ここでは、修飾子をたくさん使って、インフォメーションエントリーの本文をプレーンテキストにして、なおかつ200文字で切って表示するようにしています。
どういう処理がされているのかを順番に見てみると

{$information_entry_text.excerpt|smarty:nodefaults|strip_tags|mb_truncate:200:'...'|escape}
{インフォメーションエントリーの本文|エスケープを外して全ての文字(タグとか「'、<、>」などの文字含む)を表示する|タグを全て外す|200文字で切って最後は「…」で終わらせる|「'、<、>」などの文字を消す}

となります。
なるほど、意味がわかりません。
とりあえず、デフォルトの状態(なんの編集も加えていないテンプレート)では、インフォメーションエントリーの本文は200文字までしか表示されなくなっているので、これを全文表示したいなら、修飾子を消せばいいんじゃないでしょうか。

どんな感じにすればいいかっていうと、58行目あたりを見て下さい。

<!--{if $information_text.excerpt}-->
     {$information_text.excerpt|smarty:nodefaults}
<!--{/if}-->

と書かれています。

<!--{if $information_text.excerpt}-->~<!--{/if}-->は、インフォメーション機能のうち、インフォメーションテキストを表示する場合の条件分岐です。
$information_text.excerptというのが、インフォメーションテキストの本文(続きを読むで分割されていない部分)を示す変数です。
ここでは単純に、インフォメーションテキストがタグはタグとして反映されるように修飾子が組まれています。

ためしに、24行目の

 <!--{if $information_entry_text.excerpt}--><p>{$information_entry_text.excerpt|smarty:nodefaults|strip_tags|mb_truncate:200:'...'|escape}</p><!--{/if}-->

を、59行目にある{$information_text.excerpt|smarty:nodefaults}にならって

 <!--{if $information_entry_text.excerpt}--><p>{$information_entry_text.excerpt|smarty:nodefaults}</p><!--{/if}-->

にしてみれば、違いが分かるかもしれません。

ページ移動

ユーティリティ

新着コメント

Twitter

サイト内検索

ページ上部へ