lunes, 26 de enero de 2009

Implementación de Contentypes

Los contentypes serán uno de nuestros elementos en nuestros desarrollos sobre Sharepoint.

Para ver una introducción acerca de los contentypes y cómo manejarlos desde la interfaz gráfica podéis leer el post “Tipo de Contenido en SharePoint” de Jorge Diéguez.

En este post nos centraremos en la definición de contentypes mediante features creadas con “Herramientas para el desarrollo en Sharepoint”.

Empezaremos por definir nuestro contentype desde la interfaz gráfica. Con esto conseguiremos que Sharepoint cree la definición del contentype por nosotros. Para extraer esa definición a xml utilizaremos alguna de las herramientas disponibles como: Sharepoint Manager, FieldsExplorer o Feature Generator.

Para el ejemplo crearemos en Sharepoint un contenttype para almacenar los datos de los empleados. Definimos entonces el contentype Empleados con las columnas: Nombre, apellidos, número empleado.

Una vez creado el tipo de contenido, abriremos el Visual Studio y crearemos una solución con las extensiones de VSeWSS. Crearemos un proyecto del tipo “Empty” y añadiremos un elemento del tipo “ContentType”. Al añadir el elemento Visual studio nos preguntará sobre que tipo primario queremos que herede nuestro contentype. En este caso elegiremos “Item” o “elemento”, aunque podremos elegir cualquiera de los primarios que nos aparezca en la lista.

Sobre la vista VSeWSS veremos una nueva Feature, en mi caso con el nombre “EmpleadosContentType”.

Abriremos a continuación el fichero Xml que nos a generado las extensiones. En mi caso “EmpleadosContentype.xml”. Veremos que tenemos una definición de un contentype que hereda del tipo primario “Item”.

Este xml será el que defina nuestro contentype. En la sección fieldrefs añadiremos todas las referencias a los tipos de columnas o “Site columns” definidas previamente. En caso de tener que utilizar nuevos tipos de columnas las podremos definir mediante el tag “Field” bien en este fichero o en otro de esta u otra feature. Cada site column tiene un GUID único, por lo que para referenciarla utilizaremos este valor especificado en el atributo “ID”. En caso de utilizar columnas estándar definidas por Sharepoint, tendremos que buscar sus GUID’s y no será necesario tener que definirlas de nuevo.

Para obtener toda esta información utilizaremos Sharepoint Manager 2007. Navegaremos a nuestra colección y desplegaremos el elemento “Content types” alojado en la raíz de la colección. A continuación seleccionaremos la pestaña “Schema Xml”.

Esto nos mostrará la definición de nuestro content type en xml. Copiaremos el Xml generado y lo pegaremos en nuestro fichero XML dentro del tag “Elements”. Sharepoint Designer nos mostrará el xml de la instancia, por lo que tendremos que realizar algunos ajustes sobre el xml.

Para asegurarnos que las modificaciones tienen la estructura correcta, activaremos la validación del intellisense.

A continuación moveremos todos los elementos Field fuera del tag contentype y quitaremos todos los atributos subrayados como no reconocidos por el intellisense.

A continuación crearemos un elemento “FieldRef” por cada campo del contentype con los GUID de los campos que desplazamos previamente.

En mi ejemplo queda un xml como el siguiente:

<?xml version="1.0" encoding="utf-8"?>

<Elements Id="ad412d2a-bf6b-4ebe-bcd8-fb32fd01347f" xmlns="http://schemas.microsoft.com/sharepoint/">

<ContentType ID="0x0100D4030561D9561C4BB0330408060E5817" Name="Empleado" Group="Tipos de contenido personalizados">

<FieldRefs>

<FieldRef ID="{4a722dd4-d406-4356-93f9-2550b8f50dd0}" Name="FirstName" />

<FieldRef ID="{06b22ccb-9e3d-41d4-884f-4faf85d8c934}" Name="Apellidos" />

<FieldRef ID="{b0f31712-0348-4248-9fde-1cb33839da68}" Name="NumeroEmpleado" />

</FieldRefs>

</ContentType>

<Field ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="ContentType" Group="_Hidden" RowOrdinal="0" Type="Text" DisplayName="Tipo de contenido" ReadOnly="TRUE" Sealed="TRUE" ColName="tp_ContentType" PITarget="MicrosoftWindowsSharePointServices" PIAttribute="ContentTypeID" />

<Field ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="Title" Group="_Hidden" Type="Text" DisplayName="Título" Required="TRUE" FromBaseType="TRUE" ShowInNewForm="TRUE" ShowInEditForm="TRUE" />

<Field ID="{4a722dd4-d406-4356-93f9-2550b8f50dd0}" Name="FirstName" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="FirstName" Group="Columnas de calendario y contacto principal" DisplayName="Nombre" Type="Text" />

<Field Type="Text" DisplayName="Apellidos" Required="FALSE" MaxLength="255" Group="Columnas personalizadas" ID="{06b22ccb-9e3d-41d4-884f-4faf85d8c934}" SourceID="{d0b52269-2cb7-4c94-83c9-d40cf4207783}" StaticName="Apellidos" Name="Apellidos" />

<Field Type="Text" DisplayName="Numero Empleado" Required="FALSE" MaxLength="255" Group="Columnas personalizadas" ID="{b0f31712-0348-4248-9fde-1cb33839da68}" SourceID="{d0b52269-2cb7-4c94-83c9-d40cf4207783}" StaticName="Numero_x0020_Empleado" Name="Numero_x0020_Empleado" />

</Elements>

 

Ahora solo nos queda desplegar nuestra solución y activar la feature. Pero antes de hacer esto, como lo que estamos haciendo con nuestra feature es volver a definir un contentype que ya tenemos instanciado con el mismo GUID, nos aseguraremos de eliminarlo y las site columns definidas. Si no queremos hacer esto, podremos cambiar el nombre y los GUID del contenttype y de las sitecolumns

Para generear el XMl también podría haber utilizado “Fields Explorer” que nos permite exportar rápidamente los contentypes y site columns ya definidos.

No hay comentarios: