2015-09-15 15 views
6

Ho lavorato all'applicazione CRUD e ho bisogno di esportare i dati dal database al file csv. Per l'esportazione, ho dovuto disabilitare ajax, in modo mostrato nella seguente codice:Fornisce condizionalmente il download del file o visualizza il messaggio di errore di convalida dell'esportazione

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

Nel metodo invocato, creo il file e scaricarlo tramite OmniFaces metodo di utilità:

Faces.sendFile(file, true); 

Utilizzando lo stesso metodo, a verificare se in realtà non v'è alcun dato, e se non c'è alcun dato, viene mostrata finestra di avviso:

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

Ora, mentre tutto questo funziona come inteso, il problema è che poiché ajax è disabilitato, la finestra di dialogo non può essere mostrata dinamicamente e la pagina viene ricaricata. Se ajax è abilitato, la finestra di dialogo viene visualizzata dinamicamente, ma il download del file non inizia.

Ho cercato di ovviare a questo problema, utilizzando Monitor download o facendo clic sul secondo pulsante con la forza, ma finora non ho fatto alcun progresso in merito.

Esiste un modo generalmente accettabile per risolvere problemi come questo?

risposta

8

Esiste un modo generalmente accettabile per risolvere problemi come questo?

Che, fondamentalmente, vogliono sparare una richiesta AJAX prima e nel suo controllo onComplete se è successo, e quindi attivare una richiesta sincrona per scaricare il file (si noti che è can't download di file con l'Ajax). È possibile utilizzare FacesContext#validationFailed() (o OmniFaces Faces.validationFailed()) per contrassegnare lo stato di fail di convalida disponibile tramite args oggetto che PrimeFaces inietta nel contesto della funzione oncomplete (notare che gli attributi correlati ajax come oncomplete non funzionano quando ajax è disabilitato).

Qualcosa di simile a questo:

<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? 
} 

Nota che una nascosta <p:commandButton> viene utilizzato al posto del <p:remoteCommand> in quanto quest'ultimo non supporta ajax="false".

Problemi correlati