Isolution666
@Isolution666
Full-Stack Developer

Как отправлять Post запросы через beginForm на Yii2?

Здравствуйте.
---
Материал:
=
// вьюха
...
                        <?= Html::beginForm(['/phone'], 'post', ['name' => 'send']) ?>
                            <div class="input-group">
                                <?=Html::input('text', 'action', $telefon,['type' => 'hidden']) ?>
                                <?=Html::input('text', 'code', '',['class' => 'form-control input-lg', 'placeholder' => 'введите код из SMS']) ?>
                                <span class="input-group-btn">
                                    <?= Html::submitButton('Активировать', ['class' => 'btn btn-danger btn-lg btn-flat']) ?>
                                </span>
                            </div>
                        <?= Html::endForm() ?>
...


и
// controller
...
    public function actionPhone() {
        $model = User::findOne(Yii::$app->user->identity->id); // записываем номер телефона в БД
        if ($model->load(Yii::$app->request->post()) && $model->save()) { // обновляем запись
            Yii::$app->session->setFlash('contactPhone'); // выводим информацию об успехе
            if(!$model->save()){
                throw new \yii\web\HttpException(500, 'Невозможно сохранить'); // или показываем ошибку в записи
            }
            return $this->refresh(); // обновляем страницу
        }
        if(Yii::$app->request->post('send')){ // если отправилась форма с name "send"
            if(Yii::$app->request->post('code') == Yii::$app->request->post('action')){ // и эти переданные post данные одинаковые
                return $this->redirect(['/account/user', 'id' => Yii::$app->user->identity->id]); // тогда перенаправляем на страницу
            } else {
                Yii::$app->getSession()->setFlash('error', 'Вы ввели не верный код активации!'); // или посылаем ошибку
            }
        }
        return $this->render('phone', ['model' => $model]); // выводим результат
    }
...


Пояснения: Контроллер сначала обновляет поле в строке БД, если оно пустое, добавляет номер телефона. Потом, когда скрипт записал номер телефона, появляется другая форма с рандомными цифрами и пустым полем, куда надо вписать цифры из sms - когда post данные начнут отправляться и валидироваться, тогда я перенесу скрытые данные в контроллер. Как вы поняли, вторая форма ничего не отправляет в базу данных, а лишь проверяет, одинаковые данные или разные, если выдаст совпадения, скрипт sms закрепит этот номер как подтверждённый.

ВОПРОС: Как правильно передавать post данные, чтобы контроллер их видел и обрабатывал, везде лишь материал по обработки данных в БД, а по обработке post данных ничего не нашёл. Подскажите, как это реализовать.
  • Вопрос задан
  • 961 просмотр
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Как правильно передавать post данные

отправить post запрос, формой или иным способом. У Вас же есть форма, она отправляет post запрос, так что Вы уже это реализовали в чем проблема?

чтобы контроллер их видел и обрабатывал

$_POST //тут пост запрос, как обычно в php
Yii::$app->request->post() //тоже самое, но средствами yii

Что Вы понимаете под "обрабатывал", вот пример абстрактный:
if(Yii::$app->request->isPost){
   $post = Yii::$app->request->post();
   echo $post['some_data'];
}else{
   echo 'не пришел post запрос, плачем всем отделом';
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
А почему бы Вам не использовать ActiveForm?
$model = User::findOne(Yii::$app->user->identity->id); // записываем номер телефона в БД

Разве? Здесь Вы получаете данные пользователя по его id.

P.S.
Как вы поняли, вторая форма ничего не отправляет в базу данных, а лишь проверяет, одинаковые данные или разные, если выдаст совпадения, скрипт sms закрепит этот номер как подтверждённый.

А зачем вообще тогда что-то отправлять? Может нужно через валидатор сравнить данные, если совпадают - писать в базу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы