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.

Sitio de Ferrari. Hecho con MOSS 2007

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:

  1. Crear un proyecto de tipo “Class Library” y llamarlo HttpModule.
  2. Cambiar la clase generada (Class1) por CustomApplicationMaster y agregar el siguiente código:
  3. 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()
    		{
    		}
    	}
    }
  4. Firmar el código y hacer el “deploy” copiando la librería generada *.dll al GAC.
  5. Abrir el archivo web.config (usualmente localizado en Inetpub\wwroot\wss\VirtualDirectories\<NombreDelSitio>).
  6. Agregar la siguiente línea en la sección de “HttpModules”:
  7. <add name=”HttpModuleChangeAppMaster” type=”HttpModule.CustomApplicationMaster,
    HttpModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ei8798sad32jkd873″ />
  8. 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.
  9. 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.

Espero que les sirva!

Saludos!!! :D

Advertisement

Entry filed under: How to, Microsoft Office SharePoint Services, MOSS, SharePoint, SharePoint Blogs, SharePoint Español. Tags: , , , , , .

SharePoint 2010

2 Comments Add your own

  • 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.

    Reply
    • 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!

      Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Feeds

Enter your email address to subscribe to this blog and receive notifications of new posts by email.


Follow

Get every new post delivered to your Inbox.