Как создать версию элемента сайта без рабочего процесса?

Я столкнулся с бизнес-требованиями в Sitecore, где для нескольких элементов нам не нужно прикреплять рабочий процесс, но мы хотим создать новую версию, когда мы заблокируем редактирование элемента.

Я не могу применить настройки ниже, так как это повлияет на все элементы, и мой рабочий процесс не будет полезен.

<setting name="RequireLockBeforeEditing" value="true"/>

Я также прошел вопрос stackru, и он дал решение ниже, но не уверен, какое событие это должно быть.

public Item StartEditing(Item item)
{
  Error.AssertObject((object) item, "item");
  if (!Settings.RequireLockBeforeEditing || Context.User.IsAdministrator)
    return item;
  if (this._context.IsAdministrator || StandardValuesManager.IsStandardValuesHolder(item) || !this.HasWorkflow(item) && !this.HasDefaultWorkflow(item) || !this.IsApproved(item))
    return this.Lock(item);
  Item obj = item.Versions.AddVersion();
  if (obj != null)
    return this.Lock(obj);
  else
    return (Item) null;
}

1 ответ

Решение

Попробуйте что-то вроде этого:

Элемент патча: сохраненное событие:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <events>
      <event name="item:saved">
        <handler type="PersonalizationDemo.Data.Items.ItemEventHandler, PersonalizationDemo" method="OnItemSaved"/>
      </event>
    </events>
  </sitecore>
</configuration>

Реализуйте класс пользовательского обработчика событий:

namespace PersonalizationDemo.Data.Items
{
    using Sitecore.Data.Items;
    using Sitecore.Events;
    using System;

    public class ItemEventHandler
    {
        protected void OnItemSaved(object sender, EventArgs args)
        {
            if (args == null) { return; }

            var sitecoreEventArgs = args as SitecoreEventArgs;
            if (sitecoreEventArgs == null) { return; }

            if (sitecoreEventArgs.Parameters.Length < 2) { return; }

            var item = sitecoreEventArgs.Parameters[0] as Item;
            if (item == null) { return; }

            if (!this.ShouldItemBeProcessed(item)) { return; }

            var itemChanges = sitecoreEventArgs.Parameters[1] as ItemChanges;
            if (itemChanges == null) { return; }

            if (itemChanges.FieldChanges.Contains(Sitecore.FieldIDs.Lock))
            {
                var fieldChange = itemChanges.FieldChanges[Sitecore.FieldIDs.Lock];
                if (fieldChange.Value == "<r />") { return; }

                this.CreateNewVersion(item);
            }
        }

        protected bool ShouldItemBeProcessed(Item item)
        {
            // TODO implement necessary check
            return true;
        }

        protected void CreateNewVersion(Item item)
        {
            var newItem = item.Versions.AddVersion();

            newItem.Editing.BeginEdit();
            // update necessary field if you need that
            newItem.Editing.EndEdit();
        }
    }
}
Другие вопросы по тегам