После операции submit поля формы остаются заполненными. Это чревато тем что если обновить форму (F5) то данные будут отправлены еще раз. Как после операции submit очистить поля формы от данных?
@shurik_shink просто сделать redirect на страницу с формами, это обычная практика в вебе, к Yii не относится, протокол HTTP и браузеры так устроены.
Ну так типичная конструкция операции обновления на Yii: PHP: class SomeController extends Controller { public function actionSome() { $someModel = new SomeModel; if ($someModel->load(\Yii::$app->request->post()) && $someModel->doSomethingWithLoadedData()) { $this->redirect("/"); // Или $this->refresh(); } return $this->render("some", compact("someModel")); } } Т.е. если модель ввода успешно загрузилась и прошла валидацию, и вообще выполнила свою задачу, происходит редирект на другую страницу или саму на себя, но уже без данных, и таким образом двойной отправки не будет. Если произошла ошибка, то данные выводятся повторно и не теряются - это нам любезно обеспечивает Yii. Поскольку ошибочные данные всё равно никуда не записываются (если всё правильно сделано), то при ошибочных данных защита от повторной отправки не нужна.
В общем упрощенная рабочая схема PHP: public function actionF1() { $model = new MyModel(); if ($model->load(Yii::$app->request->post()) && $model->validate()){ //обработка данных ............................... //очистить поля $model = new MyModel(); //$this->refresh(); - то же работает } return $this->render('my_view',['model' => $model]); }
@shurik_shink, нет, схема не верная. Верную я вам написал. У вас хоть вы и стираете данные, при нажатии f5 всё равно будут отправлены данные, те же, что и в прошлый раз, они будут взяты не из формы, а из предыдущего запроса. А вот вызов refresh() даёт, в итоге PHP: header("Location: $_SERVER[REQUEST_URI]"); При этом происходит повторная загрузка страницы, но уже методом $_GET и без данных. И обработку данных лучше тоже в модель вынести (у меня это метод SomeModel::doSomethingWithLoadedData()), не надо с данными в контроллере работать.