2015-09-15 9 views
6

मैं CRUD एप्लिकेशन पर काम कर रहा हूं, और मुझे डेटाबेस से डेटा को सीएसवी फ़ाइल में निर्यात करने की आवश्यकता है।सशर्त रूप से फ़ाइल डाउनलोड या निर्यात सत्यापन त्रुटि संदेश

<p:commandButton value="Export" ajax="false" action="myController.export"/> 

विधि लागू, मैं फ़ाइल बनाने में और OmniFaces उपयोगिता विधि के माध्यम से इसे डाउनलोड:

Faces.sendFile(file, true); 
निर्यात करने के लिए, मैं ajax अक्षम करें, एक तरह से निम्नलिखित कोड में दिखाया गया है में किया था

एक ही विधि का उपयोग करना, मैं जाँच अगर वहाँ वास्तव में किसी भी डेटा है, और किसी भी डेटा, चेतावनी संवाद नहीं दिखाया जाता नहीं अगर वहाँ है:

RequestContext.getCurrentInstance().showMessageInDialog(new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", "No available data for export.")); 

अब, जबकि यह सब के रूप में काम करता है इरादा, समस्या यह है कि क्योंकि AJAX अक्षम है, संवाद को गतिशील रूप से दिखाया नहीं जा सकता है, और पृष्ठ पुनः लोड किया गया है। अगर AJAX सक्षम है, तो संवाद गतिशील रूप से दिखाया गया है, लेकिन फ़ाइल डाउनलोड शुरू नहीं होता है।

मैं Monitor download का उपयोग कर, या बलपूर्वक दूसरे बटन पर क्लिक करके इस मुद्दे के आसपास काम करने की कोशिश कर रहा हूं, लेकिन अब तक मैंने इस मामले पर कोई प्रगति नहीं की है।

क्या इस तरह के मुद्दों को हल करने का कोई आम तौर पर स्वीकार्य तरीका है?

उत्तर

8

क्या इस तरह के मुद्दों को हल करने का कोई आम तौर पर स्वीकार्य तरीका है?

आप मूल रूप से पहले और उसके oncomplete जाँच में एक ajax अनुरोध आग अगर यह सफल है, और फिर फ़ाइल को डाउनलोड करने के लिए एक तुल्यकालिक अनुरोध को ट्रिगर चाहते हैं (ध्यान दें ajax के साथ can't डाउनलोड फ़ाइलों कि)। args ऑब्जेक्ट के माध्यम से उपलब्ध सत्यापन विफलता स्थिति को चिह्नित करने के लिए आप FacesContext#validationFailed() (या OmniFaces Faces.validationFailed()) का उपयोग कर सकते हैं, जो प्राइमफेस oncomplete फ़ंक्शन संदर्भ में इंजेक्ट करता है (ध्यान दें कि AJAX संबंधित गुण जैसे oncomplete AJAX अक्षम होने पर काम नहीं करते हैं)।

कुछ इस तरह:

<p:commandButton 
    value="Export" 
    action="#{bean.export}" 
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('download').jq.click()" /> 
<p:commandButton 
    widgetVar="download" 
    styleClass="ui-helper-hidden" 
    action="#{bean.download}" ajax="false" /> 
public void export() { 
    // Prepare file locally. 

    if (fail) { 
     // Show message your way and then set validation failed as below. 
     Faces.validationFailed(); 
    } 
} 

public void download() throws IOException { 
    Faces.sendFile(file, true); 

    // Delete local file afterwards? 
} 

ध्यान दें कि एक छिपा हुआ <p:commandButton> उत्तरार्द्ध के रूप में <p:remoteCommand> के स्थान पर प्रयोग किया जा रहा है ajax="false" समर्थन नहीं करता।

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