/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Flere checkboxe med samme NAME attribut?
Fra : Aggeboe


Dato : 13-07-04 16:29

Jeg er stødt ind i et lille problem med flere checkboxe med samme name
attribut i en form.

Selve koden for funktionen der genererer checkboxene ser således ud:

// FUNCTION: Get checkbox options
function get_checkbox_options($id, $values) {

// Prepare string $checkbox
$checkbox = '';

// Split $values
$values = explode("|", $values);

// Check if $_POST['field_' .$id. ''] is array
if(!is_array($_POST['field_' .$id. ''])) {

// Set $_POST['field_' .$id. ''] = array()
$_POST['field_' .$id. ''] = array();

}

// Loop for all $values
for($i = 0; $i < sizeof($values); $i++) {

// Prepare $checked
$checked = '';

// Loop for all checked values in checkbox
foreach($_POST['field_' .$id. ''] as $val) {

// Check if this $val is checked
if($val == $values[$i]) {

   // Set $checked
   $checked = 'checked ';

}
}

// Append this checkbox
$checkbox .= '
      <input type="checkbox" ' .$checked. 'name="field_' .$id. '[]" value="'
..$values[$i]. '" class="checkbox"> ' .$values[$i]. '<br>';

}

// Return $checkbox
return $checkbox;

}

Det er ikke så vigtigt hvordan det fungerer, men $values er hentet fra
en underliggende dB, og er en streng der, hvor de forskellige checkbox
value attributter er adskilt af tegnet "|".

I ren HTML kan selve input kontrol parameteren cirka se sådan her ud:
<input type="checkbox" name="field_4[]" value="Sjælland"
class="checkbox"> Sjælland<br>

<input type="checkbox" name="field_4[]" value="Fyn" class="checkbox">
Fyn<br>

<input type="checkbox" name="field_4[]" value="Jylland"
class="checkbox"> Jylland<br>

<input type="checkbox" name="field_4[]" value="Andet sted"
class="checkbox"> Andet sted<br>

Grunden til at jeg bruger name="field_4[]" som name attribut for input
elementet, er at det så er rimelig simpelt at smide $_POST værdierne ind
på de relavante pladser ved en eventuel fejl. Og det er jo fikst, så man
ikke skal taste hele spørgeskemaet ind igen ved en eventuel fejl...

$_POST['field_4'] er så et array(), der kan se sådan her ud (ved hak i
"Sjælland" og "Andet sted"):
[field_4] => Array ( [0] => Sjælland [1] => Andet sted )

Problemet er nu at jeg ikke kan checke (med javascript) om brugeren har
udfyldt/hakket mindst et felt af?

Lidt javascript test på feltet giver:
document.forms.new_filled_form.field4[] er undefined!
document.forms.elements[23].name er korrekt field_4[]!
document.forms.elements[23].value er altid "Andet sted", fordi det er
det sidste input element med navnet field_4[].
document.forms.elements[23].checked er kun TRUE, når "Andet sted" er
hakket af og FALSE uanset hvilke af de andre der er hakket af pga.
ovenstående.

I korte træk, jeg vil altså gerne have mulighed for flere checkboxe, der
giver brugeren mulighed for at afkrydse flere værdier for samme
spørgsmål. Og samtidig have mulighed for at checke at mindst en checkbox
er hakket af.

Hvad gør jeg eller gør jeg galt?

/Aggeboe

PS: Sorry, hvis det er den forkerte gruppe (skulle måske være noget
clientside), men da det måske er i PHP koden den er gal, så endte den her!

 
 
