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