4

リボン バーの新しいボタンをクリックすると開くポップアップを含む 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);
        }
    }
}

ポップアップ 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次の追加情報とともにこのエラーも表示されます。

anonymous(object{..})
WebRequest.completed(object{..})
Net.loadFile$onComplete(object{..})
Net.loadFile$onOperationCompleted()
Xml.loadXmlDocuments$onSuccess(array 1 )
Xml.loadXmlDocument$ onSuccess(array 1 )
Dropdown.setup$filesLoaded(object{..})
setupDone()
anonymous(関数: DisplayController$start()) DisplayController.start
()
anonymous()
anonymous(undefined, "Tridion.Controls.Dropdown")
Tridion.Assert$raiseError("要素の一意の ID を取得できません。")

その記録された情報から、問題はドロップダウンにあるようです。ビューを登録するJSの行をコメントアウトすると、エラーは発生しませんが、ログメッセージも表示されないため、これは必須の呼び出しであると思われます。なぜこれが起こっているのか、誰かが光を当てることができますか? 私はサンプル PowerTool コードを参照として使用してきましたが、そこにあるものを複製したと思います...

アップデート

コードをステップ実行しようとしました - 適切な行を見つけ、そこにブレークポイントを配置しました。その後、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、エラーが発生します。

4

1 に答える 1

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 をリボン ツールバー ボタンに関連付けられた他のリソースとグループ化していました。ポップアップ固有のリソースを独自のリソース グループに配置することで、エラーを停止し、制御を正常に取得することができました。

于 2012-10-26T08:52:20.883 に答える