[Html-widget] formfu - What's the best way to add
dynamic defaults?
Daisuke Maki
daisuke at endeworks.jp
Thu Mar 29 09:53:04 GMT 2007
thanks for the pointers.
This is what I want to do:
- When the user hits this URL for the first time (i.e., no
submission, etc), I want to display todays date.
- When the user submits the form, I want to use whatever the user
provided, except for invalid dates -- in which case today's date is
displayed.
so I guess it's $element->default, then?
I supposed I could use Javascript too, but for now I'm trying to convert
an old application to HTML::FormFu, and am trying to figure out how
things fit together, so I'd rather not touch javascript.
I'll check out the deflators once I get some other stuff working.
--d
Carl Franks wrote:
> On 29/03/07, Daisuke Maki <daisuke at endeworks.jp> wrote:
>> Hi,
>>
>> I have a form that should have today's date in it unless otherwise
>> specified. I kind of hacked around this by saying:
>>
>> my $dt = DateTime->today(time_zone => 'local');
>> foreach my $field qw(year month day) {
>> my $element = $form->get_field(name => $field, type => 'text');
>> next unless $element;
>> $element->attributes->{value} ||= $dt->$field;
>> }
>
> I'm not entirely sure what you mean by "unless otherwise specified".
> Otherwise specified by what / where?
> The solution might differ according to whether you mean it's set
> somewhere else in the code/config, or whether it's set by the user in
> a submitted form.
>
> If you want to set a field's default value, which if redisplayed after
> errors will be overridden by whatever the user entered - then you
> should use:
> $element->default( $value );
>
> For dates, I'm tending to prefer the Dojo::DropdownDate element -
> which provides a JS date-picker GUI and fallsback to a single textbox
> if JS is switched off.
>
> I think using a deflator would be a bit of an abuse, as they're not
> reallly designed to process multiple field's values.
> Something like this might work - but you'll need to test it.
> The deflators are only run if the form wasn't submitted.
> You might need to make sure the deflator is associated with whichever
> of the year/month/day fields was added to the form first. In my
> example, I've assumed it's the 'year' field.
>
>
> ---
> elements:
> - type: text
> name: year
> deflators:
> - +MyApp::Deflator::DateNow
> - type: text
> name: month
> - type: text
> name: day
>
>
> package MyApp::Deflator::DateNow;
> use strict;
> use warnings;
> use base 'HTML::FormFu::Deflator';
>
> sub deflator {
> my ( $self, $value ) = @_;
>
> my $year = $self->parent;
> my $month = $self->form->get_field({ name => 'month', type => 'text' });
> my $day = $self->form->get_field({ name => 'day', type => 'text' });
>
> if ( !defined $value && !defined $month->default && !defined
> $day->default )
> {
> my $dt = DateTime->today( time_zone => 'local' );
>
> $month->default( $dt->month );
> $day->default( $dt->day );
>
> return $dt->year;
> }
>
> return $value;
> }
> 1;
>
> Ideas for a more general multi-field preprocessor mechanism welcome!
>
> Carl
>
> _______________________________________________
> Html-widget mailing list
> Html-widget at lists.rawmode.org
> http://lists.rawmode.org/cgi-bin/mailman/listinfo/html-widget
>
More information about the Html-widget
mailing list