2013-02-03 57 views
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視圖。CodeIgniter中的執行順序

預期執行的順序:

  • 如果M2W設置,設置負載網絡Cookie(這是IS_MOBILE函數被調用
  • IS_MOBILE功能做過認爲負載網絡Cookie已定並加載桌面版本

執行的實際順序:

  • 如果M2W是set,load-web cookie被調用來設置,但是is_mobile函數沒有看到它的設置,因此桌面版本沒有加載
  • 在is_mobile函數返回true之後設置cookie,我檢查我的瀏覽器cookie並觀察到cookie實際上已設置,但沒有在預期的時間

我沒有正確地做什麼?

+0

您正在展示課程,但我們也需要看看過程。 –

+0

只是一個想法,但你可以嘗試一個響應式設計,而不必爲此而煩惱。同樣,當每個瀏覽器都嘗試幾乎相同並基本無法區分時,通過使用者檢測是毫無意義的。 – Amelia

+0

@mamdouh請求被定向到索引。PHP文件加載必要的代碼點火器庫並加載相應的控制器,我使用codeigniter框架,在這種情況下,構造函數幾乎是入口點,除非我不明白你的意思。 – kayfun

回答

0

CI的Cookie使用PHP的原生setcookie()方法。 Cookies在本地$_COOKIE變量中可用之前需要在HTTP標頭中發送。

從PHP文檔:

一旦餅乾已經確定,就可以把他們用$ _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']的值。 (不只是cookie。)

個性,我認爲第二個解決方案是最乾淨和最容易做的,但我不知道你的項目的全部範圍。

希望這會有所幫助!

+0

非常感謝,這確實是問題,我強制設置cookie後立即重定向,什麼做你想到這種方法? – kayfun

+0

這絕對是一個很好的方法,尤其是在您從手機切換到桌面或反之亦然的環境中。 –