liferay
Ganchos en Liferay
Buscar..
Observaciones
Esto funciona con Liferay Portal hasta la versión 6.2.
JSP Hook
Los ganchos JSP son un complemento especial de por vida que permite modificar el portlet principal jsp-s, digamos que desea modificar el portlet de inicio de sesión para mostrar ¡ Welcome in my custom login! .
La estructura mínima para un complemento de gancho es la siguiente:
[project-name]-hook/
└── docroot/
├── WEB-INF/
│ ├── src/
│ ├── lib/
│ ├── liferay-hook.xml
│ ├── liferay-plugin-package.properties
│ └── web.xml
└── META-INF/
├── custom_jsps/
└── MANIFEST.MF
liferay-hook.xml es el archivo que distingue el tipo de gancho que está utilizando, aquí define dentro de la etiqueta gancho el parámetro adecuado para el gancho, para el gancho JSP:
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<custom-jsp-dir>/custom_jsps</custom-jsp-dir>
</hook>
login.jsp se encuentra en Liferay en /docroot/html/portlet/login/login.jsp , para hacer un gancho de esto necesitamos agregar un jsp con el mismo nombre y ruta en nuestra carpeta custom_jsps .
Cuando se implementa el gancho, Liferay buscará en el liferay-hook.xml el valor custom-jsp-dir y reemplazará todas las JSP del portal con las que se encuentran en este directorio. Los jsp originales se guardan con el nombre <orginal name>.portal.jsp para ser restaurados en caso de <orginal name>.portal.jsp de <orginal name>.portal.jsp del gancho.
Incluso podemos llamar a los JSP originales en el nuevo JSP modificado si queremos mantener el código para que sea adaptable a las actualizaciones o actualizaciones de la versión de la plataforma Liferay subyacente. Para hacer esto, en su JSP personalizado use el siguiente patrón:
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
donde { JSP file's path } en este caso será portlet/login/login.portal.jsp . Hacer esto se llama extender el jsp original .
Entonces podemos agregarle contenido con:
<%
contentHtml = StringUtil.add("Stuff I'm adding BEFORE the original content", contentHtml,"\n");
contentHtml = StringUtil.add(contentHtml,"Stuff I'm adding AFTER the original content","\n");
%>
<%= contentHtml %>
Puntales ganchos de acción
Este tipo de Hook se puede usar para anular el portal central (por ejemplo, c/portal/login ) y las acciones de portlet struts (por ejemplo, /login/forgot_password ), estas acciones para Liferay Portal se especifican en un archivo struts-config.xml en su WEB-INF Carpeta WEB-INF Para anular una acción:
- en el archivo
liferay-hook.xmlde su complemento dedocroot/WEB-INFendocroot/WEB-INF, agregue un elementostruts-actiondentro del elemento hook. - Dentro
struts-actionelementostruts-action, agreguestruts-action-pathque especifique la ruta de acción que está reemplazando ystruts-action-implque especifica su clase de acción personalizada. Esto parece:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- Cree una clase de acción de portlet de Struts que amplíe
BaseStrutsPortletAction. Un ejemplo de esta clase es:
public class ExampleStrutsPortletAction extends BaseStrutsPortletAction {
public void processAction(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {
System.out.println("Custom Struts Action");
originalStrutsPortletAction.processAction(originalStrutsPortletAction,
portletConfig, actionRequest, actionResponse);
}
public String render(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, RenderRequest renderRequest,
RenderResponse renderResponse) throws Exception {
System.out.println("Custom Struts Action");
return originalStrutsPortletAction.render(null, portletConfig,
renderRequest, renderResponse);
}
}
Invocar el método que se reemplaza, como originalStrutsPortletAction.processAction , no es obligatorio, pero es una buena práctica mantener el comportamiento de la Acción sin cambios con respecto al Portal Liferay. Este tipo de gancho también se puede usar para agregar nuevas acciones de Struts, es lo mismo que modificar una acción existente, en este caso, liferay-hook.xml sería:
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
Hola usuario "Nombre" con ganchos
Este ejemplo mostrará cómo hacer un simple "Hola usuario [nombre]" después del inicio de sesión. El ejemplo se basa en realizar una acción personalizada utilizando un gancho
Desde su terminal de línea de comando, navegue a la carpeta de enlaces de su Plugins SDK. Para crear un proyecto de gancho, debe ejecutar el script de creación. Aquí está el formato a seguir para ejecutar el script:
create. [sh | bat] [nombre del proyecto] "[Nombre de visualización del enganche]"
En Linux y Mac OS X, ingresaría un comando similar al de este ejemplo:
./create.sh Hola-usuario "Hola usuario"
En Windows, ingresarías un comando similar al de este ejemplo:
create.bat Hola-usuario "My Hook"
El asistente de nuevo proyecto de Liferay IDE y los scripts de creación generan proyectos de enlace en la carpeta de enlaces de su SDK de plugin. El SDK de complementos agrega automáticamente "-hook" al nombre de su proyecto.
Ya sea que haya creado su proyecto de enganche desde el IDE de Liferay o desde la línea de comandos, termina con la misma estructura de proyecto (ver antes).
- Determine el evento en el que desea activar su acción personalizada. Busque en la documentación de portal.properties para encontrar la propiedad de evento correspondiente. Sugerencia: las propiedades del evento tienen .event en su nombre. Hay las propiedades de sesión, inicio, cierre y evento del portal en las siguientes secciones de la documentación de portal.properties : Sesión - Eventos de inicio - Eventos de cierre - Eventos del portal
- En su proyecto de gancho, cree una clase Java que amplíe la clase com.liferay.portal.kernel.events.Action. Reemplace el método Action.run (HttpServletRequest, HttpServletResponse) .
import com.liferay.portal.kernel.events.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.liferay.portal.model.User;
import com.liferay.portal.util.PortalUtil;
public class HelloUser extends Action {
public void run(HttpServletRequest req, HttpServletResponse res) {
User user = PortalUtil.getUser(req);
System.out.println("Hello User "+user.getScreenName());
}
}
Importante: si su acción accede al objeto HttpServletRequest, extienda com.liferay.portal.kernel.events.Action; de lo contrario, extienda com.liferay.portal.struts.SimpleAction.
Cree un archivo de propiedades, portal.properties , dentro de la carpeta docroot / WEB-INF / src de su proyecto hook. Luego agregue el nombre de la propiedad de evento del portal que corresponde al evento en el que desea realizar su acción. Especifique el nombre completo de su clase de acción como el valor de la propiedad.
`login.events.post=HelloUser`Por ejemplo, para realizar una acción de clase justo antes de que el portal inicie sesión en un usuario, debe especificar la propiedad login.events.pre con su clase de acción como su valor. Podría parecerse a esta configuración de propiedad.
Importante: ya que las propiedades del portal como login.events.pre aceptan varios valores, debe agregar sus valores a los valores existentes. Puede modificar repetidamente las propiedades de ganchos adicionales.
Solo modifique una propiedad del portal que acepte un valor único de un solo complemento de enlace. Si modifica el valor de una propiedad de varios complementos, Liferay no sabrá qué valor usar.
- Edite su archivo docroot / WEB-INF / liferay-hook.xml y agregue su
nombre del archivo de propiedades del portal del gancho como el valor para el
<portal-properties>...</portal-properties>dentro de su
El elemento<hook>...</hook>. Por ejemplo, si el nombre del archivo de propiedades de su gancho es portal.properties , especificaría este elemento:
<portal-properties>portal.properties</portal-properties>
- Implemente su enganche, vaya a su ruta de enganche e ingrese a
ant clean deployverá la .war en la carpeta dist.
Ahora, si inicia sesión en liferay, verá en el registro del servidor un mensaje como "Hola, administrador del usuario".
Modelo Listener Hook
Fondo
Los ganchos de escucha del modelo son un tipo de complemento Liferay que escucha los eventos tomados en un modelo y ejecuta el código en respuesta. Los ganchos de escucha de modelo son similares a los ganchos de acción de Struts personalizados, ya que responden a una acción realizada en el portal. Sin embargo, mientras que las acciones de Struts responden a una acción realizada por un usuario, un escucha de modelo responde (antes o después) de un evento que involucra un modelo de Liferay.
Diferencias
Aquí hay algunos ejemplos de Struts Actions v. Model Listeners para comparación.
- Puntales de acción
- Inicio de sesión de usuario
- Creación de cuenta
- Ampliar sesión
- Mover carpeta
- Escucha modelo
- Después de crear la carpeta
- Cuando la información del usuario se actualiza
- Después de eliminar el marcador
- Antes de que se haga una asociación de roles.
El mejor recurso para aprender la arquitectura de Liferay es a través de su código fuente. Todos sus archivos de origen se encuentran en GitHub y al ver sus JavaDocs. Puede ver todos los modelos de portal principales en los JavaDocs y todas las Acciones de Struts en el GitHub.
Ejemplo
En este tutorial, desarrollaremos una escucha de modelo que envía un correo electrónico a un usuario después de que se crea su cuenta por primera vez. Para hacer esto, vamos a escribir una clase llamada UserModelListener que extenderá la BaseModelListener de Liferay. Repasaremos brevemente la creación de ganchos y cubriremos las modificaciones necesarias a los siguientes archivos de configuración
portal.propiedades
liferay-hook.xml
Empezando
Para comenzar a desarrollar su gancho de escucha de modelo, primero debe iniciar su aplicación Liferay IDE o Liferay Developer Studio.
Tanto Liferay IDE como Liferay Developer Studio son entornos de desarrollo Eclipse personalizados. Son sorprendentemente similares y un conjunto de direcciones debería ser suficiente para ambos entornos.
Dentro de tu entorno de desarrollo ejecuta los siguientes pasos.
- En la esquina superior izquierda, haga clic en Archivo
- Pase el mouse sobre Nuevo
- Haga clic en Proyecto Liferay Plugin
Usted generará esta ventana.
Por favor ingrese la información como se muestra arriba
- Nombre del proyecto: User-Model-Listener
- Seleccione Usar ubicación predeterminada
- Tipo de construcción: hormiga
- Tipo de complemento: Gancho
Asegúrese de que su proyecto se encuentre dentro de su directorio de ganchos SDK de Liferays Plugins . Deberá seleccionar su SDK y su Runtime en consecuencia.
En la perspectiva de su Explorador de paquetes verá la siguiente estructura de directorios.
Desarrollo del oyente
Ahora que ha creado su gancho, deberá crear su clase personalizada UserModelListener . Esta clase ampliará la clase BaseModelListener de Liferay.
La clase BaseModelListener de Liferay es una clase abstracta que implementa la interfaz ModelListener. No desea implementar la interfaz ModelListener directamente, ya que le exigirá que invalide todos sus métodos.
La interfaz ModelListener le proporciona los siguientes métodos a través de la clase abstracta BaseModelListener .
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
Cree su clase UserModelListener dentro del siguiente directorio. Para crear la clase a través de la GUI simplemente ejecute los siguientes comandos
- Haga clic en Archivo en la esquina superior izquierda
- Pase el mouse sobre Nuevo
- Haga clic en clase
docroot/
WEB-INF/
src/
Ingrese la información que se muestra a continuación
Dentro de su clase UserModelListener pegue el siguiente código
package com.example.hook;
import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User;
import javax.mail.internet.InternetAddress;
public class UserModelListener extends BaseModelListener<User> {
private User user = null;
@Override
public void onAfterCreate(User user) throws ModelListenerException {
this.user = user;
if(isValidEmail()) {
sendEmail("[email protected]", user.getEmailAddress(), "Welcome!", "Your account is created!");
}
}
private boolean isValidEmail() {
return Validator.isNotNull(user.getEmailAddress()) && Validator.isAddress(user.getEmailAddress());
}
private void sendEmail(String from, String to, String subject, String body) {
try {
MailServiceUtil.sendEmail(new MailMessage(new InternetAddress(from), new InternetAddress(to), subject, body, false));
} catch (Exception e) {
System.err.print("E-Mail spawned by User Model Listener failed to " + user.getFullName() + " with message " + e.getMessage());
}
}
}
Configuración de propiedades
Para configurar la asociación entre nuestro oyente personalizado y nuestro modelo necesitamos hacer algunos ajustes finales. En primer lugar, cree un nuevo archivo portal.properties en el siguiente directorio.
docroot/
WEB-INF/
src/
+ portal.properties
Solo se necesita agregar una línea al archivo.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Podemos generalizar esto diciendo que, para cualquier escucha de modelo, creamos que el valor de las propiedades asociadas debe estar en la forma de
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
En otras palabras, si escribimos una clase CustomerDLFolderModelListener , empaquetada dentro de com.example.code , para el modelo DLFolder tendríamos la siguiente propiedad
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
Por último, ubique su archivo liferay-hook.xml. En la vista Fuente , escriba lo siguiente.
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
Explicación
- La línea uno es un prólogo opcional que especifica la versión del documento y (en algunos casos) el conjunto de caracteres.
- La línea 2 es una Definición DocType formal (DTD) que define explícitamente qué elementos y atributos son válidos
- Las líneas 3 y 5 están formadas por el elemento principal de enlace (uno de los elementos válidos admitidos por esta DTD)
- La línea 4 anula y extiende el archivo portal.properties en $ {liferay.home}
Para ver qué otros elementos se pueden usar en este archivo XML, puede hacer referencia a la URL dentro de la Definición de DocType . Esto es estándar para todos los archivos XML y SGML con una DTD . Otro ejemplo de un archivo XML de Liferay con un DTD es service.xml (implementación de ORM de Liferay basada en Hibernate ).
Construir e implementar
Construir y desplegar ganchos es un proceso simple. El desarrollo de Liferay Plugin es compatible con la compilación y la automatización de dependencias con
- Hormiga
- Hiedra
- Maven
- Gradle
En nuestro ejemplo utilizamos Ant para la automatización de la construcción. El archivo build.xml contiene los comandos de compilación (conocidos como objetivos en Ant ). Para construir su gancho simplemente ejecute los siguientes comandos.
- Encuentra tu archivo build.xml
- En su IDE, arrastre el archivo build.xml a la perspectiva Ant
- Expande el archivo y ejecuta todos los objetivos.
En su vista de consola debería ver algo similar a lo siguiente
Buildfile: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\build.xml
all:
clean:
[delete] Deleting directory C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
clean-portal-dependencies:
compile:
merge:
compile-import-shared:
[mkdir] Created dir: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[copy] Copying 5 files to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\lib
compile-java:
[copy] Copied 3 empty directories to 3 empty directories under C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[javac] Compiling 1 source file to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
merge:
war:
clean-portal-dependencies:
[zip] Building zip: C:\liferay-plugins-sdk-6.2-ee-sp11\dist\User-Listener-Hook-hook-6.2.10.1.war
deploy:
[copy] Copying 1 file to C:\liferay-portal-6.2-ee-sp11\deploy
BUILD SUCCESSFUL
Total time: 7 seconds
Con su Hook construido correctamente, ahora es el momento de iniciar su portal e implementarlo. Para iniciar su servidor y desplegar el Hook, ubique la perspectiva del Servidor .
- Haga clic derecho en su servidor y haga clic en Agregar o quitar
- Localice User-Listener-Hook en la selección Disponible
- Una vez resaltado haga clic en el botón Agregar y haga clic en Aceptar
- Haga clic en el botón Reproducir en la perspectiva Servidor
Déjeme saber si tiene alguna pregunta, comentario, inquietud, etc. ¡Todos los comentarios constructivos son muy apreciados!




