Tridion 2011事件系统如何阻止单个页面的发布?

Tridion 2011事件系统如何阻止单个页面的发布?,tridion,Tridion,事件系统处理程序代码: [TcmExtension("My Handler")] public sealed class EventSystem : TcmExtension { public EventSystem() { EventSystem.Subscribe<Page, PublishEventArgs>((page, e, phases) => { if (shouldTerminatePublishing(p

事件系统处理程序代码:

[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);
    }
}
[TcmExtension(“我的处理程序”)]
公共密封类事件系统:TcmExtension
{
公共事件系统()
{
EventSystem.Subscribe((第页,e,阶段)=>{
如果(应终止发布(第页))
{
抛出新异常(例如,第页);
}
},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();
            }
        }
    }
}
公共类MyResolver:IResolver
{
公共无效解决方案(
可识别的对象项,
解析指令指令,
出版语境,
ISet(解析数据集)
{
var page=项目作为页面;
if(null!=页面和指令.Purpose==解析目的.Publish)
{
尝试
{
//评估是否允许发布
}
捕获(例外情况除外)
{
resolvedItems.Clear();
}
}
}
}
迄今为止的一些反对意见(或者更确切地说是后续问题):

  • 当项目被排除时,没有明智的方法向用户提供明确的反馈(建议选中“显示要发布的项目”选项除外),是吗
  • 自定义冲突解决程序必须明确说明所有项类型,即:不仅要说明“页面”,还要说明“结构组”和“发布”,不是吗
  • 考虑到评估代码可能很昂贵(web服务调用),至少在准备“显示要发布的项目”列表和执行实际发布之间,是否有任何方法可以缓存其结果?(在这种情况下,评估至少进行两次)
  • 编辑2

    在研究了标准解析器的实现之后:

  • 是否有必要/最好也实施IBulkResolver
    您不应该在事件系统中执行此操作,而应该在自定义解析器中执行此操作。这是一段代码,执行该代码可以确定在将项目放入发布队列时应有效发布哪些页面/组件。 在这里,您可以筛选出不希望发布的任何页面或组件