lunes, 17 de mayo de 2010

The parent content type specified by content type identifier 0x0101 does not exist

Detrás de el título de esta entrada se esconde un mensaje de error de esos que asustan a cualquier persona habituada a trabajar con SharePoint. Mirad la siguiente figura:

image

Tras ver eso, lo primero que nos viene a la cabeza es: he roto mi SharePoint. El tipo de contenidos identificado como ‘0x0101’ es el de Document. Es un tipo de contenido de los que se llaman básicos y se instalan a nivel de colección de sitios cada vez que hacemos una creación de sitios independientemente de la plantilla que seleccionemos y, si se está quejando de el tipo de contenido padre de éste, mal asunto. De hecho, si revisas los logs de SharePoint después de ver un error como el de la figura ves que de hecho se está quejando del tipo de contenidos identificado como ‘0x’, que es el tipo de contenidos System.

Tras unos momentos de histeria colectiva y pensando con la cabeza te das cuenta de que el problema tiene que estar, forzosamente, relacionado con algún tipo de contenido que estés desplegando en la granja donde se está produciendo el error. Revisas IDs, ves que todo parece estar correcto pero, finalmente, te das cuenta de un pequeño detalle que tiene un cartelito de SOSPECHOSO pegado en la frente. Mirad el siguiente listado:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Parent ContentType: Article Page (0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D) -->
  <ContentType ID="0X010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D00E9292F5BB4E84C03ACE7FFD72B605CB5"
               Name="News"
               Group="Custom Content Types"
               Description="My Content Type"
               Inherits="TRUE"
               Version="0">
    <FieldRefs>
    </FieldRefs>
  </ContentType>
</Elements>

¿Os habéis dado cuenta de que el ID comienza por ‘0X0’ y no por ‘0x0’? difícil de ver, la verdad. Sobretodo teniendo en cuenta lo parecidas que son las x minúsculas y mayúsculas. El tema es que los IDs de tipos de contenido deben estar siempre en mayúsculas para evitar problemas en algunos puntos de nuestro desarrollo, pero esta recomendación no se extiende, al parecer, a la x del principio. En este caso, como el tipo de contenidos se generó directamente con el asistente de Visual Studio, que los genera normalmente en mayúsculas y minúsculas indistintamente, seleccioné todo el identificador y lo pasé a todo mayúsculas. Fallo mio, para variar.

Ahora os pensaréis que aquí acaba la historia. Pues no. Tras solucionar el error y volver a intentar crear un sitio en mi granja vi otro divertido error:

Provisioning did not succeed. Details: Failed to initialize some site properties for Web at Url: 'http://csp2010/sites/test' OriginalException: Failed to compare two elements in the array.

image 

Otra vez un error que nos da poca información. Afortunadamente, esta vez el registro de errores de SharePoint nos da información bastante precisa:

Exception attempting to ApplyWebTemplate to SPSite http://server/sites/test: Microsoft.SharePoint.SPException: Provisioning did not succeed. Details: The site template was not provisioned successfully. Delete this site collection in Central Administration, and then create a new site collection. OriginalException: Provisioning did not succeed. Details: Failed to initialize some site properties for Web at Url: 'http://server/sites/test' OriginalException: Failed to compare two elements in the array.

at Microsoft.SharePoint.SPContentTypeId..ctor(String id)     at Microsoft.SharePoint.Publishing.PageLayout.get_AssociatedContentTypeId()     at Microsoft.SharePoint.Publishing.PageLayout.get_AssociatedContentType()     at Microsoft.SharePoint.Publishing.PageLayout.get_UIDisplayName()     at Microsoft.SharePoint.Publishing.PageLayoutComparerByUIDisplayName.Compare(PageLayout x, PageLayout y)

Está claro, ¿no? está fallando el método de comparar dos plantillas de página por nombre, a la hora de construir un tipo de contenidos según el tipo de contenidos asociado a la plantilla. Manos a la obra, vamos a la característica que aprovisiona plantillas de página y… ¡ahí lo tenemos!

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="PageLayouts" Url="_catalogs/masterpage" RootWebOnly="TRUE">
    <File Path="PageLayouts\news.2columns.75-25.menu.aspx" Url="news.2columns.75-25.menu.aspx"  Type="GhostableInLibrary">
      <Property Name="Title" Value="2 columns 75-25 with menu" />
      <Property Name="MasterPageDescription" Value="2 columns 75-25 with menu" />
      <Property Name="ContentType" Value="$Resources:cmscore,contenttype_pagelayout_name;" />
      <Property Name="PublishingPreviewImage" Value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLeft.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLeft.png" />
      <Property Name="PublishingAssociatedContentType" Value=";#News;#0X010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D00E9292F5BB4E84C03ACE7FFD72B605CB5003F36A0B433934FE0A23FB8F6E315D746;#" />
    </File>
</Module>
</Elements>

Volvemos a tener un tipo de contenidos con un identificador que comienza por ‘0X0’. Moraleja, siempre que trabajéis con SharePoint buscad en vuestros ficheros la cadena maldita ‘0X0’ y no despleguéis nada si encontráis alguna ocurrencia.

1 comentarios:

Anónimo dijo...

Thanks a lot, I was almost pulling my hair out. Did a Make Uppercase in Visual Studio.

0X0101 v.s. 0x0101, and the error message states 0x0101, so you don't get it from there.

Again, thanks a lot.
Regards,
Ronald