2015-05-18 10 views
7

Ho un'icona di stampa che esegue il rendering della versione stampabile del modulo.ADF af: showPrintablePageBehavior invia tutti i successivi comandi di navigazione a una nuova finestra

<af:link id="printButton" icon="/images/printer.png"> 
    <af:showPrintablePageBehavior/> 
</af:link> 

Questa parte funziona correttamente, ma dopo aver chiuso la scheda creata dai <af:showPrintablePageBehavior/> qualsiasi tentativo di reindirizzare a una nuova pagina crea una nuova scheda del browser.

Il pulsante fare il redirect è definita questa convenzione,

<af:button text="Search" action="#{backing.searchAction}" 
      partialSubmit="false" immediate="true" id="ab1" /> 

public String searchAction() { 
    return "search" 
} 

"search" è un navigation-rule, che è definito nella faces-config.xml e funziona correttamente se non si richiama <af:showPrintablePageBehavior/> prima di fare clic sul pulsante.

Ho provato a utilizzare ExternalContext.redirect(page). Ho anche provato a definire l'attributo targetFrame su _self e _parent per il numero <af:button>. Il mancato comportamento è coerente con ciascuno di questi approcci.

+0

Un'altra nota su questo, ho preso il 'UIComponent' nella parte posteriore terminare e stampare gli attributi, il 'targetFrame = _self' come previsto. –

+0

Utilizzo di JDeveloper 12c –

+1

Una domanda: si sta lavorando all'interno di un flusso di lavoro limitato? –

risposta

5

La radice di tutto il male nell'esempio è l'attributo immediate="true". Se lo rimuovi, il problema verrà risolto.

Tuttavia, per spiegare il motivo, iniziamo con il componente <af:showPrintablePageBehaviour> e il file trinidad-config.xml (che è annidato nella cartella WEB-INF).

Il file trinidad-config.xml elenca un elemento, denominato <output-mode>. Per impostazione predefinita, non è lì, ma puoi aggiungerlo manualmente. L'elemento supporta tre valori:

  • "default" (o null): il modo di uscita predefinito
  • "printable": una modalità di uscita adatto per le pagine stampabili
  • "email": una modalità di uscita adatto per l'e-mailing contenuto di una pagina

per avere un contenuto pagina visualizzata come stampabile, il output-mode viene modificato (solitamente da quadro sottostante) per "printable". Pertanto, ogni volta che si fa clic sul componente <af:link>, il valore <output-mode> è impostato su "printable".

La cosa positiva di trinidad-config.xml è che è possibile utilizzare le espressioni EL all'interno, il che significa che è possibile modificare dinamicamente il valore dell'elemento <output-mode>. Ad esempio, il valore può essere letto da un @ManagedBean:

<output-mode>#{printableBehaviorBean.outputMode}</output-mode> 

L'qualche stessa può essere del tutto semplice (@RequestScoped) fagiolo. Nota che sto usando le annotazioni invece della configurazione basata su XML, perché hai menzionato che stai usando ADF 12c, che è costruito sulla parte superiore di JSF-2.

@RequestScoped 
@ManagedBean(name = "printableBehaviorBean") 
public class PrintableBehaviorBean { 
    private String outputMode; 

    public void setOutputMode(String outputMode) { 
     this.outputMode = outputMode; 
    } 

    public String getOutputMode() { 
     return outputMode; 
    } 
} 

Poi, possiamo iniettare questo fagiolo all'interno di un'altra fagiolo, che contribuirà a navigare all'attività "search" quando viene premuto il pulsante Search.Il bean avrà un membro nidificato @ManagedProperty, che conterrà un'istanza del precedente bean printableBehaviorBean. Inoltre, lo navigationBean introdurrà un metodo search(), che verrà definito dall'attributo del pulsante Search.

Il trucco è che prima di restituire effettivamente l'esito della navigazione, cambieremo il valore della proprietà outputMode nello printableBehaviorBean. Ricordare che questo nuovo valore sovrascriverà il valore esistente <output-mode> e se il valore <output-mode> è stato precedentemente impostato su "printable", verrà ripristinato a "default" (e ciò avverrà ogni volta che si fa clic sul pulsante Search).

@RequestScoped 
@ManagedBean(name = "navigationBean") 
public class NavigationBean { 

    @ManagedProperty(name = "printableBehaviorBean", value="#{printableBehaviorBean}") 
    private PrintableBehaviorBean printableBehaviorBean; 

    public void setPrintableBehaviorBean(PrintableBehaviorBean printableBehaviorBean) { 
     this.printableBehaviorBean = printableBehaviorBean; 
    } 

    public PrintableBehaviorBean getPrintableBehaviorBean() { 
     return printableBehaviorBean; 
    } 

    public String search() { 
     printableBehaviorBean.setOutputMode("default"); 
     return "search"; 
    } 

} 

E, infine, la definizione Search tasto sarebbe stato leggermente modificato per:?.

<af:button text="Search" action="#{navigationBean.search}" immediate="true" id="ab1" /> 

Ora, un'altra questione di interesse sarebbe "Perché la rimozione immediate="true" risolve il problema

A UICommand componente decorato con immediate="true" volontà fare in modo che il framework salti le fasi del ciclo di vita "Validazioni di processo", "Aggiorna valori del modello" e "Invoke application" JSF (ad es. la 3a, la 4a e la 5a fase). La mia ipotesi sul problema sarebbe che, prima della fase "Invoke application", l'implementazione ADF controlla se i componenti del comando sono decorati con un componente <af:showPrintablePageBehaviour> e se lo è, quindi modifica a livello di codice il valore dell'elemento <output-mode>. E poiché hai immediate="true" sul pulsante "Search", questo valore verrà lasciato come "printable". Ecco perché quando torni al modulo, attiva una nuova scheda.

Quindi, in conclusione, sia rimuovere l'attributo immediate="true", o seguire la soluzione con i fagioli che ho suggerito.

+0

La rimozione di 'immediate =" true "' non ha funzionato, tenterà di risolvere il problema. Grazie per la ricerca! –

+0

Rimosso 'immediate =" true "' e 'partialSubmit =" false "' e ha funzionato .. –

+0

'partialSubmit' è' false' di default. Immagino che tu abbia dovuto semplicemente ridistribuire l'applicazione :) –

0

Dal momento che si sta utilizzando ADF 12c e Konstantin Yovkov descritto il problema, forse è possibile rimuovere l'attributo inmediate e mettere dentro af: pulsante

<af:target events="@all" execute="@this" render="@all"/> 
Problemi correlati