WorkFlow Sharepoint 2007 – Formulario de asociación ASPX

Se pensaron que nos habíamos ido, no estamos acá nuevamente, después de pasar un mes de Marzo bastante movido en lo referente a trabajo y en lo personal con algunas complicaciones que por suerte superamos, nos hicimos hueco para retomar nuestro blog y escribir este artículo.

El último artículo que escribimos hablamos de cómo hacer un “WorkFlow de aprobación para Sharepoint 2007 paso a paso” donde hablamos del ambiente que necesitamos y describimos paso a paso la creación de un WorkFlow para Sharepoint utilizando Visual Studio. Este WorkFlow utilizaba un formulario creado con Infopath 2007 para la aprobación de tareas, el cual nos simplifica mucho utilizar Infopath para crear formularios para interactuar con los usuarios.

Después de publicar este artículo y someterlo a la crítica de mi buen amigo Haaron Gonzalez (gracias Haaron por tus palabras de aliento para que siga escribiendo, como ves sigoJ) el cual paso con buenas calificaciones, me puse a trabajar en la creación de un WorkFlow también para Sharepoint 2007, pero esta vez utilizando formularios ASPX de  Asp.Net y no formularios construidos con Infopath 2007. Hablando con Haaron, me comento que existía una herramienta, wss3workflow, publicada en CodePlex, que permitía crear formularios ASPX para nuestros WorkFlow sin la necesidad de hacerlo todo a pulmón. Esta herramienta, una vez instalada, nos brinda una serie de plantillas en el Visual Studio para agregar formularios,  cuando seleccionamos agregar un nuevo elemento en nuestro proyecto. Para este proyecto, yo me cree una carpeta llamada “AssociationForm” para colocar el formulario de asociación que vamos a estar creando, parados en la carpeta presionamos el botón derecho, agregar, nuevo elemento y nos despliega una nueva ventana como se puede ver en la imagen 1, donde seleccionaremos “Association Form”, colocaremos un nombre y presionamos agregar.

Imagen 1

 1_AsosiationForm_VS

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 asociación y en el próximo artículo vernos como crear un formulario de tarea.

El formulario de asociación nos sirve para cargar información adicional a nuestro WorkFlow cuando el mismo está siendo asociado a la lista. En este ejemplo en concreto lo que estamos haciendo es indicar que persona será la encargada de aprobar la tarea que se está creando, a lo cual nos permite indicar quienes son los aprobadores y tener un WorkFlow de aprobación genérico.

En la imagen 2 vemos el WorkFlow que hemos creado, es un WorkFlow sencillo puesto que lo que queríamos compartir con Uds era la utilización de los formularios.

Imagen 2

 2_WorkFlow_Creado

Una vez que tenemos creado nuestro WorkFlow, lo que debemos hacer es programar nuestro formulario. Cuando agregamos el formulario a nuestro proyecto, en el mismo se agregaron dos archivos, el archivo ASPX y el archivo Aspx.cs el cual tendrá todo nuestro código servidor.

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, pero con esto solo no basta, si estuviéramos bajo el contexto de una aplicación normal de Asp.Net donde nuestro archivo cs queda asociado al formulario no tendríamos problemas, pero acá el contexto es un poco diferente, dado que la clase que hace de Code Beheind se encuentra en el mismo Assembly generado para nuestro WorkFlow, así que lo que vamos hacer es agregarle a nuestro atributo “Inherits” cuál es el Assembly que contiene la clase que se tienen que invocar cuando el formulario sea cargado, 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.WorkShop.AssociationForm.AssociationFormSimpleApprovalWF, Siderys.Blog.Workflow.WorkShop.SimpleApprovalWorkflowAssosiationForm, 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. El formulario que vamos a crear es sencillo, contendrá un Asp.Net TextBox , dos Button y un RequiredFieldValidator. La caja de texto se utilizara para cargar el usuario a quien se le asignara la tarea de aprobación, en este ejemplo utilizamos una simple caja de texto, pero podríamos haber utilizado el control de Sharepoint PeopleEditor, para seleccionar usuarios. En el artículo “Como usar el  control PeopleEditor de Sharepoint 2007” encontraran como utilizar fácilmente.
En la sección 3 vemos el código Asp.Net de nuestro formulario ASPX diseñado para el WorkFlow.

 

Sección 3

<%@ Page Language="C#" MasterPageFile="~/_layouts/application.master" 
Inherits="Siderys.Blog.Workflow.WorkShop.AssociationForm.AssociationFormSimpleApprovalWF, 
Siderys.Blog.Workflow.WorkShop.SimpleApprovalWorkflowAssosiationForm, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=711eed342842acee" %>
                                                                                                                 
<%@ Register TagPrefix="spw" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls" %>
<%@ Register TagPrefix="spu" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.Utilities" %>
<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server"> <span>Simple Approval Workflow Association Forms</span> </asp:Content> <asp:Content ID="Content2" contentplaceholderid="PlaceHolderPageTitleInTitleArea" runat="server"> <asp:Label runat="server" ID="Label1" Text="Simple Approval Workflow Association Forms" /> </asp:Content> <asp:Content id="_mainContent" runat="server" ContentPlaceHolderId="PlaceHolderMain" > <table> <tr> <td> <asp:Label id="lblApprovador" runat="server" /> </td> <td> <asp:TextBox id="txtApprovador" runat="server" /> <asp:RequiredFieldValidator ID="rfvApprovador" runat="server"
ControlToValidate="txtApprovador">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Button id="btnAceptar" runat="server" text="Aceptar" OnClick="btnAceptar_Click" /> </td> <td> <asp:Button id="btnCancel" runat="server" text="Cancel" OnClick="btnCancel_Click" /> </td> </tr> </table> <spw:FormDigest ID="_formDigest" runat="server" /> </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 y cargar la información introducida por el usuario para ser enviada al WorkFlow. Cuando creamos el formulario se creó esta clase asociada al mismo, la cual extiende de la clase “AssociationForm” que se encuentra en el Assembly  “CodeCounsel.SharePoint.Workflow.dll” instalado cuando instalamos el Add-In para el Visual Studio y que se encuentra en la GAC.  

Al abrir esta clase nos encontramos que la misma tiene un constructor por defecto y la sobrecarga del método GetAssocationCustomData(). Este método es el utilizado por el formulario para enviar la información al WorkFlow una vez asociado. Este método, solo nos permite enviar un String, pero podríamos crear un objeto complejo, serializarlo a XML y envíalo como un String al WorkFlow, a lo cual lo único que deberíamos hacer en el WorkFlow es tomar dicha información y nuevamente convertirla en nuestro Objeto complejo para tomar sus valores, de misma forma que  Infopath interactúa con el WorkFlow.

Nosotros vamos agregar los manejadores de los dos botones (Aceptar y Cancelar) 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 “CommitAssocation()” el cual terminara de asociar toda la información al WorkFlow. Este método esta declarado en la clase “AssociationForm” y lo que hace es realizar la asociación del WorkFlow a la lista correspondiente y en el método que maneja el evento del botón Cancelar invocaremos al método “CancelAssociation()” que redirecciona al usuario nuevamente a la página de propiedades de la lista. En la imagen 3 vemos el código del método “”, para lo cual inspeccionamos el Assembly utilizando la herramienta Reflector.

Imagen 3

3_Reflector 

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, guid de la lista, nombre del WorkFlow,  Id de la lista de tareas, etc. Esta información nos podría ser de utilidad por si queremos realizar alguna tarea previa a la asociación del WorkFlow. En la imagen 4 vemos el código de este método implementado en nuestra clase base.

Imagen 4

4_OnPreRender 

Bien, ya hemos implementado nuestro formulario, en la sección 5 podemos ver el código completo.

Sección 5

using System;

using CodeCounsel.SharePoint.Workflow;

using System.Web.UI.WebControls;

 

namespace Siderys.Blog.Workflow.WorkShop.AssociationForm

{

    public partial class AssociationFormSimpleApprovalWF : CodeCounsel.SharePoint.Workflow.AssociationForm

    {

        protected TextBox txtApprovador;

        protected override void OnPreRender(EventArgs e)

        {

            base.OnPreRender(e);

        }

 

        protected override string GetAssocationCustomData()

        {

            return txtApprovador.Text;

        }

 

        protected void btnAceptar_Click(object sender, EventArgs e)

        {

             CommitAssocation();

        }

        protected void btnCancel_Click(object sender, EventArgs e)

        {

            CancelAssociation();

        }

    }

}

 

Por último lo que debemos hacer es modificar el archivo WorkFlow.xml, para relacionar nuestro formulario con el WorkFlow, para ello utilizaremos el atributo “AssociationUrl” de elemento “Workflow” dentro del archivo xml. El formulario en nustro caso fue colocado bajo la ruta de “layout” de Sharepoint para el mismo sea tenido en cuenta desde cualquier sitio de nuestro portal Sharepoint. En la sección 6 vemos el código completo del archivo WorkFlow.xml .

Sección 6

  <Workflow
     Name="SimpleApprovalWorkflow Asociation Forms"
     Description="SimpleApprovalWorkflow Asociation Forms"
     Id="737F046D-8715-4803-811E-111EDAF2F65D"
     CodeBesideClass="Siderys.Blog.Workflow.WorkShop.SimpleApprovalWorkflowAssosiationForm"
     CodeBesideAssembly="Siderys.Blog.Workflow.WorkShop.SimpleApprovalWorkflowAssosiationForm, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee"
AssociationUrl="_layoutsSimpleApprovalFileFormsAssociationFormAssociationFormSimpleApprovalWF.aspx"> <Categories/> <MetaData> <StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl> </MetaData> </Workflow> </Elements>

Lo que nos resta es tomar la información cargada en nuestro formulario dentro del WorkFlow, para lo cual utilizando la propiedad “AssociationData” que se encuentra dentro de las WorkflowProperties podemos acceder a la información introducida en nuestro formulario. En la sección 7 vemos el código del evento “Invoked” que se dispara cuando se inicia el WorkFlow.

 

Sección 7

        private void onWorkflowActivated_Invoked(object sender, ExternalDataEventArgs e)

        {

            mUserApprover = onWorkflowActivated_WorkflowProperties.AssociationData;

        }

En la imagen 5 podemos ver nuestro formulario en ejecución cuando estamos asociando un WorkFlow

 

Imagen 5

 5_AsosciadonForm_Ejecucion

En próximos artículos seguiremos mostrando como utilizar este Add-In en nuestros WorkFlow y vamos a estar empezando a trabajar sobre la plataforma 2008 con Sharepoint 2007 y así ver las ventajas que se han introducido en el nuevo Visual Studio para trabajar con Sharepoint.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *