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.


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.
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.
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.
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 .
<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.
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
Fabián Imaz
ey! – muy buen articulo.. le tradujeron y extendieron el post a ted pattison
Gracias por exapndir y demonstrar el uso de wss3workflow.
… en donde estan localizados?
Hola,
Muchas gracias por tus comentarios. La verdad no traducimos el articulo, probamos el la herramienta y la utilizamos.
Ahora estamos trabajando en el ejemplo de formularios para tareas de aprobación, asi que estos días estar disponible.
Estamos en Montevideo Uruguay.
Saludos,