その前にまず、携帯サイト用のindex.phpを作ってみる。
PC用のindex.phpをコピペしてindex_mobile.phpとか適当な名前にして保存。
ファイル中の/pc/の部分を/mobile/に書き換える。
後は、IndexControllerとそのviewテンプレートをやっぱりPCからコピペで持ってくる。
あとは、httpd.confなどのmod_rewriteの設定をindex.phpからindex_mobile.phpにすると
携帯用モジュールの一番シンプルな動作確認ができる。(この時点ではPCのブラウザで確認)
で、次に出力の文字コードをshift_jisにする。なんでShift_jisにするかっていうと、主要キャリアの文字コード対応状況上、それが一番無難だからだそうです。
詳しくは「携帯サイトの文字コードに気をつける」を参照。
ところで、このブログで書いたかどうかわかんないけど、僕は、開発に関わる文字コードはDBからファイルからすべてutf-8で統一してます。なので、必要な箇所だけ、shift_jsにしたいのです。
まず、viewテンプレートのmetaタグの部分をshift_jisにしてみる。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />を
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />に。
で、アクセスしてみると激しく文字化けしてるはず。まだ出力はutf-8でそれをshift_jisとして解釈しようとしてるのだから、あたりまえだね。
出力の文字コードを一括して変換するには、smartyのoutputfilterプラグインを使うと便利。
ということを「携帯サイトをUTF-8で出力するかShift_JISで出力するか」で知る。
こいつを作って。。。
function smarty_outputfilter_convert_encoding ($output, &$smarty) {SJIJ-WINの理由はここ。
return mb_convert_encoding($output, 'SJIS-WIN', 'UTF-8');
}
smartyで呼び出す。呼び出しタイミングは最終的には以下のようにした。
<?phpという感じに、フィルタをロードするメソッドをSmartyのラッパークラスに追加して。。
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
require_once('Smarty.class.php');
class Hoge_View_Smarty implements Zend_View_Interface {
/**
* Smarty object
* @var Smarty
*/
protected $_smarty;
~ 中略 ~
/**
* filterをロードします。
*
* @param string $name 処理するテンプレート
* @return string 出力結果
*/
public function loadFilter($filter, $name)
{
$this->_smarty->load_filter($filter, $name);
}
}
index_mobile.phpでさっき作ったメソッドを呼び出す。
~ 前略 ~
$config = new Zend_Config_Ini(dirname(__FILE__). '/config/application.ini', SITE_ENVIRONMENT);
$view = new Hoge_View_Smarty($config);
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewBasePathSpec(dirname(__FILE__) . '/modules/mobile/views/templates')
->setViewScriptPathSpec(':controller/:action.:suffix')
->setViewScriptPathNoControllerSpec(':action.:suffix')
->setViewSuffix('tpl');
$view->loadFilter('output', 'convert_encoding');
~ 後略 ~
と、この時点で文字化けがなくなった。
次はセッションかな。
コメントする