jueves, 30 de abril de 2009

Acceder a servicios de Liferay desde plantilla de velocity

Existe 2 opciones

La primera necesita:
  1. Usando el "liferay-ext", modificar el fichero "portal_ext.proporties" y cambiar la entrada: "journal.template.velocity.restricted.variables= " es decir no debe tener valor o al menos no contener "serviceLocator" con ello tendremos una variable que nos permite acceder a servicios de Liferay.
  2. Si deseamos acceder a un servicio propio deberemos crearlo e insertalo usando "liferay-ext"
  3. Finalmente para acceder: desde dentro de la plantilla:

    #set ($tagsService = $serviceLocator.findService("com.liferay.portlet.tags.service.TagsAssetLocalService"))
    #set ($journalArticleResourceService = $serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleResourceLocalService"))



    #set ($longGroupId = $getterUtil.getLong($groupId))
    #set ($articleResourcePK = $journalArticleResourceService.getArticleResourcePrimKey($longGroupId, $reserved-article-id.data))
    #set ($tagsAsset = $tagsService.getAsset("com.liferay.portlet.journal.model.JournalArticle", $articleResourcePK))
    #set ($tagsEntries = $tagsAsset.getEntries())

    Tags:
    #foreach( $entry in $tagsEntries )
    #set ($tag = $entry.getName())
    #if($velocityCount!=1), #end
    $tag
    #end

Con esa plantilla accemos a todos los tags del artículo actual y los escribimos.

La segunda alternativa no requiere modificar el fichero "portal_ext.properties" y consiste en:

#set ($tagsService = $portal.getClass().forName("com.liferay.portlet.tags.service.TagsAssetLocalServiceUtil").getMethod("getService", null).invoke(null, null))
#set ($journalArticleResourceService = $portal.getClass().forName("com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil").getMethod("getService", null).invoke(null, null))

Con ello accedemos también a los servicios.


Otro ejemplo, acceder al usuario que escribio el artículo e imprimir su nombre

#set ($userService = $serviceLocator.findService("com.liferay.portal.service.UserLocalService"))
#set ($user = $userService.getUserById($getterUtil.getLong($reserved-article-author-id.getData())))
$user.getScreenName()



Ejemplo propio


#set ($museumService = $serviceLocator.findService("com.muvac.service.MuseumLocalService"))


#set ($museum= $museumService.findById($museo.data))




Autor: ${autor.data}
Museo: ${museo.data}


Datos del museo

$museum.name
$museum.description

3 comentarios:

Anónimo dijo...

aupa tio! gracias por el ejemplo, estaba todo rallado intentando encontrar mi error y era que no pasaba a long y cambiar en el portal-ext.properties la propiedad esa.
un saludo!! y gracias

m0000g dijo...

Gracias !!!... algo del código que utilizastes me funcionó para algo que estoy haciendo

saludos,

KaTeLmE dijo...

El problema de usar la segunda forma es que no tienes soporte para la captura de excepciones con lo que la plantilla petará si el metodo invocado del servicio lanza alguna.

Lo correcto sería usar:
-> $serviceLocaltor.findSaveExceptionService(...) y $utilLocaltor.findSaveExceptionUtil(...) en la version 5.1.x
-> $serviceLocaltor.findService(...) y $utilLocaltor.findUtil(...) en la version 5.2.x o superior.