Не уверен насчет 404
, которое у вас есть, поскольку URL-адрес в запросе является правильным, и URL-адрес, который будет сгенерирован для запроса ajax, будет выглядеть как http://example.com/site/send-contact
, но только если вы используете 'enablePrettyUrl' => true,
дляКомпонент urlManager
, в противном случае он должен быть похож на index.php?r=site/index
, что может быть только причиной для 404
, лучше получить URL-адрес из атрибута формы action
.
Помимо вышеупомянутого,
Вы используете new FormData()
для отправки данных с запросом, например
data: new FormData($(this))[0]
, что неверно и не будет отправлять FormData
с запросом как таковымвернет undefined
, вы можете проверить console
или с помощью print_r($_POST)
внутри действия sendContact
, как только вы закончите с 404
, это должно быть
data: new FormData($(this)[0]),
, вам нужнополучить форму через $(this)[0]
и перейти на new FormData()
.
Но этого недостаточно, вам нужно установить contentType
и processData
равными false
для правильной отправки FormData
, или вы получите исключение в консоли
Uncaught TypeError: Недопустимый вызов
Таким образом, ваш код должен выглядеть так:
$('#contact-form').on('beforeSubmit', function(){
let url=$(this).attr('action');
let form=$(this)[0];
let data=new FormData(form);
$.ajax({
method: 'post',
url: url,
data:data,
contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+)
processData: false,
success: function(data){
console.log(data)
}
});
return false;
})
EDIT
Примечание: Прежде всего вы должны просто использовать data:$(form).serialize()
вместо new FormData()
до тех пор, пока вы не планируете загружать файлы вместе с формой, используя ajax.