2012-06-27 9 views
5

Estoy creando una extensión GUI utilizando SDL Tridion 2011 SP1. Quiero recopilar información del usuario cuando un editor toca un nuevo botón "Guardar y comentar". Este botón recogerá la entrada de algunos usuarios y luego activará los comandos guardados del CME.¿Es posible pasar valores desde una extensión SDL Tridion 2011 GUI a SaveEventArgs en un controlador de eventos

Luego, usando un controlador de eventos me gustaría capturar esa entrada de usuario y hacer un procesamiento personalizado con ella. Mi sencilla controlador de eventos es la siguiente:

using System; 
using System.Text; 
using Tridion.ContentManager.Extensibility.Events; 
using Tridion.ContentManager.Extensibility; 
using Tridion.ContentManager.ContentManagement; 
using System.IO; 

namespace UrbanCherry.Net.SDLTridion.EventHandlers 
{ 
    [TcmExtension("VersionCommenting")] 
    public class VersionCommenting : TcmExtension 
    { 
    public VersionCommenting() 
    { 
     Subscribe(); 
    } 

    public void Subscribe() 
    { 
     EventSystem.Subscribe<Component, SaveEventArgs>(AddCommentToItemVersion, 
                 EventPhases.Initiated); 
    } 

    private void AddCommentToItemVersion(Component source, SaveEventArgs args, 
             EventPhases phase) 
    { 
     //Do some work here 
    } 
    } 
} 

¿Es posible que mi extensión GUI para añadir alguna manera a los valores SaveEventArgs, ya sea usando el o algún otro método args.ContextVariables?

+0

No aconsejaría mezclar el estado entre eventos, ¿qué ocurre si varias personas hacen clic en el botón Guardar y comentar (casi) simultáneamente, cómo va a hacer un seguimiento de los mismos? –

+0

¿Tiene la intención de guardar el comentario en un campo de metadatos? –

+0

Realmente espero guardarlo en el campo de comentarios que se usó para deshacer/rebobinar, pero ese es el próximo desafío –

Respuesta

1

No hay forma directa de pasar parámetros de una extensión de GUI a un controlador de eventos. Entonces, la única forma en que me puedo imaginar es utilizando la información adicional en una estructura de datos existente. Los datos de la aplicación (como se sugerirá) son una de esas estructuras de datos, pero también puede considerar utilizando la información en el Componente XML.

Dado que tiene una extensión de GUI y un manejador de eventos, básicamente puede hacer cualquier cosa que desee en la primera, siempre y cuando "deshaga" esos cambios en la última.

Así que una manera que puedo imaginar:

  1. en su extensión GUI, inyectar un elemento personalizado con el comentario en el XML de componentes
  2. en el controlador de eventos, extraer el comentario y quitar el elemento personalizado

No he probado este enfoque, pero he hecho algo similar con los Extensores de datos personalizados: cambie el comando o los datos enviados al servidor y luego en el servidor detectar ese cambio y actuar sobre él (antes de pasarlo a TCM).

Por supuesto, debe asegurarse de que su controlador de eventos en este caso elimine el comentario del XML del componente en una de las fases anteriores.

Si desea hacerlo de forma segura, debe quitar el comentario del XML de componente en una fase de evento muy temprana y solo guardar el comentario en la fase de precomisión/postcompromiso. Entre esas fases, tendría que guardar el comentario en alguna parte, pero al menos los datos ya habían pasado de la GUI al servidor.

+0

¿Quiere decir agregar el comentario como campo + valor personalizado al contenido XML, sin definir el campo en el esquema? –

+0

Eso sería de una manera, aunque probablemente tendrías que aumentar el FieldBuilder para asegurarte de que el "campo falso" no invalida el contenido. Alternativamente, puede rellenarlo en las otras partes del Component XML o incluso adjuntarlo al Título si lo desea. Recuerda: ya que estás escribiendo ambos lados de la ecuación aquí, tienes el control total de lo que sucede. –

1

Solo una idea, y no tengo idea de cómo hacerlo en la extensión de GUI, pero ¿ha pensado en establecer el comentario como datos de aplicación en el elemento cuando hace clic en el botón?

+0

Sí. Pensándolo bien, lo considero un último recurso, ya que no puede ser contenido portado, etc. ya es un campo de "Comentario del sistema" utilizado para retroceder, avanzar y actualizar, etc., así que realmente quiero aprovecharlo si puedo. Tal vez deba hacer una solicitud de mejora para agregar a la API con algo como Component.Save (Boolean FinishEditing, String Comment) –

+0

Bueno, tal vez podrías utilizar los datos de la aplicación como almacenamiento temporal para pasar los datos de la GUI al sistema de eventos, eliminándolo de la aplicación de datos cuando lo haya puesto en el comentario del sistema – Will

+0

Sí, creo que eso es lo que tendré que hacer.Esperaba que hubiera un enfoque más elegante –

Cuestiones relacionadas