Pocket
LINEで送る

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;
	}
}
Pocket
LINEで送る

カテゴリー: プログラミング

コメントください

関連記事

プログラミング

Go言語によるビットコインのフルノード実装btcdを調べる(2)

btcdを実行した際のプログラムの流れを最初から確認してみます。 se 続きを読む …

プログラミング

Go – leveldb

Goで使えるLevelDB。 syndtr/goleveldb ドキュ 続きを読む …

%d人のブロガーが「いいね」をつけました。