CakePHP Форма обратной связи - PullRequest
0 голосов
/ 24 июля 2011

Я создал контактную форму, используя 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 ]

3 голосов
/ 24 июля 2011

после обработки их данных формы перенаправьте их на ту же страницу контактов (чтобы избежать проблемы обновления)

Если вы не в курсе, вы можете установить Flash, чтобы показывать сообщение об успехе. Но если вы хотите настроить его так, как вам хочется, вы можете записать переменную в 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
  }
0 голосов
/ 25 июля 2011

Чтобы избежать отправки сообщения более чем один раз - поместите значение сеанса и проверьте, какой вид следует отображать в соответствии с тем, помещено ли это значение сеанса.например, к вашему коду отправки электронной почты добавьте $this->Session->write('sent',1);, а при рендеринге: if ($this->Session->check('sent')) $this->render('common_view'); else $this->render('alternate_view'); И, пожалуйста, убедитесь, что страница перенаправлена ​​после отправки электронной почты на себя через $this->redirect().

0 голосов
/ 24 июля 2011

Вы можете попробовать найти счетчик по опубликованному сообщению электронной почты менее пяти минут назад или открыть флэш-сообщение Session, например: «Извините, вы можете отправлять сообщения только каждые x минут»

$this->Contact->find('count',array(
                               'conditions'=>array(
                                       'email'=>$this->data['Contact'] ['email'],
                                        'created <'=>date("Y-m-d H:i:s", strtotime('-5 minutes)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...