我正在尝试使用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文档非常有限。
答案 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);
}
}