xDBプログラミング:コンタクトにカスタムデータを登録したい

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

前回の投稿で、Sitecoreに事前に用意されているコンタクトのファセット(名前や誕生日、メールアドレス等)をコンタクトに登録する方法を紹介しました。今回は、カスタムデータをコンタクトに登録する方法を記載します。ここで設定することでContactsドキュメントにカスタムデータを登録できるようになります。

訪問者がWebサイトを訪れるとMongoDBのContactsコレクションから訪問者のContactsドキュメントが配信サーバーに読み込まれます。そのため、コンタクトデータはあまり大きくならないようにしてください

今回は 訪問者のランク情報を表すIContactRankファセットを定義して実際にMongoDBのContactsドキュメントに登録されることを確認します。

本記事を作成するにあたり、Sitecore 8 update4 で動作確認を行いました。

1. ファセットクラスの定義

ランクを表すクラスを定義します。ファセットのクラスはファセットを表すコントラクト(インタフェース)とそのインタフェースを実装するクラスで定義します。今回は IContactRankというコントラクトとContactRankというクラスを次のように定義しました。IContractRankインタフェースではPointというポイントを表すプロパティとユーザーのランクを表すRank列挙型プロパティを定義しています。

using Sitecore.Analytics.Model.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace v80u4.Fx.Entities
{
    /// <summary>
    /// コンタクトのランクファセットを表すコントラクト
    /// </summary>
    public interface IContactRank : IFacet
    {
        int Point { get; set; }
        Rank Rank { get; set; }

    }
    /// <summary>
    /// ランクを表す列挙型
    /// </summary>
    public enum Rank
    {
        Nomal,
        Super,
        Hyper
    }
    /// <summary>
    /// ランクを実装するファセットクラス
    /// </summary>
    public class ContactRank : Facet, IContactRank
    {
        public int Point
        {
            get
            {
                return base.GetAttribute<int>("Point");
            }
            set
            {
                base.SetAttribute<int>("Point", value);
            }
        }

        public Rank Rank
        {
            get
            {
                return base.GetAttribute<Rank>("Rank");
            }
            set
            {
                base.SetAttribute<Rank>("Rank", value);
            }
        }
    }
}

ビルドを行ってエラーがないことを確認しましょう。続いてSitecoreのプラットフォームでファセットとして使うことができるようにパッチファイル(configファイル)を作成します。

2.パッチファイルの定義

SitecoreのWebsiteフォルダ配下のApp_Config\Includeフォルダにパッチ用のconfigファイルを作成します。Visual Studioで管理することもできます。以下がパッチ用のconfigファイルの例です。sitecore/model/elementsセクションにIContactRankを実装するクラスがContactRankクラスであることを定義しentitiesセクションでコンタクトのファセットとしてIContactRankをContactRankという名前で定義しています。

<?xml version="1.0" encoding="utf-8"?>
<!--
  カスタムのコンタクト情報を保存するファセットの設定    
-->
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <model>
      <elements>
        <element interface="v80u4.Fx.Entities.IContactRank, v80u4" implementation="v80u4.Fx.Entities.ContactRank, v80u4" />
      </elements>
      <entities>
        <contact>
          <facets>
            <facet name="ContactRank" contract="v80u4.Fx.Entities.IContactRank, v80u4" />
          </facets>
        </contact>
      </entities>
    </model>
  </sitecore>
</configuration>

ShowConfig.aspxなどを使用してパッチが適切に適用されていることを確認しましょう。

3.動作確認

ボタンをクリックしたら次のコードを実行するようにサブレイアウトを定義します。作成したサブレイアウトを任意のページで表示できるように設定して、動作確認を行ってみてください。

if (Tracker.IsActive)
{
        var rank = Tracker.Current.Contact.GetFacet<IContactRank>("ContactRank");
        rank.Point = 20;
        rank.Rank = Rank.Hyper;
}

MongoDBのContactsコレクションのContactsドキュメントを確認すると次のように ContactRankフィールドが作成されていることがわかります。

コンタクトにカスタムデータを登録することで次回Webサイトの訪問者が訪れたときに自動的の登録データも配信サーバーに読み込まれるようになります。

4.おまけでコンタクトにカスタムタグを追加してみる

Sitecore7.2以前では、Visitor(特定のブラウザーを使って訪問した訪問者のことです)にカスタムデータを追加する場合はキーと値からなくTagを設定することが最も簡単な方法でした。

Sitecore8でもコンタクトにカスタムタグを追加できます。次のようなコードでタグの名前と値を表す文字列を設定できます。サンプルではCustomTagという名前のタグにMyValueという値を追加していますが、Add("CustomTag", "AnotherValue")のように呼び出すことで同じタグに複数の値を追加できます。

if (Tracker.IsActive)
{
        Tracker.Current.Contact.Tags.Add("CustomTag", "MyValue");
}

上記コードを実行すると次のようにContactsドキュメントにTagsフィールドが追加されその中にCustomTagという名前でタグが追加され、メソッドで指定した値が格納されていることを確認できます。

Sitecore7時代のTagの機能を使っていた方は似たように引き続きTag機能を使えますが、ファセットのほうが文字列以外のデータを持つタイプセーフなオブジェクトを登録できるので通常はカスタムのファセットを使用することになると思います。

5.まとめ

今回はコンタクトにカスタムの情報を登録する方法をご紹介しました。この機能を利用することでコンタクトに独自の属性情報を持たせることができるようになります。

コンタクトではなく、今回の訪問情報(インタラクション)に対してカスタムデータを登録したい場合は、xDBプログラミング:インタラクションにカスタムデータを登録したいを参照してください。