在我的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方法不止一次被调用,即使我只添加一个项目?
答案 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个这些孤立记录。