Задать вопрос
@kuznecov85

Как правильно обработать форму в Yii2 через ajax?

Всем привет.
Не могу разобраться с отправкой ajax запроса.
Есть представление с формой:
$script = <<<JS
 $('#sendEmail').on('click', function(){
     var 
            name = $('#FirstNameContact').val(), 
            email = $('#emailContact').val(), 
            mess = $('#messContact').val();
     $('#sendBut').prop('disabled', 'disabled');
     console.log(name);
     $.ajax({
         url: '/',
         type: 'POST', 
         data: {name : name, email : email, mess : mess},
         success: function(res){
             console.log(res);
             $('#info-send').html(res); 
             $('#info-send').css('display','block');
         },
         error: function(){
             $('#error-send').html('Ошибка при отправке сообщения. Перезагрузите страницу');
             $('#error-send').css('display','block');
         }  
     });
     return false;
 });
JS;
$this->registerJs($script, yii\web\View::POS_READY);


                    <form method="post">
                        <input type="text" name="FirstName" id="FirstNameContact" placeholder="Ваше имя" required="">
                        <input class="email" name="Email" id="EmailContact" type="text" placeholder="Email" required="">
                        <textarea name="Message" id="MessageContact" placeholder="Сообщение" required=""></textarea>
                        <input type="submit" id="sendEmail" value="Написать">
                        <div id="contact-errorMsg"></div>
                        <div id="contact-result"></div>
                        <div id="contact-info"></div>
                    </form>


Изначально была такая (но в ходе работы попробовал разные варианты)
<?php $form = ActiveForm::begin() ?>
                <?= $form->field($form_model, 'name', ['template' => "{label}\n{input}"])->label(false)
                    ->textInput([
                        'placeholder' => "Name",
                        'class' => "",
                        'id' => "nameContact",
                    ]) ?>
                <?= $form->field($form_model, 'email', ['template' => "{label}\n{input}"])->label(false)
                    ->textInput([
                        'placeholder' => "Email",
                        'class' => "",
                        'id' => "emailContact",
                    ]) ?>
                <?= $form->field($form_model, 'subject')
                    ->textarea([
                        'rows' => 2,
                        'cols' => 5,
                        'placeholder' => "Your message",
                        'class' => "",
                        'id' => "messContact",
                    ])->label(false); ?>
                <?=Html::submitInput('Send', ['class' => '', 'id' => 'sendBut']);?>
                <?php $form = ActiveForm::end() ?>
                <div id="info-send"  class="alert alert-success"></div>
                <div id="error-send"  class="alert alert-danger"></div>


Есть контроллер

public function actionIndex()
    {
        if(\Yii::$app->request->isAjax){
            $name = Yii::$app->request->post('name');
            return "Спасибо, ваше сообщение принято. {$name}";
        }
}


Строка if(\Yii::$app->request->isAjax) отрабатывает, но данные из POST не передаются.

При этом, когда проверяю метод, которым передаются данные - указывает на метод GET.

Подскажите плиз в какую сторону копать?
  • Вопрос задан
  • 1110 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Kewa2008
@Kewa2008
Программист
Проверь параметр
url: '/',
возможно у тебя контролер ничего не принимает. Проверь еще раз роуты, вполне возможно косяк кроется там.

Соглашусь с slo_nik используй ActiveForm и serialize()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
amexlar
@amexlar
Скорее всего, у вас Yii ожидает данные не в том формате, который вы ему отправляете. Попробуйте при отправке ajax-запроса (в JS) добавить параметр contentType:'application/json'

PS . Возможно, вам пригодится - в jQuery есть функция serializeArray
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Сделайте так
public function actionIndex()
    {
        if(\Yii::$app->request->isAjax){

print_r(Yii::$app->request->post());

            $name = Yii::$app->request->post('name');
            return "Спасибо, ваше сообщение принято. {$name}";
        }
}

и смотрите, что приходит в запросе.
Вот это
Yii::$app->request->post('name')
не совсем верно.
Когда собираете данные из формы при помощи jquery, то используйте serialize()
И вернитесь к использованию ActiveForm.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы