Meerdere checkboxen checked gebaseerd op url parameters
Wanneer ik op zoeken klik in het formulier, dan worden alle checkboxen die ik aangevinkt had, als parameter in de url geplaatst.
De pagina ververst en plotseling zijn alle checkbox aangevinkt, zelfs degene die ik niet had aangevinkt.
Dit is de code die ik momenteel gebruik:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
public static function custom_check_box($property=array(),$data=array(),$selected)
{
$chek_box = '<div class="upme-multi-select">';
$values = $_GET['user_sports'];
$checked='';
$chek_box2='';
$chekValue='';
if(is_array($property))
{
foreach($property as $key=>$value)
{
$chek_box2 .=' '.$key.'="'.$value.'"';
}
}
foreach ($data as $option2) {
$option2 = upme_stripslashes_deep(trim($option2));
foreach ($values as $key => $value) {
if(trim($value) == trim($option2)) {
$checked = ' checked="checked"';
}
}
}
foreach ($data as $option) {
$option = upme_stripslashes_deep(trim($option));
$chek_box .= '<input id="' . $option . '" '. $chek_box2 . ' type="checkbox" value="' . $option . '" '.$checked;
$chek_box .= '/><label data-toggle="tooltip" title="' . $option . '" for="' . $option . '" class="upme-checkbox">' . $option . '</label>';
}
$chek_box .= '</div>';
return $chek_box;
}
?>
public static function custom_check_box($property=array(),$data=array(),$selected)
{
$chek_box = '<div class="upme-multi-select">';
$values = $_GET['user_sports'];
$checked='';
$chek_box2='';
$chekValue='';
if(is_array($property))
{
foreach($property as $key=>$value)
{
$chek_box2 .=' '.$key.'="'.$value.'"';
}
}
foreach ($data as $option2) {
$option2 = upme_stripslashes_deep(trim($option2));
foreach ($values as $key => $value) {
if(trim($value) == trim($option2)) {
$checked = ' checked="checked"';
}
}
}
foreach ($data as $option) {
$option = upme_stripslashes_deep(trim($option));
$chek_box .= '<input id="' . $option . '" '. $chek_box2 . ' type="checkbox" value="' . $option . '" '.$checked;
$chek_box .= '/><label data-toggle="tooltip" title="' . $option . '" for="' . $option . '" class="upme-checkbox">' . $option . '</label>';
}
$chek_box .= '</div>';
return $chek_box;
}
?>
Ik doe volgens mij iets niet goed met de meerdere foreach, maar zie niet wat.
Gewijzigd op 21/07/2016 14:06:21 door Stephan Kamstra
- hoe ziet de URL er uit?
- de checkboxen hebben in ieder geval geen name-attribuut noch array-haken die aangeven dat het gelijknamige/gelijksoortige checkboxen betreft...
- tijdens het genereren van de HTML (tweede foreach loop) is $checked mogelijk altijd gelijk aan ' checked="checked"' dus in dat opzicht is het niet zo verwonderlijk dat alles is aangevinkt... als er ten minste één checkbox aangevinkt was verandert $checked permanent naar deze waarde
Als je deze drie foreach-loops nu eens combineert tot één loop?
NB: wat doet de functie upme_stripslashes_deep()? Dit klinkt nogal dodgy...
NB #2: de functie custom_check_box is alles behalve generiek omdat deze een hardcoded $_GET parameter bevat; als je deze nu eens als argument aan de functie meegeeft, en ook de waarden die geselecteerd zouden moeten zijn voert aan de functie, dan kun je buiten deze functie/methode nog besluiten wat voor methode (GET, POST) je gebruikt of dat deze informatie (welke checkboxen geselecteerd zijn) mogelijk uit een database komt ofzo.
Gewijzigd op 21/07/2016 12:05:17 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<div class="upme-multi-select">
<input id="Aangepast sporten" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten" class="upme-checkbox" data-original-title="Aangepast sporten">Aangepast sporten</label>
<input id="Aangepast sporten (auditieve beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (auditieve beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (auditieve beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (auditieve beperking)">Aangepast sporten (auditieve beperking)</label>
<input id="Aangepast sporten (fysieke beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (fysieke beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (fysieke beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (fysieke beperking)">Aangepast sporten (fysieke beperking)</label>
<input id="Aangepast sporten (verstandelijke beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (verstandelijke beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (verstandelijke beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (verstandelijke beperking)">Aangepast sporten (verstandelijke beperking)</label>
<input id="Aangepast sporten (visuele beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (visuele beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (visuele beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (visuele beperking)">Aangepast sporten (visuele beperking)</label>
etc.....
</div>
<input id="Aangepast sporten" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten" class="upme-checkbox" data-original-title="Aangepast sporten">Aangepast sporten</label>
<input id="Aangepast sporten (auditieve beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (auditieve beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (auditieve beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (auditieve beperking)">Aangepast sporten (auditieve beperking)</label>
<input id="Aangepast sporten (fysieke beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (fysieke beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (fysieke beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (fysieke beperking)">Aangepast sporten (fysieke beperking)</label>
<input id="Aangepast sporten (verstandelijke beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (verstandelijke beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (verstandelijke beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (verstandelijke beperking)">Aangepast sporten (verstandelijke beperking)</label>
<input id="Aangepast sporten (visuele beperking)" class="css-checkbox" name="user_sports[]" type="checkbox" value="Aangepast sporten (visuele beperking)" checked="checked">
<label data-toggle="tooltip" title="" for="Aangepast sporten (visuele beperking)" class="upme-checkbox" data-original-title="Aangepast sporten (visuele beperking)">Aangepast sporten (visuele beperking)</label>
etc.....
</div>
De url ziet er als volgt uit:
domein.nl/?user_sports%5B%5D=Aangepast+sporten
Zoals je ziet, volgens de url zou alleen de eerst checkbox aangevinkt moeten zijn, die heeft dezelfde waarde.
Gewijzigd op 21/07/2016 15:29:13 door Stephan Kamstra
[c o d e] en [/ c o d e] (maar dan zonder de spaties)
---
verder denk ik dat
uitgebreid moet worden tot
Code (php)
Toevoeging op 21/07/2016 13:40:46:
want wat als je alleen de derde checkbox aanvinkt? Zijn dan de eerste 2 open?
Toevoeging op 21/07/2016 13:53:25:
je code is wat onleesbaar, zo zonder opmaak, maar het lijkt erop dat je eerst alle checkboxen doorloopt om te kijken of er gecheckt moet worden
en daarna nog een keer om ze op het scherm te zetten. Dat loopt fout, omdat je dan niet per checkbox onthouden hebt of dié checkbox gevinkt moet worden.
Nu omdat die lege $checked = ''; else erbij is gezet, is niks aangevinkt zodra de pagina herlaad.
Ik had al geprobeerd alle foreach in 1 te zetten, maar toen kreeg ik dezelfde resultaat, alles aangevinkt.
Is hier een oplossing voor?
Toevoeging op 21/07/2016 15:52:57:
regel 37:
Code (php)
1
2
3
2
3
<?php
$checked = in_array($option, $_GET['user_sports']) ? ' checked="checked" ' : '';
?>
$checked = in_array($option, $_GET['user_sports']) ? ' checked="checked" ' : '';
?>
Dat blok van regel 12 / 33 kan weg.
het stuk waarin je $chek_box2 aanmaakt, moet je ook binnen de lus in de buurt van regel 37 zetten.
Toevoeging op 21/07/2016 15:56:00:
en ik zou de id van de checkbox niet afhankelijk maken van de value.
Stel dat de value dubbel voorkomt: een dubbele id mag niet in de htmlcode.
of stel dat een value een spatie zou bevatten: dat kan ook tot problemen leiden. (niet "stel", dat is zelfs zo)
Gewijzigd op 21/07/2016 15:53:27 door Ivo P
Ik heb trouwens het blok van die $chek_box2 aan laten staan en dat werkt. Hoeft niet tussen die ene foreach.
Bedankt