Где перехватить блокировку/редактирование элементов в Sitecore

Есть ли конвейер, который я могу добавить и/или событие для перехвата, который позволил бы мне установить блокировку элемента только в том случае, если блокировка во внешней системе возможна? [В основном интересует эта функция в медиатеке]

В настоящее время мы пытаемся обеспечить функциональность синхронизации с элементами Sitecore, и я просматриваю контрольный список вариантов использования, чтобы определить осуществимость. Блокировка элемента в настоящее время требует блокировки элемента во внешней системе.

Я прочитал сообщение в блоге, объясняющее перехват обновлений элементов.

Если вам нужно иметь возможность блокировать операцию сохранения, рассмотрите возможность использования конвейера saveUI, события item:saving или валидаторов полей. Если вам нужно предотвратить визуальный эффект в пользовательском интерфейсе, указывающий, что Sitecore сохранил выбранный элемент, рассмотрите конвейер saveUI или валидаторы полей.

Это пригодится мне позже, когда мне нужно, возможно, заблокировать сохранение элемента из-за ошибки в чужой системе, но ничего не говорится, когда начинается блокировка/редактирование.

Я также отметил в Important Pipelines о том, что нет "uiEditItem" или чего-то еще, что указывает на конвейер с редактированием элементов.


person al3xnull    schedule 15.02.2012    source источник


Ответы (1)


Возможно, вы могли бы разместить свой собственный процессор перед «Sitecore.Pipelines.Save.CheckItemLock» в разделе saveUI.

В вашем процессоре вы можете прервать сохранение элемента, вызвав метод AbortPipeline. Если вы хотите проверить, заблокирован ли сохраненный элемент, вы можете проверить, изменилось ли поле блокировки.

Вот пример кода:

public class CheckForeignLock {
    protected bool UserIsTryingToLockItem(SaveArgs args) {
        var lockfield = args.Fields.SingleOrDefault(x => x.ID == FieldIDs.Lock);
        return lockfield != null && lockfield.OriginalValue != lockfield.Value;                 
    }
    protected bool CanLock() {
        // your code
    }
    public void Process(SaveArgs args) {
        if(UserIsTryingToLockItem(args) && !CanLock()) {
            args.AbortPipeline();
        }
    }
}

А вот место, где можно было бы прописать свой процессор:

<processor mode="on" type="Sitecore.Pipelines.Save.ParseXml, Sitecore.Kernel" />
<processor mode="on" type="YourAssembly.CheckForeignLock, YourAssembly" />
<processor mode="on" type="Sitecore.Pipelines.Save.CheckItemLock, Sitecore.Kernel" />
person Jonathan Egerton    schedule 17.02.2012