Click here to Skip to main content
1,837 members
Articles / Security / .NET 3.0
Article

SharePoint Workflows for Folder Content Type

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
12 Apr 2012CPOL 5.5K  
This article demonstrates how to start a Workflow from a custom Folder Content Type.

Introduction

Applies to:

  • Microsoft® .NET Framework 3.0
  • Microsoft® Windows Workflow Foundation - WF
  • Microsoft® Windows SharePoint Services 3.0 - WSS
  • Microsoft® SharePoint Portal Server 2007 - MOSS

Short Overview:

A few months ago, I had to implement a MOSS 2007 (SharePoint) feature to start Workflows from a Folder Content Type. The problem was, you cannot attach SP Workflows to a Content Type that was derived from Folder. My solution for this problem was to implement an Event Handler feature which calls the SP Workflow when a folder item was added to my Custom List.

Contents

  • The Problem
  • Creating a new Document Library
  • Enabling the management of custom Content Types
  • Defining a new Content Type
  • Implementing the Event Handler feature
  • Implementing the Workflow

The Problem

In a few words, there is no option to manually start a Workflow from a Folder item.

_FileItemContentMenuItems.png

_FolderContentMenuItems.png

Creating a new Document Library

To create a new Document Library, go under "All Site Content" and select "Document Library".

Defining a new Content Type

To create a new Content Type, go to "Site Settings"; under "Galleries", select "Site content types". In this page, click "Create" and fill the required values like in the following image:

_FolderContentType.png

Enabling the management of custom Content Types

In order to use custom Content Types in the newly created Document Library, you need to enable this option. To set the option, you need to navigate to "Document Library Settings", and under the "General Settings" group, select "Advanced Settings". See the image below:

_EnableContentTypes.png

Also, you need to add the new "FolderContentType" to the "Folders" document library. Under the "Content Types" group, select "Add from existing site content types" and search for "FolderContentType" having "Custom Content Types" selected in the dropdown. Click "Add" and then "OK". In the "Folders" document library, expand the "New" menu and see the "FolderContentType" menu item, for creating a new FolderContentType item.

Implementing the Event Handler feature

The Event Handler which will be called when a new "FolderContentType" is created in the "Folders" document library is based on the SPItemEventReceiver class from the Microsoft.SharePoint namespace. We need to override the ItemAdded method as follows:

C#
public class FolderContentTypeWorkflowStarter : SPItemEventReceiver
{ 
    public override void ItemAdded(SPItemEventProperties properties)
    {
        base.ItemAdded(properties);
        SPWeb web = properties.OpenWeb();

        SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists[properties.ListId];

        if (properties.ListItem.ContentType.Name == "FolderContentType" &&
            properties.ListItem.Folder.ParentFolder.ToString() == 
            docLib.RootFolder.ToString())
        {
            SPSite site = web.Site;
            SPWorkflowAssociation workflowAssoc = null;
            workflowAssoc = docLib.WorkflowAssociations.GetAssociationByName(
                "FolderContentWorkflow",
                System.Threading.Thread.CurrentThread.CurrentCulture);

            if (workflowAssoc != null)
                site.WorkflowManager.StartWorkflow(properties.ListItem,
                                     workflowAssoc, workflowAssoc.AssociationData);
        }
    }
}

The above code will start the FolderContentWorkflow (which will be detailed in the next section). The WF will start when a new FolderContentType is added. The steps used to start the Workflow can be summarized as:

  • When a new item is created, handle the ItemAdded event.
  • Check if the item type is our FolderContentType.
  • If yes, locate the WF which was deployed already on the WSS server.
  • Start the WF using the Workflow Manager.

To start the WF when a FolderContentType is edited (updated), you need to change the type of the event, by overriding a different method in FolderContentTypeWorkflowStarter. This method is called "ItemUpdated".

In order to have this feature in your SharePoint site, you need to create a Class Library project which will contain FolderContentTypeWorkflowStarter, and after that, deploy the assembly. To accomplish this, you need to register the assembly into the GAC, and use the steps described in this article, or manually using the Microsoft.Sharepoint API using the EventReceivers property of SPList, something like:

C#
docLib.EventReceivers.Add(SPEventReceiverType.ItemAdded, assemblyName, className);

Implementing the SharePoint Workflow

To create a new Workflow, we can use either Visual Studio or the SharePoint Designer. It is important to fill the name of the WF as "FolderContentWorkflow". This name is referenced in the starter class. It is out of the scope of this article to describe in details how to create WFs.

The final solution

We need to create a new FolderContentType:

_FolderContentTypeMenuItems.png

The screenshot below shows the Workflow which was started from ContentTypeFolder (please note the "Completed" status in the FolderContentWorkflow column:

_FolderContentWorkflow.PNG

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Romania Romania
This member doesn't quite have enough reputation to be able to display their biography and homepage.

Comments and Discussions

 
-- There are no messages in this forum --