2012-01-11 47 views

回答

3

以下是您可能想要做的事情。爲每個網站設置一個複選框,允許管理員選擇是否要使用等待批准。管理員將只選中一個複選框來跳過認證(草案批准)或離開選中維護工作流程(草案> AA(批准或拒絕)>批准):

  1. 在您的工作流程,草案狀態下驗證您有一個提交命令 ,下一個狀態分配給等待批准。
  2. 在提交命令下創建一個SkipOver操作。
  3. 在VS中創建類庫項目,輸出將是你的程序集。
  4. 在程序集中創建一個SkipAction類。
  5. 回到你的SkipOver行動,安裝類型的字符串是這樣的: 類型爲String [分享]:YourAssembly.SkipAction,YourAssembly
  6. 轉到Sitecore的>模板,創建SkipApproval模板
  7. 添加模板部分模板稱爲WorkflowSettings。
  8. 將模板字段添加到WorkflowSettings,選擇類型下的複選框。
  9. 保存併發布模板項目。
  10. 在我的情況下,我們將Skipapproval添加到一個分區項目,然後分配給新站點的標準模板。因此,對於每個創建的網站,我們都添加了版塊設置模板,並且模板將包含SkipApproval複選框。
  11. 將此代碼添加到您的SkipAction類:

    public class SkipAction 
    { 
        bool isSiteSettingsReached = false; 
    
        /// <summary> 
        /// This method facilitates grabbing of the skipapproval setting from setting>sectionsettings 
        /// </summary> 
        /// <param name="item"></param> 
        /// <param name="fieldId"></param> 
        /// <returns></returns> 
        protected bool GetSkipSetting(Item item, string fieldId) 
        { 
         bool result = false; 
    
         if (item.ID.Equals(null) || item.ID.Equals(ItemIDs.ContentRoot) || item.ID.Equals(ItemIDs.RootID)) 
         { 
          result=false; 
         } 
    
         if (isSkipApprovalChecked(item, fieldId)) 
         { 
          result = true; 
         } 
    
         if (!isSkipApprovalChecked(item, fieldId)) 
         { 
          result = false; 
         } 
    
         if (!isSiteSettingsReached) 
         { 
          result=GetSkipSetting(item.Parent, fieldId); 
         } 
    
         return result; 
        } 
    
        /// <summary> 
        /// This method is initialized when skipaction is called 
        /// </summary> 
        /// <param name="args"></param> 
        public void Process(WorkflowPipelineArgs args) 
        { 
         var contentItem = args.DataItem; 
         var actionItem = args.ProcessorItem.InnerItem; 
    
         var parameters = WebUtil.ParseUrlParameters(actionItem["parameters"]); 
         var nextStateId = parameters["nextstateid"]; 
         var skipFieldId = parameters["skipfieldid"]; 
    
         if(nextStateId.IsNullOrEmpty() || 
          skipFieldId.IsNullOrEmpty()) 
          return; 
    
         bool skip = GetSkipSetting(contentItem, skipFieldId); 
    
         Sitecore.Data.Database web = Sitecore.Configuration.Factory.GetDatabase("web"); 
         Sitecore.Data.Database production = Sitecore.Configuration.Factory.GetDatabase("production"); 
    
         if (skip) 
         { 
          contentItem.PerformTransition(nextStateId, "auto skip"); 
    
          using (new Sitecore.SecurityModel.SecurityDisabler()) 
          {      
           publishTo(web, contentItem); 
           publishTo(production, contentItem);      
          } 
    
          contentItem.Locking.Unlock(); 
          args.AbortPipeline(); 
         }   
        } 
    
        /// <summary> 
        /// this method is used to publish to environ by param 
        /// </summary> 
        /// <param name="targetToPublish"></param> 
        /// <param name="item"></param> 
        private void publishTo(Sitecore.Data.Database targetToPublish, Item item) 
        { 
         Sitecore.Data.Database sourceDB = Sitecore.Configuration.Factory.GetDatabase("master"); 
    
         //// set publish options 
         Sitecore.Publishing.PublishOptions myOptions = new Sitecore.Publishing.PublishOptions(
          sourceDB, 
          targetToPublish, 
          Sitecore.Publishing.PublishMode.Smart, 
          item.Language, 
          DateTime.Now); 
    
         myOptions.RootItem = item; 
         myOptions.Deep = false; 
         Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(myOptions); 
         Sitecore.Jobs.Job myPublishJob = publisher.PublishAsync(); 
         myPublishJob.Start(); 
    
        } 
        /// <summary> 
        /// This method check the actual skip approval field in settings>sectionsettings 
        /// </summary> 
        /// <param name="item"></param> 
        /// <param name="fieldId"></param> 
        /// <returns></returns> 
        public bool isSkipApprovalChecked(Sitecore.Data.Items.Item item, string fieldId) 
        {   
         if (item.HasChildren) 
         { 
          Sitecore.Data.Items.Item settingsItem = item.Axes.GetChild("Settings"); 
    
          if (settingsItem == null) 
          { 
           return false; 
          } 
          else 
          { 
           isSiteSettingsReached = true; 
           Sitecore.Data.Items.Item sectionsettingsItem = settingsItem.Axes.GetChild("SectionSettings"); 
    
           if (sectionsettingsItem.DisplayName == "SectionSettings" && sectionsettingsItem[fieldId] == "1") 
           { 
            return true; 
           } 
           else 
           { 
            return false;      
           } 
          }    
         } 
         return false;     
        } 
    } 
    

    }

  12. 回到你SkipOver行動,加個參數是這樣的(nextstateid =審批狀態ID,skipfieldid = skipapproval複選框的項目ID在模板中):

參數[共享]: nextstateid = {D0F57FA8-F472-4332-89D9-E429CD111E50} & skipfieldid = {XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX}

  1. 編譯和部署,啓動Sitecore的,因爲有關管理員轉到網站,勾選「跳過認證」,註銷,登錄用戶在使用權編輯。進行更改,轉到審覈選項卡>提交,確認您仍然可以編輯,因爲您已被批准。
  2. 轉到有問題的網站,取消選中「跳過審批」,註銷,在有權編輯的用戶下登錄。進行更改,轉到審閱選項卡>提交,確認該項目已鎖定並等待批准。

感謝,C

相關問題