sábado, 1 de noviembre de 2008

Error javascript "object required" al arrastrar webparts de una zona a otra

Tras trabajar en varios portales públicos desarrollados sobre Sharepoint, he de decir que una de las cosas más frecuentes y molestas, y a la vez más olvidadas, son los errores de javascript. Nunca sabes a partir de qué momento, intentas utilizar la interfaz de usuario de MOSS para arrastrar webparts de una zona a otra, o para importar un nuevo webpart a la página y comienzan a aparecer errores de javascript en los ficheros ie55up.js, o cmssummarylinks.js. Normalmente, al ver que el error se encuentra en uno de los ficheros internos de Sharepoint, y que lo que necesitas hacer se puede hacer por otras vías, tiendes a aparcar el problema para cuando tengas algo de tiempo y, a la postre, lo acabas olvidando. Pues bien, al final he decidido buscar ese tiempo y acabar de solucionar de una vez por todas ese problema.

Tras investigar un poco en los ficheros javascripts que he mencionado, acabé viendo que el origen de todos los problemas estaba en la función MSOLayout_GetRealOffset del fichero ie55up.js. Tras revisar esta función, observé que el problema radicaba en el hecho de utilizar posicionamiento relativo en tus maquetaciones. Después de pensarlo unos segundos y, teniendo en cuenta sobretodo que la maquetación es una de las muchas cosas que no se me dan nada bien, decidí buscar una solución alternativa que funcionase con cualquier diseño de página y con cualquier tipo de posicionamiento.

Lo primero que se me ocurrió fue modificar la función que me daba problemas y, contra cualquier buena práctica que se os puede pasar por la cabeza, busqué el fichero dentro de la carpeta 12 y lo modifiqué. Bueno por lo menos hice una copia de seguridad del fichero en cuestión. El caso es que tras un poquito de prueba-y-error di con las modificaciones adecuadas:

function MSOLayout_GetRealOffset(StartingObject, OffsetType, EndParent)
{               
    var realOff = 0;              
    if (!EndParent)
      EndParent = document.body;
       
    for (var currObj = StartingObject; currObj && currObj != EndParent && currObj != document.body; currObj=currObj.offsetParent)         
    {             
        var currOff = eval('currObj.offset' + OffsetType);      
        if (currOff)
          realOff+=currOff ;        
    }         
 
    return realOff ;       
} 

Claro que, el trabajo no estaba acabado. Está claro que modificar un fichero interno de Sharepoint es algo a evitar en ma medida de lo posible, teniendo en cuenta sobretodo la dificultad para el despliegue del cambio y la poca solidez ante una eventual actualización del producto. En este caso, sin embargo, todo resulta mucho más fácil de lo que parece. Una de las características de javascript es que puedes redefinir cualquier funcion siempre y cuando la nueva función aparezca después de la suplantada. Bien, teniendo eso en cuenta probé a definir la función en la página maestra de mi sitio, tras el objeto SPWebPartManager, y dentro del tag Form HTML y, tras restaurar el fichero javascript original, todo funcionó correctamente.

Espero que os ayude.

2 comentarios:

Anónimo dijo...

hola al leer su publicación me surjen una pregunta.

¿Soy cliente del sitio quien debe hacer los cambios el administrador del sito o yo en mi pc. si soy yo como lo hago?

Gracias de antemano

David Martos dijo...

Hola, el fichero que se debería modificar está en la base de datos de SharePoint y, por lo tanto, se tendría que modificar bien con SharePoint Designer, bien mediante el despliegue de una característica. Si no estamos seguros de qué se debe hacer, lo primero es consultarlo con el administrador pero, normalmente, el encargado de hacer este tipo de cambios es el desarrollador o el diseñador del portal, y no un usuario final o el administrador de sistemas que, probablemente, no conozca el producto lo suficiente como para realizar este tipo de cambios.