Technische Workflows sind elementare Komponenten von SharePoint. Überall wo Anwender sensible Inhalte erstellen, sind Genehmigungs-Workflows nicht wegzudenken. Dies gilt für alle SharePoint-Bereiche, von Zusammenarbeit bis WebCMS (Veröffentlichungsportale). Wenn eine Website über eine Vorlage erstellt wurde, dann beinhaltet diese in der Regel bereits vorkonfigurierte Workflows auf provisionierten Listen. Aus diesem Grund kann es erforderlich sein, die Workflow-Einstellungen jeder Website den Kundenwünschen entsprechend anzupassen

Einer unserer Kunden setzt aktuell auf SharePoint 2010, um seine Internet-Präsenz neu aufzusetzen. Als WebCMS-Portal basiert der Internetauftritt auf der OOTB-Veröffentlichungsvorlage mit einem umfangreichem Set von angepassten Komponenten. Beim Anlegen einer neuen Website werden diverse Voreinstellungen durchgeführt, die das “Look & Feel” und den funktionalen Aktionsumfang erweitern.

Es werden unter Anderem eigene SharePoint-Gruppen mit eigenen Berechtigungsstufen angelegt. Da der Standard-Genehmigungs-Workflow für die Veröffentlichung von Seiten allerdings intern auf die OOTB-Gruppe “Genehmigende Personen” verweist und nicht auf die eigene Gruppe, müsste in jeder neuen Website diese Einstellung von Hand  nachgezogen werden.

Aus diesem Grund wird beim Kunden diese Workflow-Einstellung beim Anlegen einer Website automatisch angepasst. Der Code dafür sieht wie folgt aus und kann bspw. im “WebProvisioned-Event” ausgeführt werden.  Die Variable “pWeb” steht hierbei hierbei für die aktuelle Website in Form eines “PublishingWeb”-Objektes.

 

 SPWorkflowAssociation approveWf = pWeb.PagesList.WorkflowAssociations[pWeb.PagesList.DefaultContentApprovalWorkflowId];
                    XmlDocument asocXmL = new XmlDocument();
                    asocXmL.LoadXml(approveWf.AssociationData);
                    /* the OOTB association data
                     <dfs:myFields xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:q="http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields" xmlns:d="http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields" xmlns:ma="http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes" xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <dfs:queryFields></dfs:queryFields>
                            <dfs:dataFields>
                            <d:SharePointListItem_RW>
                                <d:Approvers>
                                <d:Assignment>
                                    <d:Assignee>
                                    <pc:Person>
                                        <pc:DisplayName>Genehmigende Personen</pc:DisplayName>
                                        <pc:AccountId>Genehmigende Personen</pc:AccountId>
                                        <pc:AccountType>SpUser</pc:AccountType>
                                    </pc:Person>
                                    </d:Assignee>
                                    <d:Stage xsi:nil="true" />
                                    <d:AssignmentType>Parallel</d:AssignmentType>
                                </d:Assignment>
                                </d:Approvers>
                                <d:ExpandGroups>false</d:ExpandGroups>
                                <d:NotificationMessage />
                                <d:DueDateforAllTasks xsi:nil="true" />
                                <d:DurationforSerialTasks xsi:nil="true" />
                                <d:DurationUnits>Day</d:DurationUnits>
                                <d:CC />
                                <d:CancelonRejection>true</d:CancelonRejection>
                                <d:CancelonChange>true</d:CancelonChange>
                                <d:EnableContentApproval>true</d:EnableContentApproval>
                            </d:SharePointListItem_RW>
                            </dfs:dataFields>
                        </dfs:myFields>
                     */
                    //configure workflow
                    XmlNodeList approvers = asocXmL.GetElementsByTagName("d:Assignee");
                    if (approvers.Count == 1)// should be unique
                    {
                        //remove old
                        approvers[0].RemoveAll();

                        //add new approver groups
                        List&lt;string&gt; userGroups = new List&lt;string&gt; { "Custom Approver Group" };
                        foreach (String groupName in userGroups)
                        {
                            XmlElement person = asocXmL.CreateElement("pc", "Person", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
                            // person.Prefix = "pc";
                            XmlElement displayName = asocXmL.CreateElement("pc", "DisplayName", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
                            //displayName.Prefix = "pc";
                            displayName.InnerText = groupName;
                            XmlElement accountId = asocXmL.CreateElement("pc", "AccountId", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
                            //accountId.Prefix="pc";
                            accountId.InnerText = groupName;
                            XmlElement accountType = asocXmL.CreateElement("pc", "AccountType", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
                            //accountType.Prefix = "pc";
                            accountType.InnerText = "SharePointGroup";
                            person.AppendChild(displayName);
                            person.AppendChild(accountId);
                            person.AppendChild(accountType);
                            approvers[0].AppendChild(person);
                        }

                        approveWf.AssociationData = asocXmL.OuterXml;
                        pWeb.PagesList.WorkflowAssociations.Update(approveWf);

                    }
                    else
                    {
                        //Logging: unexpected configuration
                    }

 

Durch programmatische Voreinstellungen dieser Art, wird den Anwendern das Arbeiten im SharePoint massiv erleichtert. Viele Einstellungen, die sonst von Hand durchgeführt werden müssten, können auf diese Weise automatisiert werden.

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.