Sitecore 8 EXM добавить контакт в список из listmanager

Я использую Sitecore 8 и новый модуль Email Experience Manager. В качестве получателей я настроил сообщение электронной почты с пустым списком из менеджера списков рассылки.

При подписке на новостную рассылку через самодельную форму я получаю адрес электронной почты и имя. Теперь я хочу установить новый контакт с этим письмом и именем и добавить его в список в моем менеджере списков с помощью кода.

Есть ли способ вызвать этот список через API и добавить в него контакт?

4 ответа

Решение

У меня была точно такая же проблема, то есть менеджер списков сообщает 0 контактов после добавления контакта в список получателей.

Я рассмотрел проблему ближе и обнаружил, что добавление контакта в список получателей фактически просто устанавливает поле контакта в индексе "sitecore_analytics_index" (при условии, что вы используете Mongo/XDB в качестве основного хранилища). В частности, Sitecore должен обновить поле "contact.tags" в документе контакта со значением "ContactLists:{receientListGuid}". Я попытался открыть индекс с помощью Люка, чтобы убедиться, что это поле действительно не задано в индексе. Индекс находится в C:\inetpub\wwwroot[Sitename]\Data\indexes\sitecore_analytics_index.

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

Подводя итог, у меня работает следующий код:

var ecm = EcmFactory.GetDefaultFactory();
XdbContactId contactId = /* some valid contact id */;
LeaseOwner leaseOwner = new LeaseOwner("UpdateContact-" + Guid.NewGuid().ToString(), LeaseOwnerType.OutOfRequestWorker);
Sitecore.Analytics.Tracking.Contact contact;
string webClusterName;
var status = ecm.Gateways.AnalyticsGateway.TryGetContactForUpdate(contactId.Value,
    leaseOwner,
    TimeSpan.FromSeconds(5),
     TimeSpan.FromSeconds(5),
     out contact, out webClusterName);

var recipientList = ecm.Bl.RecipientCollectionRepository.GetEditableRecipientCollection(recipientListId);
  if (recipientList != null)
  {
    if (!recipientList.Contains(contactId, true).Value)
    {
      recipientList.AddRecipient(contactId);
    }
  }

contact.ContactSaveMode = ContactSaveMode.AlwaysSave;
var contactRepository = new ContactRepository();
var success = contactRepository.SaveContact(contact, new ContactSaveOptions(true, leaseOwner));

Обратите внимание, что приведенный выше код используется в сценарии обновления. В вашем случае, я думаю, вам просто нужно переместить этот код:

contactRepository.SaveContact(contact, new ContactSaveOptions(true, null));

После этого:

var recipientList = EcmFactory.GetDefaultFactory().Bl.RecipientCollectionRepository.GetEditableRecipientCollection(recipientListId);
  if (recipientList != null)
  {
    var xdbContact = new XdbContactId(contactId);
    if (!recipientList.Contains(xdbContact, true).Value)
    {
      recipientList.AddRecipient(xdbContact);
    }
  }

ОБНОВЛЕНИЕ: На самом деле вышеприведенное работает только в том случае, если сохраненный контакт является контактом, отслеживаемым в настоящее время Sitecore Analytics.

Чтобы создать контакт, вы можете использовать приведенный ниже пример кода, именем контакта обычно является имя домена плюс имя пользователя, например, домен \ имя пользователя.

