Sitecore Workflow и конвейеры - PullRequest
       29

Sitecore Workflow и конвейеры

5 голосов
/ 23 декабря 2010

Я пытаюсь реализовать базовое окно подтверждения 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, чтобы сказать ему, что делать.

Спасибо.

РЕДАКТИРОВАТЬ:

Используя информацию Яна, я в конечном итоге нашел следующее решение:

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

1 Ответ

4 голосов
/ 24 декабря 2010

Ну, я думаю, что здесь вы можете воспользоваться ClientPipelineArgs.Допустим, вы добавляете текущий идентификатор элемента к передаваемым параметрам:

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

Это может потребовать незначительных изменений (я не запускал сам перед публикацией), но надеюсь, что вы поняли идею.

...