4

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

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

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

  3. 我尝试构建自己的 ITransportPackageHandler。在那里,我有一个名为 HandleResolvedItemForUnPublishing 的函数,但我没有任何关于 PublicationTarget 的信息,而且我不知道它是从暂存中还是未发布的。

有人能帮我吗?我认为我可以解决这个问题,如果:

  1. 在 IResolver,我可以确定组件是否正在取消发布。
  2. 在 ITransportPackageHandler 我可以访问 PublicationTarget 信息
  3. 如果我可以在上下文变量或类似的东西中将信息从 IResolver 传递给 ITransportPackageHandler。

非常感谢你。

古斯塔沃。

4

2 回答 2

6

您应该能够查看作为自定义解析器中ResolvePurposeResolveInstruction参数之一获得的 。这些方面的东西:

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?)
    }
}

编辑

我拒绝不找到一种方法来完成这项工作......

事实上,在 Tridion 2009 中,您没有Purposeon resolve 指令。您Action在 Publish Transaction 中确实有一个,但这个并没有直接在解析器中公开。以下是我发现我是发布还是取消发布的方法 - 如果您认为这太过分了,但我的非生产 VM 上的性能非常好。

  1. 找到我们正在解决的当前项目
  2. 加载状态为“进行中”的 PublishTransaction 列表
  3. 查找当前项目的交易
  4. 通过查看Action属性确定动作
Filter filter = new Filter();
filter.Conditions["InfoType"] = 2; // Get transactions in Progress
foreach (XmlNode node in item.Session.GetList(typeof(PublishTransaction), filter))
{
    if(node.Attributes["ItemID"].Value.Equals(item.Id.ToString()))
    {
        // we have a winner
        string action;
        if (node.Attributes["Action"].Value.Equals("0"))
            action = "Publish";
        if (node.Attributes["Action"].Value.Equals("1"))
            action = "Unpublish";
    }
}
于 2013-03-01T10:25:58.330 回答
1

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

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当它是一个页面时,您确实需要获取嵌入在页面上的组件才能对它们进行任何操作。

如果您还有其他问题,请告诉我。

于 2013-03-01T09:20:07.373 回答