jueves, 21 de junio de 2012

Añadir funciones de búsqueda en OpenCms 8 (2ª parte)

En esta segunda parte del tutorial de búsquedas en OpenCms vamos a aprender a implementar el código necesario para añadir esta funcionalidad a nuestras páginas jsp. Para ello vamos a utilizar un módulo de búsquedas Open Source que viene incorporado llamado Lucene.

Para añadir esta funcionalidad a nuestro portal por una parte tendremos una página en la que aparece el formulario que verá el usuario, en el cual introducirá una palabra clave a buscar y por otra parte tendremos otra página que mostrará los resultados de la búsqueda. Tendremos por tanto dos archivos html y dos dos jsp.
Primero crearemos un jsp en la sección de nuestros módulos o donde queramos llamado busqueda_prueba.jsp y copiamos el siguiente código:

<html>
<body>
<p>
    <form action="resultados_busqueda.html" method="post">
        <fieldset>
            <legend title="Buscar">Buscar elementos del portal</legend>
            <input name="query" type="text" value="Buscar..." onfocus="this.value=''" title="Buscar" />
            <input type="submit" value="Enviar" title="Enviar" />
        </fieldset>
    </form>
</p>
</body>
</html>

Ahora creamos otro jsp con el nombre resultados_busqueda_prueba.jsp y copiamos lo siguiente:

<%@ page buffer="none" import="org.opencms.main.*, org.opencms.jsp.CmsJspXmlContentBean, org.opencms.search.*, org.opencms.file.*, org.opencms.jsp.*, org.opencms.xml.*, java.util.*, org.opencms.i18n.CmsMessages" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" %>
<%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms" %> 

<%  
  org.opencms.jsp.CmsJspActionElement cms = new CmsJspActionElement(pageContext, request, response);
  CmsSearchManager searchManager = OpenCms.getSearchManager();
  CmsJspActionElement cmsLocale = new CmsJspActionElement(pageContext, request, response);
  
  String query = request.getParameter("query")==null?"":request.getParameter("query");
  String searchPage = request.getParameter("searchPage")==null?"1":request.getParameter("searchPage");

  String locale = cms.getRequestContext().getLocale().toString();
  locale = "".equals(locale==null?"":locale)?"es":locale;
        
 
  CmsSearch busqueda = new CmsSearch();
  busqueda.setQuery(query);
  
  busqueda.setIndex("indice_prueba_"+locale.toUpperCase());
  
  int numero = 10;
  double num = 10.0;
  
  busqueda.setDisplayPages(numero);
  busqueda.setSearchPage(Integer.parseInt(searchPage));
  
  busqueda.init(cms.getCmsObject());
  
  List result = busqueda.getSearchResult();%>


<%  if ((result==null) || (result.size() == 0)) { %>
 

<div>

<p>
No se encontraron resultados para <%= query %>.</p>

</div>
  <% } else { %>
             
<p>Se encontraron <%= result.size() %> resultados para la búsqueda <%= query %></p>
 <%    ListIterator iterator = result.listIterator();  
       int i = 0;  
       while (iterator.hasNext()) {    
             i++;     
             CmsSearchResult entry = (CmsSearchResult)iterator.next();  %>  
                 <p><a href="<cms:link><%= entry.getPath() %></cms:link>"><%= entry.getTitle() %>(<%= entry.getScore() %>%)</a>
                 <%= entry.getExcerpt()==null?"":" <br/> "+ entry.getExcerpt() %></p> <br>    
      <% } %>
        <ul > 
        <%   Map pageLinks = busqueda.getPageLinks();                       
                 if (busqueda.getPreviousUrl() != null) {                       
                      
                      String firstpageLink = cms.link(busqueda.getPreviousUrl());
                      firstpageLink = firstpageLink.substring(0,firstpageLink.indexOf("&searchPage=")) + "&searchPage=1"; %>
                                          
                <li>
                    <a rel="nofollow" href="<%=firstpageLink.replaceAll("\"","%22") %>">Primera</a>
                </li> 
                <li>
                    <a rel="nofollow" href="<%=cms.link(busqueda.getPreviousUrl().replaceAll("\"","%22")) %>" >Anterior</a>
                </li> 
                <% } 
                    int pageNumber = 0;
                    Iterator it =  pageLinks.keySet().iterator();   
                     while (it.hasNext()) {     
                          pageNumber = ((Integer)it.next()).intValue();
                          String pageLink = cms.link((String)pageLinks.get(new Integer(pageNumber))); 
                    if (pageNumber != busqueda.getSearchPage()) {    %>                             
                            <li><a rel="nofollow" href="<%= pageLink.replaceAll("\"","%22") %>" ><%= pageNumber %></a></li>
                    <%  } else { %>             
                        <li><a rel="nofollow" href="<%= pageLink.replaceAll("\"","%22") %>" ><%= pageNumber %></a></li> 
                    <%      }               }       %>
                 <%  if (busqueda.getNextUrl() != null) {                             
                        String p = busqueda.getPreviousUrl();
                        if (p==null) p = busqueda.getNextUrl();
                        String lastpageLink = cms.link(p);
                        lastpageLink = lastpageLink.substring(0,lastpageLink.indexOf("&searchPage=")) + "&searchPage="+ new Double((Math.ceil(busqueda.getSearchResultCount()/num))).intValue();
                 %>                                       
                       <li>
                            <a rel="nofollow" href="<%=cms.link(busqueda.getNextUrl().replaceAll("\"","%22")) %>" >Siguiente</a>
                        </li>
                <li>
                    <a rel="nofollow" href="<%=lastpageLink.replaceAll("\"","%22") %>" >Última </a>
                </li> 
                <% } %>            
        </ul>   
        <br/>            
<% } %>



Ahora que tenemos los jsp tendremos que crear los archivos html que tengan como plantilla el enlace a estos archivos. Para ellos nos vamos a nuestro site y creamos un nuevo contenido de tipo página con texto libre, o la plantilla que usemos para formatear la página, lo llamamos buscar.html y al editar las propiedades ponemos en template-elements: /system/modules/com.nuestroproyecto.templates/busqueda_prueba.jsp
Creamos un nuevo archivo llamado resultados_busqueda.html y como template-elements ponemos la ruta al jsp creado anteriormente: /system/modules/com.nuestroproyecto.templates/resultados_busqueda_prueba.jsp

Si todo ha ido bien ya funcionarían correctamente las búsquedas en nuestro portal.

No hay comentarios:

Publicar un comentario