We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 21101
    • 169 Posts
    non pas du tout au contraire smiley

    bon je vais voir ce que je peux faire et je te montre le résultat wink
      Play no games
      • 1186
      • 202 Posts
      Ok, j’attends de voir ça avec impatience ! Bonne chance ! wink
        R
        • 16732
        • 592 Posts
        Bon grâce aux très bonnes explications de Moon voici un exemple complet basé sur son code pour l’affichage, la validation et l’envoi d’un formulaire de contact par email.

        Pour plus de souplesse j’ai rajouté la gestion d’un chunk pour gérer l’affichage de l’email reçu, de l’adresse du destinataire et de l’objet.


        Snippet traitant le formulaire :

        // Snippet pour afficher / traiter un formulaire
        //
        // Fonctionne avec le chunk {{MyChunkForm}} et {{MyChunkEmail}} passés en paramètre :
        // [!MyForm? &tpl=`MyChunkForm` &gab=`MyChunkEmail` &sendTo=`[email protected]` &object=`My object`!]
        
        
        // Chargement du template formulaire et du mail
        if ($tpl) $tpl = ($chunk = $modx->getChunk($tpl)) ? $chunk:"Chunk '$tpl' introuvable.";
        if ($gab) $gab = ($chunk = $modx->getChunk($gab)) ? $chunk:"Chunk '$gab' introuvable.";
        $destmail = (isset($sendTo))? $sendTo : '[(emailsender)]';
        $objet = (isset($object))? $object : 'Contact depuis le site [(site_name)]';
        
        // Construction du formulaire
        $output = doForm($tpl,$gab,$destmail,$objet);
        
        // Affichage
        return $output;
        
        
        // **** Définition des fonctions **** //
        //Gestion des erreurs
        function erreurForm() {
        
        	global $erreur;
        	$erreur['NOM'] = empty($_POST['nom']);
        	$erreur['PRENOM'] = empty($_POST['prenom']);
            $erreur['EMAIL'] = !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $_POST['email']) ;
            $erreur['CP'] = empty($_POST['cp']);
            $erreur['VILLE'] = empty($_POST['ville']);
            $erreur['MESSAGE'] = empty($_POST['message']);
        
        	return $erreur['NOM'] || $erreur['PRENOM'] || $erreur['EMAIL'] || $erreur['CP'] || $erreur['VILLE'] || $erreur['MESSAGE'];
        
        }
        
        
        // Formulaire
        function doForm($myForm,$gabMail,$destMail,$object){
        
            global $modx, $erreur;
        
        	// PREMIER AFFICHAGE DU FORMULAIRE
        	if (!isset($_POST['ok'])) {
        
        		$myForm = str_replace("[+alarme+]", "", $myForm);
        
        		//... traitement perso, etc.  ...
        
        		return $myForm; // Affiche le formulaire dans son état initial
        
            // VALIDATION DU FORMULAIRE
        	} else {
        
                		// S'IL EST FAUX
                        	if (erreurForm()) {
        
                        	       $myForm = str_replace("[+alarme+]", "Veuillez corriger les champs en rouge", $myForm);
                                   // Réaffiche les champs remplis
                                   $myForm = str_replace("[+nom+]", $_POST['nom'],$myForm);
                                   $myForm = str_replace("[+prenom+]", $_POST['prenom'],$myForm);
                                   $myForm = str_replace("[+email+]", $_POST['email'],$myForm);
                                   $myForm = str_replace("[+tel+]", $_POST['tel'],$myForm);
                                   $myForm = str_replace("[+societe+]", $_POST['societe'],$myForm);
                                   $myForm = str_replace("[+cp+]", $_POST['cp'],$myForm);
                                   $myForm = str_replace("[+ville+]", $_POST['ville'],$myForm);
                                   $myForm = str_replace("[+message+]", stripslashes($_POST['message']),$myForm);
                                   //Met en rouge (classe .erreurForm) les champs mal remplis
                                   $myForm= str_replace("[+classe_nom+]", ($erreur['NOM'] ? 'erreurForm' : 'normal'), $myForm);
                                   $myForm= str_replace("[+classe_prenom+]", ($erreur['PRENOM'] ? 'erreurForm' : 'normal'), $myForm);
                                   $myForm= str_replace("[+classe_email+]", ($erreur['EMAIL'] ? 'erreurForm' : 'normal'), $myForm);
                                   $myForm= str_replace("[+classe_cp+]", ($erreur['CP'] ? 'erreurForm' : 'normal'), $myForm);
                                   $myForm= str_replace("[+classe_ville+]", ($erreur['VILLE'] ? 'erreurForm' : 'normal'), $myForm);
                                   $myForm= str_replace("[+classe_message+]", ($erreur['MESSAGE'] ? 'erreurForm' : 'normal'), $myForm);
        
                        			return $myForm; // Affiche le formulaire pré-rempli avec les champs à corriger mis en évidence
        
                        		// S'IL EST BON
                        	} else {
        
        
                                    $corpsmessage = $gabMail;
        
                                    $corpsmessage = str_replace("[+nom+]", $_POST['nom'],$corpsmessage);
                                    $corpsmessage = str_replace("[+prenom+]", $_POST['prenom'],$corpsmessage);
                                    $corpsmessage = str_replace("[+email+]", $_POST['email'],$corpsmessage);
                                    $corpsmessage = str_replace("[+tel+]", $_POST['tel'],$corpsmessage);
                                    $corpsmessage = str_replace("[+societe+]", $_POST['societe'],$corpsmessage);
                                    $corpsmessage = str_replace("[+cp+]", $_POST['cp'],$corpsmessage);
                                    $corpsmessage = str_replace("[+ville+]", $_POST['ville'],$corpsmessage);
                                    $corpsmessage = str_replace("[+message+]", stripslashes(str_replace ( "\n", "<br>", $_POST['message'])),$corpsmessage);
        
        
        
                                    $email_exp = $_POST['email'];
                                    // Céation du l'entête du mail
                                    $entetedate  = date("D, j M Y H:i:s -0600"); // avec offset horaire
                                    $entetemail  = "From: $email_exp \n"; // Adresse expéditeur
                                    $entetemail .= "Cc: ";
                                    $entetemail .= " \n";
                                    $entetemail .= "Bcc: \n"; // Copies cachées
                                    $entetemail .= "Reply-To: $email_exp \n"; // Adresse de retour
                                    $entetemail .= "X-Mailer: PHP/" . phpversion() . "\n" ;
                                    $entetemail .= "Content-Type: text/html;charset=iso-8859-1"."\n" ;
                                    $entetemail .= "Date: $entetedate";
        
                                    mail($destMail,$object,$corpsmessage,$entetemail);
        
                    			    $modx->sendRedirect($modx->makeUrl(4)); // Redirection sur page "merci bcp"...
        
                        	}
        	    }
        }
        
        


        Pour la validation c’est assez basique (vide ou pas ), j’ai juste géré la validité de l’email grin

        Chunk du formulaire :

        <form name="monformulaire" action="[~[*id*]~]" method="post">
        
        		[+alarme+]
        		<table width="300">
        			<tr>
        				<td class="[+classe_nom+]">Nom :</td>
        				<td><input type="text" name="nom" value="[+nom+]" size="25" maxlength="32" /> *</td>
        			</tr>
         			<tr>
        				<td class="[+classe_prenom+]">Prénom :</td>
        				<td><input type="text" name="prenom" value="[+prenom+]" size="25" maxlength="32" /> *</td>
        			</tr>
          			<tr>
        				<td class="[+classe_societe+]">Société :</td>
        				<td><input type="text" name="societe" value="[+societe+]" size="25" maxlength="32" /> *</td>
        			</tr>
            			<tr>
        				<td class="[+classe_cp+]">Cp :</td>
        				<td><input type="text" name="cp" value="[+cp+]" size="25" maxlength="32" /> *</td>
        			</tr>
         			</tr>
            		<tr>
        				<td class="[+classe_ville+]">Ville :</td>
        				<td><input type="text" name="ville" value="[+ville+]" size="25" maxlength="32" /> *</td>
        			</tr>
            			<tr>
        				<td class="[+classe_tel+]">Tel :</td>
        				<td><input type="text" name="tel" value="[+tel+]" size="25" maxlength="32" /> *</td>
        			</tr>
         			</tr>
            			<tr>
        				<td class="[+classe_email+]">E-mail :</td>
        				<td><input type="text" name="email" value="[+email+]" size="25" maxlength="32" /> *</td>
        			</tr>
                </tr>
            			<tr>
        				<td class="[+classe_message+]">Message :</td>
        				<td><textarea name="message" rows="4" >[+message+]</textarea> 
        				*</td>
        			</tr>
          </table>
        		<input class="submit" type="submit" name="ok" value="Envoyer" />
        
        		</form>
        



        Chunk de l’email :

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Mail</title>
        <style type="text/css">
        <!--
        body {
        	/*background-color: #EEECE0;*/
        }
        .Style1 {
        	font-family: Arial, Helvetica, sans-serif;
        	font-size: 12px;
        }
        .Style2 {
        	font-family: Arial, Helvetica, sans-serif;
        	font-size: 11px;
        	font-weight: bold;
        }
        .Style3 {
        	font-family: Arial, Helvetica, sans-serif;
        	font-size: 11px;
        	font-weight: bold;
        	color: #B50C00;
        }
        .Style4 {
        	font-family: Arial, Helvetica, sans-serif;
        	font-size: 13px;
        	font-weight: bold;
        }
        -->
        </style>
        </head>
        
        <body>
        <table width="515" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr>
            <td colspan="2"> </td>
          </tr>
          <tr>
            <td width="15"> </td>
            <td height="50" align="center" valign="top"><br>
                <table width="495" height="28" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td align="left"><span class="Style4">Demande d'informations</span></td>
                  </tr>
                </table>
                <br>
                <table width="500" border="0" cellpadding="20" cellspacing="0">
                  <tr>
                    <td align="left" valign="top" bgcolor="#F9FAF4">
        			<p class="Style1">
                      Nom : <strong>[+nom+]<br>
                      </strong>Prénom : <strong>[+prenom+]</strong><br>
                      Société : 
                      <strong>[+societe+]</strong><br>
                      E-mail : <strong>[+email+]</strong><br>
                      CP : <strong>[+cp+]</strong><br>
                      Ville : <strong>[+ville+]</strong><br>
                      Tel : <strong>[+tel+]</strong><br>
                      Message :<br> 
                      <strong>[+message+]</strong>              <br>              
                      <br>
        <br>            
                        <br>
                        <strong>            </strong></p>
                    </td>
                  </tr>
                </table>
          </td>
          </tr>
        </table>
        </body>
        </html>
        




        Longue vie à MODx !!!
          • 1186
          • 202 Posts
          J’abonde dans ton sens, laurent : longue vie à MODx ! C’est un outil incroyablement souple et puissant.
          Merci également pour ton exemple, j’espère que negz pourra facilement finaliser la gestion de son formulaire avec tout ça !
            R
            • 21101
            • 169 Posts
            oui c’est en bonne voie wink

            merci a toi Moon smiley

            résultat (pas encore finit): http://www.c4w.fr/v3/page-contact.html
              Play no games
              • 21101
              • 169 Posts
              moi mes champs je les traites comme ceci

              $erreur[’ville’]= preg_replace($search, $replace, $_POST[’nVille’]);

              sauf que quand je met return $erreur[’ville’]; le formulaire est toujours faux
                Play no games
                • 1186
                • 202 Posts
                Est-ce dans la fonction erreurForm() du snippet que tu as placé cette ligne ?

                $erreur['ville']= preg_replace($search, $replace, $_POST['nVille']);


                Car dans cette fonction, les tests sur les champs doivent être des booleens. Chaque ligne, donc chaque $erreur[’champ’], doit avoir pour valeur TRUE ou FALSE pour que le tout marche bien.

                Si tu galères trop avec cette méthode, tu peux aussi essayer les snippets eform ou formprocessor.

                  R
                  • 21101
                  • 169 Posts
                  ouai c’est ce que je me suis dit grin

                  avec ton formulaire on peux faire une vérification un peu plus poussé que empty() ? car comme tu réaffiche directement le $_POST[’champs’] dans le input, c’est pas un peu risqué ?

                  moi je passe tous mes champs par la fonction preg_replace qui au cas où enleve tous les <scrpit>, le code html, les caracteres speciaux etc... sauf que c’est pas un booléen grin

                  bon je vais trouver un moyen wink
                    Play no games
                    • 21101
                    • 169 Posts
                    bon jme suis pas fé chier, j’initialise une variable a false au départ et si j’ai un champs qui ne passe pas, la variable passe en true et ça marche smiley
                      Play no games
                      • 1186
                      • 202 Posts
                      Si bien sûr on peut faire plus poussé, mais dans ce cas j’utilise personnellement un script php regroupant toutes mes librairies de fonctions test, script que je place dans l’arbo MODx, et auquel je fais appel en début de snippet (par exemple) :

                      $libPath = $modx->config["base_path"]."assets/mylib/";
                      include_once $libPath."mylib.php";
                      


                      Tu peux mettre ça dans un répertoire dédié du répertoire snippet par exemple.

                      Ce qui donne ensuite dans le formulaire, par exemple pour tester la validité d’un email :

                      function erreurForm() {
                      ...
                      $erreur['EMAIL'] = !empty($_POST['email']) && erreurMail($_POST['email']);
                      ...
                      }
                      


                      Dans ce cas précis, le champ email peut être vide, mais s’il ne l’est pas, il a tout intérêt à être valide ! wink

                      La fonction erreurMail() utilisée ici est définie dans mylib.php, fonction qui procède classiquement à tout ce qu’il faut pour tester la validité d’un email. Attention, dans cet exemple, erreurMail() doit renvoyer un booleen, TRUE si l’email a une forme incorrecte, FALSE s’il est ok.

                      C’est après, dans le coeur du snippet, dans la partie "// S’IL EST FAUX", là où on ré-injecte les données pré-remplies dans le formulaire, qu’il faut que tu filtres les entrées avec preg_replace pour bétonner la sécurité.

                      J’espère que ça va t’aider !

                      Petit mot au passage pour désenflammer les neurones : je trouve ton site classe et très propre ! Et l’affichage du formulaire avec erreurs très bien présenté.

                      (ah, juste une "pico" remarque : il y a un petit pixel de décalage sous firefox dans l’encadré gris du formulaire, en haut à droite et en bas à gauche)

                      As-tu testé contactForm et eForm ?
                        R