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