宏获取当前用户宏而不是联系人
Macro gets current user macro not contacts
我正在尝试创建一个自定义模块,该模块存储一些包含基于收件人列表的宏的文本。收件人列表来自特定的联系人组。
我有一个带有文本 "Hi {%Contact.ContactFirstName%}" 的富文本编辑器,需要根据联系人将其转换为实际名字并将其存储在 table.
中
首先,我将获取联系人组成员的电子邮件并将其放入一个数组中。
然后,我使用了 Send(IssueInfo issue, string recipients) 方法并将电子邮件传递给该方法解析宏并将其存储在 table.
但是,存储在 table 中的值是当前用户的名字(即我自己)而不是联系人的名字。
下面是获取联系人组中所有成员的代码。
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"), "") + ";";
}
这是解析宏并存储在 table 中的代码。其中大部分仅来自电子邮件营销模块代码。
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",而不是单击 "Save" 按钮的用户。
我正在使用 Kentico 10.0.42。
您必须为宏解析器设置正确的上下文 (DataSource)。这是 the article how to do it in the email 应该会给你的想法
我同意 Peter 的观点,我在我们的一些项目中使用了相同的方法。基本上,为了获取电子邮件的文本,您需要在代码中执行的所有操作:
- 获取包含宏的电子邮件模板文本(它可以包含标准宏和自定义宏)
- 为宏解析器注册自定义数据源
- 解决macroses然后你就可以发送邮件了!
一个小小的补充,可以使用复杂的数据结构作为宏数据源。下面是动态填充事件(事件页面类型)和参与者(ContactInfo 模块 class)数据的示例:
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() %}
我正在尝试创建一个自定义模块,该模块存储一些包含基于收件人列表的宏的文本。收件人列表来自特定的联系人组。
我有一个带有文本 "Hi {%Contact.ContactFirstName%}" 的富文本编辑器,需要根据联系人将其转换为实际名字并将其存储在 table.
中首先,我将获取联系人组成员的电子邮件并将其放入一个数组中。
然后,我使用了 Send(IssueInfo issue, string recipients) 方法并将电子邮件传递给该方法解析宏并将其存储在 table.
但是,存储在 table 中的值是当前用户的名字(即我自己)而不是联系人的名字。
下面是获取联系人组中所有成员的代码。
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"), "") + ";";
}
这是解析宏并存储在 table 中的代码。其中大部分仅来自电子邮件营销模块代码。
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",而不是单击 "Save" 按钮的用户。
我正在使用 Kentico 10.0.42。
您必须为宏解析器设置正确的上下文 (DataSource)。这是 the article how to do it in the email 应该会给你的想法
我同意 Peter 的观点,我在我们的一些项目中使用了相同的方法。基本上,为了获取电子邮件的文本,您需要在代码中执行的所有操作:
- 获取包含宏的电子邮件模板文本(它可以包含标准宏和自定义宏)
- 为宏解析器注册自定义数据源
- 解决macroses然后你就可以发送邮件了!
一个小小的补充,可以使用复杂的数据结构作为宏数据源。下面是动态填充事件(事件页面类型)和参与者(ContactInfo 模块 class)数据的示例:
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() %}