DEV

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;
}
}