Filtros de búsqueda en sesión


Todos nos hemos encontrado alguna vez, al programar portlets en Liferay, con la necesidad de presentar al usuario un listado de elementos y un pequeño formulario con una serie de campos para filtrar los resultados de dicho listado. Si estamos usando el search container de Liferay, nos encontraremos con que tenemos que guardar los valores de los filtros si queremos mantenerlos al clicar en algún botón del search container. Por ejemplo, si tenemos un listado de casas, y filtramos por año de construcción, si el resultado tiene varias páginas de registros, nos encontraremos que al clicar en el botón de siguiente página, habremos perdido el filtro de año de construcción.

La manera “Estándard” como se hace esto en Liferay es guardando los valores de los filtros como preferencias del portlet, de manera que siempre que vayamos al listado nos encontraremos con los filtros que teníamos puestos en la última búsqueda que hicimos. Esto es así incluso si nuestra sesión ha expirado o si la hemos cerrado. Al volver a entrar nuestras credenciales e ir al listado, veremos los filtros tal y como estaban la última vez.

Hay situaciones en las que queremos que la funcionalidad sea similar a esta, pero que al cerrar sesión, o cuando la sesión expire, los filtros se borren y aparezcan los valores por defecto de los mismos al volver a entrar al listado. Para este caso, lo que habría que hacer sería guardar los filtros en la sesión.

Para conseguir esto, tendremos que tener, en el jsp de formularios de filtro, algo similar a esto:

... String keywordFilter = SessionParamUtil.getString(request, "keywordFilter"""); String descriptionFilter = SessionParamUtil.getString(request, "descriptionFilter"""); String commentsFilter = SessionParamUtil.getString(request, "commentsFilter"""); ...

Aquí definimos las variables donde guardaremos los filtros y, en vez de usar la clase ParamUtil, como es habitual, usaremos SessionParamUtil, que busca el parámetro también en la sesión (no sólo en la request).

Además, en nuestro controlador tendremos que poner el código encargado de recoger los filtros de la request y de guardarlos en la sesión:

public void render(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException{ PortletSession portletSession = renderRequest.getPortletSession(); Enumeration<String> params = renderRequest.getParameterNames(); while(params.hasMoreElements()){ String param = params.nextElement(); if(!param.endsWith("Filter")) continue; portletSession.setAttribute(param, renderRequest.getParameter(param), PortletSession.PORTLET_SCOPE); } super.render(renderRequest, renderResponse); }

En este caso hemos modificado la función render de nuestro controlador para que guarde todos los parámetros de la request cuyo nombre acabe en “Filter”.

voilà, ya tenemos nuestros filtros guardados en sesión!

Esperamos que os haya sido de ayuda, hasta la próxima!!


Leave a Reply

Your email address will not be published. Required fields are marked *