0

在 Orchard 中使用 Contrib.Taxonomies 预览和拒绝草稿:

我需要在导入后预览(如有必要,拒绝)分类术语。

我试图用以下代码做到这一点:

A. 我已将标准导入代码的最后一行更改为:

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>());
}

C. 预览屏幕也有一个“拒绝”按钮,控制器操作带有以下代码:

// delete drafts
foreach (var draftTerm in _MyTaxonomyService.GetDraftTerms(taxonomyId)) {
    _taxonomyService.DeleteTerm(draftTerm);
}

使用上面的代码,我可以随意“发布”多次,并且可以按预期工作。

但是,如果我“拒绝”然后发布,我会得到顶级术语的“冲突中的永久链接”。

如何在下次发布时删除草稿而不会出现永久链接冲突?

(另请注意,删除草稿不应影响当前发布条款的永久链接/显示别名)。

4

1 回答 1

0

好的,根本问题是_taxonomyService.DeleteTerm()触发AutoRouteHandler.OnRemoved()事件方法。

此事件方法将向下调用堆栈到AliasStorage.Remove(),它仅将路径/别名源作为参数,即它将删除与给定路径匹配的所有 AliasRecords,即已发布版本仍然依赖的别名!

我对这个问题的解决方案是用我自己的删除草稿条款_taxonomyService.DeleteTerm()的自定义方法替换调用。_MyTaxonomyService.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() 会认为有重复的发布路径并引发冲突警告。

于 2013-02-22T18:00:49.520 回答