edo1z blog

プログラミングなどに関するブログです

cakePHP Routing

http://book.cakephp.org/2.0/en/development/routing.html

下記のような感じでルーティングができる。:hogeとやると、名前がつけられる。第一引数にURLのパターン、第二引数にアクション先を指定する。第二引数は、controller、action以外に、パラメタも指定できる。第三引数は$this->request->params['pass']を設定できるし、それに:hogeとかでつけた名前も使えるし、その:hogeの条件も正規表現で指定できる。といったなんとなくの理解しかできていないが、便利である。

$areas = 'oosaka|tokyo|hakata';
Router::connect('/:area',
    array('controller' => 'base', 'action' => 'area_top'),
    array(
        'pass' => array('area'),
        'area' => $areas
    )
);

これは、http://hoge.com/tokyoとか、http://hoge.com/tokyo/とかにアクセスすると、baseコントローラのarea_topアクションに、passとしてtokyoをもってアクセスする。

Router::connect('/s/:area/shop:id',
    array('controller' => 'shops', 'action' => 'view', 'mode' => 's'),
    array(
         'pass' => array('id'),
         'area' => $areas
    )
);

これは、http://hoge.com/s/tokyo/shop97とかにアクセスすると、shopsコントローラの、viewアクションに、$this->request->params['mode'] = 's'と、$this->request->params['pass'][0] = '97'をもってアクセスする。

pagineteを使うときに、次のページとかがrouting設定を維持しない場合は、下記のような感じでオプションに設定する。

$this->Paginator->options(array('url' => array('mode' => 's')));

ちなみに、上記URLの/s/というのはスマホ用URLにつくやつでありまして、スマホ対応をcakePHPだけで対応するつもりで下記をつくってみた。 user_agentチェックはテストしてないし、いい感じかまだ分からない。サイトで調べてcakePHPにしてみた。

public function beforeFilter(){
    $this->set_display_mode();
}

/**
 * レイアウトのスマホ対応
 */
public function set_display_mode(){
    if(isset($this->params['mode']) && $this->params['mode'] == 's'){
        $this->layout .= '_s';
        $this->view .= '_s';
    }
}

/**
 * スマホからのアクセスで、PC用ページにアクセスしている場合に
 * スマホ用ページにリダイレクトさせる関数
 */
public function check_smart_phone(){
    $ua = $this->request->header('User-Agent');
    if(!(isset($this->params['mode']) && $this->params['mode'] == 's')){
        if($this->check_agent($ua)){
            $url = str_replace($this->request->base, '/s', $this->request->here);
            $this->redirect($url);
        }
    }
}

/**
 * スマホからのアクセスかチェックする関数
 * @param $ua
 * @return bool
 */
private function check_agent($ua){
    if(
        (
            (
                (strpos($ua, 'iPhone') !== false) ||
                (strpos($ua,'iPod') !== false) ||
                (strpos($ua,'PDA') !== false) ||
                (strpos($ua, 'BkackBerry') !== false) ||
                (strpos($ua, 'Windows Phone') !== false)
            )
            &&
            strpos($ua, 'iPad') === false
        )
        ||
        (
            (strpos($ua, 'Android') !== false) &&
            (strpos($ua, 'Mobile') !== false)
        )
    ){
        return true;
    }
}