Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sitecore:以编程方式将工作流分配给项目_C#_Sitecore_Sitecore Workflow - Fatal编程技术网

C# Sitecore:以编程方式将工作流分配给项目

C# Sitecore:以编程方式将工作流分配给项目,c#,sitecore,sitecore-workflow,C#,Sitecore,Sitecore Workflow,我已经配置了一个工作流,像往常一样以“草稿”状态开始。我已经为模板的标准值配置了工作流。它在内容编辑器中工作得非常完美。 (当我使用内容编辑器创建项目时,一旦我创建了项目,工作流将分配给该项目,其状态将变为“草稿”。) 但是,当我在上述模板下以编程方式创建项目时,它不会分配工作流。 我应该如何分配工作流?如果您有任何代码示例,请与他人分享 谢谢 Sitecore.Data.Items.TemplateItem template=this.MasterDatabase.GetItem(“/Site

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

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

谢谢

Sitecore.Data.Items.TemplateItem template=this.MasterDatabase.GetItem(“/Sitecore/templates/user-defined/sample-types”);
Sitecore.Data.Items.Item parent=此.MasterDatabase.GetItem(parentId);
Sitecore.Data.Items.Item newItem;
//创建新项目并检索它
newItem=template.CreateItemFrom(“sampleName”,父项);
newItem.Editing.BeginEdit();
newItem.Name=StringFormatter.CreateItemNameFromID(this.newItem);
newItem.Fields[“Title”].Value=“示例标题”
newItem.Editing.EndEdit();

解决了标准字段的问题

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的工作流状态命令和它附带的有用功能,例如电子邮件生成。它还需要硬编码guid

以下代码的好处:

  • 利用Sitecore的状态命令及其良好的功能 例如,生成电子邮件提醒用户等
  • 不要在解决方案中存储状态和命令的GUID
  • 独立于Sitecore的上下文
  • 因此,它可以用于Sitecore中的所有工作流
public bool UpdateWorkflow(WorkflowState newWorkflowState,Item)
{
Assert.ArgumentNotNull(newWorkflowState,“新的WorkflowState不能为null”);
Assert.ArgumentNotNull(项,“项不能为null”);
bool成功=错误;
WorkflowState currentWorkflowState=GetWorkflowStateForItem(项目);
if(currentWorkflowState!=newWorkflowState)
{
IWorkflow workflow=GetWorkflow of item(项目);
if(工作流!=null)
{
List ApplicatableWorkflowCommands=workflow.GetCommands(currentWorkflowState.StateID).ToList();
foreach(applicatableworkflowcommands中的var applicatableworkflowcommand)
{
Item commandItem=_database.GetItem(applicatableWorkflowCommand.CommandID);
字符串nextStateId=commandItem[“下一个状态”];
if(nextStateId==newWorkflowState.StateID)
{
WorkflowResult WorkflowResult=workflow.Execute(applicatableWorkflowCommand.CommandID,项“”,false);
successful=工作流结果。已成功;
打破
}
}
}
}
其他的
{
成功=正确;
}
成功回归;
}
公共工作流状态GetWorkflowStateForItem(Item)
{
var workflow=GetWorkflowOfItem(项目);
返回工作流!=null?工作流.GetState(项):null;
}
公共IWorkflow GetWorkflowOfItem(项)
{
返回_database.WorkflowProvider.GetWorkflow(项);
}
专用数据库
{
得到
{
返回Sitecore.Data.Database.GetDatabase(“master”);
}
}

我到处寻找这个问题的好答案。我正在创建一个新项目,并希望启动其工作流。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);

我看了所有的地方,这似乎是最好的答案,我想知道为什么它不会自动发生。不要用这种方式来设置硬编码的guid。使用jRobbins应答来正确设置它。对于我们的特殊需要,硬编码的ID对我们来说很好。需要注意的一点是,您可以使用
Sitecore.FieldIDs.Workflow
Sitecore.FieldIDs.WorkflowState
而不是
\u Workflow[…]
。例如:
itemVersion.Fields[Sitecore.FieldIDs.WorkflowState].Value=approvedState.ToString()
。关于“硬编码ID”,事实上,我们必须在任何Sitecore项目中使用硬编码ID(比如代码值、工作流状态(检查是否处于特定状态)等),最佳实践是为这些硬编码的项目ID提供一组单独的静态类。我不认为4(!)的代码过于复杂嵌套的if语句应该是执行某些操作的“正确”方式。此外,它似乎没有回答这个问题:如何为项目分配工作流和随机工作流状态。相反,如果下一个状态恰好是所需的状态,它基本上会将项目移动到下一个工作流状态。
var workflowId = item.Fields["__Default workflow"].Value;
var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
workflow.Start(item);