是否可以将SDL Tridion 2011 GUI扩展中的值传递给事件处理程序中的SaveEventArgs

Chr*_*ers 5 tridion tridion-2011

我正在使用SDL Tridion 2011 SP1构建GUI扩展.我想在编辑器点击新的"保存并注释"按钮时收集一些用户输入.此按钮将收集一些用户输入,然后触发CME的内置保存命令.

然后使用事件处理程序我想捕获该用户输入,并使用它进行一些自定义处理.我的简单事件处理程序如下:

using System;
using System.Text;
using Tridion.ContentManager.Extensibility.Events;
using Tridion.ContentManager.Extensibility;
using Tridion.ContentManager.ContentManagement;
using System.IO;

namespace UrbanCherry.Net.SDLTridion.EventHandlers
{
  [TcmExtension("VersionCommenting")]
  public class VersionCommenting : TcmExtension
  {
    public VersionCommenting()
    {
      Subscribe();
    }

    public void Subscribe()
    {
      EventSystem.Subscribe<Component, SaveEventArgs>(AddCommentToItemVersion,
                                                      EventPhases.Initiated);
    }

    private void AddCommentToItemVersion(Component source, SaveEventArgs args,
                                         EventPhases phase)
    {
      //Do some work here   
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能我的GUI扩展以某种方式向SaveEventArgs添加值,使用args.ContextVariables或其他方法?

Fra*_*len 1

没有直接的方法将参数从 GUI 扩展传递到事件处理程序。因此,我能想到的唯一方法是将附加信息搭载到现有的数据结构中。应用程序数据(如 Will 所建议的)就是这样一种数据结构,但您也可以考虑将信息搭载到现有的 Component XML 上

由于您同时拥有 GUI 扩展和事件处理程序,因此您基本上可以在前者中执行任何操作,只要“撤消”后者中的这些更改即可。

所以我可以想象的一种方式:

  1. 在 GUI 扩展中,将带有注释的自定义元素注入到组件 XML 中
  2. 在事件处理程序中,提取注释并删除自定义元素

我还没有测试过这种方法,但已经使用自定义数据扩展器做了类似的事情:更改发送到服务器的命令或数据,然后在服务器上检测该更改并对其采取行动(在将其传递给 TCM 之前)。

当然,在这种情况下,您必须确保事件处理程序在早期阶段之一从组件 XML 中删除注释。

如果您想安全地执行此操作,您应该在很早的事件阶段从组件 XML 中删除注释,然后仅在提交前/提交后阶段保存注释。在这些阶段之间,您必须将注释存储在某个地方,但至少那时数据已从 GUI 发送到服务器。