Configuración personalizada en la configuración del sitio – WSS 3.0 y MOSS 2007

Quiero compartir con ustedes una solución que nos permitirá crear nuestras propias secciones de configuración en la configuración de los sitios tanto de Windows Sharepoint Services y Microsoft Office Sharepoint Server. Como podrán ver en la imagen 1, la idea es crear un link, dentro de una de las secciones de configuración, en este caso dentro de la sección “Administración del Sitio” que al seleccionarla nos lleva a una página creada por nosotros. Todos sabemos que Sharepoint es una plataforma muy robusta, escalable y altamente customizable, pero hay veces, que nos enfrentamos a desarrollos que no son cubiertos por Sharepoint, donde terminamos desarrollando procesos de negocios o invocando a procesos de negocios externos que muchas veces necesitan tener una configuración especifica, la cual terminamos colocando en el web.config, una base de datos o simplemente un lista y editando manualmente los mismos. La idea es mostrarles cómo podemos crear una simple sección de configuración para centralizar todas estas tareas.

[Imagen 1]
clip_image002

Antes de empezar hablar de cómo tenemos que hacer esto, les voy a comentar cual es mi ambiente de desarrollo y que estoy utilizando yo para llevar a cabo este código. También estoy usando un instalador para que el deploy sea mucho más sencillo.

1) WSPBuilder – Solución que se pueden bajar de CodePlex y que les permitirá tener un Add-in en el Visual Estudio, para crear los paquetes de instalación WSP.

2) Sharepont Solution Installer – Solución que también se pueden bajar de CodePlex y que les permitirá instalar y desinstalar cualquier solución del servidor o la granja de servidores.

3) Visual Studio 2008 Sp1

4) Windows Server 2008

5) Microsoft Office Sharepoint Server 2007

Vale la pena aclarar que este desarrollo lo vamos hacer basados en una “Característica” que podemos activar y desactivar, con lo cual nuestro sección de configuración se activara o no, en un próximo artículo les estaré mostrando cómo podemos crear características de Sharepoint para instalar distintas soluciones que nosotros podemos desarrollar.

Lo primero que vamos hacer, es crear un nuevo proyecto en nuestro Visual Studio y vamos a usar el template “Proyecto WSPBuilder”, le vamos a poner un nombre y vamos a seleccionar una ruta donde estará alojado este proyecto, en la imagen 2 podemos ver la ventana que se nos abre en el Visual Studio.

[Imagen 2]
clip_image004

Una vez creado el proyecto, lo próximo que vamos hacer es crear una característica utilizando el template que nos proporciona el WSPBuilder, para ello, seleccionamos el proyecto, presionamos el botón derecho y seleccionamos agrega nuevo elemento. En la nueva ventana que se nos abrió vamos a seleccionar WSPBuilder en la sección de categorías, en la sección de template “Característica en Blanco” y le ponemos un nombre a la misma, como podemos ver en la imagen 3.

[Imagen 3]
clip_image006

Al presionar agregar, se abrirá una pequeña ventana donde tendremos que terminar de configurar la característica que estamos creando, para lo cual o dejamos los valores por defecto o los cambiamos por nuestros valores.
Cuando el proceso termine, se tuvieron que haber creado una serie de carpetas y archivos XML(Feature.xml y Elements.xml) que son para la instalación de nuestra característica, en la imagen 4 podemos dicha estructura.

[Imagen 4]
clip_image008

Pero esto no nos basta, tenemos que crear dos carpetas de forma manual en el proyecto WSP, que es donde colocaremos nuestro esamblado (dll) y nuestra página personalizada de configuración. La primera carpeta que vamos a crear se tiene que llamar GAC, es donde vamos a colocar la dll con el código compilado que se ejecutara cuando se cargue a página y una carpeta llamada LAYOUTS que es donde debe ir instalada nuestra página de configuración, en la imagen 5 podemos ver cómo nos debería quedar la estructura del proyecto WSP.

[Imagen 5]
clip_image010

Por último vamos a crear un proyecto de biblioteca de clases que será el código servidor que ejecutara nuestra página de configuración cuando sea cargada al presionar el link. La decisión de poner el código en un ensamblado separado se debe a tener encapsulado todo nuestro código en un único componente, el cual, como se deben imaginar, puede estar accediendo a recursos externos del servidor e incluso ejecutando procesos de negocio o invocando los mimos, en la imagen 6 vemos la estructura del proyecto completa y lista.

[Imagen 6]
clip_image011

Lo primero que vamos hacer, es crear la pagina de configuración que será invocada cuando presionemos él link en la configuración del sitio, en la imagen 7 podemos ver la pagina en ejecución. Para agregar la pagina, les recomiendo que copien una página ya existente, en la carpeta layouts del servidor y la peguen en la carpeta Layouts creada dentro del proyecto WSP, después deben incluir la misma al proyecto y renombrarla para que no les genere problema cuando se instale, en mi caso, la llame “HelloWordSiteSettings.aspx”

[Imagen 7]
clip_image013

Abrimos la página en el Visual Studio y en él código declarativo de la misma, vamos a realizar algunas modificaciones necesarias para que funcione correctamente. Lo primero que vamos hacer es registrar nuestro ensamblado (proyecto de clases que creamos anteriormente) usando la directiva de página “Assembly”, la cual nos debería quedar de la siguiente forma “<%@ Assembly Name="Siderys.Blog.Sharepoint.Configuration.CustomSiteSettings, Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee"%>”. Con esta directiva estamos indicando que cuando se cargue nuestra página, se debe cargar el ensamblado que tiene el código servidor que queremos ejecutar.
Ahora vamos a cambiar la directiva @Page de nuestra página para que la misma herede de una clase que vamos a crear más adelante (es la clase que tiene el código servidor), por ahora solo cambiemos la herencia y después crearemos la clase, la directiva tendría que quedar de la siguiente forma “<%@ Page Language="C#" Inherits="Siderys.Blog.Sharepoint.Configuration.CustomSiteSettings.HelloWordSiteSettingsPage" MasterPageFile="~/_layouts/application.master"%>”. Esta página contiene varias directivas más, que incluyen otros ensamblados de Sharepoint y algunos controles de usuario que son utilizados para dibujar las distintas secciones que nosotros necesitemos. En la sección 1 tenemos el código completo de la página.

[Sección 1]

<%@ Assembly Name="Siderys.Blog.Sharepoint.Configuration.CustomSiteSettings, Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee"%> 
<%@ Page Language="C#" Inherits="Siderys.Blog.Sharepoint.Configuration.CustomSiteSettings.HelloWordSiteSettingsPage" MasterPageFile="~/_layouts/application.master"%> 
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register TagPrefix="wssuc" TagName="InputFormSection" src="~/_controltemplates/InputFormSection.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="InputFormControl" src="~/_controltemplates/InputFormControl.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="ButtonSection" src="~/_controltemplates/ButtonSection.ascx" %>
<%@ Register Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<script language="C#" runat="server">
</script>
<asp:Content contentplaceholderid="PlaceHolderPageTitle" runat="server">
		<SharePoint:EncodedLiteral runat="server" text="Hola Mundo Page Settings" />
</asp:Content>
<asp:Content contentplaceholderid="PlaceHolderPageTitleInTitleArea" runat="server">
	<asp:literal text='Hola Mundo' runat="server"/>
</asp:Content>
<asp:Content contentplaceholderid="PlaceHolderPageDescription" runat="server"/>
<asp:Content contentplaceholderid="PlaceHolderAdditionalPageHead" runat="server">
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="PlaceHolderMain" runat="server">
 <table class=propertysheet border="0" width="100%" cellspacing="0" cellpadding="0" id="diidProjectPageOverview">
 <wssuc:InputFormSection Title="Hola Mundo Settings" Description="Custom Configuration Section" runat="server">
	   <Template_InputFormControls>
			<wssuc:InputFormControl LabelText="Hello Word Custom Configuration Section" runat="server">
			    <Template_Control>
			        <wssawc:InputFormTextBox Title="CustomSettingValue" class="ms-input"  ID="TxtCustomSettingValue" Runat="server" />
				</Template_Control>
			</wssuc:InputFormControl>
	   </Template_InputFormControls>
 </wssuc:InputFormSection>
 <wssuc:ButtonSection runat="server">
	   <Template_Buttons>
		  <asp:Button UseSubmitBehavior="false" runat="server" class="ms-ButtonHeightWidth" OnClick="BtnOk_Click" Text="Ok" id="BtnOk" />
	   </Template_Buttons>
 </wssuc:ButtonSection>
 </table>
</asp:Content>

Las secciones dentro de la pagina están delimitadas por él tag InputFormSection y dentro del mismo podemos colocar cada uno de los controles que nosotros necesitemos utilizar, en nuestro caso hemos colocado un control llamado “TxtCustomSettingValue” del tipo InputFormTextBox que nos representa una caja de texto (la que veíamos en la imagen 7). Quiero destacar dos cosas, la primera es que podemos usar cualquier control servidor de Asp.Net y la segunda, es que en la clase que vamos a crear para manejar la ejecución del código, debe existir la declaración de un atributo con el mismo nombre del control que acabamos de agregar a la pagina, si es que queremos tener acceso al mismo en tiempo de ejecución.

Hechas las aclaraciones, vamos a crear una clase en el componente de clases que habíamos agregado anteriormente, esta clase se tiene que llamar de la misma forma que la declaramos en la directiva @Page y debe tener el mismo espacio de nombre. También debe heredar de la clase de Sharepont WebAdminPageBase, la cual nos agrega un comportamiento adicional en los botones de acción, en la sección 2 podemos ver el código completo de la clase e incluso podemos ver la declaración del atributo que nos representa el control de usuario que agregamos.

[Sección 2]

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using Microsoft.SharePoint.ApplicationPages;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;

namespace Siderys.Blog.Sharepoint.Configuration.CustomSiteSettings
{
    public class HelloWordSiteSettingsPage : WebAdminPageBase 
    {
        protected TextBox TxtCustomSettingValue;

        public HelloWordSiteSettingsPage()
        {

        }

        protected void BtnOk_Click(object sender, EventArgs e)
        {
            SPUtility.Redirect("settings.aspx", SPRedirectFlags.RelativeToLayoutsPage, this.Context);
        }
    }
}

Para que todo ande, tenemos que terminar de configurar el proyecto, armar los XML de la característica, compilar, generar el WSP e instalar todo en el servidor. Para que el WSP, nos ponga el ensamblado correspondiente al código servidor de nuestra página en la GAC, lo tenemos que poner dentro de la carpeta GAC que habíamos creado en el proyecto WSP, para hacer esto, tenemos dos opciones, lo copiamos a mano o configuramos el proyecto de bibliotecas de clase para que cada vez que termine de compilar se copie a dicha carpeta. Para hacer esto último, vamos a las propiedades del proyecto de biblioteca de clases y la sección “Eventos de compilación” copiamos este comando xcopy /Y "$(TargetPath)" "$(SolutionDir)GAC" con los parámetros para que nos copie el ensamblado a la carpeta GAC del proyecto WSP, en la imagen 8 podemos ver la propiedades del proyecto.

[Imagen 8]

clip_image002

Ahora vamos a configurar la característica de Sharepoint, para lo cual tenemos que acceder a los archivos Feature.xml y Elements.xml. El primero no es necesario adicionarle nada, para este ejemplo, ya que por defecto se nos crea para ser utilizado. En el segundo, tenemos que extender el nodo XML que se presenta por defecto y agregar un nuevo nodo llamado CustomAction, en la sección 3, podemos ver el código completo para este archivo.

