bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

La portlet si vede, la portlet non si vede.. ;)

Buongiorno a tutti! :)

Il tema che affronto oggi è una di quelle cose che, sicuramente, vi sarà stata chiesta chissà quante volte dai vostri project manager di fiducia :) ma che avrete in larga parte sbolognato con dei laconici "ma va, ci vuole troppo", "no: è impossibile; l'unico modo per farlo è usando i permessi" o altre affermazioni tipo queste! :)

Oggi infatti vi do un piccolo suggerimento su come far apparire o scomparire una portlet dalla pagina utilizzando il codice applicativo e non agendo sui permessi.

Intanto un po' di background, giusto per allinearci.

Tutti quanti voi avrete notato (ma magari non avete mai "collegato".. :)) che il View Content Display ha esattamente questa funzionalità.

Eggià: quando voi ponzate in pagina un View Content Display, questo appare "grigino" e, se fate logout, non lo vedete presente sulla pagina.

Ecco cosa intendo per "grigino":

Come mai? Come accade questa magia?

Per capirlo bisogna, as usual, armarsi di coraggio e fare un po' di sano reverse engineering nel codice del portale. Questa volta, però, la soluzione è davvero molto semplice! :)

PortalImpl questa sconosciuta..

Se andate a vedere il codice della PortalImpl (che ovviamente implementa l'interfaccia Portal e che sta alla base della PortalUtil), noterete che è una classe piena di metodi di utility che sicuramente vi torneranno utili in futuro :), come ad esempio "public void addPageKeywords(String keywords, HttpServletRequest request)" che, come avrete sicuramente intuito già da soli, permette di aggiungere alle keyword specificate sulla pagina un set di keyword aggiuntive arbitrarie (nota: separate dalla solita virgola.. :)) in maniera applicativa.

Tra questi metodi, tornando al nostro caso funzionale, trovate anche un esoterico :)

public String renderPortlet(

ServletContext servletContext, HttpServletRequest request,

HttpServletResponse response, Portlet portlet, String queryString,

String columnId, Integer columnPos, Integer columnCount,

String path, boolean writeOutput)

che ha lo scopo, come potrete immaginarvi, di eseguire il render del portlet.

Andando ad analizzarne l'implementazione, ad un certo punto troverete questa chiamata:

Boolean portletConfiguratorVisibility =

(Boolean) request.getAttribute(

WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);

e subito dopo un controllo che verifica se l'utente ha o meno i permessi di configurare la portlet:

if (!PortletPermissionUtil.contains(

themeDisplay.getPermissionChecker(),

themeDisplay.getPlid(), portlet.getPortletId(),

ActionKeys.CONFIGURATION)) {

showPortlet = false;

}

Ovviamente ora penserete "Ah, ho capito! È questo flag 'showPortlet' che fa la magia!

No: errato! :D

La magia è data dal fatto che l'utente abbia o meno i permessi di configurare la portlet, il flag 'showPortlet' viene poi usato più avanti nel codice, ma non devo per forza dirvi tutto io: se siete curiosi almeno la metà di quanto lo sono io potete andare a vedere come funziona tutto il giro.. ;)

A questo punto avrete già capito che cosa dovete fare per poter rendere la vostra portlet "grigina"! ;)

Puntualizzo che il fatto che sia grigina significa che è visibile solamente per chi ha il permesso di configurarla oppure per l'Administrator.. Se farete logout una volta averla resa "grigina" :) noterete che non sarà più visibile dalla pagina!

A questo punto non rimane che mostrarvi il codice che fa la magia:

if (!visibility)

renderRequest.setAttribute(WebKeys.PORTLET_CONFIGURATOR_VISIBILITY,

Boolean.TRUE);

That's it! ;)

Quando la portlet non sarà visibile, quindi quando gestirete voi il flag di visibilità a livello applicativo, la portlet non comparirà sulla pagina!

Che ne pensate? Questa è tricky, vero? :)

Vi era mai capitato di farlo? Avete trovato altre vie??

Dai: raccontate le vostre esperienze nei commenti qui sotto!! ;)

Alla prossima! :)

Precedente
Commenti
Aggiungi Commento
Marco Napolitano
Ciao Jader,
il metodo indicato sopra sembra essere disponibile solamente per la versione 6.1; nella versione 6.2 è stato per caso spostato o eliminato?
Inviato il 17/07/15 15.24.
Jader Jed Francia
Hey! Non mi ero accorto della cosa: grazie della segnalazione Napo! ;)
Allora, si: è valida anche nella 6.2 (come funzionamento), però il metodo non è più nella PortalUtil ma nella PortletContainerImpl (metodo _doRender(HttpServietRequest, HttpServletResponse, Porltet)..

Il funzionamento è cambiato -a livello di codice- ma è rimasto uguale a livello concettuale.

Tradotto: se imposti la tua WebKeys nella request la portlet ha il comportamento che ho descritto nel post.
Provare per credere (e riportare eventuali cavolate mie, grazie.. ;))

Ciao, J.
Inviato il 25/08/15 17.13 in risposta a Marco Napolitano.