2010-05-06 8 views
11

को बचाने के लिए वैधकर्ताओं को अस्थायी रूप से अक्षम कैसे करें मेरे पास बहुत सारे इनपुट और सत्यापनकर्ताओं के साथ एक जटिल जटिल रूप है। उपयोगकर्ता के लिए इसे पूरा करने में काफी लंबा समय लगता है (यहां तक ​​कि एक घंटे से भी अधिक), इसलिए वे ड्राफ्ट डेटा को सहेजने में सक्षम होना चाहते हैं, भले ही यह अनिवार्य फ़ील्ड जैसे नियमों का उल्लंघन न करे।जेएसएफ ड्राफ्ट

मेरा मानना ​​है यह समस्या कई वेब अनुप्रयोगों के लिए आम है, लेकिन यह किसी भी अच्छी तरह से मान्यता प्राप्त पैटर्न नहीं मिल सकता है कि इसे कैसे कार्यान्वित किया जाना चाहिए। क्या आप सलाह दे सकते हैं कि इसे कैसे प्राप्त किया जाए?

अभी के लिए मैं निम्नलिखित विकल्पों के देख सकते हैं:

  1. तत्काल के उपयोग = पर "ड्राफ़्ट सहेजें" बटन काम नहीं करता है सच है, के रूप में यूआई डेटा सेम पर संग्रहीत नहीं किया जाएगा, तो मैं इसे एक्सेस करने में सक्षम नहीं होगा। तकनीकी रूप से मैं यूआई घटक पेड़ में डेटा पा सकता हूं, लेकिन ट्रैवर्सिंग यह एक अच्छा विचार प्रतीत नहीं होता है।
  2. पृष्ठ से सभी फ़ील्ड सत्यापन को हटा दें और फ़ॉर्म के लिए परिभाषित एक्शन श्रोता में डेटा प्रोग्रामेटिकल को मान्य करें। फिर, एक अच्छा विचार नहीं, रूप वास्तव में जटिल है, वहां बहुत सारे क्षेत्र हैं इसलिए इस तरह कार्यान्वित सत्यापन बहुत गन्दा होगा।
  3. मेरे अपने प्रमाणकों, कि कुछ अनुरोध विशेषता है, जो मानक फार्म प्रस्तुत करने के लिए निर्धारित किया जाएगा (पूर्ण मान्यता के साथ की उम्मीद) के द्वारा नियंत्रित किया जाएगा और सेट नहीं हो प्रस्तुत "ड्राफ्ट के रूप में बचाने के लिए" (जब सत्यापन को छोड़ दिया जाना चाहिए होगा लागू)। फिर, एक अच्छा समाधान नहीं, मुझे अपने सभी रैपरों को उन सभी वैधताओं के लिए प्रदान करना होगा जिन्हें मैं उपयोग कर रहा हूं।

लेकिन जैसा कि आप देखते हैं कि कोई भी वास्तव में उचित नहीं है। क्या समस्या का कोई आसान समाधान नहीं है?

उत्तर

7

यह वास्तव में इतना आसान नहीं है। जेएसएफ जीवन चक्र में प्रमाणीकरण काफी तंग है।

मैं व्यक्तिगत रूप से विकल्प 1 के लिए जाऊंगा। सच, गंदे काम, लेकिन आप इसे केवल एक उपयोगिता वर्ग में छुपा सकते हैं। व्यूअरोट से प्रश्न में <h:form> को पकड़ें, अपने बच्चों को दोबारा दोहराएं, इस प्रकार परीक्षण करें कि component instanceof EditableValueHolder सही है, Map के प्रकार में मिली आईडी-वैल्यू जोड़ी को स्टोर करें और अंत में इसे जारी रखें।

चौथे विकल्प के रूप में, आप अजीब शक्तियों का उपयोग करके स्वतंत्र रूप से सभी डेटा को सहेज सकते हैं। jQuery इसमें सहायक है।

$.post('/savedraft', $('#formid').serialize()); 

इसे केवल क्लाइंट पक्ष में जावास्क्रिप्ट समर्थन की आवश्यकता है।


