¿Cómo extender la funcionalidad de las webparts proporcionadas por SharePoint?

Muchas veces cuando estamos desarrollando en SharePoint, nos encontramos que la funcionalidad proporcionada por las webparts disponibles por defecto en SharePoint, no alcanza a cubrir toda la funcionalidad que desearíamos o que nos viene impuesta por los requisitos del proyecto.


En estos casos, una alternativa que se nos plantea es extender la funcionalidad de estas webparts, para dar respuesta a las nuevas necesidades que deseamos cubrir. Para llevar a cabo esta ampliación de la funcionalidad, en principio podemos plantearnos por ejemplo una de las siguientes opciones:



  • Crear una webpart, que herede de la clase de webpart cuya funcionalidad queremos ampliar (en el caso de que la definción de la clase nos lo permita, porque no esta sellada o “sealed”) y sobreescribir aquellos métodos y propiedades que deseamos modificar.
  • Crear una webpart, que incluya la webpart cuya funcionalidad queremos utilizar como si fuera un control de servidor más y añadir la lógica que deseamos implementar.

En este post, nos vamos a centrar en el segundo caso, y desarrollaremos dos pruebas de concepto, donde explicaremos como ampliar la funcionalidad de dos webparts proporcionadas por defecto en una instalación de Windows SharePoint Services v3 (WSS) y de MOSS respectivamente.


Extender la PageViewerWebPart


En el primer caso, estudiaremos como ampliar la funcionalidad de la webpart PageViewerWebPart. Esta webpart proporcionada con WSS v3, permite mostrar contenido de una página web enlazada, de una carpeta o de un fichero. Para que la webpart funcione correctamente, es necesario que  bien en tiempo de diseño o en tiempo de ejecución (mediante la configuración de la webpart), indiquemos la localización y tipo de recurso (página web, carpeta o fichero) que deseamos mostrar.


Por ejemplo, un posible requisito que podríamos encontrarnos podría ser el que fuera posible mostrar una carpeta compartida distinta en función del usuario que estuviera conectado en cada momento. Por ejemplo, si en un determinado momento esta conectado Juan, mostrar en esa webpart el contenido de la carpeta \miservidorjuan y si en otro momento esta conectado Angel, que mostrara el contenido de \miservidorangel.


Esta funcionalidad podemos obtenerla, abriendo el panel de configuración de la webpart y cambiando mediante la interfaz de usuario, el valor de la propiedad Link (ContentLink), pero no es posible realizarlo de forma dinámica en función del usuario conectado, con la funcionalidad proporcionada por defecto con esta webpart.


 PageViewerWebPart


Para añadir esta funcionalidad vamos a desarrollar nuestra propia webpart, de forma que extienda la funcionalidad de la PageViewerWebPart, para lo que seguiremos los siguientes pasos:



  • Crear una webpart nueva que herede de la clase System.Web.UI.WebControls.WebParts.WebPart





        public class CIINPageViewerWebPart: System.Web.UI.WebControls.WebParts.WebPart



  • Añadir la webpart PageViewerWebPart como un control





        PageViewerWebPart pvWebPart;



  • Modificar el método CreateChildControls de nuestra webpart, para añadir la lógica de configuración del control PageViewerWebPart (en especial la propiedad PageViewerWebPart.ContentLink) y añadirlo a la colección de controles de la misma.






       protected override void CreateChildControls()
        {
            // Crear una instancia de la PageViewerWebPart
            pvWebPart = new PageViewerWebPart();

            // Obtener el usuario actual
            SPUser usuario = SPContext.Current.Web.CurrentUser;
            String UserLoginName = usuario.LoginName;
            String LoginName = UserLoginName.Substring(UserLoginName.LastIndexOf(“\”) + 1);

            // Establecer la ruta
            path = @”\miservidor”;
            String path2 = path + LoginName;

            // Configurar y añadir control a nuestra webpart
            pvWebPart.ContentLink = path2;
            this.Controls.Add(pvWebPart);
        }



Código completo






using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Security.Principal;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace CIIN.WebParts
{
    [Guid(“2fdb9fa1-5571-4bff-b2f3-71ca7cfc6265”)]
    public class CIINPageViewerWebPart : System.Web.UI.WebControls.WebParts.WebPart
    {
        PageViewerWebPart pvWebPart;
        String path = null;

        protected override void CreateChildControls()
        {
            // Crear una instancia de la PageViewerWebPart
            pvWebPart = new PageViewerWebPart();


            // Obtener el usuario actual
            SPUser usuario = SPContext.Current.Web.CurrentUser;
            String UserLoginName = usuario.LoginName;
            String LoginName = UserLoginName.Substring(UserLoginName.LastIndexOf(“\”) + 1);


            // Establecer la ruta
            path = @”\miservidor”;
            String path2 = path + LoginName;


            // Configurar y añadir control a nuestra webpart
            pvWebPart.ContentLink = path2;
            this.Controls.Add(pvWebPart);
        }
    }
}


De esta forma hemos creado una webpart que haciendo uso de la lógica proporcionada por PageViewerWebPart amplia su funcionalidad hasta lograr cubrir los requisitos que andabamos buscando.


 PageViewerWebPart Modificado


Extender las webparts de OWA


