我正在编写“保存”命令的扩展,基本上我想验证某些字段并提供一个弹出窗口,允许编辑器根据当前日期,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字段的当前值,所以我希望有一种方法可以实现自定义字段。
我不知道这是否是正确的方法,但您可以在项目上触发“collectdata”事件 - 这将使用目前在编辑屏幕上输入的内容更新数据。
var item = $display.getView().getItem();
item.fireEvent("collectdata");
$log.message(item.getXml());
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。
我不知道这是否是正确的方法,但您可以在项目上触发“collectdata”事件 - 这将使用目前在编辑屏幕上输入的内容更新数据。
var item = $display.getView().getItem();
item.fireEvent("collectdata");
$log.message(item.getXml());
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。