【问题标题】:Macro gets current user macro not contacts宏获取当前用户宏而不是联系人
【发布时间】:2019-05-10 01:42:15
【问题描述】:

我正在尝试创建一个自定义模块,该模块存储一些包含基于收件人列表的宏的文本。收件人列表来自特定的联系人组。

我有一个富文本编辑器,其中包含文本“Hi {%Contact.ContactFirstName%}”,需要根据联系人将其转换为实际名字并将其存储在表格中。

首先,我将获取联系人组成员的电子邮件并将其放入数组中。

然后,我使用了 Send(IssueInfo issue, string recipients) 方法并将电子邮件传递给该方法,解析宏并将其存储在表中。

但是,存储在表中的值是当前用户(即我自己)的名字,而不是联系人的名字。

以下是获取联系人组中所有成员的代码。

 var members = ContactInfoProvider.GetContacts().WhereIn("ContactID", ContactGroupMemberInfoProvider.GetRelationships().Column("ContactGroupMemberRelatedID").WhereEquals("ContactGroupMemberType", 0).WhereIn("ContactGroupMemberContactGroupID", IssueContactGroupInfoProvider.GetIssueContactGroups().Column("ContactGroupID").WhereEquals("IssueID", issue.IssueID))).WhereNotEmpty("ContactMobilePhone");

foreach (var member in members)
{
   email += ValidationHelper.GetString(member.GetValue("ContactEmail"), "") + ";";
}

这是解析宏并存储在表中的代码。其中大部分来自电子邮件营销模块代码。

 public void Send(SMSIssueInfo issue, string recipients)
    {
        if (issue == null)
            throw new ArgumentNullException(nameof(issue));
        if (string.IsNullOrEmpty(recipients))
            throw new ArgumentNullException(nameof(recipients));
        SMSInfo newsletterInfo = SMSInfoProvider.GetSMSInfo(issue.IssueSMSID);
        if (newsletterInfo == null)
            throw new InvalidOperationException("SMS not found.");
        SiteInfo siteInfo = SiteInfoProvider.GetSiteInfo(newsletterInfo.SMSSiteID);
        if (siteInfo == null)
            throw new InvalidOperationException("SMS site not found.");
        string[] strArray = recipients.Split(new char[1]
        {
        ';'
        }, StringSplitOptions.RemoveEmptyEntries);
        SMSTemplateInfo SMSTemplate = SMSTemplateInfoProvider.GetSMSTemplateInfo(issue.IssueTemplateID);


        foreach (string smsrecipients in strArray)
        {

            string str = "";
            str = GetEmailBody(issue, newsletterInfo, SMSTemplate, null, false, siteInfo.SiteName, null, null, null);

            SMSIssueHelper issueHelper = new SMSIssueHelper();

            if (issueHelper.LoadDynamicFields(null, newsletterInfo, null, issue, true, siteInfo.SiteName, null, null, null))
            {
                //.Subject = issueHelper.ResolveDynamicFieldMacros(message.Subject, newsletterInfo, issue);
                str = issueHelper.ResolveDynamicFieldMacros(str, newsletterInfo, issue);
            }

            string absolute = LinkConverter.ConvertToAbsolute(str, SMSIssueHelper.GetNewsletterLinksBaseUrl(newsletterInfo, siteInfo));

            var contacts = ContactInfoProvider.GetContactInfo(smsrecipients);

            SMSQueueInfo smsQueue = new SMSQueueInfo();

            smsQueue.SmsLastModified = DateTime.Now;
            smsQueue.SmsScheduledSendTime = DateTime.Now;
            smsQueue.SmsTo = contacts.ContactMobilePhone;
            smsQueue.SetValue("SmsSubject", ValidationHelper.GetString(issue.GetValue("IssueSubject"), ""));
            smsQueue.SetValue("SmsBody", str);
            smsQueue.SetValue("SmsSiteID", ValidationHelper.GetString(issue.GetValue("IssueSiteID"), ""));
            smsQueue.SetValue("SmsCreated", DateTime.Now);
            smsQueue.SetValue("SmsIsScheduled", 0);
            smsQueue.SetValue("SmsIssueID", ValidationHelper.GetString(issue.GetValue("IssueID"), ""));
            smsQueue.SetValue("SmsClientID", ValidationHelper.GetString(contacts.GetValue("ContactClientID"), ""));
            smsQueue.SetValue("SmsClientName", ValidationHelper.GetString(issue.GetValue("ContactFirstName"), ""));
            smsQueue.SetValue("SmsSenderID", MembershipContext.AuthenticatedUser.UserID);
            smsQueue.SetValue("SmsKey", ValidationHelper.GetString(newsletterInfo.GetValue("SMSKey"), ""));
            smsQueue.SetValue("SmsFrom", ValidationHelper.GetString(newsletterInfo.GetValue("SMSSenderNumber"), ""));
            smsQueue.SetValue("SmsClientName", ValidationHelper.GetString(contacts.GetValue("ContactFirstName"), ""));
            smsQueue.SetValue("SmsStatus", 0);

            SMSQueueInfoProvider.SetSMSQueueInfo(smsQueue);
        }


    }

预期结果将是联系人组中联系人的名字,例如“Hi John”,而不是单击“保存”按钮的用户。

我在 Kentico 10.0.42 上。

【问题讨论】:

  • issueHelper 怎么会知道有关联系人的任何信息?换句话说,我认为宏解析器不知道联系人上下文。或者它使用 Kentico 为您的帐户创建的当前联系人。
  • 对我必须做什么有什么建议吗?

标签: c# kentico


【解决方案1】:

我同意彼得的观点,我在我们的一些项目中使用了相同的方法。基本上,您需要在代码中执行所有操作才能获取电子邮件的文本:

  1. 获取包含宏的电子邮件模板文本(它可以包含标准宏和自定义宏)
  2. 为宏解析器注册自定义数据源
  3. 解析宏,然后您就可以发送电子邮件了!

一个小小的补充,可以使用复杂的数据结构作为宏数据源。下面是动态填充事件(Event 页面类型)和参加者(ContactInfo 模块类)数据的示例:

    public static string GetEventEmailText(string emailTemplateName, string contactEmail)
    {
        var eventItem = EventDocumentService.GetCachedItems().FirstOrDefault();
        var contact = ContactInfoProvider.GetContactInfo(contactEmail);

        var resolver = MacroResolver.GetInstance();
        resolver.SetNamedSourceData("Event", eventItem);
        resolver.SetNamedSourceData("Attendee", contact);
        resolver.Settings.EncodeResolvedValues = true;

        var emailTemplate = EmailTemplateProvider.GetEmailTemplate(emailTemplateName, SiteContext.CurrentSiteName);
        return emailTemplate == null ? string.Empty : resolver.ResolveMacros(emailTemplate.TemplateText);
    }

在电子邮件模板中,我使用这些宏:

Hi, {% Attendee.ContactFirstName %} {% Attendee.ContactLastName %}

Your event begins: {% Event.Date.ToString() %}

【讨论】:

  • 非常感谢 Dmitry 和 Peter,这解决了我的问题。现在我知道我需要针对contactInfo 解析宏。非常感谢
【解决方案2】:

您必须为宏解析器设置正确的上下文(数据源)。这是the article how to do it in the email,应该会给你这个想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多