Symfony1.4系でモバイルページをSJIS変換

2011年5月13日 オフ 投稿者: KYO
Table of Contents

そろそろモバイルページもutf8などへ対応完了しているんですが、やはりモバイルページとなるとSJISでの作成になる(もうこんなことしなくていいのかもしれないけれど)。
Smartyの場合であれば、output_filterで簡単。
Symfonyにもあるんじゃ?と調べたら、やはりありました。
拾い物をやや加工してますが、メモとして残しておきます。

フィルタを作成。
[shell]
$ vim lib/filter/MobileFilter.php
[/shell]
[php]

<?php

/**

* モバイル用文字コード変換フィルタ

*

* 文字コード変換(mb_convert_encoding)と合わせて、

* 半角化(mb_convert_kana)も実行

*

* @package: MobileFilter

* @author: $Aurh$

* @version: 1.0

* @revision: $Rev$

*

**/

 

// require

require_once (‘Net/UserAgent/Mobile.php’);

 

class MobileFilter extends sfFilter{

 

/**

* フィルタ

*

* @param filterChan

*

**/

public function execute($filterChain = null)

{

if ($this->isFirstCall()){

 

// error出力設定

$er=error_reporting();

if ($er > E_STRICT){

error_reporting($er – E_STRICT );

}

 

// Net::UserAgent::Mobile のインスタンスをセッションへ保存

//$userAgent = &Net_UserAgent_Mobile::factory();

//$this->getContext()->getRequest()->setAttribute(‘userAgent’, $userAgent);

 

// パラメータのエンコーディング変換

// sfConfig::set(‘sf_charset’,”shift_jis”);

sfConfig::set(‘sf_charset’,”UTF-8″);

$this->encodingParams(‘SJIS-win’,’UTF-8′);

 

mb_internal_encoding(‘UTF-8′);

 

// バッファ

ob_start(array($this,’m_output_handler’));

}

 

if ($filterChain) $filterChain->execute();

}

 

 

/**

* バッファのmb_convert_encoding()

*

* @param string $buffer

**/

function m_output_handler($buffer)

{

sfConfig::set(‘sf_charset’,”shift_jis”);

~~~~~~~~

// エラーログ出力

//error_log($buffer,3,”/var/www/morenavi/log/mobile.log”);

 

$buffer = mb_convert_kana($buffer, ‘ansk’);

return mb_convert_encoding($buffer,’SJIS-win’,’UTF-8′);

}

 

/**

* パラメータのエンコーディング

*

* @param $from sjis

* @param $to utf8

**/

protected function encodingParams($from,$to)

{

if ($to !=” && $from !=” && $from != $to ){

// パラメータフォルダ

$keys=sfContext::getInstance()->getRequest()->getParameterHolder()->getNames();

 

foreach ($keys as $key){

// パラメータフォルダの$keyに対応したvalue取得

$val=sfContext::getInstance()->getRequest()->getParameter($key);

 

//配列対応(2次元まで)

if (is_array($val)) {

foreach ($val as $key1 => $val1) {

if (is_array($val1)) {

foreach ($val1 as $key2 => $val2) {

$val[$key1][$key2] = mb_convert_encoding($val2,$to,$from);

}

} else {

$val[$key1] = mb_convert_encoding($val1,$to,$from);

}

}

} else {

$val = mb_convert_encoding($val,$to,$from);

}

 

// パラメータセット

sfContext::getInstance()->getRequest()->setParameter($key,$val);

}

}

}

}

[/php]

 

フィルタを登録。
[shell]
$ vim app/<>/config/filters.yml

MobileFilter:
class: MobileFilter
[/shell]

最後に、出力文字コードをview.ymlへ記載
[shell]
$ vim app/<>/config/view.yml

default:
http_metas:
content-type: text/html charset=Shift_JIS
[/shell]