Salve a tutti!
Ringrazio la D’Vel per avermi dato la possibilità di scrivere un post su questo utile ed interessante blog.
Tutto il codice che troverete in questo articolo è preso dal portlet sviluppato dalla nostra azienda “My Workflow Status” (http://www.liferay.com/it/marketplace/-/mp/application/23590323).
Il portlet è gratuito ed open source e il codice sorgente può essere scaricato direttamente dal nostro repository (https://github.com/3fconsulting/status-workflow-portlet).
Ho scritto questo articolo allo scopo di condividere la mia esperienza di sviluppatore e per spiegare come liferay supporti il programmatore anche nelle più comuni e semplici attività di configurazione del proprio prodotto.
Ok basta con le chiacchere e con la pubblicità :-D cominciamo con l’articolo.
Liferay Portlet Mode Config
Un’interessante aggiunta ai portlet mode definiti nello standard fatta da liferay è quella di aver introdotto il Portlet Mode “Config”.
Tale modalità ci viene in aiuto quando vogliamo creare portlet parametrizzabili e poter rendere dinamico il loro funzionamento in base alle esigenze dell’utilizzatore finale.
L’immagine mostra come accedere alle configurazioni del portlet.
Come potrete notare la nostra configurazione risulta pienamente integrata in liferay.
Modifichiamo i file di configurazione
Cominciamo con la modifica dei nostri file di configurazione che possiamo trovare nella cartella “docroot/WEB-INF” del portlet.
Aggiungete al file liferay-portlet.xml la seguente riga di codice per comunicare a liferay di attivare la modalità config per il portlet:
<portlet>
…
< configuration-action-class > com.liferay.portal.kernel.portlet.DefaultConfigurationAction
</ configuration-action-class >
…
</portlet>
Modificate il file portlet.xml per indicare a liferay dove recuperare la “jsp page” per la gestione delle configurazioni.
<portlet>
…
< init-param >
< name > config-jsp </ name >
< value > /html/statusworkflow/configuration.jsp </ value >
</ init-param >
…
</portlet>
Le configurazioni sono terminate e possiamo passare al codice.
Modifichiamo le nostre jsp
Il codice che andremo ad analizzare gestisce le seguenti due configurazioni:
- “statusworkflow-color-count-tasks-user-roles-full” configurazione di tipo “String” gestita da un input di tipo “Text”;
- “statusworkflow-show-tooltip” configurazione di tipo “Boolean” gestita da un select.
Prima di creare la pagina delle configurazioni definiamo nella init.jsp il codice per recuperare le preferences del portlet (nella classe PortletPreferences troverete le configurazioni salvate con la configuration.jsp)
<%@tagliburi="http://liferay.com/tld/ui"prefix="liferay-ui"%>
<%@tagliburi="http://liferay.com/tld/au"prefix="aui"%>
…
<%@ page import= "com.liferay.portlet.PortletPreferencesFactoryUtil" %>
<%@ page import= "javax.portlet.PortletPreferences" %>
<%@ page import= "com.liferay.portal.kernel.util.Validator" %>
<%@ page import= "com.liferay.portal.kernel.util.ParamUtil" %>
<%@ page import= "com.liferay.portal.kernel.util.StringUtil" %>
…
<%
PortletPreferences preferences = null ;
if (renderRequest != null ) {
preferences = renderRequest.getPreferences();
}
String portletResource = ParamUtil.getString(request, "portletResource" );
if (Validator.isNotNull(portletResource)) {
preferences = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource);
}
%>
N.B. Il suddetto codice può essere scritto direttamente nella jsp di configurazione ma, visto che sarà utile anche nella jsp della portlet, è sempre utile definire tutte le nostre operazioni comuni all’interno di un’unica jsp che poi includerete in tutte le altre pagine.
Ora non dovete fare altro che creare il file configuration.jsp nella cartella “docroot/html/statusworkflow”.
Il codice seguente indica come includere la init.jsp e come recuperare e memorizzare in variabili locali le configurazioni.
<%@ page import= "com.liferay.portal.kernel.util.GetterUtil" %>
<%@ page import= "com.liferay.portal.kernel.util.StringPool" %>
<%@ include file= "/html/statusworkflow/init.jsp" %>
<%
String colorCountTasksUserRolesFull = preferences.getValue("statusworkflow-color-count-tasks-user-roles-full", StringPool.BLANK);
boolean showTooltip = GetterUtil.getBoolean(preferences.getValue("statusworkflow-show-tooltip" ,null ), Boolean.TRUE);
%>
Per salvare le configurazioni bisogna includere nella configuratiuon.jsp:
- Un action url utilizzato dal form per inviare le configurazione al sistema;
<liferay-portlet:actionURLvar="configurationURL"
portletConfiguration="true">
</liferay-portlet:actionURL>
- Il form con:
- le configurazioni: un campo di testo e un campo di selezione legati alle due variabili recuperate;
- un pulsante per l’invio del form;
- la action di update.
< aui:form method= "post" action= " <%=configurationURL.toString()%> "
name= "fm" >
<aui:input name="<%=Constants.CMD%>" type="hidden"value="<%=Constants.UPDATE%>" />
< aui:input label= "label-statusworkflow-viewmode-color-count-tasks-user-roles-full" name= "preferences--statusworkflow-color-count-tasks-user-roles-full--"
value = " <%= colorCountTasksUserRolesFull %> " size= "15" maxlength= "15" />
< aui:select label= "label-statusworkflow-show-tooltip"
name = "preferences--statusworkflow-show-tooltip--" >
< aui:option selected= " <%=showTooltip%> " label= "yes" value= " <%=Boolean.TRUE%> " />
< aui:option selected= " <%=!showTooltip%> " label= "no" value= " <%=Boolean.FALSE%> " />
</ aui:select >
<aui:button-row>
< aui:button type= "submit" />
</ aui:button-row>
</ aui:form >
A questo punto liferay farà tutto il “lavoro sporco” ovvero salverà nel database le configurazioni per questa specifica istanza del portlet.
N.B.queste non saranno propagate ad altre istanze del portlet né in questa pagina né in altre pagine del portale.
Per recuperare ed utilizzare le configurazioni nella view.jsp (o in altre jsp) includete la init.jsp e recuperate e memorizzate le variabili come fatto precedentemente nella creazione della configuration.jsp.
Note sullo sviluppo
Per aggiungere configurazioni al portlet è necessario accertarsi che:
- Siano utilizzati i componenti del Form di Alloy UI;
- il “name” utilizzato nei nostri componenti del form sia preceduto con preferences-- e finisca con --.
N.B.Liferay salverà il nome della preferenza senza il prefisso e suffisso detto sopra.
Consigli per lo sviluppo
Per portlet semplici composte da poche pagine, in cui le configurazioni sono utilizzate in tutte le nostre jsp, potrebbe essere utile includere la memorizzazione delle variabili locali direttamente nella init.jsp. Questo consentirà di ottimizzare il tempo di modifica, aggiunta e creazione di nuove configurazioni.
Spero che questo articolo possa esservi d’aiuto per lo sviluppo dei vostri portlet.
Rimango a disposizione per chiarire ogni eventuale dubbio.
Al prossimo articolo!