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

时间:2012-09-28 15:58:52

标签: tridion

事件系统处理程序代码:

[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即将阻止其中一个(通过抛出异常)时,所有页面都被有效地阻止发布。 “生成可发布内容时忽略失败”复选框不会影响此行为。

如何阻止任何特定页面发布但仍允许发布所有其他页面?

修改

根据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. 自定义解析器必须明确说明所有项目类型,即:不仅是'Page'而且'StructureGroup'和'Publication',不是吗?
  3. 鉴于评估代码可能很昂贵(Web服务调用),有没有办法在准备“显示要发布的项目”列表和执行实际发布之间缓存它的结果? (在这种情况下评估至少发生两次)。
  4. 编辑2

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

    1. 是否有必要/最好是实施 IBulkResolver

1 个答案:

答案 0 :(得分:7)

您不应该在事件系统中执行此操作,而应在自定义解析程序中执行此操作。这是一段代码,用于确定将项目放入发布队列时应有效发布哪些页面/组件。 在这里,您可以过滤掉您不想发布的任何页面或组件。

请参阅How to remove items from publishing using a Tridion Resolver?