久しぶりに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でもモバイルでもセッション管理可能となりました。