Codeigniter で超簡易的なモバイルページ出力をする
モバイルページ作ってますかー!
私は「いや、これモバイルっていうか…」というほどのページしか作ってこなかったので「簡易」となっております。どこがどう簡易なのか、というと「絵文字対応してない」「セッションとか使わない」という超がつくほど簡易的なものです。
やっている事は
- ビューの読み込みを切り替える
- 文字コードを変換する
- 全角文字を半角文字に変換する
といった程度のものです。
私は、これらを実現するために フック(フック – フレームワークコアの拡張) を使っています。
簡易的なものなので、ちゃっちゃと行きましょう。
まずは application/config/hook.php に設定。
$hook['post_controller_constructor'][] = array(
'class' => 'Mobile',
'function' => 'view_set',
'filename' => 'Mobile.php',
'filepath' => 'hooks'
);
$hook['display_override'][] = array(
'class' => 'Mobile',
'function' => 'display',
'filename' => 'Mobile.php',
'filepath' => 'hooks'
);
hook に追加しているのは、2点。 post_controller_constructor というポイントでは、 view の読込先ディレクトリを書き換え、 display_override では文字コードの変換などを行っています。
呼びだされる、 Mobile.php は /application/hooks/ に保存します。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Mobile {
function Mobile()
{
$this->ci =& get_instance();
$this->ci->load->library('user_agent');
}
function view_set()
{
if ($this->ci->agent->is_mobile())
{
$this->ci->load->_ci_view_path .= 'mobile/';
}
}
function display()
{
if ($this->ci->agent->is_mobile())
{
$buffer = $this->ci->output->get_output();
$buffer = preg_replace("/\n/", '', $buffer);
$buffer = mb_convert_kana($buffer, 'aks', "UTF-8");
$buffer = mb_convert_encoding($buffer, 'SJIS', $this->ci->config->item('charset'));
header("Content-type: text/html; charset=Shift_JIS;");
echo $buffer;
}
else
{
echo $this->ci->output->get_output();
}
}
}
ユーザエージェントクラスを呼び、パソコンからのアクセスか、モバイルからのアクセスかの判断を行っています。モバイルからのアクセスと判断されると、既存の view ディレクトリに mobile という指定を付け加えます。コントローラーで以下のように「home」を指定した場合、
$this->load->view("home");
- パソコンの場合:
- /application/views/home.php
- モバイルの場合:
- /application/views/mobile/home.php
それぞれ読み込まれるようになります。
さらに、出力には以下の通り変換を行っています。
$buffer = preg_replace("/\n/", '', $buffer);
$buffer = mb_convert_kana($buffer, 'aks', "UTF-8");
$buffer = mb_convert_encoding($buffer, 'SJIS', $this->ci->config->item('charset'));
改行をなくし、全角の英数字・カタカナを半角に変換、文字コードを Shift-JIS に変換し出力しています。
徐々に機能的にも増強していきたいなあ、と思っております m(_._)m