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
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 !!!