gtiwari333
gtiwari333

Reputation: 25174

Grails intercept form submit to modify params

Why do I need this:

I am working in a project which allows user to choose date in Nepali Bikram Sambat Date format (which is incompatible with Java and SQL's "DATE"). I did it by modifying org.codehaus.groovy.grails.plugins.web.taglib.FormTagLib class's datePicker tagLibrary. And modifying the scaffolding template list.gsp.

enter image description here

My problem :

When user chooses Nepali date from browser and submits the form, I want to read the [day, month, year] and convert it into Java Date object and save into database. (The date will be converted back to Nepali Bikram Sambat when it will be displayed into view).

I tried to print the params in the controller but all the params are already mapped/wrapped into corresponding objects - along with my Nepali Date. So I get sysout of Java's Date from code below :

println params.date

I am wondering how can I intercept the form submit request and modify the date params into English date. I see one solution - using JavaScript ( and rewrite my conversion code into JavaScript) before form submit to convert the params. And just wanted to confirm is there a easy way - like interceptor/filter etc.

Upvotes: 3

Views: 771

Answers (2)

Tiago Farias
Tiago Farias

Reputation: 3407

Well, assuming you are using input fields with the standard grails datepicker, you should have in your params map the fields being passed, just with a different name. Write a "println params" in your action receiving the request and look for the names of the fields of the datepicker. It was supposed to bring you something like (name of the datepicker field, say * + _year, for year, * + _month for month and so on).

Upvotes: 1

Tiago Farias
Tiago Farias

Reputation: 3407

You can create a CustomEditorRegistrar that changes the format from your date before it's wrapped into objects. Like this:

public class CustomDateEditorRegister implements PropertyEditorRegistrar {

    public void registerCustomEditors(PropertyEditorRegistry registry) {

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


}

And your Date editor could be something like:

class CustomSimpleDateEditor extends CustomDateEditor {

    public CustomSimpleDateEditor(SimpleDateFormat formatter, boolean allowEmpty) {
        super(formatter, allowEmpty);
    }

    public String getAsText() {
        Date date = (Date)getValue();
        try {
            String dateText = new SimpleDateFormat("dd/MM/yyyy").parse(date);
            return dateText;
        } 
        catch(Exception e) {
            e.printStackTrace();
            return "";
        }
    }

}

Your params.date will be converted before it's passed to objects and saved to the db. Anyway, here's a good link explaining it.

Hope it helps!

Upvotes: 1

Related Questions