我有一个已从其他sitecore项目克隆的sitecore项目。当我向父项添加子项时,我希望它也在克隆下添加项。它这样做但我必须手动接受每个更改。我有250个克隆!
答案 0 :(得分:5)
在this article from 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);
}
}
}
}
}
我已经将它构建为abstract
类,因此我可以多次使用它。实现如下:
public class ImplementationOfBase:
AcceptCloneNotificationsEventBase<FieldChangedNotification>
{
protected override bool ShouldAcceptNotification(Item item, Item parent)
{
return /*filter the event as you see fit here*/;
}
}
<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>