[RESOLU] Valider plusieurs fois un formulaire sans actualiser la page

Eléphanteau du PHP | 37 Messages

20 avr. 2021, 18:45

Ok je pense avoir compris :

Code : Tout sélectionner

//Connexion Recaptcha grecaptcha.ready(function () { grecaptcha .execute("***", { action: "homepage", }) .then(function (token) { document.getElementById("recaptchaResponse-com").value = token; }); }); $(document).ready(function() { //quand le DOM est là, on sélectionne les éléments avec lesquels on va travailler //c'est mieux de le faire une fois au début, pour des questions de perf //mais surtout pour éviter d'avoir à faire un gros ctrl + r pour changer les sélecteurs. const $comment_form = $("#comment_form"); const $comment_message = $("#comment_message"); const $display_comment = $("#display_comment"); $comment_form.on("submit", function(event) { event.preventDefault(); const form_data = $comment_form.serialize(); $.ajax({ url: "add_comment.php", method: "POST", data: form_data, dataType: "JSON", success: function(data) { if (data.error !== "") { $comment_form[0].reset(); $comment_message.html(data.error); //un formulaire (élément) contient tous ses inputs //c'est rangé par nom $comment_form[0].comment_id.value = "0"; load_comment(); } }, }); //on renouvelle le token pour envoyer un 2nd commentaire grecaptcha .execute("***", { action: "homepage", }) .then(function (token) { document.getElementById("recaptchaResponse-com").value = token; }); }); reload(); ////////////////////////////////// function load_comment() { $.ajax({ url: "fetch_comment.php", //POST pour envoyer des données, et GET pour obtenir des données method: "POST", success: function(data) { $display_comment.html(data); $(".reply").on("click", function() { $comment_form[0].comment_id.value = $(this).attr("id"); $comment_form[0].comment_name.focus(); }); }, }); } function reload() { load_comment(); setTimeout(reload, 10000); } });


