CakePHP联系表格

时间:2011-07-24 00:12:05

标签: php cakephp

我在我的网站上使用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,但即使他们有新视图,他们也可以刷新页面并一次又一次地发送数据。我该如何制止......

有人可以帮忙吗?感谢

3 个答案:

答案 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()向自己发送电子邮件后重定向该页面。