class Index extends CI_Controller {
private $data = array();
private $content_data = array();
public function __construct() {
parent::__construct();
if (isset($_GET['m2w'])) {
$stw = switch_to_web();
}
if (isset($_GET['w2m'])) {
$stm = switch_to_mobile();
}
// load mobile or desktop view
}
// Called within an helper function
function switch_to_web() {
return set_cookie('load-web', 'true', '86500');
}
function switch_to_mobile() {
return delete_cookie('load-web');
}
function is_mobile() {
// return true;
$CI = & get_instance();
if ($CI->input->cookie('load-web'))
return false;
$CI->load->library('user_agent');
if ($CI->agent->is_mobile()) {
return true;
}else
return false;
}
我有上面的代码块来确定是加载移动视图还是 Web 视图。
预期执行顺序:
- 如果设置了 M2W,则设置 load-Web cookie(这是在调用 is_mobile 函数之前完成的
- is_mobile功能看到加载网络cookie已设置并加载桌面版本
实际执行顺序:
- 如果设置了 M2W,则调用加载网络 cookie 进行设置,但是is_mobile函数不会将其视为已设置,因此不会加载桌面版本
- Cookie 是在 is_mobile 函数返回 true 后设置的,我检查了我的浏览器 cookie 并观察到 cookie 实际上已设置,但未达到预期
我有什么不对的?
CI的cookie使用PHP的原生setcookie()方法。 Cookie 需要在 HTTP 标头中发送,然后才能在本机 $_COOKIE
变量中可用。
从 PHP 文档 :
设置完 cookie 后,可以在下一页加载时使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。
这是来自 CI 的cookie()
方法:
function cookie($index = '', $xss_clean = FALSE)
{
// Simply fetch from the $_COOKIE array and do XSS_Clean if needed.
return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
}
简而言之,您正确设置了 cookie,但在您下一次请求之前它不可用。 这都是因为新值不在数组$_COOKIE
。
您有多种选择来解决此问题。
- 可以扩展 CI_Input 类并修改
set_cookie
方法,以便将新值也添加到$_COOKIE
数组中。 - 您可以编辑
is_mobile
函数以检查$_GET['m2w']
值。(不仅仅是饼干。
个性,我认为第二个解决方案是最干净和最容易做到的,但我不知道你项目的全部范围。
希望这有帮助!