Smartyのアウトプットフィルタの使い方について質問です。


出力をShift-JISに変換したいと思い、
以下のソースを書いたファイル(outputfilter.sjis.php)Smartyプラグインに追加しました。
function smarty_outputfilter_sjis($output, &$smarty){
return mb_convert_encoding($output, 'SJIS', 'UTF-8');
}

実行用のファイル(index.php)には以下のように記述しました。
$smarty = new Smarty;
$smarty->compile_dir = 'templates_c';
$smarty->register_outputfilter('outputfilter_sjis');
$smarty->display('index.tpl');

しかし以下のようなエラーメッセージが表示されます。
「Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'outputfilter_sjis' was given in H:\htdocs\right-blog\test\smarty2\smarty\Smarty.class.php on line 1269」


$smarty->register_outputfilterをコメントアウトするとエラーにならないので
アウトプットフィルタの指定が間違っているのだと思いますが、修正方法がわかりません。
ご存じの方はアドバイスいただければと思います。
(Smartyのバージョンは2.6.26)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/07/04 17:03:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント60pt

$smarty->register_outputfilter('outputfilter_sjis');

上記の「register_outputfilter」の代わりに次のように「load_filter」かあるいは「$autoload_filters」を使用してください。

$smarty->load_filter('output', 'sjis'); // 'sjis'と名付けられたアウトプットフィルタを読み込む

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/api.l...


※テンプレートを格納したディレクトリ等の指定も忘れないでください。

$smarty->template_dir = '../templates/';


※「$smarty->plugins_dir[] = ''」で指定した自作用プラグインディレクトリに置いた場合は、自動で読み込まれるので「load_filter」等で読み込まなくても良いようです。

http://www.phppro.jp/school/smarty/vol10/1

※「register_outputfilter」を使用する場合は、同じファイルに記述するといいです。(この場合は、「function outputfilter_sjis($output, &$smarty)~」とします。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/advan...

id:kt26

※「register_outputfilter」を使用する場合は、同じファイルに記述するといいです。

なるほど。納得しました。register_outputfilterの指定は同じファイルに記述すれば有効なんですね。

2009/07/04 17:03:38
  • id:rouge_2008
    すみません。
    先ほどの回答に一部間違いがありました。

    「$smarty->plugins_dir[] = '';」で自作プラグイン用のディレクトリを指定した場合も、アウトプットフィルタを読み込む記述が必要です。
    ※記述がない場合は、UTF-8のままで出力されていました。
  • id:rouge_2008
    別ファイルにしたい場合は、「require_once」または「include_once」でファイルを読み込んで置けば大丈夫です。

    http://nyx.pu1.net/reference/loadfile/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません