CakePHP2.0で携帯用ビューの文字コード変換
[追記:2012/03/09 14:30]
AppHelperに記述していたのは誤りでした。申し訳ないです。
AppHelperに書いてしまうと、呼び出されたヘルパの数だけcallbackメソッドが実行されるため、新しくEncodingHelperを作り、
それをAppControllerの$helpersに追加するほうが良いです。
以下のコードも書き換えました。
2.1でも問題無く動きます。
AppControllerのbeforeFilterでob_startしてafterFilterでmb_convert_encodingとかしてた記事を1.1とか1.2系の時に見てから1系は全部それで事無きを得てたんですが、なんかどうも2.0でうまく動いてなかったので公式マニュアル読みあさってたらViewとかHelperでやれやゴルァって書いてあったからその通りにしてみました。
MHelperComponentは独自コンポーネントです。
isSjisAgent()は、変換すべきかの真偽値を返すメソッド。
App/View/Helper/EncodingHelper.php
<?php App::uses('AppHelper', 'View/Helper'); App::uses('MHelperComponent', 'Controller/Component'); class EncodingHelper extends AppHelper { public function afterLayout($viewFile) { parent::afterLayout($viewFile); $this->MHelper = new MHelperComponent(new ComponentCollection()); if ($this->MHelper->isSjisAgent()) { $this->_View->output = mb_convert_encoding($this->_View->output, 'SJIS-win', 'UTF-8'); mb_http_output("SJIS-win"); ini_set('mbstring.internal_encoding', 'SJIS-win'); ob_start("mb_output_handler"); } } } ?>
直接mb_convert_variables()で変換しようとすると
Indirect modification of overloaded property View::$output has no effect
というエラーが出るため、mb_convert_encoding()で変換したものを代入しています。
AppControllerのoutputはどこ行っちゃったんですかね…