Fusionner deux formulaires de contact

Petit nouveau ! | 4 Messages

13 déc. 2019, 11:40

Bonjour,

Pour mon site, j'utilise un formulaire de contact qui fonctionne mais n'est pas optimiser lorsqu'il s'agit d'indiquer une erreur dans un ou plusieurs champs c'est à dire que si l'utilisateur fait une erreur (champs vide ou mal inscrit), un message apparaît au dessus indiquant un problème sans dire le ou lesquels.

J'ai cherché un autre formulaire qui indique chacune des erreurs et j'ai essayé de les fusionner. De prime à bord, ça semble fonctionner mais de un, le code n'est certainement pas optimisé et de deux, il y a un champs (téléphone) que je ne rend pas obligatoire mais la fusion l'impose.

J'ai essayé par moi-même en suivant des tutoriaux mais j'ai beaucoup de mal à mettre en pratique. J'ai donc besoin de votre aide afin que mon code soit plus propre et bien fonctionnel comme je le souhaite.

Voici mon code :
<script language="javascript" type="text/javascript">
function validation_avt_envoi()
{
	var lancer="oui";
	
	if(document.getElementById("nom").value=="")
	{
		alert("Vous devez indiquer votre nom");
		lancer="non";
	}
	else if(document.getElementById("email").value=="")
	{
		alert("Vous devez saisir votre mail");
		lancer="non";
	}
	else if(document.getElementById("email").value.indexOf("@")==-1 || document.getElementById("email").value.indexOf(".")==-1)
	{
		alert("Votre mail ne semble pas correct, corrigez-le");
		lancer="non";
	}

	else if((document.getElementById("telephone").value.length<10 || document.getElementById("telephone").value.length>10))
	{
		alert("Vous devez indiquer un numéro de téléphone valide de 10 chiffres");
		lancer="non";
	}
	else if(document.getElementById("objet").value=="")
	{
		alert("Vous devez saisir le sujet du message ");
		lancer="non";
	}
	else if(document.getElementById("message").value=="")
	{
		alert("Vous devez saisir le sujet du message ");
		lancer="non";
	}

	if(lancer=="oui")
		document.getElementById("contact").submit();
}
</script>

<!-- SLIDE MENU -->
<?php include("menu_slide.php"); ?></div>

<!-- BANNIERE -->
<div class="banniere"><?php include("banniere.php"); ?></div>

<!-- MENU -->
<?php include("menu.php"); ?></div><br />

