I have a form in which validation error message needs to be displayed below the input elements. The error needs to be highlighted by showing an error bubble around the error mes
I use bootstrap and also needed this... solved it by creating a Custom component wrapper.
<composite:interface>
<composite:attribute name="casoCustomFieldValue" required="true" />
<composite:attribute name="casoOpen" default="true" />
</composite:interface>
<composite:implementation>
<h:panelGroup styleClass="#{not empty facesContext.getMessageList(''.concat(cc.clientId).concat(':valortext')) ? 'form-group has-error' : 'form-group'}"
rendered="#{cc.attrs.casoCustomFieldValue.customField.fieldTypeId.fieldTypeId eq 'TEXT'}" >
<p:inputText id="valortext" value="#{cc.attrs.casoCustomFieldValue.valor}" styleClass="form-control input-sm"
required="#{cc.attrs.casoCustomFieldValue.customField.required}" requiredMessage="Se necesita un valor." disabled="#{not cc.attrs.casoOpen}"/>
<h:panelGroup rendered="#{not empty facesContext.getMessageList(''.concat(cc.clientId).concat(':valortext'))}" styleClass="help-block">
<h:message for="valortext" />
</h:panelGroup>
</h:panelGroup>
</composite:implementation>
Iterator<FacesMessage> pkit = fctxt.getMessages(); // check all existing messages from the FacesContext
while(pkit.hasNext()){
System.out.println(pkit.next().getDetail()); // get message text
System.out.println(pkit.next().getSummary());
}
If the message you are looking for is found in the while loop, you can take appropriate action
The error needs to be highlighted by showing an error bubble around the error message ...
Just use <h:message>
with a styleclass wherein you define the desired style.
<h:inputText id="foo" />
<h:message for="foo" styleClass="error" />
with
.error {
border: 1px solid red;
background: pink;
}
...and the input text.
Just check if UIInput#isValid() is true
. Since JSF 2.0 the current component is available by implicit EL variable #{component}
.
<h:inputText styleClass="#{!component.valid ? 'error' : 'none'}" />
As to the actual question about checking if there's a message for a certain client ID, then you may find this answer interesting. But I don't think that this is applicable in your particular case.
Update: as per the comments, you seem to want to style the containing component instead of the invididual components. In that case, do as follows:
<h:panelGroup styleClass="#{!foo.valid ? 'error' : 'none'}">
<h:inputText id="foo" binding="#{foo}" />
<h:message for="foo" />
</h:panelGroup>