问题 在组件编辑器中获取字段的_current_值? (Tridion 2011 SP1)


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

在我终于明白这一点之前,我以为自己的进步很快 $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”的值 - 但这是该项的值  什么时候加载,而不是 当前 值。

有趣的是, item.getTitle() 显示Title字段的当前值,所以我希望有一种方法可以实现自定义字段。


11756
2018-05-05 15:42


起源



答案:


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

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

9
2018-05-07 09:00





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。


3
2018-05-07 14:19



我注意到FieldBuilder似乎在XM(UI)中不可用。有没有类似/有用的OOTB? - Dylan .. Mark Saunders
FieldBuilder对象构建用于在弹出窗口中编辑Component的表单。由于新的XPM UI没有这样的表单,而是允许您编辑常规网站中的内容,因此FieldBuilder在此上下文中没有意义。您可以从中获取有关所选字段的信息 $display.getView()._getSelectedFieldData()。 - Frank van Puffelen


答案:


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

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

9
2018-05-07 09:00





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。


3
2018-05-07 14:19



我注意到FieldBuilder似乎在XM(UI)中不可用。有没有类似/有用的OOTB? - Dylan .. Mark Saunders
FieldBuilder对象构建用于在弹出窗口中编辑Component的表单。由于新的XPM UI没有这样的表单,而是允许您编辑常规网站中的内容,因此FieldBuilder在此上下文中没有意义。您可以从中获取有关所选字段的信息 $display.getView()._getSelectedFieldData()。 - Frank van Puffelen