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

83
11

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

спросил(а) 2012-01-11T23:54:00+04:00 8 лет, 9 месяцев назад
1
Решение
81

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


    В вашем рабочем процессе, в проекте состояния проверьте, что у вас есть команда отправки
    со следующим статусом, присвоенным одобрению.
    В команде submit создайте действие SkipOver.
    Создайте проект библиотеки классов в VS, выход будет вашей сборкой.
    Создайте класс SkipAction в своей сборке.
    Вернемся к вашему действию SkipOver, введите строку типа типа:
    Введите строку [shared]: YourAssembly.SkipAction, YourAssembly
    Готово > шаблоны, создайте шаблон SkipApproval
    Добавить раздел шаблона в шаблон, называемый WorkflowSettings.
    Добавить поле шаблона в WorkflowSettings, установить флажок под типом.
    Сохранить и опубликовать элемент шаблона.
    В моем случае мы добавляем Skipapproval к ​​элементу sectionstings, который затем присваивается стандартным шаблонам для новых сайтов. Поэтому для каждого созданного сайта мы добавляем шаблон settingssettings, и в шаблоне будет установлен флажок SkipApproval.

    Добавьте этот код в свой класс 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;
    }
    }


    }


    Вернитесь к своему действию SkipOver, добавьте такие параметры (nextstateid = id состояния утверждения, skipfieldid = элемент id skipapproval в вашем шаблоне):


Параметры [shared]:
nextstateid = {D0F57FA8-F472-4332-89D9-E429CD111E50} & skipfieldid = {ХХХХХХХХХХХХ-XXXXXXXX-ХХХХХХХХХХХХ}

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

Спасибо, c

ответил(а) 2012-03-29T19:50:00+04:00 8 лет, 7 месяцев назад
42

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

ответил(а) 2014-06-17T13:39:00+04:00 6 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема