WorkFlow Sharepoint 2007- Formulario de inicialización ASPX

Acá presentamos el artículo para la utilización de formularios ASPX en nuestros WorkFlow con la herramienta wss3workflow. Como comentamos esta herramienta, una vez instalada, nos brinda una serie de plantillas en el Visual Studio para agregar formularios. Para este proyecto, yo me cree una carpeta llamada “Forms” para colocar el formulario de inicializació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 “Initialization Form”, colocaremos un nombre y presionamos agregar.

[Imagen 1]
1_Add_Form_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 inicialización. El formulario de inicialización nos sirve para cargar información adicional a nuestro WorkFlow cuando el mismo está siendo inicializado. 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. Vale la pena aclarar que nuestro formulario de inicialización solo será desplegado cuando iniciamos el WorkFlow de forma manual, en cambio si la se inicia el WorkFlow de forma automática el mismo no será desplegado. 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
 
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, 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.Forms.WFInstantiationForm, Siderys.Blog.Workflow.WorkflowInicializacionForm, 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 nuestro formulario hemos colocado un control PeopleEditor de Sharepoint el cual utilizaremos para seleccionar al aprobador y dos Button. En la sección 3 vemos el código Asp.Net de nuestro formulario ASPX diseñado para el WorkFlow.
[Sección 3]

<asp:Content id="_mainContent" runat="server" ContentPlaceholderId="PlaceHolderMain">      
<table>
<tr>
<td>
<b>Aprobador</b>
</td>
<td>
<spw:PeopleEditor ID="peAprobador" runat="server" AllowEmpty="false" ValidatorEnabled="true" MultiSelect="false" Title="Seleccionar Aprobador"/>
</td>
</tr>
<tr>
<td>
<asp:Button ID="cmdAprobador" runat="server" Text="Aprobar" OnClick="cmdAprobar_Click" />
</td>
<td>
<asp:Button ID="cmdCancelar" runat="server" Text="Cancelar" OnClick="cmdCancelar_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 “InstantiationForm” que se encuentra en el Assembly “CodeCounsel.SharePoint.Workflow.dll” instalado cuando instalamos el Add-In para el Visual Studio. Al abrir esta clase nos encontramos que la misma tiene un constructor por defecto y la sobrecarga del método GetInstantiationCustomData (). Este método es el utilizado por el formulario para enviar la información al WorkFlow una vez inicializado. Este método, solo nos permite enviar un String, en este ejemplo estaremos enviando el usuario cargado en el control PeopleEditor, al cual accederemos a través de la colección de cuentas que contiene este control. 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 “CommitInstantiation ()” el cual confirma la inicialización de nuestro Workflow. Este método esta declarado en la clase “InstantiationForm” y en el método que maneja el evento del botón Cancelar invocaremos al método “CancelInstantiation ()” que redirecciona al usuario nuevamente a la página de propiedades de la lista. Bien, ya hemos implementado nuestro formulario, en la sección 4 podemos ver el código completo.

[Sección 4]

using System;
using CodeCounsel.SharePoint.Workflow;
using Microsoft.SharePoint.WebControls;
namespace Siderys.Blog.Workflow.Forms
{
public partial class WFInstantiationForm : InstantiationForm
{
string mUsuario = string.Empty;
protected override string GetInstantiationCustomData()
{
return mUsuario;
}

protected void cmdAprobar_Click(object sender, EventArgs e)
{
mUsuario = Request.Form["ctl00$PlaceHolderMain$peAprobador$downlevelTextBox"].ToString();
CommitInstantiation();
}

protected void cmdCancelar_Click(object sender, EventArgs e)
{
CancelInstantiation();
}
}
}
 

Por último lo que debemos hacer es modificar el archivo WorkFlow.xml, para relacionar nuestro formulario con el WorkFlow, para ello utilizaremos el atributo “InstantiationUrl” de elemento “Workflow” dentro del archivo xml. El formulario en nuestro 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 5 vemos el código completo del archivo WorkFlow.xml y en la sección 6 vemos el código completo del archivo Feature.xml.

[Sección 5]

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Workflow
Name="Simple Approval WorkFlow Inicializacion Form Aspx"
Description="Simple Approval WorkFlow Inicializacion Form Aspx"
Id="9D44C6AA-128C-4256-B0E0-F30187CA5413"
CodeBesideClass="Siderys.Blog.Workflow.WorkflowInicializacionForm"
CodeBesideAssembly="Siderys.Blog.Workflow.WorkflowInicializacionForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=711eed342842acee"
StatusUrl="_layouts/WrkStat.aspx" InstantiationUrl="_layouts/SimpleApprovalFileForms/InicializacionForm/WFInstantiationForm.aspx"
>
<Categories/>
<MetaData>
<StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>
</MetaData>
</Workflow>
</Elements>

 
[Sección 6]

<Feature  Id="9224D4F6-726A-4342-9751-B9A7EDA0CFB2"
Title="Simple Approval WorkFlow Inicializacion Form Aspx"
Description="Simple Approval WorkFlow Inicializacion Form Aspx"
Version="12.0.0.0"
Scope="Site"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="workflow.xml"/>
</ElementManifests>
<Properties>
<Property Key="GloballyAvailable" Value="true" />
</Properties>
</Feature>

 
En la imagen 3 podemos ver nuestro formulario en ejecución cuando estamos asociando un WorkFlow
[Imagen 3]
3_Formulario_Sharepoint
 

En la imagen 4 vemos como se ejecuta el control PeopleEditor de Sharepoint 2007 en nuestro formulario.

[Imagen 4]
4_People_Editor
 
Por último en la imagen 5 vemos la tarea asignada al usuario cargado en el control PeopleEditor.
[Imagen 5]
5_Workflow_corriendo
 

Este fue el último artículo sobre cómo podemos crear formularios ASPX y utilizarlos en nuestros Workflow en Sharepoint. Creo que es una muy buena opción a Infopath y más cuando estamos en el contexto de WorkFlow en WSS 3.0
 

Fabián Imaz

Siderys Elite Software

Compartir