2012-04-11 13 views
6

En Tridion 2011 SP1 estoy intentando implementar un evento que publicará elementos automáticamente siempre que el editor presione Guardar Guardar & Cerrar (pero no Guardar).Sistema de eventos: ¿Cómo saber si el editor hizo clic en Guardar o Guardar y cerrar?

En condiciones normales, esto podría ser manejado en un evento CheckIn, pero debido a que este elemento probablemente estará en flujo de trabajo, no hay evento CheckIn (todavía).

En COM Events teníamos una bandera (doneEditing) para indicarnos si el editor había presionado save & close vs Save. Parece que no puedo encontrar una opción similar en los eventos de TOM.NET.

Como referencia - aquí está el código hasta ahora:

[TcmExtension("Publish to Wip Events")] 
public class PublishToWip : TcmExtension 
{ 
    public PublishToWip() 
    { 
     EventSystem.SubscribeAsync<VersionedItem, SaveEventArgs>(PublishItemToWip, EventPhases.TransactionCommitted); 
    } 
    private void PublishItemToWip(VersionedItem item, SaveEventArgs args, EventPhases phases) 
    { 
     // Magic goes here 
    } 
} 

He mirado en las opciones para SaveEventArgs, pero no he encontrado nada que me proporcionaría esta información. ¿Algun consejo?

Respuesta

5

bien, con un poco de ayuda del equipo de CM me dio la respuesta correcta a esto.

Use CheckInEvent en lugar de guardar. Incluso si el elemento está en flujo de trabajo, aún invocará este evento cuando haga clic en Guardar & Cerrar (y solo si hace clic en Guardar & Cerrar, no cuando hace clic en Guardar).

Algo como esto que me va:

[TcmExtension("Publish to Wip Events")] 
public class PublishToWip : TcmExtension 
{ 
    public PublishToWip() 
    { 
     EventSystem.Subscribe<VersionedItem, CheckInEventArgs> 
      (PublishItemToWip, EventPhases.Processed); 
    } 
    private void PublishItemToWip(VersionedItem item, 
     CheckInEventArgs args, EventPhases phases) 
    { 

     if (!item.LockType.HasFlag(LockType.InWorkflow)) return; 

     if (!item.IsCheckedOut) return; 
     // do something now 
+0

En lugar de la fase procesada, es probable que desee utilizar la fase TransactionCommitted para este evento CheckIn. De esta forma, está seguro de que la acción de guardar y cerrar realmente terminó y no encontró un error en algún lugar de su proceso. Esto también es lo que describí en la matriz de eventos en mi artículo sobre Event System en SDL Tridion World http://sdltridionworld.com/articles/sdltridion2011/sdltridion2011eventsystem.aspx –

+0

Lo probaré en TransactionCommitted. No estoy seguro de que funcione porque el CheckIn nunca sucede en realidad - el artículo está en flujo de trabajo. –

+0

Sí, esa es la única cosa que de hecho no creo que haya considerado cuando escribo la matriz de antigua a nueva. Estaría interesado en saber si la transacción se confirma o no. –

2

Estaba viendo esto en el pasado, pero no pude encontrar una solución adecuada. Al final me rendí.

La idea que tenía era tener una extensión de GUI para interceptar el Guardar y como tal escribir una entrada de AppData para ese artículo diciendo que era Guardar o GuardarCleer. Luego su sistema de eventos leerá el AppData y actuará en consecuencia.

No olvides limpiar el AppData en tu código de evento.

+0

De hecho, parece que hay absolutamente nada diferente en el caso ... Si no hay flujo de trabajo, la bandera CheckInAfterSave probablemente está establecido en verdadero - pero en ese escenario ejecutaría mi código en el evento CheckIn de todos modos ... –

+0

El indicador CheckInAfterSave en ese caso solo se establecería en true si el elemento se desprotegió automáticamente cuando comenzó la edición. Si primero verifica el artículo (por ejemplo, desde el menú contextual) y luego lo abre para editarlo, al cerrar el cuadro de diálogo con Guardar y cerrar, no se registrará el elemento. Retiro explícito -> check in explícito. –

-1

Con el fin de atrapar terminado el tema flujo de trabajo es necesario suscribirse a eventos FinishProcess en el proceso, no en el componente:

EventSystem.SubscribeAsync<Process, FinishProcessEventArgs>(FinishProcessHandler, EventPhases.TransactionCommitted, EventSubscriptionOrder.Late); 

En la instancia de controlador de eventos de proceso contendrá la lista de sujetos con el ítem versionado terminado flujo de trabajo - el que desea publicar:

private static void FinishProcessHandler(Process process, FinishProcessEventArgs e, EventPhases phase) 
{ 
    foreach (var itemInWorkflow in process.Subjects) 
    { 
     //publish 
    } 
} 
+0

Nuno no está buscando un flujo de trabajo terminado, está buscando si el usuario hizo clic en Guardar y cerrar. –

Cuestiones relacionadas