簡體   English   中英

Sitecore:以編程方式將工作流分配給項目

[英]Sitecore: Assign workflow to an item programmatically

我已經配置了一個工作流程,像往常一樣以“草稿”狀態開始。 我已經為模板的標准值配置了工作流程。 它在內容編輯器中工作得很好。 (當我使用內容編輯器創建項目時,一旦我創建項目,工作流程就會被分配給項目,它的狀態變為“草稿”。)

但是當我在上述模板下以編程方式創建項目時,它不會分配工作流程。 如何分配工作流程? 如果有,請分享任何代碼示例。

謝謝。

Sitecore.Data.Items.TemplateItem template = this.MasterDatabase.GetItem("/sitecore/templates/user defined/sample types");
Sitecore.Data.Items.Item parent = this.MasterDatabase.GetItem(parentId); 

Sitecore.Data.Items.Item newItem;                
// Create new item and retrieve it
newItem = template.CreateItemFrom("sampleName", parent);

newItem.Editing.BeginEdit();

newItem.Name = StringFormatter.CreateItemNameFromID(this.newItem);
newItem.Fields["Title"].Value = "Sample Title"

newItem.Editing.EndEdit();

我不會使用Dhanuka777的答案,因為它不使用Sitecore的工作流狀態命令及其附帶的有用功能,例如電子郵件生成。 它還需要硬編碼Guids。

以下代碼的好處:

  • 利用Sitecore的狀態命令及其具有的良好功能,例如生成電子郵件以提醒用戶等
  • 不要在解決方案中存儲狀態和命令的Guids
  • 獨立於Sitecore的背景
  • 摘要,因此它可以用於Sitecore中的所有工作流程。
    public bool UpdateWorkflow(WorkflowState newWorkflowState, Item item)
    {
        Assert.ArgumentNotNull(newWorkflowState, "The new WorkflowState can not be null");
        Assert.ArgumentNotNull(item, "Item can not be null");

        bool successful = false;

        WorkflowState currentWorkflowState = GetWorkflowStateForItem(item);

        if (currentWorkflowState != newWorkflowState)
        {
            IWorkflow workflow = GetWorkflowOfItem(item);

            if (workflow != null)
            {
                List<WorkflowCommand> applicableWorkflowCommands = workflow.GetCommands(currentWorkflowState.StateID).ToList();

                foreach (var applicableWorkflowCommand in applicableWorkflowCommands)
                {
                    Item commandItem = _database.GetItem(applicableWorkflowCommand.CommandID);

                    string nextStateId = commandItem["Next state"];

                    if (nextStateId == newWorkflowState.StateID)
                    {
                        WorkflowResult workflowResult = workflow.Execute(applicableWorkflowCommand.CommandID, item, "", false);
                        successful = workflowResult.Succeeded;
                        break;
                    }
                }
            }
        }
        else
        {
            successful = true;
        }

        return successful;
    }

    public WorkflowState GetWorkflowStateForItem(Item item)
    {
        var workflow = GetWorkflowOfItem(item);
        return workflow != null ? workflow.GetState(item) : null;
    }

    public IWorkflow GetWorkflowOfItem(Item item)
    {
        return _database.WorkflowProvider.GetWorkflow(item);
    }

    private Database _database
    {
        get
        {
            return Sitecore.Data.Database.GetDatabase("master");
        }
    }

解決了標准字段的問題,

newItem.Editing.BeginEdit();                    
newItem.Fields["__Workflow"].Value = "{4D1F00EF-CA5D-4F36-A51E-E77E2BAE4A24}"; //Set workflow
newItem.Fields["__Workflow state"].Value = "{7F39DF46-B4B9-4D08-A0D4-32DE6FD643D1}"; //Set   workflow state to Unposted.
newClassified.Editing.EndEdit();  

我到處尋找一個很好的答案。 我正在創建一個新項目,並希望開始其工作流程。 jRobbins的答案對我不起作用,因為如果項目的當前工作流狀態為null並且它沒有提供設置初始工作流狀態的好方法,則會拋出異常。

以下對我有用:

var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
workflow.Start(item);

這將設置我的新項目的工作流程,並將其工作流程狀態設置為初始狀態。

在確定我在標准值上設置默認工作流程后,以下組合,感謝上面的海報,完美地運作:

var workflowId = item.Fields["__Default workflow"].Value;
var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
workflow.Start(item);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM