Detectar en opencms cuando en un containerpage estoy cargando un detail

La situación que se describe a continuación está probada para las versiones 8 y 9 del opencms.

Recientemente hemos tenido un problema que consistía en extraer propiedades de un CmsResource a partir de la uri, para ello se puede insertar  sin problema en el template un pequeño script el cual partiendo de la uri desde la que es invocado obtenga un objeto CmsResource y a partir de este su CmsUUID etc… esto puede conseguirse de forma sencilla como sigue:

...
String uri =  cms.getRequestContext().getUri();
/* Read resource via the site path */
CmsResource resourceViaPath = cmso.readResource(uri);
/* Get the resource ID */
CmsUUID rid = resourceViaPath.getResourceId();
...

Pero…¿que pasa cuando estamos invocando a un contenedor para mostrar una detail page? en este caso queremos obtener las propiedades del tipo que estamos cargando en el contenedor pero  con el código anterior el CmsResource que obtenemos se refiere erroneamente al contendor, después de valorar extraños artificios, la solución es sencilla, basta con bucear un poco en la API Opencms donde encontramos la clase:  org.opencms.ade.detailpage.CmsDetailPageResourceHandler.

Esta clase es muy interesante ya que permite detectar cuando un container está siendo utilizado para mostrar un detail page y en ese caso obtener el CmsResource del detail concreto.

Esta sería la API de la clase CmsDetailPageResourceHandler…

Captura de pantalla 2015-06-19 a las 11.53.16

 

A la vista de los métodos anteriores, solo nos queda detectar cuando el container se está empleando para mostrar una detail page, y en ese caso cambiar nuestro CmsResource objetivo para consultarle las propiedades…

...
CmsDetailPageResourceHandler.getDetailId(request)

if (CmsDetailPageResourceHandler.getDetailId(request)!=null){
r = cmso.readResource(CmsDetailPageResourceHandler.getDetailId(request));
}
...

Una vez obtenido el CmsResource apropiado la recuperación de propiedades es sencilla y podría hacerse mediante este código:

...
list = cmso.readPropertyObjects(r, true);
i = list.iterator();
CmsProperty prop = null;

while (i.hasNext()) {
prop = (CmsProperty)i.next();
out.println(prop.getName() + " :=" + prop.getValue() );
}
...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *