Los tipos de contenido de SharePoint nos permiten crear listas basadas en estructuras de datos. Facilitan la replicación de cambios dentro de la colección de sitios. Por ejemplo, podemos crear listas en distintos sitios, que hereden su estructura de un tipo de contenido del sitio raíz. De esta forma, un cambio en una columna del tipo de contenido, se replica en todas las listas que lo consumen.
Crear el tipo de contenido
El primer paso es crear un nuevo tipo de contenido. Para ello trabajamos con esta función:
1public string nuevoTipoContenido(SPSite sitio, string nombre)2
1{2
1 SPContentType viejoTC = sitio.RootWeb.ContentTypes[nombre];2
1 if (viejoTC == null)2
1 {2
1 SPContentType nuevoTC = new SPContentType(sitio.RootWeb.ContentTypes["Elemento"], sitio.RootWeb.ContentTypes, nombre);2
1 sitio.RootWeb.ContentTypes.Add(nuevoTC);2
1 nuevoTC.Group = "Surpoint";2
1 nuevoTC.Update();2
1 return "<span style='color: green'>Tipo de contenido " + nombre + " creado.</span><br />";2
1 }2
1 else2
1 {2
1 return "<span style='color: blue'>Tipo de contenido " + nombre + " ya existente.</span><br />";2
1 }2
1}2
Finalmente ejecutamos esta función desde nuestro programa:
contenido.InnerHtml = "";
1try2
1{2
1 SPSite oSiteCollection = SPContext.Current.Site;2
12
1 // Nuevos tipos de contenido2
1 contenido.InnerHtml += nuevoTipoContenido(oSiteCollection, "Riesgos_Planificaciones");2
12
1}2
1catch (Exception error)2
1{2
1 contenido.InnerHtml += "<span style='color: red'>Error: " + error + "</span><br />";2
1}2
En la siguiente imagen vemos el resultado:
Creación de columnas
En el segundo paso vamos a crear columnas de sitio y luego las vamos a incorporar dentro del tipo de contenido. Para ello armamos una primera función para crear columnas:
1public string nuevaColumnaSitioFecha(SPSite sitio, string internalName, string displayName, bool obligatoriedad, string descripcion)2
1{2
1 if (!sitio.RootWeb.Fields.ContainsField(internalName))2
1 {2
1 string nombreInternoNuevo = sitio.RootWeb.Fields.Add(internalName, SPFieldType.DateTime, obligatoriedad);2
1 SPFieldDateTime campoNuevo = (SPFieldDateTime)sitio.RootWeb.Fields.GetFieldByInternalName(nombreInternoNuevo);2
1 campoNuevo.Title = displayName;2
1 campoNuevo.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;2
1 campoNuevo.Description = descripcion;2
1 campoNuevo.Group = "Surpoint";2
1 campoNuevo.Update();2
1 return "<span style='color: green'>Columna " + internalName + " creada.</span><br />";2
1 }2
1 else2
1 {2
1 return "<span style='color: blue'>Columna " + internalName + " ya existente.</span><br />";2
1 }2
1}2
Ejecutamos esta función desde nuestro programa:
1contenido.InnerHtml += nuevaColumnaSitioFecha(oSiteCollection, "Planificado_Riesgo", "Fecha planificada del riesgo", false, "");2
1contenido.InnerHtml += nuevaColumnaSitioFecha(oSiteCollection, "Fecha_Planificacion_Riesgo", "Fecha de la planificación del riesgo", false, "");2
En la siguiente imagen vemos el resultado:
Para incorporar las columnas dentro del tipo de contenido, creamos una nueva función:
1public string agregarColumnaTipoContenido(SPSite sitio, string columna, string tipoContenido)2
1{2
1 SPContentType actualTC = sitio.RootWeb.ContentTypes[tipoContenido];2
1 if (!actualTC.Fields.ContainsField(columna))2
1 {2
1 SPField nuevaCol = sitio.RootWeb.Fields.GetFieldByInternalName(columna);2
1 SPFieldLink nuevaColLink = new SPFieldLink(nuevaCol);2
1 actualTC.FieldLinks.Add(nuevaColLink);2
1 actualTC.Update(true);2
1 return "<span style='color: green'>Columna " + columna + " agregada a " + tipoContenido + ".</span><br />";2
1 }2
1 else2
1 {2
1 return "<span style='color: blue'>Columna " + columna + " ya existente en " + tipoContenido + ".</span><br />";2
1 }2
1}2
Ejecutamos esta función desde nuestro programa y luego vemos la imagen con el resultado:
1contenido.InnerHtml += nuevaColumnaSitioFecha(oSiteCollection, "Planificado_Riesgo", "Fecha planificada del riesgo", false, "");2
1contenido.InnerHtml += nuevaColumnaSitioFecha(oSiteCollection, "Fecha_Planificacion_Riesgo", "Fecha de la planificación del riesgo", false, "");2
Creación de listas
En el último paso crearemos listas basadas en el tipo de contenido en varios subsitios de nuestra colección de sitios. Seguimos estos pasos:
1SPWebCollection collWebsite = oSiteCollection.AllWebs;2
1for (int i = 0; i < collWebsite.Count; i++)2
1{2
1 using (SPWeb oWebsite = collWebsite[i])2
1 {2
1 SPList listaRiesgos = oWebsite.Lists.TryGetList("Issues y riesgos");2
1 if (listaRiesgos != null)2
1 {2
1 // Nueva lista PR2
1 SPList listaPR = oWebsite.Lists.TryGetList("Riesgos_Planificaciones");2
12
1 if (listaPR == null)2
1 {2
1 SPListCollection listas = oWebsite.Lists;2
1 listas.Add("Riesgos_Planificaciones", "", SPListTemplateType.GenericList);2
1 contenido.InnerHtml += "<span style='color: green'>" + oWebsite.Title + "Lista PR creada</span><br />";2
1 // Tipo de contenido y versionado2
1 SPList listaPRNueva = oWebsite.Lists["Riesgos_Planificaciones"];2
1 listaPRNueva.EnableVersioning = true;2
1 listaPRNueva.ContentTypesEnabled = true;2
1 listaPRNueva.Update();2
1 listaPRNueva.ContentTypes.Add(oSiteCollection.RootWeb.ContentTypes["Riesgos_Planificaciones"]);2
1 contenido.InnerHtml += "<span style='color: green'>" + oWebsite.Title + "Lista PR - Tipo de Contenido agregado</span><br />";2
1 listaPRNueva.ContentTypes["Elemento"].Delete();2
1 contenido.InnerHtml += "<span style='color: green'>" + oWebsite.Title + "Lista PR - Tipo de Contenido elemento ajustado</span><br />";2
1 // Creación de columna propia de la lista (no heredadas del tipo de contenido)2
1 listaPRNueva.Fields.AddLookup("Riesgo", listaRiesgos.ID, true);2
1 }2
1 else2
1 {2
1 contenido.InnerHtml += "<span style='color: blue'>" + oWebsite.Title + ": Ya existe la lista PR</span><br />";2
1 }2
12
1 }2
1 else2
1 {2
1 contenido.InnerHtml += "<span style='color: blue'>" + oWebsite.Title + ": No existe la lista Padre Riesgos</span><br />";2
1 }2
1 }2
1}2
En la imagen podemos ver la lista creada, el tipo de contenido y las columnas:
Conclusión
En esta primera versión del artículo hemos visto como trabajar con tipos de contenido en forma programática, no declarativa. En próximos artículos veremos algunos temas más avanzados. Espero les haya resultado de utilidad.
Juan Pablo Pussacq Laborde SharePoint MVP Blog: http://surpoint.blogspot.com/