【问题标题】:Order of execution in CodeIgniterCodeIgniter 中的执行顺序
【发布时间】:2013-02-03 10:42:28
【问题描述】:
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 已实际设置但未按预期设置

我做错了什么?

【问题讨论】:

  • 您正在展示课程,但我们也需要查看过程。
  • 只是一个想法,但您可以尝试响应式设计,而不必为此烦恼。此外,如今,当每个浏览器都试图几乎相同并且基本上无法区分时,通过用户代理进行检测是毫无意义的。
  • @mamdouh 请求被定向到 index.php 文件,该文件加载必要的代码点火器库并加载相应的控制器,我使用的是 codeigniter 框架,在这种情况下,构造函数几乎是入口点除非我没有理解你所说的过程。
  • 不不不不 - 这不是必需的 "$CI = & get_instance();"当您扩展 CI 的控制器时。您只需使用 $this->
  • @david,我已编辑问题以表明这些功能是在帮助程序中实现的

标签: php codeigniter


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

  • 非常感谢,这确实是问题所在,我在设置 cookie 后立即强制重定向,您如何看待这种方法?
  • 这绝对是一个很好的方法,尤其是在您从移动设备切换到桌面设备或反之亦然的情况下。
猜你喜欢
  • 2012-09-23
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2013-11-15
  • 2019-07-18
  • 2020-03-13
相关资源
最近更新 更多