我在我的网站上使用CakePHP构建了一个联系表单。控制器逻辑如下:
<?php
class ContactController extends AppController
{
var $helpers = array ('Html','Form');
var $components = array ('Email','RequestHandler');
var $name = 'Contact';
function beforeFilter()
{
parent::beforeFilter();
$this->Auth->allow(array('*'));
}
function index()
{
if ($this->RequestHandler->isPost())
{
$this->Contact->set($this->data);
if ($this->Contact->validates())
{
$this->Email->to = '###';
$this->Email->subject = 'Contact message from ' . $this->data['Contact']['name'];
$this->Email->from = $this->data['Contact']['email'];
$this->Email->send($this->data['Contact']['message']);
$this->render('success');
}
}
}
}
?>
我想要做的是当用户提交表单时显示另一个视图文件,例如success.ctp
,但即使他们有新视图,他们也可以刷新页面并一次又一次地发送数据。我该如何制止......
有人可以帮忙吗?感谢
答案 0 :(得分:3)
处理完表单数据后,将它们重定向到同一个联系页面(以避免刷新问题)
如果您不知道,可以使用setFlash显示成功消息。但是如果你想以你想要的方式自定义它,你可以在Session中写一个变量来表示视图。
function index() { if ($this->RequestHandler->isPost()) { $this->Contact->set($this->data); if ($this->Contact->validates()) { $this->Email->to = '###'; $this->Email->subject = 'Contact message from ' . $this->data['Contact']['name']; $this->Email->from = $this->data['Contact']['email']; $this->Email->send($this->data['Contact']['message']); $this->Session->write('Contact.postmessage', true); $this->redirect(array('action'=>'index')); } } $this->Session->delete('Contact.postmessage'); }
在视图中:
if($this->Session->check('Contact.postmessage'){ // write out content of success.ctp }else{ // write out form }
答案 1 :(得分:0)
您可以尝试使用不到五分钟前发布的电子邮件查找计数的方法,或者弹出会话Flash消息,例如“抱歉,您只能每x分钟发布一次”
$this->Contact->find('count',array(
'conditions'=>array(
'email'=>$this->data['Contact'] ['email'],
'created <'=>date("Y-m-d H:i:s", strtotime('-5 minutes)));
答案 2 :(得分:0)
为了避免多次发送消息 - 放置会话值并根据是否放置该会话值来检查要呈现的视图。
例如在您的电子邮件中发送代码添加$this->Session->write('sent',1);
并在渲染时:if ($this->Session->check('sent')) $this->render('common_view'); else $this->render('alternate_view');
并且请确保在通过$this->redirect()
向自己发送电子邮件后重定向该页面。