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

Gestire l'avatar dell'utente da una portlet custom

Vi è mai capitato di dover gestire l'avatar dell'utente da una portlet custom? Se lo avete fatto e non ci siete saltati fuori ecco come fare con poco sforzo.

Innazitutto diciamo che esiste una comodissima taglib di portale che fa già tutto (o quasi) quello che serve: liferay-ui:logo-selector. L'unica difficoltà è capire come configurarla correttamente.

Tutto il codice da scrivere andrà inserito unicamente all'interno della JSP; supponiamo quindi che:

  • user sia l'utente corrente (tipicamente ottenibile mediante themeDisplay.getUser());
  • selUser sia l'utente di cui gestire l'avatar.
<c:choose>
   <c:when test='<%=UsersAdminUtil.hasUpdateFieldPermission(permissionChecker, user, selUser, "portrait") %>'>
      <liferay-portlet:renderURL
         plid="<%=PortalUtil.getControlPanelPlid(renderRequest) %>"
         portletName="<%=PortletKeys.MY_ACCOUNT %>"
         refererPlid="<%=themeDisplay.getPlid() %>"
         var="editUserPortraitURL"
         windowState="<%=LiferayWindowState.POP_UP.toString() %>"
      >
         <liferay-portlet:param name="struts_action" value="/my_account/edit_user_portrait" />
         <liferay-portlet:param name="redirect" value="<%=PortalUtil.getCurrentURL(request) %>" />
         <liferay-portlet:param name="p_u_i_d" value="<%=String.valueOf(selUser.getUserId()) %>" />
         <liferay-portlet:param name="portrait_id" value="<%=String.valueOf(selUser.getPortraitId()) %>" />
      </liferay-portlet:renderURL>

      <liferay-ui:logo-selector
         currentLogoURL="<%=selUser.getPortraitURL(themeDisplay) %>"
         defaultLogoURL="<%=UserConstants.getPortraitURL(themeDisplay.getPathImage(), selUser.isMale(), 0) %>"
         editLogoURL="<%=editUserPortraitURL %>"
         imageId="<%=selUser.getPortraitId() %>"
         logoDisplaySelector=".user-logo"
      />

      <script type="text/javascript">
      function _<%= PortletKeys.MY_ACCOUNT %>_changeLogo(url) {
         <portlet:namespace />changeLogo(url);
      }
      </script>
   </c:when>
   <c:otherwise>
      <img alt='<liferay-ui:message key="portrait" />' src="<%=selUser.getPortraitURL(themeDisplay) %>" />   </c:otherwise>
</c:choose>

Innanzitutto verifichiamo che l'utente corrente (user) abbia il permesso di modificare il campo portrait dell'utente selUser; senza il permesso visualizziamo solamente l'immagine dell'utente.

Dopodichè definiamo la URL che punta alla pagina di selezione, crop e modifica dell'immagine dell'utente; questa pagina è di portale e contiene tutto il codice necessario (Java e Javascript) allo scopo. Dobbiamo solamente crearla nel modo corretto, ossia facendola puntare principalmente alla portlet MY_ACCOUNT come indicato; tutti gli altri parametri sono necessari e sono stati ricavati analizzando i sorgenti di portale.

Quindi abbiamo inserito la taglib che innesca il procedimento di modifica dell'avatar; i parametri sono abbastanza ovvi e rappresentano i dati dell'avatar corrente dell'utente e della URL di modifica vista sopra.

Alla fine di tutto abbiamo semplicemente ridefinito la funzione Javascript changeLogo; questo si rende necessario perchè la pagina di modifica dell'avatar opera nel contesto della portlet MY_ACCOUNT e quindi cerca di eseguire la funzione con il proprio namespace, ossia _2_changeLogo. Ma la taglib renderizza in pagina la medesima funzione ma con il namespace della nostra portlet custom; di conseguenza a runtime la funzione _2_changeLogo non esiste. Quindi tutto quello che dobbiamo fare è definire la funzione con il nome invocato dalla portlet MY_ACCOUNT che non fa altro che invocare la funzione con il namespace della portlet custom; funzione che, ricordo, esiste già in pagina in quanto creata dalla taglib.

Buon avatar a tutti!

Commenti
Nessun commento. Vuoi essere il primo.