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

Gus*_*itt 4 tridion tridion2009

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

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

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

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

有人能帮我吗?我认为如果以下情况我可以解决问题:

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

非常感谢你.

古斯塔沃.

Nun*_*res 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?)
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

实际上,在Tridion 2009中,您没有Purpose解决方案.您Action在发布事务中确实有一个,但是这个没有直接在解析器中公开.以下是我发现或发布的方式 - 如果认为它是过度杀戮你的电话,但我的非生产VM的性能非常好.

  1. 找到我们正在解决的当前项目
  2. 加载PublishTransaction列表,状态为"In Progress"
  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";
    }
}
Run Code Online (Sandbox Code Playgroud)