Как избежать дублирования имени при создании элемента Sitecore

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

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

Например: Parent A имеет 3 подэлемента с именем Child1, Child2, Child3, когда разработчик пытается создать элемент с именем Child2, должно отображаться всплывающее окно/предупреждение, не позволяющее ему создать элемент.

Пожалуйста, помогите мне с этим.


person PaRsH    schedule 26.01.2015    source источник


Ответы (2)


Вы можете добавить свой собственный обработчик к событию item:creating и проверить, содержит ли родитель уже дочерний элемент с предложенным именем.

Вот хороший пост, описывающий как предотвратить дублирование элементов в Sitecore. Я скопировал оттуда следующий код:

<event name="item:creating">
  <handler type="YourNameSpace.PreventDuplicates, YourAssembly" method="OnItemCreating" />
</event>
namespace YourNamespace
{
  public class PreventDuplicates
  {
    public void OnItemCreating(object sender, EventArgs args)
    {
      using (new SecurityDisabler())
      {
        ItemCreatingEventArgs arg = Event.ExtractParameter(args, 0) as ItemCreatingEventArgs;

        if ((arg != null) && (Sitecore.Context.Site.Name == "shell"))
        {
          foreach (Item currentItem in arg.Parent.GetChildren())
          {
            if ((arg.ItemName.Replace(' ', '-').ToLower() == currentItem.Name.ToLower()) 
              && (arg.ItemId != currentItem.ID))
            {
              ((SitecoreEventArgs)args).Result.Cancel = true;
              Sitecore.Context.ClientPage.ClientResponse.Alert
                ("Name " + currentItem.Name + " is already in use.Please use another name for the page.");
              return;
            }
          }
        }
      }
    }
  }
}
person Marek Musielak    schedule 26.01.2015
comment
Это решение не улавливает проблемы с переименованием элементов, оно проверяет только создание элемента. - person Jan Bühler; 22.02.2016

Для этого у меня есть сообщение в блоге, в котором используется событие создания/сохранения элемента и поиск по индексу для выявления дубликатов. Это было реализовано и протестировано с помощью Sitecore 7.2. Вот используемый конфиг:

<sitecore>
  <events>
    <event name="item:creating">
      <handler type="MySite.Customizations.Customized_Sitecore.UniqueItemNameValidator, MySite" method="OnItemCreating" />
    </event>
    <event name="item:saving">
      <handler type="MySite.Customizations.Customized_Sitecore.UniqueItemNameValidator, MySite" method="OnItemSaving" />
    </event>
  </events>
</sitecore>
person aceanindita    schedule 06.03.2015