Chiunque abbia mai sviluppato un'applicazione web, si sarà trovato senz'altro a dover risolvere il classico problema delle combo collegate: ossia selezionando un valore dalla prima combo, vengono filtrati (o caricati) i valori della seconda combo.
Un esempio banale? Nazione e provincia, piuttosto che provincia e comune; o magari la terna nazione, provincia e comune.
Fortunatamente anche lo staff di Liferay si è posto il medesimo problema e lo ha risolto creando e mettendo a disposizione un utile componente Javascript: DynamicSelect
.
In questa prima parte vedremo un classico e semplice utilizzo del componente, lasciando alla seconda parte il caso più complesso applicato ad entità custom.
Vediamo subito il codice in azione e cerchiamo di capirlo:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> <%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %> <aui:select label="country" name="countryId" required="true" /> <aui:select label="region" name="regionId" required="true" /> <aui:script use="liferay-dynamic-select"> new Liferay.DynamicSelect([ { select: '<portlet:namespace />countryId', selectData: Liferay.Address.getCountries, selectDesc: 'nameCurrentValue', selectSort: true, selectId: 'countryId', selectVal: '8' }, { select: '<portlet:namespace />regionId', selectData: Liferay.Address.getRegions, selectDesc: 'name', selectSort: true, selectId: 'regionId', selectVal: '8015' } ]); </aui:script>
Tralasciamo l'inclusione delle taglib perchè è superfluo e vediamo subito le 2 combo, nazione e provincia, rigorosamente vuote; non importa come siano visualizzate a video, l'importante è decidere l'ordine con cui devono essere utilizzate, prima la nazione e poi la provincia.
Dopodichè andiamo a definire il blocco di codice Javascript, istanziando il componente Liferay.DynamicSelect
; l'unico argomento necessario è un array di oggetti JSON che rappresentano le varie combo nell'ordine esatto in cui devono essere utilizzate. Ciascuno di questi oggetti deve possedere i seguenti campi:
select
, rappresenta il nome della combo (occhio al namespace);selectData
, rappresenta la funzione Javascript che viene invocata per popolare la combo;selectDesc
, rappresenta il nome del campo (riferito all'oggetto singolo restituito daselectData
) da usare come label delle voci della combo;selectSort
, flag booleano per ordinare o meno le varie voci della combo;selectId
, rappresenta il nome del campo (riferito all'oggetto singolo restituito daselectData
) da usare come value delle voci della combo;selectVal
, rappresenta il valore con cui prevalorizzare eventualmente la combo (nell'esempio, 8 rappresenta l'Italia e 8015 la provincia di Bologna).
Ok, ma che cosa sono esattamente Liferay.Address.getCountries
e Liferay.Address.getRegions
?
Sono funzioni Javascript di portale che, sfruttando il meccanismo del DWR, effettuano una chiamata Ajax per recuperare tutti i dati che servono; le troviamo definite all'interno del file /html/js/liferay/address.js
. Per il momento non entriamo nel dettaglio, ma vi consiglio di darci un'occhiata.
Per ora è tutto! A presto con la seconda parte!