7

イベントシステムハンドラーコード:

[TcmExtension("My Handler")]
public sealed class EventSystem : TcmExtension
{
    public EventSystem()
    {
        EventSystem.Subscribe<Page, PublishEventArgs>((page, e, phases) => {
            if (shouldTerminatePublishing(page))
            {
                throw new Exception(ex, page);
            }
        }, EventPhases.Initiated, EventSubscriptionOrder.Normal);
    }
}

上記のコードを使用すると、複数のページが公開されており、Event Systemが(例外をスローして)そのうちの1つをブロックしようとしている場合、すべてのページも効果的に公開されなくなります。[公開可能なコンテンツの生成中に障害を無視する]チェックボックスは、この動作に影響しません。

特定のページが公開されないようにしながら、残りのすべてのページを公開できるようにするにはどうすればよいですか?

編集

Quirijnの提案に従ってコードを更新しました:

public class MyResolver: IResolver
{
    public void Resolve(
        IdentifiableObject item,
        ResolveInstruction instruction,
        PublishContext context,
        ISet<ResolvedItem> resolvedItems)
    {
        var page = item as Page;

        if (null != page && instruction.Purpose == ResolvePurpose.Publish)
        {
            try
            {
                // Evaluate whether publishing is allowed
            }
            catch (Exception ex)
            {
                resolvedItems.Clear();
            }
        }
    }
}

これまでのいくつかの異議(またはむしろフォローアップの質問):

  1. アイテムが除外されたときにユーザーに明示的なフィードバックを提供する賢明な方法はありません([公開するアイテムを表示する]オプションをオンにするようにアドバイスする場合を除く)。
  2. カスタムリゾルバーは、すべてのアイテムタイプを明示的に考慮する必要があります。つまり、「ページ」だけでなく、「StructureGroup」と「Publication」も考慮する必要がありますか?
  3. 評価コードは高額になる可能性があるため(Webサービス呼び出し)、少なくとも「公開するアイテムを表示」リストを準備してから実際に公開するまでの間に、その結​​果をキャッシュする方法はありますか?(このような場合、評価は少なくとも2回行われます)。

編集2

標準のリゾルバーの実装を調べた後:

  1. IBulkResolverも実装する必要がありますか?
4

1 に答える 1

7

これは、イベントシステムではなく、カスタムリゾルバーで行う必要があります。これは、アイテムが公開キューに入れられたときにどのページ/コンポーネントを効果的に公開するかを決定するために実行されるコードです。ここでは、公開したくないページやコンポーネントを除外できます。

Tridionリゾルバーを使用してアイテムを公開から削除する方法を参照してください。。

于 2012-09-28T16:08:45.740 に答える