public abstract class ValidateMultipleFields extends ValidatorFamily implements MultiFieldValidator
MultiFieldValidator.validateValues(FacesContext, List, List)
method to perform the actual validation.
This validator must be placed inside the same UIForm
as the UIInput
components in question.
The UIInput
components must be referenced by a space separated collection of their client IDs in the
components
attribute. This validator can be placed anywhere in the form, but keep in mind that the
components will be converted and validated in the order as they appear in the form. So if this validator is been
placed before all of the components, then it will be executed before any of the component's own converters and
validators. If this validator fails, then the component's own converters and validators will not be fired. If this
validator is been placed after all of the components, then it will be executed after any of the component's own
converters and validators. If any of them fails, then this validator will not be exeucted. It is not recommended to
put this validator somewhere in between the referenced components as the resulting behaviour may be confusing, for
example because only the values of preceding components are converted and the values of following components are not
converted. Put this validator either before or after all of the components, depending on how you would like to
prioritize the validation.
<o:validateMultipleFields id="myId" components="foo bar baz" /> <h:message for="myId" /> <h:inputText id="foo" /> <h:inputText id="bar" /> <h:inputText id="baz" />
When a target component is disabled="true"
, readonly="true"
or rendered="false"
,
then the values
argument of MultiFieldValidator.validateValues(FacesContext, List, List)
, will instead contain the
initial model value. This is quite useful when you need to validate against an existing model.
By default, in an invalidating case, all of the referenced components will be marked invalid and a faces message will
be added on the client ID of this validator component. The default message can be changed by the message
attribute. Any "{0}" placeholder in the message will be substituted with a comma separated string of labels of the
referenced input components.
<o:validateMultipleFields components="foo bar baz" message="{0} are wrong!" />
You can also change the default message in the message bundle file as identified by
<application><message-bundle>
in faces-config.xml
. The message key is just
the component type as identified by COMPONENT_TYPE
constant of the validator component. For example,
ValidateAll
has a ValidateAll.COMPONENT_TYPE
value of
org.omnifaces.component.validator.ValidateAll
. Use exactly this value as message bundle key:
org.omnifaces.component.validator.ValidateAll = {0} are wrong!
You can use invalidateAll="false"
to mark only those components which are actually invalid as invalid.
In case of for example "input all" or "input all or none" validation, that would be only the fields which are left
empty.
<o:validateMultipleFields components="foo bar baz" message="{0} are wrong!" invalidateAll="false" />
The faces message can also be shown for all of the referenced components using showMessageFor="@all"
.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@all" /> <h:inputText id="foo" /> <h:message for="foo" /> <h:inputText id="bar" /> <h:message for="bar" /> <h:inputText id="baz" /> <h:message for="baz" />
The faces message can also be shown for only the invalidated components using showMessageFor="@invalid"
.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@invalid" />
The faces message can also be shown as global message using showMessageFor="@global"
.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="@global" />
The faces message can also be shown for specific components referenced by a space separated collection of their
client IDs in showMessageFor
attribute.
<o:validateMultipleFields components="foo bar baz" message="This is wrong!" showMessageFor="foo baz" />
The showMessageFor
attribute defaults to @this
.
The validator can be disabled by the disabled
attribute. It accepts a request based EL expression.
<o:validateMultipleFields components="foo bar baz" disabled="#{param.validationDisabled}" />
There is a read-only validationFailed
attribute which can be used to determine if the validation by
this component has failed.
<o:validateMultipleFields id="myId" binding="#{myId}" components="foo bar baz" /> <h:panelGroup rendered="#{myId.validationFailed}"> Validation has failed! <h:message for="myId" /> </h:panelGroup>
TODO: support for immediate="true".
COMPONENT_FAMILY
ATTRS_WITH_DECLARED_DEFAULT_VALUES, BEANINFO_KEY, bindings, COMPOSITE_COMPONENT_TYPE_KEY, COMPOSITE_FACET_NAME, CURRENT_COMPONENT, CURRENT_COMPOSITE_COMPONENT, FACETS_KEY, HONOR_CURRENT_COMPONENT_ATTRIBUTES_PARAM_NAME, VIEW_LOCATION_KEY
Modifier | Constructor and Description |
---|---|
protected |
ValidateMultipleFields()
The default constructor sets the default message and sets the renderer type to
null . |
Modifier and Type | Method and Description |
---|---|
protected List<UIInput> |
collectComponents()
Collect the input components.
|
protected List<Object> |
collectValues(List<UIInput> inputs)
Collect the values of the given input components.
|
String |
getComponents()
Returns the client identifiers of components which are to be validated.
|
String |
getMessage()
Returns the validation message to be shown.
|
String |
getShowMessageFor()
Returns the client identifiers to show the validation message for.
|
boolean |
isDisabled()
Returns whether the validation should be disabled or not.
|
boolean |
isInvalidateAll()
Returns whether to invalidate all fields or only those which are actually invalid as per
shouldInvalidateInput(FacesContext, UIInput, Object) |
boolean |
isValidationFailed()
Returns whether the validation has failed or not.
|
void |
setComponents(String components)
Sets the client identifiers of components which are to be validated.
|
void |
setDisabled(boolean disabled)
Sets whether the validation should be disabled or not.
|
void |
setInvalidateAll(boolean invalidateAll)
Sets whether to invalidate all fields or only those which are actually invalid as per
shouldInvalidateInput(FacesContext, UIInput, Object) |
void |
setMessage(String message)
Sets the validation message to be shown.
|
void |
setShowMessageFor(String showMessageFor)
Sets the client identifiers to show the validation message for.
|
protected boolean |
shouldInvalidateInput(FacesContext context,
UIInput input,
Object value)
Returns whether in in an invalidating case the given input component should be marked invalid.
|
protected void |
showMessage(FacesContext context,
List<UIInput> inputs)
Show the message at the desired place(s) depending on the value of the
showMessageFor attribute. |
protected void |
validateComponents(FacesContext context)
If the validation is not disabled, collect the components, if it is not empty, then collect their values and
delegate to
MultiFieldValidator.validateValues(FacesContext, List, List) . |
protected void |
validateHierarchy()
Validate our component hierarchy.
|
encodeChildren, getFamily, getRendersChildren, processDecodes, processUpdates, processValidators
addClientBehavior, addFacesListener, broadcast, clearInitialState, decode, encodeBegin, encodeEnd, findComponent, getAttributes, getChildCount, getChildren, getClientBehaviors, getClientId, getDefaultEventName, getEventNames, getFacesContext, getFacesListeners, getFacet, getFacetCount, getFacets, getFacetsAndChildren, getId, getListenersForEventClass, getParent, getPassThroughAttributes, getRenderer, getRendererType, getValueBinding, invokeOnComponent, isRendered, isTransient, markInitialState, processRestoreState, processSaveState, queueEvent, removeFacesListener, restoreAttachedState, restoreState, saveAttachedState, saveState, setId, setParent, setRendered, setRendererType, setTransient, setValueBinding, subscribeToEvent, unsubscribeFromEvent
encodeAll, getClientId, getCompositeComponentParent, getContainerClientId, getCurrentComponent, getCurrentCompositeComponent, getNamingContainer, getPassThroughAttributes, getResourceBundleMap, getStateHelper, getStateHelper, getTransientStateHelper, getTransientStateHelper, getValueExpression, initialStateMarked, isCompositeComponent, isInView, isVisitable, popComponentFromEL, processEvent, pushComponentToEL, restoreTransientState, saveTransientState, setInView, setValueExpression, visitTree
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
validateValues
protected ValidateMultipleFields()
null
.protected void validateHierarchy()
validateHierarchy
in class ValidatorFamily
IllegalStateException
- When there is no parent of type UIForm
, or when there are any children.protected void validateComponents(FacesContext context)
MultiFieldValidator.validateValues(FacesContext, List, List)
. If it returns false
, then mark all
inputs and the faces context invalid and finally delegate to showMessage(FacesContext, List)
to show
the message.validateComponents
in class ValidatorFamily
context
- The faces context to work with.protected List<UIInput> collectComponents()
UIInput
, are rendered, not disabled nor
readonly will be returned. If at least one of them has already been validated and is been marked invalid, then an
empty collection will be returned.IllegalArgumentException
- When the components
attribute is missing, or when it references an
non-existing component, or when it references a non-input component.protected List<Object> collectValues(List<UIInput> inputs)
inputs
- The input components to collect values from.protected boolean shouldInvalidateInput(FacesContext context, UIInput input, Object value)
true
, meaning that all input components should be
invalidated in an invalidating case. The overriding implementation may choose to return false
for
example when the value is empty, such as ValidateAllOrNone
.context
- The faces context to work with.input
- The input component which may need to be invalidated.value
- The value of the input component.protected void showMessage(FacesContext context, List<UIInput> inputs)
showMessageFor
attribute.
@this
: message will be added to the <h:message>
for this component.
@all
: message will be added to all components as specified in components
attribute.
UIInput
component.
context
- The faces context to work with.inputs
- The validated input components.public String getComponents()
public void setComponents(String components)
components
- The client identifiers of components which are to be validated.public boolean isInvalidateAll()
shouldInvalidateInput(FacesContext, UIInput, Object)
public void setInvalidateAll(boolean invalidateAll)
shouldInvalidateInput(FacesContext, UIInput, Object)
invalidateAll
- Whether to invalidate all fields or only those which are actually invalid.public String getMessage()
public void setMessage(String message)
message
- The validation message to be shown.public String getShowMessageFor()
public void setShowMessageFor(String showMessageFor)
showMessageFor
- The client identifiers to show the validation message for.public boolean isDisabled()
public void setDisabled(boolean disabled)
disabled
- Whether the validation should be disabled or not.public boolean isValidationFailed()
Copyright © 2012–2021 OmniFaces. All rights reserved.