WorkFlow Sharepoint 2007- Formulario Aprobación ASPX

El último artículo que escribimos hablamos de cómo crear un formulario de asociación utilizando wss3workflow, herramienta que se puede descargar de CodePlex.
Cuando trabajamos con WorkFlow sobre Sharepoint tenemos que interactuar con el usuario para que el mismo tome una decisión en nuestro flujo de trabajo, casi siempre estas interacciones las codificamos en formularios Infopath y asociamos los mismo a nuestros flujos de trabajo. Bien, sabemos que desarrollar los formularios en Infopath es una tarea medianamente sencilla, dependerá de lo complejo del mismo. Estos formularios nos permiten tomar las decisiones de los usuarios e informarle a nuestro flujo de trabajo la acción realizada por el usuario. Pero estos formularios dependen de una característica de Moss, Forms Services, esta característica permite convertir el formulario Infopath en una simple pagina Web, con lo cual el usuario que esta interactuando con nuestro WorkFlow no necesita tener instalado Infopath en su máquina y así podemos tener nuestros preciados formularios cargados en el Internet Explorer. Pero qué pasaría si nos encontramos en un ambiente diferente, supongamos que estamos desarrollando un componente de negocio para nuestro cliente, pero el mismo será montado sobre Windows Sharepoint Services y no sobre Moss, acá nuestro preciado formulario en Infopath no será del todo útil. Para este ambiente (WSS) deberemos codificar nuestros formularios en ASPX y asociarlos a nuestros flujos de trabajo, tarea que no es tan sencilla de realizar ni tan intuitiva como uno desearía, dado que deberemos codificar todo nosotros. Pues bien acá es donde entra la herramienta wss3workflow , la cual nos brinda un template para Visual Studio para crear formularios ASPX para nuestros flujos de trabajos. En la imagen 1 se ve como se puede agregar un nuevo formulario de tarea a nuestro flujo de trabajo e insertarlo en nuestro proyecto.

[Imagen 1]

1_VisualStudioTaskForm

Vale la pena aclarar que en esta artículo no vamos hablar de cómo crear un WorkFlow desde un principio, dado que eso lo hemos explicado en nuestro anterior artículo WorkFlow de aprobación para Sharepoint 2007 paso a paso, lo que estaremos explicando en este artículo es como creamos un formulario ASPX de tarea. En la imagen 2 vemos el WorkFlow creado para este ejemplo, el mismo es sencillo y cuenta con las actividades necesarias para la creación de una tarea dentro de Sharepoint 2007.

[Imagen 2]

2_WorkFlow_Creado

Una vez que tenemos creado nuestro WorkFlow, lo próximo que vamos hacer es crear nuestro formulario ASPX, nos posicionamos arriba de nuestro proyecto (en mi caso coloque una carpeta en el mismo para centralizar los formularios) presionamos el botón derecho, agregar, nuevo elemento y nos tendría que aparecer una ventana similar a la mostrada en la imagen 1. Seleccionamos la plantilla TaskForm, le colocamos un nombre y presionamos el botón agregar. Una vez completado el proceso se tuvieron que haber agregados dos archivos, un con extensión ASPX y otro con extensión ASPX.cs. Todos los que hemos trabajados con Asp.Net en algún momento conocemos bien estos dos archivos, uno contiene la declaración de nuestros controles y el otro el código asociado a los mismos. Lo primero que vamos hacer es completar la directiva @Page del formulario Aspx para que el formulario quede correctamente asociado al código. Por defecto la directiva de pagina contiene el atributo “Inherits”, el cual indica cual es la clase que estará procesando toda la lógica de nuestro formulario, para ello simplemente agregamos una “,” inmediatamente después del nombre de la clase y agregamos toda la información de nuestro Assembly, para lo cual tendrán que firmarlo, compilar y generarlo, si todavía no lo hicieron. En la sección 1 vemos como quedaría el atributo “Inherits” en la directiva de pagina @Page .

[Sección 1]

Inherits="Siderys.Blog.Workflow.Forms.ApprovalTaskFormWss,Siderys.Blog.Workflow.SimpleApprovalWorkFlowTaskForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee"

Bien una vez que modificamos dicho atributo, lo próximo que haremos en nuestro formulario ASPX es agregar el atributo “MasterPageFile” a la directiva de pagina @Page para indicar cuál será la Pagina Maestra que utilizaremos en el mismo. Esto es importante, dado que nuestro formulario solo cuenta con “PlaceHolder” para agregar el contenido y si no queremos obtener un error en tiempo de ejecución indicando que no hay ninguna Pagina Maestra asociada debemos agregar este atributo como se muestra en la sección 2.

[Sección 2]

MasterPageFile="~/_layouts/application.master" 

