7

我正在使用 Tridion 2011 的事件系统在取消发布组件时执行一些额外的操作。我正在使用此处找到的代码发布相关组件。

我正在注册我的事件处理程序,如下所示:

EventSystem.Subscribe<Component, UnPublishEventArgs>(
    RemoveAndRepublish, EventPhases.Initiated);

...我的处理程序方法如下:

public void RemoveAndRepublish(Component cmp, UnPublishEventArgs args, 
                               EventPhases phase)
{
    // ... code to locate related component, and perform required actions...

    var instruction = new PublishInstruction(cmp.Session)
    {
        DeployAt = DateTime.Now,
        RenderInstruction = new RenderInstruction(cmp.Session)
        {
            RenderMode = RenderMode.Publish
        },
        ResolveInstruction = new ResolveInstruction(cmp.Session)
        {
            IncludeComponentLinks = true
        },
        RollbackOnFailure = true,
        StartAt = DateTime.MinValue
    };

    var target = args.Targets.FirstOrDefault();

    PublishEngine.Publish(new[] {related}, instruction, new[] {target});
}

我的问题是该UnPublishEventArgs.Targets属性是一个IList<PublishingTarget>,在运行时结果是一个List<TargetType>,我需要一个PublicationTarget对象才能调用PublishEngine.Publish(...)

我的问题是:有没有办法从 UnPublish 事件中获取当前的(未)PublicationTarget?

任何人都可以提供任何帮助吗?

4

1 回答 1

7

您需要自己从TargetType(s)中找出PublicationTarget( s) 。根据项目的TargetTypePublication,您将需要遍历PublicationTargets以查看它们是否允许您的Publication发布给它们。这将(最终)为您提供PublicationTargets列表。不幸的是,这是相当多的工作:(

说了这么多,你真的需要PublicationTarget吗?如果您需要从相同的发布/目标组合重新发布或取消发布项目,您应该能够将相同的TargetType数组解析为PublishEngine.Publish(...)方法。

当我搜索文档时,我在 PublishEngine() 上看到以下覆盖:

PublishEngine.Publish Method (IEnumerable<(Of <(<'IdentifiableObject>)>)>, PublishInstruction, IEnumerable<(Of <(<'TargetType>)>)>, PublishPriority)

public static ICollection<PublishTransaction> Publish(
    IEnumerable<IdentifiableObject> items,
    PublishInstruction publishInstruction,
    IEnumerable<TargetType> targetTypes,
    PublishPriority priority
)
于 2013-01-31T16:39:48.413 回答