Orchardcms Orchard Contrib.分类法-删除草稿时永久链接冲突
使用Orchard中的Contrib分类法预览和拒绝草稿: 我需要在导入后预览(如有必要,拒绝)分类术语 我已尝试使用以下代码执行此操作: A.我已将标准进口代码的最后一行更改为:Orchardcms Orchard Contrib.分类法-删除草稿时永久链接冲突,orchardcms,Orchardcms,使用Orchard中的Contrib分类法预览和拒绝草稿: 我需要在导入后预览(如有必要,拒绝)分类术语 我已尝试使用以下代码执行此操作: A.我已将标准进口代码的最后一行更改为: Services.ContentManager.Create(term, VersionOptions.Draft); (而不是VersionOptions.Published) B.我的预览屏幕有一个“发布”按钮,控制器操作代码如下: // remove current published terms fore
Services.ContentManager.Create(term, VersionOptions.Draft);
(而不是VersionOptions.Published)
B.我的预览屏幕有一个“发布”按钮,控制器操作代码如下:
// remove current published terms
foreach (var term in _taxonomyService.GetTerms(taxonomyId)) {
_taxonomyService.DeleteTerm(term);
}
// publish draft terms created at import
foreach (var draftTerm in _MyTaxonomyService.GetDraftTerms(taxonomyId)) {
Services.ContentManager.Publish(draftTerm.As<ContentItem>());
}
// delete drafts
foreach (var draftTerm in _MyTaxonomyService.GetDraftTerms(taxonomyId)) {
_taxonomyService.DeleteTerm(draftTerm);
}
有了上面的代码,我可以“发布”任意多的次数,并且工作正常
然而,如果我“拒绝”然后发布,我会得到顶级术语“冲突中的永久链接”
如何在下次发布时删除草稿而不产生永久链接冲突
(还要注意,删除草稿不应影响当前已发布术语的永久链接/显示别名)。好的,基本问题是
\u taxonyservice.DeleteTerm()
正在触发自动路由处理程序.OnRemoved()
事件方法
此事件方法将调用堆栈到AliasStorage.Remove()
,该堆栈仅将path/aliassource作为参数,即它将删除与给定路径匹配的所有别名记录,即发布版本仍然依赖的别名
我解决这个问题的方法是用我自己的自定义方法\u MyTaxonomyService.DeleteDraftTerm()
替换\u taxonomyService.DeleteDraftTerm()
来删除草案条款。注意从处理程序事件调用中删除AutoRoutePartHandler:
public void DeleteDraftTerm(ContentItem contentItem)
{
var draftVersions = _contentItemVersionRepository.Fetch(x => x.ContentItemRecord == contentItem.Record && x.Latest && !x.Published);
var context = new RemoveContentContext(contentItem);
_handlers.Value.Invoke(handler => handler.Removing(context), Logger);
foreach (var version in draftVersions)
{
if (version.Latest)
{
version.Latest = false;
}
}
// comment this line out and replace with lines below
// _handlers.Value.Invoke(handler => handler.Removed(context), Logger);
var handlersExceptAutoRoute = _handlers.Value.Where(x => x.GetType() != typeof(AutoroutePartHandler));
handlersExceptAutoRoute.Invoke(handler => handler.Removed(context), Logger);
}
Tbh,我不确定为什么这是必要的。在我添加这段新代码之前,当我删除带有自动路由部分的草稿内容项时,它似乎导致没有别名记录,但仍然有已发布的自动路由部分记录。因此AutoRoutePartHandler.ProcessAlias()会认为存在重复的发布路径,并发出冲突警告