使用GUI扩展弹出窗口无法获取元素错误的唯一ID

时间:2012-10-25 21:28:49

标签: tridion tridion-2011

我正在构建一个GUI扩展,其中包含一个弹出窗口,该弹出窗口在单击功能区栏中的新按钮时打开。弹出窗口包括一个下拉列表,该下拉列表使用核心服务从系统中收集的一些信息动态填充。至少这是个主意。我能够显示按钮,然后打开弹出窗口,但是一旦我从弹出的javascript开始,我得到一个错误Unable to get unique id for element并且CME没有完成加载。这是我到目前为止所做的:

弹出ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SwitchUserPopup.aspx.cs" Inherits="SwitchUser.Popups.SwitchUserPopup" %>
<%@ Import Namespace="Tridion.Web.UI.Core" %>
<%@ Import Namespace="Tridion.Web.UI" %>
<%@ Import Namespace="System.Web" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://www.sdltridion.com/web/ui/controls">
<head runat="server">
    <title>Select User</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h1>Select User</h1>
            <c:dropdown id="SwitchUserDropdown" runat="server" nullable="false"/>
        </div>
    </form>
</body>
</html>

弹出ASPX代码

namespace SwitchUser.Popups
{
    [ControlResourcesDependency(new [] { typeof(Popup),
                                         typeof(Tridion.Web.UI.Controls.Button),
                                         typeof(Stack),
                                         typeof(Dropdown),
                                         typeof(List) })]
    [ControlResources("SwitchUser.Resources")]
    public partial class SwitchUserPopup : TridionPage
    {
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            TridionManager tm = new TridionManager();

            tm.Editor = "SwitchUser";
            System.Web.UI.HtmlControls.HtmlGenericControl dep =
                    new System.Web.UI.HtmlControls.HtmlGenericControl("dependency");
            dep.InnerText = "Tridion.Web.UI.Editors.CME";
            tm.dependencies.Add(dep);

            System.Web.UI.HtmlControls.HtmlGenericControl dep2 =
                    new System.Web.UI.HtmlControls.HtmlGenericControl("dependency");
            dep2.InnerText = "Tridion.Web.UI.Editors.CME.commands";
            tm.dependencies.Add(dep2);

            //Add them to the Head section
            this.Header.Controls.Add(tm); //At(0, tm);
        }
    }
}

Popup JS

Type.registerNamespace("SwitchUser.Popups");

SwitchUser.Popups.SwitchUser = function (element) {
    Type.enableInterface(this, "SwitchUser.Popups.SwitchUser");
    this.addInterface("Tridion.Cme.View");
};

SwitchUser.Popups.SwitchUser.prototype.initialize = function () {
    $log.message("Initializing Switch User popup...");
    this.callBase("Tridion.Cme.View", "initialize");

    var p = this.properties;
    var c = p.controls;

    c.UserDropdown = $controls.getControl($("#SwitchUserDropdown"), "Tridion.Controls.Dropdown");
};

$display.registerView(SwitchUser.Popups.SwitchUser);

System.config中正确配置了扩展名 - 我可以在javascript控制台中看到日志消息。但是,我还看到此Unable to get unique id for element错误,其中包含以下附加信息:

  

匿名(对象{..})
  WebRequest.completed(对象{..})
  Net.loadFile $的onComplete(对象{..})
  Net.loadFile $ onOperationCompleted()
  Xml.loadXmlDocuments $的onSuccess(数组1
  Xml.loadXmlDocument $的onSuccess(数组1
  Dropdown.setup $ filesLoaded(对象{..})
  setupDone()
  匿名(函数:DisplayController $ start())
  DisplayController.start()
  匿名()
  匿名(undefined,“Tridion.Controls.Dropdown”)
  Tridion.Assert $ raiseError(“无法获取元素的唯一ID。”)

从记录的信息来看,问题似乎是下拉列表。如果我注释掉我注册视图的JS中的行,那么我没有得到错误,但我也没有得到日志消息所以我怀疑这是一个强制调用。任何人都可以解释为什么会发生这种情况吗?我一直在使用Example PowerTool code作为参考,我相信我已经复制了那里的内容......

更新

我试图逐步完成代码 - 我找到了一条合适的线并在那里放置了一个断点。然后我重新加载CME,突然我的断点位于与我的代码无关的行上,我找不到任何与我的代码相关的内容。但是,根据控制台,它仍在执行中。

所以,我将日志消息放入初始化方法中,如下所示:

SwitchUser.Popups.SwitchUser.prototype.initialize = function () {
    $log.message("Initializing Switch User popup...");
    this.callBase("Tridion.Cme.View", "initialize");
    $log.message("Tridion.Cme.View callBase done");
    var p = this.properties;
    var c = p.controls;
    $log.message("Set properties and controls");
    c.UserDropdown = $controls.getControl($("#SwitchUserDropdown"), "Tridion.Controls.Dropdown");
    $log.message("Got UserDropdown control");
};

我可以在控制台中看到它记录到Set properties and controls然后我收到了错误。

1 个答案:

答案 0 :(得分:3)

我在getControl方法中放了一个断点,并且能够确定我收到错误的原因。 $("#SwitchUserDropdown")找不到任何内容,所以当下面的代码运行时,它会抛出错误:

var id = Tridion.Utils.Dom.getUniqueID(element);
if (id)
{
    var control = instances[id];
    if (!control)
    {
        control = instances[id] = new ctor(element, settings);
        if (Tridion.Type.isFunction(control.initialize))
        {
            control.initialize();
        }
    }
}
else
{
    Tridion.Utils.Assert.raiseError("Unable to get unique id for element.");
}
return control; 

现在似乎很明显,我知道为什么代码在错误的时间运行。我认为它不应该在CME加载时运行,而是仅在弹出窗口打开时运行。这导致我在编辑器配置文件中查看资源的配置。我以前将弹出窗口的JS与其他与功能区工具栏按钮关联的资源组合在一起。通过将弹出特定资源放在他们自己的资源组中,我能够停止错误并成功获得控件。