views:

505

answers:

2

y is it so hard to extract the date from the view via the params in a grails controller?

i don't want to extract the date by hand like this:

instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class

i just want to use instance.properties = params you know :)

in the model the type is java.util.Date and in the params is all the information (dateX_month, dateX_day, ...)

i searched on the net and found nothing on this :( i hoped that grails 1.3.0 could help but still the same thing.

i can't and will not belief that extracting the date by hand is nessesary!

+3  A: 

i searched on the net and found nothing on this

Here are a few links

i can't and will not belief that extracting the date by hand is nessesary!

Your stubbornness is rewarded, it has been possible to bind a date directly since long before Grails 1.3. The steps are:

(1) Create a class that registers an editor for your date format

import org.springframework.beans.PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistry
import org.springframework.beans.propertyeditors.CustomDateEditor
import java.text.SimpleDateFormat

public class CustomDateEditorRegistrar implements PropertyEditorRegistrar {

    public void registerCustomEditors(PropertyEditorRegistry registry) {

        String dateFormat = 'yyyy/MM/dd'
        registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true))
    }
}

(2) Make Grails aware of this date editor by registering the following bean in grails-app/conf/spring/resources.groovy

beans = {
    customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}

(3) Now when you send a date in a parameter named foo in the format yyyy/MM/dd it will automatically be bound to a property named foo using either:

myDomainObject.properties = params

or

new MyDomainClass(params)
Don
thanx for the quick answer, i tried this before (already had the customPropertyEditorRegistrar in my spring resources, and i saw the old stackoverflow question you mentioned above) but this does not work for me somehow.my class looks like this: class CustomDateEditorRegistrar implements PropertyEditorRegistrar { public void registerCustomEditors(PropertyEditorRegistry registry) { String dateFormat = 'dd.MM.yyyy' registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true)) }}and the debugger is picking it up properly.
nils petersohn
is there maybe a problem with my dateformat (dots)? or something?
nils petersohn
+1  A: 

Have you tried using any of the Grails date picker plugins?

Ive had good experiences with the calendar plugin.

(When using the calendar plugin) When you submit the request of the date selection you can automatically bind the query parameter to the domain object you want to populate with the request.

E.g.

new DomainObject(params)

You can also parse a "yyyy/MM/dd" date string like so...

new Date().parse("yyyy/MM/dd", "2010/03/18")
tinny
I think calling `new Date.parse()` explicitly is exactly what he wants to avoid. AFAIK, if you bind the parameters directly, you still need to register a custom date editor (as described in my reply). Otherwise, how could the databinder possibly know which field is the month and which is the year (for example). I agree that the calendar plugin is the best of the date-picker plugins available.
Don
Yep, definitely go with the parameter binding approach. new Date().parse() can be very useful elsewhere though.
tinny
my approach right now is very bad i think. i am first removing the date value from the params like this: (params.remove("datefield")) than i am doing something like this: instance.datefield = hlpr.exDate(params["datefield_value"] as String)i know that sounds really strange but thats somehow the only way that it works right now...
nils petersohn