[html-formfu] BUG in DateTime (was: Problem inflating to DateTime)

Carl Franks fireartist at gmail.com
Tue Jun 8 19:11:31 GMT 2010


You're right, it's a bug - the Date element needs to run any deflators
itself - the same goes for the ComboBox element.

I've committed a fix to svn, so it'll be in the next cpan release.

Carl


On 8 June 2010 13:19, Matija Grabnar <matija at serverflow.com> wrote:
> I really, really hate this "talking to myself" feeling I'm getting on this
> mailing list.
> I can confirm that there is some bug in handling deflate in
> Element::DateTime.
>
> Here is how:
> ====== minimal example
> file: futest.yaml
>
> method: post
> auto_fieldset: 1
> auto_label: '%n'
>
>
> elements:
>   - type: DateTime
> #   - type: Text
>     name: valid_until
> #     auto_inflate: 1
>     deflators:
>      - type: Callback
>        callback: "A::deflate"
>     inflators:
>      - type: Callback
>        callback: "A::inflate"
>
> file: futest.pl
> #!/usr/bin/perl -w
> use strict;
> use HTML::FormFu;
> use CGI;
>
> my $cgi = CGI->new;
> my $form = HTML::FormFu->new;
>
> $form->load_config_file('futest.yaml');
>
> $form->process( $cgi );
>
>  if ( $form->submitted_and_valid ) {
>    # do something with $form->params
>  } else {
>    # display the form
>     $form->default_values({valid_until => time});
>  print $form;
> }
>
> package A;
> use DateTime;
> sub deflate {
>  warn "Deflate with ".join(',', at _)."\n";
>  my $d = DateTime->from_epoch(epoch=>$_[0]);
>  return $d;
> }
>
> sub inflate {
>  warn "Inflate with ".join(',', at _)."\n";
> }
> 1;
>
> If I leave type: Text uncommented (while keeping the DateTime commented) in
> the yaml file, everything
> works, the deflate routine gets called, proper values display in the form.
> Comment Text, uncomment DateTime, NO OTHER changes to anything else, I get
> error saying format
> is wrong.
>
> So can somebody please look into this problem? Or has FormFu been abandoned
> by it's authors?
>
> On 06/07/2010 11:10 AM, Matija Grabnar wrote:
>>
>> More information:
>> I did a minimal test (using HTML::FormFu, without catalyst, with only a
>> single DateTime field in the form),
>> and I still get the error. I can confirm that in this simplified scenario,
>> the deflation function never gets called,
>> and the error is:
>>
>> Invalid date format: 1275900620 at
>> /usr/share/perl5/HTML/FormFu/Element/Date.pm line 164
>>
>> Is this a bug in Element::DateTime, or do I fundamentaly misunderstand how
>> inflation/deflation works?
>>
>> On 06/05/2010 03:04 PM, Matija Grabnar wrote:
>>>
>>> I have a form which I get from a database row. One of the columns in the
>>> database is date/time in epoch format, and I want to transform it so that
>>> FormFu will display the DateTime element.
>>>
>>> I was able to inflate the values I got from the  browser, because I could
>>> see what FormFu was passing to
>>> my deflation routine, but I'm not able to get the deflation routine
>>> ready. I get the epoch string, and I tried returning either a DateTime
>>> object, or a date-and-time string.
>>>
>>> I can see that the deflation gets called correctly. I can see that the
>>> DateTime object is correctly created
>>> and returned to FormFu without error, but from Catalyst I get back
>>>
>>> Caught exception in MyApp::Controller::Admin->coupon_edit "Invalid date
>>> format: 1318658400 at /usr/share/perl5/Catalyst/Action.pm line 65"
>>>
>>> Note that this error message is very opaque: it reports the error from a
>>> location in Catalyst itself, with no indication where the error actually
>>> happened. Also note that it complains about my ORIGINAL value, NOT the
>>> just-deflated value that my deflation routine returned.
>>>
>>> Here is the part of my form.yaml
>>>   - type: DateTime
>>>     name: valid_until
>>>     auto_inflate: 1
>>>     deflators:
>>>      - type: Callback
>>>        callback: "MyApp::Forms::epoch_to_datetime"
>>>     inflators:
>>>      - type: Callback
>>>        callback: "MyApp::Forms::datetime_to_epoch"
>>>
>>> I tried both WITH and WITHOUT auto_inflate.
>>>
>>> This is my deflator routine:
>>>
>>> sub epoch_to_datetime {
>>>  foreach (@_) {
>>>    warn "Parameter to deflate to datetime: [$_]\n";
>>>  }
>>>  my $value = shift;
>>>  return undef unless defined($value);
>>>  $value = DateTime->from_epoch(epoch=>$value);
>>>  warn "New value is $value\n";
>>>  return $value;
>>> }
>>>
>>> Any ideas on what I could try? Is the deflated value thrown away in
>>> FormFu DateTime? Or is just the error message referencing the pre-deflated
>>> value to be more programmer friendly?
>>>
>>> If so, what can I return so that the FormFu DateTime element will accept
>>> and display it?
>>>
>>>
>>> _______________________________________________
>>> HTML-FormFu mailing list
>>> HTML-FormFu at lists.scsys.co.uk
>>> http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
>>
>>
>> _______________________________________________
>> HTML-FormFu mailing list
>> HTML-FormFu at lists.scsys.co.uk
>> http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
>
>
> _______________________________________________
> HTML-FormFu mailing list
> HTML-FormFu at lists.scsys.co.uk
> http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
>



More information about the HTML-FormFu mailing list