久しぶりにCodeIgniterの内容
ソースを書こうかと思ったのですが、かなり多い。。。ので、概要のみ。
もう少ししたらSVNで見れるようになるので、その時に評価したい人はお願いします。
CodeIgniterでモバイルとPCを同じ用に管理し、セッションまで行う方法として。
まず、既出のmobileidクラス。これは、ユーザーエージェントを見て、EZ番号やらドコモのi-modeid等を取得するクラス。
これを使って、セッションクラスを用意しました。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * * @category * @package Session Class * @author KUNIHARU Tsujioka <kunitsuji@gmail.com> * @copyright Copyright (c) 2008 KUNIHARU Tsujioka <kunitsuji@gmail.com> * @copyright Copyright (c) 2006-2008 Usagi Project (URL:http://usagi-project.org) * @license New BSD License */ // ------------------------------------------------------------------------ class Session { public $CI; public $session_obj = NULL; public $session_type = 'CI'; private $_params = array(); /** * Session Constructor * * The constructor runs the session routines automatically * whenever the class is instantiated. */ function __construct($params = array()) { //どのセッションを使うかを判定する $this->CI = &get_instance(); $this->session_type = MYNETS_SESSION_TYPE; if ($params) { $this->_params = $params; } //session_objプロパティにオブジェクトをセットする $this->_run(); //print_r($this->session_obj); //exit; } private function _run() { //接続端末を判定する if ($this->CI->mobileid->is_mobile()) { //ドコモ以外をクッキーにするかどうか if (DOCOMO_ONLY_COOKIES == TRUE) { switch ($this->CI->mobileid->get_carrier()) { case 'docomo': if ($this->session_type == 'CI') { require_once APPPATH . 'libraries/session/mobile_ci_session.php'; $this->session_obj = new mobile_ci_session($this->_params); } else if ($this->session_type == 'PHP') { require_once APPPATH . 'libraries/session/php_session.php'; $this->session_obj = new php_session($this->_params); } break; default: require_once APPPATH . 'libraries/session/MYNETS_Session.php'; $this->session_obj = new MYNETS_Session($this->_params); break; } } else //すべてクッキーを使わない { if ($this->session_type == 'CI') { require_once APPPATH . 'libraries/session/mobile_ci_session.php'; $this->session_obj = new mobile_ci_session($this->_params); } else { require_once APPPATH . 'libraries/session/php_session.php'; $this->session_obj = new php_session($this->_params); } } } else { if ($this->session_type == 'PHP') { require_once APPPATH . 'libraries/session/php_session.php'; $this->session_obj = new php_session($this->_params); } else { require_once APPPATH . 'libraries/session/MYNETS_Session.php'; $this->session_obj = new MYNETS_Session($this->_params); } } } // -------------------------------------------------------------------- public function __call($func, $args) { if (method_exists($this->session_obj, $func)) { return call_user_func_array(array($this->session_obj, $func), $args); } else { show_error($func . " method not exists."); } } public function __set($func, $args) { if (property_exists($this->session_obj, $func)) { $this->session_obj->$func = $args; } else { show_error($func . " property not exists."); } } public function __get($func) { if (property_exists($this->session_obj, $func)) { return $this->session_obj->$func; } else { show_error($func . " property not exists."); } } } // END Session Class wrapper
こんな感じでラッパーを用意してみました。
で、application/libraryの下に
session/ディレクトリを用意。そこにそれぞれの処理ファイルを置いておきますです。
利用方法としては、
携帯で利用するかPCで利用しているかを判別。
PCで利用している場合、configでCIのセッションを利用するのかPHPセッションを利用するかを判定。
PHPセッションを使う場合はDBを使わずセッションファイルを使います。
CIのセッションを使う場合は、変数はDBに保存されます(Ver1.7.0以降なので)
次に、携帯の場合。
DOCOMO_ONLY_COOKIES
ドコモ以外はクッキーを使うかどうか。(定数名おかしいなぁ)
AUとソフトバンクはCIのセッションを使います。
携帯は全部クッキーを使わない場合
CIセッションを使うか、PHPセッションを使うかを判断します。
携帯でCIのセッションを使っても、CIで作成されるセッションIDとDBを使って行います。
ただし、携帯でCIセッションをつかってクッキーを使わない場合、自動的に
URLパラメータにCIのセッションIDが付与されてそれを取得してデータを管理します。
そのために、FORMのOPENやアンカータグのヘルパーもカスタマイズ。
モバイルの場合CIのセッションIDを取得するようになっています。
これで、接続端末を意識しないでヘルパーを使うことでPCでもモバイルでもセッション管理可能となりました。