控制器中的操作会从数据库生成下一个ID,并将其显示在屏幕上作为参考。如果用户单击刷新,如何阻止再次调用操作。
答案 0 :(得分:3)
使用Zend Framework的post-redirect-get模式通常会将表单的操作留空(因此它会自行发布),然后在您不想再次显示表单时重定向(所以成功时)。
public function newAction() {
$form = new Form_Foo();
if($this->_request->isPost()) {
if($form->isValid($this->_request->getPost()) {
//save or whatever
return $this->_redirect('path/to/success');
}
// else fall through
}
$this->view->form = $form;
}
答案 1 :(得分:3)
if ($this->isPost()) {
// Check validation
if ($error) {
$dataToMove = array();
// $dataToMove is array that you want to pass with redirect
// It can be an array of errors or form data that user has entered
// Use FlashMessenger helper to pass data to redirection via Zend_Session
$this->_helper->getHelper('FlashMessenger')->addMessage($dataToMove);
// And redirect page to form url
$this->_helper->getHelper('Redirector')->goToUrl('/form/url/');
}
// If not posted, get data from FlashMessenger
$data = $this->_helper->getHelper('FlashMessenger')->getMessages();
// And assign to view or make that you want
$this->view->formData = $data;
答案 2 :(得分:1)
虽然这是较老的帖子,但人们仍然会来这里寻求答案,所以让我多一点帮助。
重定向表单非常有用,但我们仍然没有阻止peple点击后退按钮并重新提交。
解决方案是将表单显示为弹出窗口并在完成后使其消失(使用jquery轻松完成)或为每个事务生成唯一ID并检查以前是否使用了id。 请参阅文章:http://www.boutell.com/newfaq/creating/stoprefresh.html
希望它有所帮助。
答案 3 :(得分:0)
您可以通过实施302重定向
来实现此目的header('HTTP/1.1 302 Found');
header('Location: displayId.php?id=5');
die();
假设你有这些页面
Form.php 仅显示表单并通过POST将数据发送到 processForm.php 。 在 processForm.php 中,您可以解析数据并将重定向发送到 displayId.php ,其中包含您要在GET参数中显示的ID。
这样,当用户刷新页面(displayId.php)时,表单数据不会再次处理。
答案 4 :(得分:0)
我知道你在Zend Framework中尝试这样做,但我只是说我正在使用相同的功能。只是把所有东西都搬到了ZF,我很失望地看到这个功能没有内置。
我曾经将每个表单提交给process.php,它处理所有GET,POST请求,然后保存结果(如错误和成功消息)并将您重定向到新位置。
如果设置了$ _SESSION ['post_data'],我会$ _POST = $ _SESSION ['post_data'];然后将其从会话中删除。
这很好但现在我在ZF需要相同的东西:D我说...有点失望因为我不相信任何人想要一个对话框出现询问重新提交数据..到底是做什么的这对你的最终用户意味着什么?什么!