Programando WebParts – Parte 5 Interconectando WebParts Autor : Para : Fecha : Versión : Gustavo Velez www.gavd.net/servers/ 02-27-2005 1.0.0 Tal vez la actividad mas común cuando hablamos de programar para SharePoint, es hacer WebParts (“Elementos Web”, según la traducción de Microsoft). WebParts nos permiten añadir funcionalidad y personalizar una instalación de SharePoint/WSS de una manera fácil y rápida. Esta serie de artículos describen las diferentes posibilidades en cuanto a programación de WebParts: Parte 1 – Programando una WebPart básica Parte 2 – Propiedades y Panel de Herramientas Parte 3 – Distribución, archivos dwp y gallerías de WebParts Parte 4 – WebParts con código de cliente Parte 5 – Interconectando WebParts Parte 6 – WebPart asincrónicas Requisitos - - - WSS o SharePoint instalados y funcionando Conocimientos de cómo usar WebParts in SharePoint Visual Studio DotNet 2003 Plantillas para la creación de WebParts en Visual Studio. Se pueden bajar del sitio de Microsoft (http://www.microsoft.com/downloads/details.aspx?FamilyID=14D5D92F-C3A6407C-AAD7-B8C41A4991BE&displaylang=en) Conocimientos de programación y alguna experiencia sobre como usar Visual Studio. Todo el código en esta serie de artículos es escrito en C#, pero es fácilmente adaptable a VB. Conocimientos básicos del Modelo de Objetos (API) de SPS Los conocimientos básicos de cómo programar una WebPart y como registrarla se encuentran en la primera y segunda parte de la serie. WebParts Interconectadas A veces es necesario hacer que WebParts se pasen información de una a otra. El caso típico es una WebPart que muestra una lista desde una base de datos (WebPart Proveedor) y otra WebPart que muestra los detalles del record seleccionado (WebPart Consumidor). Las dos WebParts pueden intercambiar su información utilizando el servidor (modo ServerSide), el cliente (modo ClientSide) o una mezcla de los dos. En el ejemplo de este artículo se realiza un intercambio de información básica entre dos WebParts: el texto que se escribe en una de ellas es pasado a la segunda usando el modo ServerSide. Interfaces para la conexión Para realizar la interconexión es necesario definir primero que tipo de interfase es necesaria. El FrameWork provee seis pares de interfaces: Interface par Descripción ICellProvider, ICellConsumer Para cuando es necesario trabajar con un solo valor que es necesario transferir Para filtrar la forma en la que la información es mostrada en una lista Transfiere listas completas al consumidor, no solo un renglón Para normalizar la comunicación de parámetros entre diferente IFilterProvider, IFilterConsumer IListProvider, IListConsumer IParametersInProvider, IParametersInConsumer IParametersOutProvider, IParametersOutConsumer IRowProvider, IRowConsumer tipos de WebParts Igual a la anterior interfase, pero el proveedor mantiene el control sobre los parámetros Para trabajar con un renglón de datos Tanto el Proveedor como el Consumidor tienen que implementar el mismo par de interfaces. Si no es así, es necesario escribir un “Transformador” que convierte el tipo de datos que se envía en el tipo que se espera al lado del Consumidor. El ejemplo implementa “ICellProvider” y “ICellConsumer” porque solamente es necesario transferir un campo de datos. El Proveedor 1 - Luego de crear un proyecto de VisualStudio (vea la primera parte de esta serie de artículos), lo primero que hay que hacer es implementar el tipo de interfase correcto public class ProveedorWebPart : WebPart, ICellProvider { … 2 – Los eventos necesarios tienen que ser declarados public event CellProviderInitEventHandler CellProviderInit; public event CellReadyEventHandler CellReady; 3 – El método “EnsureInterfaces” notifica a la WebPart que tiene que registrar su interfase usando el método “RegisterInterface” public override void EnsureInterfaces() { try { RegisterInterface("ProveedorInterface_WPQ_", "ICellProvider", WebPart.UnlimitedConnections, ConnectionRunAt.Server, this, "ProveedorClienteInterface_WPQ_", "Provee un valor desde un TextBox", "Pasa el valor del TextBox a la WebPart 'Consumidor'"); } catch(SecurityException e) { Los parámetros del método “RegisterInterface” son: interfaceName interfaceType maxConnections runAtOptions interfaceObject isVisible interfaceClientReference menuLabel Description allowCrossPageConnection Nombre de la interfase Tipo de la interfase, por ejemplo IRowProvider Numero de conexiones que la interfase puede realizar. Posibles valores: WebPart.LimitOneConnection y WebPart.UnlimitedConnections. Específica donde puede ejecutar la interfase. Posibles valores: ConnectionRunAt.None, ConnectionRunAt.Server, ConnectionRunAt.Client y ConnectionRunAt.ServerAndClient. Referencia al objeto que implementa la interfase. Un Boolean que especifica si la interfase es visible. Para conexiones de modo client-side. Especifica el objeto cliente que implementa la interfase. Un nombre general para identificar la interfase y que será mostrado en la pantalla cuando se conecte la WebPart. La descripción de la interfase. Usado por FrontPage para especificar si la conexión se puede realizar a través de diferentes paginas 4 – Un “Override” del metodo “CanRunAt” es necesario para indicar la forma de conexión public override ConnectionRunAt CanRunAt() { return ConnectionRunAt.Server; //WebPart ejecuta en el servidor } 5 – El método “PartCommunicationConnect” se encarga de avisar cuando y que WebPart se ha conectado public override void PartCommunicationConnect(string interfaceName, WebPart connectedPart, string connectedInterfaceName, ConnectionRunAt runAt) { EnsureChildControls(); //Cuenta el numero de coneciones if(interfaceName == "ProveedorInterface_WPQ_") { webpartConnected = true; intNumberOfConnections++; connectedWebPartName = SPEncode.HtmlEncode(connectedPart.Title); } } 6 – Cuando la WebPart es inicializada, ejecuta todos los eventos en cuyo nombre esta “Init”. El método “PartCommunicationInit” tiene que ser override public override void PartCommunicationInit() { if(webpartConnected == true) { if (CellProviderInit != null) { CellProviderInitEventArgs cellProviderInitArgs = new CellProviderInitEventArgs(); cellProviderInitArgs.FieldName = cellName; cellProviderInitArgs.FieldDisplayName = cellDisplayName; CellProviderInit(this, cellProviderInitArgs); } } } 7 – El metodo “PartCommunicationMain” transmite los datos a la WebPart conectada public override void PartCommunicationMain() { if(webpartConnected == true) { if (CellReady != null) { CellReadyEventArgs cellReadyArgs = new CellReadyEventArgs(); cellReadyArgs.Cell = InputBox.Text; CellReady(this, cellReadyArgs); } } } 8 – Finalmente, los métodos “RenderWebPart” y “createChildControls” se encargan de crear la parte visual de la WebPart, como en una WebPart normal. 9 – Cree un nombre seguro para la WebPart (vea el primero de esta serie de artículos), configure el archivo “web.config” e instale la WebPart en una pagina La WebPart muestra un mensaje que indica que no esta conectada, y los controles de TextBox y botón están desactivados. El Consumidor 1 – Siga los pasos 1 a 6 del Proveedor, cambiando el código cuando sea necesario según indica el código fuente que acompaña el articulo (el código fuente puede ser bajado desde el mismo sitio en donde encontró este articulo) 2 – Para recolectar la información que el Consumidor necesita se usa el método “GetInitEventArgs” public override InitEventArgs GetInitEventArgs(string interfaceName) { if (interfaceName == "ConsumidorInterface_WPQ_") { EnsureChildControls(); CellConsumerInitEventArgs cellConsumerInitArgs = new CellConsumerInitEventArgs(); cellConsumerInitArgs.FieldName = cellName; return(cellConsumerInitArgs); } else { return(null); } } 3 – El Proveedor usa el manejador de eventos “CellProviderInit” para enviar información sobre como inicializar el Consumidor public void CellProviderInit(object sender, CellProviderInitEventArgs cellProviderInitArgs) { connectedFieldName = SPEncode.HtmlEncode(cellProviderInitArgs.FieldDisplayName); } 4 – Durante la comunicación entre Proveedor y Consumidor, el Proveedor pasa la información más importante usando el método “CellReady” public void CellReady(object sender, CellReadyEventArgs cellReadyArgs) { if(cellReadyArgs.Cell != null) { displayLabel.Text = cellReadyArgs.Cell.ToString(); } } 5 – Los métodos “RenderWebPart” y “createChildControls” se encargan de crear la parte visual de la WebPart, como en una WebPart normal. 6 – Cree un nombre seguro para la WebPart, configure el archivo “web.config” e instale la WebPart en una página La WebPart muestra un mensaje que indica que no esta conectada. Conectando Proveedor y Consumidor 1 – En el Proveedor, vaya a “Modificar Elemento Web compartido” y verá que aparece un nuevo renglón en el menú para realizar la conexión: Con una lista de todas las WebParts que utilizan una interfase compatible con el Proveedor (en nuestro caso, la “Consumidor WebPart”) 2 – Igualmente, desde el Consumidor aparece también un menú para realizar la conexión: 3 – Al seleccionar el Consumidor desde el Proveedor, o al contrario, se realiza la conexión entre las dos WebParts: Desaparece el mensaje de alerta, aparece un mensaje indicando como están conectadas las WebParts, y la funcionalidad del Proveedor es activada: