我们希望设置一个系统,克隆管理员可以在克隆克隆项目时更新电子邮件通知。将从该项目创建多个克隆,理想情况下我们希望按语言过滤通知(因此,当法语版本更新时,英语克隆的管理员不会收到通知。)
有没有一种简单的方法可以在工作流程中实现这一切?如果是这样,我甚至应该尝试将工作流操作挂钩到?
我是否需要扩展或覆盖管道才能执行此操作?
转到SDN http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=34533#34533
编辑:更多信息:
如果克隆未覆盖原始项目中的字段,则在编辑原始项目字段时,客户端中不会发出通知。直接复制更改 - 至少在master数据库中。但是 - 仍需要将克隆发布到Web数据库,以使此更改在线生效。所以我有点卡住 - 我的用户需要执行一个动作(发布克隆),但不知道...
我真的很想以某种方式挂钩通知事件。
答案 0 :(得分:2)
回答我自己的问题 这里的代码是由SDN中的各个海报提供的: http://sdn.sitecore.net/forum//ShowPost.aspx?PostID=34012
如果任何为该主题做出贡献的人想要发布答案,那么我很乐意给予信任 - 并且代表它应该到期。
首先: 约翰·韦斯特指出,有一些有趣但私密的方法:
private static IEnumerable<Item> GetClonesOfVersion(Item source)
{
Assert.ArgumentNotNull(source, "source");
return (from clone in GetAllClones(source)
where clone.SourceUri == source.Uri
select clone);
}
private static IEnumerable<Item> GetAllClones(Item source)
{
Assert.ArgumentNotNull(source, "source");
return (from link in Globals.LinkDatabase.GetReferrers(source)
select link.GetSourceItem() into clone
where ((clone != null) && (clone.Source != null)) && (clone.Source.ID == source.ID)
select clone);
}
有一张支持票要求将这些内容公开,否则只需将它们复制到您的项目中即可。
需要与自定义工作流操作结合使用,该操作应编译并添加到源项的工作流中。
下面的这个由Derek Roberti / Lauren Hightower提供,强制接受克隆中的通知。 要提供电子邮件通知,我们需要撤消逻辑 - 如果克隆有通知,我们要确保在克隆没有通知时执行操作,而不是执行操作 - 即直接继承源项目中编辑的值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Data.Clones;
using Sitecore.Diagnostics;
using Sitecore.SecurityModel;
using Sitecore;
using Sitecore.Links;
namespace WorkFlowCustom
{
public class ForceCloneAccept
{
public void Process(Sitecore.Workflows.Simple.WorkflowPipelineArgs args)
{
Item workFlowItem = args.DataItem;
List itemList = GetItemClones(workFlowItem, true);
foreach (Item cloneItem in itemList)
{
List list = new List(workFlowItem.Database.NotificationProvider.GetNotifications(cloneItem));
foreach (Notification n in list)
{
if ((n != null) && (workFlowItem != null))
{
n.Accept(cloneItem);
}
}
}
}
protected virtual List GetItemClones(Item item, bool processChildren)
{
Assert.ArgumentNotNull(item, "item");
List list = new List();
using (new SecurityDisabler())
{
foreach (ItemLink link in Globals.LinkDatabase.GetReferrers(item))
{
if (!(link.SourceFieldID != FieldIDs.Source))
{
Item sourceItem = link.GetSourceItem();
if (sourceItem != null)
{
list.Add(sourceItem);
}
}
}
}
if (processChildren)
{
foreach (Item item4 in item.Children)
{
list.AddRange(this.GetItemClones(item4, true));
}
}
return list;
}
}
}
以下是关于自定义工作流和调用操作的一般性阅读: http://sdn.sitecore.net/FAQ/API/Cause%20the%20workflow%20to%20invoke%20an%20action.aspx
感谢所有提供的输入!