Programmatically Associating a Workflow to a Site
When you deploy a site-level workflow using Visual Studio 2010, Post-Deployment build configuration takes care of activating the workflow feature, and programmatically associates the workflow to the site.
When you deploy the wsp package using PowerShell or stsadm , the magic won’t happen! So, if you go to View All Site Content > Site Workflows, the page is pretty empty with a message saying that “there are no workflows currently available to start on this site”
What you need to do is to put the following code in your feature receiver:
[CSharp]
private string workflowTemplateBaseGuid = “1e547b46-3d00-43b0-928d-4fe103b92fcb”;
private string workflowAssociationName = “My Workflow”;
private string workFlowHistoryListName = “Workflow History”;
private string workFlowTaskListName = “Workflow Tasks”;
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
var site = properties.Feature.Parent as SPSite;
var web = site.RootWeb;
SPWorkflowTemplateCollection workflowTemplates = web.WorkflowTemplates;
SPWorkflowTemplate workflowTemplate =
workflowTemplates.GetTemplateByBaseID(new Guid(workflowTemplateBaseGuid));
if (workflowTemplate != null)
{
// Create the workflow association
SPList taskList = web.Lists[workFlowTaskListName];
SPList historyList = web.Lists[workFlowHistoryListName];
SPWorkflowAssociation workflowAssociation =
web.WorkflowAssociations.GetAssociationByName
(workflowAssociationName, CultureInfo.InvariantCulture);
if(workflowAssociation ==null)
{
workflowAssociation = SPWorkflowAssociation.CreateWebAssociation
(workflowTemplate, workflowAssociationName, taskList, historyList);
workflowAssociation.AllowManual = true;
workflowAssociation.Enabled = true;
web.WorkflowAssociations.Add(workflowAssociation);
}
}
}
[/CSharp]
One thing to note is that in sharePoint 2010, SPSite.SPWorkflowManager.GetWorkflowTemplatesByCategory() doesn’t properly return the workflow template collection like SharePoint 2007. So, I had to fall back to the traditional way of using SPWeb.WorkflowTemplates to get my workflow template and create the SPWorkflowAssociation object.
Obviously, in your FeatureDeactivating code, you need to add the necessary code to remove the current instances of the workflow; otherwise if you deactivate the feature and activate it, the workflow doesn’t show up again in View All Site Content> Site Workflows again. A no-code workaround for this issue is to go to Site Settings > Site Administration > Workflow Settings; and remove the instance manually.
Hey Reza,
you save my day.
thank you!
Best Rergards Andre
Hi,
I was getting an Exception follwing your method, where SPWeb was returning null on the internal call to …Enabled = True.
had to make this small change to make it work for me:
workflowAssociation = web.WorkflowAssociations.Add( SPWorkflowAssociation.CreateWebAssociation (workflowTemplate, workflowAssociationName, taskList, historyList));
workflowAssociation.AllowManual = true;
workflowAssociation.Enabled = true;
It was a good help.
Thanks for sharing!
Thank you Jorge, this was driving me nuts.
Hi Reza,
I really thank you for your post, you saved my day! I didn’t know where the problem was with the Method GetWorkflowTemplateByCategory and either found some information on the web. But your alternative way with web.WorkflowTemplates made my feature receiver work!
Thank you soo much!
@Fabian Glad I could help
Hi Reza,
The behavior you are writing about here started happening to me but only after I moved the workflow into Team Foundation Server 2010. Prior to this I could automatically activate and associate the workflow to my list from a Visual Studio deployment or from a powershell script. Now, after adding to TFS, I am not able to associate it to the list using either method! I can activate it via Powershell but it never associates to the list. Have you seen this behavior before..Does that make any sense??