अद्यतन: JSF उपयोगिता पुस्तकालय OmniFaces सटीक उद्देश्य के लिए एक <o:ignoreValidationFailed> taghandler है। यह वास्तव में एक साधारण समाधान नहीं था क्योंकि इसे कस्टम <h:form> भी आवश्यक है। सत्यापन के दौरान कस्टम FacesContext उदाहरण प्रदान करके यह अपना काम करता है और मॉडल मान चरण चरणों को अद्यतन करता है जो validationFailed() और renderResponse() विधियों में एक एनओओपी करता है। इसलिए घटक अभी भी अमान्य हैं और संदेश अभी भी जुड़े हुए हैं, लेकिन यह अभी भी अद्यतन मॉडल मानों पर आगे बढ़ेगा और एप्लिकेशन चरणों का आह्वान करेगा।

+0

धन्यवाद बलस। मुझे विकल्प 1 के लिए आपका विचार पसंद है, संभावित रूप से मुझे इसके विपरीत करने में सक्षम होना चाहिए, जब चरण श्रोता में डेटा लोड किया जाता है और संपादन योग्य ValueHolders को पुन: प्रारंभ करें। आपके दूसरे सुझाव के संबंध में, मुझे jQuery में कोई भी unserialize() फ़ंक्शन नहीं मिल रहा है, आप ड्राफ्ट डेटा कैसे लोड करेंगे? – Swiety

+0

तदनुसार सर्वर पक्ष में प्रबंधित बीन गुणों को सेट करके। – BalusC

1

मुझे एक ही समस्या थी और मुझे सभी मान्यताओं को छोड़ने का विचार पसंद नहीं आया। बहुत सारे विचारों के बाद मैं केवल आवश्यक फ़ील्ड सत्यापन को छोड़ना चाहता था।इसके पीछे तर्क उपयोगकर्ता या तो सही ढंग से फ़ील्ड पूरा करता है या इसे पूरा नहीं करता है। यह मेरे लिए बहुत महत्वपूर्ण है क्योंकि सब कुछ डेटाबेस में समाप्त होता है और, ज़ाहिर है, मैं डेटाबेस क्षेत्र को ओवरफ़्लो नहीं करना चाहता हूं या उदाहरण के लिए INT डेटाबेस फ़ील्ड में String मान को सहेजना नहीं चाहता हूं।

मेरे अनुभव में, आवश्यक फ़ील्ड छोड़ना मसौदा बचाने के लिए पैंतरेबाज़ी के पर्याप्त मार्जिन की अनुमति देता है। यह प्राप्त करने के लिए मैंने requiredWarnValidator लिखना समाप्त कर दिया जो एक चेतावनी संदेश दिखाता है।

public void validate(FacesContext context, UIComponent component, Object value) 
    throws ValidatorException { 

    if (value == null) { 
    FacesMessage message = new FacesMessage(); 
    message.setSeverity(FacesMessage.SEVERITY_WARN); 
    message.setSummary("This field is required."); 
    context.addMessage(component.getClientId(), message); 
    context.validationFailed(); 
    } 
} 

इस सत्यापनकर्ता में मैं एक ValidatorException() फेंक नहीं है क्योंकि मैं सत्यापन चरण पास करना चाहते हैं, लेकिन मैं validationFailed() कहते हैं क्योंकि मुझे पता है कि अगर एक आवश्यक फ़ील्ड भरा नहीं है चाहते हैं।

मेरे पास मेरे फॉर्म को सहेजने के लिए उपयोग की जाने वाली इकाई में एक ध्वज (completed) है। फॉर्म को सहेजते समय, मैं isValidationFailed() जांचता हूं।

  • अगर true कम से कम एक आवश्यक फ़ील्ड भरा नहीं है: मैं झंडा completed अनचेक करें। (यह एक मसौदा है)
  • यदि false सभी फॉर्म पूरा हो गया है: मैं ध्वज completed देखता हूं। (यह एक मसौदा नहीं है)

यह मुझे दो बटनों ("सहेजें" और "ड्राफ्ट के रूप में सहेजें") के बजाय एकल "सहेजें" बटन भी देता है।

नोट्स और जाना जाता है नुकसान:

  • आप डेटाबेस के लिए अपने मसौदा बचत कर रहे हैं, तो आप सुनिश्चित करें कि कोई NOT NULL की कमी देखते हैं बनाने के लिए की है।
  • कन्वर्टर्स और सत्यापनकर्ताओं का उपयोग करते समय आपको यह सुनिश्चित करना होगा कि वे NULL मानों को संभाल सकें।
  • आप अपने फ़ील्ड के लिए outputLabel में आवश्यक फ़ील्ड तारांकन खो देंगे।