用户角色的Sitecore Droplink

时间:2013-05-15 16:56:00

标签: security email content-management-system sitecore sitecore6

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

我知道用户/角色/域未定义为内容树中的项目,那么如何配置此droplink呢?

Sitecore 6.5。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您可能需要查看提供多列表的http://sitecorejunkie.com/2012/12/28/have-a-field-day-with-custom-sitecore-fields/,以便您选择用户列表。

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

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

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;
}