Mi è capitato nello sviluppare una portlet custom di aver bisogno
della scelta di un file dalla document library : ho cercato quindi di integrare la dialog che liferay usa di suo nel mio progetto.
Andiamo a vedere come realizzare l'integrazione.
Nella nostra jsp custom ovviamente andremo a creare un bottone od altro a cui associare l'evento di apertura della dialog ed un campo hidden in cui andare a salvare l'UUID od altro relativamente al file scelto :
ad esempio :
<aui:button name="choose-document" value="somevalue"/>
<aui:input name="document-uuid" value="somevalue" type="hidden"/>
a questo punto creiamo uno script AUI con cui andiamo ad aprire una dialog passandogli come URL quello della portlet sorgente di Liferay
<aui:script use="liferay-portlet-url,liferay-util-window">
A.one('#<portlet:namespace/>choose-document').on(
'click',
function(event) {
var url = Liferay.PortletURL.createRenderURL();
url.setPortletId('<%=PortletKeys.JOURNAL %>');
url.setWindowState('<%=LiferayWindowState.POP_UP.toString() %>');
Liferay.Util.openWindow(
{
dialog: {
someoptions .....
},
title: 'someTitle',
uri: url.toString()+'&_15_struts_action=%2Fjournal%2Fselect_document_library&_15_groupId=<%=themeDisplay.getScopeGroupId()%>'
});
});
</aui:script>
Non spaventatevi se vedete che la portlet key fa riferimento alla portlet del Journal Article.
A questo punto nella dialog verrà utilizzata la portlet di scelta del file integrata in liferay, l'unica cosa che ci resta da fare è "intercettare" la scelta effettuata in suddetta portlet :
creiamo un secondo script aui , ad esempio :
<aui:script>
Liferay.provide(
window,
'<%=PortalUtil.getPortletNamespace(PortletKeys.JOURNAL)%>selectDocumentLibrary',
function(contextPath,uuid,title,version) {
var A = AUI();
A.one('#<portlet:namespace/>document-uuid').val(uuid);
},
['aui-base']
);
</aui:script>
Si osservi che i parametri che possiamo utilizzare che ci vengono forniti dalla funzione intercettata sono : contextPath,uuid,title,version .. se avete bisogno di altre informazioni potete utilizzare l'uuid ed effettuare una chiamata Ajax per tirarle fuori.
Nel caso invece che la scelta ricada su di una cartella della document library e non di un file, la cosa puo' essere realizzata in maniera del tutto analoga
<!-- script che richiama la funzionalità liferay di selezione della cartella -->
<aui:script use="liferay-portlet-url">
A.one('#<portlet:namespace/>button-open-dialog-folder-choose').on(
'click',
function(event) {
var url = Liferay.PortletURL.createRenderURL();
url.setPortletId('<%=PortletKeys.DOCUMENT_LIBRARY%>');
url.setParameter('struts_action', '/document_library/select_folder');
url.setWindowState('<%=LiferayWindowState.POP_UP.toString() %>');
window.open(url.toString(), "SomeTitle", "width=550,height=450");
});
</aui:script>
per "intercettare" :
<aui:script>
Liferay.provide(
window,
'<%=PortalUtil.getPortletNamespace(PortletKeys.DOCUMENT_LIBRARY)%>selectFolder',
function(folderId,folderName,isSupportMetaData,isSupportSocial) {
var A = AUI();
A.one('#some-hidden-input').val(folderId);
},
['aui-base']
);
</aui:script>
In questo caso i parametri utilizzabili sono folderId,folderName,isSupportMetaData,isSupportSocial.
Hope this help.