Meerdere checkboxen checked gebaseerd op url parameters

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stephan Kamstra

Stephan Kamstra

21/07/2016 10:29:43
Quote Anchor link
Ik heb een lijst met checkboxen in een formulier, welke gegenereerd worden uit de database, en dat werkt.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }

?>


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
 
PHP hulp

PHP hulp

30/11/2024 17:29:48
 
Thomas van den Heuvel

Thomas van den Heuvel

21/07/2016 12:00:13
Quote Anchor link
- hoe ziet de uiteindelijke HTML voor de checkboxen er uit?
- 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
 
Stephan Kamstra

Stephan Kamstra

21/07/2016 12:52:12
Quote Anchor link
Dit is hoe de html eruit ziet van de checkboxen (sorry lange lijst).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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
 
Ivo P

Ivo P

21/07/2016 13:40:11
Quote Anchor link
"mogelijk" verbetert de leesbaarheid van het topic als je de code tussen zgn code-tags zet

[c o d e] en [/ c o d e] (maar dan zonder de spaties)

---
verder denk ik dat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(trim($value) == trim($option2)) {

$checked = ' checked="checked"';

}

?>


uitgebreid moet worden tot

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if(trim($value) == trim($option2)) {
  $checked = ' checked="checked"';
}

else {
  $checked = '';
}

?>



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.
 
Stephan Kamstra

Stephan Kamstra

21/07/2016 15:33:25
Quote Anchor link
Ik heb er even opmaak omheen gezet.

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?
 
Ivo P

Ivo P

21/07/2016 15:48:19
Quote Anchor link
zorg dat de laatste checkbox aangevinkt is, en het zal resulteren in een lijst met alle checkboxen aangevinkt :-)



Toevoeging op 21/07/2016 15:52:57:

regel 37:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
   $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
 
Stephan Kamstra

Stephan Kamstra

21/07/2016 15:59:57
Quote Anchor link
Wow, was het zo simpel, en ik maar moeilijk doen.

Ik heb trouwens het blok van die $chek_box2 aan laten staan en dat werkt. Hoeft niet tussen die ene foreach.

Bedankt
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.