2013-02-13 19 views
6

ho bisogno di ottenere il componente associato ad un'attività al sistema di eventi.Tridion flussi di lavoro - Come ottenere il componente alla attività di Event Handler

cerco di ottenere l'ID componente utilizzando:

public void OnActivityInstanceFinishPost(ActivityInstance activityInstance, string finishMessage, string nextActivity, string dynamicAssignee) 
    { 

     if (activityInstance.ProcessInstance.ProcessDefinition.Title.Equals("Component Process IESE")) 
     { 
      if (activityInstance.ActivityDefinition.Title.Equals("Create or Edit Component")) 
      { 
       WFE workflow = tdse.GetWFE(); 
       try 
       { 
        Component comp = (Component)activityInstance.ProcessInstance.Item; 

        XMLReadFilter filter = new XMLReadFilter(); 
        String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080"); 

        ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 

       } 
       catch (Exception e) 
       { } 

      } 
     } 
    } 

cerchiamo diverse opzioni:

Component comp = (Component)activityInstance.ProcessInstance.Item; 

Ma questa soluzione restituisce un valore null.

poi ho trovato in internet la soluzione successiva:

XMLReadFilter filter = new XMLReadFilter(); 
String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080"); 

ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 
Component comp = hist.Item as Component; 

Ma l'oggetto ProcessHistory è nullo.

Come posso determinare il componente associato al activityInstance?

Grazie.

+0

Quale versione TCM è questo? –

+0

Tridion 2009 SP1 – Guskermitt

risposta

5

Dopo aver esaminato le funzionalità necessarie per Guskermitt, io gli ho mostrato un modo più ordinato di fare quello che deve fare. In breve, EventSystem non è necessario in questo caso.

Il suo obiettivo è quello di inviare una e-mail dopo un componente è stato omologato, l'approccio sarà il seguente:

  1. Aggiungi al flusso di lavoro di una nuova attività automatica.
  2. Creare un nuovo assembly .NET, in questo caso una classe C# per fare ciò che deve fare.
  3. Registrare l'assembly nel GAC.
  4. Aggiungere logica nella nuova attività automatica nel flusso di lavoro per utilizzare l'assembly .NET.

2 #

[ProgId("WfHelper")] 
[ComVisible(true)] 
public class Helper 
{  
public void SendMail(string workItemId) 
{ 
var session = new Session(); 
. 
. 
. 

4 #

dim helper 
set helper = CreateObject("WfHelper") 
call helper.SendMail(CurrentWorkItem.ID) 
set helper = nothing 
FinishActivity “Email has been sent" 
3

ActivityInstance ha una proprietà WorkItems (ereditato da Activity) che contiene un riferimento al vostro Component.

+0

Grazie, Arjen. Non siamo in grado di trovare gli oggetti di lavoro associati all'attività. Abbiamo installato Tridion 2009 SP1. Puoi passare un esempio? – Guskermitt

2

OnActivityInstanceFinishPost significa che la vostra attività è finito. Pertanto non ci sono più elementi di lavoro ad esso associati. Tuttavia, stai ricevendo l'istanza del processo e l'elemento di lavoro associato a tale. Se si ottiene nulla lì, quindi suggerisce il vostro flusso di lavoro è fatto e il componente si è spostata fuori del flusso di lavoro. Guardando il codice, è molto probabile che il vostro ProcessInstance è completata (non sarà nulla, ma non avrà alcun elemento associato con esso).

Ho il sospetto che avete letto questo post http://www.tridiondeveloper.com/autopublishing-on-workflow-finish suggerendo di guardare nella storia. Hai esaminato la cronologia tramite la GUI CM, l'elemento della cronologia è lì? Se non lo è, è per questo che ottieni null. Una volta completato, un processo del flusso di lavoro viene spostato nella cronologia. Quindi controlla due volte di essere effettivamente sull'ultima attività del flusso di lavoro prima di guardare la cronologia.

Osservando il codice, l'errore sembra essere che si sta tentando di ottenere un oggetto di cronologia utilizzando activityInstance.ProcessInstance.ID. GetObject() dovrebbe restituire un elemento, ma il tuo cast su ProcessHistory dovrebbe interrompersi e quindi tu tranquillamente mangi l'eccezione. È necessario passare nella Storia ID, non il ProcessInstance ID come segue:

ProcessHistory hist = (ProcessHistory)tdse.GetObject(processHistoryId, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 
+0

ciao, ho rivisto il mio codice con la tua modifica ma non ha funzionato. – Guskermitt

+0

Hai esaminato la cronologia tramite la GUI CM, è l'elemento della cronologia lì e sei sulla tua ultima attività nel flusso di lavoro? –

+0

Ho rivisto la mia "lista cronologia" nella GUI CM e tutte le attività hanno una tcm terminata con 131076. Non riesco a vedere le attività con tcm finito in 131080. L'attività che sto elaborando su OnActivityInstanceFinishPost è la prima attività che ho terminato. Grazie. – Guskermitt