如何以编程方式批准Sitecore中的内容项

时间:2012-01-11 20:54:29

标签: sitecore sitecore6

我是否可以通过编程方式批准Sitecore中的内容项?

2 个答案:

答案 0 :(得分:3)

以下是您可能想要做的事情。为每个站点设置一个复选框,允许管理员选择是否要使用等待批准。管理员只需选中跳过审批复选框(草稿批准)或不选中以保持工作流程(草稿> AA(批准或拒绝)>已批准):

  1. 在您的工作流程中,在草稿状态下验证您是否有提交命令 将下一个州分配给等待批准。
  2. 在提交命令下创建一个SkipOver操作。
  3. 在VS中创建类库项目,输出将是您的程序集。
  4. 在程序集中创建一个SkipAction类。
  5. 回到您的SkipOver操作,设置类型字符串,如下所示: 键入string [shared]:YourAssembly.SkipAction,YourAssembly
  6. 转到sitecore>模板,创建SkipApproval模板
  7. 将模板部分添加到名为WorkflowSettings的模板中。
  8. 将模板字段添加到WorkflowSettings,选择type。下的复选框。
  9. 保存并发布模板项。
  10. 在我的情况下,我们将Skipapproval添加到sectionsettings项目,然后将其分配给新站点的标准模板。因此,对于创建的每个站点,我们添加了sectionsettings模板,模板将具有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)复选框:

  13. 参数[共享]: nextstateid = {D0F57FA8-F472-4332-89D9-E429CD111E50}&安培; skipfieldid = {XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX}

    1. 编译和部署,启动sitecore,作为相关管理员转到的网站,选中“跳过审批”,注销,登录用户,并具有编辑权限。进行更改,转到审核标签&gt;提交,验证您仍然可以编辑,因为您已获得批准。
    2. 转到相关网站,取消选中“跳过审批”,注销,在具有编辑权限的用户下登录。进行更改,转到审核标签&gt;提交,确认该项目已被锁定且正在等待批准。
    3. 谢谢,c

答案 1 :(得分:0)

这是一个博客(非常具有描述性),告诉您如何以编程方式更改项目的工作流程状态: http://www.cognifide.com/blogs/sitecore/changing-workflow-state-of-sitecore-items-programmatically/ 希望这有帮助!

相关问题