Beste,

Bij het correct invullen van het contactformulier zou ik de klant willen doorsturen naar een bedankingspagina. (zo kan ik ook een doel instellen via Google Analytics).
Dit lukt me voorlopig niet. Contactformulier waarmee ik werk stuurt nu een echo berichtje bij het al dan niet correct invullen. Het doorsturen naar een bedankingspagina lukt me niet, heb al geprobeerd met header('Location: http://www.mijnsite.be/bedankt.html';); zonder succes.

contact.php:

<?php 
	if($_POST) {

		$to = "[email protected]"; // Your email here
		$subject = 'Bericht verstuurd van mijn site'; // Subject message here

	}

    //Send mail function
	function send_mail($to,$subject,$message,$headers){
		if(@mail($to,$subject,$message,$headers)){
			header('Location: http://www.mijnsite.be/bedankt.html');
			exit();
		} else {
			echo json_encode(array('info' => 'error', 'msg' => "Uw bericht is niet verzonden. Er is iets verkeerd gegaan. Probeer het nog eens."));
		}
	}	

	//Check e-mail validation
	function check_email($email){
		if(!preg_match("/^[_.\da-z-]+@[a-z\d][a-z\d-]+\.+[a-z]{2,6}$/i", $email)) {
			return false;
		} else {
			return true;
		}
	}

	//Get post data
	if(isset($_POST['name']) and isset($_POST['mail']) and isset($_POST['onderwerp']) and isset($_POST['comment'])){
		$name 	 = $_POST['name'];
		$mail 	 = $_POST['mail'];
		$onderwerp 	 = $_POST['onderwerp'];
		$website  = $_POST['website'];
		$comment = $_POST['comment'];

		if($name == '') {
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw naam in te vullen."));
			exit();
		} else if($mail == '' or check_email($mail) == false){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve een geldig emailadres in te vullen."));
			exit();
		} else if($onderwerp == ''){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw onderwerp in te vullen."));
			exit();
		} else if($comment == ''){
			echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw bericht in te vullen."));
			exit();
		} else {

			//Send Mail
			$headers = 'From: ' . $mail .''. "\r\n".
			'Reply-To: '.$mail.'' . "\r\n" .
			'X-Mailer: PHP/' . phpversion();

			send_mail($to, $subject, $comment . "\r\n\n"  .'Naam: '.$name. "\r\n" .'Onderwerp: '.$onderwerp. "\r\n" .'Email: '.$mail, $headers);
		}

	} else {
		echo json_encode(array('info' => 'error', 'msg' => "Gelieve alle velden in te vullen."));
	}   

 ?>



Html code contactform:

               <form id="contact-form" method="post" action="contact.php">
                <div class="row contact-row">
                  <div class="col-md-6 contact-name">
                    <input name="name" id="name" type="text" placeholder="Uw naam*" required>
                  </div>
                  <div class="col-md-6 contact-email">
                    <input name="mail" id="mail" type="email" placeholder="Uw emailadres*" required>
                  </div>
                </div>
                <input name="onderwerp" id="onderwerp" type="text" placeholder="Onderwerp*" required> 
                <textarea name="comment" id="comment" placeholder="Uw bericht*" required></textarea>
                  <input type="submit" class="btn btn-lg btn-color btn-submit" value="Verstuur uw vraag" id="submit-message">
                  <div id="msg" class="message"></div>
                </form>


Bedankt alvast voor de hulp!
We zijn al een stuk verder. :)
De berichten (foutmeldingen) zijn terug te zien, en ik krijg mailtjes met de ingevulde content. Alles werkt dus goed. Mijn fout was de verkeerde locatie van url: 'contact.php', in het js bestand.

Het enigste wat nog altijd niet lukt is de redirect naar een bedankingspagina.
Die window.location('bedankt.html'); onder regel 19 werkt niet.

