Workflow code examples using the Core Service
This topic contains a number of code samples for programmatically working with workflow using the Core Service.
Basic code header
To provide some context, here is the class definition for a class that could contain the methods below.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Tridion.ContentManager.CoreService.Client;
namespace MyOrganization.ContentManager.Tests
{
public class CodeSample
{
CoreServiceClient _CoreServiceClient = new CoreServiceClient();
ReadOptions _ReadOption = new ReadOptions()
{
LoadFlags = CoreService.Client.LoadFlags.None
};
// Methods listed below go here
}
}
Creating a Task
The following code creates a Task, a simple Workflow Process based on the predefined Task Process Definition.
public ProcessInstanceData CreateTask(string userId, string publicationId)
{
StartWorkflowInstructionData instruction = new StartWorkflowInstructionData()
{
ProcessInstanceTitle = "Title of the Task",
ActivityTitle = "Title of the first Activity in the Task",
Assignee = new LinkToTrusteeData()
{
IdRef = userId
}
};
return _CoreServiceClient.StartWorkflow(publicationId, instruction, _ReadOption);
}
Creating a Process Instance with Subjects
The following code creates a Process Instance based on a specific Process Definition in a specific Publication, and adds Subjects to it.
public ProcessInstanceData
CreateProcessInstanceWithSubjects(string processDefinitionId, string publicationId, params string[] subjectIds)
{
StartWorkflowInstructionData instruction = new StartWorkflowInstructionData()
{
ProcessDefinition = new LinkToProcessDefinitionData()
{
IdRef = processDefinitionId
},
ProcessInstanceTitle = "Title of the Process Instance",
// Optional: if unspecified, the name of the Activity Definition is used.
ActivityTitle = "Title of the First Activity"
};
instruction.Subjects = subjectIds.Select(id=>new LinkToIdentifiableObjectData()
{
IdRef = id
}).ToArray();
return _CoreServiceClient.StartWorkflow(publicationId, instruction, _ReadOption);
}
Adding items to workflow
The following code adds items to a specific Activity Instance.
public void AddItemsToWorkflow(string activityInstanceId, params string[] subjectIds)
{
_CoreServiceClient.AddToWorkflow(subjectIds, activityInstanceId, _ReadOption);
}
Removing items from workflow
The following code removes items from workflow.
public void RemoveItemsFromWorkflow(params string[] subjectIds)
{
_CoreServiceClient.RemoveFromWorkflow(subjectIds, _ReadOption);
}
Setting the title of an Activity
This code dynamically sets the title of the first and of the next Activity in a Process.
public void SetTitleOfActivityInstance(string processDefinitionId, string publicationId, string nextAssigneeId)
{
// Set the Activity Instance title of the first Activity in the Process
StartWorkflowInstructionData instruction = new StartWorkflowInstructionData()
{
ProcessDefinition = new LinkToProcessDefinitionData()
{
IdRef = processDefinitionId
},
ProcessInstanceTitle = "Title of the Process Instance",
ActivityTitle = "Title of the First Activity"
};
// Start the Process
ProcessInstanceData processInstance =
_CoreServiceClient.StartWorkflow(publicationId, instruction, _ReadOption);
// Set the title of the next Activity in the Process
ActivityInstanceData activityInstance =
(ActivityInstanceData) processInstance.Activities.First();
_CoreServiceClient.FinishActivity(activityInstance.Id,
new ActivityFinishData()
{
Message = "Activity Finish Message",
NextAssignee = new LinkToTrusteeData()
{
IdRef = nextAssigneeId
},
NextActivityTitle = "Next Activity Instance Title"
}, _ReadOption);
}
Creating a Process Definition with Activity constraints
The following code sets constraints on some of the Activities in a Process Definition.
public ProcessDefinitionData CreateProcessDefinitionWithActivityConstraints(string publicationId)
{
// Create a new Process Definition in the Publication specified
var tpdd = new TridionProcessDefinitionData()
{
Id = "tcm:0-0-0",
Title = "Process Definition Title",
StoreSnapshot = false,
LocationInfo = new LocationInfo()
{
ContextRepository = new LinkToRepositoryData()
{
IdRef = publicationId
}
}
};
// Create two Activity Definitions for it
tpdd.ActivityDefinitions = new[]
{
// Create an Activity Definition that prohibits editing of its Subjects.
new TridionActivityDefinitionData
{
Id = "tcm:0-0-0",
Title = "1",
ActivityType = ActivityType.Normal,
Description = "Description",
Assignee = new LinkToTrusteeData{IdRef = "tcm:0-1-65568"},
FinishApprovalStatus = new LinkToApprovalStatusData(),
NextActivityDefinitions =
new [] { new LinkToTridionActivityDefinitionData { Title = "2"}},
ActivityConstraints = ActivityConstraints.DenySubjectEditing
},
// Create an Activity Definition that prohibits editing of its Subjects or editing
// of the metadata of its Bundle
new TridionActivityDefinitionData
{
Id = "tcm:0-0-0",
Title = "2",
ActivityType = ActivityType.Normal,
Description = "Description",
Assignee = new LinkToTrusteeData{IdRef = "tcm:0-1-65568"},
FinishApprovalStatus = new LinkToApprovalStatusData(),
NextActivityDefinitions = new LinkToTridionActivityDefinitionData[0],
ActivityConstraints =
ActivityConstraints.DenySubjectEditing |
ActivityConstraints.DenyBundleMetadataEditing
},
};
tpdd = (TridionProcessDefinitionData) _CoreServiceClient.Create(tpdd, _ReadOption);
}