2015-07-08 13 views
7

Come rendere un pulsante che può saltare la convalida richiesta Web (ma comunque voglio elaborare tutti i dati, così immediato e così via non può essere vero).Universalmente ignorare i parametri di convalida sugli ingressi richiesti

È importante che sia universale. Al momento sto usando in ogni condizione di campo richiesta con qualche parametro di richiesta. Esempio di codice sotto

<p:inputText value="#{cc.attrs.data.exampleData1}" 
      required="#{param['onlySave'] == null}"/> 
<p:inputText value="#{cc.attrs.data.exampleData2}" 
      required="#{param['onlySave'] == null}"/> 
<p:inputText value="#{cc.attrs.data.exampleData3}" 
      required="#{param['onlySave'] == null}"/> 

<p:commandButton value="Zapisz zmiany" 
       action="#{cc.attrs.controller.save()}" 
       update="@form"> 
    <f:param name="onlySave" value="true"/> 
</p:commandButton> 

Questa soluzione va bene perchè posso in ogni pagina solo aggiungere questo parametro al pulsante e si salta la convalida, ma quando il mio pulsante di salvataggio non fare alcun redirect, in caso di mancato qualche convalida java a SAVE metodo, sto semplicemente aggiungendo un messaggio senza reindirizzamento e poi ho perso tutti gli stili richiesti dagli input.

Esiste la possibilità di impostare il parametro onlySave su null nel metodo di salvataggio quando la convalida non è riuscita o forse alcune soluzioni migliori?

Edit: Balus rispondere grande, ma con la convalida di fagioli come:

@Pattern(regexp = "^([^0-9]*)$", message = "only non numbers") 
String field; 

Elabora a fagiolo tutti i dati al di là di quel campo. La migliore proprietà del campo sarebbe ignore solo necessaria, non convalida ecc

Edit2:

<tr> 
    <td class="label"> 
     <p:outputLabel id="label" for="#{cc.attrs.componentId}" value="#{cc.attrs.label}"/> 
    </td> 
    <td class="value"> 
     <cc:insertChildren/> --here component with componentId 
    </td> 
</tr> 
<tr class="errorMessage"> 
    <td class="label"/> 
    <td class="value"> 
     <p:message id="error" for="#{cc.attrs.componentId}" /> 
    </td> 
</tr> 
+3

vostro requisito funzionale concreto è po 'difficile da digerire, ma credo che siete in cerca di http: //showcase.omnifaces. org/taghandlers/ignoreValidationFailed È vero? – BalusC

+0

wow, è quasi perfetto, solo un problema. Quando sto usando questo tag e scrivo in un campo per esempio numeri in bean non numerico: @Pattern (regexp = "^ ([^ 0-9] *) $", message = "numbers !!") non processa dati come si è supposto essere. Ma ogni altro campo viene elaborato. Non mi ha nemmeno dato alcuna informazione. – user2771738

+0

Quindi, il tuo concreto requisito funzionale è quello di impostare un attributo comune su tutti i componenti del tipo dato da un singolo luogo? Forse hai bisogno di http://showcase.omnifaces.org/taghandlers/massAttribute? – BalusC

risposta

0

Finora la soluzione migliore ho capito è:

Il pulsante di salvataggio aggiorna solo tutti gli errori e le etichette, quindi sono in grado di vedere errori di conversione ecc., Ma non ho perso gli stili richiesti sugli input. In questo esempio ho appena perso il colore rosso dei bordi di input.

Se u sta utilizzando * in etichette per i campi richiesti, Non aggiornare .ui-outputlabel

0

Si prega di vedere il codice di seguito modificato per i campi richiesti. Puoi usare # {empty param.onlySave} per i campi su cui vuoi saltare la validazione e secondo i tuoi requisiti.

<p:inputText value="#{cc.attrs.data.exampleData1}" 
      required="#{not empty param.onlySave}"/> 
<p:inputText value="#{cc.attrs.data.exampleData2}" 
      required="#{not empty param.onlySave}"/> 
<p:inputText value="#{cc.attrs.data.exampleData3}" 
      required="#{not empty param.onlySave}"/> 

<p:commandButton value="Zapisz zmiany" 
       action="#{cc.attrs.controller.save()}" 
       update="@form"> 
    <f:param name="onlySave" value="true"/> 
</p:commandButton> 
+0

Non vedo alcuna differenza tra questo e il mio esempio – user2771738

-1

ho capito una soluzione:
pagina JSF

<h:form id="form" prependId="false"> 
      <c:if test="#{param['onlySave'] eq true}"> 
       <c:set value="#{false}" target="#{myBean}" property="required"/> 
      </c:if> 
      <p:inputText value="#{myBean.required}"/> 
      <p:growl id="msgs" showDetail="true" /> 
      <p:inputText id="data1" value="#{myBean.data1}" 
         required="#{myBean.required}" /> 
      <p:inputText id="data2" value="#{myBean.data2}" 
          required="#{myBean.required}"/> 
      <p:inputText id="data3" value="#{myBean.data3}" 
         required="#{myBean.required}"/> 

      <p:commandButton value="Zapisz zmiany" 
          action="#{myBean.save}" /> 
     </h:form> 

Bean

@ManagedBean 
@ViewScoped 
public class MyBean implements Serializable{ 

    private String data1, data2, data3; 
    private boolean required; 

    @PostConstruct 
    public void init(){ 
     required = true; 
    } 

    public void save() { 
     System.out.println(data1+", "+data2+", "+data3); 
     required = false; 
     //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Info","Saved")); 
     // FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("onlySave", "false");// FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("onlySave")); 
    } 

// ... Getters & Setters 
} 
+0

La sua smth come Balus ha suggerito. Realizzerei MyBean per sessionScope e lo userei ovunque. Ma non è ancora così universale, sarà necessario iniettare questo controller su ogni controller in app e implementare lo stato in ogni metodo di salvataggio se ha superato la convalida.Questa è una soluzione, ma non è semplice come potrebbe essere (almeno credo in questo :)) – user2771738

+0

Se si dispone di un modello, è possibile aggiungere questa parte ' ' al suo interno e rende 'myBean' è la sessione con scope, questo è no devi fare la parte di riferimento, inoltre cambierai il framework JSF che stai utilizzando per utilizzare omnifaces –

+0

@ user2771738: Almeno prova questa risposta –

Problemi correlati