2

Я создаю собственный рабочий процесс, где все пользователи, являющиеся членами определенной роли, получат уведомления по электронной почте в зависимости от определенных изменений состояния. Я начал формировать шаблоны электронной почты через элементы Sitecore со сменными токенами, но я изо всех сил стараюсь найти способ разрешить роль получателя в Sitecore. Я бы хотел, чтобы пользователи не вводили строковое представление роли, поэтому функция droplink была бы идеальной, если бы был способ заполнить ее различными ролями, определенными в sitecore. Бонусные очки, если я могу фильтровать роли, которые заполняют дроплинк.Sitecore Droplink для роли пользователя

Я знаю, что пользователи/роли/домены не определены как элементы в дереве контента, поэтому как конкретно нужно сконфигурировать этот дроплинк?

Sitecore 6.5.

ответ

3

Я не уверен, если есть модуль для этого уже сделано, но вы можете использовать эту технику: http://newguid.net/sitecore/2013/coded-field-datasources-in-sitecore/

Это объясняет, как вы можете использовать класс в качестве источника данных. Таким образом, вы можете создать класс, в котором перечислены все роли пользователя.

+0

Это именно то, что я искал, но не знал, что искать, спасибо! – mmmeff

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; 
} 
Смежные вопросы