Sitecore Experience Profile Add Custom Field

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)

  1. Deploy “Custom.Feature.ExperienceProfile.Search.dll” to below
    d. “sitecore cm instance”\bin

  2. Deploy “Custom.Feature.ExperienceProfile.Search.config”
    a. “sitecore instance”\App_Config\Include\ (both cm & cd)

Result

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值