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

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

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

フィルタを作成。

$ vim lib/filter/MobileFilter.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);

}

}

}

}

 

フィルタを登録。

$ vim app/<>/config/filters.yml
...

MobileFilter:
class: MobileFilter

最後に、出力文字コードをview.ymlへ記載

$ vim app/<>/config/view.yml
...

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