El día de hoy quiero compartir con ustedes un ejemplo de cómo crear columnas de sitio y tipos de contenido programáticamente. El objetivo final es crear un tipo de contenido que herede del tipo de contenido WorkflowTask (el que se utiliza para las tareas que se asignan en los flujos de trabajo), utilizando dos columnas de sitio, la primera será una columna que permitirá al usuario capturar su respuesta (Aprobar | Rechazar), la segunda permitirá capturar comentarios acerca de su respuesta.
Sin mucho preámbulo comencemos creando un proyecto en blanco con un elemento Feature con scope Site, al cual agregaremos un Event Receiver
Inmediatamente después comenzamos a tirar un poco de código en el método FeatureActivated para crear en primera instancia las dos columnas de sitio que utilizaremos:
SPWeb web = null; if (properties.Feature.Parent is SPSite) { SPSite sites = (SPSite)properties.Feature.Parent; web = sites.RootWeb; } else { web = (SPWeb)properties.Feature.Parent; } if (web == null) return; //Nombre del grupo de Content Types que crearemos string contentTypeGroupName = "Blog - Content Types"; //Nombre del tipo de contenido que crearemos string contentTypeName = "Blog - Response Workflow Content Type"; //Nombre del grupo de columnas de sitio que crearemos string columnGroupName = "Blog - Site Columns"; //nombre de la columna de sitio que permitira al usuario seleccionar su respuesta (Approve | Reject) string choiceFieldName = "ChoiceWFResponse"; //nombre de la columna de sitio que permitira al usuario capturar comentarios a cerca de su respuesta string commentsFieldName = "CommentsWFResponse"; SPFieldMultiLineText approveRejectCommentsField = null; SPFieldChoice approveRejectChoiceField = null; /*Columna de sitio para seleccionar Aprobar o Rechazar*/ //mucho ojo! Validamos si la columa de sitio ya existe if (!web.Fields.ContainsField(choiceFieldName)) { string approveReject = web.Fields.Add(choiceFieldName, SPFieldType.Choice, true); approveRejectChoiceField = (SPFieldChoice)web.Fields.GetFieldByInternalName(approveReject); approveRejectChoiceField.Group = columnGroupName; approveRejectChoiceField.EditFormat = SPChoiceFormatType.RadioButtons; approveRejectChoiceField.Choices.Add("Approve"); approveRejectChoiceField.Choices.Add("Reject"); approveRejectChoiceField.DefaultValue = "Approve"; approveRejectChoiceField.Update(); } //Si ya existe, solo obtenemos una referencia a la columna else { approveRejectChoiceField = web.Fields[choiceFieldName] as SPFieldChoice; } /*Columna de sitio para permitir al usuario ingresar un comentario*/ if (!web.Fields.ContainsField(commentsFieldName)) { string comments = web.Fields.Add(commentsFieldName, SPFieldType.Note, true); approveRejectCommentsField = (SPFieldMultiLineText)web.Fields.GetFieldByInternalName(comments); approveRejectCommentsField.Group = columnGroupName; approveRejectCommentsField.Update(); } else { approveRejectCommentsField = web.Fields[commentsFieldName] as SPFieldMultiLineText; }
Una vez que las hemos creado, procedemos a crear el tipo de contenido utilizando las columnas de sitio.
// //Ahora creamos el tipo de contenido // //heredamos del WorkflowTask Content Type SPContentType workflowTaskCType = web.AvailableContentTypes[SPBuiltInContentTypeId.WorkflowTask]; SPContentType approvalRejectCType = null; bool isUpdating = false; //validamos si el tipo de contenido ya existe if (web.AvailableContentTypes[contentTypeName] == null) { approvalRejectCType = new SPContentType(workflowTaskCType, web.ContentTypes, contentTypeName); approvalRejectCType = web.ContentTypes.Add(approvalRejectCType); approvalRejectCType.Group = contentTypeGroupName; } else { approvalRejectCType = web.ContentTypes[contentTypeName]; isUpdating = true; } if (!isUpdating) { //agregamo la columna de Seleccion SPFieldLink approveRejectFieldRef = new SPFieldLink(approveRejectChoiceField); approveRejectFieldRef.Required = true; approveRejectFieldRef.DisplayName = "Approve or Reject the task"; approvalRejectCType.FieldLinks.Add(approveRejectFieldRef); //agregamo la columna de Comentarios SPFieldLink commentsFieldRef = new SPFieldLink(approveRejectCommentsField); commentsFieldRef.DisplayName = "Comments"; approvalRejectCType.FieldLinks.Add(commentsFieldRef); } else { //Actualizamos la columna de Seleccion SPFieldLink approveRejectFieldRef = approvalRejectCType.FieldLinks[approveRejectChoiceField.Id]; approveRejectFieldRef.Required = true; approveRejectFieldRef.DisplayName = "Approve or Reject the task"; //Actualizamos la columna de Comentarios SPFieldLink commentsFieldRef = approvalRejectCType.FieldLinks[approveRejectCommentsField.Id]; commentsFieldRef.DisplayName = "Comments"; } //actualizamos el tipo de contenido approvalRejectCType.Update(true);
Hacemos Deploy de nuestro proyecto y validamos que se hayan creado las columnas de sitio y el tipo de contenido
Listo!
Pueden descargar el código de aquí
Happy Coding!
Listo!
Pueden descargar el código de aquí
Happy Coding!
0 comentarios:
Publicar un comentario