My form had more fields than I wanted to save (lists of multiple models). And I only wanted to validate and save one data set (list of models) at a time.
To solve this I added one submit button per list of models and a
name
tag, with the id of my model list, to each submit button:
<input type="submit" name="@modellist.id" value="Save Model @modellist.id">
In my controller I now wanted to remove all the fields that were irrelevant before validation (So I wouldn't get any errors on those fields). From all the submitted models I wanted to fetch all models that matched my submit button's modelid:
(Note: To accomodate the lists of models, I have created a class which contains a map of all models submitted by the form, so thats why I'm working with maps. If you have a simpler setup this idea might be more easily done)
Form<ModelMap> modelMapForm = form(ModelMap.class);
// Remove unwanted models depending on which submit button has been pressed.
DynamicForm requestData = form().bindFromRequest(); // Doesn't try to match values to a "model"
Form<ModelMap> filledModelMapForm = ModelMapForm.bindFromRequest();
ModelMap allModelMap = filledModelMapForm.get();
ModelMap wantedModelMap = new ModelMap();
for (int modelid : modelids) {
// Check if modelid is in POST data, if yes than that button was pressed and we want that data.
if (requestData.get("" modelid) != null) {
for (Map.Entry<String, Model> entry : allModelMap.models.entrySet()) {
if (entry.getKey().endsWith("" modelid)) {
wantedModelMap.models.put(entry.getKey(), entry.getValue());
}
}
}
}
// Place wanted values in filledModelMapForm for validation and saving
filledModelMapForm = filledModelMapForm.fill(wantedModelMap);
// Place all values in allModelMapForm so that they are shown in case of errors
Form<ModelMap> allModelMapForm = ModelMapForm.bindFromRequest();
if (filledAnswerMapForm.hasErrors()) {
allModelMapForm.reject("Error, please correct it.");
return badRequest(view.render(<other values>, allModelMapForm));
}
else {
ModelMap saveModelMap = filledModelMapForm.get();
// Process form...
}
Maybe this solves your problem or helps you solve it. :) If you find a more elegant way, please don't hesitate to tell me below.
Source:
https://groups.google.com/forum/?fromgroups=#!topic/play-framework/TRzjAwVvVEM