bloggers bloggers

Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Marco Napolitano
Messaggi: 78
Stelle: 0
Data: 12/06/20
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Liferay e refresh di una portlet con Alloy UI

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:

  1. 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!);
  2. 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!

Precedente
Commenti
Aggiungi Commento
Enzo
Ciao Marco!
Ottimo articolo, molto interessante. Non è la prima volta che mi servo delle tue perle su Liferay, e per questo ti ringrazio.
Non so se è il posto giusto, ma avrei una domanda da porti: ho la pagina jsp di una portlet che include un'altra jsp con il tag liferay-util:include; secondo te è possibile refreshare solo la jsp inclusa, senza ricaricare l'intera pagina?
Inviato il 14/05/21 9.48.