如何使用Sitecore.Data.Serialization.Manager.LoadItem(path,LoadOptions)将项目还原到Sitecore?

时间:2011-12-02 21:38:34

标签: wcf serialization sitecore

我正在尝试使用sitecore API来序列化和恢复sitecore项目。我创建了一个WCF应用程序来检索给定ID或sitecore路径的项目名称(/ sitecore / content / home),检索子项给出id或路径的项目名称列表。我也可以序列化内容树。

    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 \数据\系列化\主\ Sitecore的\内容\主页\标准项\玩笑\我们-Clients.item

C:\的Inetpub \ wwwroot的\ sitecorebfahnestockinet \数据\系列化\主\ Sitecore的\内容\主页\标准项\玩笑\我们的客户端

似乎都没有做任何事情。我更改了项目的预告片标题,并尝试恢复到之前,但每次更改仍然存在。

任何帮助都会受到赞赏,因为SiteCore文档非常有限。

3 个答案:

答案 0 :(得分:2)

您可以随时使用Reflector检查Sitecore代码的工作方式,当您点击后端的“还原项目”时,会调用以下方法:

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 :(得分:1)

您有正确的LoadOptions强制覆盖(又名还原)。

我怀疑您用于.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);
    }
}

答案 2 :(得分:0)

我花了一些时间来锻炼,但你必须在恢复树时删除.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);
        }
    }