Documentation Center

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);
}