2012-10-09 11 views
6

He escrito una extensión GUI para SDL Tridion 2011 SP1. La GUI consiste en un botón de cinta adicional y controlador de eventos que se activa cuando se guarda un componente.¿Cómo se obtiene el nombre y la descripción de un usuario de su ID en el marco de SDL Tridion Anguila

Mi controlador de eventos se ha registrado la siguiente manera:

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

y el controlador de eventos es el siguiente:

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

}; 

esto está funcionando bien, excepto que la variable commentername siempre es indefinido. ¿Hay un mejor enfoque para obtener el nombre y la descripción de un usuario?

Además, ¿alguien sabe si el valor devuelto por eventitem.source.getCreatorId() es en realidad el Revisor o en realidad la persona que creó el elemento?

Gracias de antemano

+0

Pequeña observación. Debe llamar al command.invoke (selección); en lugar de command._execute (selection); De lo contrario, las extensiones para el comando SaveClose no se aplicarán y podría obtener errores de js. –

+0

Llamar a getCreatorId() en un elemento de hecho devuelve la persona que creó el elemento y no la última persona para modificarlo. –

Respuesta

8

que normalmente siguen este enfoque en Anguila: (? @puf)

  1. uso $models.getItem(item Id) para cargar objetos, oído de alguien que esta se almacena en caché.
  2. de verificación si la object.isLoaded() y si es así, ejecute mi controlador de eventos
  3. si el objeto no está cargado, a continuación, escuchar el evento

Todo se reduce a algo como esto:

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

Llamarás al servicio web de tu modelo desde el controlador de eventos, ya que estás seguro de que el objeto estará cargado para entonces.

En su código actual probablemente esté tratando de leer la descripción antes de que se cargue el objeto, de ahí lo indefinido. Tiendo a colocar variables que voy a necesitar a través de múltiples funciones en el this.properties var (p en mi ejemplo) y luego hacer algo como esto al comienzo de cada función:

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

Suena familiar Nuno ... –

+0

De hecho. Y para algunas propiedades, como Title, querrá llamar al método getStaticXXXXX en su lugar (y verificar isStaticLoaded/call staticLoad). –

1

Como dijo Nuno, es probable que esté leyendo una propiedad que no ha sido cargada

Sin embargo, no debe aceptar el nombre enviado por el cliente de todos modos. En su lugar, debe obtener la identificación y el nombre del usuario actual en su servicio web. Lo mismo ocurre con algunos de los otros argumentos como la fecha/hora.

Básicamente, su servicio web nunca debe confiar en los datos entrantes. Entonces, cualquier cosa que pueda resolver por sí sola no debería ser un argumento para el método, y cualquier cosa que necesite debe considerarse contenido malicioso y desinfectarse antes de usarlo.

Cuestiones relacionadas