如何删除 Sitecore 中的项目并更新所有引用
How to Delete Item in Sitecore and Update All References
我需要以编程方式删除 Sitecore 中的项目,但如果它们被其他项目引用,那么我需要更新这些项目以引用其他项目。
在 UI 中,Sitecore 提供了一个用于执行此操作的对话框,但是 item.Delete()
和 item.Recycle()
方法似乎没有针对类似内容的任何覆盖。我可以使用 Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true)
来获取引用项,但我仍然需要从这些项中获取特定字段并根据它们的类型更新它们。
据我所知,只要项目的 ID 在引用项目的字段中被替换,字段的类型就无关紧要。一个例外是富文本字段类型,其中 HTML 中的 link 具有以下格式:
<a href="-/media/somelowercaseguidwithouthyphens.ashx"></a>
所以我们应该可以做两个简单的替换。一种用于商品 ID,另一种用于小写、无连字符的 ID。
首先,获取引用项 links,并创建替换字符串。
var links = Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true);
string oldIdWithoutBraces = item.ID.ToString().Replace("{", "").Replace("}", "");
string newIdWithoutBraces = newItem.ID.ToString().Replace("{", "").Replace("}", "");
string oldIdForHyperlinks = oldIdWithoutBraces.ToLower().Replace("-", "");
string newIdForHyperlinks = newIdWithoutBraces.ToLower().Replace("-", "");
然后,对于每个引用项目 link,获取其引用字段并更新其中的项目 ID。
using (new Sitecore.SecurityModel.SecurityDisabler())
{
foreach (var link in links)
{
var sourceItem = link.GetSourceItem();
var fieldId = link.SourceFieldID;
var field = sourceItem.Fields[fieldId];
sourceItem.Editing.BeginEdit();
try
{
field.Value = field.Value
.Replace(oldIdWithoutBraces, newIdWithoutBraces)
.Replace(oldIdForHyperlinks, newIdForHyperlinks);
}
catch
{
sourceItem.Editing.CancelEdit();
}
finally
{
sourceItem.Editing.EndEdit();
}
}
}
之后,可以删除原来的项目。
item.Recycle();
一些 Sitecore 字段类型(例如图像字段)有一个 path
属性,该属性也应该更新,但将其应用到上面的代码中应该不难。
我需要以编程方式删除 Sitecore 中的项目,但如果它们被其他项目引用,那么我需要更新这些项目以引用其他项目。
在 UI 中,Sitecore 提供了一个用于执行此操作的对话框,但是 item.Delete()
和 item.Recycle()
方法似乎没有针对类似内容的任何覆盖。我可以使用 Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true)
来获取引用项,但我仍然需要从这些项中获取特定字段并根据它们的类型更新它们。
据我所知,只要项目的 ID 在引用项目的字段中被替换,字段的类型就无关紧要。一个例外是富文本字段类型,其中 HTML 中的 link 具有以下格式:
<a href="-/media/somelowercaseguidwithouthyphens.ashx"></a>
所以我们应该可以做两个简单的替换。一种用于商品 ID,另一种用于小写、无连字符的 ID。
首先,获取引用项 links,并创建替换字符串。
var links = Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true);
string oldIdWithoutBraces = item.ID.ToString().Replace("{", "").Replace("}", "");
string newIdWithoutBraces = newItem.ID.ToString().Replace("{", "").Replace("}", "");
string oldIdForHyperlinks = oldIdWithoutBraces.ToLower().Replace("-", "");
string newIdForHyperlinks = newIdWithoutBraces.ToLower().Replace("-", "");
然后,对于每个引用项目 link,获取其引用字段并更新其中的项目 ID。
using (new Sitecore.SecurityModel.SecurityDisabler())
{
foreach (var link in links)
{
var sourceItem = link.GetSourceItem();
var fieldId = link.SourceFieldID;
var field = sourceItem.Fields[fieldId];
sourceItem.Editing.BeginEdit();
try
{
field.Value = field.Value
.Replace(oldIdWithoutBraces, newIdWithoutBraces)
.Replace(oldIdForHyperlinks, newIdForHyperlinks);
}
catch
{
sourceItem.Editing.CancelEdit();
}
finally
{
sourceItem.Editing.EndEdit();
}
}
}
之后,可以删除原来的项目。
item.Recycle();
一些 Sitecore 字段类型(例如图像字段)有一个 path
属性,该属性也应该更新,但将其应用到上面的代码中应该不难。