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

上記のコード ブロックを使用して、モバイル ビューと Web ビューのどちらを読み込むかを決定します。

予想される実行順序:

  • 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は、ネイティブ$_COOKIE変数で使用できるようになる前に、HTTPヘッダーで送信する必要があります。

PHPドキュメントから:

Cookieが設定されると、次のページの読み込み時に$_COOKIEまたは$HTTP_COOKIE_VARS配列を使用してCookieにアクセスできます。

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']値を確認することもできます。(クッキーだけではありません。)

動産、私は2番目の解決策が最もクリーンで最も簡単だと思いますが、私はあなたのプロジェクトの全範囲を知りません。

お役に立てれば!

于 2013-02-03T13:14:45.883 に答える