lunes, 3 de mayo de 2010

El desplegable de plantillas de página de SharePoint 2010 deja de funcionar

Hoy me ha tocado pelear con una de esas cosas que tanto me gustan. Algo que funcionaba pero que, de repente, deja de funcionar. Además, buscas información al respecto y no encuentras nada. Normalmente tienes dos opciones: o bien comienzas el desarrollo desde cero y vas incorporando todas las cosas que has creado una a una hasta ver la causante del estropicio, o bien intentas depurar el error de una manera más o menos sistemática. La elección variará en función del número de elementos que has incorporado en tu desarrollo y, en mi caso, la mejor opción era la segunda. Veamos que ha pasado:

Síntoma
De repente, el selector de plantillas de página (ver figura) deja de desplegarse como solía hacer.

image

En su defecto aparece un error de javascript en la línea 334 del fichero cui.debug.js.

(*) Nota: el comportamiento se ha detectado en una versión no final de SharePoint 2010. Posiblemente en la versión final encontraremos que en lugar de utilizar el fichero cui.debug.js utilizaremos el fichero cui.js, que es el mismo fichero pero optimizado para su uso en producción. Para depurar el error es aconsejable renombrar el fichero cui.js a cui.bak.js y el fichero cui.debug.js a cui.js. una vez solucionado el problema debemos volver a dejarlo todo como estaba.

En busca del error…
Si abrimos el fichero en cuestión (lo localizaréis en la carpeta TEMPLATE\LAYOUTS bajo el directorio 14) y nos situamos en la línea que está dando el error veremos lo siguiente:

CUI.Builder.convertNodeToJSON = function(node) {ULSpEN:;
    var $v_0;
    $v_0 = '{';
    $v_0 += '\"name\" : \"';
    $v_0 += CUI.NativeUtility.ecmaScriptStringLiteralEncode(node.nodeName);

El error ocurre porque el valor del parámetro node que le llega a la función es nulo. La verdad es que es poca información para saber qué es lo que está pasando, así que seguimos la pila de llamadas hacia atrás para ver dónde está realmente el problema. Tras un rato buscando di con la raíz del problema en la línea 3650: $v_5 = CUI.Builder.$CA($v_0.PopulationXML); El valor de $v_0.PopulationXML era el del siguiente listado.

<MenuSection Id='Ribbon.WikiPageTab.PubPageLayoutGroup.ChangePageLayout.Menu.Layouts' Title=''>
  <Gallery Id='Ribbon.WikiPageTab.PubPageLayoutGroup.ChangePageLayout.Menu.Layouts.Gallery' ElementDimensions='Size72by96' Width='4' Command='ChangePageLayout'>
    <GalleryButton id='Ribbon.WikiPageTab.PubPageLayoutGroup.ChangePageLayout.Item5' InnerHTML="&lt;div style='width:72px;height:82px;white-space:normal;'&gt;&lt;img src='http://server/_catalogs/masterpage/en-US/Preview Images/ArticleLeft.png' style='width:72px;' /&gt;&lt;br/&gt;&lt;span class='ms-cui-ctl-mediumlabel'&gt;2 columns 75-25 with menu&lt;/span&gt;&lt;/div&gt;" Alt='2 columns 75-25 with menu' CommandType='OptionSelection' MenuItemId='5' CommandValueId='61' Command='ChangePageLayout' QueryCommand='QueryChangePageLayout' />
    <MenuSection Id='Ribbon.WikiPageTab.PubPageLayoutGroup.ChangePageLayout.Menu.Layouts' Title='Project Page'>

Como se puede apreciar, tras el elemento GalleryButton se abría un nuevo elemento MenuSection sin cerrar previamente los elementos Gallery y MenuSection anteriores. Al ver esto y estudiar en detalle a qué hacía referencia el elemento GalleryButton que estaba fallando me di cuenta que hacía referencia a una plantilla de página que había creado para un nuevo tipo de contenido de publicación.

Solucionando el problema
La solución más rápida consiste, evidentemente, en eliminar el elemento que está causando el error. Ya sea conectándonos con SharePoint Designer o directamente a la librería _catalogs/masterpage y eliminando la plantilla incorrecta (lo podéis ver mirando el atributo Alt del elemento GalleryButton del listado anterior.

Esto es una solución rápida al problema, pero el asunto no estará resuelto hasta que no hayamos vuelto a añadir, esta vez de manera correcta, la plantilla de página a nuestro sitio de publicación. En una próxima entrada publicaré cómo crear plantillas de publicación asociadas a tipos de contenido.

En cualquier caso, y para no acabar esta entrada sin ofrecer la solución real al problema, os voy a explicar cual era la causa real del problema. Como siempre, un error tonto: el tipo de contenido asociado a la plantilla de página no estaba correctamente instalado en la colección de sitios.

Resumiendo, cuando no os funcione el desplegable de plantillas de página aseguraros que todos los tipos de contenido relacionados con plantillas de página de la librería _catalogs/masterpage aparecen en la lista de tipos de contenido de la colección de sitios.

5 comentarios:

Alex Talarico dijo...
Este comentario ha sido eliminado por el autor.
Alex Talarico dijo...

Mil gracias por la data - me gustaria saber cuando publiques la "respuesta correcta" ya que aqui nos esta **diendo bien este problema :) la base de datos de contenido fue migrada a 2010 de 2007 y me parece que alguna data de las paginas refiere al servidor viejo - creo eso es lo que previene que se abra el desplegable de plantillas de página en mi caso.

cualquier informacion me vendria de diez - alex

David Martos dijo...

Hola Álex,

en tu caso, ¿es un portal de publicación? Deberías mirar las plantillas de página que tienes en tu colección de sitio (mediante SPD o desde la _catalog/masterpage y mirar si tienes instalados en la colección de sitios todos los tipos de contenido correspondientes.

Saludos,
David Martos

Alex Talarico dijo...

Hola David, gracias por responder - en nuestro caso el servidor no tenia los tipos de contenido presentes. La coleccion de sitios fue actualizada de 2007 a 2010 y en ese proceso seguramente algo paso con los tipos de contenido. Lo raro es que esto solo afecta un servidor, de dos que estan conectados via configuracion del 'load balancer' - en fin, si apagamos un servidor, y dejamos el que tiene los tipos de contenido, va bien - pero sino, hay fallas intermitentes.

Sabrias de alguna forma de corregir este problema? pasa que si desactivo la caracteristica (feature) de tipos de contenido que usamos, romperiamos todos los articulos que de ella dependen.. pense tratar de actualizar los tipos de contenido, pero aquellos que faltan no pude hacerlos visibles ni por codigo! si te paso algo parecido y tenes alguna data para compartir, me gustaria escucharla - cualquier idea me viene bien! gracias nuevamente - alex

David Martos dijo...

Lo siento Álex, pero no se me ocurre nada que pueda solucionar tu problema sin meterle mano. La migración de 2007 a 2010, en el momento en que hay algo desarrollado puede ser un auténtico dolor de cabeza y convendría hacer un estudio bastante detallado del problema para obtener un diagnóstico.