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 \\miservidor\juan y si en otro momento esta conectado Angel, que mostrara el contenido de \\miservidor\angel.
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.

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.

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.
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.

Bueno, espero que este post os sea de utilidad y desearos a todos una ¡Feliz Navidad!
Published
22/12/2008 19:02
por
Angel Acha Lizama
Comparte este post: