• JavaScript
  • jQuery
  • PHP

Почему отправляется пустая форма на сайте?

Добрый день! Очень прошу о помощи. Я начинающий, сделал форму по скрипту, который нашел с использованием jQuery Validation.

Все работает, данные отправляются на почту, валидация тоже вроде есть.

Но, если оставить все поля пустыми, то форма все равно отправится (появится модальное окошко #thanks) и в форме только тогда появятся подсказки.

Я уже измучился, весь интернет перерыл, а JS пока не очень знаю. Может есть какой-то способ сделать так, чтобы форма не отправлялась, пока все поля пустые?

Вроде у каждого прописан required, есть preventDefault и return false.

Почему же так происходит? Здесь часть кода из скриптового файла:
function validateForms(form) {
  $(form).validate({
    rules: {
      name: {
        required: true, minlength: 2
      }, phone: "required", email: {
        required: true, email: true
      }
    }, messages: {
      name: {
        required: "Пожалуйста, введите свое имя", minlength: jQuery.validator.format("Введите {0} символа!")
      }, phone: "Пожалуйста, введите свой телефон", email: {
        required: "Пожалуйста, введите свою почту", email: "Неправильно введен адрес почты"
      }
    }
  });
}

validateForms('#consultation-form');
validateForms('#consultation form');
validateForms('#order form');

$('input[name=phone]').mask("+7 (999) 999-99-99");

$('form').submit(function (e) {
  e.preventDefault();
  $.ajax({
    type: "POST", url: "mailer/smart.php", data: $(this).serialize()
  }).done(function () {
    $(this).find("input").val("");
    $('#consultation, #order').fadeOut();
    $('.overlay, #thanks').fadeIn('slow');
    $('form').trigger('reset');
  });
  return false;
});

Здесь PHP-код:

<?php

$name = $_POST['name'];
$phone = $_POST['phone'];
$email = $_POST['email'];

require_once('phpmailer/PHPMailerAutoload.php');
$mail = new PHPMailer;
$mail->CharSet = 'utf-8';

$mail->isSMTP();
$mail->Host = 'smtp.yandex.ru';
$mail->SMTPAuth = true;
$mail->Username = 'логин';
$mail->Password = 'пароль';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;

$mail->setFrom('почта отправителя', '');
$mail->addAddress('почта получателя');
$mail->isHTML(true);

$mail->Subject = 'Данные';
$mail->Body = "Пользователь оставил данные <br>Имя: $name <br>Номер телефона: $phone <br>E-mail: $email";

if (!$mail->send()) {
  return false;
} else {
  return true;
}

Комментарии: 4

kramaxim
kramaxim

Чувствую я, что вы проходили курс Петриченко)

Спасибо за поднятие этого вопроса, так бы долго мучался!

Александр Мальцев
Александр Мальцев
Добрый день!
Чтобы у вас всё работало корректно необходимо:
1. Добавить к каждой форме атрибут action, т.к. разные формы в принципе на сервере могут обрабатываться разными php-файлами:
<form id="#consultation-form" method="post" action="mailer/smart.php">...</form>
...
<form method="post" action="mailer/smart.php">...</form>
2. Изменить весь представленный вами JavaScript код на следующий:
$("form").each(function () {
  $(this).validate({
    rules: {
      name: {
        required: true,
        minlength: 2
      },
      phone: "required",
      email: {
        required: true,
        email: true
      }
    },
    messages: {
      name: {
        required: "Пожалуйста, введите свое имя",
        minlength: jQuery.validator.format("Введите {0} символа!")
      },
      phone: "Пожалуйста, введите свой телефон",
      email: {
        required: "Пожалуйста, введите свою почту",
        email: "Неправильно введен адрес почты"
      }
    },
    submitHandler: function (form) {
      $.ajax({
        type: "POST",
        url: $(form).attr('action'),
        data: $(form).serialize()
      }).done(function () {
        $(form).find("input").val("");
        $('#consultation, #order').fadeOut();
        $('.overlay, #thanks').fadeIn('slow');
        $(form).trigger('reset');
      });
      return false;
    }
  });
});
Rik
Rik
Александр, спасибо огромное, вы меня просто спасли!
Действительно, переделал, все формы идеально работают.
Спасибо за ваш труд!
Progressive
Progressive
+1000 в карму этому господину. Я уже и на хабр писал, и на стэковерфлоу. Весь интернет почти облазил. Пока просто не вбил в поиск весь код из ajax. Спасибо! Всё работает!