【问题标题】:Is it possible to pass values from an SDL Tridion 2011 GUI Extension to the SaveEventArgs in an event handler是否可以将 SDL Tridion 2011 GUI 扩展中的值传递给事件处理程序中的 SaveEventArgs
【发布时间】:2012-06-27 16:45:02
【问题描述】:

我正在使用 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   
    }
  }
}

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

【问题讨论】:

  • 我不建议在事件之间混合状态,如果多个人(几乎)同时单击“保存和评论”按钮会发生什么,您将如何跟踪这些?
  • 您打算将评论保存在元数据字段中吗?
  • 我实际上希望将它保存在用于回滚/转发的评论字段中,但这是下一个挑战

标签: tridion tridion-2011


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 您的意思是将评论作为自定义字段+值添加到内容 XML 中,而不在 Schema 中定义字段?
  • 这将是一种方法,尽管您可能必须增加 FieldBuilder 以确保“假字段”不会使内容无效。或者,您可以将其填充到组件 XML 的其他部分中,或者如果需要,甚至可以将其附加到标题中。请记住:由于您在此处编写等式的两边,因此您可以完全控制发生的事情。
【解决方案2】:

只是一个想法,不知道如何在 GUI 扩展中实际做到这一点,但是您是否想过在单击按钮时将评论设置为项目上的应用程序数据?

【讨论】:

  • 是的 - 想到了 - 我认为这是最后的手段,因为它不能被内容移植等 已经有一个“系统注释”字段用于回滚、前滚和更新等等,所以如果可以的话,我真的很想利用它。也许我需要提出增强请求以使用 Component.Save(Boolean FinishEditing, String Comment) 之类的内容添加到 API
  • 好吧,您也许可以将应用程序数据用作临时存储,将数据从 GUI 传递到事件系统,当您将其放入系统注释时,将其从应用程序数据中删除
  • 是的,我想这就是我必须要做的。我希望有一种更优雅的方法
  • 关于“最后的手段”选项... 让您了解一下 Chris,Content Porter 2009 SP2 now supports 应用程序数据的导出和导入,这可能会让您的事情变得更容易一些。跨度>
  • 据我了解,内容移植不支持自定义 AppData,即使新版本能够做到这一点。
猜你喜欢
  • 1970-01-01
  • 2012-04-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多