Liferay mette a disposizione degli sviluppatori numerosi ed utili taglib da poter utilizzare nelle proprio JSP.

Una di queste è liferay-ui:input-move-boxes che consente di selezionare valori da un elenco; vediamo come funziona.

Chiunque si sia mai trovato a configurare Liferay, avrà avuto la necessità di configurare le lingue del portale.

Tale configurazione avviene mediante 2 caselle combinate (a selezione multipla) affiancate: la casella di sinistra contiene l'elenco delle voci selezionate, mentre la casella di destra contiene l'elenco delle voci disponibili. Tra le 2 caselle sono presenti dei pulsanti che consentono di spostare gli elementi da una casella ad un'altra.

Questo componente, ed il suo funzionamento, è la taglib liferay-ui:input-move-boxes; il 90% del codice da scrivere risiede all'interno della JSP e riguarda la valorizzazione delle 2 caselle combinate.

Pertanto, come prima cosa, iniziamo a definire 2 liste di oggetti che rappresenteranno il contenuto delle 2 caselle combinate; ricordiamo che per convenzione la casella di sinistra rappresenta i valori selezionati mentre la casella di destra rappresenta i valori disponibili. Queste 2 liste dovranno contenere oggetti di tipo KeyValuePair che non è altro di una coppia chiave/valore appunto.

<%
List<KeyValuePair> leftList = new ArrayList<KeyValuePair>();
leftList.add(new KeyValuePair("1", "One"));
leftList.add(new KeyValuePair("2", "Two"));
leftList.add(new KeyValuePair("3", "Three"));
leftList.add(new KeyValuePair("4", "Four"));
leftList.add(new KeyValuePair("5", "Five"));
leftList.add(new KeyValuePair("6", "Six"));

List<KeyValuePair> rightList = new ArrayList<KeyValuePair>();
rightList.add(new KeyValuePair("7", "Seven"));
rightList.add(new KeyValuePair("8", "Eight"));
rightList.add(new KeyValuePair("9", "Nine"));
%>

Dopodichè andremo ad inserire la taglib vera e propria, posizionandola all'interno di un form HTML; oltre alla taglib andremo anche ad inserire un campo nascosto che ci servirà dopo.

<liferay-portlet:actionURL name="save" var="saveURL" />
<aui:form action="<%=saveURL %>" method="post" name="fm">
    <aui:input name="values" type="hidden" />
    <liferay-ui:input-move-boxes
        leftBoxName="selectedValues"
        leftList="<%=leftList %>"
        leftReorder="true"
        leftTitle="selected"
        rightBoxName="availableValues"
        rightList="<%=rightList %>"
        rightTitle="available"
    />

    <aui:button-row>
        <aui:button type="submit" value="save" />
    </aui:button-row>
</aui:form>

I parametri della taglib sono speculari e relativi alle 2 caselle combinate.

leftBoxName
Nome della casella combinata
leftList
Lista dei valori delle caselle creati in precedenza
leftReorder
Visualizza i pulsanti per ordinare gli elementi della casella
leftTitle
Etichetta della casella combinata

Per quanto riguarda la JSP manca solamente una cosa: al submit del form occorre valorizzare il campo nascosto con i valori selezionati nella casella combinata di sinistra (o destra); questo passaggio è obbligatorio perchè la taglib serve solamente a spostare valori da una casella all'altra, ma questi valori non sono selezionati e quindi non vengono passati nella request. Ma con un pò di Javascript siamo in grado di leggere tutti i valori presenti in una casella, trasformarli in una stringa e valorizzare il campo nascosto.

<aui:script use="liferay-util-list-fields">
A.one('#<portlet:namespace/>fm').on('submit', function(event) {
    var selectedValues = Liferay.Util.listSelect('#<portlet:namespace/>selectedValues');
    A.one('#<portlet:namespace/>values').val(selectedValues);
    submitForm('#<portlet:namespace/>fm');
});
</aui:script>

La JSP è pronta, ora manca solo una cosa: leggere i valori nella processAction per poterli gestire come serve.

String[] values = ParamUtil.getParameterValues(actionRequest, "values", new String[0]);