One of the options for creating workflows in Nintex Workflow 2010 (NW2010 for short) is to associate workflows with Content Types.This category of workflows is known as Reusable workflows.
As stated in Nintex Workflow 2010 User Manual
A resusable workflow template allows the workflow to be used on a content type, list or library through the
default SharePoint Workflow settings option.
Reusable workflow templates can be created for use within a single site or an entire site collection
In our case we are only interested in reusable workflows for content types.
Let’s disscuss the scenario when we need to automate the deployment of reusable workflow. It may take place for example, when there are several environments. The approach discussed here allows to deploy workflows during feature activation.
NW2010 API contains publishing infrastucture (Nintex.Workflow.Publishing namespace) that allow to programatically publish workflow templates.
Class Publish contains method
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
WorkflowMetaData PublishAWorkflow(string wfName, NWActionConfigurations configs, Guid listId, SPWeb web, ImportContext importCtx, bool validate, SPContentTypeId contentTypeId, string changeNotes) |
that allows to associate workflow using ContentTypeId parameter.
The method below demonstrate how to deploy reusable workflow file by passing it file name, contenttype name and workflow name(NWFMappingEntry parameter) using Nintex API PublishAWorkflow method.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// Publish Reusable Workflow | |
/// </summary> | |
/// <param name="mapping"></param> | |
public void PublishReusableWorkflow(NWFMappingEntry mapping) | |
{ | |
SPContentType ct = web.ContentTypes[mapping.BindingName]; | |
string workflowName = mapping.WorkflowName; | |
string pathToNWF = Path.Combine(properties.Definition.RootDirectory, mapping.WorkflowFileName); | |
byte[] workflowData = File.ReadAllBytes(pathToNWF); | |
string workflowFile = Utility.ConvertByteArrayToString(workflowData); | |
while ((int)workflowFile[0] != (int)char.ConvertFromUtf32(60)[0]) | |
workflowFile = workflowFile.Remove(0, 1); | |
ExportedWorkflowWithListMetdata workflowWithListMetdata = ExportedWorkflowWithListMetdata.Deserialize(workflowFile); | |
string xmlMessage = workflowWithListMetdata.ExportedWorkflowSeralized; | |
SPListCollection lists = web.Lists; | |
Dictionary<string, Guid> dictionary = new Dictionary<string, Guid>(lists.Count); | |
foreach (SPList spList in lists) | |
{ | |
if (!dictionary.ContainsKey(spList.Title.ToUpper())) | |
dictionary.Add(spList.Title.ToUpper(), spList.ID); | |
} | |
foreach (var listReference in workflowWithListMetdata.ListReferences) | |
{ | |
string key = listReference.ListName.ToUpper(); | |
if (dictionary.ContainsKey(key) && !dictionary.ContainsValue(listReference.ListId)) | |
xmlMessage = xmlMessage.Replace(Utility.FormatGuid(listReference.ListId), Utility.FormatGuid(dictionary[key])); | |
} | |
var exportedWorkflow = WorkflowPart.Deserialize<ExportedWorkflow>(xmlMessage); | |
foreach (var config in exportedWorkflow.Configurations.ActionConfigs) | |
WorkflowRenderer.ProcessActionConfig(config); | |
Guid listId = Guid.Empty; | |
bool validateWorkflow = true; | |
Publish publish = new Publish(web); | |
publish.PublishAWorkflow(workflowName, exportedWorkflow.Configurations, listId, web, (ImportContext)null, validateWorkflow, ct.Id, string.Empty); | |
} |
Project that demonstrates how to deploy Nintex reusable workflows may be found here