проверка диапазона дат калитки (от-до) - PullRequest
2 голосов
/ 04 октября 2011

У меня есть форма, где мне нужно проверить DateFrom и DateTo.

Я сделал так:

     // start date 
    RequiredTextField<Date> startdateField =
       new RequiredTextField<Date>("startDate",  Date.class);
    startdateField.add(new DatePicker(){
        @Override
        protected CharSequence getIconUrl() {
            return RequestCycle.get().getUrlRenderer().renderContextPathRelativeUrl("/image/date-picker.png");
        }
    });

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.DATE,-1);
    startdateField.add(DateValidator.minimum(cal.getTime()));


    // end date 
    RequiredTextField<Date> enddateField = new RequiredTextField<Date>("endDate",  Date.class);
    enddateField.add(new DatePicker(){
        @Override
        protected CharSequence getIconUrl() {
            return RequestCycle.get().getUrlRenderer().renderContextPathRelativeUrl("/image/date-picker.png");
        }
    });


   // enddateField.add(DateValidator.minimum(startdateField.getModel().getObject()));
   // this does not work . Form submitted ?

Теперь Как я могу поставить валидатор, утверждающий, что endDate должен быть равен или больше выбранной даты начала в калитке?

Есть идеи? Помощь оценена.

1 Ответ

3 голосов
/ 04 октября 2011

DateValidator.minimum(startdateField.getModel().getObject()) не работает, потому что во время создания страницы Модель startdateField не содержит значения, которое отправляет пользователь, и которое должно учитываться как минимальное во время проверки.

Обычно, если ваша проверка включает более одного компонента, целесообразно использовать IFormValidator. Его метод validate() будет вызываться после успешного вызова каждого зависимого индивидуума FormComponent.validate(), поэтому вы гарантированно получите действительные индивидуальные входные данные для каждого зависимого компонента, прежде чем приступить к проверке их в целом.

Одним из важных аспектов проверки является предотвращение попадания недействительного пользовательского ввода в Модели Компонента. Поэтому во время проверки Модели еще не будут обновлены, и вместо FormComponent.getModelObject() вам придется использовать FormComponent.getInput() или FormComponent.getConvertedInput() в методе validate().

IFormValidator validator = new AbstractFormValidator() {
    public FormComponent<?>[] getDependentFormComponents() {
        return new FormComponent[] { startDateField, endDateField };
    }

    public void validate(Form<?> form) {
        Date startDate = (Date) startDateField.getConvertedInput();
        Date endDate = (Date) endDateField.getConvertedInput();

        if (endDate.before(startDate)){
            error("Date range is invalid.");
        }
    }
};
form.add(validator);

Примите во внимание, что если какой-либо из компонентов FormComnel в getDependentFormComponents() недействителен (и это означает, что он невидим, необходим и не имеет ввода, не проходит индивидуальную проверку и т. Д.), FormValidator не выполнится.

Вы также можете найти эту информацию полезной: Проверка связанных полей

...