[RESOLU] formulaire améliorations

Eléphanteau du PHP | 15 Messages

25 août 2013, 21:21

Oui en fait je t'explique;

Si tu veux je voulais pourvoir afficher à la fin de mon fichier php (si le js n'est pas activé) un message stipulant que l'envoi est un succès ou un échec!
Le problème c'est que si je le fait (voir si dessus mon code php), ben on se retrouve avec un réponse de ce style:

{erreurnom : true, erreurmail : false, validmail: false, etc}message bien envoyé

Json récupère tout. Si je n'ai que "{erreurnom : true, erreurmail : false, validmail: false, etc}" pas de soucis: mon jquery marche super.
Mais dès que j'ai qqch en dehors de {} ben plus rien tout le code s'arrête (ou ne fonctionne pas) et c'est ça que je ne comprends pas.

Pour moi (et ma compréhension et ma logique) je traite le json et ce qui m'interesse c'est ce qu'il y a entre {}...
Je ne vois aps pourquoi mon code fonctionne plus dès qu'il y a un truc en dehors...

ViPHP
xTG
ViPHP | 7331 Messages

25 août 2013, 21:31

Ce qu'il te faut c'est savoir si la requête est asynchrone ou non.
Pour cela tu peux simplement rajouter un paramètre dans l'url pour distinguer les deux traitements.

Mais j'avoue ne pas trop comprendre ton système.
Si ton formulaire te redirige vers cette page, qu'affiches tu dans le cas où tu y arrives car le JS est désactivé ?
Tu réouvres les balises html et insères tout le contenant de ton site ?

Le plus optimal serait de gérer des pseudo-frames.
A savoir un script qui ne génère que la réponse et que tu insères dans ton site.
Dans le cas d'un appel Ajax tu ne cibles pas l'url de pseudo-frame mais directement le fichier de traitement qui grâce au paramètre (que j'ai énoncé plus haut) traitera non pas une réponse HTML mais une réponse JSON.

Eléphanteau du PHP | 15 Messages

25 août 2013, 23:45

heuuuu j'ai pas trop pigé mais merci...
C'est justement ce que je cherche à faire!
Si j'avais la possibilité de mettre des echo autre que echojson dans mon php tout est réglé!

Mon code js:

Code : Tout sélectionner

$(document).ready(function() { $('#hide').removeClass('nojs').addClass('hasjs'); var $form = $('#monForm'); $('#envoyer').on('click', function() { $form.trigger('submit'); return false; }); $form.on('submit', function() { var nom = $('#nom').val(); var email = $('#email').val(); var message = $('#message').val(); var spam =$('#spam').val(); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: $(this).serialize(), dataType: 'json', success: function(json) { if(json.valide == false){ if (json.errorspam == true){ $('#success').html("Test spam failed"); $('#errormessage').html(""); $('#erroremail').html(""); $('#errornom').html(""); } if (json.erreurnom == true){ $('#errornom').html("erreur nom"); $('#nom').css({"background-color": "yellow"}); $('#success').html(""); }else{ $('#errornom').html(""); } if (json.erreuremail == true){ $('#erroremail').html("erreur email"); $('#success').html(""); }else{ $('#erroremail').html(""); } if (json.emailinvalide == true){ $('#erroremail').html("email invalide"); $('#success').html(""); }else if(json.erreuremail == true){ $('#erroremail').html("erreur email"); $('#success').html(""); }else{ $('#erroremail').html(""); } if (json.erreurmessage == true){ $('#errormessage').html("erreur message"); $('#success').html(""); }else{ $('#errormessage').html(""); } }else{ $('#success').html("succes!"); $('#errormessage').html(""); $('#erroremail').html(""); $('#errornom').html(""); } } }); return false; }); });

C'est plus facile pour en parler.
Pour le php, je l'ai mis plus haut mais je vous le remets ici:
<?php
 
$n = array();
 
