2013-04-29 58 views
3

我正在編寫一個應用程序,驅動器在多個路由器中執行配置命令。 這裏是它是如何設計:多個瀏覽器選項卡和「後退」按鈕與PHP

Page 1   Page 2   Page 3            
+--------+  +--------+  +--------+ 
| data | PRG | data | PRG | steps | 
| enter |------->| review |------->| exec |---+ 
| page |  | page |  | page | | 
+--------+  +--------+  +--------+ | Ajax 
             ^  | 
             |  | 
             +--------+ 
  1. 用戶在第一頁上填寫表單。
  2. 系統獲取更多數據並將其顯示在第二頁上以另一種形式查看。
  3. 使用Ajax請求從第三頁執行配置步驟。

我通過uniqid()生成一個ID並將其放入表單中的隱藏元素來處理多個瀏覽器選項卡/窗口。每個標籤/窗口的數據存儲在$_SESSION[$ID]中。 Post-Redirect-Get用於擺脫煩人的表單重新提交。

挑戰在於,當用戶在瀏覽器中點擊「返回」按鈕時,會生成一個新的ID。這會導致$_SESSION和Web表單不同步。我打算使用粘性表單來使應用程序像嚮導一樣工作,但這需要ID在標籤/窗口存在期間保持不變。

你能幫我找出我怎麼區分「返回」按鈕點擊打開一個新標籤?

謝謝! PN

+2

你不能,不可靠的反正。有些方法可以在離開頁面時檢測「卸載」事件,但它們並不標準化,也不可靠。 – 2013-04-29 14:40:02

+1

好的,這有助於:)因爲可靠性很重要。我可能需要考慮並提出一個更好的設計來消除這個要求。謝謝! – pn8830 2013-04-29 14:45:28

+0

除非你有一個zillion字段或非常大的數據,隱藏的表單字段會將數據綁定到特定的選項卡/窗口而不需要服務器端的同步。 – 2013-04-29 14:46:08

回答

0

如果您根據用戶訪問的順序爲頁面編號並在每頁底部聲明會話var值,您可以檢測它們來自哪裏(例如點擊返回按鈕)。

page 1 = data enter page : $_SESSION['last_page'] = 1; 

page 2 = data review page : $_SESSION['last_page'] = 2; 

page 3 = steps exec page : $_SESSION['last_page'] = 3; 

而且比較,如果他們從擊中像一個條件後退按鈕來:

#on data enter page 1 - checking if user came from data review page 2  
if($_SESSION['last_page'] > 1){ 
     #USER HIT BACK BUTTON - don't re-declare session id 
    } 
+0

感謝您的意見。只有一個選項卡/窗口打開時,這很有效。我會解釋一下,我無法弄清楚如何在不過度複雜的情況下解決問題。由於$ _SESSION對於在一個選項卡中導航的所有瀏覽器選項卡都會覆蓋其他選項卡的會話數據(如果沒有提供處理該選項的機制),因此是常見的。我想出了最簡單的解決方案,即爲每個「事務」(每頁導航)分配唯一的ID。點擊後退按鈕生成一個新的ID,就像我剛剛打開一個全新的標籤。 – pn8830 2013-04-29 19:41:41