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