<!-- CONTENU DU SITE -->
<div class="contenu">
	<div class="contenu_gauche">
		<h1>- Nous contacter -</h1><br />
			
		Si vous avez des questions, que vous avez besoin de précisions ou que vous souhaitez obtenir un rendez-vous, il vous suffit d'utiliser l'une des trois méthodes ci-dessous :<br /><br />
	
		<ul>
			<li>En appelant le numéro de téléphone suivant : xxx</li>
			<li>En cliquant sur <a href="redirect-mailto.php">ce lien</a> afin d'utiliser votre logiciel de messagerie*<br />
			<li>En remplissant le formulaire suivant :</li>
		</ul>
		<br />

		<?php
		/*
		********************************************************************************************
		CONFIGURATION
		********************************************************************************************
		*/
		// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
		$destinataire = '[email protected]';
     
		// copie ? (envoie une copie au visiteur)
		$copie = 'oui';
     
		// Action du formulaire (si votre page a des paramètres dans l'URL)
		// si cette page est index.php?page=contact alors mettez index.php?page=contact
		// sinon, laissez vide
		$form_action = '';
     
		// Messages de confirmation du mail
		$message_envoye = "Votre message nous est bien parvenu. Vous en recevrez une copie dans votre boîte mail (vérifiez votre dossier Spam si vous ne le voyez pas).";
		$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer s'il vous plaît.";
     
		// Message d'erreur du formulaire
		$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis, que l'email soit sans erreur et que le téléphone possède bien 10 chiffres (si vous l'avez indiqué).";
     
		/*
		********************************************************************************************
		FIN DE LA CONFIGURATION
		********************************************************************************************
		*/
     
		/*
		* cette fonction sert à nettoyer et enregistrer un texte
		*/
		function Rec($text)
		{
			$text = htmlspecialchars(trim($text), ENT_QUOTES);
			if (1 === get_magic_quotes_gpc())
			{
				$text = stripslashes($text);
			}
     
			$text = nl2br($text);
			return $text;
		};
     
		/*
		* Cette fonction sert à vérifier la syntaxe d'un email
		*/
		function IsEmail($email)
		{
			$value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
			return (($value === 0) || ($value === false)) ? false : true;
		}
     
		// formulaire envoyé, on récupère tous les champs.
		$nom     		= (isset($_POST['nom']))     		? Rec($_POST['nom'])     : '';
		$email   		= (isset($_POST['email']))   		? Rec($_POST['email'])   : '';
		$telephone   	= (isset($_POST['telephone']))   	? Rec($_POST['telephone'])   : '';
		$objet   		= (isset($_POST['objet']))   		? Rec($_POST['objet'])   : '';
		$message 		= (isset($_POST['message'])) 		? Rec($_POST['message']) : '';
     
		// On va vérifier les variables et l'email ...
		$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
		$err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin
     
		if (isset($_POST['envoi']))
		{
			/* les 4 premières variables $nom,$email,$objet,$message sont obligatoires, par-contre le $telephone il peut être soit vide, soit pas vide ET Valide, donc tu dois définir $telIsValide comme ça:*/
			$telIsValide=( preg_match("#^[\d]{10}+$#", $telephone)==1 && !empty($telephone) ) || empty($telephone) ;
		
			if ( !empty($nom) && !empty($email) && !empty($objet)  && !empty($message) && $telIsValide ) //$telIsValide retourne soit true soit false ici.
			{
				if(!empty($telephone)) //on ajoute le numéro de tel dans $message s'il n'est pas vide.
				{
					$message.= "\n \nMon numéro de téléphone : ".$telephone;
				}//elle manque une fermeture de if( !empty($telephone) ) ici 
 
				// les 4 variables sont remplies, on génère puis envoie le mail
				$headers  = 'From:'.$nom.' <'.$email.'>' . "\r\n";
				//$headers .= 'Reply-To: '.$email. "\r\n" ;
				//$headers .= 'X-Mailer:PHP/'.phpversion();
     
				// envoyer une copie au visiteur ?
				if ($copie == 'oui')
				{
					$cible = $destinataire.';'.$email;
				}
				else
				{
					$cible = $destinataire;
				};
     
				// Remplacement de certains caractères spéciaux
				$caracteres_speciaux     = array('&#039;', '&#8217;', '&quot;', '<br>', '<br />', '&lt;', '&gt;', '&amp;', '…',   '&rsquo;', '&lsquo;');
				$caracteres_remplacement = array("'",      "'",        '"',      '',    '',       '<',    '>',    '&',     '...', '>>',      '<<'     );
     
				$objet = html_entity_decode($objet);
				$objet = str_replace($caracteres_speciaux, $caracteres_remplacement, $objet);
     
				$message = html_entity_decode($message);
				$message = str_replace($caracteres_speciaux, $caracteres_remplacement, $message);
			
				// Envoi du mail
				$num_emails = 0;
				$tmp = explode(';', $cible);
				foreach($tmp as $email_destinataire)
				{
					if (mail($email_destinataire, $objet, $message, $headers))
					$num_emails++;
				}
     
				if($num_emails>0)
				{
					echo '<p>'.$message_envoye.'</p>';
				}
				else
				{
					echo '<p>'.$message_non_envoye.'</p>';
				};
			}
			else
			{
				echo '<p>'.$message_formulaire_invalide.'</p>';
				$err_formulaire = true;
			}
		}; // fin du if (!isset($_POST['envoi']))
	
		if (($err_formulaire) || (!isset($_POST['envoi'])))
		{
			// afficher le formulaire
			echo '
			<form id="contact" name="contact" method="post" action="'.$form_action.'">
			<fieldset><legend>Vos coordonnées</legend>
				<table>
					<tr>
						<td>
						<label for="nom">Nom : </label><br /><br />
						<label for="email">Email : </label><br /><br />
						<label for="telephone">Téléphone : </label><br /><br />
						</td>
								
						<td>
						<input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" placeholder="Obligatoire" size="40px" /><br /><br />
						<input type="text" id="email" name="email" value="'.stripslashes($email).'" placeholder="Obligatoire" size="40px" /><br /><br />
						<input type="text" id="telephone" name="telephone" value="'.stripslashes($telephone).'" placeholder="Non obligatoire*" size="15px" /><br /><br />
						</td>
						</tr>
				</table>
			</fieldset>
     
			<fieldset><legend>Votre message :</legend>
				<table>
					<tr>
						<td style="vertical-align :top;">
						<label for="objet">Objet : </label><br /><br />
						<label for="message">Message : </label><br /><br />
						</td>

						<td>
						<input type="text" id="objet" name="objet" value="'.stripslashes($objet).'" placeholder="Obligatoire" size="52px" /><br /><br />
						<textarea id="message" name="message" cols="50" rows="7" placeholder="Obligatoire">'.stripslashes($message).'</textarea><br /><br />
						</td>
					</tr>
				</table>
			</fieldset>
     
			<br />
	 
			<div style="text-align:center;"><input type="reset" value="Effacer le formulaire" /> <input type="submit" name="envoi" value="Envoyer le message" onclick="validation_avt_envoi();" /></div>
			</form>';
		};
		?>
	</div>
		
