6

SDL Tridion2011SP1のGUI拡張機能を作成しました。GUIは、追加のリボンボタンと、コンポーネントが保存されたときにトリガーされるイベントハンドラーで構成されます。

私のイベントハンドラーは次のように登録されています。

PowerTools.Commands.ItemCommenting.prototype._execute = function (selection) {
    var item = $display.getItem();
    $evt.addEventHandler(item, "save", this.getDelegate(this._onItemSaved));
    $cme.getCommand("SaveClose")._execute(selection);
};

イベントハンドラは次のようになります。

PowerTools.Commands.ItemCommenting.prototype._onItemSaved = function (eventitem) {

    var comment = prompt("Please enter a comment", "");

    $messages.registerNotification("Saving user comments...");

    var commentitemid = eventitem.source.getId();
    var commenterid = eventitem.source.getCreatorId();
    var commenter = $tcm.getItem(commenterid);
    var commentername = commenter.getDescription();
    var commentdate = eventitem.source.getLastModifiedDate();
    var commentversion = eventitem.source.getVersion();

    //Call the service to update 
    PowerTools.Model.Services.AppDataServices.Append("ext:ItemCommenting", commentitemid, "<comment><user>" + commenterid + "</user><message>" + comment + "</message><datetime>" + commentdate + "</datetime><version>" + commentversion + "</version></comment>", null, null, null, false);

};

commentername変数が常に未定義であることを除いて、これは正常に機能しています。ユーザーの名前と説明を取得するためのより良いアプローチはありますか?

さらに、返される値eventitem.source.getCreatorId()が実際に改訂者なのか、実際にアイテムを作成した人なのかを誰かが知っていますか?

4

2 に答える 2

8

私は通常、アンギラでこのアプローチに従います。

  1. $models.getItem(item Id)これがキャッシュされていることを誰か(@puf?)から聞いて、オブジェクトをロードするために使用します。
  2. object.isLoaded()かどうかを確認し、そうであれば、イベントハンドラーを実行します
  3. オブジェクトがロードされていない場合は、イベントをリッスンします

それはすべて次のようなものになります:

p.keyword = $models.getItem(p.keywordUri);
if (p.keyword.isLoaded()) {
    this._onReleaseKeywordLoaded();
} else {
    $evt.addEventHandler(p.keyword, "load", this.getDelegate(this._onReleaseKeywordLoaded));
    p.keyword.load();
}

次に、イベントハンドラーからモデルのWebサービスを呼び出します。これは、それまでにオブジェクトが読み込まれることが確実だからです。

現在のコードでは、オブジェクトがロードされる前に説明を読み込もうとしている可能性があるため、未定義です。this.properties私は、 var内の複数の関数(p私の例では)に必要な変数を配置し、すべての関数の先頭で次のようなことを行う傾向があります。

var p = this.properties;
var whatever = p.whatever;
于 2012-10-09T18:13:32.227 に答える
1

Nunoが言ったように、あなたはおそらくロードされていないプロパティを読んでいます。

ただし、とにかくクライアントから送信された名前を受け入れるべきではありません。代わりに、Webサービスで現在のユーザーのIDと名前を取得する必要があります。日付/時刻のような他のいくつかの引数についても同じことが言えます。

基本的に、Webサービスは受信データを決して信頼してはなりません。したがって、それ自体で理解できるものはすべて、メソッドの引数であってはなりません。また、必要なものはすべて、悪意のあるコンテンツと見なされ、使用する前にサニタイズされる必要があります。

于 2012-10-10T10:05:45.650 に答える