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()。これは、引数としてpath / aliassourceのみを取ります。つまり、指定されたパスに一致するすべてのAliasRecord、つまり、公開されたバージョンがまだ依存しているエイリアスを削除します。

この問題に対する私の解決策は、_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);

    }

ちなみに、なぜこれが必要なのかよくわかりません。この新しいコードを追加する前に、autorouteパーツを含むドラフトコンテンツアイテムを削除すると、aliasrecordsがないように見えましたが、autoroutepartレコードは公開されていました。したがって、AutoRoutePartHandler.ProcessAlias()は、公開されたパスが重複していると見なし、競合の警告を発します。

于 2013-02-22T18:00:49.520 に答える