[html-formfu] How to handle checkboxes

Carl Franks fireartist at gmail.com
Wed Aug 27 15:34:34 BST 2008


2008/8/27 Dermot <paikkos at googlemail.com>:
> 2008/8/27 Carl Franks <fireartist at gmail.com>:
>> 2008/8/27 Dermot <paikkos at googlemail.com>:
>>> Hi,
>>>
>>> As a first post I would like to say what a great framework FormFu is.
>>>
>>> I have a feeling my first question is not the smartest to ask but here goes.
>>>
>>> My form has a series of checkboxs that correspond to true/false fields.
>>>
>>> I am doing this to
>>>
>>>   if ($c->model->{val} == 1) {
>>>             $box->attributes->{checked} = 'true';
>>>   }
>>>
>>>
>>> This gives me a source like this
>>>
>>>
>>> <label>Has type</label>
>>> <input name="hastype" type="checkbox" checked="true" />
>>>
>>>
>>> My query is whether this is correct HTML (4)?
>>>
>>> I had a look at the WC3 site and I think checked is an attribute but I
>>> thought I should be getting a source like
>>> <input name="hastype" type="checkbox" checked  />
>>>
>>> Am I using the right methods?
>>
>> Hi Dermot,
>>
>> Don't worry - this isn't a silly question at all!
>>
>> As Moritz said, checked="checked" is equivalent to the old `checked`,
>> and should work just fine in HTML4 - it's just that our output is
>> geared towards being valid xhtml.
>>
>> I think there's a more "correct" way of doing this, though.
>> You should always be setting the Checkbox's value(), so that the
>> browser knows what to send back when it's checked.
>> In this case, you could just do this
>>
>>    $box->default( $c->model->{val} );
>>
>> And the Checkbox is smart enough to set checked="checked" when
>> default() is the same as value().
>> And if they're different, the default() will just be ignored.
>
>
> Thank you both you your quick response and I can see what you mean by
> being xhtml compliant. I have tried to use Carl's suggested default
> method but I can't be using it correctly. I imagine I should see a
> source like
>
> <input type="checkbox" name="hastype" checked="true"/> or <input
> type="checkbox" name="hastype" checked="false"/>
>
> Here's my complete subroutine, perhaps that might explain why that
> method doesn't appear to work.
>
> use base qw(Catalyst::Controller::HTML::FormFu);
> ...
>
> sub updateCheckboxes : Private {
>  my ($c,$data) = @_;             # Data contains the model.
>  my $form = $c->stash->{form};
>  my $checkboxes = $form->get_all_elements({type => 'Checkbox'});
>  foreach my $box (@{$checkboxes}) {
>          my $name = $box->name;
>          my $val = $data->sub_id->$name;
>          $c->log->debug("Box=$box->{name} $data->sub_id->$box->name
> VAL=$val");
> #         if ($val && $val == 1) {
>          $box->default($val);
> #         }
>  }
> }

No, if value() eq default(), you'll get:
<input type="checkbox" name="hastype" checked="checked"/>
otherwise, you'll get:
<input type="checkbox" name="hastype"/>

Is that what was happening?

Carl



More information about the HTML-FormFu mailing list