Para este ejemplo selecciona la Pagina Maestra llamada “application.master” debido a que quiero que aparezca todo el menú de navegación de Sharepoint en la parte superior, pero también podíamos haber elegido la Pagina Maestra “simple.master”. Una vez realizada las modificaciones sobre la directiva de página, lo próximo que vamos a realizar es la construcción de nuestro formulario. En la sección 3 vemos el código Asp.Net de nuestro formulario ASPX diseñado para el WorkFlow, el solo contiene dos botones, una para aprobar y el otro para rechazar la tarea asignada al usuario.

[Sección 3]

<asp:Content ID=“_mainContentrunat=“serverContentPlaceHolderID=“PlaceHolderMain>
<spw:FormDigest ID=“_formDigestrunat=“server/>
<asp:Button ID=“btnApprovalTaskrunat=“serverText=“Aprobar TareaOnClick=“btnApprovalTask_Click/>
<asp:Button ID=“btnRechazarTarearunat=“serverText=“Rechazar TareaOnClick=“btnRechazarTarea_Click/>
</asp:Content>

Una vez creado nuestro formulario, lo próximo que haremos es agregar el código necesario en nuestra clase para programar los eventos de los dos botones.
Nosotros vamos agregar los manejadores de los dos botones (Aprobar y Rechazar) que están declarados en el formulario ASPX, como son manejadores para el evento Click su firma es sencilla. En el método que maneja el evento Click del botón aceptar vamos a invocar al método de nuestra clase base llamado “CommitTask()” y en el método que maneja el evento del botón Cancelar invocaremos al método “CancelTask()”. Por último vamos a invocar la sobre cargar (override) del método OnPreRender implementado en nuestra clase base. Este método lo que realiza en la inserción de una serie de elementos ocultos en nuestro formulario donde se cargaran todos los datos asociados al WorkFlow. Bien, ya hemos implementado nuestro formulario, en la sección 4 podemos ver el código completo.

[Sección 4]

using System;

using System.Collections;

using CodeCounsel.SharePoint.Workflow;

using Microsoft.SharePoint;

namespace Siderys.Blog.Workflow.Forms

{

public partial class ApprovalTaskFormWss : TaskForm

{

protected override void OnPreRender(EventArgs e)

{

base.OnPreRender(e);

}

protected override void GetTaskCustomData(Hashtable container)

{



}

protected void btnApprovalTask_Click(object sender, EventArgs e)

{

CommitTask();

}

protected void btnRechazarTarea_Click(object sender, EventArgs e)

{

CancelTask();

}

}

}

Para asociar nuestro formulario a la tarea lo que vamos a tener que hacer a través de un Content Type. Este Content Type estará relacionado con nuestro WorkFlow por intermedio de la propiedad “TaskListContentTypeId” del archivo WorkFlow.xml y que ahora estaremos viendo. La única característica que tendrá este Content Type es la ruta a nuestro formulario ASPX, pero si tuviéramos que agregarles nuevas columnas o columnas del sitio lo podríamos hacer utilizando el elemento “<FieldRefs>” del Schema, donde podremos agregar todas las columnas que necesitemos. Una vez insertado el nuevo archivo XML lo próximo que vamos hacer es colocar el elemento “Elements” y dentro de este elemento vamos a declarar el Content Type utilizando el elemento “ContentType”. En la sección 5 vemos el código completo para la definición del Content Type y al archivo lo hemos llamado “TaskFormContentType.xml”, ahora veremos las propiedades que debemos configurar.

[Sección 5]

<Elements xmlns=”http://schemas.microsoft.com/sharepoint/ " >
<ContentType ID=“0x01080100C5B9C785D13F43f38645772B1C5A152A

Name=“WorkFlowTaskAspxForm

Group=“Siderys.Blog.Workflow

Description=“Task Form in Aspx File

Version=“0

Hidden=“FALSE>

<XmlDocuments>

<XmlDocument NamespaceURI=“ http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url

&lt;FormUrls xmlns=“ http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url

&lt;New>_layoutsSimpleApprovalFileFormsApprovalFormApprovalTaskFormWss.aspx</New>

<Display>_layoutsSimpleApprovalFileFormsApprovalFormApprovalTaskFormWss.aspx</Display>

<Edit>_layoutsSimpleApprovalFileFormsApprovalFormApprovalTaskFormWss.aspx</Edit>

</FormUrls>

</XmlDocument>

</XmlDocuments>

</ContentType>

</Elements>

Lo primero que tenemos que hacer es establecerle un ID, este Id debe comenzar con el siguiente código 0x01080100 y después continuar con un Guid sin los “-“. Esto es un requisito muy importante dado que esta serie de números identifica al Content Type dentro de la herencia de Content Type de Sharepoint 2007 y lo marca como un Content Type para tareas de WorkFlow, en la siguiente pagina del MSDN podemos ver la jerarquía completa de los Content Type. Lo cargamos un nombre para identificarlo, indicamos el grupo donde queremos que se cargue dentro de los Content Types del sitio, una descripción, una versión e indicamos si el mismo estará visible. Por último debemos indicar la ruta al formulario que creamos, para lo cual introducimos un elemento “XmlDocuments” y ahí establecemos la ruta para las opciones “New”, “Display” y “Edit”. Lo próximo que vamos hacer es crear nuestro formulario WorkFlow.xml y lo vamos asociar al Content Type creado recientemente utilizando la propiedad “TaskListContentTypeId” como mencionamos. No vamos a explicar este archivo en profundidad puesto que en artículos anteriores ya hemos profundizado en el mismo. Entonces lo que debemos hacer una vez que el archivo fue creado, vamos a establecer el valor para la propiedad “TaskListContentTypeId” cargándole el ID del Content Type previamente creado. En la sección 6 vemos el código completo para nuestra definición del WorkFlow.xml.

