贡献一段用以根据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-24 14:54 编辑
cookie 不能设置的问题已解决,需要设置过期时间。参见http://codeigniter.org.cn/forums/thread-11327-1-1.html FYI: mobile的测试在我的me722上可以正常换到mobile用的视图上。 本帖最后由 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]