Как программно одобрить элемент контента в Sitecore - PullRequest
3 голосов
/ 12 января 2012

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

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

  1. В рабочем процессе, в состоянии черновика, убедитесь, что у вас есть команда отправки. со следующим состоянием, назначенным на Ожидание Одобрения.
  2. Под командой отправки создайте действие SkipOver.
  3. Создайте проект библиотеки классов в VS, на выходе будет ваша сборка.
  4. Создайте класс SkipAction в вашей сборке.
  5. Вернемся к вашему действию SkipOver, введите строку типа: Введите строку [общая]: 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-ХХХХХХХХХХХЕ} * * тысяча тридцать шесть

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

Спасибо, с

0 голосов
/ 17 июня 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...