Как программно одобрить элемент контента в Sitecore

Есть ли способ, которым я могу программно одобрить элемент контента в Sitecore?

2 ответа

Вот что вы можете сделать. Установите флажок для каждого сайта, который позволит администраторам выбирать, хотят они использовать Ожидание одобрения или нет. Администратор просто установит флажок Пропускать утверждение (Черновик для одобренного) или оставит не отмеченным для поддержания рабочего процесса (Черновик>AA(одобрить или отклонить)> Утверждено):

  1. В рабочем процессе в черновом состоянии убедитесь, что у вас есть команда отправки со следующим состоянием, назначенным на Ожидание утверждения.
  2. Под командой submit создайте действие 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 = идентификатор состояния утверждения, skipfieldid = идентификатор элемента флажка skipapproval в вашем шаблоне):

Параметры [общие]: nextstateid={D0F57FA8-F472-4332-89D9-E429CD111E50}&skipfieldid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

  1. Скомпилируйте и разверните, запустите sitecore, как администратор, перейдите на сайт, отметьте "Пропустить утверждение", выйдите из системы, войдите под пользователем с правами на редактирование. Внесите изменения, перейдите на вкладку обзора> отправить, убедитесь, что вы все еще можете редактировать, потому что вы были утверждены
  2. Перейдите на рассматриваемый сайт, снимите флажок "Пропустить утверждение", выйдите из системы, войдите под пользователем с правами на редактирование. Внесите изменения, перейдите на вкладку обзора> отправить, убедитесь, что элемент заблокирован и ожидает подтверждения.

Спасибо, с

Вот блог, который (довольно описательно) расскажет вам, как программно изменить состояние рабочего процесса для элементов: http://www.cognifide.com/blogs/sitecore/changing-workflow-state-of-sitecore-items-programmatically/ Надеюсь, что это помогает!

Другие вопросы по тегам