Отвечая на мой собственный вопрос Код здесь был предоставлен различными авторами на 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);
}
Есть поддержкатикет с просьбой сделать их публичными, в противном случае просто скопируйте их в свой проект.
Это должно быть связано с настраиваемым действием рабочего процесса, которое должно быть скомпилировано и добавлено в рабочий процесс для исходного элемента.
Этот ниже, предоставленный Дереком Роберти / Лорен Хайтауэр, предназначен для принудительного принятия уведомлений в клонах. Чтобы предоставлять уведомления по электронной почте, нам нужно изменить логику - вместо выполнения действия, если у клона есть уведомления, мы хотели бы убедиться, что действие было выполнено, если у клона не было уведомлений - т.е. непосредственно наследоватьотредактированное значение из исходного элемента.
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
Спасибо всем, кто предоставил ввод!