携帯とPC振り分け&別Controller Class使用

同一サイトで、携帯とPCの振り分けを実装してみました


1.URL
定番ですが、
 m/controller/actionだと携帯
 controller/actionだとPC
2.携帯とPCで、一部別のコントローラーを使いたい
 基本レイアウト設定や、認証、ドコモguid=ON、絵文字や文字コードの処理など、携帯だけorPCだけ発生する処理があるので。
3.携帯側にPCからmobileURLにアクセスした場合は、PCに飛ばしたい
 逆は可(笑)
 携帯であるかどうかのチェックは、とりあえずUserAgentで行なう
  UA(携帯かどうか)チェックはPEARライブラリ使用。


参考サイトあちこちめぐって考え、以下の通りになりました


app/controller/app_controller.php

<?php
/**
 * 独自App Contoroller
 */

App::import('Vendor', 'pear_ini');
App::import('Vendor', 'Net_UserAgent_Mobile', array('file' => 'Net' . DS . 'UserAgent' . DS . 'Mobile.php'));

/**
 * PC/携帯共通
 */
// 携帯チェック
$this->agent = &Net_UserAgent_Mobile::factory();
if (!$this->agent->isNonMobile()) {
        Configure::write('mobile', 1);
}
class AppController extends Controller 
{
        function __construct()
        {
                parent::__construct();

        }
}

// AppControllerを携帯とPCで振り分け
if (Configure::read('mobile')) {
        class ModuleController extends MobileAppController
        {
        }
} else {
        class ModuleController extends PcAppController
        {
        }
}

/**
 * 携帯用AppController
 */
class MobileAppController extends AppController
{
        function __construct ()
        {
                parent::__construct();

        }

        function beforeFilter()
        {
                parent::beforeFilter();

        }

        function beforeRender()
        {
                parent::beforeRender();

        }
}

/**
 * PC用AppController
 */
class PcAppController extends AppController
{

        function beforeFilter()
        {
                parent::beforeFilter();

                // 携帯用アクションへのアクセスはPC用に変更
                if (isset($this->params["prefix"]) && $this->params["prefix"] == "mobile") {
                        $pc_url = substr_replace($this->params["url"]["url"], "", 0, 2+strlen($this->params["controller"])+1);
                        $this->redirect($pc_url);
                }
        }
}

モデルごとのコントローラでは、

class MembersController extends ModuleController {

と設定

これで、携帯(UA)からアクセスした場合は自動的にMobileAppControllerを継承し、PCならPcAppControllerを継承する仕組み。
両方ともAppControllerを継承しているので、

・携帯だけの設定・処理はMobileAppController
・PCだけの設定・処理はPcAppController
・共通の設定・処理はAppController
 に記載でOK!


UAチェックが外に出てるのが不満。中に入れると、ModuleController振り分けのギミックが効かなくなってしまうのでこうしてますが・・・ここ改善できないかは、残件。


主な参考サイト
http://www.1x1.jp/blog/2008/04/cakephp_12_routing_prefix.html
http://sand-man.blog.so-net.ne.jp/2008-09-11


そしてふと。
・・・・・・管理画面もPC/携帯で分けれないだろうか・・・・