Sitecore工作流和管道

Sitecore工作流和管道,sitecore,pipeline,Sitecore,Pipeline,我正在尝试在工作流命令上实现一个基本的Javascript确认框(例如,“您确定要编辑它吗?”)。根据用户是否单击“是”或“否”,我希望在工作流中切换到其他状态。以下是我目前拥有的代码(去掉了一些逻辑): [可序列化] 公共类确认 { 公共作废进程(WorkflowPipelineArgs args) { Item currentItem=args.DataItem; ClientPipelineArgs clientArgs=新ClientPipelineArgs(); Sitecore.Co

我正在尝试在工作流命令上实现一个基本的Javascript确认框(例如,“您确定要编辑它吗?”)。根据用户是否单击“是”或“否”,我希望在工作流中切换到其他状态。以下是我目前拥有的代码(去掉了一些逻辑):

[可序列化]
公共类确认
{
公共作废进程(WorkflowPipelineArgs args)
{
Item currentItem=args.DataItem;
ClientPipelineArgs clientArgs=新ClientPipelineArgs();
Sitecore.Context.ClientPage.Start(这是“DialogProcessor”,clientArgs);
}
受保护的无效对话框处理器(ClientPipelineArgs args)
{
如果(参数IsPostBack)
{
如果(args.Result!=“是”)
{
args.AbortPipeline();
返回;
}
}
其他的
{
Sitecore.Context.ClientPage.ClientResponse.Confirm(“确实要编辑此内容吗?”);
args.WaitForPostBack();
}
}
}
我不熟悉管道模型,尤其是与Sitecore相关的管道模型,所以我有点抓紧稻草。我认为,我面临的问题是,我没有办法将结果从ClientResponse管道返回到工作流管道,告诉它该做什么

多谢各位

编辑:

利用严的信息,我最终想出了以下解决方案:

公共作废流程(WorkflowPipelineArgs args)
{
Item currentItem=args.DataItem;
ClientPipelineArgs clientArgs=新ClientPipelineArgs();
Add(“itemID”,currentItem.ID.ToString());
clientArgs.Parameters.Add(“stateID”,currentItem.Fields[“\uuu工作流状态”].Value);
Sitecore.Context.ClientPage.Start(这是“DialogProcessor”,clientArgs);
}
受保护的无效对话框处理器(ClientPipelineArgs args)
{
如果(参数IsPostBack)
{
如果(args.Result!=“是”)
{
Item currentItem=Sitecore.Configuration.Factory.GetDatabase(“主”).GetItem(args.Parameters[“itemID]”);
currentItem.Editing.BeginEdit();
currentItem.Fields[“\u工作流状态”]。Value=args.Parameters[“stateID”];
currentItem.Editing.EndEdit();
返回;
}
SheerResponse.Eval(“window.location.reload();”;
}
其他的
{
Sitecore.Context.ClientPage.ClientResponse.YesNoCancel(“是否确实要编辑此内容?”、“200”、“200”);
args.WaitForPostBack();
}
}

好吧,我认为这是您可以利用
客户端管道args
的地方。假设您将当前项ID添加到要传递的参数中:

公共作废流程(WorkflowPipelineArgs args)
{
Item currentItem=args.DataItem;
ClientPipelineArgs clientArgs=新ClientPipelineArgs();
Add(“id”,currentItem.id.ToString());
Sitecore.Context.ClientPage.Start(这是“DialogProcessor”,clientArgs);
}
稍后,当您得到积极的结果时,您会将其返回并移动到目标工作流状态(在注释中解释):

受保护的无效对话框处理器(ClientPipelineArgs args)
{
如果(参数IsPostBack)
{
如果(args.Result==“是”)
{
//1.从args.Parameters[“ID”]中获取项目ID;
//2.通过此ID获取项目
//3.将项目移动到目标工作流状态
}
}
其他的
{
Sitecore.Context.ClientPage.ClientResponse.Confirm(“确实要编辑此内容吗?”);
args.WaitForPostBack();
}
}

这可能需要一些小改动(在发布之前我自己没有运行过),但希望您能理解。

Hi Yan,谢谢您的回答。我已经研究过这种方法,但不清楚如何控制给定项目的工作流状态。我得到的印象是,这是我需要通过WorkflowPipelineArgs做的事情。这是否不正确?项目所处的工作流(以及当前工作流状态)只是相应项目字段的值。因此,即使您不知道这个特殊的API,也可以像设置任何其他字段值一样设置它。另一个问题是在将项目从状态A移动到状态B期间应该发生的工作流操作。如果您以这种低级方式更改工作流状态,则不会执行这些操作…顺便说一句,这是如何将操作附加到状态而不是命令的:是否有方法将命令模板附加到工作流命令?我觉得我的实现水平可能太低了。我看到了ClientPage.SendMessage()函数,但我不知道哪些参数可以用于哪些命令之类的内容。我不确定我是否理解您的问题。你最终会实现什么目标?