Como hacer un listado de contenido en OpenCms 8 y 9 utilizando Solr y siendo editable

07/11/2013       Sergio Raposo Vargas       OpenCms 8, OpenCms 9

Solr fue una de las grandes revelaciones de la versión 8 de OpenCms, con él pudimos implementar nuevas funcionalidades en buscadores de contenidos pero también lo podemos usar para listar contenidos de nuestro OpenCms en lugar de tener que hacerlo mediante consulta de BBDD, tal y como funcionan los antiguos collectores.

Para implementar un listado seguiremos usando el tag de OpenCms <cms:contentload> pero en este caso usaremos un nuevo collector implementado para poder usar consultas Solr: byQuery.

Una cosa que debemos tener en cuenta a la hora de implementar un listado con solr usando este contentload es que la paginación no la podemos realizar directamente con Solr (mediante atributos rows y start) sino que debemos implementarla al igual que lo haciamos anteriormente con los collector antiguos. En este caso deberemos indicar un valor al campo rows lo suficientemente grande como para que entre todos los posibles contenidos a listar, esto se debe a que solr, por defecto, si no le indicamos un rows concreto cogerá 10 como valor por defecto y por tanto nunca listaremos más de 10 recursos.

Si queremos conocer el número total de recursos encontrados, por ejemplo para pintar un informe de resultados, debemos usar la opción de preload, con esta opción se hará una primera consulta para cononcer el total de resultados, y una segunda para mostrar los correspondiente a la página actual indicada.

Pero yo creo que lo mejor será directamente mostrar el código:

<c:set var="solrquery">
&fq=parent-folders:("/sites/default/.content/noticias/")
&fq=type:noticias&sort=collector.date_prop desc&rows=10000
</c:set>
<c:set var="createPath">
|createPath=/es/atencion-y-prevencion/.content/noticias/n_%(number:5).html
</c:set>

<ul>
<cms:contentload collector="byQuery" param="${solrquery }${createPath }" preload="true" >
<cms:contentinfo var="info"/>
<c:if test="${info.resultSize > 0}">
   <cms:contentload pageSize="10" pageIndex="${currentPage}"
        pageNavLength="5" editable="true">
   <cms:contentinfo var="infocontent"/>
   <cms:contentaccess var="resource" scope="request"/>
     <li>${resource.value.Title}</li>   
   </cms:contentload>
</c:if>
<c:if test="${info.resultSize == 0}">
   <p>No hay información</p>
</c:if>
</cms:contentload>     
</ul>

Las claves del código están en varios elementos:

  • Mediante los dos contentload conseguimos hacer una primera consulta para conocer el número de resultados encontrados, y el segundo es el que nos permite mostrar solo los elementos de la página actual
  • En el parametro param del <cms:contentload> añadimos 2 partes, una es la consulta Solr, siguiendo la sintaxis concreta de búsqueda, y por otro lado el atributo createPath es donde le indicamos la ruta donde se crearán los nuevos recursos. En la ruta del debemos añadir el patrón que se usará para darle nombre al nuevo recurso. Para que se creen mediante un número secuencial añadiremos la macro: %(number:5)
  • Otro tema importante a tener en cuenta, para que funcione el añadir y borrar contenido directamente desde el ADE tenemos que indicar en el filtro de solr 1 solo tipo de recurso (&fq=type:NOMBRE_RECURSO). Este único tipo será el que se use para crear el nuevo recurso.
  • Los parámetros del objeto ${infocontent} y ${info} serán los que nos permitan implementar la paginación posteriormente: ${info.resultSize}, ${infocontent.pageCount}, ${infocontent.pageSize}, ${infocontent.pageNavStartIndex}, ${infocontent.pageNavEndIndex}

 

 

 Listado, Solr, OpenCms, Editable