Hooks en Liferay
Qué es un Hook?
Es una extensión de un componente de Liferay, es decir, tomar un componente que ya posee y sobreescribir ciertas cosas para adecuarlo a nuestras necesidades.
¿Cómo creo un Hook?
Para crear un hook podemos utilizar el arquetipo de maven liferay-hook-archetype
Hook de Asset Publisher
Un asset publisher nos muestra publicaciones que va recolectando de distintas páginas del sitio. Tiene por default 4 formas de mostrarse:
- table
- title-list
- abstracts
- full-content
En este caso, supongamos que ninguna de estas formas nos resultan adecuadas, y que queremos mostrarlo de alguna otra manera. Para esto, debemos realizar lo siguiente:
- Crear el hook con el arquetipo de Maven.
- En la estructura del proyecto, crear un nuevo JSP en WEB-INF/jsp/html/portlet/asset_publisher/display/nuestraVista.jsp
- Una posible implementación de dicho jsp es esta:
<%@ include file="/html/portlet/asset_publisher/init.jsp" %>
<%
List results = (List) request.getAttribute("view.jsp-results");
int assetEntryIndex = ((Integer) request.getAttribute("view.jsp-assetEntryIndex")).intValue();
AssetEntry assetEntry = (AssetEntry) request.getAttribute("view.jsp-assetEntry"); AssetRendererFactory assetRendererFactory = (AssetRendererFactory) request.getAttribute("view.jsp-assetRendererFactory"); AssetRenderer assetRenderer = (AssetRenderer) request.getAttribute("view.jsp-assetRenderer");
boolean show = ((Boolean) request.getAttribute("view.jsp-show")).booleanValue();
request.setAttribute("view.jsp-showIconLabel", true);
String title = (String) request.getAttribute("view.jsp-title");
if (Validator.isNull(title)) { title = assetRenderer.getTitle(locale); }
PortletURL viewFullContentURL = renderResponse.createRenderURL();
viewFullContentURL.setParameter("struts_action", "/asset_publisher/view_content"); viewFullContentURL.setParameter("assetEntryId", String.valueOf(assetEntry.getEntryId())); viewFullContentURL.setParameter("type", assetRendererFactory.getType());
if (Validator.isNotNull(assetRenderer.getUrlTitle())) { if (assetRenderer.getGroupId() != scopeGroupId) { viewFullContentURL.setParameter("groupId", String.valueOf(assetRenderer.getGroupId())); }
viewFullContentURL.setParameter("urlTitle", assetRenderer.getUrlTitle()); }
String summary = StringUtil.shorten(assetRenderer.getSummary(locale), abstractLength);
String viewURL = null;
if (viewInContext) { String viewFullContentURLString = viewFullContentURL.toString();
viewFullContentURLString = HttpUtil.setParameter(viewFullContentURLString, "redirect", currentURL);
viewURL = assetRenderer.getURLViewInContext(liferayPortletRequest, liferayPortletResponse, viewFullContentURLString);
viewURL = HttpUtil.setParameter(viewURL, "redirect", currentURL); } else { viewURL = viewFullContentURL.toString(); }
if (Validator.isNull(viewURL)) { viewURL = viewFullContentURL.toString(); }
String viewURLMessage = viewInContext ? assetRenderer.getViewInContextMessage() : "read-more-x-about-x";
viewURL = _checkViewURL(viewURL, currentURL, themeDisplay);
%>
<%if (assetEntryIndex == 0) {%>
-
<%}%>
-
<%= title%>
<%= summary%>
<a href='<%=viewURL%>'>Leer mas</a>
<%if (assetEntryIndex == results.size()-1) {%>
<%}%>
- Esta implementación utiliza clases de Liferay para obtener los valores a mostrar (en este caso título, descripción y un link)