2012-11-23 15 views
5

मैंने वर्कफ़्लो कॉन्फ़िगर किया है, सामान्य रूप से "ड्राफ्ट" स्थिति से शुरू होता है। और मैंने टेम्पलेट के मानक मानों के लिए वर्कफ़्लो कॉन्फ़िगर किया है। यह सामग्री संपादक में सही काम करता है। (जब मैं सामग्री संपादक का उपयोग कर एक आइटम बना देता हूं, एक बार जब मैं आइटम बना देता हूं, वर्कफ़्लो आइटम को सौंपा जाता है और यह स्थिति "ड्राफ्ट" बन जाती है।)साइटकोर: किसी आइटम को प्रोग्रामेटिक रूप से वर्कफ़्लो असाइन करें

लेकिन जब मैं उपरोक्त टेम्पलेट के तहत प्रोग्रामेटिक रूप से कोई आइटम बनाता हूं तो यह करता है वर्कफ़्लो असाइन नहीं करें। वर्कफ़्लो असाइन करने के लिए मुझे क्या करना चाहिए? यदि आपके पास है तो कृपया कोई कोड नमूने साझा करें।

धन्यवाद।

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

उत्तर

4

स्टैंडर्ड फील्ड्स के साथ इस मुद्दे,

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

मैं हर जगह देखा है और इस प्रतीत हो रहा है सबसे अच्छा जवाब, मुझे आश्चर्य है कि यह स्वचालित रूप से क्यों नहीं होता है। –

+0

हार्डकोडेड मार्गदर्शिका सेट करने के लिए इस तरह का उपयोग न करें। इसे ठीक से सेट करने के लिए jRobbins उत्तर का प्रयोग करें। –

+2

हमारी विशेष आवश्यकता के लिए, हार्ड-कोड आईडी हमारे लिए ठीक थीं। ध्यान देने योग्य बात यह है कि आप '__Workflow [...]' के बजाय 'Sitecore.FieldIDs.Workflow' और' Sitecore.FieldIDs.WorkflowState' का उपयोग कर सकते हैं। उदाहरण के लिए: 'itemVersion.Fields [Sitecore.FieldIDs.WorkflowState]। Value = approvedState.ToString(); '। –

11

मैं Dhanuka777 के जवाब का उपयोग नहीं होगा के रूप में यह Sitecore के कार्यप्रवाह राज्य कमांड और है कि जैसे यह के साथ आता है उपयोगी कार्यक्षमता का उपयोग नहीं कर रहा है हल ईमेल पीढ़ी इसे हार्डकोडिंग ग्रिड की भी आवश्यकता है।

नीचे कोड के लाभ:

  • उपयोग Sitecore के राज्य कमांड और अच्छा कार्यक्षमता वे उदा ईमेल पैदा सचेत करने के लिए उपयोगकर्ताओं आदि
  • तो यह Sitecore में सभी वर्कफ़्लो के लिए इस्तेमाल किया जा सकता समाधान
  • Sitecore के संदर्भ
  • सार के स्वतंत्र अंदर राज्य अमेरिका और आदेश की GUIDs की दुकान मत करो।
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

मुझे लगता है कि यह कुछ जटिल करने के लिए "उचित" तरीका होना चाहिए, तो 4 (!) नेस्टेड के साथ यह अत्यधिक जटिल कोड नहीं लगता है।इसके अलावा सवाल का जवाब नहीं लगता है: वर्कफ़्लो और किसी आइटम को यादृच्छिक वर्कफ़्लो स्थिति कैसे असाइन करें। इसके बजाय यह मूल रूप से आइटम को अगले वर्कफ़्लो स्थिति में ले जाता है यदि अगला राज्य वांछित स्थिति होता है। – eloycm

3

मैं इस के लिए एक अच्छा जवाब के लिए सब कुछ खत्म देखा। मैं एक नया आइटम बना रहा था और अपना वर्कफ़्लो शुरू करना चाहता था। jRobbins का जवाब मेरे लिए काम नहीं करता क्योंकि यह अपवाद फेंकता है अगर आइटम की वर्तमान वर्कफ़्लो स्थिति शून्य है और यह प्रारंभिक वर्कफ़्लो स्थिति सेट करने का एक अच्छा तरीका नहीं प्रदान करता है।

निम्नलिखित मेरे लिए काम किया:

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

यह मेरा नया आइटम की कार्यप्रवाह सेट प्लस प्रारंभिक अवस्था में इसकी कार्यप्रवाह राज्य तय करता है।

1

यकीन है कि मैं, पोस्टर के लिए धन्यवाद के साथ ऊपर मानक मूल्यों, निम्नलिखित संयोजन पर एक डिफ़ॉल्ट कार्यप्रवाह सेट करेंगे करने के बाद, पूरी तरह से काम किया:

var workflowId = item.Fields["__Default workflow"].Value; 
var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId); 
workflow.Start(item); 
संबंधित मुद्दे