【问题标题】:Sitecore Droplink for User Roles用于用户角色的 Sitecore Droplink
【发布时间】:2013-05-10 08:52:27
【问题描述】:
我正在构建一个自定义工作流程,在该工作流程中,属于特定角色的所有用户都将根据某些状态变化收到电子邮件通知。我已经开始通过具有可替换令牌的 Sitecore 项目充实电子邮件模板,但我正在努力寻找一种方法来允许在 Sitecore 中设置收件人角色。我想避免让用户输入角色的字符串表示形式,因此如果有一种方法可以使用 sitecore 中定义的各种角色填充它,那么 droplink 将是理想的。如果我可以过滤填充 droplink 的角色,则可以加分。
我知道用户/角色/域未定义为内容树中的项目,那么究竟如何配置此 droplink?
Sitecore 6.5。
【问题讨论】:
标签:
security
email
content-management-system
sitecore
sitecore6
【解决方案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;
}