Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaire

A l'attention de Desolation

Sujet résolu
    12 décembre 2011 à 16:58:43

    Bonjour Desolation,

    Suite à mon sujet sur le formulaire que j'essaye de mettre en place.

    Donc j'ai mis en place tous les checks JS et ça semble marcher: qd j'ai un champ vide ou non valide, j'ai bien un message d'erreur qui apparait à droite du champ en question avec un ptit effet fade lors de la soumission du form. Au passage je voulais mettre ce message d'erreur juste en dessous du champ concerné, mais dès que je fais le nécessaire (un simple <br /> mon message d'erreur n'apparait plus ni même au niveau console dans le code xHTML! o_O

    Sinon j'ai également mis en place les checks php (ça marche aussi).

    Qd je détecte côté JS qu'il n'y a pas ou plus d'erreurs sur le form je déclenche ma requête ajax, qui a l'air de marcher... càd que je récupère bien mes $_POST au niveau console MAIS je n'arrive pas à faire en sorte que le message de résultat apparaisse à l'écran alors qu'au niveau console il apparait bien dans l'onglet "réponse".
    J'ai l'impression que je me plante encore dans la façon d'organiser le truc. :(

    (A savoir que je ne me suis pas encore occupé de la fonction mail().)


    Voilà ma structure:

    Une page index_2.php qui contient entre autre...:
    ...
    <div id="bloc_contact_form">
       <?php 
    	include ('contact_form.php'); // page contenant le form + div de résultat juste au dessus
       ?>
    </div>
    ...
    


    Ma page contact_form.php avec ma div #message_form qui est censée récupérer à terme 2 types de messages: soit un message "ok mail envoyé" soit "Erreur: mail non envoyé ou pb" (pour l'instant pour les tests je ne travaille qu'avec un seul message générique):
    <?php if (!empty($_POST['nom']))
    {?>
    	<div id="message_form">
    	   <?php
    		if(isset($_SESSION['erreurs_form_contact']) AND $_SESSION['erreurs_form_contact'] == 0)
    		{
    			vidersession();   // j'efface les variables de sessions que j'utilise pour gérer messages d'erreurs des champs (obligatoire, nom invalide, email invalide, etc)
                                             
    		}?>
    		<?php echo htmlspecialchars($_POST['nom']);?>, votre message a bien été envoyé.
    	</div>
    <?php
    }
    else
    {?>
         <form id="contact_form" method="post">
    	   <p>
    		<label for="nom">Nom *</label>
    	        <input type="text" class="form_champs" name="nom" id="nom" value="<?php if(!empty($_POST['contact_submit']) AND !empty($_SESSION['form_nom'])) 	{ echo htmlspecialchars($_SESSION['form_nom']); }?>" /> <!-- required-->
    								
    		<span class="form_champ_erreur">
    			<?php
    			if (!empty($_POST['contact_submit']) AND !empty($_SESSION['nom_info']))
    			{
    				echo htmlspecialchars($_SESSION['nom_info']);
    			}
    		        ?>
    		</span>	
                    
                    [...]
                    idem pour les autres champs
                    [...]
                    
                    
                    <input type="submit" class="form_submit" id="contact_submit" name="contact_submit" value="Envoyer" />
    <?php
    }
    ?>
    


    Et côté JS ce que j'ai mis dans le ready:
    $(function() { 
    		$('#contact_submit').click(function() {
    			valid = true;
    			required_field = "Champ obligatoire";
    			
    			if($("#nom").val() == ""){
    				$("#nom").next(".form_champ_erreur").fadeIn().text(required_field);
    
    				valid = false;
    			} 
    			else if(!$("#nom").val().match(/^[a-z ]+$/i))
    			{
    				$("#nom").next(".form_champ_erreur").fadeIn().text("Saisissez un nom valide");
    				valid = false;
    				
    				
     			}
    			else
    			{
    				$("#nom").next(".form_champ_erreur").fadeOut();
    			}
    			
    			if($("#email").val() == ""){
    				$("#email").next(".form_champ_erreur").fadeIn().text(required_field);
    
    				valid = false;
    			}
    			else if(!$("#email").val().match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,6}$/i))
    			{                              
    				$("#email").next(".form_champ_erreur").fadeIn().text("Email invalide");
    				valid = false;
    				
     			}
    			else
    			{
    				$("#email").next(".form_champ_erreur").fadeOut();
    			}
    			
    			if($("#sujet").val() == ""){
    				$("#sujet").next(".form_champ_erreur").fadeIn().text(required_field);
    
    				valid = false;
    			} 
    			else
    			{
    				$("#sujet").next(".form_champ_erreur").fadeOut();
    			}
    			
    			if($("#message").val() == ""){
    				//$("#nom").css("border-color", "#FF0000");
    				$("#message").next(".form_champ_erreur").fadeIn().text(required_field);
    
    				valid = false;
    			} 
    			else
    			{
    				$("#message").next(".form_champ_erreur").fadeOut();
    			}
    								
    			if (valid == true)
    			{
    				alert ("true");
    				$('#contact_form').submit(function() { 
    								
    						$.ajax({
    							url: 'contact_form.php',
    							type: 'POST', 
    							data: $(this).serialize(), 
    								success: function(reponse) {
    									   alert('soumission ok');
    									   $('#message_form').hide().html(reponse).fadeIn('slow');
    							}
    						});
    						return false; 
    				});
    				
    			}				
    			return valid;
    		});
    	});
    


    La preuve en image:
    Image utilisateur


    Et côté css:
    #message_form
    {
    	width:450px;
    	color: blue;	
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2011 à 18:09:34

      Hello,

      Je suis surpris de ta structure, je n'aurais pas fait comme ça.

      Première remarque : tu as fait une erreur en voulant mélanger HTML et PHP dans la même page.

      Je vois dans ton histoire, 4 pages, les noms sont donnés arbitrairement, tu peux bien sûr les changer :
      • /index.html = HTML qui contiendra uniquement du HTML, le squelette de ton formulaire de contact, tu n'as pas besoin d'y insérer de PHP
      • /css/styles.css = le CSS de ton HTML
      • /js/ready.js = code jQuery qui va servir d'interface, il fera l’intermédiaire entre l'HTML et le PHP
      • /php/contact.php = vérifications côté serveur des données du formulaire + envoi du mail

      La div de résultat doit être cachée par défaut, un .hide() dans le ready.js et voilà. Tu l'affiches au moment du success de l'ajax.

      Sinon je n'ai pas remarqué de gros problème avec ton code jQuery donc pas grand-chose à modifier pour l'instant.

      Au niveau de ton PHP, tu dois obtenir quelque chose comme :

      <?php
      // code qui vérifie les $_POST
      // et si tout va bien envoi du mail
      
      // tu fais 2 variables :
      // $resultat = qui contiendra true ou false (false par défaut), tu changeras sa valeur dans tes if
      // si true, alors on envoie le mail
      // au même moment tu auras $resultat_texte, elle contiendra le texte à retourner à jQuery, par exemple :
      // $resultat_texte = 'mail envoyé' etc...
      echo $resultat_texte; // <= ceci envoie le texte dans le success du $.ajax()
      ?>
      


      Avec cette structure c'est beaucoup plus propre, mais ça reste mon point de vue...
      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2011 à 10:33:22

        Salut Desolation et merci pour ton retour ! :)


        Donc j'ai commencé à suivre tes conseils et j'ai viré tout ce qui était php dans mon form et je l'ai ré-intégré à ma page index_2.php (futur index.php) ...(avant je l'avais mis ce form dans une page isolée et appelée via include()).
        Au dessus du j'ai ma div de résultat et je l'ai caché par défaut.

        Une question:...

        La page "contact.php" je l'appele via include et de la manière ci-dessous c'est ça ?

        Page "index_2.php":
        <?php if (!empty($_POST['nom']))  // test sur un des champs du form pour savoir si form soumis 
        {
          include('contact.php')  //et dans cette page tests $_POST + génération var $resultat_texte
        }
        ?>
        
        <!DOCTYPE html>
        <html>
        
        </html>
        
        • Partager sur Facebook
        • Partager sur Twitter
          13 décembre 2011 à 10:44:22

          Pourquoi tu veux absolument faire un include() ? Ton formulaire sera utilisé qu'une seule fois non ?
          Tu mélanges encore HTML et PHP.
          • Partager sur Facebook
          • Partager sur Twitter
            13 décembre 2011 à 11:00:18

            ben j'comprends pas, mon form n'est plus appelé par include() ! o_O

            Tu veux dire que ma page "contact.php" sera uniquement appelé par ajax ?

            En fait ce qui me gêne (c'est pourquoi p-e je mélange) c'est comment ça peut fonctionner si le gars décide de désactiver le JS...? il faut bien que je prévoie des tests php dans mon HTML index_2.php non ?
            • Partager sur Facebook
            • Partager sur Twitter
              13 décembre 2011 à 11:33:23

              Si tu veux que ce soit accessible sans JS, j'ai une astuce.

              <form action="contact.php" method="post" id="contact_form">
              <!-- -->
              </form>
              


              Ton appel ajax :
              $('#contact_form').submit(function() {
                  $.ajax({
                      url: $(this).attr('action'), // contact.php
                      type: 'POST',
                      data: $(this).serialize()+'&js',
                      success: function(reponse) {
                          alert('soumission ok');
                          $('#message_form').hide().html(reponse).fadeIn('slow');
                      }
                  });
                  return false;
              });
              


              Dans contact.php :
              <?php
              if(isset($_POST['js'])) {
              // on est passé par l'ajax
              } else {
              // l'utilisateur a le js de désactivé ou jquery non exécuté
              }
              ?>
              

              Pourquoi faire ça ? Ton appel ajax doit retourner tout sauf de la mise en forme HTML/CSS.

              Par contre sans le JS, ton utilisateur aura donc une page sans mise en forme avec juste une phrase, pas top. Donc tu mets la mise en forme seulement dans le else.

              <?php
              if(isset($_POST['toto'])) { // ici tu mets tous les $_POST
                  // ton code de vérif
                  // avant de faire un echo tu vérifies si c'est un appel JS ou non
                  if(isset($_POST['js'])) {
                      // on est passé par l'ajax
                      $resultat = 'texte brut';
                  } else {
                      // l'utilisateur a le js de désactivé ou jquery non exécuté
                      $resultat = 'résultat avec mise en forme HTML/CSS'
                  }
                  echo $resultat;
              }
              ?>
              

              T'as compris ? ^^
              • Partager sur Facebook
              • Partager sur Twitter
                13 décembre 2011 à 12:36:13

                Citation : Desolation


                T'as compris ?



                oui va falloir qd même que je digère tout ça! :-°^^

                P-e que je vais d'abord faire le scénario où le jS est activé et ensuite je m'occuperai de l'autre ^^

                Donc petit bilan intermédiaire:
                J'arrive à avoir mon message de retour si les checks du form sont ok et si mon mail a bien été envoyé. :)

                Par contre 2 questions:
                1 - Une fois le mail envoyé et message affiché, comment puis-je effacer automatiquement les champs de mon form qui sont restés remplis ?
                2 - Comment puis-je gérer le css du message affiché du genre rouge si problème mais vert si OK? Comme ça ?

                <?php
                	$resultat_texte = '<div class="css_ok">Mail envoyé!</div>';
                   //ou
                	$resultat_texte = '<div class="css_pas_ok">Mail non envoyé!</div>';
                ?>
                
                • Partager sur Facebook
                • Partager sur Twitter
                  13 décembre 2011 à 13:33:07

                  Oui une div avec une class ça passe, pas de souci. Pour réinitialiser les champs, t'as vraiment pas une idée ?

                  Il faut déjà connaître tous les champs de ton formulaires, le code HTML complet du form car le traitement ne sera pas le même si il y a des input, des select, des checkboxes...

                  Ce serait bien que tu cherches avant que je te donne la réponse car c'est vraiment simple (itération implicite de jQuery).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 décembre 2011 à 15:15:13

                    Bon voilà c'que j'ai pondu ! ^^

                    Pas parfait encore mais j'arrive à ce que mes champs (que des input text et textarea) s'effacent après soumission du form ! :)

                    Le problème c'est que mon message de retour 'mail envoyé' (par exemple) n'apparait plus et vice-versa ! :(
                    Avec le code ci-dessous, mon alert "back ok" apparait avant le "soumission ok" d'où le problème je pense.

                    Je sais pas trop conditionner le truc.

                    if (valid == true)   // les checks du form sont ok
                    {
                    	alert ("true");
                    	$('#contact_form').submit(function() { 
                    					
                    			$.ajax({
                    				url: 'contact.php',
                    				type: 'POST', 
                    				data: $(this).serialize(), 
                    				success: function(reponse) {
                    						   alert('soumission ok');
                    						   $('#message_form').hide().html(reponse).fadeIn('slow');
                    					   		   
                    				}
                    		});
                    		
                    		return false; 
                            });
                    
                    	alert('back ok');
                    	$('#contact_form')[0].reset();
                    				
                    }						
                    return valid;
                    

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 décembre 2011 à 15:24:31

                      Pourquoi tu mets pas ton code dans le success ?

                      Sinon j'aurais pas fait la remise à zéro comme ça mais c'est pas grave si ça marche. :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 décembre 2011 à 15:38:25

                        ben j'comprends rien ! A la base je l'ai mis dans le success mais ça marchait pas et là je l'ai remis pour refaire un test et ça marche !
                        J'avais du ajouter un truc qui faisait que ça déconne! Donc du coup ça marche ! :)

                        Par contre "grâce" ou "à cause" des alerts, je remarque un comportement bizarre,
                        A chaque fois que je relance le form , les alerts "soumission ok" et "back ok" se répètent... et j'ai une répétition supplémentaire à chaque resoumission du form.

                        En gros :
                        1 ère soumission: j'ai dans l'ordre alert "true" , "soumission ok", "back ok"
                        2ème soumission: j'ai "true" , "soumission ok", "back ok", "soumission ok", "back ok"
                        3ème soumission: j'ai "true" , "soumission ok", "back ok", "soumission ok", "back ok", "soumission ok", "back ok"
                        etc

                        Rappel du code:
                        if (valid == true)   // les checks du form sont ok
                        {
                        	alert ("true");
                        	$('#contact_form').submit(function() { 
                        					
                        			$.ajax({
                        				url: 'contact.php',
                        				type: 'POST', 
                        				data: $(this).serialize(), 
                        				success: function(reponse) {
                        						   alert('soumission ok');
                        						   $('#message_form').hide().html(reponse).fadeIn('slow');
                        
                                                                           
                        	                                           alert('back ok');
                        	                                           $('#contact_form')[0].reset();
                        		
                        					   		   
                        				}
                        		});
                        		
                        		return false; 
                                });
                        		
                        }						
                        return valid;
                        


                        Sinon tu me dis que tu aurais fait autrement, comment aurais-tu fais ?

                        p.s. : bon t'as vu je deviens un monstre maintenant en jQuery hein ?! :-°:lol:
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 décembre 2011 à 16:17:19

                          Commente le "back ok". Ajoute à la ligne 5 alert('submit') et refais-moi un topo.

                          Sinon j'aurais fais $(':input').val(''); pour les input. ;)

                          PS : tu me changeras ton gestionnaire d'évènement avec le nouveau .on() (tu te rappelles je t'avais parlé d'une nouveauté jQuery 1.7 ?). Si besoin, lis mon article à ce sujet.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 décembre 2011 à 16:54:57

                            Citation : Desolation


                            Commente le "back ok". Ajoute à la ligne 5 alert('submit') et refais-moi un topo.



                            donc le nouveau topo:
                            1 ère soumission: j'ai dans l'ordre alert "true" , "submit", "soumission ok"
                            2ème soumission: j'ai "true" , "submit", "submit", "soumission ok", "soumission ok"
                            3ème soumission: j'ai "true" , "submit", "submit", "submit", "soumission ok", "soumission ok", "soumission ok"
                            etc

                            Citation : Desolation


                            Sinon j'aurais fais $(':input').val(''); pour les input.




                            Les 2 méthodes se valent ou la tienne est "meilleure" ?

                            Citation : Desolation


                            PS : tu me changeras ton gestionnaire d'évènement avec le nouveau .on() (tu te rappelles je t'avais parlé d'une nouveauté jQuery 1.7 ?). Si besoin, lis mon article à ce sujet.



                            J'ai ni ".bind()" , ni ".live()" dans mon code, je dois qd même changer qqch ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 décembre 2011 à 18:04:20

                              Faut que tu me passes tout le code parce que là je peux pas trouver pourquoi ça fait ça.

                              Les 2 méthodes se valent.

                              .submit() est un alias de .bind('submit'), donc à partir de là tu devrais savoir ce qu'il faut mettre. Et tu te doutais bien qu'il y aurait quelque chose à changer sinon je n'aurais pas fait la remarque. :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 décembre 2011 à 10:10:19

                                Comme tu n'avais pas tout le code, je pensais que tu faisais la remarque au cas où ... :)

                                Donc ci-dessous tout le code avec les modifs ".on()" (j'ai laissé en comm le code précédent au cas où j'me sois planté)


                                $('#message_form').hide();    // ça c'est la div de résultat (message de retour)
                                	$('#ste').hide();             // div de sécurité (anti-bots) que je cache par défaut
                                	
                                	
                                	$(function() { 
                                		$('#contact_submit').on('click', function() {
                                						  //.click(function() {
                                			valid = true;
                                			required_field = "Champ obligatoire";
                                			
                                			if($("#nom").val() == ""){
                                				$("#nom").next(".form_champ_erreur").fadeIn().text(required_field);
                                
                                				valid = false;
                                			} 
                                			else if(!$("#nom").val().match(/^[a-z 'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/i))
                                			{
                                				$("#nom").next(".form_champ_erreur").fadeIn().text("Saisissez un nom valide");
                                				valid = false;
                                				
                                				
                                 			}
                                			else
                                			{
                                				$("#nom").next(".form_champ_erreur").fadeOut();
                                			}
                                			
                                			if($("#email").val() == ""){
                                				$("#email").next(".form_champ_erreur").fadeIn().text(required_field);
                                
                                				valid = false;
                                			}
                                			else if(!$("#email").val().match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,6}$/i))
                                			{                              
                                				$("#email").next(".form_champ_erreur").fadeIn().text("Email invalide");
                                				valid = false;
                                				
                                 			}
                                			else
                                			{
                                				$("#email").next(".form_champ_erreur").fadeOut();
                                			}
                                			
                                			if($("#sujet").val() == ""){
                                				$("#sujet").next(".form_champ_erreur").fadeIn().text(required_field);
                                
                                				valid = false;
                                			} 
                                			else
                                			{
                                				$("#sujet").next(".form_champ_erreur").fadeOut();
                                			}
                                			
                                			if($("#message").val() == ""){
                                				
                                				$("#message").next(".form_champ_erreur").fadeIn().text(required_field);
                                
                                				valid = false;
                                			} 
                                			else
                                			{
                                				$("#message").next(".form_champ_erreur").fadeOut();
                                			}
                                				
                                			if (valid == true)
                                			{
                                				alert ("true");
                                				$('#contact_form').on('submit', function() {
                                								//.submit(function() { 
                                						alert('submit');		
                                						$.ajax({
                                							url: 'contact.php',
                                							type: 'POST', 
                                							data: $(this).serialize(), 
                                							success: function(reponse) {
                                								alert('soumission ok');
                                								$('#message_form').hide().html(reponse).fadeIn('slow');
                                								
                                								$('#contact_form')[0].reset();
                                									 								   
                                							}
                                						});
                                						
                                						return false; 
                                				});
                                								
                                			}						
                                			return valid;
                                					
                                		});
                                	});
                                

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 décembre 2011 à 10:21:22

                                  Je savais que tu allais pas tarder. ^^

                                  Ok pour les .on() tu as fait les bonnes modifs.

                                  Des remarques mais qui ne vont pas faire avancer.
                                  • Remplace tes " par des '. On utilise de préférence les " seulement pour entourer les valeurs des attributs HTML.
                                  • Pour davantage de performance, lorsque tu dois utiliser plus d'une fois un sélecteur, crée une variable intermédiaire contenant l'objet. Par exemple tu utilises plusieurs fois $('#nom') mais le JS va à chaque fois "le chercher" dans le DOM. Tu peux stocker son emplacement en faisant :

                                  var $nom = $('#nom');
                                  // on utilise ensuite $nom
                                  // on précède volontairement le nom de la variable par $
                                  // pour que l'on sache qu'elle contient un objet jQuery
                                  


                                  Pour ton problème, commente le return valid; à la fin, il me semble pas utile.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 décembre 2011 à 10:47:37

                                    Citation : Desolation


                                    Je savais que tu allais pas tarder. ^^



                                    J'pensais pas que mes problèmes te manquaient tant !! :p;)

                                    Trêve de balivernes (expression utilisée la dernière fois en 1782... ), le code mis à jour avec tes recommandations:
                                    Malhrsmt j'ai le même scénario :(
                                    $('#message_form').hide();
                                    $('#ste').hide();
                                    	
                                    
                                    $(function() { 
                                    		$('#contact_submit').on('click', function() {
                                    						  //.click(function() {
                                    			valid = true;
                                    			required_field = "Champ obligatoire";
                                    			
                                    			var $nom     = $('#nom');
                                    			var $email   = $('#email');
                                    			var $sujet   = $('#sujet');
                                    			var $message = $('#message');
                                    			
                                    			if($nom.val() == ''){
                                    				$nom.next('.form_champ_erreur').fadeIn().text(required_field);
                                    
                                    				valid = false;
                                    			} 
                                    			else if(!$nom.val().match(/^[a-z 'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/i))
                                    			{
                                    				$nom.next('.form_champ_erreur').fadeIn().text("Saisissez un nom valide");
                                    				valid = false;
                                    				
                                    				
                                     			}
                                    			else
                                    			{
                                    				$nom.next('.form_champ_erreur').fadeOut();
                                    			}
                                    			
                                    			if($email.val() == ''){
                                    				$email.next('.form_champ_erreur').fadeIn().text(required_field);
                                    
                                    				valid = false;
                                    			}
                                    			else if(!$email.val().match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,6}$/i))
                                    			{                              
                                    				$email.next('.form_champ_erreur').fadeIn().text("Email invalide");
                                    				valid = false;
                                    				
                                     			}
                                    			else
                                    			{
                                    				$email.next('.form_champ_erreur').fadeOut();
                                    			}
                                    			
                                    			if($sujet.val() == ''){
                                    				$sujet.next('.form_champ_erreur').fadeIn().text(required_field);
                                    
                                    				valid = false;
                                    			} 
                                    			else
                                    			{
                                    				$sujet.next('.form_champ_erreur').fadeOut();
                                    			}
                                    			
                                    			if($message.val() == ''){
                                    				//$("#nom").css("border-color", "#FF0000");
                                    				$message.next('.form_champ_erreur').fadeIn().text(required_field);
                                    
                                    				valid = false;
                                    			} 
                                    			else
                                    			{
                                    				$message.next('.form_champ_erreur').fadeOut();
                                    			}
                                    				
                                    			if (valid == true)
                                    			{
                                    				alert ('true');
                                    				$('#contact_form').on('submit', function() {
                                    								//.submit(function() { 
                                    						alert('submit');		
                                    						$.ajax({
                                    							url: 'contact.php',
                                    							type: 'POST', 
                                    							data: $(this).serialize(), 
                                    							success: function(reponse) {
                                    								alert('soumission ok');
                                    								$('#message_form').hide().html(reponse).fadeIn('slow');
                                    								
                                    								$('#contact_form')[0].reset();
                                    									 								   
                                    							}
                                    						});
                                    						
                                    						return false; 
                                    				});
                                    								
                                    			}						
                                    			//return valid;
                                    					
                                    		});
                                    	});
                                    



                                    p.s. : une question au passage: quand on déclare une variable quelle est la différence entre mettre un "var" et pas en mettre?


                                    EDIT 10h55:
                                    1- comment je peux connaître tous les alias de bind pour savoir qd est-ce que je dois utiliser .on() ? ici ?
                                    2- j'utilise plusieurs fois next('.form_champ_erreur'), est-ce qu'il a moyen de mettre tout ça en variable de la même manière qu'avec les $nom, $message, etc ?
                                    FIN EDIT 10h55
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 décembre 2011 à 11:26:50

                                      Concernant le var, voir les explications techniques. Côté pratique ça te permet d'un seul coup d'oeil de connaître la portée de ta variable (utile dans un long code où ta variable est utilisée un peu partout). En bref dis-toi que utiliser var, c'est mieux. :)

                                      Pour tous les alias des .bind() tu as trouvé le bon lien, mais tous ne sont pas des alias. Dis-toi que les alias sont pour : souris et clavier (ceux classés dans Mouse Events, Keyboard Events et Form Events).

                                      Pour ton histoire de .next(), je te conseille de faire une fonction qui prendra en paramètres l'objet jQuery ainsi que le texte à afficher. ;)

                                      Pour ton problème d'alert je ne vois pas. Il me faudrait une page de test.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 décembre 2011 à 11:34:32

                                        Merci Desolation, je t'envoie le lien par MP.

                                        Citation : Desolation


                                        Pour ton histoire de .next(), je te conseille de faire une fonction qui prendra en paramètre l'objet jQuery ainsi que le texte à afficher.



                                        ok j'vais essayer de réfléchir à tout ça... :)


                                        Merci pour les explications var et .bind()
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 décembre 2011 à 12:14:08

                                          Je pense avoir compris.

                                          Dans ton ready.js, ça commence par :

                                          $(document).ready(function () {
                                          


                                          Ce qui est normal. Mais avant ton gestionnaire de submit tu as mis :

                                          $(function() {
                                          


                                          C'est un alias de celui du dessus. Donc 2 ready imbriqués c'est pas top, supprime le second.

                                          Si tu veux que ce soit plus sexy, au lieu d'un message d'erreur, mets soit une croix rouge, soit une coche verte. ;)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 décembre 2011 à 12:29:25

                                            J'ai supprimé le "$(function() { " mais ça ne résoud pas le souci qui reste le même ! :'(

                                            Pour l'idée déco tu parles du petit message d'erreur à droite de chaque champ si invalide (avec lequel j'ai des soucis de placement, il faudra que je 'en aprle) ou celui au dessus du forme?
                                            Si c'est ce dernier, juste un icône sans message ça risque pas de faire un peu ledge ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 décembre 2011 à 13:58:40

                                              Oui je parle des messages pour chaque champ.

                                              Je comprends toujours pas.

                                              Voici un ready.js tout propre, mieux indenté, essaye avec.

                                              $(document).ready(function() {
                                              
                                                  $('#nav li a').on('click', function() {
                                                      $('#nav li a').removeClass('active');
                                                      $(this).addClass('active');
                                                      var id = $(this).attr('href');
                                                      scrollTo(id);
                                                      return false;
                                                  });
                                              
                                                  function scrollTo(target) {
                                                      if ($(target).length >= 1) {
                                                          height = $(target).offset().top - 130;
                                                      }
                                                      $('html, body').animate({
                                                          scrollTop: height
                                                      }, 1200);
                                                      return false;
                                              
                                                  }
                                              
                                                  $('#message_form').hide();
                                                  $('#ste').hide();
                                              
                                                  $('#contact_submit').on('click', function() {
                                              		valid = false;
                                              		required_field = "Champ obligatoire";
                                              
                                              		var $nom = $('#nom');
                                              		var $email = $('#email');
                                              		var $sujet = $('#sujet');
                                              		var $message = $('#message');
                                              
                                              		if ($nom.val() == '') {
                                              			$nom.next('.form_champ_erreur').fadeIn().text(required_field);
                                              		} else if (!$nom.val().match(/^[a-z 'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/i)) {
                                              			$nom.next('.form_champ_erreur').fadeIn().text("Saisissez un nom valide");
                                              		} else {
                                              			$nom.next('.form_champ_erreur').fadeOut();
                                              			valid = true;
                                              		}
                                              
                                              		if ($email.val() == '') {
                                              			$email.next('.form_champ_erreur').fadeIn().text(required_field);
                                              		} else if (!$email.val().match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,6}$/i)) {
                                              			$email.next('.form_champ_erreur').fadeIn().text("Email invalide");
                                              		} else {
                                              			$email.next('.form_champ_erreur').fadeOut();
                                              			valid = true;
                                              		}
                                              
                                              		if ($sujet.val() == '') {
                                              			$sujet.next('.form_champ_erreur').fadeIn().text(required_field);
                                              		} else {
                                              			$sujet.next('.form_champ_erreur').fadeOut();
                                              			valid = true;
                                              		}
                                              
                                              		if ($message.val() == '') {
                                              			$message.next('.form_champ_erreur').fadeIn().text(required_field);
                                              		} else {
                                              			$message.next('.form_champ_erreur').fadeOut();
                                              			valid = true;
                                              		}
                                              
                                                      if(valid) {
                                                          alert('true');
                                                          $('#contact_form').on('submit', function() {
                                                              alert('submit');
                                                              $.ajax({
                                                                  url: 'contact.php',
                                                                  type: 'POST',
                                                                  data: $(this).serialize(),
                                                                  success: function(reponse) {
                                                                      alert('soumission ok');
                                                                      $('#message_form').hide().html(reponse).fadeIn('slow');
                                              
                                                                      $('#contact_form')[0].reset();
                                                                  }
                                                              });
                                                              return false;
                                                          });
                                              
                                                      }
                                                  });
                                              
                                              
                                              	$('#home_slider').nivoSlider({
                                              		effect: 'random', // Specify sets like: 'fold,fade,sliceDown'
                                              		slices: 15, // For slice animations
                                              		boxCols: 8, // For box animations
                                              		boxRows: 4, // For box animations
                                              		animSpeed: 500, // Slide transition speed
                                              		pauseTime: 3000, // How long each slide will show
                                              		startSlide: 0, // Set starting Slide (0 index)
                                              		directionNav: true, // Next & Prev navigation
                                              		directionNavHide: true, // Only show on hover
                                              		controlNav: true, // 1,2,3... navigation
                                              		controlNavThumbs: false, // Use thumbnails for Control Nav
                                              		controlNavThumbsFromRel: false, // Use image rel for thumbs
                                              		controlNavThumbsSearch: '.jpg', // Replace this with...
                                              		controlNavThumbsReplace: '_thumb.jpg', // ...this in thumb Image src
                                              		keyboardNav: true, // Use left & right arrows
                                              		pauseOnHover: true, // Stop animation while hovering
                                              		manualAdvance: false, // Force manual transitions
                                              		captionOpacity: 0.8, // Universal caption opacity
                                              		prevText: 'Prev', // Prev directionNav text
                                              		nextText: 'Next', // Next directionNav text
                                              		randomStart: false, // Start on a random slide
                                              		beforeChange: function() {}, // Triggers before a slide transition
                                              		afterChange: function() {}, // Triggers after a slide transition
                                              		slideshowEnd: function() {}, // Triggers after all slides have been shown
                                              		lastSlide: function() {}, // Triggers when last slide is shown
                                              		afterLoad: function() {} // Triggers when slider has loaded
                                              	});
                                              
                                              	$('a.zbx').zoombox({
                                              		theme: 'prettyphoto', //available themes : zoombox,lightbox, prettyphoto, darkprettyphoto, simple
                                              		opacity: 0.8,
                                              		duration: 800,
                                              		animation: true,
                                              		//width       : 800,              
                                              		//height      : 600,            
                                              		gallery: true, // Allow gallery thumb view
                                              		autoplay: false // Autoplay for video
                                              	});
                                              
                                                  $('#maintenance').hide().fadeIn('slow');
                                              });
                                              


                                              Peut-être qu'il serait intéressant de tester ton form sur une page à part sans rien d'autre, une page brute. Ce que tu aurais dû faire.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                14 décembre 2011 à 14:22:21

                                                Citation : Desolation


                                                Oui je parle des messages pour chaque champ.



                                                C'était dans mon idée mais je pense qu'il est pertinent de préciser un message non pour dire "champ obligatoire",ou "champ invalide" ou...?

                                                Citation : Desolation


                                                Je comprends toujours pas.

                                                Voici un ready.js tout propre, mieux indenté, essaye avec.



                                                J'ai mis ton code, pas mieux... j'ai même du rajouter le "return valid" après ligne 84 car sinon après soumission, ça remonte tout en haut de la page ! o_O

                                                Citation : Desolation


                                                Peut-être qu'il serait intéressant de tester ton form sur une page à part sans rien d'autre, une page brute. Ce que tu aurais dû faire.



                                                J'comprends pas c'est c'que j'avais fait et tu m'as demandé pourquoi je passais par un include ?! o_O
                                                Du coup j'avais rapatrié mon form dans ma page index_2.php !
                                                J'ai encore tout compris j'ai l'impression !! :(
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 décembre 2011 à 14:26:18

                                                  OMG j'ai compris, comment j'ai pas pu le voir !!!!!!

                                                  Donc, à la place de return valid tu mets return false.

                                                  Ensuite dans le code que je viens de donner, regarde les lignes 25 et 68... Et agis en conséquence. :)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 décembre 2011 à 14:54:12

                                                    j'comprends paaaaas ! :pirate:

                                                    P-e que c'est une histoire de boucle dans la boucle non ?
                                                    J'ai essayé d'isoler le bloc de lignes 66 à 84 mais c'est pas ça visiblement .

                                                    Je sèche... :(
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      14 décembre 2011 à 15:02:07

                                                      T'es sérieux ???

                                                      $('#contact_submit').on('click', function() {
                                                      => au clic sur le bouton submit

                                                      $('#contact_form').on('submit', function() {
                                                      => à la soumission du form. Cela peut être fait de 2 manières :
                                                      un appui sur la touche Entrée si on a le focus dans un input ou au clic sur le bouton submit.

                                                      Pour l'accessibilité (non-voyants) on utilise le 2e.

                                                      Donc ton code devient :

                                                      $('#contact_form').on('submit', function() {
                                                          valid = false;
                                                          required_field = "Champ obligatoire";
                                                      
                                                          var $nom = $('#nom');
                                                          var $email = $('#email');
                                                          var $sujet = $('#sujet');
                                                          var $message = $('#message');
                                                      
                                                          if ($nom.val() == '') {
                                                              $nom.next('.form_champ_erreur').fadeIn().text(required_field);
                                                          } else if (!$nom.val().match(/^[a-z 'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/i)) {
                                                              $nom.next('.form_champ_erreur').fadeIn().text("Saisissez un nom valide");
                                                          } else {
                                                              $nom.next('.form_champ_erreur').fadeOut();
                                                              valid = true;
                                                          }
                                                      
                                                          if ($email.val() == '') {
                                                              $email.next('.form_champ_erreur').fadeIn().text(required_field);
                                                          } else if (!$email.val().match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,6}$/i)) {
                                                              $email.next('.form_champ_erreur').fadeIn().text("Email invalide");
                                                          } else {
                                                              $email.next('.form_champ_erreur').fadeOut();
                                                              valid = true;
                                                          }
                                                      
                                                          if ($sujet.val() == '') {
                                                              $sujet.next('.form_champ_erreur').fadeIn().text(required_field);
                                                          } else {
                                                              $sujet.next('.form_champ_erreur').fadeOut();
                                                              valid = true;
                                                          }
                                                      
                                                          if ($message.val() == '') {
                                                              $message.next('.form_champ_erreur').fadeIn().text(required_field);
                                                          } else {
                                                              $message.next('.form_champ_erreur').fadeOut();
                                                              valid = true;
                                                          }
                                                      
                                                          if (valid) {
                                                              alert('true');
                                                              alert('submit');
                                                              $.ajax({
                                                                  url: 'contact.php',
                                                                  type: 'POST',
                                                                  data: $(this).serialize(),
                                                                  success: function(reponse) {
                                                                      alert('soumission ok');
                                                                      $('#message_form').hide().html(reponse).fadeIn('slow');
                                                      
                                                                      $('#contact_form')[0].reset();
                                                                  }
                                                              });
                                                          }
                                                          return false; // on empêche le navigateur de soumettre lui-même le form
                                                      });
                                                      


                                                      Et je t'avais dit d'ajouter dans <form> le action. De sorte à ce que le form soit envoyé si le JS est désactivé. Et ensuite dans ton ajax url: $(this).attr('action'),

                                                      if(valid) équivaut à if(valid == true)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        14 décembre 2011 à 16:06:43

                                                        Ca marche bcp mieux, merci Desolation!!! :)

                                                        D'ailleurs une ptite remarque: j'ai essayé avec "$('#contact_submit').on('click', function() {" à la place de "$('#contact_form').on('submit', function() {" mais ça déconne complet... qd je soumets le form, ce n'est pas mon message de retour qui est affiché mais toute la page ! o_O
                                                        Mais bref j'utilise le submit() et ça marche !

                                                        MAIS... car il y a tjrs un p*%*!*! de MAIS... :colere: j'ai un souci avec le scénario suivant:
                                                        1ère soumission: champs valides, message affiché et mail envoyé... le contenu des champs est ré-initialisé... c'est OK
                                                        2ème soumission: je remplie tous mes champs mais je saisie volontairement un mail invalide: résultat: j'ai bien mon message à droite de mon mon champ email "email invalide" mais il me ressoumet qd même le form alors que ma variable "valid" est logiquement à "false"! o_O et du coup le contenu de tous les champs (dont les valides) est ré-initialisé + message général (form comporte des erreurs) qui s'affiche (mais ça au pire pas gênant)

                                                        Ma question est donc: "Pourquoi mon form se resoumet" ???
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          14 décembre 2011 à 16:18:52

                                                          Citation : Claw69

                                                          Ca marche bcp mieux, merci Desolation!!! :)

                                                          D'ailleurs une ptite remarque: j'ai essayé avec "$('#contact_submit').on('click', function() {" à la place de "$('#contact_form').on('submit', function() {" mais ça déconne complet... qd je soumets le form, ce n'est pas mon message de retour qui est affiché mais toute la page ! o_O
                                                          Mais bref j'utilise le submit() et ça marche !


                                                          Normal tu vas faire un $(this).serialize() sur un input puisque $(this) sera ton input. Donc tes $_POST seront pas envoyées, donc tu rentreras pas dans ton if() PHP.

                                                          Pour l'autre problème c'est normal. Soit tu fais valid = false dans chaque petit if soit avant chaque "grand" if tu fais un if(valid).

                                                          1. valid vaut false au début,
                                                          2. il passe le nom il prend true,
                                                          3. ensuite on le remet pas à false donc il va déclencher la requête ajax.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            14 décembre 2011 à 16:55:54

                                                            Ca maaarrrche !! :D

                                                            En fait je crois que ça fait comme la dernière fois, trop la tête dedans, et du coup je ne vois même plus les problèmes évidents! :waw:

                                                            Par contre j'ai changé la technique pour tester la validité des champs.
                                                            J'ai viré ma variable "valid" et je passe par "nb_err" qui compte le nb d'erreurs trouvées. J'ai gardé tous mes ifs et à chaque fois que je rencontre une erreur j'incrémente "nb_err", du coup je n'ai plus qu'à tester si nb_err == 0 ! :)
                                                            Et en + ça m'allège le code !

                                                            Bon va falloir que je m'occupe un peu de la déco.

                                                            Comme je le disais dans un des posts au-dessus, si j'essaye de passer le message dinvalidité en dessous du champ et pas à droite, ce dernier ne s'affiche pas, je comprends rien! o_O
                                                            Du coup comme j'ai encore un peu de marge à droite, je pense que je vais le garder à droite!

                                                            Que penses-tu de faire des checks à chaque saisie d'un champ et pas attendre le submit ? gadget ? polluant ? ... ou pas ?

                                                            En tout cas merci encore pour ton aide et ta patience!
                                                            C'est vraiment sympa ! :)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              14 décembre 2011 à 17:29:19

                                                              Garde a droite c'est mieux, je maintiens mon choix pour la petite image plutot qu'un texte d'erreur, et en dessous de l'input ca fait moche.

                                                              Faire la vérif sur chaque champ est utile si ta soumission n'est pas gérée en JS. Comme ca on évite le submit php si on sait qu'il va renvoyer un message d'erreur.

                                                              Etant donné que tu fais ton submit en ajax, la vérification au submit est un bon compromis.

                                                              Sinon, tu devais faire une fonction pour l'affichage des erreurs, t'en es ou ?
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Formulaire

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown