2012-10-09 8 views
6

Ho scritto un'estensione della GUI per SDL Tridion 2011 SP1. La GUI è costituita da un pulsante a nastro e un gestore di eventi aggiuntivi che vengono attivati ​​quando viene salvato un componente.Come si ottiene il nome e la descrizione di un utente dall'ID nella struttura SDL Tridion Anguilla

mio gestore di eventi è registrato come segue:

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

e il gestore di eventi è simile al seguente:

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

}; 

Questo funziona bene, tranne che la variabile commentername è sempre indefinito. C'è un approccio migliore per ottenere il nome e la descrizione di un utente?

Inoltre, qualcuno sa se il valore restituito da eventitem.source.getCreatorId() è in realtà il Revisore o in realtà la persona che ha creato l'articolo?

Grazie in anticipo

+0

Piccola osservazione. Dovresti chiamare command.invoke (selection); piuttosto che command._execute (selezione); Altrimenti le estensioni per il comando SaveClose non verranno applicate e si potrebbero potenzialmente ottenere errori js. –

+0

Chiamare getCreatorId() su un elemento restituisce effettivamente la persona che ha creato l'elemento e non l'ultima persona a modificarlo. –

risposta

8

normalmente seguono questo approccio ad Anguilla: (? @puf)

  1. uso $models.getItem(item Id) per caricare oggetti, sentito da qualcuno che questo è memorizzato nella cache.
  2. di controllo se l'object.isLoaded() e in caso affermativo, eseguire il mio gestore di eventi
  3. se l'oggetto non viene caricato, quindi ascoltare l'evento

Tutto si riduce a qualcosa di simile:

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

Chiamate il servizio web del modello dal gestore eventi, poiché siete sicuri che l'oggetto verrà caricato in quel momento.

Nel codice corrente probabilmente stai cercando di leggere la descrizione prima che l'oggetto sia caricato, quindi non definito. Io tendo a mettere le variabili che avranno bisogno su più funzioni nel this.properties var (p nel mio esempio) poi fare qualcosa di simile all'inizio di ogni funzione:

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

Suona familiare Nuno ... –

+0

Infatti. E per alcune proprietà, come Title, dovrai chiamare il metodo getStaticXXXXX (e controllare isStaticLoaded/call staticLoad). –

1

Come ha detto Nuno, si sono probabilmente leggendo un proprietà che non è stata caricata.

Tuttavia, non si deve accettare il nome inviato dal client. Dovresti invece ottenere l'ID e il nome dell'utente corrente nel tuo servizio web. Lo stesso vale per alcuni degli altri argomenti come la data/ora.

Fondamentalmente, il tuo servizio web non dovrebbe mai fidarsi dei dati in arrivo. Quindi tutto ciò che può capire da solo non dovrebbe nemmeno essere un argomento per il metodo, e tutto ciò di cui ha bisogno deve essere considerato contenuto dannoso e disinfettato prima di usarlo.