Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Jean-Christophe Brabant

SharePoint, HTML5, UX,PowerShell, ...
[SharePoint 2010] Modifier un workflow de manière programmatique

Il peut nous arriver de vouloir modifier un Workflow de SharePoint de manière programmatique. Par exemple, nous pourrions vouloir, à l’activation d’une feature, changer les approbateurs ou bien désactiver l’arrêt du workflow lors d’une modification d’une page.

Pour commencer, ce qui va définir les actions du workflow, ce qui va le définir se trouve dans la propriété AssociationData d’un objet SPWorkflowAssociation.

Voici à quoi ressemble les données contenue dans la propriété AssociationData :

   1: <dfs:myFields 
   2:     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   3:     xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types" 
   4:     xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" 
   5:     xmlns:q="http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields" 
   6:     xmlns:d="http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields" 
   7:     xmlns:ma="http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes" 
   8:     xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" 
   9:     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  10:   <dfs:queryFields /> 
  11:   <dfs:dataFields>
  12:       <d:SharePointListItem_RW>
  13:           <d:Approvers>
  14:               <d:Assignment>
  15:                   <d:Assignee>
  16:                       <pc:Person>
  17:                           <pc:DisplayName>Approvers</pc:DisplayName> 
  18:                           <pc:AccountId>Approvers</pc:AccountId> 
  19:                           <pc:AccountType>SharePointGroup</pc:AccountType> 
  20:                       </pc:Person>
  21:                       <pc:Person>
  22:                           <pc:DisplayName>BUILTIN\administrators</pc:DisplayName> 
  23:                           <pc:AccountId>BUILTIN\administrators</pc:AccountId> 
  24:                           <pc:AccountType>SecurityGroup</pc:AccountType> 
  25:                       </pc:Person>
  26:                       <pc:Person>
  27:                           <pc:DisplayName>Reader</pc:DisplayName> 
  28:                           <pc:AccountId>LOCAL\reader</pc:AccountId> 
  29:                           <pc:AccountType>User</pc:AccountType> 
  30:                       </pc:Person>
  31:                   </d:Assignee>
  32:                   <d:Stage xsi:nil="true" /> 
  33:                   <d:AssignmentType>Serial</d:AssignmentType> 
  34:               </d:Assignment>
  35:               <d:Assignment>
  36:                   <d:Assignee>
  37:                       <pc:Person>
  38:                           <pc:DisplayName>local\administrator</pc:DisplayName> 
  39:                           <pc:AccountId>LOCAL\administrator</pc:AccountId> 
  40:                           <pc:AccountType>User</pc:AccountType> 
  41:                       </pc:Person>
  42:                   </d:Assignee>
  43:                   <d:Stage xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
  44:                   <d:AssignmentType>Parallel</d:AssignmentType> 
  45:               </d:Assignment>
  46:           </d:Approvers>
  47:           <d:ExpandGroups>true</d:ExpandGroups> 
  48:           <d:NotificationMessage /> 
  49:           <d:DueDateforAllTasks xsi:nil="true" /> 
  50:           <d:DurationforSerialTasks xsi:nil="true" /> 
  51:           <d:DurationUnits>Day</d:DurationUnits> 
  52:           <d:CC /> 
  53:           <d:CancelonRejection>true</d:CancelonRejection> 
  54:           <d:CancelonChange>false</d:CancelonChange> 
  55:           <d:EnableContentApproval>true</d:EnableContentApproval> 
  56:       </d:SharePointListItem_RW>
  57:   </dfs:dataFields>
  58:   </dfs:myFields>

Comme on peux le voir, il est assez simple de faire le rapprochement entre le le XML et cette interface :

Worlfow Page Approval 

En définitive, il suffit de modifier le XML et de le sauvegarder pour prendre en compte les modifications.

Voici un exemple pratique :

SPList list = web.GetListFromUrl("Pages/Forms/AllItems.aspx");
SPWorkflowAssociation workflow = list.WorkflowAssociations[0];

if (workflow.BaseTemplate.Name != web.WorkflowTemplates.GetTemplateByName("Publishing Approval", new CultureInfo(1033)).Name)
    return;

XNamespace xsd = "http://www.w3.org/2001/XMLSchema";
XNamespace dms = "http://schemas.microsoft.com/office/2009/documentManagement/types";
XNamespace dfs = "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution";
XNamespace q = "http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields";
XNamespace d = "http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields";
XNamespace ma = "http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes";
XNamespace pc = "http://schemas.microsoft.com/office/infopath/2007/PartnerControls";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

string data = workflow.AssociationData;

XDocument document = XDocument.Parse(data);
var firstAssignment = document.Descendants(d + "Assignment").First();
firstAssignment.Element(d + "AssignmentType").Value = "Parallel";

XElement assignee = firstAssignment.Element(d + "Assignee");
assignee.RemoveNodes();

XElement person = new XElement(pc + "Person");
XElement displayName = new XElement(pc + "DisplayName");
XElement accountId = new XElement(pc + "AccountId");
XElement accountType = new XElement(pc + "AccountType");

displayName.Value = "LOCAL\Supervisors";
accountId.Value = "local\supervisors";
accountType.Value = "Group";

person.Add(displayName);
person.Add(accountId);
person.Add(accountType);

assignee.Add(person);

workflow.AssociationData = document.ToString(SaveOptions.DisableFormatting);

list.WorkflowAssociations.Update(workflow);
list.Update();
Et vous voilà avec un workflow dont l’approbateur est le l’administrator local.
Note importante : l’Update d’un workflow ne fonctionne qu’une seule fois. Si vous essayé de nouveau de faire un Update, vous vous retrouverez avec une erreur d’accès. Pour faire d’autres changements et refaire un update, il faut de nouveau récupérer le workflow et ensuite appliquer les nouvelles modifications.

Jicay

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: lundi 17 octobre 2011 09:30 par Lauzange

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30

- [TFS2010] A la recherche du Shelveset perdu par Blog de Jérémy Jeanson le 05-03-2013, 21:46

- .NET / Debug post-mortem : obtenir le fichier mscordacwks.dll correspondant à un dump quand on n'a plus d'accès direct à ce fichier par CoqBlog le 04-28-2013, 19:57

- [W8] Afficher un graphe par CPU dans le gestionnaire des tâches par Blog de Jérémy Jeanson le 04-28-2013, 17:48

- [WCF] Limiter proprement l’accès à vos ressources serveur par Blog de Jérémy Jeanson le 04-26-2013, 22:59

- Event : Je serai speaker à la Conf’SharePoint par Blog Technique de Romelard Fabrice le 04-26-2013, 12:00