За последние 24 часа нас посетили 17293 программиста и 1289 роботов. Сейчас ищут 1582 программиста ...

как очистить поля ActiveForm после submit?

Тема в разделе "PHP для новичков", создана пользователем shurik_shink, 7 сен 2016.

  1. shurik_shink

    shurik_shink Новичок

    С нами с:
    17 май 2015
    Сообщения:
    79
    Симпатии:
    0
    После операции submit поля формы остаются заполненными. Это чревато тем что если обновить форму (F5) то данные будут отправлены еще раз.

    Как после операции submit очистить поля формы от данных?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @shurik_shink просто сделать redirect на страницу с формами, это обычная практика в вебе, к Yii не относится, протокол HTTP и браузеры так устроены.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.761
    Ну так типичная конструкция операции обновления на Yii:
    PHP:
    1. class SomeController extends Controller {
    2.     public function actionSome() {
    3.           $someModel = new SomeModel;
    4.           if ($someModel->load(\Yii::$app->request->post()) && $someModel->doSomethingWithLoadedData()) {
    5.                $this->redirect("/"); // Или $this->refresh();
    6.           }
    7.          
    8.           return $this->render("some", compact("someModel"));
    9.     }
    10.  
    11. }
    Т.е. если модель ввода успешно загрузилась и прошла валидацию, и вообще выполнила свою задачу, происходит редирект на другую страницу или саму на себя, но уже без данных, и таким образом двойной отправки не будет. Если произошла ошибка, то данные выводятся повторно и не теряются - это нам любезно обеспечивает Yii. Поскольку ошибочные данные всё равно никуда не записываются (если всё правильно сделано), то при ошибочных данных защита от повторной отправки не нужна.
     
  4. shurik_shink

    shurik_shink Новичок

    С нами с:
    17 май 2015
    Сообщения:
    79
    Симпатии:
    0
    В общем упрощенная рабочая схема

    PHP:
    1.     public function actionF1()
    2.     {
    3.         $model = new MyModel();
    4.        
    5.         if ($model->load(Yii::$app->request->post()) && $model->validate()){
    6.            
    7.             //обработка данных
    8.             ...............................
    9.            
    10.            
    11.             //очистить поля
    12.             $model = new MyModel();
    13.             //$this->refresh();  - то же работает
    14.         }
    15.         return $this->render('my_view',['model' => $model]);
    16.     }
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если нажать F5 данные второй раз не будут отправлены?
     
  6. shurik_shink

    shurik_shink Новичок

    С нами с:
    17 май 2015
    Сообщения:
    79
    Симпатии:
    0
    не будут отправлны так как пустые поля на форме не пройдут никакую валидацию
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.761
    @shurik_shink, нет, схема не верная. Верную я вам написал. У вас хоть вы и стираете данные, при нажатии f5 всё равно будут отправлены данные, те же, что и в прошлый раз, они будут взяты не из формы, а из предыдущего запроса. А вот вызов refresh() даёт, в итоге
    PHP:
    1. header("Location: $_SERVER[REQUEST_URI]");
    При этом происходит повторная загрузка страницы, но уже методом $_GET и без данных. И обработку данных лучше тоже в модель вынести (у меня это метод SomeModel::doSomethingWithLoadedData()), не надо с данными в контроллере работать.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ну так F5 просто повторяет запрос, поля тут не причём, ты это понял? нашёл ошибку в своих суждениях?