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

时间:2012-05-05 15:42:36

标签: tridion

我正在编写“保存”命令的扩展,基本上我想验证某些字段并提供一个弹出窗口,允许编辑器根据当前日期选择给定的关键字或其他值,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字段的当前值,所以我希望有可能为自定义字段实现此目的。

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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。