Opciones del QuickLaunch de Wss3 mediante SPNavitaionProvider

Un problema muy común en WSS3 es el de conseguir un menú de navegación que muestre las opciones en función del usuario y las unidades de negocio que estén activas en el portal.

El menú de navegación de wss3 nos permite navegar a las distintas listas o bibliotecas que creemos. También nos permite dar de alta nuestras propias opciones desde la página de configuración de inicio rápido.

El problema que tendremos en un proyecto real, será que las opciones que tengan que aparecer dependerán del usuario logado y los elementos de negocio implementados, y no podrán ser opciones estáticas.

 

Ejemplo del problema en el mundo real

En Renacimiento estamos trabajando en un cliente que tiene que desplegar más de 150 portales con una infraestructura Wss3 (no MOSS), cada portal puede tener activo una serie de features que en conjunto implementan las funcionalidades requeridas por el negocio. Al activarse cada elemento muestra en el menú principal una serie de opciones propias del elemento o unidad de negocio. Además, en función del rol del usuario puede visualizar o no esas opciones. Esto implica que el mantenimiento de las opciones por el menú de inicio rápido sea bastante limitado para el proyecto.

Para ello, hemos utilizado nuestro propio SPNavigationProvider que consume una lista personalizada de Wss3 como repositorio de las opciones del QuickLaunch Menu.

 

SPNavigationProvider

Es un proveedor de navegación que se ocupa de proporcionar las opciones que visualizará un menú de navegación. Este clase no se encarga de visualizar las opciones, sino de obtenerlas de un repositorio.

SPNavigationProvider es una clase que hereda de SiteMapProvider estándar en Asp.Net2.

System.Object
System.Configuration.Provider.ProviderBase
System.Web.SiteMapProvider
Microsoft.SharePoint.Navigation.SPNavigationProvider

 

How To

Para conseguir que nuestro QuickLaunch Menu obtenga las opciones de una lista personalizada tendremos que crear una clase que herede de SPNavitaionProvider e implementar el método GetChildNodes, después configurar el nuevo proveedor y modificar nuestra masterpage para que utilice el proveedor.

 

Custom SPNavitaionProvider

Crearemos una clase que herede de SPNavitaionProvider. Para hacerlo crearemos un proyecto Dll de windows.

Agregaremos al proyecto las referencias:

System.Configuration

System.Web

Microsoft.Sharepoint

 

Importaremos las referencias en nuestra clase:
using System.Collections.Generic;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;

 

A continuación definimos nuestra clase, hacemos que herede de SPNavitaionProvider, y sobre-escribimos el método GetChildNodes.

using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;

namespace MyMenuProvider
{
    public class MyMenuProvider : SPNavigationProvider
    {
        public override System.Web.SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode node)
        {
           ……

        }
    }
}

 

En nuestros caso de ejemplo hemos creado una lista de wss3 con un nivel de profundidad:

Lista

Opciones

 

namespace MyMenuProvider
{
    public class MyMenuProvider : SPNavigationProvider
    {
       

        public override System.Web.SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode node)
        {
            System.Web.SiteMapNodeCollection opciones = new System.Web.SiteMapNodeCollection();;
            try
            {
                if (node.Title == “Inicio rápido”)
                {
                    System.Web.SiteMapNode rootOpcion = new System.Web.SiteMapNode(this, “Mis Opciones”, “/”, “Mis Opciones”, “”);
                    opciones.Add(rootOpcion);
                }
                if (node.Title == “Mis Opciones”)
                {
                    SPWeb site = SPContext.Current.Web;
                    SPList listaOpciones = site.Lists[“Opciones”];

                    SPQuery query = new SPQuery();
                    query.ViewFields = “<FieldRef Name=’Title’ /><FieldRef Name=’Url’ /><FieldRef Name=’Orden Opcion’ />”;

                    SPListItemCollection opcionesLeidas = listaOpciones.GetItems(query);
                    foreach (SPListItem opcionLeida in opcionesLeidas)
                    {
                        System.Web.SiteMapNode nuevaOpcion = new System.Web.SiteMapNode(this, (string)opcionLeida[“Title”], (string)opcionLeida[“Url”], (string)opcionLeida[“Title”], (string)opcionLeida[“Title”]);
                        opciones.Add(nuevaOpcion);
                    }
                }
            }
            catch (Exception ex)
            {
                System.Web.SiteMapNode exOpcion = new System.Web.SiteMapNode(this, “Excepción”, “”, ex.Message, ex.Message);
                opciones.Add(exOpcion);
            }
            return opciones;
        }

    }
}

 

A continuación firmamos la dll con un strong name y construimos nuestra dll.

 

Configurar el Web Config

