gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:55:58 27 4
gpt4 key购买 nike

事件系统处理程序代码:

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

到目前为止的一些反对意见(或者更确切地说是后续问题):
  • 当项目被排除时,没有明智的方法向用户提供明确的反馈(除了建议选中“显示要发布的项目”选项),是吗?
  • 自定义解析器必须明确说明所有项目类型,即:不仅适用于“页面”,还适用于“结构组”和“出版物”,难道不是吗?
  • 鉴于评估代码可能很昂贵(Web 服务调用),有没有办法至少在准备“显示要发布的项目”列表和执行实际发布之间缓存它的结果? (在这种情况下,评估至少发生两次)。

  • 编辑 2

    在研究了标准解析器的实现之后:
  • 是否有必要/最好实现 IBulkResolver 还有吗?
  • 最佳答案

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

    How to remove items from publishing using a Tridion Resolver? .

    关于tridion - Tridion 2011 事件系统如何阻止发布单个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643406/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com