2017-01-23 3 views
1

Работа с Sitecore 8 Update 2Получить полный путь на Sitecore пункта удалить

Я добавил некоторые конфигурации и код, чтобы захватить событие, когда элемент будет удален. Я хочу получить полный путь к элементу, но все, что я могу получить, это [orphan]/{itemName} (где {itemName} - это itemName, но он всегда содержит литеральную строку [orphan]).

Итак, я предполагаю, что к тому времени, когда я получу событие, элемент уже удален, и я больше не могу получить путь? Есть ли другой способ получить путь к элементу по мере его удаления?

Конфигурация:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <events> 
     <event name="item:deleted"> 
     <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemDeleted" patch:before="*[@type='Sitecore.Links.ItemEventHandler, Sitecore.Kernel']" /> 
     </event> 
    </events> 
    </sitecore> 
</configuration> 

Код:

public class SaveItemActions : PublishItemProcessor // Multi purpose class, catches saves, publishes, etc.. 
{ 
    protected void OnItemDeleted(object sender, EventArgs args) 
    { 
     Item item = Event.ExtractParameter(args, 0) as Item; 
     if (isValidItem(item)) 
     { 
      ItemActionDAO.Insert(CreateItemAction("Deleted", item), item); 
     } 
    } 
} 
+1

вы пробовали 'пункт: deleting' событие? –

ответ

2

Вы связываясь с удаленным событием, которое происходит после того, элемент был удален. Вероятно, вы захотите связать ранее в модели событий (например, «удаление», как это было предложено @Marek Musielak), чтобы получить нужную вам информацию.

Обратите внимание, что элемент может НЕ удаляться между удалением события и удалением, поскольку действие, прослушивающее событие, может привести к сбою удаления. По этой причине убедитесь, что вы только фиксируете нужные данные и все еще слушаете удаленное событие, чтобы узнать, когда элемент действительно был удален.

3

Добавить новый обработчик item:deleting события:

<events> 
    <event name="item:deleting"> 
    <handler type="My.Assembly.Namespace.ItemEventHandler, My.Assembly" method="OnItemDeleting" /> 
    </event> 
</events> 

И код:

public class ItemEventHandler 
{ 
    public void OnItemDeleting(object sender, EventArgs args) 
    { 
     if (args != null) 
     { 
      var item = Event.ExtractParameter(args, 0) as Item; 
      Assert.IsNotNull(item, "No item in parameters"); 
      string path = item.Paths.FullPath; 

     } 
    } 
} 
+0

Кажется, мне действительно нужно это решение. Но если я не ошибаюсь, процесс удаления может быть прерван после того, как мой пользовательский код будет запущен другими обработчиками? Если так, мне также понадобится способ захватить это. EDIT: Я объединил 2, как предложил Джей. Сохранение идентификатора и пути в словаре stati при удалении события и извлечение его на удаленное событие. – Timon

+0

Вы также можете сохранить его в Sitecore.Context.Items, который доступен только в течение всего времени выполнения запроса/события. – haliphax

Смежные вопросы