2013-04-29 64 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