I’m using the Tridion.OutboundEmail.ContentManagement API to retrieve and manage contact details.
Retrieving Contacts is working fine, as is pulling back the ExtendedDetails dictionary, but the Keywords TcmUriCollection is always empty.
[Test]
public void GetContacts_via_address_book()
{
var uri = new TcmUri(101, 2, TcmItemTypes.StaticAddressBook);
var addressBook = new StaticAddressBook(uri);
var contacts = addressBook.GetContacts();
foreach (var contact in contacts)
{
var firstName = contact.ExtendedDetails["NAME"].StringValue;
Assert.That(contact.EmailAddress, Is.Not.Empty); // PASS
Assert.That(firstName, Is.Not.Empty); // PASS
Assert.That(contact.Keywords.Count, Is.GreaterThan(0)); // FAIL
}
}
I’ve also tried the following method:
[Test]
public void GetContacts_via_filter()
{
var uri = new TcmUri(101, 2, TcmItemTypes.StaticAddressBook);
var addressBook = new StaticAddressBook(uri);
var filter = new ContactFilter(UserContext.Current);
var contacts = Contact.GetContacts(filter, addressBook);
foreach (var contact in contacts)
{
var firstName = contact.ExtendedDetails["NAME"].StringValue;
Assert.That(contact.EmailAddress, Is.Not.Empty); // PASS
Assert.That(firstName, Is.Not.Empty); // PASS
Assert.That(contact.Keywords.Count, Is.GreaterThan(0)); // FAIL
}
}
I can even add a keyword to a Contact’s Keywords collection and save it, and it appears correctly in Tridion, but when I retrieve the same contact again, the collection is once again empty.
Does anyone have any experience with this API, and/or know what the problem is?
This is because Keywords are not loaded when you get a list of Contacts. Only a subset of the data is available, for performance reasons.
To solve this, you will need to re-load each Contact. Since Contacts are streamed from the database, you cannot do this inside of your loop. So you’ll want to build the list of Contacts first and then loop over them and load them in full.
For more info and examples, please see my blog post on the subject:
http://pkjaer.wordpress.com/2011/12/01/looping-through-contacts/