martedì 6 settembre 2011

Wicket: Form con misto PropertyModel e CompoundModel

NB: Questo esempio è legato al post Wicket + Form quindi se volete provare il codice vi conviene guardarvi prima quello.

Nell'esempio precedente abbiamo implementato una form semplice completamente bindata su un oggetto chiamato Country.

Abbiamo passato al costruttore della FORM un modello basato sull'oggetto stesso così da poter legare facilmente e velocemente le proprietà dell'oggetto sui campi della form.

Purtroppo capita spesso che questo giochetto non si possa fare perché non tutti i campi di una form sono bindati su un solo oggetto. Alcune input potrebbero appartenere ad altri oggetti che in qualche modo devono essere "visti" dai campi della form e dalla form stessa.

Per risolvere questo problema si usa un altro tipo di object-model di Wicket chiamato PropertyModel.

Nell'esempio precedente aggiungiamo un campo email alla form. 

<wicket:panel>
<form wicket:id="countryForm">
    <input wicket:id="country" />
    <input wicket:id="email" />
    <input wicket:id="submit" type="submit" />
</form>
</wicket:panel>

La form è identica tranne per un nuovo campo email.

La parte logica della form è identica alla precedente tranne per l'aggiunta del seguente pezzo:


 final MyUser myTinyUser = new MyUser();
 PropertyModel<String> emailPropertyModel = new PropertyModel<String>(myTinyUser, "email");
 final TextField<String> eField = new RequiredTextField<String>("email",emailPropertyModel);

Creiamo un oggetto MyUser che per l'occasione è il nostro oggetto che ha dentro una property email. In pratica è il nostro oggetto esterno a cui dobbiamo bindare un campo della form.

Creiamo quindi un PropertyModel (di tipo String) mappato sul campo "email" dell'oggetto myTinyUser. Associamo quindi questo oggetto PropertyModel al nuovo campo RequiredTextField della form.

Cosa succederà quindi all'invio della form?
La cosa è molto semplice. La form riempirà sia l'oggetto Country bindato direttamente sulla form e sia l'oggetto myTinyUser a cui abbiamo bindato il campo email.

Per andare a leggere i valori, useremo il seguente codice:

Button sButton = new Button("submit"){
            private static final long serialVersionUID = 1L;
            public void onSubmit(){                    
                Country ciao = (Country) cForm.getModelObject();
                System.out.println("Hai inserito: "+ciao.getCountry());
                System.out.println("La mail: "+myTinyUser.getEmail());
            }
        };

Come possiamo vedere dal codice sopra, per stampare la mail ci basta richiamare il metodo getEmail() dell'oggetto myTinyUser che sarà stato riempito.

IMP: L'oggetto myTinyUser va impostato come final. Wicket non può riempire un oggetto NON final (per lo stesso motivo anche la form deve essere messa final avendo un modello associato) perché deve essere sicuro che quell'oggetto non venga in qualche modo cambiato a runtime.

Nessun commento:

Posta un commento