Crear un Hook en Liferay 6

por

Hoy vamos a ver como podemos hacer nuestro primer hook para Liferay 6.

La primera pregunta que nos surge es ?Que es un Hook?. Un hook es un elemento de liferay que nos permite alterar el funcionamiento por defecto de un portlet de liferay ya existente, como por ejemplo el portlet buscador.

Debemos tener en cuenta que los hooks alteran el funcionamiento del portlet que queramos manteniendo todas sus funcionalidades originales salvo aquello que nosotros alteremos en el Hook.

?Que diferencia hay entre hacer un hook o crear una copia del mismo portlet y luego modificar lo que queramos sobre ese portlet nuevo? La diferencia es que si utilizamos un hook solo tendremos disponible el portlet con la funcionalidad alterada del hook mientras que si creamos un portlet nuevo con las modificaciones oportunas que haríamos con el hook tendremos disponible tanto el portlet original como el nuevo que hemos creado.

Cada uno debe elegir en cada caso que es lo que más le conviene según la situación.

Para empezar a desarrollar los hooks debemos tener instalado el servidor de liferay junto con su plugin SDK. Podemos ver como hacerlo en el post anterior Como instalar Liferay 6.

Una vez instalado el servidor debemos tener el entorno de desarrollo para componentes de Liferay para Eclipse. Podeis ver como instalarlo en otro post anterior Instalar IDE Liferay de Eclipse.

También debemos descargarnos el SRC de Liferay donde podremos encontrar todo el código fuente de Liferay el cual necesitaremos para saber donde debemos modificar y las rutas de cada portlet dentro de Liferay. Podemos descargarlo desde el siguiente enlace, debemos seleccionar "Portal Source". Lo último será importar el código fuente a eclipse y estamos preparados para empezar.

Una vez hecho todo ésto ya estamos listos para empezar a desarrollar un hook.

Como ejemplo a desarrollar vamos a cojer el portlet de blogs y modificar su código mediante un hook para que muestre un texto por ejemplo "FECHA:".

Para crear nuestro primer hook debemos ir al eclipse, justo debajo de search podemos ver un icono cuadrado oscuro de "Create a new Liferay Plugin Proyect".

Le damos y nos aparece una nueva ventana donde seleccionamos el nombre del proyecto(MiHook) y más abajo seleccionamos como tipo de plugin Hook.

Podemos observar también en esta ventana que podemos seleccionar tanto el plugin SDK a usar como el servidor, en nuestro caso, sólo tendremos uno y no deberemos de modificar nada pero si tuvieramos más de 1 servidor nos aparecerían ahí todos los que tuvieramos.

Una vez hecho todo le damos a "Finish".

Ya tenemos el hook creado pero está vacío.

Ahora debemos ir al SRC de Liferay y buscar donde se encuentra el portlet a modificar, en nuestro caso el de blogs.

Se encuentra en portal->portal-web->docroot->html->portlet->blogs.

Para hacer el hook debemos de copiar el archivo a modificar del portlet, en esta caso sería "view_entry_content.jsp", y copiarlo en nuestro hook pero de la siguiente manera:

Debemos de reproducir toda la ruta del archivo a modificar del portlet en nuestro hook desde la carpeta HTML a partir de /docroot/WEB-INF del hook.

En nuestro caso, el archivo view_entry_content.jsp del portlet blogs a modificar esta en: /portal-web/docroot/html/portlet/blogs/view_entry_content.jsp

Nuestro hook quedaría de la siguiente forma estructurado: MiHook-hook/docroot/WEB-INF/html/portlet/blogs/view_entry_content.jsp. En view_entry_content.jsp es donde debemos de copiar el código del fichero del portlet y es aquí donde modificaremos el código para que el hook sobreescriba las funciones del portlet.

Una vez creada la estructura del hook vamos a modificar el archivo view_entry_content.js del hook para mostrar el mensaje "FECHA:" para que salga delante de la fecha de publicación de cada entrada del blog.

En nuestro caso, deberíamos de buscar el bloque que tiene por class "entry-date" y ahi dentro añadir una línea como la siguiente:


FECHA:

Como vemos es muy simple de modificar lo que nosotros queramos. Acordaros siempre de hacerlo sobre la copia de la jsp sobre el hook.

Por último debemos indicar la ruta a partir de la cual liferay debe buscar los cambios de nuestro hook. Esto se debe hacer sobre el fichero liferay-hook.xml que se encuentra en /MiHook-hook/docroot/WEB-INF/liferay-hook.xml

Aquí dentro debemos de añadir entre las etiquetas lo siguiente:


<hook><custom-jsp-dir>/WEB-INF</custom-jsp-dir>

