Démarrage de workflow SharePoint sur publication de version majeure

July 02, 2010

Par défaut, la page d’association d’un workflow vous propose les trois modes suivants :

  • Manuel
  • Lors de l’ajout d’un élément
  • Lors de la modification d’un élément

La case Démarrer ce flux de travail pour approuver la publication d'une version principale de cet élément. quant à elle est grisée, même sur une bibliothèque de document où vous auriez activé les version majeures et mineures.

Pour permettre à un workflow de démarrer sur une publication de version majeure, rien de plus simple.

Dans le fichier elements.xml de votre feature, modifier le noeud MetaData en lui insérant un noeud InitiationType :

<MetaData>
    <InitiationType>OnMajorCheckIn</InitiationType>
</MetaData>

Le noeud InitiationType permet de définir une combinaison des modes de démarrage autorisés parmi les valeurs suivantes : Manual, OnNewItem, OnItemUpdate ou OnMajorCheckin. Si vous voulez en définir plusieurs, séparez les par ;# comme dans l’exemple ci dessous :

<MetaData>
    <InitiationType>OnNewItem;#OnItemUpdate</InitiationType>
</MetaData>

Attention ! Si vous activez la demande d’approbation sur une bibliothèque de document, et que vous attachiez un Workflow qui démarre sur une publication majeure, vous ne pourrez plus approuver les dossiers (la page approve.aspx reste sans effet). Si quelqu’un pouvait me dire pourquoi je lui en serait gré :).

Si vous êtes dans cette situation, je vous propose le contournement suivant. Ce contournement ne marche que si vous acceptez de ne pas avoir d’approbation sur un dossier. En effet, ce contournement consiste à créer un EventReceiver qui approuve automatiquement les dossiers :

<Receivers ListTemplateId="10000">
    <!-- 10000 Est l'id d'un modèle de site personnalisé de mon projet -->
    <Receiver>
        <Name>AddingEventHandler</Name>
        <Type>ItemAdded</Type>
        <SequenceNumber>10000</SequenceNumber>
        <Assembly>MyWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=125ff38ac885dc06</Assembly>
        <Class>MyWorkflow.Workflows.AutoApproveFolder</Class>
        <Data></Data>
        <Filter></Filter>
    </Receiver>
    <Receiver>
        <Name>AddingEventHandler</Name>
        <Type>ItemUpdated</Type>
        <SequenceNumber>10000</SequenceNumber>
        <Assembly>MyWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=125ff38ac885dc06</Assembly>
        <Class>MyWorkflow.Workflows.AutoApproveFolder</Class>
        <Data></Data>
        <Filter></Filter>
    </Receiver>
</Receivers>

Puis le code C# du receiver :

using System;
using Microsoft.SharePoint;

namespace MyWorkflow.Workflows
{
    class AutoApproveFolder : SPItemEventReceiver
    {
        public override void ItemAdded(SPItemEventProperties properties)
        {
            base.ItemAdded(properties);
            SetApprovedIfFolder(properties);
        }

        public override void ItemUpdated(SPItemEventProperties properties)
        {
            base.ItemUpdated(properties);
            SetApprovedIfFolder(properties);
        }

        private static void SetApprovedIfFolder(SPItemEventProperties properties)
        {
            if (properties.ListItem.ParentList.EnableModeration)
            {
                // On se s'occupe que des dossiers
                if (properties.ListItem.FileSystemObjectType == SPFileSystemObjectType.Folder)
                {
                    properties.ListItem.ModerationInformation.Status = SPModerationStatusType.Approved;
                    properties.ListItem.Update();
                }
            }
        }
    }
}

Activez la feature, et à partir de là, tous les dossiers seront automatiquement approuvés à la création ou à la modification.