---
title: "ウォークスルー:カスタムSitecore Commerceテンプレートプロパティのフィールドハンドラ作成"
slug: "walkthrough--creating-a-field-handler-for-custom-sitecore-commerce-template-properties"
abstract: "拡張されたSitecore Commerceテンプレートプロパティをインデックスし、新しいフィールドに基づいて検索を有効にするカスタムフィールドハンドラークラスの作成方法。"
---
# ウォークスルー:カスタムSitecore Commerceテンプレートプロパティのフィールドハンドラ作成

新しいカタログエンティティプロパティをCommerceテンプレートに追加し、それらの新しいプロパティに基づいて検索できるようにしたい場合、以下の条件を満たす必要があります:

-   カスタムのCommerceテンプレートフィールドハンドラーを作成します。
-   新しいカタログエンティティプロパティをCommerce Engineの検索ポリシーセットに追加してください。
-   新しいフィールドをCE Connect検索プロバイダーの設定に追加してください。

## カスタム外部設定フィールドハンドラークラスを作成します

Sitecore Commerceテンプレートに新しいカタログプロパティを追加すると、カスタムインデックスフィールドハンドラクラスを作成し、Catalog External SettingsコンポーネントにカスタムCatalogエンティティのフィールドを追加し、Commerce Engineがそれらの場所を把握できるようにします。

外部設定として定義された新しいカタログプロパティのカスタムハンドラーを作成するには:

1.  Sitecoreから継承するクラスを作成します [。Commerce.Plugin。Search。AbstractIndexFieldHandler](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/the-sitecore-commerce-plugin-search-abstractindexfieldhandler-class.html "The Sitecore.Commerce.Plugin.Search.AbstractIndexFieldHandler class")クラス:
    
    public class ExternalSettingsFieldHandler : AbstractIndexFieldHandler
    
2.  公共財産の名前を付け加えるExternalSettingsPropertyName:
    
    public class ExternalSettingsFieldHandler : AbstractIndexFieldHandler
     {
     public string ExternalSettingsPropertyName { get; set; } = string.Empty;
    
3.  ComposeValueメソッドのオーバーライドを追加し、有効なフィールドハンドラ情報を確認します:
    
    public override object ComposeValue(object source, ConcurrentDictionary<string, object> context)
    {
     // check for valid field handler information
     if (context == null || source == null || !(source is CatalogItemBase entity) || string.IsNullOrEmpty(ExternalSettingsPropertyName))
     {
     return null;
     }
    
4.  ComposeValueの本文で「外部設定」コンポーネントを確認し、設定をインデックスするプロパティの決定論的IDに照合します。
    
    -   一致があれば、指定された言語で最初にインデックスするプロパティ名を探してください。
    -   指定された言語でマッチが存在しない場合は、共有設定を参照してください。
    -   共有設定でマッチが見つからなければ、マッチは存在せず、インデックスするものがありません。
    
    // check for required external settings information
     if (!entity.HasComponent<ExternalSettingsComponent>() ||
     !context.TryGetValue("LanguageCode", out object languageCode) ||
     !context.TryGetValue("DeterministicId", out var tempDeterministicId) ||
     !(tempDeterministicId is Guid deterministicId))
     {
     return null;
     }
     string lang = languageCode.ToString().ToLowerInvariant();
     var externalSettingsComponent = entity.GetComponent<ExternalSettingsComponent>();
     var settingsCollection = JsonConvert.DeserializeObject<Dictionary<Guid, Dictionary<string, Dictionary<string, string>>>>(externalSettingsComponent.Settings);
     if (!settingsCollection.ContainsKey(deterministicId))
     {
     // this id in not in the external settings, return null
     return null;
     }
     var externalSettings = settingsCollectiondeterministicId;
     if (externalSettings == null)
     {
     // bad external settings return null
     return null;
     }
     // look for language first
     if (externalSettings.ContainsKey(lang))
     {
     // we found a language, try to find the property
     var languageSettings = externalSettingslang;
     if (languageSettings.ContainsKey(ExternalSettingsPropertyName))
     {
     // found it, return the value
     return languageSettingsExternalSettingsPropertyName;
     }
     }
     // no language property found, check shared settings
     var sharedSettings = externalSettings"shared";
     if (sharedSettings.ContainsKey(ExternalSettingsPropertyName))
     {
     // found in shared settings, return the value
     return sharedSettingsExternalSettingsPropertyName;
     }
     // Not found, just return null
     return null;
     }
     }
    

## カスタムフィールドハンドラと新しいプロパティを追加して、Searchポリシーセットファイルにインデックスします

