2

我正在构建一个自定义工作流程,其中作为特定角色成员的所有用户都将根据某些状态更改收到电子邮件通知。我已经开始通过具有可替换令牌的 Sitecore 项目充实电子邮件模板,但我正在努力寻找一种方法来允许在 Sitecore 中设置收件人角色。我想避免让用户输入角色的字符串表示形式,因此如果有一种方法可以使用 sitecore 中定义的各种角色填充它,那么 droplink 将是理想的。如果我可以过滤填充 droplink 的角色,则可以加分。

我知道用户/角色/域没有被定义为内容树中的项目,那么究竟如何配置这个 droplink?

站点核心 6.5。

4

2 回答 2

3

我不确定是否已经制作了一个模块,但您可以使用这种技术: http: //newguid.net/sitecore/2013/coded-field-datasources-in-sitecore/

它解释了如何将类用作数据源。因此,您可以创建一个列出所有用户角色的类。

于 2013-05-15T17:00:24.290 回答
2

您可能想看看http://sitecorejunkie.com/2012/12/28/have-a-field-day-with-custom-sitecore-fields/它提供了一个多列表以允许您选择一个列表用户。

还可以查看Workflow Escaltor Module表单,您可以借用 AccountSelector 控件,该控件允许您选择个人或角色。

这是我以前用来做这件事的模块。以下代码获取用户的所有唯一电子邮件地址,并且仅适用于对项目具有读取权限的用户(这是一个多站点实现,角色仅限于每个站点,但工作流程是共享的)。

protected override List<string> GetRecipientList(WorkflowPipelineArgs args, Item workflowItem)
{
    Field recipientsField = workflowItem.Fields["To"];
    Error.Assert((recipientsField != null || !string.IsNullOrEmpty(recipientsField.Value)), "The 'To' field is not specified in the mail action item: " + workflowItem.Paths.FullPath);

    List<string> recepients = GetEmailsForUsersAndRoles(recipientsField, args);

    if (recepients.Count == 0)
        Log.Info("There are no users with valid email addresses to notify for item submission: " + workflowItem.Paths.FullPath);

    return recepients;
}

//Returns unique email addresses of users that correspond to the selected list of users/roles  
private List<string> GetEmailsForUsersAndRoles(Field field, WorkflowPipelineArgs args)
{
    List<string> emails = new List<string>();
    List<User> allUsers = new List<User>();

    AccountSelectorField accountSelectorField = new AccountSelectorField(field);
    List<Account> selectedRoles = accountSelectorField.GetSelectedAccountsByType(AccountType.Role);
    List<Account> selectedUsers = accountSelectorField.GetSelectedAccountsByType(AccountType.User);

    foreach (var role in selectedRoles)
    {
        var users = RolesInRolesManager.GetUsersInRole(Role.FromName(role.Name), true).ToList();
        if (users.Any()) 
            allUsers.AddRange(users);
    }

    selectedUsers.ForEach(i => allUsers.Add(Sitecore.Security.Accounts.User.FromName(i.Name, false)));

    foreach (var user in allUsers)
    {   
        if (user == null || !args.DataItem.Security.CanRead(user)) continue; //move on if user does not have access to item

        if (!emails.Contains(user.Profile.Email.ToLower()))
        {
            if(user.Profile.Email != null && !string.IsNullOrEmpty(user.Profile.Email.Trim()))
                emails.Add(user.Profile.Email.ToLower());
            else
                Log.Error("No email address setup for user: " + user.Name);

        }
    }

    return emails;
}
于 2013-05-15T17:11:19.857 回答