Ik heb een contactformulier die een paar checkboxes heeft. Het formulier post gewoon, alles werkt. Alleen post hij de checkboxes niet. Dit is wat ik nu heb.

<?
<div>
<label>
<input type="checkbox" name="checkbox[]" id="checkbox1" value="Kantel">
<span>Kantel</span>
</label>
</div>
<div>
<label>
<input type="checkbox" name="checkbox[]" id="checkbox2" value="Schuif">
<span>Schuif</span>
</label>
</div>
<div>
<label>
<input type="checkbox" name="checkbox[]" id="checkbox3" value="Deuropening">
<span>Deuropening</span>
</label>
</div>
<div>
<label>
<input type="checkbox" name="checkbox[]" id="checkbox4" value="Draai">
<span>Draai</span>
</label>
</div>
<div>
<label>
<input type="checkbox" name="checkbox[]" id="checkbox5" value="Draai/kantel">
<span>Draai/kantel</span>
</label>
</div>

?>

Dit is mijn mailsript:

<?php
session_cache_limiter('nocache');
header('Expires: ' . gmdate('r', 0));

header('Content-type: application/json');

// Enter your email address
$to = '[email protected]';

$subject = $_POST['subject'];

if($to) {
$name = $_POST['name'];
$email = $_POST['email'];

$fields = array(
0 => array(
'text' => 'Naam',
'val' => $_POST['name']
),
1 => array(
'text' => 'Email adres',
'val' => $_POST['email']
),
2 => array(
'text' => 'Adres',
'val' => $_POST['adres']
),
3 => array(
'text' => 'Afleveradres',
'val' => $_POST['afleveradres']
),
4 => array(
'text' => 'Postcode',
'val' => $_POST['postcode']
),
5 => array(
'text' => 'Plaats',
'val' => $_POST['plaats']
),
6 => array(
'text' => 'Tweede plaats',
'val' => $_POST['plaats2']
),
7 => array(
'text' => 'Telefoonnummer',
'val' => $_POST['telefoonnr']
),
8 => array(
'text' => 'Mobiel nummer',
'val' => $_POST['mobielnr']
),
9 => array(
'text' => 'Type Raam',
'val' => $_POST['checkbox']
),
10 => array(
'text' => 'Contactpersoon',
'val' => $_POST['contactpersoon']
),
11 => array(
'text' => 'Bericht',
'val' => $_POST['message']
)
);

$message = "";
foreach($fields as $field) {
$message .= $field['text'].": " . htmlspecialchars($field['val'], ENT_QUOTES) . "<br>\n";
}

$headers = '';
$headers .= 'From: ' . $name . ' <' . $email . '>' . "\r\n";
$headers .= "Reply-To: " . $email . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";

if (mail($to, $subject, $message, $headers)){
$arrResult = array ('response'=>'success');
} else{
$arrResult = array ('response'=>'error');
}

echo json_encode($arrResult);

} else {

$arrResult = array ('response'=>'error');
echo json_encode($arrResult);

}
?>

En dit is het ajax stuk dat alles serialized:

<?
// Ajax Submit
$.ajax({
type: "POST",
url: url,
data: $("#contact-form").serialize(),
dataType: "json",
?>
(Met nog wat extra eronder voor een success message maar dat is niet echt van toepassing bij het probleem)

De brackets achter de naam bij het formulier heb ik er neergezet omdat ik las dat dat moet bij checkboxes. Nu krijg ik alleen niks te zien bij het stuk checkboxes in de mail. Als ik de brackets weghaal dan laat hij maar 1 resultaat zien, ook als er meerdere zijn aangevinkt.

Hoe kan ik alle gecheckte boxes uitlezen in de mail? De waarden staan nu in een array.
Wat je in jouw geval kunt doen is bij
<?php
'val' => $_POST['checkbox']
?>

Het volgende gebruiken:
<?php
'val' => implode(',', $_POST['checkbox'])
?>
Zoiets moet er inderdaad in.. Maar moet dat in het php script? Niet in ajax? Als ik toevoeg wat je net hebt gepost dan laat hij weer niets zien. Laat maar ik had een typo gemaakt. Thanks! Werkt nu.
Een checkbox wordt alleen meegestuurd met de POST als ie is aangevinkt, anders niet.
Correct. Er zal dus wel even een controle met isset() toegevoegd moeten worden voor het geval iemand niets aanvinkt.
Ben van Velzen op 01/12/2015 18:55:36

Correct. Er zal dus wel even een controle met isset() toegevoegd moeten worden voor het geval iemand niets aanvinkt.


Klopt, maar dat is alleen van toepassing als het required is om een checkbox in te vullen. Als het optioneel is maakt het niks uit lijkt me.
Dan maakt het juist uit, omdat je je anders undefined index notices krijgt. Dus:
<?php
'val' => isset($_POST['checkbox']) ? implode(',', $_POST['checkbox']) : ''
?>
Ik zou indien er geen checkboxen zijn aangevinkt de default waarde een leeg array laten zijn (in plaats van een lege string) zodat je deze waarde altijd als array kunt behandelen. Constructies als empty() werken dan toch hetzelfde.

EDIT: ah het wordt hier juist weer geserialiseerd, never mind :).
EDIT: als dat hele ding trouwens een value van een key-value paar is, doe je er wel verstandig aan hier nog ronde haken omheen te zetten, dus 'val' => ( X ? Y : Z ).

Reageren