Ivm email validation: moet ik alles van regel 18 tot 25 verwijderen?
Ik zou lijn 19 aanpassen naar die genoemde window.location. Je hoeft immers je DOM-structuur niet aan te passen met de juiste classes.

Verder raad ik aan om regel 18 t/m 25 te verwijderen, en aan te passen naar:


function check_email($email){
	if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
  		return true;
	} else {
  		return false;
	}
}

Dan zullen mailadressen zoals [email protected] ook werken.
- Ariën - op 13/01/2017 13:07:29
Verder raad ik aan om regel 18 t/m 25 te verwijderen, en aan te passen naar:
<knip>


Of gewoon

function check_email($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}


Want
if (true) {
    return true;
} else {
    return false;
}

(en vice versa) is nogal dubbelop.

En een ! aan het begin van een moeilijke/lange expressie kan over het hoofd worden gezien dus als je deze kunt vermijden is dat een pre.
Kan ook.
Ik houd alles leesbaar voor hulp. Beter meerdere regels dan een enkele regel die ze niet direct snappen of verkeerd schrijven of intepreteren. Die ! was ook niet nodig.
De emailvalidatie werkt! Super.
Heb nu al tiental pogingen ondernomen met verschillende opties voor de doorverwijzing naar de bedanktpagina. Lukt nog altijd niet.


if(data.info !== 'error'){
					$this.parents('form').find('input[type=text],input[type=email],textarea,select').filter(':visible').val('');	message.hide().removeClass('success').removeClass('error').addClass('success').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow').window.location('bedankt.html');
                } else {
  message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');


of


if(data.info !== 'error'){
					$this.parents('form').find('input[type=text],input[type=email],textarea,select').filter(':visible').val('');	message.hide().removeClass('success').removeClass('error').addClass('success').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');
window.location('bedankt.html');
                } else {
  message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');


en in de PHP

<?php
//Send mail function
function send_mail($to,$subject,$message,$headers){
if(@mail($to,$subject,$message,$headers)){
echo json_encode(array('info' => 'success', 'msg' => "Uw bericht is verzonden, bedankt! We nemen zo spoedig mogelijk contact met u op."));
} else {
echo json_encode(array('info' => 'error', 'msg' => "Uw bericht is niet verzonden. Er is iets verkeerd gegaan. Probeer het nog eens."));
}
}
?>
Dit zou moeten werken.
Kan anders eens wat data.info in een alert toont.


if(data.info !== 'error'){
	window.location('bedankt.html');
} else {
message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');
}
@Frederic: volgens mij redirect je de URL van de AJAX-call :).

Als je een form afhandelt via (een) AJAX(-callback) dan zou JavaScript moeten redirecten, niet PHP :).

De AJAX POST verwacht een JSON respons. Als je mail slaagt redirect je naar een andere pagina. Da's geen AJAX respons. De mail zal wel verzonden zijn, maar je redirect-constructie werkt niet.

Daarnaast probeer je dingen uit de brievenbus te halen die er mogelijk helemaal niet zijn. Controleer eerst of er gePOST wordt (if ($_SERVER['REQUEST_METHOD' == 'POST') { ... }), en probeer dan pas de POST variabelen te inspecteren. Een andere volgorde heeft geen zin.

Ook hoort het versturen van mail en een terugkoppeling via JSON niet echt thuis in dezelfde functie. Je zou een wrapperfunctie kunnen schrijven voor het versturen van de mail, en de return-value van deze functie kunnen laten bepalen wat er moet gebeuren, maar rol dat niet in dezelfde functie. Scheid de taken/verantwoordelijkheden.
Ik ken wel wat van html, maar nu gaat het toch even mijn petje te boven, ben niet meer mee. :)
Is een combinatie van foutmeldingen (JSON Uw bericht is niet verzonden / Gelieve een geldig mailadres in te vullen / ...) niet mogelijk met een redirect na het invullen van een contactformulier?

