[MOSS 2007] Conectar WebParts programáticamente

Conectar 2 WebParts (por ejemplo un buscador y grid) a través del interfaz de SharePoint es una cosa sencilla, pero seguro que alguna vez has necesitado hacerlo a través del modelo de objetos de MOSS. En nuestro caso tenemos varios Custom WebParts que una vez desplegado el portal necesitamos conectarlos y lo hemos hecho vía Feature (No voy a poner el código entero del FeatureReceiver).

Uno de los problemas que te puedes encontrar al hacer esto lo comenté en un post anterior:

http://geeks.ms/blogs/lruiz/archive/2009/11/18/moss-2007-webparts-del-tipo-errorwebpart-aparecen-cuando-usamos-splimitedwebpartmanager.aspx

y en nuestro caso son buscadores sobre unos custom CQWP, por eso el Receiver al no disponer de contexto debe contener estas líneas:

if (HttpContext.Current == null)
{
    HttpRequest httpRequest = new HttpRequest(String.Empty, web.Url, String.Empty);
    HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));
    HttpContext.Current.Items["HttpHandlerSPWeb"] = web;
}

Una vez hecho esto, a través de las propiedades de la feature, obtenemos la página y los 2 WebPart que queremos conectar.

Localizamos la página en la colección de páginas, obtenemos una referencia al objeto SPFile (Para poder hacer CheckOut, CheckIn y Publish).

Obtenemos una referencia al SPLimitedWebPartManager de la página para poder obtener la colección de WebParts de la misma mediante la propiedad WebParts.

Una vez que hemos localizado los 2 WebParts que vamos a conectar, obtenemos el ConsumerConnectionPointCollection (Contiene una colecciónde ConsumerConnectionPoint que habilita a un WebPart a actuar como Provider) y el ProviderConnectionPointCollection (Contiene una colección de ProviderConnectionPoint que habilita a un WebPart a actuar como Provider).

Una vez hecho esto necesitamos un objeto del tipo SPWebPartConnection que lo obtenemos mediante el método SPConnectWebParts al que le pasamos como parámetros el WebPart que suministra la conexión y su ProviderConnectionPoint y el WebPart que va a consumir su conexión y su ConsumerConnectionPoint.

Por último añadimos a la colección de conexiones del WebPartManager la conexión que hemos obtenido anteriormente y ya tendremos nuestros WebPart conectados vía modelo de objetos.

Aquí está el código de ejemplo:

PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web);
PublishingPageCollection pages = publishingWeb.GetPublishingPages();
 
/// Check if the Page exists, null if not exists
PublishingPage page = pages.SingleOrDefault(p => p.Name == pageName);
 
if (page != null)
{
    SPWebparts.WebPart wpProvider = null;
    SPWebparts.WebPart wpConsumer = null;
 
    /// Get SPFile because it's necessary for Publish and Approve(This one if
    /// PagesList.EnableModeration is true)
    SPFile aspx = web.GetFile(page.Url.ToString());
 
    aspx.CheckOut();
 
    SPLimitedWebPartManager webPartManager =
        aspx.GetLimitedWebPartManager(PersonalizationScope.Shared);
 
    SPLimitedWebPartCollection webparts =
        webPartManager.WebParts;
 
    wpProvider = (SPWebparts.WebPart)webPartManager.WebParts[webpart.ID];
    wpConsumer = (SPWebparts.WebPart)webPartManager.WebParts[webpart.ID];
 
    /// Creates the connection
    if (wpProvider != null &&
        wpConsumer != null)
    {
        ConsumerConnectionPointCollection consumerConnection
            = webPartManager.GetConsumerConnectionPoints(wpConsumer);
 
        ProviderConnectionPointCollection providerConnection
            = webPartManager.GetProviderConnectionPoints(wpProvider);
 
        SPWebPartConnection webPartConnection =
            webPartManager.SPConnectWebParts(wpProvider,
                                             providerConnection[0],
                                             wpConsumer,
                                             consumerConnection[0]);
 
        webPartManager.SPWebPartConnections.Add(webPartConnection);
    }
 
    aspx.CheckIn(String.Empty);
    aspx.Publish(String.Empty);
 
    if (publishingWeb.PagesList.EnableModeration)
    {
        aspx.Approve(String.Empty);
    }
}

Un saludo

Published 19/1/2010 8:52 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2010/01/19/moss-2007-conectar-webparts-program-225-ticamente.aspx