the validator must be done on the second inputCalendar, since the data
is not loaded before. You shoud adapt the valildate method accordingly
2006/7/18, Ali Abdel-Aziz Ali <[EMAIL PROTECTED]>:
Hello All,
I have Custom Validator problem.
I have two input calenders and I want to make some validation on their
values
any validation.
so this the UI code:
<h:outputText value="From Date:" style="font-weight:bold"/>
<t:inputCalendar id="FromDate"
monthYearRowClass="yearMonthHeader"
weekRowClass="weekHeader"
currentDayCellClass="currentDayCell"
value="#{positionPopup.fromDate}" renderAsPopup="true"
popupTodayString="#{example_messages['popup_today_string']}"
popupWeekString="#{example_messages['popup_week_string']}"
renderPopupButtonAsImage="true" required="true"
styleClass="required">
<f:validator validatorId="
validators.datesOverlapValidator"/>
</t:inputCalendar>
<h:outputText value="Thru Date:" style="font-weight:bold" />
<t:inputCalendar id="ThruDate"
monthYearRowClass="yearMonthHeader"
weekRowClass="weekHeader"
currentDayCellClass="currentDayCell"
value="#{positionPopup.thruDate}" renderAsPopup="true"
popupTodayString="#{example_messages['popup_today_string']}"
popupWeekString="#{example_messages['popup_week_string']}"
renderPopupButtonAsImage="true"
required="false">
</t:inputCalendar>
and this is the validator code:
public void validate(FacesContext facesContext, UIComponent uiComponent,
Object value) throws ValidatorException
{
if (facesContext == null) throw new
NullPointerException("facesContext");
if (uiComponent == null) throw new
NullPointerException("uiComponent");
if (value == null)
{
return;
}
UIComponent foreignComp =
uiComponent.getParent().findComponent(_for); // _for = "ThruDate" //
equall to the second inputCalender ID
if(foreignComp==null)
throw new FacesException("Unable to find component '" + _for
+ "' (calling findComponent on component '" + uiComponent.getId() + "')");
if(false == foreignComp instanceof EditableValueHolder)
throw new FacesException("Component '" + foreignComp.getId()
+ "' does not implement EditableValueHolder");
EditableValueHolder foreignEditableValueHolder =
(EditableValueHolder) foreignComp;
if (foreignEditableValueHolder.isRequired() &&
foreignEditableValueHolder.getValue()== null )
{
return;
}
Object[] args =
{value.toString(),(foreignEditableValueHolder.getValue()==null)
?
foreignComp.getId():foreignEditableValueHolder.getValue().toString()};
_logger.info(" From Date = "+ args[0].toString() +" Thrue Date
= "+foreignEditableValueHolder.getValue());
boolean overlap = this.overlap ( new Range(new Date(1), new
Date(2)), new Range(new Date(1), new Date(2)));
if(!overlap)
{
//if(foreignEditableValueHolder.getValue()==null ||
!foreignEditableValueHolder.getValue().toString().equals(
value.toString()) )
FacesMessage message = new FacesMessage();
message.setDetail(Messages.getMessageString("RangeOverlapValidator")+" "+
args[0].toString() +" "+args[1].toString() + ".");
message.setSummary(Messages.getMessageString("RangeOverlapValidator")+" "+
args[0].toString() +" "+args[1].toString() + ".");
message.setSeverity (FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
but it always return the ThruDate = null however it can feel with it's
properties like isRequired or not.
Can Any buddy help?
--
Ali Abdel-Aziz
http://www.aliabdelaziz.com
http://aabdelaziz.blogspot.com