fc2ブログ

price-change:blog

色んな情報テンコモリ

CodeIgniter リクエスト値を内部文字コードに変換処理

PCサイトと携帯サイトを同じURLで運営してると、フォームで送信した場合、データの文字コードの問題が出てくると思います。それなら、統一してしましょうと頑張ってみた。

やり方は2通りあると思います。一つは、Inputライブラリの CI_Inputクラスを拡張する方法。もう一つは、コアファイルをいじることなくフレームワークの内部動作を変更する方法(フック)です。個人的には CI_Inputクラスをいじりたくないので、フックする方法で文字コード変換処理を実現させてみたいと思います。

まずは、application/config/config.php の設定値を変更。


$config['enable_hooks'] = TRUE;

続いて、application/config/hooks.php に以下のコードを追加。$hook['post_controller_constructor'] はコントローラがインスタンス化された直後で、メソッドの呼び出しが起こる前に呼ばれます。詳しくはフック - フレームワークコアの拡張で。


$hook['post_controller_constructor'] = array(
                                'class'    => 'ConvertEncode',
                                'function' => 'execute',
                                'filename' => 'ConvertEncode.php',
                                'filepath' => 'hooks'
                                );

んで、フックさせるクラスをapplication/hooks 内に設置します。


<?php
class ConvertEncode
{
	function execute()
	{
		$CI =& get_instance();
		$charset = $CI->config->item('charset');

		if ($CI->config->item('enable_query_strings')) $this->convert($_GET, $charset);
		$this->convert($_POST, $charset);
		$this->convert($_COOKIE, $charset);
	}


	function convert(&$data, $charset)
	{
		if (is_array($data))
		{
			foreach ($data as $key => $val)
			{
				if (is_array($val))
				{
					$this->convert($val, $charset);
				}
				else
				{
					$enc = mb_detect_encoding($val, "ASCII,JIS,UTF-8,EUC-JP,SJIS");
					$data[$key] = mb_convert_encoding($val, $charset, $enc);
				}
			}
		}

	}

}
?>

これでリクエスト値は application/config/config.php で設定された文字コードに変換されるはずです。多分。処理速度が気になる場合は、CI_Input クラスを拡張した方が良いかもしれません。


[追記] checkboxでフォーム送信するとconvertメソッドでエラーが出るので修正
スポンサーサイト



テーマ:PHP - ジャンル:コンピュータ

トラックバック

トラックバックURLはこちら
http://pricewave.blog110.fc2.com/tb.php/17-322920dc
この記事にトラックバックする(FC2ブログユーザー)