Sitecore: назначить рабочий процесс элементу программно

Я настроил рабочий процесс, как обычно, начинается с состояния "Черновик". И я настроил рабочий процесс для стандартных значений шаблона. Он прекрасно работает в редакторе контента. (Когда я создаю элемент с помощью редактора контента, после создания элемента Workflow назначается элементу, и его состояние становится "Черновик".)

Но когда я создаю элемент программно по вышеуказанному шаблону, он не назначает рабочий процесс. Что я должен сделать, чтобы назначить рабочий процесс? Пожалуйста, поделитесь любыми примерами кода, если у вас есть.

Благодарю.

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 ответа

Решение

Решил проблему со стандартными полями,

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

Я бы не стал использовать ответ Dhanuka777, так как он не использует команды состояния рабочего процесса Sitecore и полезную функциональность, которая прилагается к нему, например, создание электронной почты. Это также требует жесткого руководства.

Преимущества приведенного ниже кода:

  • Используйте команды состояния 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");
        }
    }

Я искал хороший ответ на этот вопрос. Я создавал новый элемент и хотел начать его рабочий процесс. Ответ jRobbins не сработал для меня, потому что он выдает исключение, если текущее состояние рабочего процесса элемента равно нулю, и он не предлагал хороший способ установки начального состояния рабочего процесса.

Следующее работало для меня:

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);
Другие вопросы по тегам