8795 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en pleine refonte d'un site qui s'appuie sur Wordpress, pour la page contact j'ai trouvé, dans le modèle de page du thème installé, un script PHP pour le formulaire. Or ce dernier ne répond pas à ce que je souhaite et PHP n'est pas du tout mon fort.
Lorsque aucun champs n'est rempli il me demande de les remplir (ça ok)
Lorsque tous les champs sont rempli avec une seule lettre, le message est validé, pourtant j'ai des conditions.
Enfin, lorsque le message est validé, je ne reçois finalement aucun email sur mon adresse renseignée dans le script.
Est-ce également normal que mon script sois entrecoupé de <?php get_header(); ?> et d'un morceau de html ?
D'avance merci de votre aide.


<?php 
/* 
Template Name: Formulaire de contact 
*/ 
?>

<?php	if ( isset( $_POST['submitted'] ) ) {

	$name = $_REQUEST['form-name'];
	$email = $_REQUEST['form-email'];
	$subject = $_REQUEST['form-subject'];
	$message = $_REQUEST['form-message'];
	$errors = '';

	{
		// Validate name
		if ( $name != "" ) {
			$name = filter_var( $name, FILTER_SANITIZE_STRING );  
			if ( $name == "" || strlen( $name ) < 2 ) {  
				$errors .= __( 'Veuillez écrire votre nom s\'il vous plait.', 'framework' ) .'<br> ';
			}
		} else {  
			$errors .= __( 'Veuillez écrire votre nom s\'il vous plait.', 'framework' ) .'<br> ';
		}

		// Validate email
		if ( $email != "" ) {  
			$email = filter_var( $email, FILTER_SANITIZE_EMAIL );  
			if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {  
				$errors .= __( 'Veuillez écrire une adresse email valide s\'il vous plait.', 'framework' ) . '<br> ';
			}  
		} else {  
			$errors .= __( 'Veuillez écrire une adresse email valide s\'il vous plait.', 'framework' ) . '<br> ';
		}

		// Validate subject
		if ( $subject != "" ) {
			$subject = filter_var( $subject, FILTER_SANITIZE_STRING );  
			if ( $subject == "" || strlen( $subject ) < 3 ) {  
				$errors .= __( 'Veuillez écrire un sujet explicite s\'il vous plait.', 'framework' ) .'<br> ';
			}
		} else {  
			$errors .= __( 'Veuillez écrire un sujet explicite s\'il vous plait.', 'framework' ) .'<br> ';
		}

		// Validate message
		if ( $message != "" ) {  
			$message = filter_var( $message, FILTER_SANITIZE_STRING );  
			if ( $message == "" || strlen( $message ) < 10 ) {  
				$errors .= __( 'Votre message est trop court, veuillez écrire un message plus explicite s\'il vous plait.', 'framework' ) . '<br> ';  
			}
		} else {  
			$errors .= __( 'Votre message est trop court, veuillez écrire un message plus explicite s\'il vous plait.', 'framework' ) . '<br> ';  
		}
	}

	if ( empty( $name ) || empty( $message ) || empty( $email ) || empty( $subject ) ) {
		$sent = false;
	}

	else {
		$content = "<html><body><h1>Un email de votre site Internet</h1> <p>Nom: $name</p> <p>E-mail: $email</p> <p>Sujet: $subject</p> <p>Message: $message</p> </body></html>";
		
		$headers  = 'MIME-Version: 1.0' . "\r\n";
		$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
		$headers .= 'From: '.$name.' <'.$email.'>' . "\r\n";

		mail( get_option( 'contact@xxx.com' ), 'Bonjour, une personne vous a écrit sur votre site Internet', $content, $headers );
		$sent = true;
		}
	}
?>
<?php get_header(); ?>
<div class="container-fluid page">
	<section class="row-fluid single_post">

		<div class="col12">
			<h5>Pour toute demande de renseignements complémentaires ou pour obtenir un devis,<h5/>
			<h5>n'hésitez pas à me contacter par email ou par téléphone.</h5>
		</div>
		<div class="col12 formulaire" <?php post_class(); ?>>
			<div class="col6 bkg-jaune formulaire">
				<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>


				<?php the_content(); ?>

				<?php if ( isset( $sent ) && $sent == true ) { 
					echo '<p class="alert green">' . __( 'Merci, votre message a été envoyé.', 'framework' ) . '</p>';
				}

				if ( isset( $sent ) && $sent == false ) { 
					echo '<p class="alert red">' . $errors . '</p>';
				}			
				endwhile; endif; ?>

Modifié par Sulivent (10 Nov 2014 - 02:22)
Modérateur
bonjour, rapidement:

il faut remplacer
if ( empty( $name ) || empty( $message ) || empty( $email ) || empty( $subject ) ) {

par
if ( strlen($errors)>0 ) {
Modérateur
Sinon ton code est inutilement complexe, ce qui n'ajoute pas de clarté.
En éliminant le superflus ça aide à comprendre les problèmes

Un exemple de simplification:


$name = filter_var($_REQUEST['form-name'], FILTER_SANITIZE_STRING);
$email = filter_var( $_REQUEST['form-email'], FILTER_SANITIZE_EMAIL );
$errors = array();

if (strlen( $name ) < 2 ) {  
  $errors[] = __( 'Veuillez écrire votre nom s\'il vous plait.', 'framework' );
}
if (! filter_var( $email, FILTER_VALIDATE_EMAIL ) || $email !== $_REQUEST['form-email']  ){
  $errors[] = __( 'Veuillez écrire une adresse email valide s\'il vous plait.', 'framework' );
}
// etc.

if (count($errors) > 0){
  $sent = false;
}
else {
  //envoi du mail
}

// plus loin dans le code:
  echo '<p class="alert red">' . implode('<br>', $errors) . '</p>';

J'ai remplacé $errors par un tableau pour n'avoir pas de génération de code de la page qui trâine dans la logique.
Là on y voit plus clair: c'est $errors qui sera rempli si une seule des condition est remplie et qui empêchera donc l'envoi.
J'ai rajouté une condition dans le test de l'email afin d'éviter le cas suivant: mon mail est werner@example.com, je tape par accident: <erner@example.com, l'adresse devient erner@example.com et est validée. C'est rare, mais bon.
Merci kustolovic,

J'ai remplacé la ligne de code indiquée dans ta première réponse, le formulaire reconnait et indique désormais les erreurs correctement.
Par contre je ne suis pas à l'aise avec PHP et je ne sais pas ce que le code que tu m'as indiqué doit remplacer et ce que je dois laisser.
Et enfin bien que le formulaire indique que le message a été envoyé, je ne reçois aucun email dans ma boite de réception, c'est bien ici que je dois indiquer mon adresse email ? :

mail( get_option( 'contact@xxx.com' ), 'Bonjour, une personne vous a écrit sur votre site Internet', $content, $headers );
$sent = true;
}

Merci de ton aide et des premiers résultats constatés.
Sulivent a écrit :
Et enfin bien que le formulaire indique que le message a été envoyé, je ne reçois aucun email dans ma boite de réception


Sans rapport avec ton script Php, mais as-tu essayé de t'envoyer un mail simple depuis ton site (sans formulaire, juste une commande d'envoi de mail au chargement de la page par exemple ?

Si tu ne le reçois toujours pas, rapproche-toi de ton hébergeur qui applique peut-être des limites à ce niveau (j'en parle car j'ai eu le tour) comme la désactivation de la fonction mail() ou encore un nombre limite d'envoi par jour etc.
Finalement j'ai remplacé

mail( get_option( 'contact@xxx.com' ), 'Bonjour, une personne vous a écrit sur votre site Internet', $content, $headers );
		$sent = true;
		}

par

mail ($destinataire, 'Bonjour Victoire, une personne vous a écrit sur votre site Internet', $content, $headers );
		$sent = true;
		}

en ajoutant $destinataire = 'contact@example.com'; dans les déclarations.

Ca fonctionne nickel, merci grandement à vous du temps que vous m'avez consacré.
Modérateur
Oui en effet, je me demandais à propos de get_option. Je connais mal wordpress mais les arguments semblaient faux, ça aurait dû être probablement qqch du genre: get_option('email', 'monadresse@example.com' ), (le terme 'email' étant choisi par moi à l'instant de manière pifometrique ^^)

https://developer.wordpress.org/reference/functions/get_option/

Enfin si ça marche ainsi, tant mieux.
Modifié par kustolovic (10 Nov 2014 - 14:05)