2012-11-23 15 views
5

Bir iş akışı yapılandırdım, her zamanki gibi "Taslak" durumla başlıyor. Ve şablonun standart değerleri için iş akışını yapılandırdım. İçerik editöründe mükemmel çalışır. (İçerik Düzenleyicisi'ni kullanarak bir öğe oluşturduğumda, öğeyi oluşturduktan sonra İş Akışı öğeye atanır ve durumu "Taslak" haline gelir.)Sitecore: Bir öğeye program akışında iş akışı atama

Ancak, yukarıdaki şablonun altında programsal olarak bir öğe oluşturduğumda iş akışını atamayın. İş akışı atamak için ne yapmalıyım? Lütfen varsa herhangi bir kod örneğini paylaşın.

Teşekkürler.

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

cevap

4

o Sitecore İş Akışı Devlet Komutları ve örneğin onunla birlikte gelen yararlı işlevler kullanmaz gibi Dhanuka777 cevabını kullanmak ister Standart Fields ile sorunu

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

biryere baktı ve bu gibi görünüyor En iyi cevap, neden daha otomatik olarak gerçekleşmez merak ediyorum. –

+0

Sabit kodlu Kılavuzları ayarlamak için bu şekilde kullanmayın. Doğru şekilde ayarlamak için jRobbins cevabı kullanın. –

+2

Özel ihtiyacımız için, kodlanmış kimlikler bizim için iyi oldu. Unutulmaması gereken bir şey '__Workflow [...]' yerine 'Sitecore.FieldIDs.Workflow' ve 'Sitecore.FieldIDs.WorkflowState 'kullanabilmenizdir. Örneğin: "itemVersion.Fields [Sitecore.FieldIDs.WorkflowState] .Value = approvedState.ToString();'. –

11

çözüldü e-posta üretimi. Ayrıca, kodlama Kılavuzları gerektirir. Aşağıdaki kod

Faydaları:

  • yararlanın Sitecore Devlet Komutları ve sahip oldukları güzel işlevsellik örn e-postaları oluşturan bu Sitecore tüm İş akışları için kullanılabilir böylece kullanıcılar vb
  • Bağımsız Sitecore Bağlamında
  • Özet çözümüne iç Devletleri ve Komu- GUID'lerini saklamayın uyarmak için.
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

İfadelerin bir şey yapmanın "uygun" yolu olması gerekiyorsa, 4 (!) 'I iç içe geçmiş olan bu aşırı karmaşık kodu düşünmüyorum.Üstelik şu soruyu yanıtlamıyor: bir iş akışını ve bir iş akışının rasgele bir iş akışı durumu nasıl atanacağı. Bunun yerine, bir sonraki durum istenen durum olduğunda, öğeyi temel olarak bir sonraki iş akışı durumuna geçirir. – eloycm

3

Bunun için iyi bir yanıt için tüm baktı. Yeni bir öğe oluşturuyordum ve iş akışını başlatmak istiyordum. jRobbins'in cevabı benim için çalışmadı çünkü öğenin mevcut iş akışı durumu boşsa ve ilk iş akışı durumunu belirlemenin iyi bir yolunu sunmadıysa bir istisna atar.

şu

benim için çalıştı:

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

Bu benim yeni öğenin iş akışını belirleyen artı başlangıç ​​durumuna onun iş akışı durumunu ayarlar.

1

Yukarıda posterleri sayesinde, standart değerlere aşağıdaki kombinasyonu varsayılan bir iş akışı olarak belirlersiniz emin olduktan sonra mükemmel çalıştı:

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