Avatar billede fojensen Nybegynder
28. april 2012 - 15:59 Der 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...
Avatar billede Calle5463 Forsker
28. april 2012 - 16:12 #1
- lytter med
Avatar billede erikjacobsen Ekspert
28. april 2012 - 17:07 #2
Overvej at bruge 2 radioknapper, "ja"/"nej", i stedet for en checkbox.
Avatar billede fojensen Nybegynder
28. april 2012 - 17:20 #3
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.
Avatar billede erikjacobsen Ekspert
28. april 2012 - 17:27 #4
Det fremgik - men lad mig uddybe: Hvert medlem skal hver have to "ja"/"nej" radioknapper i stedet for en checkbox.

...altså under den forudsætning at det giver mening på websiden...
Avatar billede fojensen Nybegynder
28. april 2012 - 18:54 #5
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...

Tak til Jer der bød ind.
Avatar billede fojensen Nybegynder
28. april 2012 - 22:18 #6
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 -----
Avatar billede fojensen Nybegynder
28. april 2012 - 22:25 #7
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.
Avatar billede fojensen Nybegynder
28. april 2012 - 22:38 #8
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 ----
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester