Contourner les redirections PHP avec Ajax

kraster

kraster Le 9 décembre 2016 à 18:34 (Édité le 25 janvier 2019 à 17:52)

Salut à tous,
Je viens de créer un formulaire de contact très simple en PHP et j'aimerai souscrire ce formulaire en Ajax sans l'actualisation de la page, le problème c'est que la partie PHP contient 2 redirections, mon code Ajax marche bien mais je veux savoir s'il y a un truck pour contourner les redirections et rester sur la meme page.
voici mes 2 codes:
<?php
$errors = [];
$nom = htmlspecialchars($_POST['nom']);
$email = htmlspecialchars($_POST['email']);
$message = htmlspecialchars($_POST['message']);
                  
if(!array_key_exists('nom', $_POST) || $_POST['nom'] == ''){
   $errors['nom'] = "Vous n'avez pas renseigné votre nom !";
} 
if(!array_key_exists('email', $_POST) || $_POST['email'] == '' || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
   $errors['email'] = "Vous n'avez pas renseigné un email valide !";
}
if(!array_key_exists('message', $_POST) || $_POST['message'] == ''){
   $errors['message'] = "Vous n'avez pas renseigné votre message !";
   } 
      
session_start();
if(!empty($errors)){
   
   $_SESSION['errors'] = $errors;
   header('Location: ../contact.php#contactform');
   
} else {
   $_SESSION['success'] = 1;
   
   $to = "exemple@exemple.org";
   
   $headers ="MIME-Version: 1.0\r\n";
   $headers ='From:'.$nom.'<'.$email.'>'."\r\n";
   $headers.='Content-Type:text/html; charset="UTF-8"'."\r\n";
   $headers.='Content-Transfert-Encoding: 8bit';
      'Reply-To: $email' . "\r\n" .
      'X-Mailer: PHP/' . phpversion();   
         
   mail($to, "Form contact", $message, $headers);
   header('Location: ../contact.php#contactform');
}
die();               
?>
et le code Javascript:
$("#contactform").submit(function(){
   var action = $(this).attr('action');
   var nom = $(".nom").val();
   var email = $(".email").val();
   var message = $(".message").val();
   $('button[type="submit"]').hide().after('<img src="imgs/zZTBdeLybMk/ajaxl.gif" class="fleft inline ajaxll">');
   $('button[type="reset"]').hide();
      
   $.post(action,{
      nom:nom,
      email:email,
      message:message
   },function(){
      $(".message").html(data);
      $('.ajaxll').fadeOut();
      $('button[type="submit"]').fadeIn();
      $('button[type="reset"]').fadeIn();
   });
   return false; 
});   
TheOldNoob

TheOldNoob Le 10 décembre 2016 à 09:20

Salut l'ami,

Tu peu utilisé les boleen pour faire ça, et du coup, pas besoin d'ajax.

En gros, tu défini une variable au début de ton php :

$showReponse = false

Tu fait ton php avec vérification de ton formulaire de façon classique et dans ton envois a la bdd juste après tu ajoute une ligne qui change ta valeur boleen false en true.

Puis dans ton formulaire de réponse html tu l'englobe dans un if (showReponse) ...


En gros, au début ton formulaire est visible mais la réponse ne l'ai pas, mais si le formulaire est correctement envoyer en bdd, ta réponse apparaîtra. Dans se même principe, tu peu aussi caché le formulaire après envoie en bdd 😀
kraster

kraster Le 11 décembre 2016 à 21:18 (Édité le 11 décembre 2016 à 21:20)

Merci bcp pour votre réponse et pour vos précieux conseils Monsieur TheOldNoob, mais la vérité c'est que je ne suis pas super doué en PHP ni en Javascript. En fait, je viens de commencer à  les apprendre en suivant les tutos, je sais qu'il y a plusieurs solutions pour résoudre ce problème (la vérification du header X-Requested-With: XMLHttpRequest par exemple..) mais j'arrive pas à formuler le code, merci de bien vouloir m'aider à ce propos )
TheOldNoob

TheOldNoob Le 12 décembre 2016 à 00:07 (Édité le 13 décembre 2016 à 21:37)

Pas de soucis, je t'aide un peu plus.

$showFormulaire = false// de base il est donc visible
$showReponse = false // de base il est caché

   // Blablabla toute tes vérification de formulaire
   
   /// Si envoie correcte du formulaire dans la base de donné alors
   
$showFormulaire = true // on le cache
$showReponse = true // On l'affiche

Puis on arrive au objets qu e lon veux caché ou afficher en fonction des événements

if ($showFormulaire == false) { // Donc si le formulaire est sur false, il est afficher mais si après validation de l'envoie en bdd il passe sur true, il sera donc caché
   Tout ton formulaire ici
}
if ($showReponse == true) { // On affiche la reponse si la variable passe sur true
   Ta reponse ici même
}
Dans se principe même on peu créer une variable $error = array(); qui pourra contenir tes erreur ainsi qu'une variable $showError = false qui lorsqu'elle passera a true en cas d'erreur, affichera tes erreurs 😀
kraster

kraster Le 13 décembre 2016 à 19:42

Merci Monsieur vous êtes vraiment très serviable, je vais essayer d'écrire le code et je vous contacterai plus tard pour la vérification ;)
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte