Ik heb een aanmeldformulier met een aantal vragen die middels een radio button met Ja of Nee moeten worden beantwoord. Als het formulier verzonden wordt en men heeft bij een of meer vragen vergeten Ja of Nee aan te klikken komt het formulier leeg terug en moeten alle radio"buttons weer opnieuw aangeklikt worden. Hoe kan ik dat voorkomen, zodat de reeds ingevulde rondjes ingevuld blijven?
Dit is wat ik bijv. in de code achter de vraag aanhef heb staan
<?php
echo "<input name=\"geslacht\" type=\"radio\" id=\"geslacht\" value=\"man\"";
echo "\>dhr.";
echo "<input name=\"geslacht\" type=\"radio\" id=\"geslacht\" value=\"vrouw\"";
echo "\>mevr.";
?>
echo echo echo echo :). Tis allemaal statische HTML hoor.
Er zijn (ten minste) twee manieren om dit te onthouden:
1. quick and dirty, je POST naar dezelfde pagina en gebruikt $_POST om eventueel waarden/selecties terug te plakken/plaatsen. Nadelen: rommelige code en mogelijk "dubbelposts"
2. je hebt een aparte verwerkstap waarin je tijdelijk gegevens opslaat in een sessie. Indien in deze stap blijkt dat er een fout in de invoer zit of dat deze onvolledig is stuur je iemand terug naar het formulier alwaar de reeds eerder ingevulde gegevens (die je in de sessie onthouden hebt) weer terugzet in het formulier.
Nadelen: wat meer overhead (maar wel zijn alle stappen dan beter gescheiden)
Euh, niet helemaal. Kijk eens naar de values :). Daarnaast doe je hier twee keer min of meer hetzelfde. Don't Repeat Yourself. Hier heb je loops voor :). Ook kan het zijn dat het formulier nog niet eerder is ingevuld, in dat geval bestaat $_SESSION['aanhef'] helemaal niet. En dan doe je er verstandig aan om dit enigszins te "namespacen" in je sessie zodat alle formulierdata een beetje bij elkaar staat, ik zou dit op zijn minst in een subarray "form" zetten ofzo.
Aldus krijg je zoiets:
<?php
// vergeet niet ergens je sessie van tevoren te starten/voort te zetten met
session_start();
// ...
// definitie
$aanhef = array(
array(
'label' => 'dhr.',
'value' => 'man',
),
array(
'label' => 'mevr.',
'value' => 'vrouw',
),
);
// draai de velden uit
foreach ($aanhef as $row) {
$checked = isset($_SESSION['form']['geslacht']) && $_SESSION['form']['geslacht'] == $row['value'] ? ' checked="checked"' : '';
$id = 'geslacht_'.$row['value'];
?><input type="radio" name="geslacht" id="<?php echo $id ?>" value="<?php echo $row['value'] ?>"<?php echo $checked ?> />
<label for="<?php echo $id ?>"><?php echo $row['label'] ?></label><?php
}
?>
Ook doe je er verstandig aan op gezette plaatsen gebruik te maken van output escaping.
Kleine wijziging, wellicht is het handiger om het id als volgt te genereren, dan is dit minder afhankelijk van de waarden van radio buttons, het bovenstaande werkt, maar wellicht is het volgende wat breder toepasbaar: