Se avete mai realizzato un form HTML attraverso le taglib di Alloy, vi sarete sicuramente resi conto che la tag <aui:select>
possiede 2 attributi alquanto sospetti:
listType
; listTypeFieldName
.
Spinti dalla curiosità vi sarete chiesti a cosa servono e come si usano; se non lo avete capito, ora ve lo spiego.
Si tratta semplicemente di un meccanismo con cui è possibile valorizzare in automatico le option
di un elemento select
; non facciamoci però prendere dall'entusiasmo perchè non si tratta di elenchi dinamici di valori, ma di un elenco predeterminato e pressochè fisso.
Come prima cosa vediamo come definire questo elenco di voci. All'interno del database è presente una tabella listtype
che possiede i seguenti campi:
listtypeid
, chiave primaria della tabella, utilizzata come value
della option
; name
, chiave di traduzione da utilizzare come label
della option
; type
_, nome identificativo della lista.
Giusto per fare un esempio vediamo alcune voci già presenti in tabella:
listtypeid | name | type_ |
10007 | fax | com.liferay.portal.model.Account.phone |
10008 | local | com.liferay.portal.model.Account.phone |
10009 | other | com.liferay.portal.model.Account.phone |
10010 | toll-free | com.liferay.portal.model.Account.phone |
10011 | tty | com.liferay.portal.model.Account.phone |
Come possiamo vedere il nome della lista è ripetuto perchè in tabella vengono inserite tutte le voci della lista; inoltre esiste anche una convenzione nella nomenclatura della lista che prevede il nome dell'entità a cui sarà associato il ListType (com.liferay.portal.model.Account
), seguito dal nome del campo specifico (phone
). Tutti i nomi delle liste e dei campi standard sono inoltre censiti nella classe ListTypeConstants
.
A questo punto possiamo inserire in pagina la nostra select
:
<aui:select name="..." listType="com.liferay.portal.model.Account.phone" />
oppure
<aui:select name="..." listType="<%=ListTypeConstants.ACCOUNT_PHONE%>" />
Questo fa sì che venga visualizzata la combo e popolata con tutti i valori necessari; ma non basta, perchè il valore selezionato vorremmo salvarlo in una nostra entità custom.
Ecco quindi che nel service.xml
dovremo andare ad aggiungere alla nostra entità un campo typeId
di tipo int
(occhio non un long
!); a questo punto, se utilizziamo correttamente la taglib <aui:model-context>
all'interno del nostro form HTML, abbiamo finito perchè la taglib <aui:elect>
andrà a cercare nel nostro bean il valore del campo typeId
con cui prevalorizzerà la combo.
E se il campo non si chiama typeId
? Beh, basta specificare anche l'attributo listTypeFieldName
e specificare il nome del campo della nostra entità.
Ah... c'è solo un problema...
Non esistono API di portale per manipolare al tabella listtype
; quindi ogni modifica va fatta a mano direttamente via SQL. Inoltre la chiave primaria non è autoincrementata, pertanto è onere vostro calcolare ad occhio il nuovo valore da utilizzare.
Enjoy!