2016-02-23 7 views
0

В настоящее время я удаляю элементы, вызывая item.DeleteChildren(), и если есть ошибка, я хотел бы восстановить эти элементы, имея исходный список элементов var originalItems = item.GetChildren();, но как я могу восстановить их, чтобы значения, которые были внутри этих полей шаблонов, также остались?Как программно восстанавливать дочерние элементы Sitecore?

Я попытался выполнить следующее, но все, что делает, это воссоздать шаблон без значений полей.

foreach (Item backupItem in backupItems) 
{ 
    item.Add(backupItem.Name, backupItem.Template); 
} 

ответ

3

Вы можете архивировать их, а не удалять их и восстанавливать, если это необходимо.

http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2013/08/archiving-recycling-restoring-and-deleting-items-and-versions-in-the-sitecore-aspnet-cms.aspx

код с помощью John West

Sitecore.Data.Items.Item item = Sitecore.Context.Item; 
Sitecore.Diagnostics.Assert.IsNotNull(item, "item"); 
Sitecore.Data.Archiving.Archive archive = 
Sitecore.Data.Archiving.ArchiveManager.GetArchive("archive", item.Database); 

foreach (Sitecore.Data.Items.Item child in item.Children) 
{ 
    if (archive != null) 
    { 
    // archive the item 
    archive.ArchiveItem(child); 
    // to archive an individual version instead: archive.ArchiveVersion(child); 
    } 
    else 
    { 
    // recycle the item 
    // no need to check settings and existence of archive 
    item.Recycle(); 
    // to bypass the recycle bin: item.Delete(); 
    // to recycle an individual version: item.RecycleVersion(); 
    // to bypass the recycle bin for a version: item.Versions.RemoveVersion(); 
    } 
} 

Для восстановления используйте один и тот же класс архива.

using (new SecurityDisabler()) 
{ 
    DateTime archiveDate = new DateTime(2015, 9, 8); 
    string pathPrefix = "/sitecore/media library"; 

    // get the recyclebin for the master database 
    Sitecore.Data.Archiving.Archive archive = Sitecore.Data.Database.GetDatabase("master").Archives["recyclebin"]; 

    // get as many deleted items as possible 
    // where the archived date is after a given date 
    // and the item path starts with a given path 
    var itemsRemovedAfterSomeDate = 
     archive.GetEntries(0, int.MaxValue) 
       .Where(entry => 
        entry.ArchiveDate > archiveDate && 
        entry.OriginalLocation.StartsWith(pathPrefix) 
       ).ToList(); 

    foreach (var itemRemoved in itemsRemovedAfterSomeDate) 
    { 
     // restore the item 
     archive.RestoreItem(itemRemoved.ArchivalId); 
    } 
} 
Смежные вопросы