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();
}
}
}
}
一些反對意見(或者說後續問題)迄今:
- 有沒有合理的方式提供當項目被排除時(除了建議檢查「顯示要發佈的項目」選項),向用戶顯式反饋?
- 定製解析器必須明確說明所有項目類型,即:不僅是「頁」,而且「StructureGroup」和「發佈」,它不能?
- 鑑於評估代碼可能是昂貴的(Web服務調用),有沒有什麼辦法來緩存它的結果至少準備「顯示項目以發佈」列表,並在實際執行出版之間? (在這種情況下,評估至少發生兩次)。
EDIT 2
尋找到標準解析器實施後:
- 是否有必要/最好實現IBulkResolver呢?