miércoles, 17 de septiembre de 2008

Asignar content types a las librerías de páginas automáticamente

Una de las tareas más comunes al usar las herramientas de ECM que incorpora Sharepoint consiste en construir Content Types que, heredando de Article Page o de Welcome Page nos permitan mostrar nuestros elementos personalizados de publicación. Esta tarea se realiza de manera muy sencilla utilizando la interficie de usuario pero, ¿qué sucede cuando queremos desplegar nuestra solución? ¿Alguien ha tenido problemas al querer realizar esta operación trabajando con Site Variations?

Debo confesar que yo he tenido problemas en este punto. Al final, después de encontrarme con el mismo problema portal tras portal, decidí desarrollar una feature que me ayudase en estos menesteres. La feature trabaja de la siguiente manera: se activa en todos aquellos sitios de Sharepoint donde queremos añadir un content type personalizado, que determinaremos mediante una propiedad de la misma feature. Se verá mejor con un ejemplo.

Pongamos que tenemos un Site Definition con una serie de configuraciones para todos y cada uno de los sitios que contiene. Una de estas configuraciones contendrá la asignación de un content type a la librería de páginas del sitio, de la siguiente manera:

<Feature ID="C0946854-B283-46a6-B460-6A5796D150F8">
   <Properties xmlns="http://schemas.microsoft.com/sharepoint/">
      <Property Key="ContentTypeNames" Value="AD_Proposta" />
   </Properties>
</Feature>

Al utilizar el Site Definition para crear un portal, el content type se asignará automáticamente a la librería de páginas deseada. Obviamente, la feature se puede activar de manera manual, o utilizando el comando stsadm.

Para que esto funcione lo único que debemos crear es una característica que realice el trabajo de forma automática, mediante un SPFeatureReceiver. Esta clase deberá contener, en el método FeatureActivated algo parecido a lo siguiente:

using (currentWeb)
{
  string sContentTypes = properties.Feature.Properties["ContentTypeNames"].Value;
  string[] contentTypes = sContentTypes.Split(",".ToCharArray());
  PublishingWeb pweb = PublishingWeb.GetPublishingWeb(currentWeb);
  foreach (string contentType in contentTypes)
  {
     SPContentType ct = currentWeb.Site.RootWeb.ContentTypes[contentType];
     pweb.PagesList.ContentTypes.Add(ct);
  }
}

Este ejemplo es sólo una muestra de lo que se podría hacer y puede ser extendido tanto como sea necesario, pero la idea sería trabajarlo de cara a evitar en la medida de lo posible los pasos manuales trabajando en un proyecto basado en Sharepoint y mejorar así el proceso de despliegue.

0 comentarios: