I cookie ci aiutano a fornire i nostri servizi.

Utilizzando tali servizi, accetti l'utilizzo dei cookie da parte nostra. Per saperne di piu'

Approvo

Quasi un anno fa scrissi un articolo (Come chiudere una Dialog IFrame in Liferay 6.2) su come chiudere una Dialog IFrame in Liferay 6.2.

Sebbene quanto scritto in quell'articolo sia ancora valido, vediamo un metodo alternativo più elegante per fare la stessa cosa.

Cominciamo dal principio e definiamo nella pagina /html/dialog/view.jsp il pulsante che aprirà la dialog.

<liferay-portlet:renderURL var="dialogURL" windowState="<%=LiferayWindowState.POP_UP.toString() %>">
    <liferay-portlet:param name="mvcPath" value="/html/dialog/dialog.jsp" />
</liferay-portlet:renderURL>
<aui:button href="/<%=dialogURL %>" primary="true" useDialog="true" value="open-dialog" />

Il codice sopra non richiede molte spiegazioni, semplicemente apre una render url in una dialog, sfruttando il nuovo attributo useDialog introdotto in Liferay 6.2.

Poi andiamo a definire un form HTML all'interno della pagina della dialog, ossia /html/dialog/dialog.jsp.

<liferay-portlet:renderURL var="redirectURL">
    <liferay-portlet:param name="mvcPath" value="/html/dialog/dialog.jsp" />
</liferay-portlet:renderURL>

<liferay-portlet:actionURL name="save" var="saveURL" /> <aui:form action="<%=saveURL %>" method="post" name="fm"> <aui:input name="redirect" type="hidden" value="<%=redirectURL %>" /> <!-- Some fields --> <aui:button-row> <aui:button type="submit" value="save" /> </aui:button-row> </aui:form>

Sottolineo l'importanza della definizione del parametro redirect che indica a Liferay la pagina verso cui fare redirect (non forward) alla fine dell'elaborazione della processAction; nel caso specifico andiamo a ricaricare la stessa pagina del form. Non dimentichiamo che tutta l'elaborazione è ancora confinata all'interno della dialog.

Il punto focale adesso è sapere che l'infrastruttura di Liferay, al termine della processAction e se tutto è andato a buon fine, inserisce in sessione l'attributo requestProcessed; basterà quindi cercare questo attributo, una volta ricaricata la pagina nella dialog, per capire che l'elaborazione è terminata e che quindi posso chiudere la dialog.

Il codice della pagina /html/dialog/dialog.jsp va quindi leggermente modificato.

<c:choose>
<c:when test='<%=SessionMessages.contains(renderRequest, "requestProcessed") %>'>
<aui:script>
// If needed Liferay.Util.getOpener().<portlet:namespace />aMethod();
Liferay.Util.getOpener().<portlet:namespace />anotherMethod();
// Mandatory to close the dialog Liferay.Util.getWindow().hide(); </aui:script>
</c:when>
<c:otherwise>
<liferay-portlet:renderURL var="redirectURL"> <liferay-portlet:param name="mvcPath" value="/html/dialog/dialog.jsp" /> </liferay-portlet:renderURL>
<liferay-portlet:actionURL name="save" var="saveURL" /> <aui:form action="<%=saveURL %>" method="post" name="fm"> <aui:input name="redirect" type="hidden" value="<%=redirectURL %>" /> <!-- Some fields --> <aui:button-row> <aui:button type="submit" value="save" /> </aui:button-row> </aui:form>
</c:otherwise>
</c:choose>

Come si può notare l'elaborazione della pagina segue un flusso differente in base al test SessionMessages.contains(renderRequest, "requestProcessed").

In particolare è possibile invocare eventuali funzioni Javascript definite, tramite Liferay.provide, nella JSP del chiamante (la pagina /html/dialog/view.jsp) sfruttando l'oggetto Liferay.Util.getOpener(); dopodichè possiamo finalmente invocare la funzione Liferay.Util.getWindow().hide() per chiudere la dialog.

Come potete vedere la soluzione è molto pulita ed elegante anche se ha richiesto un pò di spiegazioni.