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