如果我正在发布或取消发布,如何在自定义解析器中确定? Tridion 2009 SP1

时间:2013-03-01 08:12:34

标签: tridion tridion2009

我正在尝试捕获组件未发布的时间。我尝试了一些方法,但我没有想要的结果。我的尝试是:

  1. 在事件系统中。但这不起作用,因为Windows中存在一个关于MSXML和COM +的已知错误。

  2. 我尝试构建自己的IResolver但在那里我无法确定它是发布还是取消发布。

  3. 我尝试构建自己的ITransportPackageHandler。在那里,我有一个名为HandleResolvedItemForUnPublishing的函数,但是我没有关于PublicationTarget的任何信息,我不知道它是否从登台或实时中取消发布。

  4. 有人能帮助我吗?我认为如果可以解决问题:

    1. 在IResolver,我可以确定该组件是否取消发布。
    2. 在ITransportPackageHandler,我可以访问PublicationTarget info
    3. 如果我可以在上下文变量或类似内容中将信息从IResolver传递给ITransportPackageHandler。
    4. 非常感谢你。

      古斯塔沃。

2 个答案:

答案 0 :(得分:6)

您应该能够查看自己获得的ResolvePurpose的{​​{1}}作为自定义解析程序中的参数之一。这些方面的东西:

ResolveInstruction

修改

我拒绝找到办法让这项工作......

事实上,在Tridion 2009中,您在解决指令上没有public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, ISet<ResolvedItem> resolvedItems) { if (instruction.Purpose == ResolvePurpose.Publish || instruction.Purpose == ResolvePurpose.RePublish) { // We are publishing } else if(instruction.Purpose == ResolvePurpose.UnPublish) { // We are unpublishing } // Don't know if this one exists in 2009, it exists in 2011 SP1 else if(instruction.Purpose == ResolvePurpose.UnknownByClient) { // The server is doing something that I don't understand (yet?) } } 。您在发布事务中确实有Purpose,但是这个不会直接在解析器中公开。以下是我发现或不发布的情况 - 如果认为它是过度杀戮你的电话,但我的非生产虚拟机的性能非常好。

  1. 找到我们正在解决的当前项目
  2. 加载状态为“正在进行中”的PublishTransaction列表
  3. 查找当前
  4. 的交易
  5. 通过查看Action属性
  6. 来确定操作
    Action

答案 1 :(得分:1)

假设您使用2011,您可以将事件处理程序绑定到Publish Transaction Save事件并验证State。然后,当未发布组件时,您可以执行所需的逻辑。

public sealed class PublishedToEventHandler: TcmExtension
{
    public PublishedToEventHandler()
    {
        EventSystem.SubscribeAsync<PublishTransaction, SaveEventArgs>(
            (subject, args, phase) =>
            {
                if (!PublishStransactionStateIsSuccessfullyCompleted(subject))
                    return;



            },
            EventPhases.TransactionCommitted
        );
    }

    static bool PublishStransactionStateIsSuccessfullyCompleted(PublishTransaction transaction)
    {
        return transaction.State == PublishTransactionState.Success ||
               transaction.State == PublishTransactionState.Warning;
    }
}

在此事件中处理任何事情之前,您可以验证事务的Instruction.ResolveInstruction.Purpose属性,以查看是否要发布取消发布。

该交易有一个ProcessedItems集合,每个集合都包含ResolvedItem.Item对象的ProcessedItem属性中的Page或Component。当你的页面需要获取页面上嵌入的组件以对它们做任何事情时。

如果您还有其他问题,请与我们联系。