本文介绍了如何以编程方式批准Sitecore中的内容项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有办法以编程方式批准Sitecore中的内容项目?

推荐答案

您可能需要这样做。为每个站点设置一个复选框,允许管理员选择是否要使用等待审批。管理员只需选中一个复选框即可跳过审批(草案为已批准)或不选中以维护工作流(草案>AA(批准或拒绝)>已批准):

    在您的工作流中,在草稿状态下,验证您是否有提交命令将下一个状态指定为等待审批。
  1. 在提交命令下创建跳过操作。
  2. 在VS中创建类库项目,输出将是您的程序集。
  3. 在程序集中创建SkipAction类。
  4. 返回到您的SkipOver操作,安装类型字符串如下:类型字符串[共享]:YourAssembly.SkipAction,YourAssembly
  5. 转到Sitecore>模板,创建SkipApproval模板
  6. 将模板节添加到名为WorkflowSettings的模板。
  7. 将模板字段添加到WorkflowSettings,选中"类型"下的复选框。
  8. 保存并发布模板项。
  9. 在我的例子中,我们将SkipApproval添加到sectionSettings项中,然后将其分配给新站点的OUT标准模板。因此,对于创建的每个站点,我们添加sectionSettings模板,该模板将具有SkipApproval复选框。
  10. 将此代码添加到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;
        }
    }
    

    }

  11. 返回到您的SkipOver操作,添加如下参数(nextstateid=模板中的Approval State id,skipfielid=SkipApproval的项目ID):

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

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

谢谢,c

这篇关于如何以编程方式批准Sitecore中的内容项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 14:27