«

»

jul
07
2009

Generación de menús con OpenCMS

El tercer caso que vamos a ver de elementos reutilizables es el más evidente: El Menú.

Si queremos que sea lo más flexible posible vamos a parametrizarlo para poder adaptarlo a nuestras necesidades (o a las de la plantilla que nos propongan). Por ello vamos a darle valores para el nivel en el que queremos empezar a ver el menú y para el nivel de profundidad máximo al que queremos llegar.

Así si necesitamos tener un primer nivel de menú horizontal con uno de profundidad:

    nivelMenu=0;

    nivelMaximo=0;

Y además tenemos en una columna el resto del menú:

    nivelMenu=1;

    nivelMaximo lo dejamos vacío para no limitarnos.

El código de e_MenuGenerico.jsp es:

>%@ page session="true" %>
<%@ page import="org.opencms.jsp.*, org.opencms.file.CmsResource" %>
<%@ page import="java.util.*" %>
<%!
private String nivelInterior(CmsJspNavElement navElement, CmsJspNavBuilder nav,CmsJspActionElement cms , String navTextMenu[], int profundidad, int nivelMaximo){
 boolean dentro = false;
 java.lang.StringBuffer dev = new java.lang.StringBuffer();
 List navItems = null;
 try{
  if (navElement.isFolderLink())
  {
     navItems = nav.getNavigationForFolder(navElement.getResourceName());
     Iterator i = navItems.iterator();
     dev.append("<ul>");
     while( i.hasNext() ) {
      CmsJspNavElement navElementInt = ( CmsJspNavElement )i.next();
      String link = cms.link( navElementInt.getResourceName() );
      String title = navElementInt.getNavText();
      if(title.equals(navTextMenu[profundidad+1]))
        {
        dev.append("<li>");
        dev.append("<spam>" + title + "<spam> ");
        if (navElementInt.isFolderLink() && profundidad<nivelMaximo)
          {
          dev.append(nivelInterior(navElementInt, nav, cms, navTextMenu, profundidad+1, nivelMaximo));
          }
        dev.append("</li>");
        }
      else
        {
        dev.append("<li>");
        dev.append("<a href="" + link + "">" + title + "</a> ");
        dev.append("</li>");
        }
      }
    dev.append("</ul>");
    }
  else
    {
    String link = cms.link( navElement.getResourceName() );
    String title = navElement.getNavText();
    if(title.equals(navTextMenu[profundidad+1]))
      {
      dev.append("<li>");
      dev.append("<spam>" + title + "</spam> ");
      dev.append("</li>");
      }
    else
      {
      dev.append("<li>");
      dev.append("<a href="" + link + "">" + title + "</a> ");
      dev.append("</li>");
      }
    }
  }
catch (Exception e){
  }
return dev.toString();
}
%>
<%
try{
 CmsJspActionElement cms = new CmsJspActionElement( pageContext, request, response );
 int nivelMenu=0;
     try
       {
       nivelMenu=Integer.parseInt(cms.getRequest().getParameter( "nivelMenu" ));
       if (nivelMenu<0)
         {
         nivelMenu=0;
         }
       }
     catch (Exception e){
       nivelMenu=0;
       }
     int nivelMaximo=0;
     try
       {
       nivelMaximo=Integer.parseInt(cms.getRequest().getParameter( "nivelMaximo" ));
       if (nivelMaximo<nivelMenu)
         {
         nivelMaximo=nivelMenu;
         }
       }
     catch (Exception e){
       nivelMaximo=cms.getNavigation().getNavigationForResource().getNavTreeLevel();
       }
     CmsJspNavBuilder navigation = cms.getNavigation();
     CmsJspNavElement elementoActual = navigation.getNavigationForResource();
     int nivelMenuPagina = elementoActual.getNavTreeLevel();
     String navTextMenu[]= new String[10];
     int nivelActual=elementoActual.getNavTreeLevel();
     while (nivelActual>nivelMaximo)
       {
elementoActual = navigation.getNavigationForResource(elementoActual.getParentFolderName());
       nivelActual--;
       }
     navTextMenu[nivelActual+1]=elementoActual.getNavText();
     while (nivelActual >= nivelMenu)
       {
       if (nivelActual>0)
         {
elementoActual = navigation.getNavigationForResource(elementoActual.getParentFolderName());
         nivelActual--;
         navTextMenu[nivelActual+1]=elementoActual.getNavText();
         }
       else
         {
         elementoActual = navigation.getNavigationForResource("/");
         nivelActual--;
         navTextMenu[0]=elementoActual.getNavText();
         }
       }
     out.println(nivelInterior(elementoActual, navigation , cms , navTextMenu, nivelMenu, nivelMaximo));
 }
catch (Exception e){
     for (int x=0;x<e.getStackTrace().length;x++)
       {
       out.println(e.getStackTrace()[x].toString());
       }
 }
%>

Para incluirlo en nuestra plantilla sólo debemos añadir donde corresponda:

<%@ page session="true" %>
<%@ taglib prefix="cms" uri=<a href="http://www.opencms.org/taglib/cms">http://www.opencms.org/taglib/cms</a> %>
<cms:include file="/system/modules/es.jromay.opencms/elements/elements/e_MenuGenerico.jsp">
    <cms:param name="nivelMenu">1</cms:param>
    <cms:param name="nivelMaximo">1</cms:param>
</cms:include>

Enlace permanente a este artículo: http://blog.jromay.es/2009/07/07/generacion-de-menus-con-opencms/

Un comentario

  1. jgarcia escribió:

    Hola, te felicito por tus códigos, me han servido mucho.

    Gracias

Deja un comentario

Tu email nunca se publicará.

Puedes utilizar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>