Есть ли способ в формах ZF2 предотвратить многократную отправку форм? Я проверил Captcha
а также CSRF
элемент с isValid()
функция, но они не предотвращают многократную отправку, особенно те, у которых кнопка обновления браузера
заранее спасибо
Да, есть плагин контроллера под названием PRG:
POST / REDIRECT / GET PLUGIN
Цитировать из официальных документов zf2:
Когда пользователь отправляет запрос POST (например, после отправки формы), его
браузер попытается защитить их от повторной отправки POST, взломав
кнопка назад, вызывая предупреждения браузера и всплывающие окна, а иногда
перепост формы. Вместо этого, при получении POST, мы должны хранить
данные в контейнере сеанса и перенаправить пользователя в GET
запрос.
http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin
Расширить дальше своими словами; при использовании этого плагина каждый раз, когда форма отправляется POST, переменные POST сохраняются в сессии, и пользователь перенаправляется либо на другой маршрут, либо просто на тот же маршрут (обновление). Переменные формы затем доступны через плагин PRG в виде простого массива, имитирующего исходный массив POST. Это предотвратит публикацию ФОРМЫ несколько раз.
Использование (из документов ZF2):
// Pass in the route/url you want to redirect to after the POST
$prg = $this->prg('/user/register', true);
if ($prg instanceof \Zend\Http\PhpEnvironment\Response) {
// returned a response to redirect us
return $prg;
} elseif ($prg === false) {
// this wasn't a POST request, but there were no params in the flash messenger
// probably this is the first time the form was loaded
return array('form' => $myForm);
}
// $prg is an array containing the POST params from the previous request
$form->setData($prg);
// ... your form processing code here
Других решений пока нет …