0
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;
}

我有上面的代码块来确定是加载移动视图还是网络视图。

预期执行顺序:

  • 如果设置了 m2w,则设置 load-web cookie(这是在调用 is_mobile 函数之前完成的
  • is_mobile 函数看到 load-web cookie 已设置并加载桌面版本

实际执行顺序:

  • 如果设置了 m2w,则调用 load-web cookie 进行设置,但是 is_mobile 函数没有将其视为已设置,因此未加载桌面版本
  • 在 is_mobile 函数返回 true 后设置 cookie,我检查我的浏览器 cookie 并观察到 ​​cookie 实际设置但未按预期设置

我做错了什么?

4

1 回答 1

0

CI 的 cookie 使用 PHP 的原生setcookie()方法。Cookie 需要先在 HTTP 标头中发送,然后才能在本机$_COOKIE变量中使用。

来自 PHP 文档:

一旦设置了 cookie,就可以在下一页加载时使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。

这是cookie()来自 CI 的方法:

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']值。(不仅仅是饼干。)

个性,我认为第二种解决方案是最干净和最容易做到的,但我不知道您项目的全部范围。

希望这可以帮助!

于 2013-02-03T13:14:45.883 回答