2010-02-01 52 views
1

我有一个CakePHP应用程序,其中有一个窗体对于甚至没有登录的访问者是可见的。如果他们没有登录提交窗体,它们会被重定向到一个登录页面,从那里我希望他们回到所有提交的表单数据的添加控制器。授权后再次发布数据

这可能吗?如果是,如何?

+0

Lemme澄清它,我有一些用户填写表单。但在此期间,由于会话超时,它们会被注销。当他们提交表单时,他们被重定向到登录页面,他们从表单提交的所有数据都将丢失。有没有办法阻止它使用CakePHP功能? (不是基本的PHP) – Mayank 2010-02-01 15:11:38

+0

可能不是。我对CakePHP不熟悉,但是如果在会话超时之前无法填写表单,则需要更长的会话超时时间。 – 2010-02-01 15:39:00

回答

4

关闭我的头顶,这样的事情应该工作:

function beforeFilter() { 
    // be sure to do this before any Auth or security checks 
    if ($this->RequestHandler->isPost() && $this->data) { 
     $this->Session->write('last_post_data', $this->data); 
    } 
} 

function add() { 
    if (!$this->data && $this->Session->check('last_post_data')) { 
     $this->data = $this->Session->read('last_post_data'); 
    } 
    $this->Session->delete('last_post_data'); 

    if ($this->data) { 
     // save as usual 
    } 
} 

只要确保妥善处理会话中保存的POST数据,或者稍后可能会破坏浩浩荡荡。实际上,您不仅应该将会话中的数据保存到会话中,而且还应该保存哪些操作($this->action$this->controller),并在重新使用操作中的数据之前检查该数据。可能还会对数据进行非常严格的暂停。

+0

这将是我会做的同样的事情。 – jpdelatorre 2010-02-02 10:09:14

1

我想你将不得不使用SESSION或做类似这样:

<input type="text" name="user" value="<?php echo $_POST['user'];?>"> 
<input type="password" name="password" value="<?php echo $_POST['password'];?>"> 

注意,上面我已经使用POST数组,但你也可以用蛋糕的数组,这是否有一。

1

登录之前为用户分配会话,并将数据存储在会话中。该会话可能具有一个属性loggedIn,该属性默认为false。

不要存储在cookie中的会话数据,虽然,保持服务器端:)

0

session_start();在窗体的顶部,和登录页面。在窗体的操作页面设置会话变量:

$_SESSION['name'] = $_POST['name']; 
$_SESSION['address'] = $_POST['address']; 
etc... 

在表单页面,说设定值以下:

<input type="text" name="name" id="name" value="<?php echo $_SESSION['name']; ?>" /> 
<input type="text" name="address" id="address" value="<?php echo $_SESSION['address']; ?>" /> 
etc... 
+0

这是处理会话的一般PHP方式,有没有办法用cakePHP来完成。它有很多帮手,但我不知道该怎么使用以及如何使用。 – Mayank 2010-02-01 14:50:26

+0

我可能会从这里开始。 http://book.cakephp.org/view/322/The-Cake-Session-Component – 2010-02-01 15:39:34

0

如果您只允许登录的用户访问表单,还可以使用保持会话活动的表单向页面添加定期AJAX请求。

window.setInterval(function(){ 
    jQuery.get("/url/to_page_that_does_nothing"); 
}, 600000); 

您还可以设置它,以便计时器仅在用户开始填写表单时才被激活。

免责声明:1)这使用jQuery 2)不如再次登录安全,但更快/更容易实现。