每当添加项目时,Sitecore都会添加几个孤立项目

时间:2011-05-26 12:50:45

标签: sitecore sitecore6 orphan

在我的Sitecore 6.1.0安装中,我通过实现我自己的自定义处理程序(在Web.config中)连接到“item:added”事件:

   <event name="item:added">
    <handler type="Sitecore.Data.Fields.ItemEventHandler, Sitecore.Kernel" method="OnItemAdded" />
    <handler type="my.project.Classes.OnSaveItemHandler, my.project" method="OnItemAdded" />
   </event>

这样做的目的是强制项目的唯一名称 - 换句话说,在我的OnItemAdded方法中,我想要Lucene搜索与正在添加的项目同名的任何其他项目。

每次在Sitecore结构中添加项目时都会调用OnItemAdded方法。但我的问题是 - 该方法被多次调用每个项目。我已经看到它每个添加项目调用6到26次,具体取决于我添加项目的Sitecore结构中的位置。我的OnItemAdded方法的主体是空的:

    protected void OnItemAdded(object obj, EventArgs args)
    {
    }

添加项目时第一次调用该方法时,args参数中的项目是正确的项目。如果项目的名称为theItemName,则FullPath属性将如下所示:

/sitecore/content/theItemName

除了第一个项目之外,项目看起来正确,但项目的路径如下:

[orphan]/sitecore/content/theItemName

为什么将[orphan]位添加到完整路径?为什么OnItemAdded方法不止一次被调用,即使我只添加一个项目?

3 个答案:

答案 0 :(得分:3)

我相信事件就像已知的问题一样,这个方法会被多次调用。我知道我有类似的经历,我在创建项目时尝试以编程方式为项目创建角色。 John West said the following as a precaution

  

我似乎记得Sitecore有时不止一次触发某些事件,所以你可能想检查一下[...]

John然后提供了一个名为Intercepting Item Updates with Sitecore

的博客文章的链接

在我的代码中,我检查了一下,看看我正在寻找的操作是否已经发生,例如该项目的角色是否存在。在您的情况下,这可能有点难以检查方法。也许你可以偷偷摸摸地做一些事情:

protected void OnItemAdded(object obj, EventArgs args) {
  Item item = // code to extract item from args, I forgot it

  if(item.Paths.FullPath.StartsWith("/sitecore/content")) {
    // do your stuff because you know its the first time the event fired
  }
}

同样,这是非常hackish。我认为如果Sitecore支持无法提供更好的选项(或者在Stack溢出时没有更好的选项),这是最后的手段。

答案 1 :(得分:0)

在这种情况下,我将研究创建一个命令模板(从Sitecore自己的Create Item派生),并在那里添加强制唯一名称功能。

额外的好处是,如果名称不是唯一的,那么项目永远不会首先创建。

参考:http://sdn.sitecore.net/upload/sitecore6/datadefinitioncookbook-a4.pdf#search=%22command%22

答案 2 :(得分:0)

我遇到了同样的问题,看起来问题与代理项有关。

我会添加一个项目,然后获得许多[孤儿]路径,并且每个创建的项目都会有不同的ID。

关闭代理项目会停止正在创建的[孤儿]项目。

编辑 - 发现Shadows表已损坏, 截断master数据库中的Shadows表,并截断core中的Links数据库,然后重建links数据库。 对于那些不打算在其上设置代理项目的项目,我获得了46个这些孤立记录。