Sitecore добавляет несколько бесхозных элементов всякий раз, когда элемент добавляется - PullRequest
3 голосов
/ 26 мая 2011

В моей установке Sitecore 6.1.0 я подключился к событию «item: добавлен», реализовав свой собственный обработчик следующим образом (в Web.config):

   <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 для любых других элементов с тем же именем, что и добавляемый элемент.

Метод OnItemAdded вызывается каждый раз, когда элемент добавляется в структуру Sitecore. Но моя проблема в том, что метод вызывается более одного раза за элемент . Я видел, как он вызывается где-то между 6 и 26 раз за добавленный элемент, в зависимости от того, где в структуре Sitecore я добавляю элемент. Тело моего метода OnItemAdded пусто:

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

При первом вызове метода при добавлении элемента элемент в параметре args является правильным элементом. Если имя элемента theItemName, свойство FullPath будет выглядеть следующим образом:

/sitecore/content/theItemName

Каждый раз, за ​​исключением первого, элемент выглядит правильным, но путь элемента выглядит так:

[orphan]/sitecore/content/theItemName

Почему бит [сирота] добавляется на полный путь? И почему метод OnItemAdded вызывается более одного раза, хотя я добавляю только один элемент?

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

Я думаю, что есть известные проблемы с подобными событиями, когда метод будет вызываться несколько раз.Я знаю, что у меня был похожий опыт, когда я пытался программно создать роль для элемента при его создании. Джон Уэст сказал в качестве меры предосторожности следующее: :

Кажется, я помню, что Sitecore иногда запускает некоторые события более одного раза, поэтому вы можете проверить это [...]

Затем Джон предоставил ссылку на сообщение в блоге под названием Перехват обновлений элементов с помощью 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 не может предоставить более качественных опций (или нет более подходящих опций в переполнении стека).

0 голосов
/ 13 августа 2012

У меня была такая же проблема, похоже, что проблема связана с прокси-элементами.

Я бы добавил элемент, а затем получил бы множество этих [сиротских] путей, и каждый созданный элемент имел быдругой идентификатор.

Отключение прокси-элементов остановило создание [осиротевших] элементов.

EDIT - Обнаружена поврежденная таблица теней, усечена таблица теней в мастеребазы данных и усекли базу данных Links в ядре, затем перестройте базу данных Links.Я получил 46 таких бесхозных записей для предметов, на которых не должны были быть установлены прокси-предметы.

0 голосов
/ 23 июня 2011

В этом случае я бы посмотрел на создание шаблона команды (созданного на основе собственного элемента Sitecore Create) и добавил бы туда свою функциональность принудительного применения-уникального имени.

Дополнительным преимуществом будет то, что элемент никогда не будет создан в первую очередь, если имя не уникально.

Ссылка: http://sdn.sitecore.net/upload/sitecore6/datadefinitioncookbook-a4.pdf#search=%22command%22

...