[Sección 3]

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction
    Id="AAEA7FC4-080D-4551-B8A2-AA8A9D0B3340"
    Title="Hola Mundo Settings"
    Location="Microsoft.SharePoint.SiteSettings"
    GroupId="SiteAdministration"
    Sequence="107"
    RequireSiteAdministrator="TRUE"
    >
    <UrlAction Url="_layouts/HelloWordSiteSettings.aspx"/>
  </CustomAction>
</Elements>

Para este ejemplo, coloque un guid como ID, un titulo (el que se desplegara en la sección de configuración) la ubicación de donde queremos que aparezca, para lo cual usamos el atributo Location del XML, para ver todas las opciones que podemos manejar, les dejo un link a la pagina del MSDN http://msdn.microsoft.com/en-us/library/bb802730.aspx. El valor que coloquemos en el atributo GroupId, nos indicara en que sección de la configuración del sitio queremos que aparezca nuestro link y por último establecemos en TRUE el atributo RequireSiteAdministrator, cerramos el tag CustomAction y dentro del mismo, tenemos que adicionar uno más y es la ruta donde estará nuestra página de configuración. En este caso estamos indicando que la misma estará en la URL de donde están todas las páginas de configuración de Sharepoint “_layouts”, pero podría estar en cualquier parte de nuestro servidor y acá deberíamos colocar la ruta relativa o absoluta a la misma, esto dependerá de lo que estemos desarrollando. El WSP nos copiara nuestra página a dicha carpeta del servidor, es por eso que la colocamos dentro de la carpeta LAYOUTS dentro del proyecto WSP, para que se nos copie cuando lo instalemos.

Una vez terminado de configurar todo, vamos a proceder a compilar y crear el WSP. Lo primero es compilar el proyecto de clases y verificar que el ensamblado (dll) fue copiado correctamente a la carpeta GAC. Una vez compilado el proyecto de clases, procederemos a compilar el proyecto WSP para que se genere también el ensamblado correspondiente a ese proyecto, una vez termine dicha complicación, procederemos a crear el WSP, para lo cual seleccionamos el mismo, presionamos el botón derecho del ratón y seleccionamos dentro de la sección WSPBuilder del menú contextual que se abrió la opción “Construir WSP”. En la imagen 9 vemos la venta de salida del visual estudio que nos indica que el WSP fue creado con éxito.

[Imagen 9]

clip_image002

Nos resta instalar en nuestro servidor y probar la solución. Para instalar podemos usar un archivo bat o usar la solución Sharepoint instaler que les comente al principio. En la sección 4 les dejo el código del archivo “InstallSolution.bat” que yo utilice para instalar, para que lo modifiquen y utilicen.

[Sección 4]

@echo off

set URL=http://lanouse/

set STSADM="C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12BINstsadm.exe"

set SOLUTION_NAME=WspAddSectionWebSettings.wsp

set FEATURE_NAME=AddSectionToSiteSettings

echo *

echo * Installing solution… ‘%SOLUTION_NAME%’

echo *

%STSADM% -o addsolution -filename %SOLUTION_NAME%

echo *

echo * Activating solution … ‘%SOLUTION_NAME%’ in  %URL%

echo *

%STSADM% -o deploysolution -name %SOLUTION_NAME% -url %URL%  -immediate -allowGacDeployment -force

%STSADM% -o execadmsvcjobs

iisreset

rem ***********************************************

echo *

echo * Activating feature… ‘%FEATURE_NAME1%’ in ‘%URL%’

echo *

%STSADM% -o activatefeature -name %FEATURE_NAME% -url %URL% -force

echo *

echo * Install Completed.

echo *

Una vez se termine el proceso de instalación, accedemos al sitio donde instalamos la solución, vamos a la configuración del mismo y en la sección “Administración del Sitio” tendríamos que ver el link llamado “Hola Mundo Settings” que establecimos y al presionarlo deberíamos acceder a la página creada.

clip_image001

Descargar Solución Completa con Instalador

Fabián Imaz

Compartir