I want to present validation messages and messages from backing bean in <p:dialog> component. In my JSF page I have following dialog defined:
<p:dialog widgetVar="messageDialog" id="msgDialog" modal="true" appendToBody="true">
<h:form id="messageForm">
<p:messages id="messagesInDialog" />
<p:commandButton value="OK" onclick="messageDialog.hide()" />
</h:form>
</p:dialog>
I execute the following code after appending some message in backing bean:
RequestContext.getCurrentInstance().execute("messageDialog.show()");
and it works fine.
However, I also want to display bean validation messages in this dialog. Messages are appended to <p:message> component afer validation, but I have no idea how to display this dialog after validation failure.
How can I achieve this?
You can use the
visibleattribute of<p:dialog>to specify whether the dialog should show up by default or not. You can check byFacesContext#isValidationFailed()if there’s a validation failure or not.So, in a nutshell:
(note that I simplified the unnecessary
h:formandp:commandButtonby ap:button)Which is then to be updated by:
Or by just placing it inside a
<p:outputPanel autoUpdate="true">so that it auto-updates itself on every ajax request without the need to specify it in everyupdateattribute:See also:
Unrelated to the concrete problem, to cover non-validation messages, such as those global messages which you add in the action method, rather check instead if
FacesContext#getMessageList()is not empty.This will then show the dialog when there is any message. This way that
RequestContext#execute()call is unnecessary.