【问题标题】:How to programmatically approve a content item in Sitecore如何以编程方式批准 Sitecore 中的内容项
【发布时间】:2012-02-08 05:36:30
【问题描述】:

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

【问题讨论】:

  • 您的意思是批准工作流中的内容以移动到下一个状态?

标签: sitecore sitecore6


【解决方案1】:

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

  1. 在您的工作流程中,在草稿状态下验证您是否有提交命令 下一个状态分配给 Awaiting Approval。
  2. 在提交命令下创建一个 SkipOver 操作。
  3. 在 VS 中创建类库项目,输出将是您的程序集。
  4. 在您的程序集中创建一个 SkipAction 类。
  5. 回到您的 SkipOver 操作,设置类型字符串,如下所示: 类型字符串 [shared]:YourAssembly.SkipAction,YourAssembly
  6. 转到 sitecore>模板,创建 SkipApproval 模板
  7. 将模板部分添加到名为 WorkflowSettings 的模板中。
  8. 将模板字段添加到 WorkflowSettings,选中类型下的复选框。
  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):

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

  1. 编译和部署,启动sitecore,作为有问题的管理员转到站点,检查“跳过批准”,注销,以具有编辑权限的用户登录。进行更改,转到审核选项卡> 提交,验证您仍然可以编辑,因为您已获得批准。
  2. 转到有问题的站点,取消选中“跳过批准”,注销,以具有编辑权限的用户登录。进行更改,转到审核选项卡>提交,确认项目已锁定并等待批准。

谢谢,c

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多