イベントシステムハンドラーコード:
[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();
}
}
}
}
これまでのいくつかの異議(またはむしろフォローアップの質問):
- アイテムが除外されたときにユーザーに明示的なフィードバックを提供する賢明な方法はありません([公開するアイテムを表示する]オプションをオンにするようにアドバイスする場合を除く)。
- カスタムリゾルバーは、すべてのアイテムタイプを明示的に考慮する必要があります。つまり、「ページ」だけでなく、「StructureGroup」と「Publication」も考慮する必要がありますか?
- 評価コードは高額になる可能性があるため(Webサービス呼び出し)、少なくとも「公開するアイテムを表示」リストを準備してから実際に公開するまでの間に、その結果をキャッシュする方法はありますか?(このような場合、評価は少なくとも2回行われます)。
編集2
標準のリゾルバーの実装を調べた後:
- IBulkResolverも実装する必要がありますか?