views:

31

answers:

3

I have a search form where several checkboxes are checked by default. When the form submits, as a GET, the url will only contain the list of checkboxes that were left checked.

http://www.example.com/page/?checkbox1=yes&checkbox2=yes

It is difficult with this scenario to determine the difference between when a user first arrives at this search page and when they submit the form with all checkboxes unchecked because the querystrings look the same.

To combat this problem I have started injecting a hidden field before the checkbox with the same name and a 'no' value. When the checkbox is unchecked the browser will send the hidden field's no value and when the checkbox is set then the browser is overriding the hidden field with the checkbox's 'yes' value.

<input type="hidden" name="checkbox1" value="no" />
<input type="checkbox" name="checkbox1" value="yes" />

when the user submits the form with all checkboxes unchecked I get this querystring:

http://www.example.com/page/?checkbox1=no&amp;checkbox2=no

This seems to work on ff, chrome, ie5.5+ so I'am I safe in using this method or is there a better way to make checkboxes submit like inputs and selects?

A: 

Address the real problem:

determine the difference between when a users first arrives at this search page and when they submit the form with all checkboxes unchecked

Have one hidden field along the lines of

<input type="hidden" name="submitted" value="true">

You could then use the checkboxes in groups:

<input type="checkbox" name="foo" value="bar" id="foo_bar">
<label for="foo_bar">Bar</label>

<input type="checkbox" name="foo" value="baz" id="foo_baz">
<label for="foo_baz">Baz</label>

Then you can just loop over them on the server. How you do that depends on your server side environment. In most languages you can either call a method that returns an array of data (IIRC Java form libs tend to work this way) or just request the data in array context (Perl libs usually operate this way). PHP is a common language for server side programming and is a bit odd, it requires you to rename fields to end with the characters [].

David Dorward
A: 

As you say it seems to work fine. Alternatively you could avoid making it act like a normal input and just do a check to see if the input exists (if the input doesn't exist then treat it as false, if it does, treat it as true).

For example, in PHP

if(isset($_GET['checkbox1']) { ... }

in ASP.NET

if (Request.QueryString["checkbox1"] != null) { ... }

Of course you probably have yours reasons for wanting to do that client-side.

smdrager
That doesn't solve the problem expressed in the question: "determine the difference between when a users first arrives at this search page and when they submit the form with all checkboxes unchecked"
David Dorward
Thanks. Its just another way of looking at it.
smdrager
+2  A: 

That's a really clever idea. As an unchecked checkbox doesn't appear in the request that really will help to know if a user enters the form for the first time.

But to know that you can simply use a hidden field with a default value. So when the users enters the form, the parameter is not set. As soon as he submits the form, the value is set.

You can also use a name for the submit button and you can then see if it was submitted:

<input type="submit" name="submit" />

Is that solving your problem?

Kau-Boy
Only if the form was submitted using the submit button (and only if it has a value). It won't be submitted if the form was submitted by the enter key (at least in some browsers) or JavaScript.
David Dorward
You are right for IE as he doesn't send the submit value. That my first advice (which is better anyways) will solve the problem :)
Kau-Boy