Smarty3で$smarty->default_modifiers = array(“escape:’html'”);を指定した場合の|smarty:nodefaults指定方法

12月 14th, 2010

{$hoge nofilter} で可能。

Smarty2の時に使用していた{$hoge|smarty:nodefaults}を使うとエラーで真っ白になってしまう。

Smartyを使うときは必ず、
$smarty->default_modifiers = array(‘escape:”html”‘);
を入れるべきと思いそうしている。
テンプレート側でいちいち{$hoge|escape}を入れると見難い上に書き忘れをしてしまう可能性があるので。

検証の為にphpで
$smarty->assign(“yahoo_link”,'<a href=”http://yahoo.co.jp/”>yahoo</a>’);
を指定し、
テンプレートで
{$yahoo_link}<br />
{$yahoo_link|smarty:nodefaults}<br />
をしてみた所画面が真っ白に・・・。

|smarty:nodefaultsを抜くとエスケープされた文字列(リンクではない)がちゃんと表示された。

Smary3の日本語マニュアルを見ても|smarty:nodefaultsの記述が・・・。(2010/12/14日現在)
http://www.smarty.net/docs/ja/variable.default.modifiers.tpl
テンプレート内のすべての変数に暗黙に適用される修飾子が格納された配列です。 例えば、 デフォルトですべての変数にHTMLエスケープ処理を施したい場合は、 array(‘escape:”htmlall”‘) となります。 この影響を受けない変数にするには、{$var|smarty:nodefaults} のように nodefaults 修飾子をパラメータに持つ smarty 修飾子を指定します。

ちなみにこっちはSmary2の日本語マニュアル
http://www.smarty.net/docsv2/ja/variable.default.modifiers.tpl
テンプレート内のすべての変数に暗黙に適用される修飾子が格納された配列です。 例えば、 デフォルトですべての変数にHTMLエスケープ処理を施したい場合は、 array(‘escape:”htmlall”‘) となります。 この影響を受けない変数にするには、{$var|smarty:nodefaults} のように nodefaults 修飾子をパラメータに持つ smarty 修飾子を指定します。

Smary3の英語マニュアルを見ても同じ記述がされている。(2010/12/14日現在)
http://www.smarty.net/docs/en/variable.default.modifiers.tpl
This is an array of modifiers to implicitly apply to every variable in a template. For example, to HTML-escape every variable by default, use array(‘escape:”htmlall”‘). To make a variable exempt from default modifiers, pass the special smarty modifier with a parameter value of nodefaults modifier to it, such as {$var|smarty:nodefaults}.

【2011年2月20日追記】

英語版のマニュアルにnofilterの記述がされたようです。(コメントありがとうございます)

http://www.smarty.net/docs/en/variable.default.modifiers.tpl

This is an array of modifiers to implicitly apply to every variable in a template. For example, to HTML-escape every variable by default, use array(‘escape:”htmlall”‘). To make a variable exempt from default modifiers, add the ‘nofilter’ attribute to the output tag such as {$var nofilter}.

Smartyのデバッグモードをon($smarty->debugging = true;)にするも真っ白の画面は変わらず。

結局中身を解析していき、
sysplugins/smarty_internal_template.php

public function compileTemplateSource ()
内で例外がthrowされている箇所を発見。
エラーメッセージは
『Syntax Error in template “/DIRPASS/tpl/html/index.tpl”  on line 17 “{$yahoo_link|smarty:nodefaults}<br />” unknown modifier “smarty”』
だった。
「どういうこっちゃ?」と思いながらも解析を続けると、
sysplugins/smarty_internal_compile_private_print_expression.php
で「nofilter」の記述を発見
{$yahoo_link nofilter}<br />
を試したところ上手く行きました。

・・・ということは、SmartyのVer2を使っていて、かつ$smarty->default_modifiers = array(‘escape:”html”‘);を指定していて、かつ、テンプレートで|smarty:nodefaultsが使われている場合に、そのままSmartyをVer3には出来ないという事ですね。

ここくらいは|smarty:nodefaultsで下位互換持たせても良いと思うんだけれど、デフォルトでarray(“escape:’html'”);を指定する人の方が少ないのかな?

【関連記事】
Smarty3で$smarty->default_modifiers[] = ‘escape:”html”‘;指定時のnl2brの書き方

カテゴリー: PHP, 開発

Leave a comment

コメントフィード3 Comments

  1. Takaaki Kasai

    Smary3の英語マニュアルにはnofilterの記述が反映されたようですよ。
    http://www.smarty.net/docs/ja/variable.default.modifiers.tpl

  2. Takaaki Kasai

    ↑失礼しました、日本語のほうのリンク貼ってました。こっちです。
    http://www.smarty.net/docs/en/variable.default.modifiers.tpl

  3. Nakatani

    Takaaki Kasaiさん
    コメントありがとうございます。
    記事の内容修正しました。

Leave a comment

コメントは承認待ちです。表示されるまでしばらく時間がかかるかもしれません。

Feed

http://blog.yume-dia.jp / Smarty3で$smarty->default_modifiers = array(“escape:’html’”);を指定した場合の|smarty:nodefaults指定方法