public static Contact CreateContact([NotNull] string contactName, [NotNull] string contactEmail, [NotNull] string contactLanguage)
{
  Assert.ArgumentNotNullOrEmpty(contactName, "contactName");
  Assert.ArgumentNotNullOrEmpty(contactEmail, "contactEmail");
  Assert.ArgumentNotNullOrEmpty(contactLanguage, "contactLanguage");

  var contactRepository = new ContactRepository();

  var contact = contactRepository.LoadContactReadOnly(contactName);
  if (contact != null)
  {
    return contact;
  }
  contact = contactRepository.CreateContact(ID.NewID);
  contact.Identifiers.AuthenticationLevel = AuthenticationLevel.None;
  contact.System.Classification = 0;
  contact.ContactSaveMode = ContactSaveMode.AlwaysSave;
  contact.Identifiers.Identifier = contactName;
  contact.System.OverrideClassification = 0;
  contact.System.Value = 0;
  contact.System.VisitCount = 0;

  var contactPreferences = contact.GetFacet<IContactPreferences>("Preferences");
  contactPreferences.Language = contactLanguage;

  var contactEmailAddresses = contact.GetFacet<IContactEmailAddresses>("Emails");
  contactEmailAddresses.Entries.Create("test").SmtpAddress = contactEmail;
  contactEmailAddresses.Preferred = "test";

  var contactPersonalInfo = contact.GetFacet<IContactPersonalInfo>("Personal");
  contactPersonalInfo.FirstName = contactName;
  contactPersonalInfo.Surname = "recipient";

  contactRepository.SaveContact(contact, new ContactSaveOptions(true, null));

  return contact;
}

После создания контакта используйте следующий пример кода, чтобы добавить контакт в список получателей.

  var repository = new ListManagerCollectionRepository();
  var recipientList = repository.GetEditableRecipientCollection(recipientListId);
  if (recipientList != null)
  {
    var xdbContact = new XdbContactId(contactId);
    if (!recipientList.Contains(xdbContact, true).Value)
    {
      recipientList.AddRecipient(xdbContact);
    }
  }

По сути, вы можете следовать этому примеру

<%@ Page Language="c#" %>
<%@ Import Namespace="Sitecore.Analytics" %>
<%@ Import Namespace="Testing.ContactFacets.Model" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Add Employee Data</title>
  </head>
  <body>
    <%
      var contact = Tracker.Current.Contact;
      var data = contact.GetFacet<IEmployeeData>("Employee Data");
      data.EmployeeId = "ABC123";
    %>
    <p>Employee data contact facet updated.</p>
    <p>Contact ID: <b><%=contact.ContactId.ToString()%></b></p>
    <p>Employee #: <b><%=data.EmployeeId%></b></p>
  </body>
</html>

Затем изменения записываются, когда сеанс прекращается, например, так

<%@ Page language="c#" %>
<script runat="server">
  void Page_Load(object sender, System.EventArgs e) {
      Session.Abandon();
  }
</script> 
<!DOCTYPE html>
<html>
  <head>
    <title>Session Abandon</title>
  </head>
  <body>
  </body>
</html>

Пройдите по этой ссылке для получения источника и получения дополнительной информации - http://www.sitecore.net/learn/blogs/technical-blogs/getting-to-know-sitecore/posts/2014/09/introducing-contact-facets

Если у вас есть трекер, и вам не нужно обновлять сразу, должно сработать следующее (обратите внимание, что контакт добавляется в список по истечении сеанса):

//private const string ContactListTagName = "ContactLists";

var contact = Tracker.Current.Contact;

// Identify
if (contact.Identifiers.IdentificationLevel < ContactIdentificationLevel.Known)
{
    Tracker.Current.Session.Identify(email);
}

// Set Email
var contactEmail = contact.GetFacet<IContactEmailAddresses>("Emails");

// Create an email address if not already present

// This can be named anything, but must be the same as "Preferred" if you want
// this email to show in the Experience Profiles backend. 
if (!contactEmail.Entries.Contains("Preferred"))
    contactEmail.Entries.Create("Preferred");

// set the email
var emailEntry = contactEmail.Entries["Preferred"];
emailEntry.SmtpAddress = email;
contactEmail.Preferred = "Preferred";

// set FirstName and Surname (required for List Manager, "N/A" might not be ideal but I don't know how Sitecore behaves with empty strings)
var personal = contact.GetFacet<IContactPersonalInfo>("Personal");
personal.FirstName = personal.FirstName ?? "N/A";
personal.Surname = personal.Surname ?? "N/A";

// Add preferred language
var preferences = contact.GetFacet<IContactPreferences>("Preferences");
preferences.Language = Context.Language.Name;

// Here is the actual adding to the list by adding tags
using (new SecurityDisabler())
{
    var id = ID.Parse("CONTACTLISTID");
    contact.Tags.Set(ContactListTagName, id.ToString().ToUpperInvariant());
}

Привет, Маркус

Другие вопросы по тегам