Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

¿Qué es el GetLimitedWebPartManager? Utilidad y uso

En este post voy a explicar detalladamente uno de los componentes más importantes que hay en SharePoint, su nombre no es muy conocido es el GetLimitedWebPartManager. Si en lugar de decir este palabrota indicamos que es un objeto dentro del modelo de objetos servidor de SharePoint que es el encargado de todos los aspectos relacionados con los WebParts dentro de una página, quizás ya os va sonando mucho mejor.

¿Por qué es importante?

En más de una ocasión he comentado que uno de los grandes problemas que hay dentro de los desarrollos de SharePoint es el ciclo de vida de la Aplicación, ya que la migración entre entornos es un gran problema en multitud de equipos y proyectos que se llevan a cabo. Para poder migrar los entornos sin muchos problemas hay que conocer muy bien SharePoint y todos sus elementos, además de seguir unas pautas en los desarrollos,etc… hay que tener conocimiento. En Encamina estamos desarrollando un FrameWork ENMARCHA que nos facilita la migración entre entornos de una forma más simple.
Para la creación/actualización de las páginas de un entorno en otro tenemos dos opciones:

  1. Crear una característica con todas las configuración de las páginas que tiene nuestro sitio. Además de añadir toda la configuración de estos WebParts en esta carácteristica, con las peculiaridad de que cada WebPart es totalmente diferente al anterior. Un ejemplo de como hacerlo es este post del maestro Juan Carlos Gonzalez  
  2. La otra opción es que exista alguna forma de obtener los WebParts que hay en una página y extraer su configuración para posteriormente importarla en el otro entorno.

Si nos decantamos por la opción 1 es una elección que da mucho más trabajo y que obliga al programador a cada página que se cree actualizar la característica y sobre todo la configuración. Además el equipo no solo lo forma programadores sino también esta forma por otros integrantes que quizás tengan que crear páginas y darles contenido. Por lo que esta opción NO es una opción valida.

La opción 2 en una primera impresión parece una carta a los Reyes Mayos, pero es mucho más próxima a la realidad. Ya que el GetLimitedWebPartManager nos puede ayudar y mucho en este objetivo. Esta clase tiene una función para obtener todos los WebParts de una página y también de poder extraer la configuración de estos WebParts en un fichero de configuración.
Extraer los WebParts
Para extraer los WebParts de una página con un código semejante al siguiente es posible:

                var spPageCollection = Web.Lists[Name].GetItems();
                foreach (SPItem page in spPageCollection)
                {
                    try
                    {
                        var url = page["ows_FileRef"].ToString();
                        using (var wpMgr =
                            Web.GetLimitedWebPartManager(
                                url, PersonalizationScope.Shared))
                        {
                            foreach (Microsoft.SharePoint.WebPartPages.WebPart webpart in wpMgr.WebParts)
                            {
                                if (!Directory.Exists(string.Concat(Directory.GetCurrentDirectory(), "/WebParts/", Name,
                                    "/", page["Title"], "/", Path.GetFileName(url))))
                                {
                                    Directory.CreateDirectory(string.Concat(Directory.GetCurrentDirectory(),
                                        "/WebParts/", Name,
                                        "/", page["Title"], "/", Path.GetFileName(url)));
                                }
                                var xwTmp =
                                    new XmlTextWriter(string.Concat(Directory.GetCurrentDirectory(), "/WebParts/", Name,
                                        "/", page["Title"], "/", Path.GetFileName(url), "/", webpart.Title),
                                        Encoding.UTF8);
                                try
                                {
                                    wpMgr.ExportWebPart(webpart, xwTmp);
                                    xwTmp.Flush();
                                    xwTmp.Close();
                                }
                                catch (Exception exception)
                                {
                                    Logger.Error(exception.Message);
                                }
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        Logger.Error(string.concat("Errr Extract WebParts ",exception.Message));
                    }
                }

El código arriba mencionado lo que hace es leer una biblioteca de Páginas y sobre cada elemento de esta biblioteca extrae estos WebParts a unos ficheros de configuración para posteriormente poderlos importar en otro entorno.

Importar los WebParts
Para importar los WebParts previamente exportados, se hace de una forma muy sencilla con leer los ficheros anteriormente creados y con el método ImportWebPart que esta incluido dentro del GetLimitedWebPartManager. Con un código como el siguiente es posible:

var directoryCollection =
                Directory.GetDirectories(string.Concat(Directory.GetCurrentDirectory(), "\\WebParts\\", Name));
            foreach (var directory in directoryCollection)
            {
                var url = Path.GetFileName(directory);
                var fileCollection = Directory.GetFiles(directory);
                foreach (var file in fileCollection)
                {
                    using (var wpMgr =
                        Web.GetLimitedWebPartManager(
                            "SitePages/" + url, PersonalizationScope.Shared))
                    {
                        var webPart = System.IO.File.ReadAllText(file);
                        var reader = new XmlTextReader(new StringReader(webPart));
                        string mensajeError;
                        var wp = wpMgr.ImportWebPart(reader, out mensajeError);
                        wpMgr.AddWebPart(wp, "", 0);
                    }
                }
            }

Posibles Problemas
No todo es color de rosa, anteriormente he indicado que hace falta conocimiento para poder realizar estos pasos. Esta claro que para estos dos pasos los puede realizar cualquier developer sin conocimientos sobre SharePoint. Pero developers que conocemos como funciona SharePoint podremos saber que esta forma funciona en la gran mayoría de los WebParts que existen, pero existen ciertas particularidades entre entornos. En primer lugar hay WebParts que muestran la información relativa a una lista (XSLTViewWebParts) este WebPart esta vinculado a la lista mediante un ID de lista y este Identificador es diferente dependiendo del entorno en el que nos encontremos. Por lo que para poder importarlo entre un entorno u otro hay que realizar algunas modificaciones en el fichero de configuración. Estas modificaciones no son objeto de este post, aunque las aboraderemos en futuros post.

Conclusión

SharePoint en algunos desarrollos no es una herramienta sencilla y hace falta un conocimiento relativamente importante sobre la plataforma para poder abordar algunos aspectos. Esta dificultad en Encamina la intentamos abordar através de ENMARCHA para establecer las pautas en los desarrolos y que sirva de guía a todos los miembros del equipo para facilitarnos los aspectos más complejos de SharePoint. Pero más allá de todo esto hace que funcionemos como un EQUIPO.

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en buenas practicas y etiquetada como , , . Enlace permanente .
Suscríbete a Desarrollando sobre SharePoint

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!

ENCAMINA, piensa en colores