用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3039|回复: 3
收起左侧

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

[复制链接]
发表于 2011-12-8 00:29:18 | 显示全部楼层 |阅读模式
本帖最后由 huboo82 于 2011-12-24 14:53 编辑

从ST_blog获得的灵感。扩展Controller,在Controller的_construct方法中调用下面的方法
PHP复制代码
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
PHP复制代码
 
<?php  if ( ! 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动态切换视图(主题换换换?)
 楼主| 发表于 2011-12-8 00:31:21 | 显示全部楼层
本帖最后由 huboo82 于 2011-12-24 14:54 编辑

cookie 不能设置的问题已解决,需要设置过期时间。参见http://codeigniter.org.cn/forums/thread-11327-1-1.html
 楼主| 发表于 2011-12-8 00:33:26 | 显示全部楼层
FYI: mobile的测试在我的me722上可以正常换到mobile用的视图上。
 楼主| 发表于 2011-12-8 00:36:30 | 显示全部楼层
本帖最后由 huboo82 于 2011-12-8 00:37 编辑

这样扩展Controller以后,视图输出仍然用$this->load->view('index', $this->_data);
PHP复制代码
 
<?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);
        }
}
 
复制代码
沙发、藤椅、板凳全占了,哈哈

本版积分规则