2012-12-07 16 views
8

के रूप में स्वीकार करता है मेरी समस्या PrimesFaces 3.4.1 कैलेंडर के साथ है। पॉपअप दिनांक पिकर का उपयोग करते समय या तो बटन या इनपुट फ़ील्ड फोकस पर सक्रिय किया जाता है, आप केवल वैध तिथियां चुन सकते हैं जो ठीक काम करते हैं, खुश दिन!प्राइमफ़ेस कैलेंडर अमान्य तिथियों को इनपुट

समस्याएं तब आती हैं जब आप मैन्युअल रूप से इनपुट फ़ील्ड में कोई तारीख जोड़ते हैं, यदि आप अमान्य तिथि जोड़ते हैं तो प्राइमफ़ेस कैलेंडर घटक इसे वैध दिनांक में परिवर्तित करने और फिर इसे भेजने पर इसका सबसे अच्छा अनुमान लेता है, जिसका अर्थ है कि बैक-एंड सत्यापन कोई जाना नहीं है नीचे कुछ रोचक अनुवाद:

  • 30/02/2012 हो जाता है 2/6/2014
  • 322/05/2012 5/10/2038
  • 01/14/2012 4/1/2012 हो जाता हो जाता है

इस पागलपन को फिर से बनाने के लिए PrimeFaces Calendar Showcase पर एक नज़र डालें।

मैंने readOnlyInput='true' विशेषता का उपयोग करके समाधान देखा है, लेकिन ऐसा लगता है कि फ़ील्ड में दर्ज किए गए अक्षरों को संख्या या स्लेश नहीं किया जाता है।

<p:calendar id="fldDateOfBirth" 
      value="#{pc_CreateUser.user.dateOfBirth}" 
      binding="#{pc_CreateUser.dobComp}" 
      navigator="true" 
      pattern="dd/MM/yyyy" 
      maxlength="10" 
      yearRange="-100" 
      validator="#{pc_CreateUser.validateDOB}" 
      title="#{msg.user_date_format_default_tip}" 
      converterMessage="#{msg.user_error_dob_invalid}" 
      readOnlyInput="true" 
      showOn="button" /> 

समाधान बुद्धिमान मैं खुला हूँ किसी भी सुझाव के लिए:

  1. है इस PrimeFaces में एक आम मुद्दों नीचे कैलेंडर का एक उदाहरण मैं लागू कर दिया है है? क्या कोई चाल है जिसका उपयोग मैं पर कर सकता हूं?
  2. मैं जावास्क्रिप्ट तारीख को मान्य करने से पहले यह ब्लॉक सभी उपयोगकर्ता इनपुट पूरी तरह से करने के लिए भेजा या है का उपयोग कर सकते हैं?
  3. और कुछ भी मैंने नहीं सोचा है!

धन्यवाद अग्रिम में, यह मेरे सप्ताह के लिए समस्याएं उत्पन्न कर दिया गया है!

उत्तर

13

<p:calendar> कवर SimpleDateFormat जो बारी में डिफ़ॉल्ट lenient पार्स द्वारा उपयोग करता तहत उपयोग करता है, अगले तारीख मीट्रिक स्तर में खत्म रोल करने overflowed मूल्यों के कारण। जैसे 32 जनवरी 1 फरवरी, आदि हो जाएगा

सादे जावा शब्दों में, इसे से false पास कर दिया जा सकता है। अन्य लोगों के बीच यह प्रश्न भी देखें: validating a date using dateformat

JSF संदर्भ में, आप मूल रूप से जो एक गैर उदार DateFormat का उपयोग करता है एक कस्टम कनवर्टर प्रदान करने के लिए की जरूरत है। सौभाग्य से, मानक जेएसएफ पहले से ही <f:convertDateTime> के स्वाद में बॉक्स को बाहर प्रदान करता है, ताकि आप इसका उपयोग सीधे कर सकें।

<p:calendar ...> 
    <f:convertDateTime pattern="dd/MM/yyyy" /> 
</p:calendar> 
+0

नीचे इस ऐड यह एक का इलाज काम किया! समाधान और आपकी व्याख्या के लिए धन्यवाद, बहुत सराहना की। – JonnyIrving

+0

आपका स्वागत है। – BalusC

+0

यदि इस कन्वर्टडेटाइम का उपयोग करके प्राइमफेस के पुराने संस्करण का उपयोग करने से रूपांतरण शून्य हो जाता है, और आपको जावास्क्रिप्ट त्रुटियां मिलेंगी। (getDate == शून्य)। यदि आप पीएफ 4 में अपग्रेड कर सकते हैं तो दुर्भाग्यवश मैं विकल्पों में नहीं देख सकता हूं :) – VeenarM

0

चेहरे-config.xml में ऊपर कक्षा में इस

<converter> 
    <converter-id>localDateConverter</converter-id> 
    <converter-class>com.utility.LocalDateConverter</converter-class> 
</converter> 

जोड़ने यानी LocaldateConverter कोड

/** 
* @param facesContext . 
* @param uiComponent . 
* @param input . 
* @return Object . 
*/ 
@Override 
public Object getAsObject(final FacesContext facesContext, final UIComponent uiComponent, final String input) { 
    if (StringUtils.isBlank(input)) { 
     return null; 
    } 
    final String componentPattern = (String) uiComponent.getAttributes().get("datePattern"); 
    final String patternToUse = componentPattern != null ? componentPattern : CommonConstants.OUTPUT_DATE_FORMAT; 
    try { 
     final DateFormat fmt = new SimpleDateFormat(patternToUse); 
     Date convertedDate = new java.sql.Date(fmt.parse(input).getTime()); 
     return convertedDate; 
    } catch (Exception e) { 
     throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Date Format", null)); 
    } 
} 

/** 
* @param facesContext . 
* @param uiComponent . 
* @param obj . 
* @return String . 
*/ 
@Override 
public String getAsString(final FacesContext facesContext, final UIComponent uiComponent, final Object obj) { 
    if (obj==null) { 
     return null; 
    } 
    final Date date = (Date) obj; 
    return date.toString(); 
} 
+0

यह कैसे सहायक है? आप उन्हें यह भी नहीं बताते कि आप क्या कर रहे हैं। आप जो भी कर रहे हैं वह मौजूदा पहले से ही मानक जेएसएफ डेटाटाइम कनवर्टर की प्रतिलिपि बना रहा है। – VeenarM

संबंधित मुद्दे