if (!empty($_POST))
{
   $valid = true;
	
	if (!empty($_POST['spam']) && !($_POST['spam'] == '4' || $_POST['spam'] == 'four')) 
	{
	$valid = false;
	$erreur = 'erreur spam';
	$n['errorspam'] = true;
	$n['valide'] = $valid;
	echo json_encode($n);
	exit();
	}
	
	if ( (isset($_POST['nom'])) && (strlen(trim($_POST['nom'])) > 0) )
	{
		$nom = stripslashes(strip_tags($_POST['nom']));	
	}
    else
    {
        $valid = false;
        $erreur = 'Erreur nom';
        $n['erreurnom'] = true;
		$nom= '';
    }


    if ( (isset($_POST['email'])) && (strlen(trim($_POST['email'])) > 0) )
	{
		if (preg_match('/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i', $_POST['email']))
    	{
			$email = stripslashes(strip_tags($_POST['email']));
		}
		else
		{	
			$valid = false;
			$erreur = 'Votre email n\'est pas valide';
			$n['erreuremail'] = false;
			$n['emailinvalide'] = true;
			$email='';
		}
    }
	else
    {
        $valid = false;
        $erreur = 'Erreur email';
        $n['emailinvalide'] = false;
        $n['erreuremail'] = true;
		$email='';
    }
		

    if ( (isset($_POST['message'])) && (strlen(trim($_POST['message'])) > 0) )
	{
        $message = stripslashes(strip_tags($_POST['message']));
	}
	else
    {
        $valid = false;
        $erreur = 'Erreur message';
        $n['erreurmessage'] = true;
		$message = '';
    }
}

else
{
    $valid = false;
}	
$n['valide'] = $valid;
echo json_encode($n);


if ($valid = true)
{
	
    $destinataire = "[email protected]";
    $contenu      = "Nom de l'expéditeur : ".$nom."\n";
    $contenu     .= $message."\n";
    $headers  = 'From:'.$nom.'<'.$email."> \n"; 

	if ( (empty($nom)) && (empty($email)) && (preg_match('/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i', $_POST['email'])) && (empty($message)) )
	{
        'echec :( <br /><a href="contact.html">Retour au formulaire</a>';
	}
	// ENCAPSULATION DES DONNEES
    else
	{
        mail($destinataire,$objet,utf8_decode($contenu),$headers);
        'Formulaire envoyé';
	}
}
?>


Voilà où j'en suis...
Comme je l'ai dit j'ai un "echo json_encode($n);" avec dedans toute les valeurs true-false dont j'ai besoin pour mon ajax dans mon jquery.
MON problème: c'est que si je fais un echo d'autre chose mon jquery est TOTALEMENT bloqué: il n'y a pas de json! (json n'est pas renvoyé)

Pourquoi?

ViPHP
xTG
ViPHP | 7331 Messages

26 août 2013, 07:32

Si il est bien envoyé, mais jQuery n'est pas capable de le parser. :)
Tu ne dois rien ajouter après ton echo json, pourquoi vouloir rajouter quelque chose ?
Si tu dois rajouter des informations il faut que ce soit dans ton json.

Eléphanteau du PHP | 15 Messages

26 août 2013, 11:00

Si il est bien envoyé, mais jQuery n'est pas capable de le parser. :)
Tu ne dois rien ajouter après ton echo json, pourquoi vouloir rajouter quelque chose ?
Si tu dois rajouter des informations il faut que ce soit dans ton json.
Ok je vois... Mais c'est envoyer des infos inutiles en fait.
Je voulais qu'il y ait au moins un message disant que c'est bien envoyé ou non si JS était désactivé!.

Mais j'ai trouvé une astuce: à la fin de mon code php, j'ai détecter si js est activé.
Si oui : json est codé et echo json puis exit.
Si non: j'envoie (par un require) un code d'erreurs php avec lien retour au formulaire.

Eléphanteau du PHP | 15 Messages

27 août 2013, 16:56

Par contre j'ai un nouvel immense probleme:
que le form soit juste ou non, il m'envoie le mail... :-(
Le plus incroyable c'est si je fais exprès de faire capoter le condition, ça fonctionne quand même: j'ai besoin d'aide svp

edit: je suis bête :il manquait un egal (=) dans la condition