huboo82 发表于 2011-12-8 00:29:18

贡献一段用以根据UA设置显示用视图的代码(换站点主题?)

本帖最后由 huboo82 于 2011-12-24 14:53 编辑

从ST_blog获得的灵感。扩展Controller,在Controller的_construct方法中调用下面的方法
class MY_Controller extends CI_Controller {
      
      protected $theme = 'default';
      protected $_data = array();

      public function __construct()
      {
                parent::__construct();
               
                // UA 检测及视图位置设置
                $this->set_view_path();
      }
      
      private function set_view_path()
      {
                $this->load->library('user_agent');
               
                $get_flavour = $this->input->get('flavour', TRUE);
                if($get_flavour && $get_flavour == 'mobile')
                        $this->input->set_cookie('flavour', 'mobile', 365 * 24 * 60 * 60);
                if($get_flavour && $get_flavour != 'mobile')
                        $this->input->set_cookie('flavour', 'mobile');
               
                $flavour = $get_flavour ? $get_flavour : $this->input->cookie('flavour', TRUE);
               
                // 初始化主题视图路径
                $this->theme = $this->config->item('site_theme') ? $this->config->item('site_theme') : $this->config->set_item('site_theme', $this->theme);
               
                // 如果检测到为移动设备或为手动设置为移动设备
                if($this->agent->is_mobile() OR ($flavour && $flavour == 'mobile'))
                        $theme_path = THEME_PATH . $this->theme . DIRECTORY_SEPARATOR . 'mobile' . DIRECTORY_SEPARATOR;
                else
                        $theme_path = THEME_PATH . $this->theme . DIRECTORY_SEPARATOR;
               
                $this->load->set_view_path($theme_path);
      }
}


上面用get获得flavour的方式来自于django-mobile,可以看这个站点的效果(www.web916.com)。如果flavour为mobile就切换到mobile用到的视图,这样可以在chrome里调试,或者ua检测到is_mobile也用$this->load->set_view_path($theme_path);来设置视图位置。
这个又要扩展一下Loader了,代码来源:http://pastebin.com/w258KkVu。

<?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Loader extends CI_Loader {
      
      protected $_ci_view_paths = array();
      
      public function __construct()
      {
                parent::__construct();
      }
      
      public function set_view_path($path)
      {
                $this->_ci_view_paths = array($path => TRUE);
      }
}

/* End of file: MY_Loader.php */
/* Location: ./application/core/MY_Loader.php */



以上扩展代码,我个人仅在2.10版CI上测试过,因为Loader中在CI2.0的时候还没有_ci_view_paths这个,只有_ci_view_path,一个s的不同。


记得扩展的Controller和Loader要放到application/core目录里。

多谢看完。{:soso_e142:}
weblog 链接地址:根据浏览器UA动态切换视图(主题换换换?)

huboo82 发表于 2011-12-8 00:31:21

本帖最后由 huboo82 于 2011-12-24 14:54 编辑

cookie 不能设置的问题已解决,需要设置过期时间。参见http://codeigniter.org.cn/forums/thread-11327-1-1.html

huboo82 发表于 2011-12-8 00:33:26

FYI: mobile的测试在我的me722上可以正常换到mobile用的视图上。

huboo82 发表于 2011-12-8 00:36:30

本帖最后由 huboo82 于 2011-12-8 00:37 编辑

这样扩展Controller以后,视图输出仍然用$this->load->view('index', $this->_data);

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Home extends MY_Controller {
      
      /**
         * 初始化控制器
         *
         */
      public function __construct()
      {
                parent::__construct();
      }
      
      /**
         * 默认入口
         *
         */
      public function index()
      {
               
                $this->load->view('index', $this->_data);
      }
}
沙发、藤椅、板凳全占了,哈哈
页: [1]
查看完整版本: 贡献一段用以根据UA设置显示用视图的代码(换站点主题?)