lunes, 15 de julio de 2019

Liferay 7.2. Navegando entre páginas

  1 comentario
Como en toda página web es necesario conocer cómo navegar entre páginas. Naturalmente usaremos un tag a, pero un portlet de Liferay necesita cierto cuidado dado que se deben pasar parámetros específicos, además de considerar valores precargados dependiendo del caso.

En este post conoceremos un poco la navegación de Liferay considerando el tag liferay-portlet:renderURL.





RenderURL

El URL se crea usando el tag liferay-portlet:renderURL de la siguiente manera:

 <liferay-portlet:renderURL var="editURL">
 <liferay-portlet:param name="mvcPath" value="/edit.jsp"/> 
 </liferay-portlet:renderURL>

Esta es una manera directa de crear un enlace hacia una página en específico, solo que existen dos problemas:

  1. Si deseamos cambiar el destino de ese enlace, tendríamos que buscar todas los enlaces que apunten a esa página y cambiar manualmente.
  2. Si deseas precargar valores antes de mostrar edit.jsp, sería algo dificultoso.
Por eso, la recomendación es una clase que implemente la interfaz com.liferay.portal.kernel.portlet.bridges.mvc.MVCRenderCommand. Esta clase, por convención, debe tener el nombre finalizado por -RenderCommand
. Así:

//...
public class CourseEditRenderCommand implements MVCRenderCommand {
//...

Luego, en la implementación del método, debemos hacer que devuelva la página que queremos mostrar, así:

//...
public class CourseEditRenderCommand implements MVCRenderCommand {

 @Override
 public String render(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException {

  return "/edit.jsp"; //aquí se devuelve la página
 }

}

Y, finalmente, debemos declarar la anotación que declara que esta clase es un Componente de Liferay, así:

//...
@Component(
  immediate = true,
  property = {    
   "javax.portlet.name=" + CoursePortletKeys.COURSE, //el mismo nombre del portlet
   "mvc.command.name=edit-course"                    //el nombre único para llegar a este render
  },
  service = MVCRenderCommand.class                          //servicio de tipo MVCRenderCommand
 )
public class CourseEditRenderCommand implements MVCRenderCommand {
//...


La clase completa es:

package com.apuntesdejava.virtualclassroom.course.portlet;

import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.osgi.service.component.annotations.Component;

import com.apuntesdejava.virtualclassroom.course.constants.CoursePortletKeys;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCRenderCommand;

@Component(
  immediate = true,
  property = {    
   "javax.portlet.name=" + CoursePortletKeys.COURSE, 
   "mvc.command.name=edit-course"
  },
  service = MVCRenderCommand.class
 )
public class CourseEditRenderCommand implements MVCRenderCommand {

 @Override
 public String render(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException {

  return "/edit.jsp";
 }

}

Finalmente, la declaración del URL desde el JSP para llamar será así:
<liferay-portlet:renderURL var="editURL">
 <liferay-portlet:param name="mvcRenderCommandName" value="edit-course"/> <!-- el nombre del render -->
</liferay-portlet:renderURL>

<aui:a href="<%= editURL %>">Editar</aui:a> <!-- usando el enlace -->


Bonus

Es recomendable poner enlaces que permitan regresar a la página anterior, por eso en el init.jsp declararemos las siguientes variables:
<%
 String currentURL = PortalUtil.getCurrentURL(renderRequest);
 String backURL = ParamUtil.getString(renderRequest, "backURL");
%>

Luego, en la declaración del URL, colocar el parámetro backURL apuntando a la página actual:
 <liferay-portlet:renderURL var="editURL">
 <liferay-portlet:param name="mvcRenderCommandName" value="edit-course"/>
 <liferay-portlet:param name="backURL" value="<%= currentURL %>"/>
 </liferay-portlet:renderURL>
 
 <aui:a href="<%= editURL %>">Editar</aui:a>

Y, finalmente, en la página final, debería tener el tag que permita regresar. Ese se llama liferay-ui:header, y se usaría así:
<%@ include file="init.jsp" %>
<liferay-ui:header title="course.edit" backURL="<%= backURL %>"></liferay-ui:header>  

Espero que te haya gustado. Sígueme en mi canal en youtube para crear más contenido así. ¡Bendiciones a todos!

1 comentario :

William Jessie dijo...

Gracias por tomarse el tiempo para compartir este artículo aquí sobre Navegación entre páginas. Su artículo es muy informativo y lo compartiré con mis otros amigos, ya que la información es realmente muy útil. Sigue compartiendo tu excelente trabajo. Diseño paginas web Peru