Moet deze regel bovenaan in mijn php file komen? (if ($_SERVER['REQUEST_METHOD' == 'POST') { ... })
Of dien ik die $.ajax code te verwijderen? Deze constructie is misschien ingewikkeld, maar aangekocht via een template. Het werkt perfect voor die foutmeldingen. Enkel bij het redirecten vind ik geen oplossing.
Ik zit nu zover dat ik na het invullen en versturen van het contactformulier op de contact.php pagina terecht kom. Dit is een witte pagina met enkel de succes message: {“info”:”success”,”msg”:”Uw bericht is verzonden, bedankt! We nemen zo spoedig mogelijk contact met u op.”}. Maar er is dus nog altijd geen FW naar de bedankt pagina. Wat zou er nog mis kunnen zijn in de code??

Dit is de scripts.js file:

var submitContact = $('#submit-message'),

        message = $('#msg');

    submitContact.on('click', function(e){

        e.preventDefault();

        var $this = $(this);

        $.ajax({

            type: "POST",

            url: 'contact.php',

            dataType: 'json',

            cache: false,

            data: $('#contact-form').serialize(),

            success: function(data) {

        window.location.href = 'http://www.mijnsite.be/bedankt.html';

        if(data.info !== 'error'){

          $this.parents('form').find('input[type=text],input[type=email],textarea,select').filter(':visible').val('');

          message.hide().removeClass('success').removeClass('error').addClass('success').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');

        } else {

          message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');

        }

      }

            }

        });

    });

})(jQuery);


Dit is de contact.php:
<?php

if($_POST) {

$to = "[email protected]"; // Your email here

$subject = 'Bericht verstuurd van mijn website xxx'; // Subject message here

}

//Send mail function

function send_mail($to,$subject,$message,$headers){

if(@mail($to,$subject,$message,$headers)){

echo json_encode(array('info' => 'success', 'msg' => "Uw bericht is verzonden, bedankt! We nemen zo spoedig mogelijk contact met u op."));

} else {

echo json_encode(array('info' => 'error', 'msg' => "Uw bericht is niet verzonden. Er is iets verkeerd gegaan. Probeer het nog eens."));

}

}

//Check e-mail validation

function check_email($email) {

return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;

}

//Get post data

if(isset($_POST['name'],$_POST['mail'],$_POST['onderwerp'],$_POST['comment'])){

$name = $_POST['name'];

$mail = $_POST['mail'];

$onderwerp = $_POST['onderwerp'];

$comment = $_POST['comment'];

if($name == '') {

echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw naam in te vullen."));

exit();

} else if($mail == '' or check_email($mail) == false){

echo json_encode(array('info' => 'error', 'msg' => "Gelieve een geldig emailadres in te vullen."));

exit();

} else if($onderwerp == ''){

echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw onderwerp in te vullen."));

exit();

} else if($comment == ''){

echo json_encode(array('info' => 'error', 'msg' => "Gelieve uw bericht in te vullen."));

exit();

} else {

//Send Mail

$headers = 'From: <' . $mail . '>' . "\r\n";

'Reply-To: ' . $name . ' <' .$mail. '>' . "\r\n";

'X-Mailer: PHP/' . phpversion() . "\r\n";

send_mail($to, $subject, $comment . "\r\n\n" .'Naam: '.$name. "\r\n" .'Onderwerp: '.$onderwerp. "\r\n" .'Email: '.$mail, $headers);

}

} else {

echo json_encode(array('info' => 'error', 'msg' => "Gelieve alle velden in te vullen."));

}

?>
Ik gebruik dit:

window.location = 'blaat.php';


Dus ik zou dan dit gebruiken:

 if(data.info !== 'error'){
   window.location = 'http://www.mijnsite.be/bedankt.html';
        } else{ 
message.hide().removeClass('success').removeClass('error').addClass('error').html(data.msg).fadeIn('slow').delay(5000).fadeOut('slow');

        }


Reageren