[Sección 6]

<Elements xmlns=“ http://schemas.microsoft.com/sharepoint/”>
<Workflow
Name=“Simple Approval WorkFlow Task Form Aspx
Description=“Simple Approval WorkFlow Task Form Aspx
Id=“4937ACF5-37DC-41b8-95AB-F2340DF6C2D1
CodeBesideClass=“Siderys.Blog.Workflow.SimpleApprovalWorkFlowTaskForm
CodeBesideAssembly=“Siderys.Blog.Workflow.SimpleApprovalWorkFlowTaskForm,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee

StatusUrl=“_layouts/WrkStat.aspx

TaskListContentTypeId=“0x01080100C5B9C785D13F43f38645772B1C5A152A>

<Categories/>

<MetaData>

<StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>

</MetaData>

</Workflow>

</Elements>

Por último lo vamos a crear nuestro archivo Feature.xml donde estaremos declarando nuestro nuevo Feature para Sharepoint 2007 y estaremos agregando los dos archivos anteriormente construidos. En la sección 7 pueden ver cómo queda este archivo.

[Sección 7]

 <Feature  Id=“9DF221FB-20D8-4691-AAFD-DA6BF446FE2A

Title=“Simple Approval WorkFlow Task Form Aspx

Description=“Simple Approval WorkFlow Task Form Aspx

Version=“12.0.0.0

Scope=“Site

xmlns=“ http://schemas.microsoft.com/sharepoint/”>

<ElementManifests>

<ElementManifest Location=“TaskFormContentType.xml/>

<ElementManifest Location=“workflow.xml/>

</ElementManifests>

<Properties>

<Property Key=“GloballyAvailableValue=“true/>

</Properties>

</Feature>

Una vez creado todos los archivos, lo que vamos hacer es instalar todo en Sharepoint 2007, para lo cual pueden utilizar el archivo .bat que se agrego a nuestro proyecto cuando creamos el mismo o bien pueden hacerlo a mano. En este caso nosotros vamos a utilizar el archivo .bat y el formulario lo vamos colocar en la carpeta _layouts de Sharepoint, para lo cual podemos modificar este archivo para que nos cree la carpeta necesaria y después nos copie los mismo. En la sección 8 pueden ver parte del archivo Install.bat y las modificaciones realizadas para que nos copie el archivo ASPX.

[Sección 8]

echo Copying the feature...
rd /s /q "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATEFEATURESSimpleApprovalWorkFlowTaskForm"
mkdir "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATEFEATURESSimpleApprovalWorkFlowTaskForm"
mkdir "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATELAYOUTSSimpleApprovalFileFormsApprovalForm"
copy /Y feature.xml "%programfiles%Common FilesMicrosoft Sharedweb server extensions12TEMPLATEFEATURESSimpleApprovalWorkFlowTaskForm"
copy /Y workflow.xml "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATEFEATURESSimpleApprovalWorkFlowTaskForm"
copy /Y TaskFormContentType.xml "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATEFEATURESSimpleApprovalWorkFlowTaskForm"
copy /Y Forms*.aspx "%programfiles%Common FilesMicrosoft Sharedweb server extensions12 TEMPLATELAYOUTSSimpleApprovalFileFormsApprovalForm"

Una vez instalado, lo que vamos hacer es activar nuestro Feature en Sharepoint, si el mismo esta instaldo, desactívenlo y actívenlo de nuevo, para asegurarse que el Content Type se cree correctamente. En la imagen 3 vemos la lista de Feature y nuestro Feature activado nuevamente.

[Imagen 3]

3_Features_Sharepoint

Si accedemos a los Content Type el sitio podremos ver nuestro Content Type creado, en la imagen 4 vemos la lista de Content Type del sitio.

[Imagen 4]

4_Content_Types

En la imagen 5 podremos ver la tarea asignada al usario.

[Imagen 5]

5_Tarea_Asignada

En la imagen 6 podemos ver nuestro formulario cargado una vez que el usuario selecciono la tarea asignada.

[Imagen 6]

6_Formulario_Task_Aspx

Por último en la imagen 7 vemos la tarea completada por el usuario.

[Imagen 7]

7_Tarea_Completada

En el próximo artículo esteremos hablando de cómo se manejan las excepciones en nuestros WorkFlow y nos esteramos adentrando en algunas actividades específicas.

Fabián Imaz

Siderys Elite Software

Compartir