2012-09-28 51 views
7

事件系統的處理程序代碼:Tridion 2011 Event System如何防止發佈單個頁面?

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

隨着當多個頁正被髮布和事件系統僅約以阻止它們中的一個(通過拋出異常)上面的代碼,然後所有頁面都有效地被防止也出版了。 「生成發佈內容時忽略失敗」複選框不會影響此行爲。

如何防止任何特定的網頁,從出版,但仍允許其餘全部予以公佈?

編輯

每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」和「發佈」,它不能?
  3. 鑑於評估代碼可能是昂貴的(Web服務調用),有沒有什麼辦法來緩存它的結果至少準備「顯示項目以發佈」列表,並在實際執行出版之間? (在這種情況下,評估至少發生兩次)。

EDIT 2

尋找到標準解析器實施後:

  1. 是否有必要/最好實現IBulkResolver呢?

回答

相關問題