[Catalyst] Changing format of date field

neil.lunn neil at mylunn.id.au
Tue Jan 7 09:55:36 GMT 2014

On 7/01/2014 8:41 PM, Adam Witney wrote:
> On 6. 1. 2014 21:41, Bill Moseley wrote:
>> On Mon, Jan 6, 2014 at 7:18 AM, Adam Witney <awitney at sgul.ac.uk
>> <mailto:awitney at sgul.ac.uk>> wrote:
>>     Hi,
>>     I have a date field in a DBIx::Class Result class using
>>     InflateColumn::DateTime. When I pass this through a Catalyst/TT
>>     application, the date is presented in YYYY-MM-DD format.
>>     I can modify this to DD/MM/YYYY in my TT template with
>>     object.dmy('/'), but I would prefer to change the default DateTime
>>     stringification, however I am not quite sure where or how to do 
>> this?
>>     Any ideas greatly appreciated.
>> Seem like formatting in the template is the right place -- may want to
>> have different formats in different places in your app.   Then you might
>> also think about how best to localize.
>> One idea is to localize a set of names for a set of formats:
>> [% dt_fmt = c.localize( '_DT_DATE_ONLY' );
>> foo.some_dt_object.strftime(  dt_fmt ) | html %]
>> I have also used a function that does the above, but also clones and
>> sets the time zone and locale based on the user's preferences:
>> [% user_time( foo.event_start, '_DT_TIMESTAMP_WITH_ZONE' ) | html %]
> Hi Bill,
> Thanks for your email. I agree that the template seems like a good 
> place for this, but to give a little extra detail.
> I have a form that is used for both object create and editing. When I 
> edit an object I have this in my controller:
> $c->stash(formdata => $object);
> and in the template:
> <input name="datefield" type="text" value="[% 
> formdata.datefield.dmy('/') %]" />
> But when creating a new object, if the form validation fails I pass 
> the form data back to the form like so:
> $c->stash( formdata => $c->request->params );
> But now the datefield is a text string and formdata.datefield.dmy('/') 
> prints blank.
Yep. Your form response param is going to be text and not a datetime 
object anymore. At any rate here is your case if I am reading correctly.

1. Model returns an inflated Datetime object. This is parsed from a 
string based on the Driver backend you have. Which is what inflate 
column does.
2. You don't want to have the default "stringify" displayed. So either 
change the stashed value or represent differently in view.
3. You *Are* going to get back a string in the raw params. So what you 
need to do is parse that format into a DateTime object again when 
submitting back to model or wherever else you want to use it as an object.

You can either do this in your controller directly or look at the 
various Form handling modules on CPAN where you can set up the 
Inflation/Deflation to your needs. All of these give you another object 
to deal with but raw input params are just going to be strings without 
further handling.
> I was thinking that if I could define my DateTime stringification to 
> my required format centrally then I could just use this in the template
> <input name="datefield" type="text" value="[% formdata.datefield %]" />
> and both scenarios would be happy.
> Is the only way to do this to put more code in the template?
> Thanks again for your help
> Adam
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: 
> http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/

This email is free from viruses and malware because avast! Antivirus protection is active.

More information about the Catalyst mailing list