4

在我的 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 方法,即使我只添加一项?

4

3 回答 3

4

我相信像这样的事件存在已知问题,其中该方法将被多次调用。我知道我有过类似的经历,我试图在创建项目时以编程方式为项目创建角色。作为预防措施,John West 说了以下几点

我似乎记得 Sitecore 有时会多次触发某些事件,因此您可能需要检查 [...]

然后,John 提供了一个博客文章的链接,该文章名为使用 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
  }
}

同样,这是非常骇人听闻的。如果 Sitecore 支持无法提供任何更好的选项(或者堆栈溢出上没有任何更好的选项),我会说这是最后的手段。

于 2011-05-26T20:55:49.160 回答
0

在这种情况下,我会考虑创建一个命令模板(源自 Sitecore 自己的 Create Item),并在那里添加您的 enforce-unique-name 功能。

额外的好处是,如果名称不是唯一的,则该项目将永远不会被创建。

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

于 2011-06-23T08:44:04.970 回答
0

我有同样的问题,看起来这个问题与代理项目有关。

我会添加一个项目,然后获得很多这些 [orphan] 路径,并且创建的每个项目都有不同的 id。

关闭代理项目会停止创建 [孤立] 项目。

编辑- 发现 Shadows 表已损坏,截断 master 数据库中的 Shadows 表,并在核心中截断 Links 数据库,然后重建 links 数据库。我得到了 46 条这些孤儿记录,这些记录并不意味着要在它们上面设置代理项目。

于 2012-08-13T11:50:06.660 回答