set Data to xdb
new Facet class & XdbModel
using Sitecore.XConnect;
using System;
using System.Collections.Generic;
namespace Custom.XConnect.CustomFacets.Models
{
[Serializable]
[FacetKey(DefaultFacetKey)]
public class CustomField : Facet
{
public string Company { get; set; }
public const string DefaultFacetKey = "CustomCompany";
}
}
using Sitecore.XConnect;
using Sitecore.XConnect.Schema;
namespace Custom.XConnect.CustomFacets.Models
{
public static class CustomFieldCollectionModel
{
public static XdbModel Model { get; } = CreateModel();
private static XdbModel CreateModel()
{
XdbModelBuilder builder = new XdbModelBuilder("Custom.XConnect.CustomFacets.CustomFieldCollectionModel", new XdbModelVersion(1, 0));
builder.ReferenceModel(Sitecore.XConnect.Collection.Model.CollectionModel.Model);
builder.DefineFacet<Contact, CustomField>(CustomField.DefaultFacetKey);
return builder.BuildModel();
}
}
}
Add patch modelType config
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/">
<sitecore>
<xconnect>
<runtime type="Sitecore.XConnect.Client.Configuration.RuntimeModelConfiguration,Sitecore.XConnect.Client.Configuration">
<schemas hint="list:AddModelConfiguration">
<schema name="CustomCollectionModel" type="Sitecore.XConnect.Client.Configuration.StaticModelConfiguration,Sitecore.XConnect.Client.Configuration" patch:after="schema[@name='collectionmodel']">
<param desc="modeltype">Custom.XConnect.CustomFacets.Models.CustomFieldCollectionModel, Custom.XConnect.CustomFacets</param>
</schema>
</schemas>
</runtime>
</xconnect>
</sitecore>
</configuration>
Add Model xml(sc.Custom.XConnect.CustomFacets.xml)
<Settings>
<Sitecore>
<XConnect>
<Services>
<XConnect.Client.Configuration>
<Options>
<Models>
<CustomCollectionModel>
<TypeName>Custom.XConnect.CustomFacets.Models.CustomFieldCollectionModel, Custom.XConnect.CustomFacets</TypeName>
</CustomCollectionModel>
</Models>
</Options>
</XConnect.Client.Configuration>
</Services>
</XConnect>
</Sitecore>
</Settings>
Add Facet xml(sc.MarketingAutomation.ContactLoader.xml)
<Settings>
<!--
Marketing Automation contact loader configuration
-->
<Sitecore>
<XConnect>
<MarketingAutomation>
<Engine>
<Services>
<MarketingAutomation.Loading.ContactFacetsConfigurator>
<Options>
<IncludeFacetNames>
<CustomCompany>CustomCompany</CustomCompany>
</IncludeFacetNames>
</Options>
</MarketingAutomation.Loading.ContactFacetsConfigurator>
</Services>
</Engine>
</MarketingAutomation>
</XConnect>
</Sitecore>
</Settings>
create a exe program to generate json file
using Custom.XConnect.CustomFacets.Models;
using System;
using System.IO;
namespace Custom.XConnect.CustomFacets.GenerateModel
{
internal class Program
{
static void Main(string[] args)
{
var model = Sitecore.XConnect.Serialization.XdbModelWriter.Serialize(CustomFieldCollectionModel.Model);
File.WriteAllText($"{CustomFieldCollectionModel.Model.FullName}.json", model);
Console.WriteLine("Completed");
Console.Read();
}
}
}
deploy file to sitecore instance
jobs IndexWorker:
1.\App_data\Models\Custom.XConnect.CustomFacets.CustomFieldCollectionModel, 1.0.json
2.\Custom.XConnect.CustomFacets.dll
3.restart services
jobs AutomationEngine:
1.\Custom.XConnect.CustomFacets.dll
2.\App_Data\Config\sitecore\sc.Custom.XConnect.CustomFacets.xml
3.\App_Data\Config\sitecore\sc.MarketingAutomation.ContactLoader.xml
4.restart services
xconnect/search:
1.\App_data\Models\Custom.XConnect.CustomFacets.CustomFieldCollectionModel, 1.0.json
2.\bin\Custom.XConnect.CustomFacets.dll
cm&cd:
1.\bin\Custom.XConnect.CustomFacets.dll
2.\App_Config\Include\Custom.XConnect.CustomFacets.config
In the Core database, package item:
/sitecore/client/Applications/ExperienceProfile/Search/PageSettings/SearchResults/Company
set data to custom info in field
get data from xdb
Create a projec to add result extend field
using Newtonsoft.Json;
using Sitecore.Cintel.Client.Transformers.Contact;
using Sitecore.Cintel.Search;
namespace Custom.Feature.ExperienceProfile.Search.Transformer
{
public class CustomContactSearchResultEx : ContactSearchResultEx
{
[JsonProperty("company")]
public string Company { get; set; }
public CustomContactSearchResultEx()
{
}
public CustomContactSearchResultEx(IContactSearchResult result)
: base(result)
{
if (result is ContactSearchResultEx contactSearchResultEx)
{
FormattedLatestVisitStartDateTime = contactSearchResultEx.FormattedLatestVisitStartDateTime;
Recency = contactSearchResultEx.Recency;
Company = "";
}
if (result is CustomContactSearchResultEx customContactSearchResultEx)
{
FormattedLatestVisitStartDateTime = customContactSearchResultEx.FormattedLatestVisitStartDateTime;
Recency = customContactSearchResultEx.Recency;
Company = customContactSearchResultEx.Company;
}
}
}
}
using Custom.XConnect.CustomFacets.Models;
using Sitecore.Analytics.Model;
using Sitecore.Cintel.Client;
using Sitecore.Cintel.Client.Transformers;
using Sitecore.Cintel.Commons;
using Sitecore.Cintel.Endpoint.Transfomers;
using Sitecore.Cintel.Search;
using Sitecore.Diagnostics;
using Sitecore.EmailCampaign.Model.XConnect.Facets;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Custom.Feature.ExperienceProfile.Search.Transformer
{
public class CustomContactSearchResultTransformer : IContactSearchResultTransformer, IResultTransformer<List<IContactSearchResult>>
{
private readonly TimeConverter timeConverter;
private readonly TextConverter textConverter;
public CustomContactSearchResultTransformer()
{
timeConverter = ClientFactory.Instance.GetTimeConverter();
textConverter = ClientFactory.Instance.GetTextConverter();
}
public CustomContactSearchResultTransformer(TimeConverter timeConverter, TextConverter textConverter)
{
this.timeConverter = timeConverter;
this.textConverter = textConverter;
}
public object Transform(ResultSet<List<IContactSearchResult>> resultSet)
{
Assert.ArgumentNotNull(resultSet, "resultSet");
if (resultSet.Data.Dataset.Count == 0)
return resultSet;
List<IContactSearchResult> searchResult = resultSet.Data.Dataset.FirstOrDefault().Value;
if (searchResult == null)
return resultSet;
DateTime nowTime = DateTime.UtcNow;
List<CustomContactSearchResultEx> collection = searchResult.Select((IContactSearchResult r) => ExtendResult(r, nowTime)).ToList();
searchResult.Clear();
searchResult.AddRange(collection);
return resultSet;
}
private CustomContactSearchResultEx ExtendResult(IContactSearchResult result, DateTime nowTime)
{
CustomContactSearchResultEx contactSearchResultEx = new CustomContactSearchResultEx(result)
{
FormattedLatestVisitStartDateTime = timeConverter.FormatDateTime(result.LatestVisitStartDateTime),
Recency = timeConverter.GetRecency(result.LatestVisitEndDateTime, nowTime),
LatestVisitLocationDisplayName = textConverter.GetLocation(result.LatestVisitLocationCityDisplayName, result.LatestVisitLocationRegionDisplayName, result.LatestVisitLocationCountryDisplayName),
EmailAddressExt = HttpUtility.HtmlEncode(textConverter.GetEmail(result.PreferredEmail)),
LatestDuration = timeConverter.GetDuration(result.LatestVisitStartDateTime, result.LatestVisitEndDateTime),
};
//result.ContactId
string[] source = new string[3] { result.FirstName, result.MiddleName, result.Surname };
source = source.Select((string item) => HttpUtility.HtmlEncode(item)).ToArray();
contactSearchResultEx.FullName = textConverter.GetFullName((ContactIdentificationLevel)result.IdentificationLevel, source);
contactSearchResultEx.Company = GetCompany(result.ContactId);
return contactSearchResultEx;
}
private string GetCompany(Guid contactId)
{
string company = string.Empty;
using (XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
{
var reference = new Sitecore.XConnect.ContactReference(contactId);
Contact contact = client.Get(reference, new ContactExecutionOptions(new ContactExpandOptions(PersonalInformation.DefaultFacetKey, EmailAddressList.DefaultFacetKey, ExmKeyBehaviorCache.DefaultFacetKey, CustomField.DefaultFacetKey)));
if (contact != null)
{
CustomField CustomField = contact.GetFacet<CustomField>(CustomField.DefaultFacetKey);
if (CustomField != null)
{
company = CustomField.Company;
}
}
}
return company;
}
}
}
Add config
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
<sitecore role:require="Standalone or ContentManagement">
<experienceProfile>
<resultTransformManager>
<resultTransformProvider clientName="speakClient">
<contactSearchResultTransformer>
<add key="default"
patch:instead="*[@type='Sitecore.Cintel.Client.Transformers.Contact.ContactSearchResultTransformer, Sitecore.Cintel.Client']"
type="Custom.Feature.ExperienceProfile.Search.Transformer.CustomContactSearchResultTransformer, Custom.Feature.ExperienceProfile.Search" />
</contactSearchResultTransformer>
</resultTransformProvider>
</resultTransformManager>
</experienceProfile>
</sitecore>
</configuration>
Deploy file to instance(dll & config)
-
Deploy “Custom.Feature.ExperienceProfile.Search.dll” to below
d. “sitecore cm instance”\bin -
Deploy “Custom.Feature.ExperienceProfile.Search.config”
a. “sitecore instance”\App_Config\Include\ (both cm & cd)