2012-11-23 14 views
5

Mam skonfigurowany przepływ pracy, zaczyna się od stanu "Robocza", jak zwykle. I skonfigurowałem przepływ pracy dla standardowych wartości szablonu. Działa idealnie w edytorze treści. (Gdy utworzę element za pomocą edytora treści, po utworzeniu elementu przepływ pracy zostanie przypisany do elementu, a jego stan stanie się "Robocza".)Sitecore: Przypisywanie przepływu pracy do elementu programowo

Ale kiedy utworzę element programowo pod powyższym szablonem, robi to nie przypisywać przepływu pracy. Co należy zrobić, aby przypisać przepływ pracy? Proszę podzielić się dowolnymi próbkami kodu, jeśli masz.

Dzięki.

Sitecore.Data.Items.TemplateItem template = this.MasterDatabase.GetItem("/sitecore/templates/user defined/sample types"); 
Sitecore.Data.Items.Item parent = this.MasterDatabase.GetItem(parentId); 

Sitecore.Data.Items.Item newItem;     
// Create new item and retrieve it 
newItem = template.CreateItemFrom("sampleName", parent); 

newItem.Editing.BeginEdit(); 

newItem.Name = StringFormatter.CreateItemNameFromID(this.newItem); 
newItem.Fields["Title"].Value = "Sample Title" 

newItem.Editing.EndEdit(); 

Odpowiedz

4

rozwiązał problem ze standardowymi Fields,

newItem.Editing.BeginEdit();      
newItem.Fields["__Workflow"].Value = "{4D1F00EF-CA5D-4F36-A51E-E77E2BAE4A24}"; //Set workflow 
newItem.Fields["__Workflow state"].Value = "{7F39DF46-B4B9-4D08-A0D4-32DE6FD643D1}"; //Set workflow state to Unposted. 
newClassified.Editing.EndEdit(); 
+0

Patrzyłem wszędzie i to wydaje się być najlepszą odpowiedzią, zastanawiam się, dlaczego nie dzieje się to automatycznie. –

+0

Nie należy używać tej metody, aby ustawić oznaczone na sztywno Guids. Użyj odpowiedzi jRobbins, aby ustawić ją poprawnie. –

+2

Dla naszej szczególnej potrzeby, trudne identyfikatory były dla nas w porządku. Należy zwrócić uwagę na to, że można używać 'Sitecore.FieldIDs.Workflow' i' Sitecore.FieldIDs.WorkflowState' zamiast '__Workflow [...]'. Na przykład: 'itemVersion.Fields [Sitecore.FieldIDs.WorkflowState] .Value = approvedState.ToString();'. –

11

Nie użyłbym odpowiedź Dhanuka777 jako że nie wykorzystuje Workflow stanowy Polecenia Sitecore i użyteczne funkcje, które mu towarzyszy na przykład generowanie wiadomości e-mail Wymaga także twardych kodów Guids.

Korzyści z poniższym kodzie:

  • Wykorzystać State Komendy Sitecore i miła funkcjonalność mają np generowanie wiadomości e-mail w celu ostrzegania użytkowników itp
  • Nie przechowywać GUID państw, a polecenia wewnątrz roztworu
  • niezależny od Sitecore w kontekście
  • Streszczenie dzięki czemu może być stosowany do wszystkich Workflow w Sitecore.
public bool UpdateWorkflow(WorkflowState newWorkflowState, Item item) 
    { 
     Assert.ArgumentNotNull(newWorkflowState, "The new WorkflowState can not be null"); 
     Assert.ArgumentNotNull(item, "Item can not be null"); 

     bool successful = false; 

     WorkflowState currentWorkflowState = GetWorkflowStateForItem(item); 

     if (currentWorkflowState != newWorkflowState) 
     { 
      IWorkflow workflow = GetWorkflowOfItem(item); 

      if (workflow != null) 
      { 
       List<WorkflowCommand> applicableWorkflowCommands = workflow.GetCommands(currentWorkflowState.StateID).ToList(); 

       foreach (var applicableWorkflowCommand in applicableWorkflowCommands) 
       { 
        Item commandItem = _database.GetItem(applicableWorkflowCommand.CommandID); 

        string nextStateId = commandItem["Next state"]; 

        if (nextStateId == newWorkflowState.StateID) 
        { 
         WorkflowResult workflowResult = workflow.Execute(applicableWorkflowCommand.CommandID, item, "", false); 
         successful = workflowResult.Succeeded; 
         break; 
        } 
       } 
      } 
     } 
     else 
     { 
      successful = true; 
     } 

     return successful; 
    } 

    public WorkflowState GetWorkflowStateForItem(Item item) 
    { 
     var workflow = GetWorkflowOfItem(item); 
     return workflow != null ? workflow.GetState(item) : null; 
    } 

    public IWorkflow GetWorkflowOfItem(Item item) 
    { 
     return _database.WorkflowProvider.GetWorkflow(item); 
    } 

    private Database _database 
    { 
     get 
     { 
      return Sitecore.Data.Database.GetDatabase("master"); 
     } 
    } 
+3

Nie sądzę, że ten zbyt skomplikowany kod z 4 (!) Zagnieżdżonymi, jeśli instrukcje powinny być "właściwym" sposobem na zrobienie czegoś.co więcej nie wydaje się odpowiedzieć na pytanie: jak przypisać przepływ pracy i losowy stan przepływu pracy do elementu. Zamiast tego zasadniczo przesuwa element do następnego stanu przepływu pracy, jeśli następny stan stanie się pożądanym stanem. – eloycm

3

Spojrzałem na całym dla dobrej odpowiedzi na to. Tworzyłem nowy element i chciałem rozpocząć jego przepływ pracy. Odpowiedź jRobbinsa nie działała dla mnie, ponieważ zgłasza wyjątek, jeśli bieżący stan przepływu pracy elementu jest zerowy i nie zapewnia on dobrego sposobu ustawienia początkowego stanu przepływu pracy.

Następujące pracował dla mnie:

var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId); 
workflow.Start(item); 

To ustawia przepływ pracy z moim nowym sprzęcie oraz ustawia swój stan przepływu pracy do stanu początkowego.

1

Po upewnieniu się, że mogę ustawić domyślny przepływ pracy na standardowych wartościach, następującej kombinacji, dzięki plakatów z powyższym pracował idealnie:

var workflowId = item.Fields["__Default workflow"].Value; 
var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId); 
workflow.Start(item); 
Powiązane problemy