Tridion 事件系统:如何知道编辑器是否单击了保存或保存&;接近?

Tridion 事件系统:如何知道编辑器是否单击了保存或保存&;接近?,tridion,Tridion,在Tridion2011SP1中,我试图实现一个事件,每当编辑器按下Save&Close(但不按下Save)时,该事件将自动发布项目 在正常情况下,这可以在签入事件中处理,但由于此项目可能位于工作流中,因此还没有签入事件(尚未) 在COM事件中,我们有一个标志(doneEditing)告诉我们编辑器是否按下了save&close vs save。在TOM.NET事件中,我似乎找不到类似的选项 供参考-以下是迄今为止的代码: [TcmExtension(“发布到Wip事件”)] 公共类Publis

在Tridion2011SP1中,我试图实现一个事件,每当编辑器按下Save&Close(但不按下Save)时,该事件将自动发布项目

在正常情况下,这可以在签入事件中处理,但由于此项目可能位于工作流中,因此还没有签入事件(尚未)

在COM事件中,我们有一个标志(doneEditing)告诉我们编辑器是否按下了save&close vs save。在TOM.NET事件中,我似乎找不到类似的选项

供参考-以下是迄今为止的代码:

[TcmExtension(“发布到Wip事件”)]
公共类PublishToWip:TcmExtension
{
公共出版物(IP)
{
EventSystem.SubscribeAsync(PublishItemToWip,EventPhases.TransactionCommitted);
}
私有void PublishItemToWip(VersionedItem、SaveEventArgs、EventPhases)
{
//这里有魔法
}
}

我已经查看了SaveEventArgs的选项,但没有找到任何可以提供此信息的选项。有什么建议吗?

我过去一直在研究这个问题,但找不到合适的解决方案。最后我放弃了

我的想法是使用一个GUI扩展来拦截保存,并因此为该项编写一个AppData条目,说明它是保存或保存关闭。然后,事件系统将读取AppData并相应地执行操作


不要忘记清理事件代码中的AppData。

为了捕获项目完成的工作流,您需要在流程上而不是组件上订阅FinishProcess事件:

EventSystem.SubscribeAsync<Process, FinishProcessEventArgs>(FinishProcessHandler, EventPhases.TransactionCommitted, EventSubscriptionOrder.Late);

好的,在CM团队的帮助下,我得到了正确的答案

使用CheckInEvent而不是save。即使项目处于工作流中,当您单击“保存并关闭”时,它仍将调用此事件(并且仅当您单击“保存并关闭”时,而不是单击“保存”时,

像这样的事情会让我走:

[TcmExtension(“发布到Wip事件”)]
公共类PublishToWip:TcmExtension
{
公共出版物(IP)
{
EventSystem.Subscribe
(PublishItemToWip,EventPhases.Processed);
}
私有void PublishItemToWip(版本数据项,
检查事件目标参数、事件阶段)
{
如果(!item.LockType.HasFlag(LockType.InWorkflow))返回;
如果(!item.IsCheckedOut)返回;
//现在做点什么

事实上,事件中似乎没有什么不同…如果没有工作流,CheckInAfterSave标志可能设置为true-但在这种情况下,我无论如何都会在CheckIn事件中执行我的代码…在这种情况下,只有在您启动时自动签出项目时,CheckInAfterSave标志才会设置为truerted编辑。如果您首先签出项目(例如,从关联菜单)然后打开它进行编辑,使用“保存并关闭”关闭对话框将不会签入该项目。显式签出->显式签入。Nuno不是在寻找已完成的工作流,他是在寻找用户是否单击了“保存并关闭”。您可能希望对该签入使用TransactionCommitted阶段,而不是处理阶段ent。这样,您可以确定保存和关闭操作实际上已完成,并且在其过程中的某个地方没有遇到错误。这也是我在SDL Tridion World上的事件系统文章中在事件矩阵中描述的内容。我将尝试TransactionCommitted。不确定它是否会工作,因为签入从未实际发生过-该项是在工作流中。是的,这是我在编写新旧矩阵时确实没有考虑到的一件事。我很想知道事务是否提交。
private static void FinishProcessHandler(Process process, FinishProcessEventArgs e, EventPhases phase)
{
   foreach (var itemInWorkflow in process.Subjects)
   {
      //publish
   }
}