2013-02-13 9 views
6

Potrzebuję pobrać komponent powiązany z działaniem w systemie zdarzeń.Tridion Workflows - jak uzyskać komponent w działaniu w module obsługi zdarzeń

próbuję uzyskać identyfikator komponentu przy użyciu:

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) 
       { } 

      } 
     } 
    } 

staramy różne opcje:

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

Ale to rozwiązanie zwraca null.

Potem znalazłem w internecie następne rozwiązanie:

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; 

Ale ProcessHistory obiekt jest null.

Jak określić składnik powiązany z activityInstance?

Dziękuję.

+0

Która wersja TCM to jest? –

+0

Tridion 2009 SP1 – Guskermitt

Odpowiedz

5

Po przejrzeniu funkcjonalność potrzebną Guskermitt, ja pokazano mu schludniejszy drogę do tego, co musi zrobić. W skrócie, EventSystem nie jest w tym przypadku potrzebny.

Jego celem jest wysłać e-mail po komponent został zatwierdzony, podejście będzie następujący:

  1. Dodaj do schematu nowej działalności automatyczną.
  2. Utwórz nowe. NET Assembly, w tym przypadku klasy C#, aby zrobić to, co musi zrobić.
  3. Zarejestruj zespół w GAC.
  4. Dodaj logikę w nowej automatycznej czynności w przepływie pracy, aby użyć zespołu .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 ma właściwość WorkItems (odziedziczoną po Activity), która zawiera odniesienie do Twojego Component.

+0

Dziękuję, Arjen. Nie możemy znaleźć elementów pracy powiązanych z działaniem. Zainstalowaliśmy system Tridion 2009 SP1. Czy możesz podać przykład? – Guskermitt

2

OnActivityInstanceFinishPost oznacza, że ​​Twoja aktywność została zakończona. Dlatego nie ma już z nim powiązanego elementu pracy. Otrzymujesz jednak instancję procesu i element pracy powiązany z tym. Jeśli pojawi się tam wartość null, sugeruje to, że proces przepływu pracy jest wykonywany i komponent został przeniesiony poza przepływ pracy. Patrząc na twój kod, jest całkiem prawdopodobne, że twoja wartość ProcessInstance została zakończona (nie będzie miała wartości NULL, ale nie będzie zawierała żadnych elementów z nią związanych).

Podejrzewam, że przeczytałeś ten post http://www.tridiondeveloper.com/autopublishing-on-workflow-finish sugerując, aby zajrzeć do historii. Czy przejrzałeś historię poprzez CM GUI, czy jest tam pozycja historii? Jeśli tak nie jest, to dlatego otrzymujesz zero. Proces przepływu pracy zostanie przeniesiony do historii po zakończeniu. Więc sprawdź jeszcze raz, czy rzeczywiście interesujesz się ostatnią aktywnością przepływu pracy, zanim przejrzysz historię.

Patrząc na swój kod, wydaje się, że błąd polega na tym, że próbujesz uzyskać obiekt historii za pomocą metody activityInstance.ProcessInstance.ID. GetObject() powinien zwrócić element, ale rzutowanie na ProcessHistory powinno zostać złamane, a następnie po cichu zjeść wyjątek. Trzeba przekazać w historii ID, a nie ProcessInstance ID następująco:

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

Witam, przejrzałem kod z twoją zmianą, ale to nie zadziałało. – Guskermitt

+0

Czy zapoznałeś się z historią za pośrednictwem interfejsu graficznego CM, czy jest tam pozycja historii i czy wykonujesz ostatnią czynność w przepływie pracy? –

+0

Przejrzałem moją "listę historii" w CM GUI, a wszystkie zadania kończą się na tcm zakończonym 131076. Nie widzę działań z tcm zakończonych w 131080. Aktywność, którą przetwarzam w OnActivityInstanceFinishPost jest pierwszą Czynnością, którą kończę. Dziękuję Ci. – Guskermitt

Powiązane problemy