En el segundo caso, estudiaremos como ampliar la funcionalidad de la familia de webparts de OWA (OWAPart, OWACalendarPart, OWAContactsPart, OWAInboxPart, OWATaskPart) que vienen incluidas con MOSS y que permiten accerder a un buzón de correo Exchange utilizando la tecnología de Outlook Web Access (OWA).

Por ejemplo, un posible requisito que podríamos encontrarnos podría ser el que fuera posible mostrar los datos de los diferentes buzones que tengamos creados en el buzón de correo de Exchange, en respuesta a un valor establecido por el usuario en tiempo de ejecución.

Esta funcionalidad se puede lograr utilizando la webpart OWAPart, abriendo su panel de configuración y cambiando el valor de la propiedad Exchange Folder Name (ExchangeFolderName), pero no es posible realizarlo de forma dinámica en función de un valor elegido por el usuario en tiempo de ejecución, con la funcionalidad proporcionada por defecto con esta webpart.

 OWAPart

Para lograr añadir esta funcionalidad, vamos a desarrollar nuestra propia webpart y seguir los siguientes pasos:


  • Crear una webpart nueva que herede de la clase System.Web.UI.WebControls.WebParts.WebPart





          public class CIINOWAPart: System.Web.UI.WebControls.WebParts.WebPart



  • Añadir la webpart OWAWebPart como un control  y añadir una lista desplegable  donde se mostrarán las distintas carpetas de nuestro buzón a las que queremos dar acceso a través de la webpart





          OWAPart owapart;
          DropDownList opcion;



  • Modificar el método CreateChildControls de nuestra webpart, para añadir la lógica de configuración del control OWAPart y de la lista desplegable, y añadirlos a la colección de controles de la misma.






        protected override void CreateChildControls()
        {
            // Crear una instancia de la OWAPart y configurar algunas de sus propiedades
            owaPart = new OWAPart();
            ………..    


            // Crear una lista desplegable y establecer las diferentes carpetas a las que queremos acceder
            opcion = new DropDownList();
            opcion.Items.Add(“Bandeja de entrada”);
            ………..

            // Configurar el manejador de eventos y comportamiento de Postback de la lista desplegable
            opcion.AutoPostBack = true;
            opcion.SelectedIndexChanged += new EventHandler(opcion_SelectedIndexChanged);

            // Añadir la lista desplegable y el control OWA a nuestra webpart
            this.Controls.Add(opcion);
            this.Controls.Add(owaPart);
        }




  • Añadir el código del manejador de eventos de la lista desplegable para que apunte a la carpeta de exchange que el usuario seleccione en la lista desplegable (Bandeja de entrada, Bandeja de Salida, Calendario, Tareas, Contactos, ….), de forma que modifique  el valor de la propiedad OWAPart.ExchangeFolderName en función del valor seleccionado.





        // Manejador de evento que cambia la carpeta a la que apunta la webpart en funcion de la seleccionada
        void opcion_SelectedIndexChanged(object sender, EventArgs e)
        {
            owaPart.ExchangeFolderName = opcion.SelectedItem.Text;
        }


Código completo






using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Security.Principal;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Portal.WebControls;

namespace CIIN.WebParts
{
    [Guid(“2fdb9fa1-5571-4bff-b2f3-71ca7cfc6266”)]
    public class CIINOWAPart : System.Web.UI.WebControls.WebParts.WebPart
    {
        OWAPart owaPart;
        DropDownList opcion;

        protected override void CreateChildControls()
        {
            // Crear una instancia de la OWAPart y configurar algunas de sus propiedades
            owaPart = new OWAPart();
            owaPart.MailboxName = “mibuzon@ejemplo.es”;
            owaPart.OWAServerAddressRoot = “http://miservidorexchange.es/exchange”;
            owaPart.ExchangeFolderName = “Calendario”;            


            // Crear una lista desplegable y establecer las diferentes carpetas a las que queremos acceder
            opcion = new DropDownList();
            opcion.Items.Add(“Bandeja de entrada”);
            opcion.Items.Add(“Bandeja de salida”);
            opcion.Items.Add(“Elementos enviados”);
            opcion.Items.Add(“Calendario”);
            opcion.Items.Add(“Tareas”);
            opcion.Items.Add(“Contactos”);
            opcion.Items.Add(“Borradores”);


            // Configurar el manejador de eventos y comportamiento de Postback de la lista desplegable
            opcion.AutoPostBack = true;
            opcion.SelectedIndexChanged += new EventHandler(opcion_SelectedIndexChanged);


            // Añadir la lista desplegable y el control OWA a nuestra webpart
            this.Controls.Add(opcion);
            this.Controls.Add(owaPart);
        }


        // Manejador de evento que cambia la carpeta a la que apunta la webpart en funcion de la seleccionada
        void opcion_SelectedIndexChanged(object sender, EventArgs e)
        {
            owaPart.ExchangeFolderName = opcion.SelectedItem.Text;
        }
    }
}


De esta forma hemos creado una webpart que haciendo uso de la lógica proporcionada por la OWAPart amplia su funcionalidad hasta lograr cubrir los requisitos que andabamos buscando.


 OWAPart Modificado


Bueno, espero que este post os sea de utilidad y desearos a todos una ¡Feliz Navidad!

Un comentario en “¿Cómo extender la funcionalidad de las webparts proporcionadas por SharePoint?”

Deja un comentario

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