I have multiple forms, where I have mandatory fields and optional fields.
To submit such a form I require the validation on the required-attribute to be executed, which works fine.
To cancel such a form I use the attribute immediate="true" on the p:commandbutton, which makes its action happen during the Apply Request Values-Phase as addressed here: How to skip validation when a specific button is clicked?
However, for large forms I want to provide the user with a Save-Button, so he can proceed later.
For just saving the current state I also want to ignore the validation of the required-attribute. However, using immediate="true" is not working, because then my save method simple saves nothing, because the JSF lifecycle never hits the “UpdateModelValues”-Phase. (Acording to http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html )
So, how to bypass the required-check but not skip half the lifecycle?
Each Button creates an entry inside the Param-List as long as it’s member of the form.
So I simple applied a check for the presence of that entry to the “required” parameter:
When I click “Submit” the
param['form:save']isNULL, which then turns the expression totrueso the validation is executed.When I click “Save” the
param['form:save']isNOT NULL(but empty!), which resolves tofalseso the validation is ignored. (Or let’s say JSF thinks it is not a required field due to the expression beeing evaluated tofalse)