Рабочий процесс и конвейеры Sitecore

Я пытаюсь реализовать базовое окно подтверждения 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();
    }
}

person raynjamin    schedule 23.12.2010    source источник


Ответы (1)


Что ж, думаю, именно здесь вы можете извлечь выгоду из 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();
    }
}

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

person Yan Sklyarenko    schedule 24.12.2010
comment
Привет, Ян, спасибо за ответ. Я рассмотрел этот подход, но мне непонятно, как управлять состоянием рабочего процесса с учетом элемента. У меня сложилось впечатление, что это нужно было сделать через WorkflowPipelineArgs. Это неправильно? - person raynjamin; 27.12.2010
comment
Рабочий процесс, в котором находится элемент (а также текущее состояние рабочего процесса) — это просто значение соответствующего поля элемента. Так что, даже если вы не знаете о специальном API, вы всегда можете установить его, как и любое другое значение поля. Другой вопрос — действие рабочего процесса, которое должно происходить при перемещении элемента из состояния A в состояние B. Эти действия не будут выполняться, если вы измените состояние рабочего процесса таким низкоуровневым способом... - person Yan Sklyarenko; 27.12.2010
comment
Кстати, именно так вы можете прикрепить действие к состоянию, а не к команде: sdn.sitecore.net/FAQ/Workflow/Workflow%20State%20Action.aspx - person Yan Sklyarenko; 27.12.2010
comment
Есть ли способ прикрепить шаблон команды к команде рабочего процесса? Я чувствую, что могу опуститься до слишком низкого уровня в своих реализациях. Я вижу функцию ClientPage.SendMessage(), но не знаю, какие параметры могут входить в какие команды и тому подобное. - person raynjamin; 30.12.2010
comment
Я не уверен, что понимаю ваш вопрос. Чего вы собираетесь достичь в конце? - person Yan Sklyarenko; 31.12.2010
comment
У меня есть команда рабочего процесса, которая позволяет людям отказаться от черновика, удалив последнюю версию. Внедрение решения, аналогичного описанному в этой ветке, технически работает, но у меня были проблемы с тем, что элемент не обновлялся (скажем, у меня версия 4, и я нажимаю команду рабочего процесса, версия удаляется, но по-прежнему отображается как версия 4). пока вы каким-либо образом не обновите элемент). Это заставляет меня думать, что я делаю компоненты пользовательского интерфейса Sheer странным образом, поскольку я не уверен в лучших практиках. Я видел команду SendMessage, но, похоже, она не работает из самого рабочего ящика. - person raynjamin; 31.12.2010
comment
Вы можете взглянуть на действие рабочего процесса DeleteItem в следующей библиотеке: trac.sitecore.net/WorkflowModules. Кажется, это в основном то же самое, чего вы хотели бы достичь... - person Yan Sklyarenko; 04.01.2011