我正在尝试捕获组件未发布的时间。我尝试了一些方法,但我没有想要的结果。我的尝试是:
在事件系统中。但这不起作用,因为Windows中存在一个关于MSXML和COM +的已知错误。
我尝试构建自己的IResolver但在那里我无法确定它是发布还是取消发布。
我尝试构建自己的ITransportPackageHandler。在那里,我有一个名为HandleResolvedItemForUnPublishing的函数,但是我没有关于PublicationTarget的任何信息,我不知道它是否从登台或实时中取消发布。
有人能帮助我吗?我认为如果可以解决问题:
古斯塔沃。
答案 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
,但是这个不会直接在解析器中公开。以下是我发现或不发布的情况 - 如果认为它是过度杀戮你的电话,但我的非生产虚拟机的性能非常好。
Action
属性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。当你的页面需要获取页面上嵌入的组件以对它们做任何事情时。
如果您还有其他问题,请与我们联系。