2012-09-28 8 views
7

イベントシステムハンドラコード:複数のページが公開されていると、イベントシステムは、(例外をスローすることによって)そのうちの一つをブロックするだけ程度である時には、上記のコードでTridion 2011イベントシステムでは、1ページの公開を禁止できますか?

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

、その後、すべてのページを効果的に防止されます出版された。 [発行可能なコンテンツを生成中に無視する]チェックボックスは、この動作に影響しません。

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

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. 提供するために、何の賢明な方法はありませんQuirijnの提案どおりのコードを更新しました

    EDIT

    アイテムが除外されたときのユーザーへの明示的なフィードバック(「表示するアイテムを表示する」オプションをチェックするようにアドバイスすることを除く)はありますか?

  2. カスタムリゾルバは、 'Page'だけでなく 'StructureGroup'と 'Publication'のすべてのアイテムタイプを明示的に考慮する必要があります。
  3. 評価コードが高価(Webサービスコール)である可能性があることを考えると、少なくとも「公開アイテムを表示」リストを作成してから実際の公開を行うまでの間に結果をキャッシュする方法はありますか? (そのような場合、評価は少なくとも2回起こる)。標準のリゾルバの実装を検討していた後

EDIT 2

  1. が、それは、好ましくは、同様IBulkResolverを実装するために/必要ですか?

答えて

7

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

How to remove items from publishing using a Tridion Resolver?を参照してください。

関連する問題