1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| <?php
/**
* Retourne le mot-clé de l'erreur pour un champ un donné
* Retourne false si pas d'erreur ou mot-clé inexistant
*
* @param string $index
* @return string|bool
*/
function form_error($index) {
$errors = $GLOBALS['errors']; // On récupère la variable définie en-dehors du scope de notre fonction
return (!empty($errors[$index])) ? $errors[$index] : false;
}
/**
* Retourne la valeur de l'index défini dans $_POST
* Si l'index n'existe pas, c'est la valeur par défaut qui sera affichée
*
* @param string $index
* @param string $default
*/
function form_value($index, $default = "") {
return (isset($_POST[$index])) ? $_POST[$index] : $default; // Si l'index existe on le retourne (même s'il est vide !), sinon on affiche la valeur par défaut
}
$errors = [];
// J'ai sorti cette variable de la logique d'envoi du formulaire
// car j'ai ajouté un message d'erreur si le mail n'arrivait pas à s'envoyer
$to = "ADRESSE_EMAIL@DOMAIN.TLD";
// On vérifie que le formulaire a bien été soumis et que c'est celui de contact
if (!empty($_POST['action']) && $_POST['action'] === 'contact-submit') {
// Validation des champs obligatoires
// On créé un tableau, c'est plus facile à valider à la volée et à modifier
$required_fields = ['name', 'email', 'message'];
foreach ($required_fields AS $v) {
if (empty($_POST[$v])) { // Dans ce cas-ci, c'est bien le fait que la valeur soit vide qu'on vérifie
$errors[$v] = 'empty';
}
}
// Validation du format de l'adresse email (on ne valide que s'il n'y a pas déjà une erreur avec l'adresse email)
// filter_var() est une fonction fournie par PHP qui permet de valider pas mal de choses, c'est très pratique ^^
if (empty($errors['email']) && !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'invalid';
}
// Seulement si on a aucune erreur dans le formaire nous allons procéder à son traitement (ici, envoyer un mail)
if (empty($errors)) {
$subject = 'Mail sent from sendmail PHP script';
// Un autre moyen d'envoyer un message en plusieurs lignes est de créer un tableau
// On va ensuite "aplatir" le tableau et utiliser le caractère de retour à la ligne pour mettre les lignes l'un après l'autre
$message = [
"Nom de l'expéditeur : " . stripslashes($_POST['name']), // On utilise stripslashes() pour virer les slashs d'escape (essaye d'écrire un nom avec une apostrophe par exemple)
"Email de l'expéditeur : " . $_POST['email'],
];
// implode() est donc la méthode pour convertir un array en string.
// le premier paramettre défini la "glue" qui va unir les lignes du tableau
// PHP_EOL est une super constate de PHP qui retourne \n sur les serveurs linux et \r sur les serveurs Windows, ça évite d'écrire \r\n
if (mail($to, $subject, implode(PHP_EOL, $message))) {
header("Location: ./simple-form-v2.php?success=1"); // On redirige avec une variable dans l'URL pour afficher un message success
exit;
} else {
// Si le mail n'a pas été envoyé, on va définir une valeur dans notre tableau pour afficher un message
$errors['send_email'] = 1;
}
}
}
?>
<style>
label {
display: block;
}
.form-group {
margin-bottom: 1rem;
}
.error {
color: red;
font-size: 12px;
}
</style>
<?php if (!empty($_GET['success'])) : ?>
<!-- On affiche le message comme quoi l'email a bien été envoyé -->
<h2>Merci pour votre message !</h2>
<p>Nous allons vous repondre dans les plus bref délai</p>
<?php elseif (!empty($errors['send_email'])) : ?>
<h2>ERREUR</h2>
<p>Le formulaire a été rempli correctement mais nous n'avons pas pu envoyer le mail.</p>
<p>Veuillez réessayer plus tard ou nous contacter directement à l'adresse <a href="mailto:<?= $to; ?>"><?= $to; ?></a>.</p>
<?php endif; ?>
<form id="contactForm" action="" method="post">
<div class="form-group">
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="<?= form_value('name', 'Edouard'); ?>" required="required"/><!-- avec required, on ajoute la validation HTML -->
<?php if (form_error('name')) : ?>
<div class="error">ERREUR : ce champ est requis.</div>
<?php endif; ?>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<?= form_value('email', 'example@seamail.com'); ?>" required="required" /><!-- avec required, on ajoute la validation HTML -->
<?php if (form_error('email')) : ?>
<div class="error">
<?php if (form_error('email') == 'invalid') : ?>
ERREUR : l'adresse email n'a pas un format valide.
<?php else : ?>
ERREUR : ce champ est requis.
<?php endif; ?>
</div>
<?php endif; ?>
</div>
<div class="form-group">
<label for="message">Message:</label>
<textarea id="message" name="message" cols="50" rows="8" required="required"><?= form_value('message'); ?></textarea><!-- avec required, on ajoute la validation HTML -->
<?php if (form_error('message')) : ?>
<div class="error">ERREUR : ce champ est requis.</div>
<?php endif; ?>
</div>
<div class="form-group">
<input type="hidden" name="action" value="contact-submit" /><!-- pour facilement savoir si le formulaire a été envoyé, on va tester cette valeur -->
<input type="submit" value="Envoyer" />
</div>
</form> |
Partager