Tendremos que indicar en el Web.Config de nuestra Web Application la configuración del nuevo provider de navegación. Abriremos el web.config y lo editaremos.

Para que esté disponible el proveedor es imprescindible que la aplicación de wss3 sepa encontrar la dll, para ello podremos registrar la dll en el GAC (Lo más recomendable), o copiarlo en el directorio “bin” de la aplicación web. Si haceis modificaciones en la dll una vez registrada en el web.config tendreis que hacer un iisreset para que obtenga los cambios.

 

Abriremos entonces el WebConfig y editaremos la sección “siteMap”:

<siteMap defaultProvider=”SPSiteMapProvider” enabled=”true”>
      <providers>
        <add name=”SPNavigationProvider” type=”Microsoft.SharePoint.Navigation.SPNavigationProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” />
        <add name=”SPSiteMapProvider” type=”Microsoft.SharePoint.Navigation.SPSiteMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” />
        <add name=”SPContentMapProvider” type=”Microsoft.SharePoint.Navigation.SPContentMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” />
        <add name=”SPXmlContentMapProvider” siteMapFile=”_app_bin/layouts.sitemap” type=”Microsoft.SharePoint.Navigation.SPXmlContentMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” />
        <add name=”MyMenuProvider” type=”MyMenuProvider.MyMenuProvider, MenuProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=160b265bda309c7a” />
      </providers>
    </siteMap>

 

Un error muy común es confundirse en el Namespace y en nombre del assembly, revisarlo bien antes de continuar.

 

Configurar el QuickLaunch Menu

Ya tendremos entonces disponible nuestro provider de navegación, ahora solo tendremos que indicar en nuestra masterpage al SPNavigationManager el nuevo Provider de navegación.

En nuestro ejemplo hemos creado una nueva masterpage y hemos hecho las modificaciones sobre ella.

Buscamos la sección “Sharepoint:SPNavigationManager” y modificamos la propiedad “SiteMapProvider” del siteMapDatasource por el nombre de nuestro provider.

<Sharepoint:SPNavigationManager
                id=”QuickLaunchNavigationManager”
                runat=”server”
                QuickLaunchControlId=”QuickLaunchMenu”
                ContainedControl=”QuickLaunch”
                EnableViewState=”false”>
                <div>
                    <SharePoint:DelegateControl runat=”server”
                        ControlId=”QuickLaunchDataSource”>
                     <Template_Controls>
                        <asp:SiteMapDataSource
                        SiteMapProvider=”MyMenuProvider”
                        ShowStartingNode=”False”
                        id=”QuickLaunchSiteMap”
                        StartingNodeUrl=”sid:1025″
                        runat=”server”
                        />
                    …………………………………
                </div>
                </Sharepoint:SPNavigationManager>

Una vez configurado en el masterpage, las páginas que la utilicen tendrán opciones de menú distintas a las del menú de inicio rápido.

Ahora solo tendremos que añadir en nuestra lista las opciones que necesitemos y configurar los permisos de cada una para cada grupo de usuarios.Con esto habremos conseguido que sea Wss3 quien gestione que opciones puede ver cada usuario.

 opcionesmenu

 

Es importante que reviséis el  código del provider, ya que se va a ejecutar varias veces por cada petición de una misma página. Por cada nodo que añadamos ejecutará el método Getchild, por lo que habrá que controlar la recursividad con el parámetro de la función y el método FindSiteMapNode.

 

Otras opciones

Existen más opciones para conseguir que nuestro menú de navegación muestre las opciones en función de las reglas de negocio y seguridad.

Algunos utilizan listas como repositorio de opciones, pero para visualizarlo utilizan un DataFormWebPart y modifican el xsl para dejarlo con el diseño del portal.

Otros prefieren utilizar listas como repositorio, pero en lugar del menú estándar crean su propio control de usuario y lo añaden a la masterpage.

También existe la copión de hacerse un menú de ASp.NEt a medida.

 

Existen muchas opciones, cada uno que elija la que mejor le venga. Pero como conclusión, el trabajar con proveedores como comentaba Jorge Diéguez nos aporta bastante grado de modularidad.

Publicado por

Mario Cortés

Mario Cortés Flores es MVP en Office 365, trabaja en Plain Concepts como Team Lead y escribe habitualmente en geeks.ms/blogs/mcortes y en Twitter @mariocortesf. Podréis encontrarlo colaborando activamente con la comunidad de MadPoint y SUGES

2 comentarios sobre “Opciones del QuickLaunch de Wss3 mediante SPNavitaionProvider”

  1. Una matización al código, si queremos que se ordene por un campo, podemos añadir una línea de manera que quede:

    SPQuery query = new SPQuery();
    query.ViewFields = ““;
    query.Query = ““;

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *