【问题标题】:Event System: How to know if editor clicked Save or Save & Close?事件系统:如何知道编辑器是否单击了保存或保存并关闭?
【发布时间】:2012-04-24 04:20:18
【问题描述】:

在 Tridion 2011 SP1 中,我正在尝试实现一个事件,该事件将在编辑器按下 Save & Close(但不是 Save)时自动发布项目。

在正常情况下,这可以在 CheckIn 事件中处理,但由于该项目可能在工作流程中,因此没有 CheckIn 事件(目前)。

在 COM 事件中,我们有一个标志 (doneEditing) 来告诉我们编辑器是否按下了保存和关闭与保存。我似乎无法在 TOM.NET Events 中找到类似的选项。

供参考 - 这是到目前为止的代码:

[TcmExtension("Publish to Wip Events")]
public class PublishToWip : TcmExtension
{
    public PublishToWip()
    {
        EventSystem.SubscribeAsync<VersionedItem, SaveEventArgs>(PublishItemToWip, EventPhases.TransactionCommitted);
    }
    private void PublishItemToWip(VersionedItem item, SaveEventArgs args, EventPhases phases)
    {
       // Magic goes here
    }
}

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

【问题讨论】:

    标签: tridion


    【解决方案1】:

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

    使用 CheckInEvent 而不是保存。即使项目处于工作流程中,它仍会在您单击保存并关闭时调用此事件(并且在您单击保存并关闭时调用,而不是在您单击保存时调用)。

    这样的事情会让我继续前进:

    [TcmExtension("Publish to Wip Events")]
    public class PublishToWip : TcmExtension
    {
        public PublishToWip()
        {
            EventSystem.Subscribe<VersionedItem, CheckInEventArgs>
                (PublishItemToWip, EventPhases.Processed);
        }
        private void PublishItemToWip(VersionedItem item, 
            CheckInEventArgs args, EventPhases phases)
        {
    
            if (!item.LockType.HasFlag(LockType.InWorkflow)) return;
    
            if (!item.IsCheckedOut) return;
            // do something now
    

    【讨论】:

    • 您可能希望使用 TransactionCommitted 阶段而不是 Processed 阶段来处理此 CheckIn 事件。这样您就可以确定保存和关闭操作实际上已完成,并且在其过程中的某个地方没有遇到错误。这也是我在 SDL Tridion World sdltridionworld.com/articles/sdltridion2011/…987654321@事件系统文章中的事件矩阵中描述的内容。
    • 我会在 TransactionCommitted 上试一试。不确定它是否会起作用,因为 CheckIn 从未真正发生过 - 该项目在工作流程中。
    • 是的,这是我在将旧矩阵写入新矩阵时确实没有考虑过的一件事。有兴趣了解事务是否提交。
    【解决方案2】:

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

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

    在事件处理程序中,流程实例将包含具有版本化项目已完成工作流的主题列表 - 您要发布的那个:

    private static void FinishProcessHandler(Process process, FinishProcessEventArgs e, EventPhases phase)
    {
       foreach (var itemInWorkflow in process.Subjects)
       {
          //publish
       }
    }
    

    【讨论】:

    • Nuno 不是在寻找完成的工作流程,而是在寻找用户是否点击了保存并关闭。
    【解决方案3】:

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

    我的想法是有一个 GUI 扩展来拦截 Save 并为该项目编写一个 AppData 条目,说明它是 Save 或 SaveClose。然后您的事件系统将读取 AppData 并采取相应措施。

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

    【讨论】:

    • 确实,事件中似乎没有什么不同...如果没有工作流,则 CheckInAfterSave 标志可能设置为 true - 但在那种情况下,我会在 CheckIn 中执行我的代码无论如何……
    • CheckInAfterSave 标志只有在您开始编辑时自动签出时才会设置为 true。如果您首先签出该项目(例如,从上下文菜单中)然后打开它进行编辑,则使用 Save-and-close 关闭对话框将不会签入该项目。显式签出 -> 显式签入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多