カスタムフィールドハンドラと新しいカスタムフィールドを検索インデックスに登録するには、Commerce EngineのSolr検索ポリシーセットに追加する必要があります。

カスタムフィールドハンドラと新しいプロパティをSearchポリシーセットファイルに追加するには:

1.  C:\\inetpub\\wwwroot\\<CommerceEngine>\\wwwroot\\data\\Environments\\PlugIn.Search.Solr.PolicySet-1.0.0.jsonファイルを開け。
    
2.  インデックス構成を含むセクションを見つけてください。例えば、以下の例は新しいハンドラークラス("$type": "Myplugin.Search.Solr.ExternalSettingsFieldHandler, MyPlugin.Search.Solr")を定義するSitecoreマスターインデックス構成と、インデックス用のカスタムカタログエンティティプロパティ(「ExternalSettingsPropertyName」: "TestingText")を示しています。
    
    {
     "$type": "Sitecore.Commerce.Plugin.Search.ItemIndexablePolicy, Sitecore.Commerce.Plugin.Search",
     "IndexName": "sitecore\_master\_index",
     "FieldTypeMappers": ...
     "Fields":  ...
     {
     "$type": "MyPlugin.Search.Solr.SolrIndexFieldConfiguration, MyPlugin.Search.Solr",
     "Name": "ExampleExternalSettingProperty",
     "Type": "System.String",
     "Handler": {
     "$type": "Myplugin.Search.Solr.ExternalSettingsFieldHandler, MyPlugin.Search.Solr",
     "ExternalSettingsPropertyName": "TestingText"
     },
     "Localizable": true
    }
    
3.  インデックス構成では、以下の変更を加えます。
    
    -   "Name"プロパティをテンプレートの新しいカスタムフィールドの名前に合わせて更新してくださいSitecore。
        
    -   "Handler":クラスを新しいインデックスフィールドハンドラークラスの名前で更新します。
        
        > !注新しいカスタムフィールドが共有設定でない場合は、"Localizable": true
        
4.  設定変更を行ったら、[Commerce Engineをブートストラップしてください](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/bootstrap-the-commerce-engine.html "Bootstrap the Commerce Engine")。
    
5.  IISマネージャー Microsoft Commerce Engineのミニオンサービスを再起動します(例: CommerceMinions\_Sc)。
    
6.  [手動でインデックスSitecore XP再構築します](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/manually-rebuild-sitecore-xp-indexes.html "Manually rebuild Sitecore XP indexes")。インデックスを再構築した後、Solr Adminクエリページで新しい検索ハンドラが検索インデックスに表示されます。以下の例では、新しいインデックスフィールドは "exampleexternalsettingproperty\_t":"Testing Text"
    
    {
     "responseHeader":{
     "status":0,
     "QTime":2,
     "params":{
     "q":"\*:\*",
     "fl":"\_displayname, productid\_t, commercesearchitemtype\_t,catalogentityid\_t, exampleexternalsettingproperty\_t, exampleexternalsettingproperty\_t\_en",
     "fq":"catalogentityid\_t:\\"Entity-SellableItem-7042112\\"",
     "\_language:en",
     "\_latestversion:true",
     "\_parent:e9f2e3a705750632b67e5e65092230c3",
     "rows":"11",
     "\_":"1611154590220"}},
     "response":{"numFound":1,"start":0,"docs":
     {
     "productid\_t":"7042112",
     "\_displayname":"Optix 9.2MP Flash Memory Camcorder—30X 320X Zoom",
     "commercesearchitemtype\_t":"SellableItem",
     "catalogentityid\_t":"Entity-SellableItem-7042112",
     "exampleexternalsettingproperty\_t":"Testing Text",
     "exampleexternalsettingproperty\_t\_en":"Testing Text"}
     }
    }
    

## CE Connect検索プロバイダー設定に新しいフィールドを追加する

新しいフィールドをSitecoreで検索可能にするには、CE Connectの検索プロバイダー設定に追加する必要があります。

CE Connectの検索プロバイダー設定に新しいフィールドを追加するには:

1.  Sitecoreサービスインスタンスの \\App\_Config\\Include\\Y.Commerce.Engineフォルダで検索プロバイダーの設定ファイルを開きます。例えば、Sorlの場合はSitecore.Commerce.Engine.Connectors.Index.Solr.configファイルを開いてください。
    
2.  FieldMapセクションで新しいfieldName定義を追加します。次の例では、"exampleexternalsettingproperty"という新しいフィールドを追加します。
    
    <field fieldName="exampleexternalsettingproperty" storageType="YES" indexType="UN\_TOKENIZED" vectorType="NO" boost="1f" returnType="string" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider"/>