Aggregatore Risorse Aggregatore Risorse

Indietro

Modifica delle pagine JSP del portale tramite hook

Grazie a un hook, è possibile effettuare una modifica delle pagina JSP del portale e delle taglib Liferay di tipo "non distruttivo", mantenendo cioè un backup dei file originari. A tale scopo, è sufficiente indicare in liferay-hook.xml la cartella del progetto che conterrà le nuove pagine JSP:

<hook>

<custom-jsp-dir>/META-INF/custom-jsps</custom-jsp-dir>

</hook>

La cartella del progetto contenente le JSP avrà dunque un percorso completo pari a docroot/WEB-INF/src/META-INF/custom-jsps. All'interno di questa dovranno poi essere posizionate le pagine del portale che si desidera sovrascrivere, rispettando il percorso dei file originali e utilizzando la cartella custom-jsps come "radice": ad esempio, se si desidera sovrascrivere la pagina portal-web/docroot/html/portlet/blogs/view.jsp, sarà necessario creare un file view.jsp all'interno del progetto hook, in docroot/WEB-INF/src/META-INF/custom-jsps/html/portlet/blogs.

Durante il deploy dell'hook, il file JSP originale in Liferay sarà quindi rinominato in <pagina>.portal.jsp, mentre al suo posto sarà copiato quello contenuto nel .war del plugin hook. Viceversa, rimuovendo il plugin hook, Liferay ripristinerà le pagine sovrascritte dall'hook. Sarà dunque necessario prestare attenzione al caso di hook multipli che vanno a insistere sulla stessa pagina JSP del portale: un hook, infatti, sovrascriverà unicamente le JSP degli hook precedentemente già installati.

Il nuovo file JSP può sostituire completamente quello originale, oppure, più semplicemente, può essere strutturato in modo tale da "ereditare" il comportamento della JSP di Liferay: in questo caso, la JSP contenuta nell'hook dovrà sì avere lo stesso nome della JSP da cui intende "ereditare", ma al suo interno dovrà essere inserito unicamente il codice aggiuntivo, utilizzando poi la taglib <liferay-util:include> per richiamare la JSP originale, che avrà quindi nome <nome jsp>.portal.jsp. Si preferisce utilizzare tale taglib, e non la semplice direttiva di inclusione <%@ include file="<file jsp>" %>, dal momento che <liferay-util:include> incorpora direttamente il risultato di una JSP, e ciò consente l'inserimento della direttiva di inclusione per la init.jsp.

<%@ include file="/html/portlet/blogs/init.jsp" %>

<div class="portlet-msg-error">Inizio hook di Blogs.view.jsp</div>

<liferay-util:include page="/html/portlet/blogs/view.portal.jsp" />

<div class="portlet-msg-error">Fine hook di Blogs.view.jsp</div>

Nel portale, la cartella html/common contiene le JSP che costruiscono fisicamente la pagina, cioè la porzione superiore e inferiore, nonché la parte centrale di contenuto. Tali JSP vengono invocate dal tema e, a loro volta, interagiscono con le pagine del tema: rappresentano perciò il punto più a basso livello sul quale è possibile agire tramite hook. All'interno di tali porzioni del portale sono già stati previsti dei punti di estensione, ovvero delle pagine JSP con suffisso "-ext", inizialmente vuote, che vengono automaticamente invocate dalle altre pagine. Ad esempio, per inserire del contenuto nella parte inferiore di tutte le pagine, è sufficiente sovrascrivere la pagina bottom-ext.jsp, andando a creare nel progetto hook il file docroot/META-INF/custom-jsps/html/common/themes/bottom-ext.jsp:

<%@ include file="/html/common/init.jsp" %>

<div class="portlet-msg-error">Hook di Bottom EXT</div>

Come detto, il meccanismo di modifica delle pagine JSP del portale tramite hook consente di inserire contenuto in cima o in coda alle JSP originali. E' comunque possibile effettuare operazioni ancora più particolari, come nascondere porzioni della pagina, aggiungere classi CSS a determinati elementi HTML, ecc. Per fare ciò, è certamente possibile copiare nell'hook il file JSP del portale e modificarlo secondo le proprie necessità; tuttavia, dal momento che il codice sorgente di Liferay 6 è licenziato secondo LGPL, anche tali modifiche alle pagine JSP ricadranno nella medesima licenze.

Un approccio meno problematico sul piano del licensing consiste nel processare il risultato della pagina JSP originale del portale tramite un motore di parsing HTML come Jericho, oppure tramite una semplice manipolazione di stringhe. Ad esempio, il codice che segue aggiunge una nuova classe CSS a tutti gli elementi <div> con classe "entry" nella pagina view.jsp del portlet Blogs:

<%@ include file="/html/portlet/blogs/init.jsp" %>

<liferay-util:buffer var="originalPage">
   <liferay-util:include page="/html/portlet/blogs/view.portal.jsp" />
</liferay-util:buffer>

<%= StringUtil.replace(originalPage, "<div class=\"entry \">", "<div class=\"entry corso\">") %>

La taglib

<liferay-util:buffer>
costruisce una variabile stringa contenente il risultato del codice JSP posto al suo interno; tale stringa può poi essere manipolata secondo le proprie necessità.