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 probleme 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&eacute votre nom !";
} 

if(!array_key_exists('email', $_POST) || $_POST['email'] == '' || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
   $errors['email'] = "Vous n'avez pas renseign&eacute un email valide !";
}

if(!array_key_exists('message', $_POST) || $_POST['message'] == ''){
    $errors['message'] = "Vous n'avez pas renseign&eacute 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;
}); 

7 réponses


Bonjour.
Cela m'étonnerait que ton code javascript fonctionne actuellement.
La première erreur, est que tu devrais remplacer $post par $.post, la seconde, c'est que tu utilises une variable qui n'est pas définie, tu utilises la variable email alors que tu as définis la variable mail.
Sinon, pôur ce que tu demandes, il te suffit simplement au niveau de tes redirections, de vérifier si la requête effectué est faite en ajax ou non, si c'est le cas tu renvois les données, sinon tu fais la redirection.

kraster
Auteur

Merci de votre réponse, ces erreurs je ne les ai pas sur mon code original, je les ai faites apparement lors de l'organisation du code avant le partager, mais bon ce code fonctionne le seul probleme qui reste est la redirection.

Lorsque tu fais une requête ajax avec jquery, celui-ci envoit un header spécifique qui est X-Requested-With: XMLHttpRequest.
Il te suffit de vérifier au niveau de PHP si l'header existe, et si c'est le cas, tu ne rediriges pas.

@PhiSyX +1, sinon tu peux envoyer une data spécifique dans l'objet que tu envoies (ex. isAjax: true) et tu check en PHP si celle-ci est défini ou non; Si elle l'est, tu ne rediriges pas, sinon tu rediriges.

Enfin il y a pleins de solutions différentes, faut juste se creuser un peu la tête ;)

kraster
Auteur

Merci de vos réponses et de vos conseils précieux les amis, en vérité je ne suis pas super doué en PHP ni en Javascript. En fait, je viens de commencer à les apprendre en suivant les tutos de Grafikart qui m'ont encouragé et aidé beaucoup. Vos réponses sont peut etre claires mais pour moi sont floues, avec des petits exemples je comprendrai mieux. Merci d'avance de bien vouloir prendre en considération ma petite demande et de votre compréhension ))

Ha d'accord.
Mais il s'agit juste d'une condition.
Comme tu as déjà du code PHP avec des conditions et tout, je me suis dit que ça serait simple pour toi en fait.

En fait, il te suffit de vérifier si la clé HTTP_X_REQUESTED_WITH existe dans la variable superglobale $_SERVER de PHP ET que celle-ci contient comme valeur XMLHttpRequest.

Vu que c'est quelque chose que tu utiliseras à plusieurs reprise dans ton application, il te faut donc créer une fonction:

function isXhr()/*: bool # si tu as PHP7 */
{
    return filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest';
}

if (isXhr()) {
    echo "Il s'agit d'une requête XHR.";
} else {
    echo "Il NE s'agit PAS d'une requête XHR.";
}
kraster
Auteur

Merci Monsieur c'est gentil de votre part, je vais essayer d'integrer le code et je le partagerai plus tard pour vérification ;)