Макрос получает текущий пользовательский макрос, а не контакты - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь создать пользовательский модуль, который хранит некоторый текст, который содержит некоторые макросы на основе списка получателей. Список получателей из определенной группы контактов.

У меня есть текстовый редактор с текстом «Hi {% Contact.ContactFirstName%}», который необходимо преобразовать в фактическое имя на основе контакта и сохранить его в таблице.

Сначала я получу электронные письма членов контактной группы и помещу их в массив.

Затем я использовал метод Send (IssueInfo, строка-получатели) и передал электронные письма методу, который разрешил макрос и сохранил его в таблице.

Однако значениями, которые хранятся в таблице, является имя текущего пользователя (который является мной) вместо имени контакта.

Ниже приведен код для получения всех участников в группу контактов.

 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"), "") + ";";
}

Вот код для разрешения макроса и для хранения внутри таблицы. Большая часть этого просто из кода модуля Email Marketing.

 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);
        }


    }

Ожидаемым результатом будет имя контакта, который находится в группе контактов, например «Привет, Джон», а не пользователь, который нажал кнопку «Сохранить».

Я нахожусь на Kentico 10.0.42.

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Я согласен с Питером, я использовал тот же подход в некоторых наших проектах. По сути, все, что вам нужно сделать в коде, чтобы получить текст письма:

  1. Получить текст шаблона электронной почты, содержащий макросы (может содержать как стандартные, так и пользовательские макросы)
  2. Регистрация пользовательских источников данных для распознавателя макросов
  3. Разрешите макросы, а затем отправьте электронное письмо!

Небольшое дополнение, можно использовать сложные структуры данных в качестве источников макроданных. Вот пример динамического заполнения данных о событиях (тип страницы события) и участниках (класс модуля 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() %}
1 голос
/ 09 мая 2019

Вы должны установить правильный контекст (DataSource) для вашего средства разрешения макросов. Вот статья, как это сделать в электронном письме , которая должна дать вам идею

...