Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaire de calcul de devis

    27 octobre 2009 à 23:49:10

    Salut à tous !

    Je cherche à créer un formulaire de calcul de devis. Alors pas de panique, je sais comment faire un formulaire et l'envoyer par mail :p Mais là je voudrais que ce formulaire ai la particularité de calculer un prix à ma place. Je m'explique :
    L'utilisateur peut choisir de bénéficier d'un service ou non en cochant des cases. Selon les cases qu'il a coché le prix indiqué n'est pas le même :

    [X] Service n°1 ........ 10€
    [ ] Service n°2 ........ 10€
    [ ] Service n°3 ........ 10€
    [X] Service n°4 ........ 10€
    _____________________________
    Total ................... 20€

    Et le prix se modifie en fonction, ensuite en validant il le reçoit par mail. Je pense que ça doit se faire en combinant javascript et PHP mais je bloque au calcul du prix en direct :(
    • Partager sur Facebook
    • Partager sur Twitter
      27 octobre 2009 à 23:54:14

      En fait, aucun rapport avec PHP.
      Apparemment, toi ce que tu veux c'est affiché le prix total en live.
      pour ca 2-3 calcul en JS et c'est réglé.
      PHP ne s'occupe ensuite que de vérifier quelles cases sont cochées ou non.
      • Partager sur Facebook
      • Partager sur Twitter
        29 octobre 2009 à 0:00:32

        Salut IGstaff

        Merci pour ta réponse. Je galère pas mal depuis hier. Je bosse la dessus mais je n'ai pas du tout avancé.
        J'ai trouvé sur le SDZ un script JS qui calcule parfaitement en temps réel mais je n'arrive pas à envoyer le résultat par mail (voir le sujet).

        Toujours sur SDZ j'ai également trouvé un script entièrement en PHP qui calcule très bien (et qui dans l'absolu me suffirait). Il donne le résultat grâce à la fonction echo mais là encore je n'arrive pas à envoyer la valeur par mail. Voilà ce que ça donne :

        <form>
        OPTION 1
        <select name="option1">
        <option value="5">Oui</option>
        <option value="0">Non</option>
        </select>
        
        QUANTITE
        <select name="quantite">
        <option value="100">100</option>
        <option value="200">200</option>
        </select>
        
        OPTION 2
        Vert <input name="crea" type="radio" value="10" />
        Jaune <input name="crea" type="radio" value="5" />
        <input name="submit" type="submit" value="CALCULER"  />
        </form>
        
        <form method="post" action="scripts/formdevis.php">
        <?php if(isset($_GET['submit']))
        {
             echo 'PRIX : '.(intval($_GET['option1']) + intval($_GET['quantite']) + intval($_GET['option2']));
        }
        ?>
        <input name="submit" type="submit" id="submit" value="ENVOI MAIL" />
        </form>
        


        Le deuxième exemple fonctionne et j'arrive même à l'envoyer, mais je ne sais pas comment extraire les différentes valeurs pour les afficher dans le mail en guise de récapitulatif.

        Je sens que je touche au but mais j'ai beaucoup de mal à modifier les codes pour en faire ce que je veux :/
        • Partager sur Facebook
        • Partager sur Twitter
          29 octobre 2009 à 0:20:33

          J'ai rajouté du Javascript pour le calcul en direct :

          <script type="text/javascript">
          function prix()
          {
          	var option1 = parseInt(document.getElementById('option1').value);
          	var quantite = parseInt(document.getElementById('quantite').value);
          	var option2 = parseInt(document.getElementById('option2').value);
          	var resultat = option1 + option2 + quantite;
          	document.getElementById('prix').innerHTML = resultat;
          	document.getElementById('mail_option1').value = option1;
          	document.getElementById('mail_option2').value = option2;
          	document.getElementById('mail_quantite').value = quantite;
          }
          </script>
          <form>
          OPTION 1
          <select onchange="prix()" id="option1" name="option1">
          <option selected="selected" value="5">Oui</option>
          <option value="0">Non</option>
          </select>
          
          QUANTITE
          <select onchange="prix()" id="quantite" name="quantite">
          <option selected="selected" value="100">100</option>
          <option value="200">200</option>
          </select>
          
          OPTION 2
          <select onchange="prix()" id="option2" name="option2">
          <option selected="selected" value="10">Jaune</option>
          <option value="5">Vert</option>
          </select>
          <br/>
          Prix : <span id="prix">115</span>
          </form>
          
          <form method="post" action="scripts/formdevis.php">
          <input id="mail_option1" name="option1" value="5" style="display:none;"/>
          <input id="mail_quantite" name="quantite" value="100" style="display:none;"/>
          <input id="mail_option2" name="option2" value="10" style="display:none;"/>
          <input name="submit" type="submit" id="submit" value="ENVOI MAIL" />
          </form>
          


          Après t'as plus qu'à récupérer les infos grâce à $_POST et à les envoyer :p .
          • Partager sur Facebook
          • Partager sur Twitter
            29 octobre 2009 à 0:30:59

            Salut'
            Tu peux t'inspirer de ça si ça te tente :

            Ton formulaire (form.php):
            <?php 
            echo '<form method="post" action="recap.php">
            <select name="option1">
            <option value="5">Oui</option>
            <option value="0">Non</option>
            </select>
            <p>prix = 2€ / unité</p>
            
            QUANTITE
            <select name="quantite">
            <option value="100">100</option>
            <option value="200">200</option>
            </select>
            <input type="submit" value="submit" />';
            ?>
            


            La page de traitement (recap.php):
            <?php
            $option1 = $_POST['option1'];
            $quantity = $_POST['quantite'];
            $p1 = 2;
            echo '<p>option1 : ' . $option1 . '</p>
            	<p>Qte : ' . $quantity . '</p>';
            if ($option1 == 5) {
            	$prix = $p1 * $quantity;
            	echo 'Total = ' . $prix;
            }
            ?>
            
            • Partager sur Facebook
            • Partager sur Twitter
              29 octobre 2009 à 10:40:57

              fandejuni, il ne faut jamais se fier aux résultats Javascripts, surtout que là c'est totalement inutile.

              De plus, le type hidden n'a pas été inventé pour les cochons...(ils en ont rien à battre).
              Au lieu de:
              <input name="input_name" value="input_value" style="display:none;"/>
              Il faut faire:
              <input name="input_name" value="input_value" type="hidden"/>

              De plus, il est fortement conseillé de toujours définir le type d'un input.

              Mr_SATAN, tu as fait ça en 2 formulaires alors qu'il n'y a aucune raison, fusionne ça en un seul et déjà tu t'en sortiras mieux.

              Après, pour l'utilisation du JS, je conseille toujours JQuery surtout dans ce genre de classe.
              Il te permettrait de récupérer la liste des select sous formes d'un tableau pour lequel tu additionnerais les valeurs, faisant un script vachement plus portable/compatible (Si t'ajoutes ou enlève une option plus tard, le calcul suivra automatiquement).
              • Partager sur Facebook
              • Partager sur Twitter
                29 octobre 2009 à 16:13:25

                Merci beaucoup pour votre aide ! On touche au but, je le sens :D

                Alors j'ai repris le code modifié par fandejuni et j'y ai apporté les modifications conseillées par IGstaff (type="hidden" et fusionner les formulaires). J'ai également fait des ajouts pour "tester" (un champ de texte et une option supplémentaire). Ça donne à peu près ça :

                <script type="text/javascript">
                function prix()
                {
                	var option1 = parseInt(document.getElementById('option1').value);
                	var quantite = parseInt(document.getElementById('quantite').value);
                	var option2 = parseInt(document.getElementById('option2').value);
                	var option3 = parseInt(document.getElementById('option3').value);
                	var resultat = option1 + option2 + quantite + option3;
                	document.getElementById('prix').innerHTML = resultat;
                	document.getElementById('mail_option1').value = option1;
                	document.getElementById('mail_option2').value = option2;
                	document.getElementById('mail_option3').value = option3;
                	document.getElementById('mail_quantite').value = quantite;
                }
                </script>
                <form method="post" action="scripts/formdevis.php">
                OPTION 1
                <select onchange="prix()" id="option1" name="option1">
                <option selected="selected" value="5">Oui</option>
                <option value="0">Non</option>
                </select>
                
                QUANTITE
                <select onchange="prix()" id="quantite" name="quantite">
                <option selected="selected" value="100">100</option>
                <option value="200">200</option>
                </select>
                
                OPTION 2
                <select onchange="prix()" id="option2" name="option2">
                <option selected="selected" value="10">Jaune</option>
                <option value="5">Vert</option>
                </select>
                
                OPTION 3
                <select onchange="prix()" id="option3" name="option3">
                <option selected="selected" value="10">OUI</option>
                <option value="5">NON</option>
                </select>
                <br/>
                Prix : <span id="prix">0</span>
                
                <input id="mail_option1" name="option1" value="5" type="hidden"/>
                <input id="mail_quantite" name="quantite" value="100" type="hidden"/>
                <input id="mail_option2" name="option2" value="10" type="hidden"/>
                <input id="mail_option3" name="option3" value="10" type="hidden"/>
                <input id="email" name="email" value="Votre e-mail" type="text"/>
                <input name="submit" type="submit" id="submit" value="ENVOI MAIL" />
                </form>
                


                Ça fonctionne et ça remplit son rôle mais j'ai constaté un fait bizarre : je peux ajouter autant de listes déroulantes que je veux par contre dès que j'essaye de faire la même chose avec des boutons radio ou à cocher le calcul ne fonctionne plus. J'ai pourtant bien pensé à modifier le script en même temps.

                Ensuite j'essaye d'envoyer les résultats (détail + total) à la fois sur l'adresse entrée par le visiteur et sur la mienne grâce au script suivant (attention, ça pique les yeux !) :

                <?php
                $msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
                $msg_ok = "Votre demande a bien été prise en compte.";
                $message = $msg_erreur; 
                
                define('MAIL_DESTINATAIRE', '','$email'); // envoi à mon adresse et à celle du visiteur
                define('MAIL_SUJET','Demande de devis');
                
                // vérification des champs
                if (empty($_POST['option1']))
                $message .= "Choissez OPTION1";
                if (empty($_POST['quantite']))
                $message .= "Choissez QUANTITE";
                if (empty($_POST['option2']))
                $message .= "Choissez OPTION2";
                if (empty($_POST['email']))
                $message .= "Votre adresse mail<br/>";
                
                if (strlen($message) > strlen($msg_erreur)) {
                
                  echo $message;
                
                }
                
                else {
                
                foreach($_POST as $index => $valeur) {
                $$index = stripslashes(trim($valeur));
                }
                
                //Préparation de l'entête du mail:
                $mail_entete = "MIME-Version: 1.0\r\n";
                $mail_entete .= "From: {$_POST['email']} "
                             ."<{$_POST['email']}>\r\n";
                $mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
                $mail_entete .= 'Content-Type: text/plain; charset="utf-8"';
                $mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
                $mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";
                
                // préparation du corps du mail
                $mail_corps = "Devis de : $email ";
                $mail_corps .= "QUANTITE $quantite - OPTION 1 : $option1";
                
                // envoi du mail
                if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) {
                
                  //Le mail est bien expédié
                  echo $msg_ok;
                } else {
                
                //Le mail n'a pas été expédié
                  echo 'Une erreur est survenue lors de l\'envoi du formulaire par email';
                }
                }
                ?>
                


                Là ça fonctionne presque. Je reçois bien le mail à mon adresse mais pas à celle du visiteur. Je reçois également le détail sous la forme "OPTION 1 : valeur_sélectionnée" mais impossible d'extraire le total qui est généré en Javascript ! J'ai essayé de le récupérer dans un champ "hidden" également mais je dois mal m'y prendre. Je pense que ce code est truffé d'erreurs, je l'ai fait à partir d'un tuto et j'avoue ne pas avoir bien compris toutes les instructions o_O A mon avis le problème vient de là.

                IGstaff, pour ce qui est de ta suggestion de jQuery je crois effectivement que ça serait une bonne solution mais malheureusement je galère déjà beaucoup trop sur JS pour oser m'aventurer sur des techniques plus complexes.
                Drummit, merci pour ton code, je le garde sous la main au cas où j'abandonnerais celui-ci :)

                Je continue de faire des tests en attendant vos avis :)
                • Partager sur Facebook
                • Partager sur Twitter
                  29 octobre 2009 à 17:28:42

                  Dans la page HTML j'ai changé 2-3 trucs, dans la page PHP j'ai tout changé :diable: :

                  <script type="text/javascript">
                  function prix()
                  {
                  	var option1 = parseInt(document.getElementById('option1').value);
                  	var quantite = parseInt(document.getElementById('quantite').value);
                  	var option2 = parseInt(document.getElementById('option2').value);
                  	var option3 = parseInt(document.getElementById('option3').value);
                  	var resultat = option1 + option2 + quantite + option3;
                  	document.getElementById('prix').innerHTML = resultat;
                  	document.getElementById('mail_option1').value = option1;
                  	document.getElementById('mail_option2').value = option2;
                  	document.getElementById('mail_option3').value = option3;
                  	document.getElementById('mail_quantite').value = quantite;
                  }
                  function enlever()
                  	{
                  		if (document.getElementById('email').value == 'Votre e-mail')
                  		{
                  			q = document.getElementById('email').value = '';
                  		}
                  	}
                  	function rajouter()
                  	{
                  		if (document.getElementById('email').value == '')
                  		{
                  			document.getElementById('email').value = 'Votre e-mail';
                  		}
                  	}
                  </script>
                  <form method="post" action="scripts/formdevis.php">
                  OPTION 1
                  <select onchange="prix()" id="option1" name="option1">
                  <option selected="selected" value="5">Oui</option>
                  <option value="0">Non</option>
                  </select>
                  
                  QUANTITE
                  <select onchange="prix()" id="quantite" name="quantite">
                  <option selected="selected" value="100">100</option>
                  <option value="200">200</option>
                  </select>
                  
                  OPTION 2
                  <select onchange="prix()" id="option2" name="option2">
                  <option selected="selected" value="10">Jaune</option>
                  <option value="5">Vert</option>
                  </select>
                  
                  OPTION 3
                  <select onchange="prix()" id="option3" name="option3">
                  <option selected="selected" value="10">OUI</option>
                  <option value="5">NON</option>
                  </select>
                  <br/>
                  Prix : <span id="prix">125</span>
                  
                  <input onfocus="enlever()" onblur="rajouter()" id="email" name="email" value="Votre e-mail"  type="text"/>
                  <input name="submit" type="submit" id="submit" value="ENVOI MAIL" />
                  </form>
                  


                  <?php
                  define('MAIL_DESTINATAIRE', 'nom@site.ext');
                  define('MAIL_SUJET','Demande de devis');
                  
                  $erreur = '';
                  $nb_erreurs = 0;
                  if($_POST['option1'] != 5 && $_POST['option1'] != 0)
                  {
                  	$nb_erreur++;
                  	$erreur .= 'L\'option 1 est erronée.<br/>';
                  }
                  if($_POST['option2'] != 5 && $_POST['option2'] != 10)
                  {
                  	$nb_erreur++;
                  	$erreur .= 'L\'option 2 est erronée.<br/>';
                  }
                  if($_POST['option3'] != 5 && $_POST['option3'] != 10)
                  {
                  	$nb_erreur++;
                  	$erreur .= 'L\'option 3 est erronée.<br/>';
                  }
                  if($_POST['quantite'] != 100 && $_POST['quantite'] != 200)
                  {
                  	$nb_erreur++;
                  	$erreur .= 'La quantité est erronée est erronée.<br/>';
                  }
                  if(!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email']))
                  {
                  	$nb_erreur++;
                  	$erreur .= 'L\'adresse e-mail entrée est invalide !<br/>';
                  }
                  if($nb_erreur > 0)
                  {
                  	echo 'Traitement interrompu, '.$nb_erreur.' erreurs :<br/>';
                  	echo $erreur;
                  	echo '<a href="../Calcul_devis.html">Retour au formulaire.</a>';
                  }
                  else if($nb_erreur == 0)
                  {
                  	$total = $_POST['quantite']+$_POST['option1']+$_POST['option2']+$_POST['option3'];
                  	$mail_entete = "MIME-Version: 1.0\r\n";
                  	$mail_entete .= "From: ".MAIL_DESTINATAIRE." "
                  				 ."<".MAIL_DESTINATAIRE.">\r\n";
                  	$mail_entete .= 'Reply-To: '.MAIL_DESTINATAIRE."\r\n";
                  	$mail_entete .= 'Content-Type: text/plain; charset="utf-8"';
                  	$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
                  	$mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";
                  	$mail_corps = "Devis de : ".$_POST['email'];
                  	$mail_corps .= "
                  QUANTITE : ".$_POST['quantite']."
                  OPTION 1 : ".$_POST['option1']."
                  OPTION 2 : ".$_POST['option2']."
                  OPTION 3 : ".$_POST['option3']."
                  TOTAL : ".$total."
                  Merci de votre visite ;), et a bientot !";
                  	
                  	$envoi = mail($_POST['email'],MAIL_SUJET, $mail_corps,$mail_entete);
                  	$autre_envoi = mail(MAIL_DESTINATAIRE,MAIL_SUJET, $mail_corps,$mail_entete);
                  	if ($envoi) 
                  	{
                  		echo 'Le mail a bien été envoyé.<br/> Merci de votre visite !';
                  	} 
                  	else 
                  	{
                  		echo 'Une erreur est survenue lors de l\'envoi du mail.';
                  	}
                  }
                  else
                  {
                  	echo 'Erreur inconnue.';
                  }
                  ?>
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 octobre 2009 à 18:06:14

                    Génial fandejuni ! Ton code PHP est beaucoup plus propre que celui que j'avais :D

                    J'ai quand même quelques questions :
                    - A quoi servent les fonctions enlever() et ajouter() ?

                    - Le message d'erreur se base sur l'une ou l'autre option sélectionnée ?
                    if($_POST['quantite'] != 100 && $_POST['quantite'] != 200)
                    {
                    	$nb_erreur++;
                    	$erreur .= 'La quantité est erronée est erronée.<br/>';
                    }
                    

                    En gros dans cet exemple si le champ n'indique ni "100" ni "200" il sera considéré comme erroné, je me trompe ? Donc dans le cas où j'aurais beaucoup plus de choix il vaudrait mieux que je dise "!<= 100" et "!>= 200" (si le résultat n'est pas compris entre 100 et 200, le choix est erroné) ?

                    - J'ai toujours mon soucis d'usage d'autres input que "select" (exemple avec un checkbox appelé "choix1") :

                    OPTION 4
                    Choix 1 : <input onchange="prix()" name="choix1" type="checkbox" value="50" />
                    


                    var choix1 = parseInt(document.getElementById('choix1').value);
                    	var resultat = option1 + option2 + quantite + option3 + choix1;
                    	etc...
                    	document.getElementById('mail_choix1').value = choix1;
                    


                    A part ces 3 points je pense avoir compris ce que tu as fait ! Je te remercie encore pour ton aide précieuse !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 octobre 2009 à 18:29:24

                      Les fonctions enlever() et ajouter() servent pour le champ de texte "Votre email" : dès que tu cliques dessus ça l'enlève, et vice-versa (sauf si qqch est écrit !).


                      Citation : Mr_SATAN

                      if($_POST['quantite'] != 100 && $_POST['quantite'] != 200)
                      {
                      	$nb_erreur++;
                      	$erreur .= 'La quantité est erronée est erronée.<br/>';
                      }
                      

                      En gros dans cet exemple si le champ n'indique ni "100" ni "200" il sera considéré comme erroné, je me trompe ?


                      Exact :) , si il y a plus de choix, mieux vaut faire comme ça :

                      <?php
                      if($_POST['quantite'] < 100 || $_POST['quantite'] > 200)
                      {
                      	$nb_erreur++;
                      	$erreur .= 'La quantité est erronée est erronée.<br/>';
                      }
                      
                      Ce qui renverra l'erreur si la quantité est inférieur à 100 ou supérieur à 200.

                      Pour savoir si une checkbox est cochée :
                      var checkbox = document.getElementById('ID_de_l_objet').checked;
                      if(checkbox)
                      {
                      alert('La case est cochée');
                      }
                      else
                      {
                      alert('La case n\'est pas cochée !');
                      }
                      


                      J'espère avoir répondu à toutes tes questions ;) .
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 octobre 2009 à 18:32:23

                        Citation : fandejuni


                        <?php
                        	$erreur .= 'La quantité est erronée est erronée.<br/>';
                        ?>
                        



                        Une perle...
                        (Fin de la remarque inutile)

                        En fait, si les valeurs sont vouées à être modifiées/a évoluées, le mieux est de faire des tableaux...
                        Exemple:
                        <?php
                        $Quantities = array(100, 200);
                        
                        if( !empty($_POST) ) { //Ici je fais vraiment en gros, je vais à l'essentiel
                        	if( empty($Quantities[$_POST['quantity']]) ) { //Ca c'est l'essentiel, ici.$Quantities
                        		echo "La quantité est erronée !<br />\n";
                        	}
                        }
                        
                        $QuantitiesList = '';
                        foreach( $Quantities as $QuantityInd => $QuantityValue ) { //L'index au lieu de la valeur est utilisée, ca évite de nombreuse failles/vérifications mais restreint au valeurs connues comme dans le cas d'un select, sinon il aurait fallut un input de type text.
                        	$QuantitiesList .= "\t<option value=\"{$QuantityInd}\">{$QuantityValue}</option>\n";
                        }
                        ?>
                        Quantité:
                        <select name="quantity">
                        <? echo $QuantitiesList; ?></select>
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 octobre 2009 à 18:40:26

                          Génial :)

                          Juste pour la question de la case cochée, en fait c'est lors du calcul qu'elle pose problème et non dans l'indicateur d'erreurs : elle empêche le calcul des autres valeurs
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 octobre 2009 à 18:59:16

                            En fait, tu ne dois aps mettre de valeur à une checkbox.
                            Si elle est cochée, la variable existe et contient, sinon elle n'existe meme pas.
                            Donc dans ton total tu dois faire:
                            $total += ( empty($_POST['option4']) ) ? 0 : 50; //On ajoute 0 si la variable n'existe pas sinon on ajoute 50.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 octobre 2009 à 19:13:45

                              Désolé mais ça ne fonctionne pas. Le simple fait de rajouter cette ligne au code bloque complètement les autres calculs et la variable du checkbox ne s'ajoute jamais.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 octobre 2009 à 9:39:54

                                Faut évidemment que tu la place au bon endroit et que tu remplaces option4 par le nom de ta checkbox.
                                Et puis, si tu nous en disais plus au lieu de "Ca bloque complètement les autres calculs".
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 octobre 2009 à 14:14:01

                                  J'ai essayé de le placer à plusieurs endroits dans le code mais j'ai toujours le même phénomène. Quand je dis que ça "bloque les calculs" ça veut tout simplement dire que dès que j'essaye d'intégrer une ligne de calcul sur le modèle de ceux de fandejuni ou du tien pour une "checkbox" ou un "radio", non seulement ceux ci ne sont pas pris en compte mais en plus la fonction de calcul ne fonctionne plus pour les autres input (le résultat reste à 0).

                                  Voilà comment j'ai d'abord procédé pour une checkbox nommée "choix1" :

                                  (sur le modèle de fandejuni)
                                  Choix 1 : <input onchange="prix()" name="choix1" type="checkbox" value="50" />
                                  


                                  var choix1 = parseInt(document.getElementById('choix1').value);
                                  	var resultat = option1 + option2 + quantite + option3 + choix1;
                                  	etc...
                                  	document.getElementById('mail_choix1').value = choix1;
                                  



                                  Puis sur tes conseils j'ai compris que le traitement d'une checkbox ne fonctionnait pas de la même manière, j'ai donc rajouté ta ligne de code à Javascript en modifiant les noms selon mes besoins :

                                  var resultat = option1 + option2 + quantite;
                                  	var resultat += ( empty($_POST['choix1']) ) ? 0 : 50; //On ajoute 0 si la variable n'existe pas sinon on ajoute 50.
                                  


                                  La variable $total n'est traitée que dans le formulaire d'envoi de mail, là le total est contenu dans "resultat"

                                  Voilà, je suis désolé si j'ai beaucoup de questions, grâce à vous j'ai déjà un formulaire qui fonctionne et qui s'envoie comme je le souhaitais :) Maintenant je cherche juste un moyen d'y traiter des boutons radio et des checkbox parce que j'en aurai besoin, après tout sera nickel :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    31 octobre 2009 à 11:50:43

                                    Tu ne dois pas utiliser les données envoyées par le navigateur sans vérifier le contenu.
                                    Sinon, n'importe qui avec un minimum de connaissance pourrait envoyer ce qu'il veut comme total à ton serveur.
                                    De plus, utiliser (côté PHP) le total généré par javascript t'es complètement inutile.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 novembre 2009 à 16:49:53

                                      Salut :)

                                      En fait le total généré par Javascript est utilisé côté PHP pour pouvoir être envoyé par mail. C'est du moins la solution qu'a trouvé fandejuni et jusqu'à maintenant ça marche bien.
                                      Le script me convient parfaitement comme il est, même si techniquement il est possible pour les plus doués de modifier le contenu. Étant donné qu'il ne s'agit que d'un devis indicatif, même si un petit malin s'amuse à baisser le prix je pourrai lui dire après coup que c'était inutile dans la mesure où je connais mes tarifs :D

                                      Je cherche toujours le moyen d'inclure dans le script actuel le calcul des boutons radio et cases à cocher, si quelqu'un sait comment faire sans partir sur un nouveau script je suis toujours preneur de conseils :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 novembre 2009 à 0:31:19

                                        Salut la compagnie :)

                                        J'ai un peu avancé si ça intéresse quelqu'un de la savoir :) Certains pourront récupérer le script en tombant ici par hasard !
                                        Voilà comment j'ai procédé (toujours en me basant sur des infos que je récolte à droite à gauche) :

                                        Options : <input name="options1[]" id="options1_1" type="checkbox" onclick="prix();"  value="10" /> Verso couleur - <input name="options1[]" id="options1_2" type="checkbox" onclick="prix();"  value="20" /> Verso noir/blanc - <input name="options1[]" id="options1_3" type="checkbox" onclick="prix();" value="40" /></p>
                                        
                                        <input type="radio" name="choix" onclick="prix();" value="10">10
                                        <input type="radio" name="choix" onclick="prix();" value="20">20
                                        <input type="radio" name="choix" onclick="prix();" value="40">30
                                        


                                        var b = true;
                                        var i = 1;
                                        var sommecheckbox = 0;
                                        while(b){
                                                var f = document.getElementById('options1_'+i);
                                                if(! f){ b = false;}
                                                else{
                                                if(f.checked) sommecheckbox += parseInt(f.value);
                                                }
                                                i++;
                                        }
                                                
                                        var valeurradio = 0;
                                        for(var i=0; i< document.forms[0].choix.length; i++)
                                        {
                                                if(document.forms[0].choix[i].checked) valeurradio = parseInt(document.forms[0].choix[i].value);
                                        }
                                        





                                        Et je récupère ces valeurs dans mon script PHP pour l'envoyer par mail (code à peaufiner, il génère une erreur "Parse error: syntax error, unexpected T_VARIABLE" sur la deuxième ligne) :

                                        Cases à cocher :
                                        $options1 = array();
                                        	if(isset($_POST['options1']) $options1 = is_array($_POST['options1']) ?
                                        	$_POST['options1'] : array($_POST['options1']);
                                        	/* là, $options 1 est un tableau de valeur (tableau éventuellement vide). */
                                        	// pour faire la somme en php, on aurait :
                                        	$somme = 0;
                                        	foreach($options1 as $o){
                                            $somme += intval($o); // note : si nombre à virgule, remplacer par la fonction correspondante
                                        	intval 
                                        	}
                                        	// pour afficher les sommes :
                                        	$s  = '';
                                        	foreach($options1 as $o){
                                            $s .= ($s == '' ? '' : ', ') strval($o);
                                        	}
                                        


                                        Et pour les boutons radio c'est comme pour les listes, un $_POST['radio'] suffit
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 novembre 2009 à 0:43:21

                                          Pas oubliger de faire ca live non?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            4 novembre 2009 à 14:18:17

                                            Non pas obligé mais si on peut le faire c'est plus sympa :)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 novembre 2009 à 15:14:57

                                              Hello Mr_Satan
                                              Je suis en train de plancher sur un truc quasi similaire avec les mêmes questionnement que toi... Est-il possible de voir un rendu de ton codage sur une page web pour que certains trucs soient plus parlant quand au but visé ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                12 novembre 2009 à 19:05:13

                                                Salut entki !

                                                Voilà la page de test (elle n'est pas finie, j'attends de la faire fonctionner correctement avant d'entrer les vraies valeurs)

                                                Par contre tu verras le formulaire d'envoi par mail ne fonctionne pas, j'ai une erreur due à l'extraction des valeurs de cases à cocher. Si tu trouves une solution je suis preneur !
                                                Ça fait 3 semaines que je suis dessus et je désespère un peu :D
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 novembre 2009 à 20:36:02

                                                  C'est quoi le contenu de la ligne 23 de formdevis.php ?
                                                  c'est inclus dans quelle action ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 novembre 2009 à 20:41:51

                                                    C'est ce que j'ai mis dans le post plus haut :

                                                    $options1 = array();
                                                    	if(isset($_POST['options1']) $options1 = is_array($_POST['options1']) ?
                                                    	$_POST['options1'] : array($_POST['options1']);
                                                    	/* là, $options 1 est un tableau de valeur (tableau éventuellement vide). */
                                                    	// pour faire la somme en php, on aurait :
                                                    	$somme = 0;
                                                    	foreach($options1 as $o){
                                                        $somme += intval($o); // note : si nombre à virgule, remplacer par la fonction correspondante
                                                    	intval 
                                                    	}
                                                    	// pour afficher les sommes :
                                                    	$s  = '';
                                                    	foreach($options1 as $o){
                                                        $s .= ($s == '' ? '' : ', ') strval($o);
                                                    	}
                                                    

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      13 novembre 2009 à 13:14:17

                                                      Le intval tout seul n'est pas très correct...
                                                      Puis y'a
                                                      $s .= ($s == '' ? '' : ', ') strval($o);
                                                      hummm...pas jolie.
                                                      je pense que tu voulais mettre un '.' entre la ) et strval($o)...

                                                      EDIT: et ferme la parenthèse de ton IF à la 2eme ligne.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        14 novembre 2009 à 13:47:52

                                                        J'ai tenté de monter différement le truc.
                                                        Je l'ai fait relire, on m'a dit que ça devait marcher. Seulement, en ligne, ça me dit :
                                                        "Parse error: syntax error, unexpected '}' in /mnt/109/sdb/f/3/petitehermione/CALCUL-DEVIS3.php on line 3"

                                                        Voici mon code qui reprend les mêmes points que Mr-Satan sauf que le formulaire est présenté différement et que je trouve qu'il faut donner les prix HT + TTC quand on fait un devis.

                                                        Purée que c'est obscur la programmation ! Si quelqu'un trouve la syntax error, ce serait génial. Je pourrai vérifier si le reste fonctionne LOL.

                                                        <?php
                                                        if(isset($_POST["submit"]))
                                                        {
                                                        $submit = stripslashes($_POST["submit"]);
                                                        
                                                        if(empty($submit)){
                                                        echo 'Veuillez indiquer votre email. <br/>';
                                                        }
                                                        else
                                                        {
                                                        //on recupere les données du message
                                                        if ( $_POST['cartedevisite']=="175.00"){$deviscartevisite = "Montage avec création originale au préalable"};
                                                        if ( $_POST['cartedevisite']=="85.00"){$deviscartevisite = "Conception et montage d'après les éléments fournis"};
                                                        if ( $_POST['cartedevisite']=="50.00"){$deviscartevisite = "Montage seul d'après une création/conception déjà effectuée"};
                                                        if ( $_POST['Extra1']=="0.00"){$extra1 = "Envoi PDF imprimeur via mail ou ftp"};
                                                        if ( $_POST['Extra2']=="12.00"){$extra2 = " Gravure des fichiers source sur CD et envoi postal"};
                                                        if ( $_POST['Extra3']=="30.00"){$extra3 = "Achat de visuels"};
                                                        if ( $_post['Extra4']=="15.00") {$extra4 = "Retouche de visuels"};
                                                        
                                                        }
                                                        
                                                        $mon_email = "monmail@moi.fr";
                                                        $mon_pseudo = "votre_pseudo";
                                                        $mon_url = "http://www.monsite.fr/CALCUL-DEVIS.php";
                                                        $son_email = ''.$submit.'';
                                                        // on cree le corps de l'email
                                                        $message = echo "carte de visite: " .$deviscartevisite;
                                                        .$message = echo "<br>extra: " .$extra1. " &nbsp;".$extra2."" .$extra1. " &nbsp;".$extra2;
                                                        // on cree le corps de l'email pour le client
                                                        $message2 = echo"Votre demande de devis a bien été pris en compte. </p>Nous vous répondrons dans les plus brefs délais.</p></p>Votre demande de devis:";
                                                        .$message2 = echo"Carte de visite:" .$deviscartevisite.": " .$_POST['cartedevisite'];
                                                        .$message2= echo"Options: " .$extra1.":" .$_POST['Extra1'];
                                                        .$message2= echo"<br>" .$extra2.":" .$_POST['Extra2'];
                                                        .$message2= echo"<br>" .$extra3.":" .$_POST['Extra3'];
                                                        .$message2= echo"<br>" .$extra4.":" .$_POST['Extra4'];
                                                        // Envoie du mail
                                                        $entete = "From: " . $son_email . " <" . $son_email . ">\n";
                                                        $entete .= "MIME-Version: 1.0";
                                                        if (mail($mon_email,$entete,$message))// on envoie l'email à toi
                                                        {mail($son_email,$entete,$message2)//on envoie au client aussi
                                                        echo "Votre message a été envoyé.<br />\n";
                                                        echo "<a href=\"" . $mon_url . "\">Retour</a>\n";
                                                        }
                                                        else
                                                        {
                                                        echo "Un problème s'est produit lors de l'envoi du message.\n";
                                                        echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez</a>\n";
                                                        }
                                                        //on ferme le else
                                                        }
                                                        //on ferme if(isset($_POST["submit"]))
                                                        }
                                                        ?>
                                                        
                                                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                                                        
                                                        <html xmlns="http://www.w3.org/1999/xhtml">
                                                        
                                                        	<head>
                                                        		<meta http-equiv="content-type" content="text/html;charset=utf-8" />
                                                        		<meta name="generator" content="Adobe GoLive" />
                                                        		<title>CALCUL-DEVIS</title>
                                                        		<script type="text/javascript">
                                                        
                                                        // Calcul du total des articles choisis.
                                                        function calculateTotal(inputItem) {
                                                          with (inputItem.form) {
                                                            // Traitement des différents types de cases.
                                                            if (inputItem.type == "radio") {   // Boutons radio.
                                                              // Soustraction de la valeur des boutons radio décochés.
                                                              calculatedTotal.value = eval(calculatedTotal.value) - eval(previouslySelectedRadioButton.value);
                                                              // Enregistrement de la valeur des boutons radio cochés.
                                                              previouslySelectedRadioButton.value = eval(inputItem.value);
                                                              // Prise en compte de la valeur du bouton radio sélectionné sur le total total.
                                                              calculatedTotal.value = eval(calculatedTotal.value) + eval(inputItem.value);
                                                            } else {   // check boxes.
                                                              if (inputItem.checked == false) {   // Soustraction des checkbox décochés.
                                                                  calculatedTotal.value = eval(calculatedTotal.value) - eval(inputItem.value);
                                                              } else {   // Prise en compte des checkbox cochés sur le total.
                                                                  calculatedTotal.value = eval(calculatedTotal.value) + eval(inputItem.value);
                                                              }
                                                            }
                                                        
                                                            // La valeur totale doit jamais être moins de 0.
                                                            if (calculatedTotal.value < 0) {
                                                              InitForm();
                                                            }
                                                        
                                                            // Rendu de la valeur totale.
                                                            return(formatCurrency(calculatedTotal.value));
                                                          }
                                                        }
                                                        
                                                        // Choix du format du prix + euro.
                                                        function formatCurrency(num) {
                                                          num = num.toString().replace(/\$|\,/g,'');
                                                          if(isNaN(num))
                                                             num = "0";
                                                          sign = (num == (num = Math.abs(num)));
                                                          num = Math.floor(num*100+0.50000000001);
                                                          cents = num%100;
                                                          num = Math.floor(num/100).toString();
                                                          if(cents<10)
                                                              cents = "0" + cents;
                                                          for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
                                                              num = num.substring(0,num.length-(4*i+3)) + ',' + num.substring(num.length-(4*i+3));
                                                          return (((sign)?'':'-') + num + '.' + cents + '€' );
                                                        }
                                                        
                                                         // Calcul de la TVA + TTC
                                                              var pourCentTva = 0.18;
                                                        
                                                              function calcul(obj) {
                                                                var valeur = parseInt(obj.options[obj.selectedIndex].value, 10);
                                                                if (valeur == '#')
                                                                  return;
                                                        
                                                                var total = parseFloat(obj.form.ht.value);
                                                                if (valeur)
                                                                {
                                                                  var tva = Math.round(total * pourCentTva * 100) / 100;
                                                                  var ttc = total + tva;
                                                                }
                                                                else
                                                                {
                                                                  var tva = 0;
                                                                  var ttc = total;
                                                                }
                                                                obj.form.tva.value = tva;
                                                                obj.form.ttc.value = ttc;
                                                              }
                                                        
                                                         <!--
                                                        function checkCheckBox(f){
                                                        if (f.agree.checked == false )
                                                        {
                                                        alert('Vous devez cocher la case à cocher!.');
                                                        return false;
                                                        }else
                                                        return true;
                                                        }
                                                        //-->
                                                        
                                                        // Mise en forme des valeurs.
                                                        function InitForm() {
                                                          document.selectionForm.total.value='0€';
                                                          document.selectionForm.calculatedTotal.value=0;
                                                          document.selectionForm.previouslySelectedRadioButton.value=0;
                                                          document.selectionForm.tva.value='0€';
                                                          document.selectionForm.calculatedTVA.value=0;
                                                          document.selectionForm.ttc.value='0€';
                                                          document.selectionForm.calculatedTTC.value=0;
                                                        
                                                          // Remise à zéro des boutons si décoche.
                                                          for (i=0; i < document.selectionForm.elements.length; i++) {
                                                            if (document.selectionForm.elements[i].type == 'checkbox' | document.selectionForm.elements[i].type == 'radio') {
                                                              document.selectionForm.elements[i].checked = false;
                                                            }
                                                          }
                                                        }
                                                        </script>
                                                        
                                                        	</head>
                                                        
                                                        	<body onload="InitForm();" onreset="InitForm();">
                                                        		<p></p>
                                                        		<table><tr><td>
                                                          <form method="POST" name="selectionForm">
                                                            <b>Carte de visite</b><br>
                                                            Montage avec création originale au préalable........................... >
                                                            <input type="radio" name="cartedevisite"   value="175.00"  onclick="this.form.total.value=calculateTotal(this);">
                                                            <br>
                                                            Conception et montage d'après les éléments fournis................. >
                                                            <input type="radio" name="cartedevisite" value="85.00" onclick="this.form.total.value=calculateTotal(this);">
                                                            <br>
                                                            Montage seul d'après une création/conception déjà effectuée... >
                                                            <input type="radio" name="cartedevisite"   value="50.00"  onclick="this.form.total.value=calculateTotal(this);">
                                                            <br>
                                                            <br><br>
                                                            <b>Suppléments éventuels :</b> <br>
                                                              <input type="checkbox" name="Extra1" value="0.00" onclick="this.form.total.value=calculateTotal(this);"> Envoi PDF imprimeur via mail ou ftp
                                                            <br>
                                                              <input type="checkbox" name="Extra2"  value="12.00" onclick="this.form.total.value=calculateTotal(this);"> Gravure des fichiers source sur CD et envoi postal
                                                            <br>
                                                              <input type="checkbox" name="Extra3" value="30.00" onclick="this.form.total.value=calculateTotal(this);"> Achat de visuels
                                                            <br>
                                                              <input type="checkbox" name="Extra4" value="15.00" onclick="this.form.total.value=calculateTotal(this);"> Retouche de visuels
                                                            <br>
                                                            <br>
                                                            <br>
                                                            <input type="hidden" name="calculatedTotal" value="0"> Prix Hors Taxe :
                                                            <input type="text" name="total" value="0" readonly onfocus="this.blur();"><br>
                                                            <input type="hidden" name="previouslySelectedRadioButton" value="0">
                                                            <input type="hidden" name="calculatedTVA" value="0"> TVA :
                                                            <input type="text" name="tva" readonly onfocus="this.blur();"><br>
                                                        	<input type="hidden" name="calculatedTTC" value="0"> Prix TTC :
                                                        	<input type="text" name="ttc" readonly onfocus="this.blur();"><br>
                                                        	<input type="reset" value="Effacer">
                                                        
                                                          </form>
                                                        </td></tr></table>
                                                        <p><font face="verdana" size="1"><b>Conditions : </b>Ce devis en ligne n'a qu'une valeur informative. Pour tout devis officiel, écrivez directement à </font><a href="mailto:monmail@moi.fr?subject=Demande%20de%20devis%20CARTE%20VISITE"><font face="verdana,arial,helvetica" size="1" color="black"><b>Ma Petite Entreprise</b></font></a></p>
                                                        <form action="#" method="GET" onsubmit="return checkCheckBox(this)">
                                                        <font face="verdana" size="1"><b>Avant d'envoyer le formulaire, vous confirmez avoir prix note des conditions ci-dessus :</b></font><br>
                                                        J'accepte : <input type="checkbox" value="0" name="agree"><br><br>
                                                        <input onfocus="enlever()" onblur="rajouter()" id="email" name="email" value="Votre e-mail"  type="text"/>
                                                        <input name="submit" type="submit" id="submit" value="Envoi sur votre mail" />
                                                        </form>
                                                        
                                                        </html>
                                                        
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          20 novembre 2009 à 19:28:04

                                                          Moi je crois que je vais laisser tomber le script de calcul de devis. En fait je me suis rendu compte que c'était très lourd à mettre à jour quand on l'utilise pour beaucoup de prestations différentes comme dans mon cas :)
                                                          Un téléchargement de catalogue en pdf sera plus dans mes cordes, je suis graphiste, pas programmeur :D
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Anonyme
                                                            3 décembre 2012 à 0:11:54

                                                            Bonjour à tous,

                                                            Je sais et j'ai vu que le sujet n'est pas d'aujourd'hui mais il n'est ni résolut, ni fermer et très visible.

                                                            Donc pour les nouveaux visiteurs et vous membres du SDZ, j'ai lu une piste indiquant le même gros titre que ce sujet.

                                                            Comment créer un devis ?
                                                            www.creation-internet-antiopa.fr


                                                            Si ça peut aider les prochains.
                                                            Bonne visite ;)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Formulaire de calcul de devis

                                                            × 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