Recentemente mi è capitato di dover gestire una situazione un pò "articolata" relativamente all'interazione in pagina tra 2 portlet, con Ligeray 6.1.1.
Senza entrare nel dettaglio, poco interessante per il lettore, segnalo solamente che non era possibile utilizzare nè public render parameter nè eventi.
Pertanto, in un momento di euforia (o di follia...), mi è venuto in mente di tentare di effettuare da una portlet il refresh di un'altra portlet, senza passare dal server ma facendo tutto in pagina con Alloy.
Dopo un pò di prove e di reverse engineering sui sorgenti del portale ecco la soluzione, quasi troppo semplice, che vi riporto nel caso vi servisse:
<aui:script use="aui-base">
var data = {
portletAjaxable: true,
param1: value1,
param2: value2,
...
};
Liferay.Portlet.refresh('#p_p_id_<PORTLETID>_', data);
</aui:script>
Cominciamo dal fondo per capire come funziona.
La funzione da invocare si chiama, guarda caso, refresh ed è contenuta nell'oggetto globale Liferay.Portlet; tale funzione richiede 2 parametri:
- il primo parametro è l'identificativo (in termini di HTML) del contenitore della portlet e si ricava unendo il prefisso #p_p_id_ con l'identificativo della portlet che deve essere refreshata (ad esempio 2_WAR_MiaPortlet), il tutto chiuso dall'underscore (occhio a non dimenticarlo!);
- il secondo parametro è un oggetto JSON contenente gli eventuali parametri da inviare alla portlet.
Quello che succede quando la funzione refresh viene invocata è una chiamata Ajax di tipo renderURL a cui vengono passati tutti i parametri. Pertanto nel metodo doView della seconda portlet è possibile recuperare i parametri normalmente e fare quello che serve:
@Override
public void doView(RenderRequest renderRequest,
RenderResponse renderResponse)
throws IOException, PortletException {
String value1 = ParamUtil.getString(renderRequest, "param1");
String value2 = ParamUtil.getString(renderRequest, "param2");
// altri parametri...
renderRequest.setAttribute("param1", value1);
renderRequest.setAttribute("param2", value2);
// altri parametri...
super.doView(renderRequest, renderResponse);
}
Enjoy!