携帯と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/携帯で分けれないだろうか・・・・