Есть ли способ в sitecore гарантировать, что определенный тип элемента может иметь только 1 дочерний элемент определенного типа? Я читаю книгу рецептов механизма правил, но не могу получить подробностей.
Sitecore Insert правила для обеспечения не более (1) дочерних элементов определенного типа
Ответы (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
Можете ли вы поделиться подробностями? Я новичок в sitecore, и я не совсем уверен, с чего начать .... где этот обработчик событий?
- person M.R.; 30.08.2012
Вот статья о событиях Sitecore. Он старый, но по большей части все еще актуален. По сути, вам нужно будет добавить ссылку на этот класс в web.config в разделе sitecore / events, и он будет выполняться каждый раз при создании элемента.
- person Derek Hunziker; 30.08.2012
Также вот пример ссылки:
<handler type="Your.Namespace.OnItemCreated, Your.Library" method="OnItemCreated"/>
- person Derek Hunziker; 30.08.2012
@DerekHunziker - Отличное решение! Из вашего ответа я сделал вывод, что событие
item:created
возникает, когда элемент перемещается, дублируется, копируется или создается. Это верно?
- person Zachary Kniebel; 20.09.2012
@ZacharyKniebel, я считаю, что дублирование и копирование в конечном итоге перерастают в элемент: создается в какой-то момент в конвейере с момента создания нового элемента. Перемещение не имеет, однако есть отдельное событие (элемент: перемещение), на которое вы можете подписаться для этого.
- person Derek Hunziker; 20.09.2012
@ZacharyKniebel, Также в случае с item: moving вы не захотите удалять текущий элемент. Скорее, вы просто захотите прервать конвейер, чтобы перемещение не произошло.
- person Derek Hunziker; 20.09.2012
@DerekHunziker - Большое спасибо. Это было очень полезно.
- person Zachary Kniebel; 20.09.2012