6

我正在尝试在工作流命令上实现一个基本的 Javascript 确认框(例如“你确定要编辑这个吗?”)。根据用户是否单击是或否,我想在工作流中移动到不同的状态。这是我目前拥有的代码(去掉了一些逻辑):

[Serializable]
public class ConfirmAction
{
    public void Process(WorkflowPipelineArgs args)
    {
        Item currentItem = args.DataItem;
        ClientPipelineArgs clientArgs = new ClientPipelineArgs();
        Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs);
    }

    protected void DialogProcessor(ClientPipelineArgs args)
    {
        if (args.IsPostBack)
        {
            if (args.Result != "yes")
            {
                args.AbortPipeline();
                return;
            }
        }

        else
        {
            Sitecore.Context.ClientPage.ClientResponse.Confirm("Are you sure you want to edit this?");
            args.WaitForPostBack();
        }
    }
}

我是 Pipeline 模型的新手,尤其是与 Sitecore 相关的新手,所以我有点抓不住稻草。我相信,我遇到的问题是我没有办法从 ClientResponse 管道将结果返回到 Workflow Pipeline,告诉它该做什么。

谢谢你。

编辑:

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

public void Process(WorkflowPipelineArgs args)
{
    Item currentItem = args.DataItem;
    ClientPipelineArgs clientArgs = new ClientPipelineArgs();
    clientArgs.Parameters.Add("itemID", currentItem.ID.ToString());
    clientArgs.Parameters.Add("stateID", currentItem.Fields["__Workflow state"].Value);
    Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs);
}

protected void DialogProcessor(ClientPipelineArgs args)
{
    if (args.IsPostBack)
    {
        if (args.Result != "yes")
        {
            Item currentItem = Sitecore.Configuration.Factory.GetDatabase("master").GetItem(args.Parameters["itemID"]);
            currentItem.Editing.BeginEdit();
            currentItem.Fields["__Workflow state"].Value = args.Parameters["stateID"];
            currentItem.Editing.EndEdit();                   
            return;
        }
        SheerResponse.Eval("window.location.reload();");                
    }

    else
    {
        Sitecore.Context.ClientPage.ClientResponse.YesNoCancel("Are you sure you want to edit this?", "200", "200");
        args.WaitForPostBack();
    }
}
4

1 回答 1

5

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

public void Process(WorkflowPipelineArgs args)
{
    Item currentItem = args.DataItem;
    ClientPipelineArgs clientArgs = new ClientPipelineArgs();
    clientArgs.Parameters.Add("id", currentItem.ID.ToString());
    Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs);
}

稍后当您获得积极结果时,您将其取回并移至目标工作流程状态(在评论中解释):

protected void DialogProcessor(ClientPipelineArgs args)
{
    if (args.IsPostBack)
    {
        if (args.Result == "yes")
        {
            // 1. take item ID from args.Parameters["id"];
            // 2. get item by this ID
            // 3. move item to target workflow state
        }
    }
    else
    {
        Sitecore.Context.ClientPage.ClientResponse.Confirm("Are you sure you want to edit this?");
        args.WaitForPostBack();
    }
}

这可能需要一些小的更改(我在发布之前没有自己运行它),但希望你明白。

于 2010-12-24T06:58:13.960 回答