De esta forma indicamos que la carpeta HTML cuelga de WEB-INF. Si quisieramos podríamos cambiar la estructuración de nuestro hook e indicarle aquí donde se haya la carpeta HTML.

Para terminar solo nos queda desplegar el hook yendo a la ventana de ant en el eclipse que se encuentra abajo a la derecha.

Selecionamos nuestro hook, lo abrimos, buscamos "deploy" y clicamos sobre él.

Una vez termine de desplegar tendremos listo nuestro hook. Tan solo debemos ir al navegadory abrir liferay(http://localhost:8080) acordándonos de lanzarlo antes de abrirlo obviamente y una vez abierto añadimos el portlet blogs a cualquier página, añadimos una entrada al blog y podremos ver como se muestra el mensaje "FECHA:" junto a la fecha de publicación de cada entrada.

Podeis descargaros el hook completo aquí

Espero que os sea de utilidad

COMENTARIOS

11-01-2015 13:08:36
Hola Sergio Gracias por tu ejemplo y tutorial, pero lo he reproducido tal cual comentas y no aparece la palabra FECHA. Me llama la atención que en la consola al arrancar el Tomcat me diga "MyFirstHook-hook dentro del appBase de la máquina y será ignorado" , te pego más información por si fuera útil 12:02:12,928 INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][AutoDeployDir:215] Processing MyFirstHook-hook.xml 12:02:13,023 INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][HookExplodedTomcatListener:54] Modifying hook for C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\deploy\MyFirstHook-hook.xml Copying 1 file to C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\webapps\MyFirstHook-hook\WEB-INF\classes Copying 1 file to C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\webapps\MyFirstHook-hook\WEB-INF\classes 12:02:15,601 INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][BaseDeployer:2233] Modifying Servlet 2.5 C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\webapps\MyFirstHook-hook\WEB-INF\web.xml 12:02:15,601 INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][HookExplodedTomcatListener:60] Hook for C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\deploy\MyFirstHook-hook.xml modified successfully 12:02:15,601 INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][BaseExplodedTomcatListener:49] Copying file C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\deploy\MyFirstHook-hook.xml to C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\conf\Catalina\localhost ene 11, 2015 12:02:18 PM org.apache.catalina.startup.HostConfig deployDescriptor Información: Desplieque del descriptor de configuración C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\conf\Catalina\localhost\MyFirstHook-hook.xml ene 11, 2015 12:02:18 PM org.apache.catalina.startup.HostConfig deployDescriptor Advertencia: Se ha especificado un docBase C:\Liferay\liferay-portal-tomcat-6.1.2-ce-ga3-20130816114619181\liferay-portal-6.1.2-ce-ga3\tomcat-7.0.40\webapps\MyFirstHook-hook dentro del appBase de la máquina y será ignorado ene 11, 2015 12:02:18 PM org.apache.catalina.startup.SetContextPropertiesRule begin Advertencia: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:MyFirstHook-hook' did not find a matching property. 12:02:23,232 INFO [localhost-startStop-3][HotDeployImpl:185] Deploying MyFirstHook-hook from queue 12:02:23,232 INFO [localhost-startStop-3][PluginPackageUtil:1049] Reading plugin package for MyFirstHook-hook ene 11, 2015 12:02:23 PM org.apache.catalina.core.ApplicationContext log Información: Initializing Spring root WebApplicationContext 12:02:23,418 INFO [localhost-startStop-3][HookHotDeployListener:584] Registering hook for MyFirstHook-hook 12:02:28,860 INFO [localhost-startStop-3][HookHotDeployListener:711] Hook for MyFirstHook-hook is available for use Muchas Gracias! Saludos, Rocio
11-11-2013 10:30:44
Hola @Alexis, los hooks no son portlets. Son una forma de modificar un portlet original de liferay y que el original quede intacto. Los hooks son plugins independientes como lo son las layouts o los themes. Por tanto si creamos un hook para modificar el portlet de blog, el portlet de blog original sigue intacto pero mientras exista nuestro hook, todo aquellos cambios que hallamos hecho en el hook serán los que prevalezcan. No obstante, si quitamos el hook volveremos a tener el portlet original sin modificaciones. Los hooks sirven para modificar los portlets nativos de liferay sin tocarlos y mantener su código original. Espero que te haya ayudado :)
08-11-2013 18:21:51
Buen artiulo Una consulta.. El Hooks crea un portlet nuevo ?? o sobreescribe el que existe?? me refiero a q si modificaste el blog en este ejemplo.. se creo un porltlet Mihook basado en el padre y este es el que hay q agregar?? Gracias y Saludos
09-01-2013 19:37:45
@Takyo a mi me ha pasado alguna vez ese error que has puesto. Es simplemente que te falta esa librería ECJ pero como puedes ver en el error te la descarga sola y solo tienes que volver a compilar. Si aún asi sigue sin funcionarte comprueba minuciosamente que las rutas que te muestra el error existen, sobre todo las versiones de esos SDK.
09-01-2013 10:12:16
Hola, me da este error a la hora de compilar, pruebo a reiniciarlo y sigue sin ir. ¿Tienes alguna solucion que pueda valerme? Buildfile: /root/Desktop/liferay-plugins-sdk-6.1.1/hooks/MiHook-hook/build.xml BUILD FAILED /root/Desktop/liferay-plugins-sdk-6.1.1/hooks/MiHook-hook/build.xml:5: The following error occurred while executing this line: /root/Desktop/liferay-plugins-sdk-6.1.1/hooks/build-common-hook.xml:7: The following error occurred while executing this line: /root/Desktop/liferay-plugins-sdk-6.1.1/build-common-plugin.xml:5: The following error occurred while executing this line: /root/Desktop/liferay-plugins-sdk-6.1.1/build-common.xml:70: . Task cannot continue because ECJ is not installed. ECJ was automatically installed. Please rerun your task.
19-11-2012 22:12:02
De la misma forma que en el artículo modificamos la JSP del portlet de blogs podemos modificar la JSP referente al portlet visor de contenido web. Simplemente tienes que buscar en el SRC de Liferay donde está el punto que quieres modificar del portlet de visor de contenido web y seguir los pasos indicados en el artículo.
19-11-2012 16:59:03
como agrego un hook al visor de contenidos web,espeficicamente un check adicional dentro del visor de contenido web
15-08-2012 22:21:48
#Felix28 asegurate de que tiene este fichero "ecj.jar" en tu local en la ruta que te indica el log porque el fallo que te esta dando es de que no encuentra un fichero.
15-08-2012 20:45:48
Al darle deploy me aparece este error /home/fberry/liferay/liferay-portal-6.1.0-ce-ga1/liferay-plugins-sdk-6.1.1/hooks/NuevoHook-hook/build.xml:5: The following error occurred while executing this line: /home/fberry/liferay/liferay-portal-6.1.0-ce-ga1/liferay-plugins-sdk-6.1.1/hooks/build-common-hook.xml:7: The following error occurred while executing this line: /home/fberry/liferay/liferay-portal-6.1.0-ce-ga1/liferay-plugins-sdk-6.1.1/build-common-plugin.xml:5: The following error occurred while executing this line: /home/fberry/liferay/liferay-portal-6.1.0-ce-ga1/liferay-plugins-sdk-6.1.1/build-common.xml:68: Failed to copy /home/fberry/liferay/liferay-portal-6.1.0-ce-ga1/liferay-plugins-sdk-6.1.1/lib/ecj.jar to /usr/local/eclipse/plugins/org.apache.ant_1.8.2.v20120109-1030/lib/ecj.jar due to java.io.FileNotFoundException /usr/local/eclipse/plugins/org.apache.ant_1.8.2.v20120109-1030/lib/ecj.jar (Permission denied)
14-09-2011 14:22:59
Para importar el SRC de Liferay simplemente tienes que hacer click derecho sobre la ventana de la izda, Darle a Import->General->Existing Proyect into WorkSpace->Select Root directory. Una vez aqui seleccionas la carpeta raiz de la que cuelga el SRC y veras que abajo te aparecen los proyectos que puedes importar, marcas el tuyo y listo. Por otro lado, la estructura de las carpetas dentro del hook debes crearla tu.Eso si, el view_entry_content.jsp deberás copiarlo desde el SRC de Liferay como dice en el artículo a tu hook en la ruta que se indica. El SRC simplemente es el codigo fuente de Liferay que necesitarás como documento de consulta o para copiar archivos a los hooks, no sirve para más. Si no entiendes algo mñas no dudes en preguntar.
14-09-2011 13:26:10
Hola, gracias por estos artículos. Tengo un par dudas que no entiendo: Como importar el "liferay-portal-src-6.0.6" al eclipse (llevo poco tiempo con esto). La estructura de carpetas MiHook-hook/docroot/WEB-INF/html/portlet/blogs/view_entry_content.jsp ¿se ha de crear ó se genera automaticamente al importar el src? Disculpa si son preguntas tontas y gracias de nuevo.
30-08-2011 21:04:21
Se que son u poco tontas las modificaciones del portlet pero se trata de que todo el mundo entienda en el mayo grado posible como crear un hook y modificarlo. Luego ya cada uno que hag los cambios que necesite. Gracias por tu comentario :)
30-08-2011 12:31:40
Un poco pobres las modificaciones sobre el portlet blogs pero está perfectamente explicado...Grande!

DEJA TU COMENTARIO