Cambio de la ‘masterpage’ de aplicación. Uso de HTTP modules en SharePoint.
22 February 2010 at 1:18 AM 2 comments
Hola!!
Después de más de un mes sin postear, al fin me di tiempo para escribir sobre algo bastante útil a la hora de personalizar un sitio en SharePoint 2007, estoy hablando de las “masterpages“.
Casi puedo apostarles que, si están leyendo este blog, han al menos intentado cambiar el “look & feel” de SharePoint mediante el uso de las masterpages. Bien, la modificación de la masterpage debe basarse en la estructura que TODAS las páginas del sitio van a tener, es decir, por cada sitio, SharePoint te permite asignar un solo archivo *.master personalizado y por defecto es: default.master.
A pesar de que al principio, la personalización del archvio master principal puede resultar tediosa (recomiendo la “base master page” de Heather Solomon), ésta es la forma más sencilla de lograr un diseño totalmente diferente a lo que es SharePoint out-of-the-box.
Ahora, si lo que quieres es cambiar las páginas de aplicación de tu sitio, como las que viven dentro del directorio _layouts, _catalogs, etc., el procedimiento no es tan simple. Éstos directorios, contienen páginas comunes a todos los sitios y sitecollections de una ”web application“, esto es porque apuntan virtualmente a los archivos que son el “core” de SharePoint (comunmente están localizados en: Program Files/Common files/Microsoft Shared/web server extensions/12/). Entonces, cambiar directamente la masterpage (llamada application.master) de éstas páginas, afectaría a todos los sitios que tenga en mi servidor. Uhm, esto nos pone en un dilema, pues lo que Microsoft ha proporcionado como opciones “oficiales”, son un poco difíciles de replicar.
Básicamente la primera opción que nos propone es crear un respaldo del directorio _layouts, y directamente… cambiar el archivo application.master!!! Como dije anteriormente, esto nos lleva a usar el mismo diseño de masterpage en todos los sitios del web server. La segunda opción es replicar el directorio _layouts (re-nombrarlo), modificar el archivo application.master en la carpeta copiada, y cambiar el path del IIS, para que el directorio virtual de nuestro web site apunte a la recién creada carpeta… U_U sin comentarios…
Y pues la opción que no está “soportada” por Microsoft, pero que según mi experiencia y la de muchos “SharePoint devs” es la más apropiada para esta situación, es el uso de HttpModules.
Los HTTP Modules se definen en una sección del archivo web.config de cada sitio de SharePoint, y permiten interceptar peticiones de páginas, permitiendo ejecutar código justo antes de que la página se cargue. De hecho esta solución es usada también en aplicaciones comunes de ASP .NET y funciona bastante bien ![]()
Los pasos para utilizar HttpModules y cambiar así el archivo application.master de nuestro sitio son:
- Crear un proyecto de tipo “Class Library” y llamarlo HttpModule.
- Cambiar la clase generada (Class1) por CustomApplicationMaster y agregar el siguiente código:
- Firmar el código y hacer el “deploy” copiando la librería generada *.dll al GAC.
- Abrir el archivo web.config (usualmente localizado en Inetpub\wwroot\wss\VirtualDirectories\<NombreDelSitio>).
- Agregar la siguiente línea en la sección de “HttpModules”:
- Copiar el archivo (nombrándolo CustomApp.master) masterpage de SharePoint (application.master) a la galería de MasterPages de tu sitio. Está en Site Settings> MasterPages.
- Y ahora sí, ya tienes tu propia masterpage de aplicación! y puedes personalizarla abriéndola desde SharePoint Designer o cualquier editor para cambiar el estilo.
using System;
using System.Web;
using System.Web.UI;
using System.IO;
namespace HttpModule
{
public class CustomApplicationMaster: IHttpModule
{
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute +=
new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
page.PreInit += new EventHandler(page_PreInit);
}
}
void page_PreInit(object sender, EventArgs e)
{
Page page = sender as Page;
if (page != null)
{
if (page.MasterPageFile != null)
{
if (page.MasterPageFile.Contains(”application.master”))
{
page.MasterPageFile =
“/_catalogs/masterpage/CustomApp.master”;
}
}
}
}
public void Dispose()
{
}
}
}
<add name=”HttpModuleChangeAppMaster” type=”HttpModule.CustomApplicationMaster, HttpModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ei8798sad32jkd873″ />
Espero que les sirva!
Saludos!!!
Entry filed under: How to, Microsoft Office SharePoint Services, MOSS, SharePoint, SharePoint Blogs, SharePoint Español. Tags: application.master, custom master, HttpModule, masterpage, SharePoint master page, SharePoint personalizado.

1.
Alex | 28 May 2010 at 5:16 PM
podrias explicar mas a fondo el paso 3 , me quedo la duda en lo referente a firmar.
2.
edithcolegio | 17 June 2010 at 9:41 PM
Hola Alex,
La firma del codigo es necesaria para hacer deploys en el GAC del servidor, de esta forma te estas autenticando como autor del codigo, dandole un nombre unico.
Para hacerlo tienes que irte a las propiedades del proyecto, y si una de las pestañas dice “Sign”, haces click ahi y luego en “New key”, le das un nombre y la creas, eso es todo, ahora ya puedes copiar tu DLL al Gac…
Saludos!