2012-10-09 4 views
6

Ich habe eine GUI-Erweiterung für SDL Tridion 2011 SP1 geschrieben. Die GUI besteht aus einer zusätzlichen Multifunktionsleisten-Schaltfläche und einem Ereignishandler, der beim Speichern einer Komponente ausgelöst wird.Wie erhalten Sie einen Benutzernamen und eine Beschreibung von ihrer ID in der SDL Tridion Anguilla-Framework

Mein Ereignishandler registriert ist wie folgt:

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

und der Event-Handler sieht wie folgt aus:

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); 

}; 

Dies funktioniert gut, außer dass die Variable commentername ist immer undefiniert. Gibt es einen besseren Ansatz, um den Namen und die Beschreibung eines Benutzers zu erhalten?

Außerdem weiß jemand, ob der Wert, der von eventitem.source.getCreatorId() zurückgegeben wird, tatsächlich der Überprüfer oder tatsächlich die Person ist, die den Artikel erstellt hat?

Vielen Dank im Voraus

+0

Kleine Bemerkung. Sie sollten command.invoke aufrufen (Auswahl); statt command._execute (Auswahl); Andernfalls Erweiterungen für SaveClose Befehl wird nicht angewendet und Sie könnten möglicherweise js Fehler erhalten. –

+0

Der Aufruf von getCreatorId() für ein Element gibt tatsächlich die Person zurück, die das Element erstellt hat, und nicht die letzte Person, die es geändert hat. –

Antwort

8

ich diesen Ansatz in Anguilla normalerweise folgen: (? @puf)

  1. Verwendung $models.getItem(item Id) Objekte zu laden, von jemandem gehört, dass diese zwischengespeichert wird.
  2. überprüfen, ob die object.isLoaded() und wenn ja,
  3. meine Event-Handler ausgeführt werden, wenn das Objekt nicht geladen wird, dann auf die Veranstaltung wie diese

Es kommt alles auf etwas hören:

Sie würden dann den Webservice Ihres Modells vom Event-Handler aus aufrufen, da Sie sicher sind, dass das Objekt bis dahin geladen wird.

In Ihrem aktuellen Code versuchen Sie wahrscheinlich, die Beschreibung zu lesen, bevor das Objekt geladen wird, daher das undefined. Ich neige dazu, Variablen zu setzen, die ich über mehrere Funktionen im this.properties var (p in meinem Beispiel) benötigt, dann so am Anfang jeder Funktion etwas tun:

var p = this.properties; 
var whatever = p.whatever; 
+0

Hört sich vertraut Nuno ... –

+0

In der Tat. Und für einige Eigenschaften, wie Titel, möchten Sie stattdessen die Methode getStaticXXXXX aufrufen (und prüfen Sie isStaticLoaded/staticLoad aufrufen). –

1

Als Nuno sagte, lesen Sie wahrscheinlich ein Eigenschaft, die nicht geladen wurde.

Sie sollten jedoch den vom Client gesendeten Namen nicht akzeptieren. Sie sollten stattdessen die ID und den Namen des aktuellen Benutzers in Ihrem Webdienst erhalten. Das gleiche gilt für einige der anderen Argumente wie Datum/Uhrzeit.

Grundsätzlich sollte Ihr Webdienst den eingehenden Daten niemals vertrauen. Alles, was es allein herausfinden kann, sollte nicht einmal ein Argument für die Methode sein, und alles, was es braucht, sollte als schädlicher Inhalt betrachtet und vor der Verwendung bereinigt werden.

Verwandte Themen