In questo articolo vedremo come gestire le Portlet Preference per memorizzare parametri di configurazione. In tal modo è possibile gestire la logica implementata dalla nostra portlet custom.
Introduzione
Le Portlet Preferences ci consentono di salvare in modo persistente sul database le configurazioni delle nostre portlet; questo avviene tramite l’oggetto PortletPreferences che rappresenta una riga della tabella PortletPreferences, all’interno del database di Liferay.
Nella versione 6 è preferibile non utilizzare il Configuration Mode che si poteva utilizzare anche nelle versioni precedenti, poiche’, non essendo uno standard nella portlet specification, il team di Liferay ha deciso di dismetterlo gradualmente, in favore dell’Edit Mode che, al contrario, è uno standard delle portlet.
Portlet Preferences, utenti e pagine
È doveroso fare una puntualizzazione riguardo le PortletPreferences e il modo in cui Liferay le implementa. La Java Portlet Specification [1]recita: “Portlets are commonly configured to provide a customized view or behavior for different users. This configuration is represented as a persistent set of name-value pairs and it is referred to as portlet preferences.”
Da questa affermazione potremmo dedurre che, tramite le PortletPreferences, le portlet devono avere configurazioni specifiche per ogni utente, e che questo deve essere il comportamento. Bene, in Liferay non è così, o meglio, non è l’unico comportamento possibile.
L’implementazione di Liferay consente diversi livelli di granularità per la condivisione delle preferencze; questo vuol dire che, ad esempio, delle PortletPreferences possono essere condivise a livello utente, a livello pagina o a livello community. I diversi livelli sono pilotati tramite le configurazioni delle portlet, in particolare grazie a tre proprietà presenti nel file liferay-portlet.xml:
Tutte e tre le property possono assumere solo i valori true o false. A seconda di come configuriamo la portlet, avremo un diverso livello di condivisione. Tutte le combinazioni e i risultati che otteniamo sono riassunti nelle tabelle che seguono: in figura 1 siamo nel caso dle portlet non istanziabili (
Figura 1 – Possibili livelli di condivisione per portlet non istanziabili.
In figura 2, invece, siamo nel caso di portlet che possono essere istanziate (
Figura 2 – Possibili livelli di condivisione per portlet istanziabili.
Gestione delle PortletPreferences in Edit Mode
Come stabilito dalla portlet specification, esistono 3 Portlet Mode in cui una portlet può trovarsi:
- View
- Edit
- Help
View è la visualizzazione in cui sono mostrate le funzionalità della portlet, in sostanza il “front-end”. Edit è la modalità in cui gestiamo le configurazioni della portlet. Help, infine, serve per visualizzare una pagina di aiuto.
La prima, View, è quella che abbiamo usato nei precedenti articoli per interagire con la portlet. Ad esempio eravamo in View Mode sia quando visualizzavamo la lista degli autori che quando veniva visualizzata la form per inserire/modificare un autore.
Se vogliamo gestire anche l’Edit Mode dobbiamo dichiararlo esplicitamente nel file portlet.xml; possiamo farlo manualmente o farlo fare all’IDE; il secondo scenario però è possibile solo nel caso in cui stiamo creando una portlet da zero. Vediamo nel dettaglio come farlo in entrambi i modi
Modifica manuale del file portlet.xml
Dentro
text/html
VIEW
EDIT
Sempre dentro questo file aggiungiamo le seguenti righe
edit-jsp
/html/preferencesexampleportlet/edit.jsp
Dentro
Modifica automatica tramite IDE
Se stiamo creando una portlet nuova, invece, possiamo lasciare all’IDE l’onere di fare quanto descritto sopra: è semplicissimo, basta mettere una spunta in fase di creazione, in una delle finestre del wizard, come illustrato nel rettangolo rosso in figura 3.
Figura 3 – Creazione dell’Edit Mode per una portlet.
Ora che abbiamo la nostra portlet con le giuste configurazioni proviamo a farne il deploy. Se il deploy va a buon fine, aggiungiamo la portlet in una qualsiasi pagina (dobbiamo essere loggati per farlo): se ora clicchiamo sull’icona a forma di chiave inglese, dovremmo vedere un menù come quello in figura 4. Preferences è la voce del menù che ci permette di visualizzare la portlet in Edit Mode. Cliccando, vedremo il contenuto della JSP edit.jsp che abbiamo creato precedentemente.
Figura 4 – Menù della portlet.
Come trattare le preferenze
Vediamo ora la parte interessante, ossia come gestire le Preferences. Cosa farne dipenderà dalle esigenze di ciascuna portlet e non è argomento dell’articolo. In questo esempio vedremo come trattare due tipi di preference, il singolo campo di testo e una lista di preferences dello stesso tipo; in particolare per il secondo tipo, scopriremo come Liferay fornisce, ancora una volta, delle facility per la gestione di preference di questo genere.
Decidiamo che il singolo campo di testo lo chiamiamo, appunto, singolo, mentre la lista la chiameremo listaParametri. Vediamo subito la JSP che renderizza l’edit mode della portlet:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ page import="javax.portlet.PortletPreferences" %>
<%
//recuperiamo le preferences per questa istanza
PortletPreferences preferences = renderRequest.getPreferences();
//leggiamo dalle preferences i nostri valori,prima "singolo"...
String singoloParametro = preferences.getValue("singolo","");
//...e poi la lista
String[] listaParametri =
preferences.getValues("listaParametri",new String[0]);
%>action="<%= saveConfURL.toString() %>" method="post">
">
<%
if (listaParametri.length == 0) {
listaParametri = new String[1];
listaParametri [0] = "";
}
for (int i = 0; i < listaParametri.length; i++) {
%>
label="listaParametri"
name="<%= "listaParametri"+i %>"
value="<%= listaParametri[i] %>" />
<%
}
%>
new Liferay.AutoFields(
{
contentBox: 'fieldset.prefList',
fieldIndexes: 'prefListIndexes'
}
).render();
Analizziamo il pezzo di codice racchiuso tra i tag <% %>, subito dopo il primo blocco di import. La chiamata
PortletPreferences preferences = renderRequest.getPreferences();
recupera un oggetto PortletPreferences; da questo oggetto, se sono state precedentemente salvate, leggiamo le preferences valorizzate, con queste chiamate:
String singoloParametro = preferences.getValue("singolo","");
String[] listaParametri = preferences.getValues("listaParametri",new String[0]);
La prima recupera un valore singolo, la seconda una lista. Per entrambe il secondo parametro è il valore restituito nel caso la preferences sia null. Il restante pezzo di codice è composto sostanzialmente dalla form per l’inserimento dei valori e da uno script per la gestione della lista. Guardiamola nel dettaglio: creata con le taglib Liferay-Aui [2] [3] [4] [5], punta all’action URL saveConf. Dopo l’apertura della form troviamo
">
Questo tag renderizza un fieldset HTML la cui class sarà uguale al contenuto passato dentro cssClass. In questo caso è molto importante specificare una class, ed è ancora più importante che dentro la class ci sia la portlet namespace. Trovandoci già dentro un tag, non possiamo utilizzare un’altra chiamata a una taglib, ossia
Per ultimo troviamo uno script, fondamentale per la gestione della lista di parametri. Questo gestisce diversi aspetti: la possibilità di aggiungere e rimuovere dinamicamente le righe di input nel nostro form; la possibilità di usare un manger per fare undo delle operazioni (se ad esempio abbiamo rimosso per sbaglio una riga, è possibile recuperarla se non abbiamo ancora fatto submit); inoltre è responsabile della logica che ci permette di avere, appunto, la lista. Tutto questo avviene tramite l’oggetto Liferay.AutoFields, che abbiamo creato con due parametri, illustrati qui di seguito.
contentBox: 'fieldset.prefList'
Dentro contentBox passiamo il selettore che contiene le righe che vogliamo duplicare, nel nostro caso il