安圭拉 - 从弹出窗口更新字段的值?

Nun*_*res 6 tridion

我有一个模态弹出窗口,只要编辑器尝试使用某些值保存组件(在这种情况下是过去的日期字段).

在这个弹出窗口中,我向编辑器显示了几个选项(非常类似于默认的"Open Shared Item"对话框)和一个OK/Cancel按钮组合.在取消时我触发"取消"事件,编辑器返回编辑屏幕,这里一切都很好.在"确定"上,我想更改字段的值以匹配编辑器选择的任何内容,然后保存.

我尝试使用FieldBuilder的方法和Boris在其他主题中提到的示例, 但我无法从弹出对话框中找到该字段.

关于如何从模态弹出窗口中修改项目的xml(也可能是页面)的任何建议?

编辑:getControlForFieldName中使用的代码

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑#2

在Frank的建议之后,以及Jaime&Frank离线的一些帮助,我得到了如下工作:

  1. 从命令扩展中调用弹出窗口(在我的情况下保存并关闭)
  2. command.js指定一个在"submit"上调用的事件处理程序(== OK被按下)
$evt.addEventHandler(p.dialogPopup, "submit", 
    this.getDelegate(this._onPopupSubmit));
Run Code Online (Sandbox Code Playgroud)

在我的弹出窗口中,我将所选项(它是关键字ID)传递给事件处理程序:

this.fireEvent("submit", { id: select.options[select.selectedIndex].value });
Run Code Online (Sandbox Code Playgroud)

现在回到事件处理程序中_onPopupSubmit(e)我刚读取e.data.id,加载此关键字,获取ID和Title等属性,并使用item.setMetadata("具有更新值的新元数据")更新项目的元数据.

简单:)

Fra*_*len 4

您的代码在弹出窗口中运行,因此您对全局变量所做的任何引用都将从弹出窗口中获取。

所以当你得到 fieldBuilder 时:

var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
Run Code Online (Sandbox Code Playgroud)

$display 是对全局变量的引用。因此,这实际上是在弹出窗口(没有)中查找 FieldBuilder。

要获取Component窗口的FieldBuilder,可以从opener中获取:

var fieldBuilder = opener.$display.getView().properties.controls.fieldBuilder;
Run Code Online (Sandbox Code Playgroud)

不过,您可能需要考虑实际将更新后的值传递给回调函数或(自定义)事件,因为这会使您的弹出窗口更少依赖于opener.技巧。