Как обеспечить почтовые уведомления / рабочие процессы для клонов - PullRequest
3 голосов
/ 31 марта 2011

Мы хотим настроить систему, в которой администраторы клонов будут получать уведомления по электронной почте, когда обновляется элемент, клон которого был клонирован.Из этого элемента будет создано несколько клонов, и в идеале мы хотели бы отфильтровать уведомления по языку (чтобы администраторы клона на английском языке не получали уведомления при обновлении французской версии).

Есть ли простойспособ реализовать что-либо из этого внутри рабочего процесса?Если да, то к какому еще из них я должен подключить действие рабочего процесса?

Нужно ли для этого расширять или переопределять конвейер?

Перекрестно в SDN http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=34533#34533

РЕДАКТИРОВАТЬ: Немного больше информации:

Если клон не перезаписывает поле из исходного элемента, то в клиенте нет уведомления об изменении поля исходного элемента.Изменение копируется напрямую - по крайней мере, в основную базу данных.НО - клон все еще должен быть опубликован в веб-базе данных, чтобы это изменение вступило в силу онлайн.Так что я немного застрял - мой пользователь должен выполнить действие (опубликовать клон), но не знает об этом ...

Я бы очень хотел как-то подключиться к событиям уведомлений.

1 Ответ

2 голосов
/ 08 апреля 2011

Отвечая на мой собственный вопрос Код здесь был предоставлен различными авторами на 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

Спасибо всем, кто предоставил ввод!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...