Как использовать Sitecore.Data.Serialization.Manager.LoadItem (путь, LoadOptions) для восстановления элемента в Sitecore? - PullRequest
3 голосов
/ 03 декабря 2011

Я пытаюсь использовать API sitecore для сериализации и восстановления элементов sitecore.Я создал приложение WCF, чтобы получить имя элемента с указанным идентификатором или путем к sitecore (/ sitecore / content / home), получить список имен элементов, которым дети дают идентификатор или путь.Я также могу сериализовать дерево контента.

    public void BackupItemTree(string id)
    {
        Database db = Sitecore.Configuration.Factory.GetDatabase("master");
        Item itm = db.GetItem(id);

        Sitecore.Data.Serialization.Manager.DumpTree(itm);
    }

Приведенный выше код прекрасно работает.После запуска он может видеть, что дерево контента было сериализовано.

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

    public void RestoreItemTree(string path)
    {
        try
        {
            using (new Sitecore.SecurityModel.SecurityDisabler())
            {
                Database db = Sitecore.Configuration.Factory.GetDatabase("master");
                Data.Serialization.LoadOptions opt = new Data.Serialization.LoadOptions(db);
                opt.ForceUpdate = true;

                Sitecore.Data.Serialization.Manager.LoadItem(path, opt);
                //Sitecore.Data.Serialization.Manager.LoadTree(path, opt);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

С этим кодом я не получаю ошибок.Он работает, но если я проверяю SiteCore, он ничего не делает.Я проверил на примере Office Core.Путь, который я отправил, и это может быть проблемой:

C: \ inetpub \ wwwroot \ sitecoretest \ Data \ serialization \ master \ sitecore \ content \ Home \ Standard-Items \ Teasers \ Our-Clients.item

и

C: \ inetpub \ wwwroot \ sitecorebfahnestockinet \ Data \ serialization \ master \ sitecore \ content \ Home \ Стандартные-элементы \ Тизеры \ Наши клиенты

Ни один, кажется, ничего не делает.Я изменил название предмета-тизера и пытаюсь восстановить его раньше, но каждый раз, когда изменение все еще присутствует.

Любая помощь будет принята, поскольку документация SiteCore очень ограничена.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Вы всегда можете проверить, как работает код Sitecore, используя Reflector. При нажатии «Отменить элемент» в фоновом режиме вызывается следующий метод:

protected virtual Item LoadItem(Item item, LoadOptions options)
{
    Assert.ArgumentNotNull(item, "item");
    return Manager.LoadItem(PathUtils.GetFilePath(new ItemReference(item).ToString()), options);
}

В LoadOptions вы можете указать, хотите ли выперезаписать («Восстановить элемент») или просто обновить («Обновить элемент») его.

См. Sitecore.Shell.Framework.Commands.Serialization.LoadItemCommand для получения дополнительной информации.

1 голос
/ 05 декабря 2011

У вас есть правильный LoadOptions для принудительной перезаписи (иначе Revert).

Я подозреваю, что путь, который вы используете для файла .item, неверен.Я бы предложил изменить ваш метод так, чтобы он указывал путь к элементу Sitecore.Используя этот путь, вы должны использовать другие API-интерфейсы сериализации, чтобы определить, где должен находиться файл.

public void RestoreItemTree(string itemPath)
{
    Sitecore.Data.Database db = Sitecore.Configuration.Factory.GetDatabase("master");
    Sitecore.Data.Serialization.ItemReference itemReference = new Sitecore.Data.Serialization.ItemReference(db.Name, itemPath);
    string path = Sitecore.Data.Serialization.PathUtils.GetFilePath(itemReference.ToString());

    Sitecore.Data.Serialization.LoadOptions opt = new Sitecore.Data.Serialization.LoadOptions(db);
    opt.ForceUpdate = true;

    using (new Sitecore.SecurityModel.SecurityDisabler())
    {
        Sitecore.Data.Serialization.Manager.LoadItem(path, opt);
    }
}
0 голосов
/ 13 января 2015

Мне потребовалось некоторое время, чтобы потренироваться, но вы должны удалить .item при восстановлении дерева

попробуйте это

    public void RestoreItemTree(string itemPath)
    {
        var db = Factory.GetDatabase("master");
        var itemReference = new ItemReference(db.Name, itemPath);
        var path = PathUtils.GetFilePath(itemReference.ToString());

        if (!System.IO.File.Exists(path))
        {
            throw new Exception("File not found " + path);
        }

        var opt = new LoadOptions(db);
        opt.ForceUpdate = true;

        using (new SecurityDisabler())
        {
            Manager.LoadItem(path, opt);
            Manager.LoadTree(path.Replace(".item", ""), opt);
        }
    }
...