OpenCms Content Relation Engine (CRE)

Una de las principales mejoras de OpenCms 7 es la incorporación del CRE (Content Relation Engine). Esta herramienta desarrollada por Michael Moossen permite establecer relaciones entre recursos del VFS (Vitual File System) de OpenCms.

Imaginemos lo siguiente:

Tenemos en el proyecto Offline un recurso A de OpenCms de tipo página html o jsp, en cuyo código hay un enlace a una imagen (recurso B) usando la etiqueta <img>.  Publicamos A.

¿Qué ocurre en versiones anteriores de OpenCms?

En el mejor de los casos si el recurso es de tipo página html el navegador mostraría la típica aspa roja indicando que no encuentra la imagen en el proyecto Online. En el peor de los casos, en jsp, suponiendo que la imagen fuese necesaria ya que leemos alguna propiedad (por ejemplo Description para mostrar el texto alternativo) el sistema podría dar un error 500.

¿Qué ocurre en el nuevo OpenCms si hemos usado CRE?

Pues que el sistema avisaría de que no hemos publicado la imagen y permitiría publicarla junto al recurso al que está asociada.

¿Qué ha cambiado en la base de datos de OpenCms?

Se ha añadido una nueva tabla llamada CMS_ONLINE_RESOURCE_RELATIONS para cada proyecto (sustituir ONLINE por OFFLINE) con los siguientes campos:

RESOURCE_SOURCE_ID: De tipo VARCHAR(36), contiene el id del recurso A.
RESOURCE_SOURCE_PATH: TEXT, contiene el path en ruta absoluta del recurso A.
RESOURCE_TARGET_ID: VARCHAR(36), contiene el id del recurso B.
RESOURCE_TARGET_PATH: TEXT, contiene el el path en ruta absoluta al recurso B.
RELATION_TYPE : INTEGER, es el tipo de relación que vamos a establecer.

¿Dónde se configuran las relaciones?

El el fichero opencms-workplace.xml. La configuración por defecto:


<default-preferences>
   <workplace-preferences>
      <workplace-generaloptions>
         ...
         <allowbrokenrelations>false</allowbrokenrelations>
         <publishrelatedresources>true</publishrelatedresources>
         ...
      </workplace-generaloptions>
   </workplace-preferences>
</default-preferences>

¿Cómo se usan las relaciones?

  1. Desde el menú flotante, opción relaciones: Podemos ver las relaciones de los recursos y asignar categorías.
  2. En jsp, usando el macro %(link.strong) o %(link.weak). En vez de usar

     <img src=”<cms:link>/imagenes/imagen.jpg</cms:link>” />

    usamos

     <img src=”<cms:link>%(link.strong:/imagenes/imagen.jpg)</cms:link>” />
  3. Usando categorías:
    • Primero hay que definir categorías, esto se hace creando una estructura de carpetas en /system/categories/ , por ejemplo:
      /system/categories/categoria1/
      /system/categories/categoria1/subcategoria11/
      /system/categories/categoria1/subcategoria12/
      /system/categories/categoria1/subcategoria13/
    • En el .XSD usamos el widget org.opencms.widgets.CmsCategoryWidget para mostrar el listado de categorías.
    • En jsp usamos org.opencms.file.collectors.CmsCategoryResourceCollector para listar los recursos pertenecientes a dicha categoría.
  4. Desde las clases de CmsObject (crear nuevas relaciones y leer o borrar existentes) y CmsRelationFilter.

Por último hay que destacar que Michael Moossen realizó una presentación muy interesante sobre CRE en los OpenCms Days. Las trasparencias que usó están disponibles en el siguiente enlace.

Trasparencias de Michael Moossen para la presentación de CRE en OpenCms Days.