CakePHPで携帯サイトを作成する

| コメント(0) | トラックバック(0)
前回携帯サイトを作った方法だと、CakePHPのバージョンアップによって動かなくなってしまっていたので、新しい方法で作った覚書を残していきます。
今回は「CakePHP1.2ガイドブック」の携帯サイトを作成するを参考に作っていっています。
この方法だとcakeのバージョンによって動かなくなることは無いと思いますが、一応バージョンは1.2.3.8166で試してみました。
内容はほぼそのままなのですが、自分が分かりやすいようにコメントを付け加えていってます。
1./config/routes.phpにprefixルーティンを設定する。
Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile', 'mobile' => true));
urlで/m/コントローラ/アクションという感じにアクセスされるとコントローラーの「mobile_アクション名」が呼び出されるようになります。


2.Mobileコンポーネントを作ります
内容は次のような内容です。
class MobileComponent extends Object{
	//prefixルーティンにmobileが入っていたらレイアウトにmobileを使うという処理を入れておきます
    function beforeRender($controller){
    	if (!empty($controller->params['prefix']) && $controller->params['prefix'] == 'mobile'){
    		$controller->layout = $controller->params['prefix'];
    	}
    }

	//自クラスのgetUrl()関数を呼ぶ
    function beforeRedirect(&$controller, $url, $status = null, $exit = true){
    	return MobileComponent::getUrl($controller->params, $url);
    }
    
    //prefixルーティンにmobileが入っていたらURLのGET情報にセッションIDをつけて/mでURLがなっていなかったら/mを付加しておく
    function getUrl($params, $url){
    	if (!empty($params['prefix']) && $params['prefix'] == 'mobile'){
    		$sessionName = session_name();
    		$sessionId = session_id();
    		
    		if (is_array($url)){
    			$url[$params['prefix']] = true;
    			$url['?'] = array($sessionName =>$sessionId);
    		}elseif(is_string($url)){
    			if (!preg_match("#^http[s]?://#", $url)){
    				$prefix = preg_match("#^/m/#", $url) ? '' : '/m';
    				$url = sprintf("%s%s?%s=%s", $prefix, $url, $sessionName, $sessionId);
    			}
    		}
    	}
    	return $url;
    }
    
    //prefixルーティンにmobileが入っていたら自クラスのconvertToInternal()関数を呼ぶ
    function initialize(&$controller){
    	if (!empty($controller->params['prefix']) && $controller->params['prefix'] == 'mobile'){
    		MobileComponent::convertToInternal($controller->params);
    	}
    }
    
    //エンコーディングをUTF-8にして「半角カタカナ」を「全角カタカナ」に変換し、「半角」を「全角」に変換したのを返す
    function convertToInternal(&$value){
    	if (is_null($value)){
    		return;
    	}elseif(is_array($value) || is_object($value)){
    		array_walk_recursive($value, array('MobileComponent','convertToInternal'));
    	}else{
			$value = mb_convert_encoding($value, 'UTF-8', 'sjis-win');
			$value = mb_convert_kana($value, 'KVa', 'UTF-8');
    	}
    }
}

3.Mobileヘルパーを作ります
内容は以下の通りです。
class MobileHelper extends AppHelper{
	//prefixルーティンにmobileが入っていたら 「全角」を「半角」に変換し「全角カタカナ」を「半角カタカナ」に変換しエンコーディングをShift_JISにする。
	function afterLayout(){
		if (!empty($this->params['prefix']) && $this->params['prefix'] == 'mobile'){
			$view =& ClassRegistry::getObject('view');
			
			$view->output = mb_convert_kana($view->output, 'rak', 'UTF-8');
			$view->output = mb_convert_encoding($view->output, 'sjis-win', 'UTF-8');
			
			header ("Content-Type: text/html; charset=Shift_JIS");
		}
	}
}

4.コントローラーでMobileコンポーネントとMobileヘルパーを呼び出しておきます
class XXXXXController extends AppController{
    var $components = array('Mobile');
    var $helpers = array('Mobile');
}

5.コントローラーで携帯用のアクションを作る
mobile_というアクション名にしてその関数内でPC用のアクションを呼んでおく
    //--------------------------------------------------------------------------------
    //一覧ページ
    //--------------------------------------------------------------------------------
    function index() {
		//PC用の処理
    }

    //--------------------------------------------------------------------------------
    //携帯用一覧ページ
    //--------------------------------------------------------------------------------
    function mobile_index() {
    	$this->index();
    }

6./views/layoutに携帯用のテンプレートmobile.phpを作っておく。

7.コントローラーに合わせてviewsにmobile_の携帯用のviewを作っておく

8.app_helper.phpを作っておく
内容はviewで入力された$html->url('')で入れられたURLを先に作ったMobileコンポーネントのgetUrl()を呼んで返ってきったURLに置き換える
App::import('Component', 'Mobile');

class AppHelper extends Helper{
    function url($url = null, $full = false) {
    	return parent::url(MobileComponent::getUrl($this->params, $url), $full);
    }
}

トラックバック(0)

このブログ記事を参照しているブログ一覧: CakePHPで携帯サイトを作成する

このブログ記事に対するトラックバックURL: http://www.okushin.co.jp/mt_co_jp/mt-tb.cgi/65

コメントする