xDBプログラミング:エクスペリエンスプロファイルでコンタクトの名前やメールアドレスを表示したい

samatsu 7/24/2015 2418 N/A xDB Programming

コンタクト情報には名前や性別、誕生日、メールアドレスや住所など様々な訪問者の情報を登録することができます。この登録情報はエクスペリエンスプロファイルから確認できます。

当然ですが、訪問者の個人的な情報はソーシャル連携している等特別な状況ではない限り自動的に設定することはできません。Webサイト上でアカウント登録をしてくれた時や訪問者がプロファイル情報を登録、更新してくれたタイミングでコンタクトにその値を連携してあげる必要があります。

本記事では、コンタクトに訪問者の情報(ファセットと呼びます。Sitecore検索のファセットではありません。)を設定する方法をご紹介します。

今回記事を作成するにあたり、動作確認を Sitecore 8 update4 で行っています。

1.コンタクトに登録できるファセット

MongoDBのコンタクトドキュメントにはどのようなファセットを設定できるようになっているでしょうか?Sitecore標準で用意されているファセットの種類を確認する場合は、Sitecore.Analytics.Model.config の/sitecore/model/entities/contact/facets 配下に定義されています(より厳密にはShowConfig.aspxを使用してください)。個人のプロファイル情報や住所、メールアドレス、画像などなどいくつかのファセットがすでに準備されていることがわかります。

2.訪問者の名前や誕生日などのプロファイル情報をコンタクトに設定する

サイトにログインしたユーザーが下図のような個人のプロファイル情報を入力するフォームで名前などの個人情報を入力するシナリオを考えます。

このときにxDBのコンタクトに入力されたプロファイル情報を設定するには次のようなコードを記述してください。ファセットのデータには Contact.GetFacet<T>("ファセットの名前")メソッドでアクセスします。ファセットの名前はSitecore.Analytics.Model.configのfacet要素のname属性で指定されている名前です。

protected void btnUpdateProfile_Click(object sender, EventArgs e)
{
    if (Tracker.IsActive)
    {
        // facetのname属性で指定した名前をGetFacetの引数に指定します。
        var personalInfo = Tracker.Current.Contact.GetFacet<IContactPersonalInfo>("Personal");
        personalInfo.FirstName = txtFirstName.Text;
        personalInfo.MiddleName = string.Empty;
        personalInfo.Surname = txtLastName.Text;
        personalInfo.JobTitle = txtTitle.Text;
        personalInfo.Gender = "male";
        personalInfo.BirthDate = DateTime.Parse("2000/12/24");
        personalInfo.Nickname = "ニックネームテスト";
        personalInfo.Suffix = "さんテスト";
        personalInfo.Title = "タイトルテスト";
    }
}

実際にMogoDBのContactsコレクションを確認すると確認すると次のようになります。Personalフィールドが追加され、上記サンプルコードで入力した値が設定されていることがわかります。

サイトコアエクスペリエンスプロファイルの最新の訪問者や検索結果の一覧で名前にIContactPersonalInfoに設定した姓名が表示されるようになります。

xProfileでコンタクトを見ると詳細タブに設定した個人情報が表示されるようになります。

これで個人の情報をコンタクトに登録することができるようになりました。

3.コンタクトにメールアドレスや住所、電話番号も登録する

前のセクションではコンタクトに名前、誕生日などのパーソナル情報を登録しました。今度はメールアドレスや住所、電話番号をコンタクトに登録してみます。

例えば次のようなプロファイルを入力するフォームでメインのメールアドレスや電話番号を登録してもらうとします。このときにコンタクトに入力した情報を連携します。サンプルのフォームが長くなるので、住所はコード側で固定で設定します。

コンタクトにメールアドレス、住所、電話番号を登録するには次のようなコードを記述します。基本的に前述した個人のプロファイル情報をIContactPersonalInfoファセットに登録した手順と同じです。構成ファイルのfacet要素のname属性で指定されたファセット名をContact.GetFacet<T>()メソッドを呼び出し、必要なプロパティを設定するだけです。電子メールや住所、電話番号は複数のデータを登録できるので、特定のキー名を使用しtえEntriesプロパティに格納されているメールアドレスや住所、電話番号を取得し、既に存在すれば上書き、存在しなければエントリを新規に作成するようにしています。主に使う住所や電話番号、メールアドレスはそれぞれのファセットのPreferred属性にデータ作成時に使用したキー名を設定します。キー名は任意の文字列を指定できます。

