Quando è necessario selezionare una cartella della Document Library di Liferay, una pratica alternativa all'implementazione degli ItemSelector
, e nello specifico dei FileItemSelector
, è l'invocazione tramite javascript della procedura nativa di selezione cartella della Document Library di Liferay.
Vediamo come fare in Liferay 7.0.
Per prima cosa è necessario individuare quali sono i file che contengono le funzioni javascript che "invocano" la procedura di selezione della cartella.
Il package jar contenente i sorgenti è: "com.liferay.document.library.web-3.0.16-sources.jar"
All'interno del package nel percorso "\META-INF\resources\document_library\" si trovano i file .jsp di nostro interesse, nello specifico: "configuration.jsp" e "init.jsp"
Dal file "configuration.jsp" possiamo estrapolare lo script javascript di nostro interesse e inserirlo nel file .jsp di nostro interesse:
<aui:script>
AUI.$('#<portlet:namespace />selectFolderButton').on(
'click',
function(event) {
Liferay.Util.selectEntity(
{
dialog: {
constrain: true,
destroyOnHide: true,
modal: true,
width: 600
},
id: '_<%= HtmlUtil.escapeJS(portletResource) %>_selectFolder',
title: '<liferay-ui:message arguments="folder" key="select-x" />',
<liferay-portlet:renderURL portletName="<%= portletResource %>" var="selectFolderURL"
windowState="<%= LiferayWindowState.POP_UP.toString() %>">
<portlet:param name="mvcRenderCommandName" value="/document_library/select_folder" />
<portlet:param name="folderId" value="<%= String.valueOf(rootFolderId) %>" />
<portlet:param name="ignoreRootFolder" value="<%= Boolean.TRUE.toString() %>" />
<portlet:param name="showMountFolder" value="<%= Boolean.FALSE.toString() %>" />
</liferay-portlet:renderURL>
uri: '<%= HtmlUtil.escapeJS(selectFolderURL.toString()) %>'
},
function(event) {
var folderData = {
idString: 'rootFolderId',
idValue: event.folderid,
nameString: 'rootFolderName',
nameValue: event.foldername
};
Liferay.Util.selectFolder(folderData, '<portlet:namespace />');
}
);
}
);
</aui:script>
Per poter utilizzare questo codice sarà necessario apportare qualche modifica, ma prima di tutto dovremo inserire nel nostro file .jsp il pulsante con nome "selectFolderButton" cui è associato l'evento di click.
Ad esempio:
<aui:button name="selectFolderButton" value="choose-directory" />
Nel codice javascript ci sono due variabili Java che vengono passate come parametri nella liferay-portlet:renderURL
devono essere valorizzate: portletResource
e rootFolderId
.
portletResource
lo valorizziamo a:
<% String portletResource = "com_liferay_document_library_web_portlet_DLPortlet"; %>
Il valore impostato corrisponde alla costante DOCUMENT_LIBRARY della classe DLPortletKeys
del pacakge com.liferay.document.library.constants.
public class DLPortletKeys {
public static final String DOCUMENT_LIBRARY ="com_liferay_document_library_web_portlet_DLPortlet";
Utilizziamo direttamente il valore della costante passato come stringa per problemi di conflitti di librerie che si avrebbero utilizzando la classe DLPortletKeys.
rootFolderId
deve essere valorizzato al valore dell'id della folder di root, questo può essere impostato, ad esempio a "0" se vogliamo partire dalla root della Document Library, oppure a un valore ricavato dal contesto applicativo.
Una volta cliccato il pulsante selectFolderButton
si aprirà una pop-up window dalla quale sarà possibile esplorare l'albero delle cartelle e selezionare la cartella desiderata con il pulsante "Scegli".
Una volta effettuata la selezione, nell'oggetto javascript folderData
vengono ritornati i dati relativi alla cartella selezionata da UI: idValue
, nameValue
.