Pour le formulaire de contact (que j'ai fait il y a bien longtemps) le code n'était pas fait de la même façon, j'ai suivi le même principe, ça fonctionne mais je me permets de te le montrer aussi dans le doute car pour moi, le JS et PHP n'est pas aussi fluide que toi, j'ai peur de faire une bourde. Si t'as 5min pour regarder je te remercie.

Code : Tout sélectionner

$("#contact-form").submit(function (event) { event.preventDefault(); // Empêcher la soumission directe du formulaire $("#alert").text("Envoi en cours...").fadeIn(0); // Afficher "Traitement" pour informer l'utilisateur que le formulaire est en cours d'envoi grecaptcha.ready(function () { // Clef REcaptcha site ci dessous grecaptcha .execute("***", { action: "contact", }) .then(function (token) { var recaptchaResponse = document.getElementById("recaptchaResponse"); recaptchaResponse.value = token; // Passez l'appel Ajax ici $.ajax({ url: "contact.php", type: "post", data: $("#contact-form").serialize(), dataType: "json", success: function (_response) { // La requête Ajax est un succès. _response est un objet JSON var error = _response.error; var success = _response.success; if (error != "") { // En cas d'erreur, affichez-le à l'utilisateur $("#alert").html(error); } else { // En cas de succès, affichez-le à l'utilisateur et supprimez le bouton d'envoi (non utilisé pour le moment) $("#alert").html(success); $("").remove(); $("#contact-form")[0].reset(); } }, error: function (jqXhr, json, errorThrown) { // En cas d'erreur Ajax également, affiche le résultat var error = jqXhr.responseText; $("#alert").html(error); $("#contact-form")[0].reset(); }, }); //on renouvelle le token pour envoyer un 2nd message grecaptcha .execute("***", { action: "contact", }) .then(function (token) { document.getElementById("recaptchaResponse").value = token; }); }); }); });

Eléphanteau du PHP | 37 Messages

21 avr. 2021, 13:29

PPPS : tu pourrais également re-remplir les champs du formulaire en cas d'erreur pour que l'utilisateur n'ait pas à les re-saisir. De même tu pourrais remettre le pseudo et le mail saisis lors du premier envoi.
Ça m’a donné envie de pousser un peu la chose.. pour la 1ère étape je ne sais pas trop par où commencer mais pour remettre le pseudo et le mail saisis lors du premier envoi je dois passer ma page .html en .php pour faire quelque chose de ce type ?

Code : Tout sélectionner

<form method="post" action="test.php"> <input type="text" name="exemple" value="<?php if (isset($_POST['exemple'])){echo $_POST['exemple'];} ?>" /> <input type="submit" value="envoyer" /> </form>
Ou je fais fausse route ?

Avatar du membre
Mammouth du PHP | 1609 Messages

21 avr. 2021, 14:37

Salut, alors oui c'est une bonne idée au départ sauf que dans ton cas précis le formulaire est remis à 0 via le javascript ($comment_form[0].reset();).
Au lieu de remettre tout le formulaire à 0, vide seulement le champ message.

Par exemple tu peux faire un $comment_message.val('');
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 37 Messages

21 avr. 2021, 17:16

Quand j'ai lu ton message, je me suis dit que c'était extrêmement logique et que j'aurais pu le trouver tout seul sauf que.. ça ne veut pas fonctionner, je me prends la tête dessus depuis plus d'une heure pourtant ça parait logique ce que tu me proposes.

PS : Pour tester j'ai ajouté

Code : Tout sélectionner

const $email = $("#email");
puis

Code : Tout sélectionner

$email.val('')
et ça me vide bien le mail pourtant

PPS : C'est bon j'ai trouvé, en fait il fallait que je cible #comment_content :

Code : Tout sélectionner

const $comment_content = $("#comment_content");

Code : Tout sélectionner

$comment_content.val('');

Eléphanteau du PHP | 37 Messages

21 avr. 2021, 17:38

PPPS : tu pourrais également re-remplir les champs du formulaire en cas d'erreur pour que l'utilisateur n'ait pas à les re-saisir.
Après je te laisse tranquille et je clos le sujet :D

Est-ce que je dois créer un genre de condition en JS ou en PHP ou il y a plus simple ?

Eléphanteau du PHP | 37 Messages

22 avr. 2021, 00:32

Je tente des choses en vain, voici ce que j'essaie de faire, mais je ne sais pas quoi mettre entre les ""

Code : Tout sélectionner

$.ajax({ url: "add_comment.php", method: "POST", data: form_data, dataType: "JSON", success: function(data) { if (data.error !== "") { $comment_content.val('');//ici je vide seulement le le texte saisi après validation $comment_message.html(data.error); //un formulaire (élément) contient tous ses inputs //c'est rangé par nom $comment_form[0].comment_id.value = "0"; load_comment(); } },//ici j'essaie de ne pas vider le formulaire en cas d'erreurs error: function(data) { if (data.error !== "") { $comment_message.html(data.error); $comment_form[0].comment_id.value = "0"; load_comment(); } }, });

Avatar du membre
Mammouth du PHP | 1609 Messages

22 avr. 2021, 01:58

Pourtant ça me parait pas mal dans l'idée. Tu peux utiliser console.log() pour débuguer le js. Il faut que tu utilises les outils de développement de ton navigateur (généralement onglet console pour voir les logs).
https://developer.mozilla.org/fr/docs/W ... onsole/log
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 37 Messages

22 avr. 2021, 11:06

Merci,

Si j'ai bien utilisé ce que tu me dis je ne vois pas d'erreurs dans ma console.
Je continue de chercher.

Avatar du membre
Mammouth du PHP | 1609 Messages

22 avr. 2021, 11:54

En fait la condition pour vider le champs au success ça serait plutôt if (data.error == ''), à vérifier si tu transmet une variable error à vide quand il n'y a pas d'erreur.

Perso, j'ai plutôt tendance à passer une variable succes à 0 ou 1 selon qu'il y a une erreur ou pas. Et généralement quand success est à 0 (erreur) je passe aussi une variable message avec le message d'erreur.

Ainsi dans le js j'ai un traitement du type :
success: function (data) {
    if (!data.success) {
        alert(data.message);
        return false;
    }

    // le code si la réponse est en success=1
}
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 37 Messages

23 avr. 2021, 16:57

Je n’ai pas réussi mais c’est pas grave c’est déjà pas mal pour un petit site comme le mien.
Tu m’as bien aidé en tout cas je te remercie, je passe le sujet en résolu.