@Bro010101

Вопрос по отправка формы без перезагрузки — AJAX?

Здравствуйте!
Возможно вопрос детский, но я только, только начинаю разбираться с такой интересной темой )
Цель, настроить отправку формы без перезагрузки страницы.
Есть файл js с настройкой валидации форм и отправка полученных данных с помощью ajax технологии
"use strict"

document.addEventListener ('DOMContentLoaded', function () {
    const form = document.getElementById('form');
    form.addEventListener('submit', formSend);

    async function formSend(e) {
        e.preventDefault();

        let error = formValidate(form);

        let formData = new FormData(form);
        formData.append('image', formImage.files[0]);

        if (error === 0) {
            form.classList.add('_sending');
            let response = await fetch('sendmail.php', {
                method: 'POST',
                body: formData
            });
            if (response.ok) {
                let result = await response.json();
                alert(result.message);
                formPreview.innerHTML = '';
                form.reset();
                form.classList.remove('_sending');
            } else {
                alert("Ошибка");
                form.classList.remove('_sending');
            }

        } else {
            alert('Заполните обязательные поля');
        }
    }

    function formValidate(form) {
        let error = 0;
        let formReq = document.querySelectorAll('._req');

        for (let index = 0; index < formReq.length; index++) {
            const input = formReq[index];
            formRemoveError(input);

            if (input.classList.contains('_email')) {
                if (emailTest(input)) {
                    formAddError(input);
                    error++;
                }
            } else if (input.getAttribute("type") === "checkbox" && input.checked === false) {
                formAddError(input);
                error++;
            } else {
                if (input.value === '') {
                    formAddError(input);
                    error++;
                }
            }
        }
        return error;
    }
    function formAddError(input) {
        input.parentElement.classList.add('_error');
        input.classList.add('_error');
    }
    function formRemoveError(input) {
        input.parentElement.classList.remove('_error');
        input.classList.remove('_error');
    }

    // Функция текста email - валидация
    function emailTest(input) {
        return !/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(input.value);
    }

    // Получение инпут file в переменную далее для вложенного файла
    const formImage = document.getElementById('formImage');

    // Получение div для превью в переменную
    const formPreview = document.getElementById('formPreview');

    // Слушаем изменения в инпуте file
    formImage.addEventListener('change', () => {
        uploadFile(formImage.files[0]);
    });

    function uploadFile(file) {
        // проверка типа файла
        if (!['image/jpeg', 'image/png', 'image/gif'].includes(file.type)) {
            alert('Разрешены только изображенияю');
            formImage.value = '';
            return;
        }
        // проверка размера файла (<2 мб)
        if (file.size > 2 * 1024 * 1024) {
            alert('Файл должен быть менее 2 МБ.');
            return;
        }

        var reader = new FileReader();
        reader.onload = function (e) {
            formPreview.innerHTML = `<img srs="${e.target.result}" alt="Фото">`;
        };
        reader.onerror = function (e) {
            alert('Ошибка');  
        };
        reader.readAsDataURL(file);
    }

});


Валидация отрабатывается но с отправкой формы засада.
Ни как не пойму, данные вообще отправляются? Если да, то почему после отправки ничего не происходит, т.е. вообще ничего, нет ни писем на почте и сообщения об ошибке при отправке сообщения?

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';

$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->setLanguage('ru', 'phpmailer/language/');
$mail->IsHTML(true);

// От кого письмо
$mail->setFrom('alkamo@inbox.ru', 'Вижу цель');
// Кому отправить
$mail->addAddress('alkamo@inbox.ru');
// Тема письма
$mail->Subject = "Заявка с сайта";

// Рука :)
$hand = "Правая";
if($_POST['hand'] == 'left'){
    $hand = "Левая";
}

// Тело письма
$body = '<h1>Встречай письмо!</h1>';

if(trim(!empty($_POST['name']))){
    $body.='<p><strong>Имя:</strong> '.$_POST['name'].'</p>';
}
if(trim(!empty($_POST['email']))){
    $body.='<p><strong>E-mail:</strong> '.$_POST['email'].'</p>';
}
if(trim(!empty($_POST['hand']))){
    $body.='<p><strong>Рука:</strong> '.$hand.'</p>';
}
if(trim(!empty($_POST['aga']))){
    $body.='<p><strong>Возраст:</strong> '.$_POST['age'].'</p>';
}
if(trim(!empty($_POST['message']))){
    $body.='<p><strong>Сообщение:</strong> '.$_POST['message'].'</p>';
}

// Прикрепить файл
if (!empty($_FILES['image']['tmp_name'])) {
    // путь загрузки файла
    $filePath = __DIR__ . "/files/" . $_FILES['image']['name'];
    // грузим файл
    if(copy($_FILES['image']['tmp_name'], $filePath)){
        $fileAttach = $filePath;
        $body.='<p><strong>Фото в приложении</strong>';
        $mail->addAttachment($fileAttach);
    }
}

$mail->Body = $body;

// Отправляем
if (!$mail->send()) {
    $message = 'Ошибка';
} else {
    $message = 'Данные отправлены!';
}

$response = ['message' => $message];

header('Content-type: application/json');
echo json_encode($response);
?>
  • Вопрос задан
  • 365 просмотров
Пригласить эксперта
Ответы на вопрос 2
Immortal_pony
@Immortal_pony Куратор тега PHP
Sendmail на сервере настроен? Если нет или не знаешь, что это такое, то явно пропиши параметры SMTP в своём php-файле

$mail->isSMTP(); //Send using SMTP
$mail->Host = 'smtp.example.com';  //Set the SMTP server to send through
$mail->SMTPAuth = true;  //Enable SMTP authentication
$mail->Username  = 'user@example.com'; //SMTP username
$mail->Password  = 'secret';  //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;  //Enable implicit TLS encryption
$mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`


Если и этого будет недостаточно, то придётся пойти на страшные меры: обернуть код в try...catch, включить debug и смотреть какая ошибка возникает при отправке.
Кстати, именно так и по умолчанию и было сделано в документации к библиотеке, который ты пользуешься в разделе Simple Example
Ответ написан
Комментировать
@kryhan
Ошибка: src
formPreview.innerHTML = ``;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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