2012-11-23 10 views
5

Ho configurato un flusso di lavoro, inizia con lo stato "Bozza" come al solito. E ho configurato il flusso di lavoro per i valori standard del modello. Funziona perfettamente con l'editor di contenuti. (Quando creo un elemento utilizzando l'editor di contenuti, una volta creato l'elemento, Flusso di lavoro viene assegnato all'elemento e lo stato diventa "Bozza".)Sitecore: Assegna programmaticamente un flusso di lavoro a un elemento

Ma quando creo un elemento a livello di codice con il modello sopra riportato non assegnare il flusso di lavoro. Cosa devo fare per assegnare il flusso di lavoro? Si prega di condividere eventuali esempi di codice se si dispone.

Grazie.

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(); 

risposta

4

risolto il problema con i campi standard,

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

ho guardato tutto il luogo e questo sembra essere il risposta migliore, mi chiedo perché non accada più automaticamente. –

+0

Non utilizzare in questo modo per impostare i Guidi codificati in modo fisso. Usa la risposta di JRobbins per impostarlo correttamente. –

+2

Per la nostra particolare esigenza, gli ID codificati erano soddisfacenti per noi. Una cosa da notare è che puoi usare 'Sitecore.FieldIDs.Workflow' e' Sitecore.FieldIDs.WorkflowState' invece di '__Workflow [...]'. Ad esempio: 'itemVersion.Fields [Sitecore.FieldIDs.WorkflowState] .Value = approvedState.ToString();'. –

11

Non vorrei usare la risposta di Dhanuka777 in quanto non utilizza Sitecore Workflow Stato comandi e le funzionalità utili che viene con esso per esempio generazione di email. Richiede anche Guidi hardcoding.

Vantaggi del codice qui sotto:

  • Utilizzare Sitecore Stato Comandi e la bella funzionalità che hanno per esempio la generazione di messaggi di posta elettronica per avvisare gli utenti, ecc
  • Non conservare i GUID degli Stati e comandi all'interno della soluzione di
  • indipendente dal contesto di Sitecore
  • astratta in modo che possa essere utilizzato per tutti i flussi di lavoro in 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

Non penso che questo codice eccessivamente complicato con 4 (!) Nidificato se le istruzioni dovrebbero essere il modo "corretto" di fare qualcosa.inoltre non sembra rispondere alla domanda: come assegnare un flusso di lavoro e uno stato del flusso di lavoro casuale a un elemento. Al contrario, sposta sostanzialmente l'elemento allo stato successivo del flusso di lavoro se lo stato successivo risulta essere lo stato desiderato. – eloycm

3

ho guardato tutto per una buona risposta a questo. Stavo creando un nuovo oggetto e volevo iniziare il suo flusso di lavoro. La risposta di jRobbins non ha funzionato per me perché genera un'eccezione se lo stato corrente del flusso di lavoro dell'elemento è nullo e non offre un buon modo di impostare lo stato del flusso di lavoro iniziale.

Di seguito ha lavorato per me:

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

Questo imposta il flusso di lavoro del mio nuovo elemento più imposta il suo stato di workflow allo stato iniziale.

1

Dopo essersi assicurati che avevo impostato un flusso di lavoro di default sui valori standard, la seguente combinazione, con grazie ai poster sopra, ha funzionato perfettamente:

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