Sitecore Insert правила для обеспечения не более (1) дочерних элементов определенного типа

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


person M.R.    schedule 29.08.2012    source источник


Ответы (1)


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

Вместо этого мы решили расширить событие item:created обработчиком специально для этой задачи. Ниже приведен упрощенный пример того, как это работает. Одним из очевидных улучшений было бы получение максимального дочернего предела из поля родительского элемента (конечно, видимого только администраторам). Вы, вероятно, могли бы даже использовать здесь механизм правил ...

public void OnItemCreated(object sender, EventArgs args)
{
    var createdArgs = Event.ExtractParameter(args, 0) as ItemCreatedEventArgs;

    Sitecore.Diagnostics.Assert.IsNotNull(createdArgs, "args");
    if (createdArgs != null)
    {
        Sitecore.Diagnostics.Assert.IsNotNull(createdArgs.Item, "item");
        if (createdArgs.Item != null)
        {
            var item = createdArgs.Item;

            // NOTE: you may want to do additional tests here to ensure that the item
            // descends from /sitecore/content/home
            if (item.Parent != null && 
                item.Parent.TemplateName == "Your Template" &&
                item.Parent.Children.Count() > 6)
            {
                // Delete the item, warn user
                SheerResponse.Alert(
                    String.Format("Sorry, you cannot add more than 6 items to {0}.",
                                      item.Parent.Name), new string[0]);
                item.Delete();
            }
        }
    }
}
person Derek Hunziker    schedule 29.08.2012
comment
Можете ли вы поделиться подробностями? Я новичок в sitecore, и я не совсем уверен, с чего начать .... где этот обработчик событий? - person M.R.; 30.08.2012
comment
Вот статья о событиях Sitecore. Он старый, но по большей части все еще актуален. По сути, вам нужно будет добавить ссылку на этот класс в web.config в разделе sitecore / events, и он будет выполняться каждый раз при создании элемента. - person Derek Hunziker; 30.08.2012
comment
Также вот пример ссылки: <handler type="Your.Namespace.OnItemCreated, Your.Library" method="OnItemCreated"/> - person Derek Hunziker; 30.08.2012
comment
@DerekHunziker - Отличное решение! Из вашего ответа я сделал вывод, что событие item:created возникает, когда элемент перемещается, дублируется, копируется или создается. Это верно? - person Zachary Kniebel; 20.09.2012
comment
@ZacharyKniebel, я считаю, что дублирование и копирование в конечном итоге перерастают в элемент: создается в какой-то момент в конвейере с момента создания нового элемента. Перемещение не имеет, однако есть отдельное событие (элемент: перемещение), на которое вы можете подписаться для этого. - person Derek Hunziker; 20.09.2012
comment
@ZacharyKniebel, Также в случае с item: moving вы не захотите удалять текущий элемент. Скорее, вы просто захотите прервать конвейер, чтобы перемещение не произошло. - person Derek Hunziker; 20.09.2012
comment
@DerekHunziker - Большое спасибо. Это было очень полезно. - person Zachary Kniebel; 20.09.2012