2012-06-15 2 views
4

Я использую календарь стилей, но мне разрешено вводить неверную дату. введите дату как 32-06-2012 в поле ввода для поля даты и сохраните запись. Он сохраняет дату, сохраняя дату с 02-07-2012. Такое же поведение можно наблюдать и в витрине также.Календарь правилей позволяет недействительную дату

Ссылка: http://www.primefaces.org/showcase/ui/calendarBasic.jsf

Вот мой код

<p:calendar id="copyStartDateCalendar" pattern="dd/MM/yyyy" 

     mode="popup" showOn="button" size='8' > 

       <f:convertDateTime pattern="MM/yyyy" /> 

</p:calendar> 

Что должно быть сделано, как кажется, есть какая-то ошибка с самим компонентом.

Благодаря & уважением

Tarun Madaan

ответ

2

Я имел аналогичные проблемы с календарем primefaces.

Для одного он принимает даты с двумя цифрами, хотя установлен шаблон pattern="dd.MM.yyyy". Например, 20.06.12 будет отображаться в всплывающем окне календаря как 20.06.2012, вводящий в заблуждение пользователя, чтобы считать, что дата была правильно распознана. Но 12-й год действительно установлен.

В любом случае, я в конечном итоге установив <f:validator> внутри <p:calendar> как это:

<p:calendar value="#{abschnittDView.bogen.pruefungsDatum} 
    mode="popup" locale="de" pattern="dd.MM.yyyy" required="true" 
    requiredMessage="Please provide a date." 
    converterMessage="Date is invalid."> 

    <f:convertDateTime type="date" pattern="dd.MM.yyyy" 
     timeZone="Europe/Berlin" locale="de" /> 

    <f:validator validatorId="de.common.DateValidator" /> 

</p:calendar> 

Затем делать некоторые проверки на определенную дату:

@FacesValidator(DateValidator.VALIDATOR_ID) 
public class DateValidator implements Validator { 

    public static final String VALIDATOR_ID = "de.common.DateValidator"; 

    @Override 
    public void validate(FacesContext facesContext, UIComponent component, 
     Object value) throws ValidatorException { 

     Date inputDate = (Date) value; 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(inputDate); 
     if (cal.get(Calendar.YEAR) < 1000) { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please provide a date with 4 digits for the year", null)); 
     } 
    } 

Я знаю, это предотвращает даты ниже 1000, но в в моем случае абсолютно ясно, что дата не может быть ниже 2000.

Так что предложение: Используйте Validator, чтобы убедиться, что даты правильные. Я знаю, что это не идеальное решение, но возможно возможное обходное решение.

В противном случае попробуйте задать это на форуме поверхностей.

+0

Будет ли это работать с проблемами PrimeFaces, такими как преобразование недействительных дат, таких как '30/02/2012 ', в' 2/6/2014 ', потому что к тому времени, когда он дойдет до конца, он уже был преобразован в действительный Дата? – JonnyIrving

+0

Дополнительная информация о вышеуказанной точке: http://stackoverflow.com/questions/13763717/primefaces-calendar-accepts-invalid-dates-as-input – JonnyIrving

+0

Его проблема в том, что 2 цифры «дня»/«месяца» перекатываются и сопоставляет его с соответствующим месяцем в будущем/прошлом - это связано с тем, что SimpleDateformat имеет снисходительность true, при этом конвертер должен решить эту проблему. :) – VeenarM

2

Попробуйте использовать readonly="true" в таком случае вам не нужно использовать валидаторы на стороне сервера. Этот параметр позволяет конечному пользователю только подобрать дату с панели календаря.

0

Ваш шаблон и f: convertDateTime имеют разные шаблоны?

Вероятно, вы не можете определить, что хотите в конвертере, как ввод данных в виде dd/mm/yyyy - тогда ваш конвертер пытается преобразовать его в MM/yyyy.

Проблема, которую вы описываете, заключается в том, что сниженность установлена ​​в true в простейшем форматировании даты в боковых примитивах (это действие по умолчанию). Чтобы заставить вас использовать ваш convertDatetime, вы должны исправить это, но ваши шаблоны могут не совпадать.

Однако, если вы используете проверку PF < 4, вы получите проблемы с java-скриптом, так как есть ошибка в конвертерах p: calendar, возвращающих нулевые объекты после проверки - вы можете сделать некоторые исправления вручную для этого внутри PF-кода после его восстановления.

Смежные вопросы