SharePoint como herramienta de desarrollo es una plataforma muy versátil y que permite muchas variantes. Recientemente hemos tenido que dotar una solución un tanto particular que como resultado ha tenido este post. Esta solución me parece muy útil y que se puede extender en muchos desarrollos.
Caso de Uso
Tenemos una página en la que mostramos diversos webParts de tipo XSLTViewWebPart con los elementos de una lista de SharePoint. Imaginad el caso base tenemos una página de artículos en la que por un lado vemos los artículos que tenemos en el almacén, los artículos que tenemos en cada tienda, los precios de compra y de venta y por ejemplo las reservas. En base a este diseño (que no vamos a discutir si es la mejor opción o no) tenemos que implementar «algo» que filtre sobre todos estos elementos.
Posibilidades
- Rehacer lo todo, abandonar los XSLT y utilizar por ejemplo los Display Templates que hay o bien otra herramienta como pueda ser Mustache
- Duplicar los XSLT por tantas opciones queramos poner y ocultar los webparts mediante JavaScript.
- Modificar los valores de los XSLT y adecuarlos a las peticiones de los usuarios
Analizando las posibilidades
La opción 2: descartada por muchos motivos, rendimiento, poco profesional, ñapa o como lo queráis definir… lo veis todo no?
La opción 1: esta clara que es la mejor opción, es la opción que hace que nuestro producto sea más escalabre, más reutilizable y mas adaptado a las necesidades futuras del cliente. Pero hay diversos elementos que pueden hacer que no la podamos hacer. Por ejemplo requerimientos del cliente, tiempos, esas cosas que nos encontramos en nuestro día a día y que tenemos que vivir más de lo que nos gustaría.
La opción 3: Cuya principal ventaja es que aprovechamos todo el desarrollo previo, ahora bien la dificultad radica en saber como podemos cambiar estos valores por defecto una vez la página esta cargada. La respuesta es que podemos cambiar el valor de los WebParts y de hay este post.
Manos a la obra
Para modificar el valor vamos a implementar un WebPart Visual en la que utilizaremos el modelo de objetos servidor de SharePoint.
El primer paso es una vez carga la página recorremos los WebParts que tiene la página de la siguiente forma:
foreach (System.Web.UI.WebControls.WebParts.WebPart webPart in this.WebPartManager.WebParts) { }
El siguiente paso que tenemos que hacer es dentro de estos WebParts tendremos que encontrar los que son de tipo XSLTViewWebPart porque en una página podemos encontrarnos cualquier tipo de WebPart. Una vez tenemos un WebPart del tipo XSLTViewWebPart el siguiente paso es sobreescribirle el evento DataBinding, que lo que hace es en el momento que el WebPart va a cargar los datos lo que tenemos que hacer es lo que nosotros le indicamos en este evento. Naturalmente en este evento lo que nosotros vamos ha hacer es pasarle nuestra consulta CAML que necesitamos.
Un ejemplo de ese código
xsltListViewWebPart.DataBinding += new EventHandler(xsltListViewWebPart_DataBinding); void xsltListViewWebPart_DataBinding(object sender, EventArgs e) { if (xsltListViewWebPart != null) { SPDataSource ds = xsltListViewWebPart.DataSource as SPDataSource; if (ds != null) { string query = @"" + @"reserva prueba sso" + @""; string xmlSelectCommand = string.Empty; XmlDocument viewXmlDoc = new XmlDocument(); viewXmlDoc.LoadXml(ds.SelectCommand); XmlNode queryNode = viewXmlDoc.DocumentElement.SelectSingleNode("Query"); queryNode.InnerXml.Remove(0); //txtActivo.Text ="text"+ queryNode.InnerXml; queryNode.InnerXml = query; xmlSelectCommand = viewXmlDoc.OuterXml; ds.SelectCommand = xmlSelectCommand; xsltListViewWebPart.DisableColumnFiltering = true; } } }
Conclusión
Esta forma de modificar las propiedades de los WebParts nos brinda bastantes oportunidades para extenderlo en algunas ocasiones donde hay que reaprovechar el desarrollo previo o bien utilizar los WebParts de SharePoint pero dotarles de un funcionamiento extra. En este ejemplo lo hemos modificado sobre un XSLTViewWebPart, pero es igual de sencillo realizarlo sobre cualquier otro tipo de WebPart. Como cada vez que se nos presenta un nuevo reto lo bonito es encontrar la solución para solventarlo y en esta ocasión podemos decir que cumplimos con las expectativas 🙂