2014.08.28
codeigniterで、PC版とスマフォ版のテンプレートを自動で振分ける方法
スマフォ版とPC版のテンプレートを切り替えるために、毎回コントローラでユーザーエージェントをチェックして振り分け処理が面倒になり
$this->load->view();を指定すると内部で自動にPCフォルダ内のview、スマフォフォルダ内のviewを表示するように対応してみました。
loadクラスを拡張したクラスで振り分け処理を行う
前回、headerfooterをloadで設定する方法で行った延長で、以下のようにMY_Loader クラスを作成します。class MY_Loader extends CI_Loader { function __construct(){ parent::__construct(); } // PC版、スマフォ版ともに同じviewを使いたい場合はこの関数を呼び出す public function done_common_view () { $this->done_common_view = true; } public function view($view, $vars = array(), $return = FALSE) { $ci =& get_instance(); if($ci->agent->is_mobile()) { $this->header_path = APPPATH . "views/sp/header.php"; $this->footer_path = APPPATH . "views/sp/footer.php"; } else { $this->header_path = APPPATH . "views/pc/header.php"; $this->footer_path = APPPATH . "views/pc/footer.php"; } $class = $ci->router->fetch_class(); // Get class $action = $ci->router->fetch_method(); // Get action // 共通headerを読み込まない処理をいれる if(strpos($action, 'ajax') !== FALSE || $class == "static") { } else{ $header = $this->_ci_load(array('_ci_path' => $this->header_path, '_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); } // ボディ if($this->done_common_view) { //共通の場合はviewsフォルダ以下に置く $body = $this->_ci_load(array('_ci_view' => "$view", '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); } elseif($ci->agent->is_mobile()) { //スマフォ版の場合はviews/sp/フォルダ以下に置く $body = $this->_ci_load(array('_ci_view' => "sp/$view", '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); } else { //PC版の場合はviews/pc/フォルダ以下に置く $body = $this->_ci_load(array('_ci_view' => "pc/$view", '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); } // 共通footerを読み込まない処理をいれる if(strpos($action, 'ajax') !== FALSE || $class == "static") { } else{ $footer = $this->_ci_load(array('_ci_path' => $this->footer_path, '_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); } if($return) { return $body; } } } ?>使い方は、$this->load->view(“welcome”);と指定するとPC版はapplication/views/pc/welcome.php スマフォ版はapplication/views/sp/welcome.phpのビューを読み込みます。 また、$this->load->done_common_view();をviewを呼び出す手前に呼び出すと、application/views/welcome.phpのビューを読み込みます。