</div>
Je vous remercie d'avance.

Mammouth du PHP | 1967 Messages

13 déc. 2019, 12:01

enlève juste la partie de vérification du numéro de téléphone
else if((document.getElementById("telephone").value.length<10 || document.getElementById("telephone").value.length>10))
{
alert("Vous devez indiquer un numéro de téléphone valide de 10 chiffres");
lancer="non";
}
et elle ne s'éxecutera plus rendant le champs facultatif
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 4 Messages

13 déc. 2019, 12:17

En effet, j'avais ajouté ce bout de code moi-même car à l'origine, il n'existait pas.

Il est vrai que si l'utilisateur indique un numéro de téléphone, ce dernier est vérifier dans le code PHP pour voir s'il est valide mais ce bout de code que tu m'as indiqué me permettait de montrer clairement où se situe l'erreur si le champs téléphone est rempli mais mal inscrit.

Si je supprime ce code, un message d'erreur apparaîtra, au dessus du formulaire, sans indiquer laquelle (comme c'était à l'origine) et c'est ce que je souhaite éviter.

J'imagine qu'il y aurait pas mal de changement à effectuer vu qu'il s'agit d'une fusion de deux script.

Sinon, le code est-il propre ?

Mammouth du PHP | 1967 Messages

13 déc. 2019, 12:57

la solution est de mettre la même vérification en javascript

ceci t'aidera à mettre en place la même expression régulière
https://developer.mozilla.org/fr/docs/W ... aux/RegExp

le code est propre et compréhensible
A toi de voir si tu en comprends le sens.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 4 Messages

13 déc. 2019, 19:20

J'ai lu et relu pour tenter de comprendre mais je n'y suis pas parvenu. J'ai beaucoup de mal avec le Javascript et le PHP, je suis plus HTML et CSS ^^

Ce n'est pas grave. Je pense que je vais rendre le téléphone obligatoire.

Merci de ton aide :)

Mammouth du PHP | 1967 Messages

13 déc. 2019, 22:26

mais ca ne change pas si je rentre

salutsalut comme téléphone il passera la validation javascript mais celle de php. il y a exactement 10 caractère mais ce ne sont pas des chiffres.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 4 Messages

14 déc. 2019, 12:25

Ha d'accord. Grosso modo, la vérification sur la validité des champs en php est en quelque sorte court-circuité par le script en JS. Il est vrai qu'en regardant le code, ça ne vérifie que le nombre de caractère mais pas si ce sont des chiffres ou non.

Je vais essayé de trouver un tuto sur la vérification de la présence de chiffres en JS.

Merci de cette précision importante.

Petit nouveau ! | 3 Messages

14 déc. 2019, 12:42

Bonjour,

Je n'ai pas trop épluché ton code mais comme tu testes les caractères spéciaux, tu dois pouvoir gérer les chiffres grace à leurs codes.

Eléphanteau du PHP | 27 Messages

29 déc. 2019, 06:16

Le HTML5 fait ça très bien avec REQUIRED. En HTML il y a plein d'autres attributs dans le genre.
Je me prends plus la tëte à faire ça en Javascript. Un REQUIRED, un placeholder, et hop! Je vérifie juste les datas côté serveur par sécurité.