protected void btnUpdateProfiles_Click(object sender, EventArgs e)
{
    if (Tracker.IsActive)
    {
        // facetのname属性で指定した名前をGetFacetの引数に指定します。
        var emails = Tracker.Current.Contact.GetFacet<IContactEmailAddresses>("Emails");
        var email1 = emails.Entries.Contains("Primary") ? emails.Entries["Primary"] : emails.Entries.Create("Primary");
        email1.SmtpAddress = txtEmail1.Text;
        if (!string.IsNullOrEmpty(txtEmail2.Text))
        {
            var email2 = emails.Entries.Contains("Sub") ? emails.Entries["Sub"] : emails.Entries.Create("Sub");
            email2.SmtpAddress = txtEmail2.Text;
        }
        emails.Preferred = "Primary"; // Primaryを優先メールアドレスに指定

        var addresses = Tracker.Current.Contact.GetFacet<IContactAddresses>("Addresses");
        var add1 = addresses.Entries.Contains("Primary") ? addresses.Entries["Primary"] : addresses.Entries.Create("Primary");
        add1.Location.Longitude = 12.0f;
        add1.Location.Latitude = 34.0f;
        add1.Country = "Japan";
        add1.PostalCode = "222-3333";
        add1.StateProvince = "Tokyo";
        add1.City = "新宿区";
        add1.StreetLine1 = "3-4-2";
        add1.StreetLine2 = "西新宿";

        addresses.Preferred = "Primary"; 

        var phones = Tracker.Current.Contact.GetFacet<IContactPhoneNumbers>("Phone Numbers");
        var phone1 = phones.Entries.Contains("Primary") ? phones.Entries["Primary"] : phones.Entries.Create("Primary");
        phone1.CountryCode = "81";
        phone1.Number = txtTel1.Text;
        //phone1.Extension = ""; // 内線番号
        if (!string.IsNullOrEmpty(txtTel2.Text))
        {
            var phone2 = phones.Entries.Contains("Sub") ? phones.Entries["Sub"] : phones.Entries.Create("Sub");
            phone2.Number = txtTel2.Text;
        }
        phones.Preferred = "Primary"; // 優先電話番号
    }

}

ファセットデータがコレクションなので少し複雑になりましたが行っている処理は値を設定するだけなのでとても簡単です。MongoDBのContactsコレクションのドキュメントには次のように電子メールや住所、電話番号が登録されます(下図で住所を展開すると縦に長くなるのでツリーを展開していません。)。各ファセットに対応するフィールドにPreferredフィールドがあり、値がサンプルコードで指定したキー名になっていることを確認してください。

エクスペリエンスプロファイルの最新の訪問者や検索結果の電子メールアドレスにはPreferredで指定した電子メールアドレスが表示されるようになります!!

コンタクト情報を表示すると、詳細タブに登録した複数のメールアドレスや電話番号、住所が表示されます。下図の右側の詳細欄にはPreferredで指定した電子メールや電話番号が表示されます。

個人の様々なプロファイル情報をコンタクトドキュメントに登録することができました。

3.まとめ

今回名前や、住所、メールアドレスや電話番号などのファセット情報をコンタクトに登録するサンプルを掲載しました。登録方法は特に難しくないことがわかると思います。

今回すべてのファセットを紹介していませんが、値の登録方法はどれも同じです。例えばPreferencesという名前の IContactPreferences は Language というユーザーのプライマリ言語を登録できるようになっています。Pictureという名前の IContactPicture にはコンタクトの画像を表すバイトデータを登録できます。ここに登録した画像がxProfileに表示されます。 機会があればFacebookなどの登録画像をとってくるサンプルを記載してみようと思います。

コンタクトにカスタムデータを持たせる方法はxDBプログラミング:コンタクトにカスタムデータを登録したいを参照してください。