#javascript #php #html #forms
#javascript #php #HTML #формы
Вопрос:
Просто пытаюсь самостоятельно научиться создавать форму, и в настоящее время я застрял с флажками.
При отправке моя форма отправляет электронное письмо на определенный адрес (в настоящее время работает).
Однако я не могу получить все значения отмеченных флажков, выбранные пользователем; Я получаю ‘undefined’ по почте. Пожалуйста, смотрите, как показано ниже, мою html / js / php часть кода. Пожалуйста, будьте как можно проще, поскольку я начинающий.
HTML
<!-- Start Contact -->
<div id="contact" class="contact-box">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="title-box">
<h2>Confirmez-nous votre présence</h2>
<p>On a hâte d'y être. Et vous ? </p>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-sm-12 col-xs-12">
<div class="contact-block">
<form method="POST" action="form-process.php" id="contactForm">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<input type="text" class="form-control" id="name" name="name" placeholder="Nom amp; Prénom" required data-error="Merci d'entrer votre nom et prénom.">
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="text" placeholder="Adresse mail" id="email" class="form-control" name="email" required data-error="Merci d'entrer votre adresse mail.">
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<select class="custom-select d-block form-control" id="adulte" name="adulte" required data-error="Merci d'indiquer le nombre d'invités adultes.">
<option disabled selected value>Nombre d'invités adultes*</option>
<option value="1">Juste moi !</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<select class="custom-select d-block form-control" id="enfant" name="enfant" required data-error="Merci d'indiquer le nombre d'invités enfants.">
<option disabled selected value>Nombre d'invités enfants*</option>
<option value="Aucun">Aucun !</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
Je serai présent(e) / Nous serons présent(e)s :*
<table class="form-control" style="background-color: #e6eceb; height: 210px" id="event">
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="mairie" id="CheckboxGroup1">
Cérémonie civile</label></td>
</tr>
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="vin d'honneur" id="CheckboxGroup2">
À la santé des mariés !</label></td>
</tr>
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="église" id="CheckboxGroup3">
Cérémonie religieuse</label></td>
</tr>
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="dîner" id="CheckboxGroup4">
Dîner</label></td>
</tr>
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="brunch" id="CheckboxGroup5">
Brunch BBQ</label></td>
</tr>
<tr>
<td><label>
<input type="checkbox" name="choice[]" value="aucun" id="CheckboxGroup6">
Malheureusement indisponible(s)</label></td>
</tr>
</table>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<textarea class="form-control" id="message" name="msg" placeholder="Une information à nous communiquer ? Le nom des gens accompagnant ? Végan, végétarien ou simplement au régime ?" rows="8" data-error="Une information à nous communiquer ? Le nom des personnes accompagnatrices ? Végan, végétarien ou simplement au régime ? Une musique qui vous ambiance ?" ></textarea>
<div class="help-block with-errors"></div>
</div>
<div class="submit-button text-center">
<button class="btn btn-common" id="submit" type="submit">Envoyer la confirmation</button>
<div id="msgSubmit" class="h3 text-center hidden"></div>
<div class="clearfix"></div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- End Contact -->
Javascript
$("#contactForm").validator().on("submit", function (event) {
if (event.isDefaultPrevented()) {
// handle the invalid form...
formError();
submitMSG(false, "Le formulaire est incomplet.");
} else {
// everything looks good!
event.preventDefault();
submitForm();
}
});
function submitForm(){
// Initiate Variables With Form Content
//var name = $("#name").val();
//var email = $("#email").val();
//var msg_subject = $("#msg_subject").val();
//var message = $("#message").val();
//var adulte = document.getElementById('adulte').value;
//var enfant = document.getElementById('enfant').value;
var formData = new FormData(event.target);
var checkedOnes = formData.getAll("choice[]");
var name = formData.get("name");
var email = formData.get("email");
var message = formData.get("msg");
var adulte = formData.get("adulte");
var enfant = formData.get("enfant");
var data = { name, email, message, adulte, enfant, checkedOnes: checkedOnes.toString() };
$.ajax({
type: "POST",
url: "php/form-process.php",
//data: "name=" name "amp;email=" email "amp;msg_subject=" msg_subject "amp;message=" message "amp;adulte=" adulte "amp;enfant=" enfant "amp;choice=" strChkOnes,
data: data,
success : function(text){
if (text == "success"){
formSuccess();
} else {
formError();
submitMSG(false,text);
}
}
});
}
function formSuccess(){
$("#contactForm")[0].reset();
submitMSG(true, "Message envoyé !")
}
function formError(){
$("#contactForm").removeClass().addClass('shake animated').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
$(this).removeClass();
});
}
function submitMSG(valid, msg){
if(valid){
var msgClasses = "h3 text-center tada animated text-success";
} else {
var msgClasses = "h3 text-center text-danger";
}
$("#msgSubmit").removeClass().addClass(msgClasses).text(msg);
}
PHP
<?php
$errorMSG = "";
// NAME
if (empty($_POST["name"])) {
$errorMSG = "Nom et prénom requis ";
} else {
$name = $_POST["name"];
}
// EMAIL
if (empty($_POST["email"])) {
$errorMSG .= "Email requis ";
} else {
$email = $_POST["email"];
}
// MSG Guest
if (empty($_POST["adulte"])) {
$errorMSG .= "Nombre d'invités adultes requis ";
} else {
$adulte = $_POST["adulte"];
}
if (empty($_POST["enfant"])) {
$errorMSG .= "Nombre d'invités enfants requis ";
} else {
$enfant = $_POST["enfant"];
}
// MSG Event
//if (empty($_POST["event"])) {
// $errorMSG .= "Détails de votre présence requis ";
//} else {
// $event = $_POST["event"];
//}
$checkedOnes = $_POST["checkedOnes"];
// MESSAGE
//if (empty($_POST["message"])) {
// $errorMSG .= "Message is required ";
//} else {
// $message = $_POST["message"];
//}
$message = $_POST["message"];
$EmailTo = "xxx@gmail.com";
$Subject = "Nouvelle confirmation de présence";
// prepare email body text
$Body = "";
$Body .= "Nom : ";
$Body .= $name;
$Body .= "n";
$Body .= "Email : ";
$Body .= $email;
$Body .= "n";
$Body .= "Adulte(s) : ";
$Body .= $adulte;
$Body .= "n";
$Body .= "Enfant(s) : ";
$Body .= $enfant;
$Body .= "n";
$Body .= "Présent(s) à : ";
$Body .= $checkedOnes;
$Body .= "n";
$Body .= "Message : ";
$Body .= $message;
$Body .= "n";
// send email
$success = mail($EmailTo, $Subject, $Body, "From:".$email);
// redirect to success page
if ($success amp;amp; $errorMSG == ""){
echo "success";
}else{
if($errorMSG == ""){
echo "Un problème est survenu :(";
} else {
echo $errorMSG;
}
}
?>
В настоящее время почта выглядит идеально, за исключением того, что рядом с ‘event :’ я получил undefined … :'(
Комментарии:
1. Ваши флажки вызываются,
choice
так почему вы проверяетеevent
в своем PHP?event
это таблица, которая является просто элементом HTML — в форме передаются только входные данные.2. @FluffyKitten Можете ли вы объяснить проверку на
event
в вашем PHP ? Уверен, что я понял вашу точку зрения, но не уверен, что мне тогда следует изменить?3. Я изменил
event
наcheckedvalue
в js. Что я должен изменить тогда в PHP?4. @IncredibleHat Только начал с этого, поскольку я пытаюсь самостоятельно создать свой свадебный сайт. Я посмотрю на сериализацию, если вы так говорите.
5. @IncredibleHat Совсем нет!! Я говорил, что OP этого не делает (они пытаются отправить элемент таблицы), и именно по этой причине я подумал, что ваше предложение о сериализации было слишком сложным для них на данном этапе. Им нужно вернуться к основам, а не вам!!
Ответ №1:
Я думаю, вам следует использовать форму вместо таблицы. Проверьте также formSubmit
функцию в этом примере, чтобы узнать, как получить значения из формы. Я протестировал приведенный ниже пример, и он работает. В PHP-коде вы можете получить все опубликованные значения ith $_POST["name"]
, $_POST["email"]
, $_POST["checkedOnes"]
:
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<script
src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
crossorigin="anonymous"
></script>
</head>
<body>
<div id="app"></div>
<div class="form-group">
Je serai présent(e) / Nous serons présent(e)s :*
<form onsubmit="formSubmit()">
<label for="form-name">Name</label>
<input type="textbox" id="form-name" name="name" /><br />
<label for="form-email">Email</label>
<input type="email" id="form-email" name="email" /><br />
<input
type="checkbox"
name="choice[]"
value="mairie"
id="CheckboxGroup1"
/>
<label for="CheckboxGroup1">Cérémonie civile</label><br />
<input
type="checkbox"
name="choice[]"
value="vin d'honneur"
id="CheckboxGroup2"
/>
<label for="CheckboxGroup2">À la santé des mariés !</label><br />
<input type="submit" />
</form>
</div>
<script>
function formSubmit() {
event.preventDefault();
var formData = new FormData(event.target);
var checkedOnes = formData.getAll("choice[]");
var name = formData.get("name");
var email = formData.get("email");
console.log(checkedOnes, name, email);
var data = { name, email, checkedOnes: checkedOnes.toString() };
$.ajax({
type: "POST",
url: "./php/form-process.php",
data: data
});
}
</script>
</body>
</html>
Это не помогает при проверке isChecked
атрибута: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input/checkbox
Обновление Я проверил ваш последний код, и есть как минимум две проблемы:
1 HTML-форма:
<form method="POST" action="form-process.php" id="contactForm">
Таким образом, когда пользователь нажимает submit
, вы отправляете POST
сообщение form-process.php
напрямую, вместо вызова submitForm()
функции, которая, в свою очередь, собирает необходимые данные формы и отправляет их form-process.php
.
Поэтому вам следует изменить строку на:
<form onsubmit="submitForm()" id="contactForm">
Таким образом, данные формы будут отправлены submitForm
функции, которая извлечет данные и отправит их в form-process.php
.
2 Другая проблема заключается в том, что вы пропускаете event.preventDefault();
начало submitForm
функции, без этого страница будет перезагружена и код не будет выполнен. Так что это должно быть:
function submitForm(){
event.preventDefault();
var formData = new FormData(event.target);
var checkedOnes = formData.getAll("choice[]");
// Then the rest of your code
Комментарии:
1. Спасибо, чувак! На данный момент кажется, что checkedOnes — это массив со всеми значениями отмеченных флажков; поскольку я преобразовал его в строку, просто нужно добавить это в AJAX, тогда я думаю
2. @JuliaAlexandre Да, ваш запрос ajax должен быть в порядке. Вы можете просто передать ему флажки.
3. Я выполнил проверку в своих формах, и, похоже, проблема остается.
console.log(name,email,msg_subject,message,adulte,enfant,strChkOnes);
предоставляет мне правильную информацию в виде строки для всех переменных; однако при отправке формы я не получаю информацию о strChkOnes, хотя это тот же процесс, что и для других переменных…4. Я обновил ответ. Я надеюсь, что это поможет. Я не тестировал с PHP и не могу видеть весь ваш код, поэтому немного сложно сказать. В любом случае вы должны иметь возможность получать опубликованные значения по их имени в PHP. И еще одна вещь.. Я не уверен, как сейчас работает ваш код, но убедитесь, что все данные, которые вы собираете, находятся в той же форме, что и в примере.
5. @JuliaAlexandre Я внес небольшое изменение в код, фактически отмеченные флажки должны были быть преобразованы в строку. Теперь я протестировал код также с помощью PHP, и он работает. Пожалуйста, отметьте ответ, если вы нашли его полезным и / или решили проблему.