5

我已经配置了一个工作流程,像往常一样以“草稿”状态开始。我已经为模板的标准值配置了工作流程。它在内容编辑器中完美运行。(当我使用内容编辑器创建项目时,一旦创建项目,工作流就会分配给项目,并且它的状态变为“草稿”。)

但是,当我在上述模板下以编程方式创建项目时,它不会分配工作流。我应该怎么做才能分配工作流?如果有,请分享任何代码示例。

谢谢。

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();
4

4 回答 4

11

我不会使用 Dhanuka777 的答案,因为它没有利用 Sitecore 的工作流状态命令和它附带的有用功能,例如电子邮件生成。它还需要硬编码Guids。

以下代码的好处:

  • 利用 Sitecore 的状态命令和它们具有的出色功能,例如生成电子邮件以提醒用户等
  • 不要将状态和命令的指南存储在解决方案中
  • 独立于 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");
        }
    }
于 2013-08-16T09:22:45.927 回答
4

解决了标准字段的问题,

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();  
于 2012-11-29T12:34:04.800 回答
2

我到处寻找一个好的答案。我正在创建一个新项目并想开始它的工作流程。jRobbins 的答案对我不起作用,因为如果项目的当前工作流状态为空并且它没有提供设置初始工作流状态的好方法,它会引发异常。

以下对我有用:

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

这设置了我的新项目的工作流程,并将其工作流程状态设置为初始状态。

于 2014-05-07T15:53:48.780 回答
1

在确保我在标准值上设置了默认工作流程之后,以下组合,感谢上面的海报,完美地工作:

var workflowId = item.Fields["__Default workflow"].Value;
var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
workflow.Start(item);
于 2014-08-13T12:05:24.010 回答