在Sitecore中拦截物品锁定/编辑的位置

时间:2012-02-15 21:10:45

标签: sitecore sitecore6 sitecore-media-library

是否有我可以添加的管道和/或拦截事件,只有在外国系统中可以锁定时才允许我设置项目的锁定? [主要对媒体库中的此功能感兴趣

我们目前正在寻求为Sitecore项目提供同步功能,并且我正在运行用例清单以确定可行性。锁定项目当前需要锁定外部系统中的项目。

我读了John West的blog post解释截取项目更新。

  

如果您需要能够阻止保存操作,请考虑saveUI管道,项目:保存事件或字段验证器。如果您需要阻止用户界面中指示Sitecore已保存所选项目的视觉效果,请考虑saveUI管道或字段验证器。

这对我以后很有用,因为外部系统中的错误我可能会阻止项目的保存,但是当锁定/编辑开始时它没有说明任何内容。

我还在约翰的Important Pipelines博客文章中指出,没有“uiEditItem”或任何似乎注意到项目编辑的管道。

1 个答案:

答案 0 :(得分:2)

您可以在saveUI部分的“Sitecore.Pipelines.Save.CheckItemLock”之前放置自己的处理器。

在处理器中,您可以通过调用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" />