2

特定のロールのメンバーであるすべてのユーザーが、特定の状態の変化に応じて電子メール通知を受け取るカスタム ワークフローを構築しています。置き換え可能なトークンを使用して、Sitecore アイテムを介して電子メール テンプレートを肉付けし始めましたが、Sitecore で受信者の役割を設定できるようにする方法を見つけるのに苦労しています。ユーザーがロールの文字列表現を入力することは避けたいので、サイトコアで定義されているさまざまなロールを設定する方法があれば、ドロップリンクが理想的です。ドロップリンクに入力するロールをフィルタリングできれば、ボーナス ポイントです。

ユーザー/役割/ドメインがコンテンツ ツリーの項目として定義されていないことは承知していますが、このドロップリンクを構成するにはどうすればよいですか?

サイトコア 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/をご覧になることをお勧めします。ユーザー。

また、個人または役割のいずれかを選択できる 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 に答える