28. april 2012 - 15:59Der er
7 kommentarer og 1 løsning
Lang formular med checkboxe - håndtere at kun er true-værdier der bliver postet.
jeg har en lang medlemsliste trukket ud fra en database og listet i en formular med checkboxe.
Jeg søger en nem måde at detektere hvilke checkbokse der måske er sat et flueben eller andre hvor et flueben er fjernet. Det vil jo ikke umiddelbart ses i arrayet, da det kun er true-værdier der bliver postet.
Jeg bruger metoden POST i min formular. Jeg bruger felterne frigivet[], kontrolfelt[] og id[](se nedenfor). Jeg anvender en for-løkke (i php) til at generere formularen med. ----kode---- echo "<input type=\"checkbox\" name=\"frigivet[]\" value=\"1\" checked />Frigivet\n"; echo "<input type=hidden name=\"kontrolfelt[]\" value=\"1\" />\n"; echo "<input type=hidden name=\"id[]\" value=\"$id\" />\n"; ----/kode----
jeg får postet et array som dette (eksempel med kun 2 medlemmer i formularen): $_POST['frigivet'] = Array ( [0] => 1 [1] => 1 ) $_POST['kontrolfelt'] = Array ( [0] => 1 [1] => 1 ) $_POST['id'] = Array ( [0] => 34 [1] => 137 )
Hvis der er fjernet et flueben vil arrayet $_POST['frigivet'] f.eks se sådan ud: $_POST['frigivet'] = Array ( [0] => 1 ) men det fremgår ikke hvem der ikke længere har flueben:
Hvordan detekterer jeg lige at der nu ikke længere er flueben ved medlemmet med id 34.
Det lyder svært, men nogen må vel have en metode til det...
erikjacobsen> Nej radioknapper kan ikke bruges her. Det er kun i mit eksempel at der kun var 2 på listen. I den virkelige liste er der 150 medlemmer, hvor administrator skal kunne sætte flueben ved dem der skal med på en mailliste, eller et eller andet... Beklager hvis ikke det fremgik tydeligt nok.
Det vil ikke være "pænt" med radioknapper i den sammenhæng det skal bruges, men det ville blive postet, både som true og false...
Nu har jeg selv brygget på en løsning. Min kode er ændret, så jeg når jeg genererer formularen definerer nøglerne til arrayet, eksempelvis med feltet medlem_id[$i]. Dette felt vil bleve sendt med for alle poster uafhængigt af checkboksen. ----kode---- echo "<input type=\"checkbox\" name=\"tilmeldt[$i]\" value=\"1\" checked />Tilmeldt\n"; echo "<input type=\"hidden\" name=\"medlem_id[$i]\" value=\"$id\" />\n"; ----/kode----
Når jeg så skal detektere hvor der ikke er flueben, så gennemløber jeg arrayet $_POST['medlem_id'], kan jeg kan jo hurtigt tjekke ud for $_POST['medlem_id'][3], om $_POST['tilmeldt'][3] er sat til true.
Hvis jeg yderligere vil tjekke om fluebenet lige er fjernet, eller om det heller ikke stod der i formularen, kan jeg klare det ved et hidden felt mere der sender den gamle værdi med: eksempel: echo "<input type=\"hidden\" name=\"kontrolkode[$i]\" value=\"0\" />\n"
Kun hvis det er ændret kører jeg er UPDATE-query mod databasen.
Jeg poster dette som et svar, og når løsningen er færdigtestet, så ser vi om det er brugbart...
Til fejlfinding udskriver jeg mine arrays med funktionen print_r, men den skriver dem ikke som den plejer. jeg har lavet et udklip fra det den returnerer herunder.
er der nogen der ved hvad årsagen til dette volapyk kan være ? ----- Klip ----- $_POST['frigivet'] = Array ( [¤i] => 1 ) <br /> $_POST['kontrolkode'] = Array ( [¤i] => 0 ) <br /> $_POST['medlem_id'] = Array ( [¤i] => 381 ) <br /> ----- /Klip -----
Problemet med ovenstående volapyk opstod efter jeg havde ændret en stribe varibelnavne med 'søg og erstat', og derfor var nøglerne i arrayet blevet kaldt "[¤i]"
Jeg beklager at jeg ulejligede jer med dette, før jeg selv opdagede fejlen.
Bare lige for at runde spm af, så vil jeg lige poste de dele af minkode der voldte så meget hovedbrud.
løsningen blev: Formularen genereres af en for-løkke i php: ---- klip php-kode ---- if (tjek_frigivet($id)) { // hvis medlemmet er frigivet echo "<input type=\"checkbox\" name=\"frigivet[$i]\" value=\"1\" checked />Frigivet\n"; echo "<input type=\"hidden\" name=\"kontrolkode[$i]\" value=\"1\" />\n"; echo "<input type=\"hidden\" name=\"medlem_id[$i]\" value=\"$id\" />\n"; } else { // hvis medlemmet ekke er frigivet echo "<input type=\"checkbox\" name=\"frigivet[$i]\" value=\"1\" />Frigiv\n"; // unchecked poster ikke noget når der sendes echo "<input type=\"hidden\" name=\"kontrolkode[$i]\" value=\"0\" />\n"; echo "<input type=\"hidden\" name=\"medlem_id[$i]\" value=\"$id\" />\n"; } // hvis tjek frigivet slutter ---- /klip php-kode ----
og når POST-variablerne løbes igennem, så vil arrayet være komplet med en post for hvert medlem, som bare kan løbes igennem med en for-løkke. Nedenstående kode detekterer om der eksempelvis er fjernet et flueben i forhold til dag formularen blev genereret. ---- klip php-kode ---- if ($_POST['sendt']){ // hvis formular sendt $post_kontrolkode = $_POST['kontrolkode']; $post_frigivet = $_POST['frigivet']; $post_medlem_id = $_POST['medlem_id']; for($i=0;$i<count($post_medlem_id);$i++) { // tæller hvor mange medlemmer der er postet if ($post_frigivet[$i]) { // hvis der er sat flueben echo "Der er flueben ved medlem nr ." . $post_medlem_id[$i] . "<br />\n"; if ($post_kontrolkode[$i] == 0) { // og hvis fluebenet lige er sat echo "Der er lige sat flueben ved medlem nr. " . $post_medlem_id[$i] . "<br />\n"; } } else { // hvis der ikke er sat flueben if ($post_kontrolkode[$i]) { // og hvis den findes som kontrolkode, så var den gamle værdi true, så fluebenet er lige fjernet echo "Der er lige fjernet flueben ved medlem nr. " . $post_medlem_id[$i] . "<br />\n"; } } } } // hvis sendt slutter ---- /klip php-kode ----
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.