我有一个sitecore项目,已从另一个sitecore项目克隆.当我向父项添加子项时,我希望它也在克隆下添加项.它这样做但我必须手动接受每个更改.我有250个克隆!
在sitecore的这篇文章中,有人在评论部分提出了类似的问题:
当您为已克隆的项创建新的子项时,您似乎必须手动转到每个克隆并接受在克隆下创建子项.有没有办法不必这样做?对于一个新的解决方案,我们将有几个克隆来自一个来源,客户不希望去每个克隆并接受一个子项目.在没有任何问题的情况下,子项总是出现在克隆中会更容易和用户友好.这同样适用于内容作者覆盖克隆中的值的实例,然后"权限作者"更改源项目中的值.如果没有克隆必须手动接受更改,如何将此更改应用于所有克隆?干杯
sitecore发布了一些带有伪代码的回复.基本上这可以转化为以下内容:
public abstract class AcceptCloneNotificationsEventBase<T> where T : Notification
{
protected abstract bool ShouldAcceptNotification(Item item, Item parent);
public void AcceptClone_SavedItem(object sender, EventArgs args)
{
var item = (Item)Event.ExtractParameter(args, 0);
var parent = item.Parent;
foreach (var clone in item.GetClones())
{
foreach (var notification in clone.Database.NotificationProvider.GetNotifications(clone.Uri))
{
if (notification is T && ShouldAcceptNotification(item, parent))
{
notification.Accept(clone);
}
}
}
}
public void AcceptClone_CreateItem(object sender, EventArgs args)
{
var item = (Item)Event.ExtractParameter(args, 0);
var parent = item.Parent;
foreach (var clone in parent.GetClones())
{
foreach (var notification in clone.Database.NotificationProvider.GetNotifications(clone.Uri))
{
if (notification is T && ShouldAcceptNotification(item, parent))
{
notification.Accept(clone);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我把它建成了一个abstract
类,所以我可以多次使用它.实现如下:
public class ImplementationOfBase:
AcceptCloneNotificationsEventBase<FieldChangedNotification>
{
protected override bool ShouldAcceptNotification(Item item, Item parent)
{
return /*filter the event as you see fit here*/;
}
}
Run Code Online (Sandbox Code Playgroud)
<events>
<event name="item:added">
<handler type="Namespace.ImplementationOfBase,Namespace" method="AcceptClone_CreateItem"/>
</event>
<event name="item:saved">
<handler type="Namespace.ImplementationOfBase,Namespace" method="AcceptClone_SavedItem"/>
</event>
</events>
Run Code Online (Sandbox Code Playgroud)