2013-02-06 13 views
8

Ho un caso d'uso specifico per la convalida JSF. Per esempio ho un inputText campo:Convalida l'input come richiesto solo se viene premuto un determinato pulsante di comando

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}"> 
    <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> 
</p:inputText> 

valore di ingresso è il numero (in alcuni casi può anche essere una stringa, perché questa è parte del componente composito, ma il problema è meglio descritta se si assume che questo è un numero). Questo ingresso è parte del modulo, alla fine del modulo devo presentare pulsante:

<p:commandButton value="Save" actionListener="#{myBean.save}"/> 

Quali sono le mie richieste:

  1. Quando pulsante di invio viene premuto tutta la convalida deve essere elaborato e questo è OK , funziona bene
  2. Quando l'evento di sfocatura viene attivato sul campo di input se il campo non è vuoto, è necessario elaborare una convalida del numero e anche questo è OK. Alla fine aggiorno il campo con l'id name con qualche valore.
  3. Ora ho un problema. La mia terza richiesta è quando l'input è vuoto, la convalida sull'input non deve essere elaborata. Questo è un caso speciale in cui si cancellerà il campo con ID name. Questo è anche il caso in cui rimuovo il testo che è già inserito in input, rimuovi focus dal componente (premi TAB per esempio) e in quel caso dovrebbe essere elaborata anche la richiesta AJAX e anche l'immissione del nome verrà cancellata.

Come posso disabilitare la convalida di questo campo di input nel caso in cui sia vuoto, e solo per questo evento ajax?

risposta

10

Let del required ingresso attributo verificare se il pulsante di salvataggio viene premuto o no (che può essere identificata con la presenza del suo cliente ID nella mappa dei parametri della richiesta).

<h:form> 
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" /> 

    <p:commandButton binding="#{save}" ... /> 
</h:form> 

(nota: fare non legano a una proprietà di fagioli il codice è così com'è)

In questo modo sarebbe solo valutare true quando il salvataggio pulsante viene premuto in realtà.

Oppure, se avete problemi con binding e/o non hanno un problema hardcoding ID client del pulsante:

<h:form id="formId"> 
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" /> 

    <p:commandButton id="buttonId" ... /> 
</h:form> 
+0

Pensi che la convalida richiesta verrà saltata in quel caso? Perché? – partlov

+0

Finché non si riempie (e quindi si modifica) l'input, la convalida non verrà attivata sulla sfocatura. – BalusC

+0

Forse non ero chiaro con un caso d'uso specifico in terza richiesta. L'ho modificato L'utente può (probabilmente accidentalmente) rimuovere il testo e in tal caso l'input del nome verrà cancellato. – partlov

2

Basta rimuovere l'attributo richiesto mentre si accetta l'input se l'input è vuoto. Quindi scrivi un validatore personalizzato che accetta solo input vuoti o input numerici.

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator"> <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText> 

public class customerNumericInputValidator implementa Validator {

@Override 
public void validate(FacesContext facesContext, UIComponent uIComponent, 
     Object object) throws ValidatorException { 

    String number = (String) object; 
    number = Strings.nullToEmpty(number).trim(); 

    //if the request is a full request then number can not be empty 
    if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number)) 
    { 
     FacesMessage message = new FacesMessage(); 
     message.setSummary(Messages.getMessage("error empty value")); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     throw new ValidatorException(message); 
    } 

    if(!Strings.isNullOrEmpty(number)) 
    { 
     if(!isNumber(number)) 
     { 
      FacesMessage message = new FacesMessage(); 
      message.setSummary(Messages.getMessage("error not numerical value")); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(message); 
     } 
    } 
} 

}

+0

Ma necessaria convalida deve essere elaborato nel caso in cui il modulo è presentato con 'commandButton'. – partlov

+0

Quando il modulo viene inviato con commandButton, anche customValidator verrà eseguito e genererà un'eccezione se il valore inserito non è il numero; ma non si lamenterà se l'input è vuoto. – cubbuk

+0

OK, nella richiesta 1 Ho scritto che quando il modulo viene inviato con il pulsante, obbligatorio non deve essere ignorato!Possiamo dire che il campo è richiesto quando si invia con il pulsante, ma non dovrebbe essere richiesto quando si invia con ajax su un evento di sfocatura. – partlov