Tommy Ipsen (13-07-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 13-07-04 21:44

Aggeboe wrote:

> I ren HTML kan selve input kontrol parameteren cirka se sådan her ud:
> <input type="checkbox" name="field_4[]" value="Sjælland"
> class="checkbox"> Sjælland<br>
>
> <input type="checkbox" name="field_4[]" value="Fyn" class="checkbox">
> Fyn<br>

Mener ikke, at navnet "field_4[]" er et gyldigt navn (pga. '[]') jvf.
HTML 4.01 spec. og derfor vil det sandsynligvis give forskellige typer
problemer afhængig af browser og script-sprog.

Mvh Tommy

Aggeboe (13-07-2004)
Kommentar
Fra : Aggeboe


Dato : 13-07-04 21:57

Tommy Ipsen wrote:

> Aggeboe wrote:
>
>> I ren HTML kan selve input kontrol parameteren cirka se sådan her ud:
>> <input type="checkbox" name="field_4[]" value="Sjælland"
>> class="checkbox"> Sjælland<br>
>>
>> <input type="checkbox" name="field_4[]" value="Fyn" class="checkbox">
>> Fyn<br>
>
>
> Mener ikke, at navnet "field_4[]" er et gyldigt navn (pga. '[]') jvf.
> HTML 4.01 spec. og derfor vil det sandsynligvis give forskellige typer
> problemer afhængig af browser og script-sprog.

Du har desværre nok ret, men ikke desto mindre bruger man det da også i
<select multiple> felter i PHP, hvor name="test[]", så danner et array
af de valgte options.

Har lige haft samme problem med nogle dette eksempel:

<select name="field_6[day]" class="select">
<option value=""> DD </option>
<option value="01">01</option>
<option value="02">02</option>
... flere options
</select>

<select name="field_6[month]" class="select">
<option value=""> MM </option>
<option value="01">01</option>
<option value="02">02</option>
... flere options
</select>

<input type="text" name="field_6[year]" value="" class="date">
<input type="hidden" name="name_6" value="date(dd-mm-yyyy)">

Her er det smart i PHP, da $_POST[field_6] arrayet så vil indeholde både
dag, måned og år...
Det er straks et større problem at javascript checke om felterne er udfyldt.

Jeg klarede det ved, at lede efter feltet name_6 i form.elements
array'et, da det kommer lige efter field_6[year]. Så er det bare at
finde index for name_6 i elements array'er og så adressere de 3 andre
som elements[index-1], elements[index-2], etc.

Besværligt, men det virker. Og jeg føler mig overbevist om at det er
endnu mere besværligt at navngive dem korrekt og samtidig let kunne
"genbruge" de allerede taster værdier ved evt. fejl?!?!

/Aggeboe

Peter Brodersen (13-07-2004)
Kommentar
Fra : Peter Brodersen


Dato : 13-07-04 22:12

On 13 Jul 2004 22:43:40 +0200, Tommy Ipsen <tipsen@imada.sdu.dk>
wrote:

>Mener ikke, at navnet "field_4[]" er et gyldigt navn (pga. '[]') jvf.
>HTML 4.01 spec. og derfor vil det sandsynligvis give forskellige typer
>problemer afhængig af browser og script-sprog.

Til trods for fortsatte påstande om det modsatte, så er field_4[] et
helt gyldigt navn, og validerer uden problemer, både i HTML4.01 Strict
og XHTML1.1. Værdien for name skal være af typen CDATA.

Det er dog rigtigt, at det kan give et problem i javascript at
referere til et felt med det name, men en mulighed er så at give
feltet et id, og bruge getElementById() i stedet for.

--
- Peter Brodersen

Ugens sprogtip: jf. (og ikke jvf.)

Aggeboe (13-07-2004)
Kommentar
Fra : Aggeboe


Dato : 13-07-04 22:43

Peter Brodersen wrote:

> On 13 Jul 2004 22:43:40 +0200, Tommy Ipsen <tipsen@imada.sdu.dk>
> wrote:
>
>
>>Mener ikke, at navnet "field_4[]" er et gyldigt navn (pga. '[]') jvf.
>>HTML 4.01 spec. og derfor vil det sandsynligvis give forskellige typer
>>problemer afhængig af browser og script-sprog.
>
>
> Til trods for fortsatte påstande om det modsatte, så er field_4[] et
> helt gyldigt navn, og validerer uden problemer, både i HTML4.01 Strict
> og XHTML1.1. Værdien for name skal være af typen CDATA.
>
> Det er dog rigtigt, at det kan give et problem i javascript at
> referere til et felt med det name, men en mulighed er så at give
> feltet et id, og bruge getElementById() i stedet for.

Takker, det var lige hvad jeg havde brug for. Det var faktisk det jeg
prøvede at gøre med field_4, hvor 4 afhænger af antallet af input
elementer og rækkefælgen af samme.

Nu proppede jeg så bare en id attribut på også og vupti, så kan der
navigeres...

/Aggeboe

Tommy Ipsen (13-07-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 13-07-04 23:19

Peter Brodersen wrote:

> Til trods for fortsatte påstande om det modsatte, så er field_4[] et
> helt gyldigt navn, og validerer uden problemer, både i HTML4.01 Strict
> og XHTML1.1. Værdien for name skal være af typen CDATA.

Er det ikke følgende der fortæller, hvilke karakterer der må medtages:

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
followed by any number of letters, digits ([0-9]), hyphens ("-"),
underscores ("_"), colons (":"), and periods (".").

?

Mvh Tommy

Peter Brodersen (14-07-2004)
Kommentar
Fra : Peter Brodersen


Dato : 14-07-04 01:41

On 14 Jul 2004 00:18:56 +0200, Tommy Ipsen <tipsen@imada.sdu.dk>
wrote:

>Er det ikke følgende der fortæller, hvilke karakterer der må medtages:
>
>ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
>followed by any number of letters, digits ([0-9]), hyphens ("-"),
>underscores ("_"), colons (":"), and periods (".").
>
>?

Jo, men det, der kan forvirre, er at ovenstående refererer til
SGML-typer, og ikke HTML-attributter

Så værdien for name i en input skal være af typen CDATA, og ikke af
NAME :)

Det kan ses under definitionen for INPUT-element og dets attributter:
http://www.w3.org/TR/html401/interact/forms.html#adef-name-INPUT

For at forvirre yderligere, så er et id derimod af typen NAME:
http://www.w3.org/TR/html401/struct/global.html#adef-id


CDATA, ID, NAME, m.m. er forklaret her (hvor du vist selv var forbi):
http://www.w3.org/TR/html401/types.html#h-6.2

Det er lidt forvirrende, og det er derfor forståeligt nok, at man
roder rundt i det (idet både id og name altså hver har to forskellige
betydninger). Jeg vil blot gerne gøre mit for at rette op på
misforståelsen, idet den i yderste konsekvens kunne så unødvendig
mistillid til fx w3-validatoren.

--
- Peter Brodersen

Ugens sprogtip: jf. (og ikke jvf.)

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408851
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste