【问题标题】:Get a field's _current_ value in Component Editor? (Tridion 2011 SP1)在组件编辑器中获取字段的 _current_ 值? (Tridion 2011 SP1)
【发布时间】:2026-01-24 01:15:02
【问题描述】:

我正在编写“保存”命令的扩展,基本上我想验证某些字段并显示一个弹出窗口,允许编辑器根据当前日期、发布号和其他一些值选择给定的关键字或其他值属性。

我以为我进展顺利,直到我最终发现 $display.getItem() 正在返回存储在 CM 中的项目,而不是编辑器可能已更改的当前值。

是否有内置方法可以让我获取此信息?还是我需要解析 DOM 才能弄清楚?

这是我目前拥有的代码

var item = $display.getItem();
if (item.getItemType() == "tcm:16") {
   if (item.getSchema().getStaticTitle() == "Test Schema") {
      var content = $xml.getNewXmlDocument(item.getContent());
      var fieldXml = $xml.getInnerText(content, "//*[local-name()='NewField']");
      alert(fieldXml);
   }
}

它正在工作 - 我得到“NewField”的值 - 但这是项目在加载时 具有 的值,而不是 当前 值。 p>

有趣的是,item.getTitle() 显示了 Title 字段的当前值,所以我希望也有办法为自定义字段实现这一点。

【问题讨论】:

    标签: tridion


    【解决方案1】:

    我不知道这是否是正确的方法,但您可以在项目上触发“collectdata”事件 - 这将使用目前在编辑屏幕上输入的内容更新它的数据。

    var item = $display.getView().getItem();
    item.fireEvent("collectdata");
    $log.message(item.getXml());
    

    【讨论】:

      【解决方案2】:

      Peter 的方法将值从 HTML 中的控件复制到项目的 XML 中。这是一个很好的方法如果您不介意更新项目,因为它允许您简单地操作 XML 而不是 HTML。

      但如果您还不想更新项目,您别无选择,只能在 HTML 中找到正确的控件并从那里读取值。

      我为它写了这个小辅助函数:

      function getControlForFieldName(name)
      {
          var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
          var fieldsContainer = fieldBuilder.properties.input;
          var fieldsNode = fieldsContainer.getElement();
          var fieldContainer = $dom.getFirstElementChild(fieldsNode);
          while (fieldContainer)
          {
              var labelNode = $dom.getFirstElementChild(fieldContainer);
              var fieldNode = $dom.getNextElementSibling(labelNode);
              var control = fieldNode.control;
              if (control.getFieldName() == name)
              {
                  return control;
              }
              fieldContainer = $dom.getNextElementSibling(fieldContainer);
          }
      }
      

      使用此函数,您可以简单地查找控件以查找给定名称的字段。当您拥有控件时,您可以轻松地从中获取值。

      var fieldControl = getControlForFieldName('Body');
      if (fieldControl)
      {
          var values = fieldControl.getValues();
          // values is an array, since it caters for multi-value fields
          // if this is a single-value field, get the value from values[0]
      }
      

      请注意,我的方法比 Peter 的方法需要更多的代码,并且涉及到相当多的非公共 API。

      【讨论】:

      • 我注意到 FieldBuilder 在 XM (UI) 中似乎不可用。是否有任何类似/如此有用的可用 OOTB?
      • FieldBuilder 对象构建用于在弹出窗口中编辑组件的表单。由于新的 XPM UI 没有这样的表单,而是允许您编辑常规网站中的内容,因此 FieldBuilder 在这种情况下没有意义。您可以从$display.getView()._getSelectedFieldData()获取有关所选字段的信息。
      最近更新 更多