Il rilascio di Liferay 6.2 e di AlloyUI 2.0 ha portato alcune modifiche nella gestione delle dialog, rimuovendo alcuni moduli Javascript e deprecandone altri.
Vediamo come gestire il seguente caso d'uso con Liferay 6.2: chiudere una dialog tramite un pulsante posto al suo interno.
Aprire una dialog è un'operazione semplice che richiede però un minimo di attenzione; supponiamo quindi di inserire il pulsante di apertura nella pagina view.jsp e di voler visualizzare nella dialog il contenuto della pagina dialog.jsp. Il procedimento è quello classico illustrato sotto, con la sola particolarità di aggiungere l'attributo id che identifica univocamente la dialog.
<aui:button name="openDialog" type="button" value="open-dialog" />
<liferay-portlet:renderURL var="dialogURL" windowState="<%=LiferayWindowState.POP_UP.toString() %>"> <liferay-portlet:param name="mvcPath" value="/dialog.jsp" /> </liferay-portlet:renderURL> <aui:script use="liferay-util-window"> A.one('#<portlet:namespace/>openDialog').on('click', function(event) { Liferay.Util.openWindow({ dialog: { centered: true, height: 300, modal: true, width: 400 }, id: '<portlet:namespace/>dialog', title: '<liferay-ui:message key="i-am-the-dialog" />', uri: '<%=dialogURL %>' }); }); </aui:script>
All'interno della pagina dialog.jsp potrebbe esserci qualsiasi cosa (come ad esempio un form) e supponiamo che esista un pulsante che inneschi un'elaborazione (leggere e manipolare i campi del form) e la successiva chiusura della dialog stessa.
<aui:button name="closeDialog" type="button" value="close" />
<aui:script use="aui-base">
A.one('#<portlet:namespace/>closeDialog').on('click', function(event) {
// Supponiamo che "data" contenga il risultato dell'elaborazione
var data = ...
// Invocazione una funzione contenente il risultato dell'elaborazione e l'id della dialog
Liferay.Util.getOpener().<portlet:namespace/>closePopup(data, '<portlet:namespace/>dialog');
});
</aui:script>
La funzione getOpener() restituisce la finestra che ha aperto la dialog, ossia view.jsp; pertanto la funzione closePopup va definita proprio all'interno di view.jsp.
<aui:script>
Liferay.provide(
window,
'<portlet:namespace/>closePopup',
function(data, dialogId) {
var A = AUI();
// Si utilizza "data" in qualche modo
// Chiusura della dialog
var dialog = Liferay.Util.Window.getById(dialogId);
dialog.destroy();
},
['liferay-util-window']
);
</aui:script>