Oggi torno con un veloce esempio per spiegare una casistica che può presentarsi spesso e che è utile analizzare.
SITUAZIONE: Ho una form con un campo di dipo TEXT che di base non è richiesto ma diventa obbligatorio sulla base di un altro campo.
La richiesta quindi è quella di cambiare il valore settato normalmente da setRequired sulla base di un dato evento che può verificarsi in fase di submit.
Nel mio caso avevo 2 diversi submit nella form. Uno dei due richiedeva che il campo fosse riempito. Quindi di default il campo aveva setRequired a false ma se premevo quello specifico submit, doveva diventare true.
La cosa che un normale programmatore si aspetterebbe di fare sarebbe intercettare il metodo onSubmit del bottone submit incriminato e metterci un bel nomeInputText.setRequired(true);
Questo approccio è per sbagliato e potenzialmente dannoso. Contrariamente a quanto si possa credere, Wicket valida gli input prima di lanciare il tasto onSubmit del bottone. Questo significa che il campo verrebbe impostato come obbligatorio solo DOPO la validazione.
In questo caso si verificherebbero due casistice:
- La form era corretta: In questo caso la form viene submitata ed il campo rimane vuoto;
- La form era incorretta per altre ragioni: In questo caso viene riproposta la form (con il relativo pannello feedback) ed il nostro input viene effettivamente messo su "richiesto". Al successivo submit anche lui genererà errore se vuoto.
Ma cosa succede se l'utente preme sull'altro tasto (ovvero quello che non richiedeva il campo)? In questo caso non c'è niente che rimetta a false la setRequired anche mettendolo nella onSubmit del bottone (lo metterebbe solo al successivo errore della form).
Quindi questo approccio è sbagliato. Il metodo più semplice è fare l'override del metodo dell'input stesso, che viene richiamato dal validatore.
In ogni input infatti esiste un metodo chiamato isRequired() che ritorna un boleano. Il boleano ritornato è lo stesso settato dalla setRequired.
TextField<Date> scadenzaText = new TextField<Date>(SCADENZA){ @Override public boolean isRequired() { //Di base l'input non è richiesto //ma se premo uno dei due bottoni per //devo renderlo obbligatorio Form form = (Form) findParent(Form.class); return ( (form.getRootForm().findSubmittingButton() == nomeOggettButtonSensibile)); } };
Nel codice sopra vediamo come fare.
Il nostro campo scadenzaText di tipo DATE, non ha richiamato nessuna setRequired. Facciamo però ovverride del metodo isRequired e dentro imponiamo la nostra condizione.
In questo caso creiamo al volo una variabile di tipo FORM che inizializziamo come la FORM che contiene noi stessi (tramite findParent). Su questo oggetto richiamiamo il metodo findSubmittingButton controllando se esso è uguale all'oggetto BUTTON che deve richiedere l'obbligatorietà del campo. Se l'ugualianza è verificata, allora viene ritornato TRUE e quindi il campo diventa obbligatorio.
Ovviamente qui abbiamo condizionato il campo TEXT con un submit. Nessuno ci vieta per esempio di fare controlli su altri campi. Per esempio possiamo vedere tramite un semplice nomeAltroInput.getValue() se il valore di un altro input è settato o uguale a qualcosa.
Un esempio pratico si ha, per esempio, quando ci sono dei range di date da inserire. Spesso durante un filtro ricerca uno può cercare all'interno di uno specifico periodo o semplicemente cercare indipendentemente dalla data. Se però inseriamo la data di partenza di un periodo, dobbiamo rendere obbligatorio inserire anche la data di fine periodo. In questo caso possiamo rendere obbligatorio questo secondo campo se il primo è stato riempito ecc...
Nessun commento:
Posta un commento