---
title: "カタログデータのプログラム的インポート"
slug: "importing-catalog-data-programmatically"
abstract: "Commerce Engine SDKのサンプルを活用してカスタムカタログインポート操作を作成する方法。"
---
# カタログデータのプログラム的インポート

ほとんどのSitecore Experience Commerce実装では、カタログデータをプログラム的にインポートする要件があります。カタログデータのインポートカスタマイズを作成する際には、データの量、インポート操作の頻度、外部製品情報管理システムとの連携の有無、インポート操作のトリガー先などに応じて異なるアプローチを取ることができます。

このトピックでは、Sitecore.Commerce.Engine.SDKで提供されているサンプルの一部をどのように活用して以下のようなことができるかに焦点を当てています。

-   ウェブクライアントによってHTTPリクエストでトリガーされるカスタムカタログインポート操作を作成します。
-   カスタムCommerce Engineプラグインにカタログインポート操作を追加してください。

## ウェブクライアントによってトリガーされるカスタムカタログインポートの作成

Sitecore.Commerce.Engine.SDKには、RunImportという名前のサンプル静的ヘルパーメソッドを定義したSitecore.Commerce.Sample.Consoleアプリケーションが含まれています。このRunImportメソッドを使ってHTTPリクエストを通じてカタログインポートをトリガーできます。箱から出してみると、このメソッドはPostmanで[Initialize Environmentサンプル](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/clean-and-initialize-the-environment.html "Clean and initialize the environment")リクエストを実行するときに呼び出されます。

RunImportメソッドを含むコンソールアプリケーション拡張ファイルへのパスは以下の通りです:

Sitecore.Commerce.Engine.SDK.\*.\*.\*\*\\src\\Sitecore.Commerce.Sample.Console\\Extensions\\EngineExtensions.cs

サンプルRunImportメソッドはカタログをインポートし、カタログエンティティもデフォルトで公開します。しかし、カタログをコンテンツを公開せずにインポートしたい場合は、公開オプションをブールでパラメータ化した以下のコード例を使用できます。

private static
 async Task RunImport(  
 string filePath,        
 string mode,         
 string importMethodName,  
 bool publish,         
 params string allowedErrorTerms)
{          
 using (new SampleMethodScope())        
 {            
 File.Exists(filePath).Should().BeTrue();          
 using (var importStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))               
 {                 
 using (var hc = CreateHttpClientAuthoring())             
 {                 
 using (var importContent = new MultipartFormDataContent())                 
 {                     
 importContent.Add(new StreamContent(importStream), "importFile", filePath);                    
 importContent.Add(new StringContent(mode), "mode");                   
 importContent.Add(new StringContent("0"), "errorThreshold"); 
 importContent.Add(new StringContent(publish ? "true" : "false"), "publish");

 var importResponse = await hc.PostAsync(
 $"{Program.ShopsServiceUri}{importMethodName}()", importContent);
          importResponse.IsSuccessStatusCode.Should().BeTrue();                 
 var importResponseText = await importResponse.Content.ReadAsStringAsync();                 
 var importCommand = JsonConvert.DeserializeObject<CommerceOps.Sitecore.Commerce.Core.Commands.CommerceCommand>(importResponseText);                         
 importCommand.WaitUntilCompletion(allowedErrorTerms);                     
 }                 
 }               
 }          
 }
}

> !注未公開状態でカタログエンティティをインポートすると、Business Toolsユーザーは各エンティティを承認ワークフローに通してストアフロントに公開しなければなりません。コンテンツエディターを使ってCommerceアイテムを公開することはできません。

## Commerce Engineでトリガーされるカスタムカタログインポートの作成

一部の商取引実装では、Commerce Engineがインポート操作をトリガーする必要があります。カタログデータインポート操作を処理するために、Commerceエンジンをカスタマイズする独自のプラグインを作成することもできます。例えば、スケジュールされたカタログインポートルーチンを実行する場合などです。

Sitecore.Commerce.Engine.SDKには、カスタムカタログインポートプラグインの良い出発点となる2つのサンプルカタログ管理プラグイン、Plugin.Sample.AdventureWorksプラグインとPlugin.Sample.Habitatプラグインが含まれています。

これらのサンプルプラグインでは、InitializeCatalogBlockクラスがカタログインポートプロセスを定義します。このサンプルクラスはカスタムカタログ管理プラグインでインポート機能を扱うために使用できます。サンプルHabitatカタログプラグインのこのパイプラインブロックへの完全なパスは以下の通りです:

Sitecore.Commerce.Engine.SDK.\*.\*.\*\*/src/Plugin.Sample.Habitat/Pipelines/Blocks/InitializeCatalogBlock.cs

以下の例に示されているサンプルInitializeCatalogBlockブロックは、AutoApprovePolicyポリシーを設定し、インポートされたエンティティを自動的にストアフロントに公開します。

protected virtual async Task ImportCatalogAsync(CommercePipelineExecutionContext context)
{
    using (var stream = new FileStream(GetPath("Habitat.zip"), FileMode.Open, FileAccess.Read))
    {
        var file = new FormFile(stream, 0, stream.Length, stream.Name, stream.Name);
        var contextOptions = context.CommerceContext.PipelineContextOptions;
        var argument = new ImportCatalogsArgument(file, CatalogConstants.Replace)
        {
            BatchSize = -1,
            ErrorThreshold = 10
        };
            context.CommerceContext.Environment.SetPolicy(new AutoApprovePolicy());
            await \_importCatalogsPipeline.RunAsync(argument, contextOptions).ConfigureAwait(false);
            context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy));
     }
  }
 private string GetPath(string fileName)
 {
    return Path.Combine(\_hostingEnvironment.WebRootPath, "data", "Catalogs", fileName);
 }

[カスタムカタログインポート操作](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/optimize-the-commercecontext-cache-for-a-long-running-process.html "Optimize the CommerceContext cache for a long running process")は、ポリシーキーをプログラム的に渡すことで最適化できますCommerceCommerce.Headers。

### 公開せずにカタログアイテムをインポートする方法

場合によっては、ストアフロントにアイテムを自動公開せずにカタログデータをインポートしたい場合もあります。サンプルプラグインのInitializeCatalogBlockを変更することでこれが可能です。

> !注未公開状態でカタログエンティティをインポートする場合( AutoApprovePolicyポリシーなし)、Business Toolsユーザーはインポートしたエンティティを [パブリッシング](https://doc.sitecore.com/xp/en/users/100/sitecore-experience-commerce/en/entity-versions-and-publishing.html) ワークフローに通して公開しなければなりません。Sitecoreコンテンツエディターを使ってコマースアイテムを公開することはできません。

Plugin.Sample.AdventureWorksとPlugin.Sample.Habitatプラグインは、InitalizeCatalogBlockを実行する前にInitializeEnvironmentパイプラインを呼び出すように設定されています。InitializeEnvironmentパイプラインはデフォルトの動作の一部として、インポートしたカタログアイテムを公開するよう追加・設定AutoApprovePolicyを設定します。カスタムプラグインが同じロジック(サンプルプラグインConfigure.Sitecore.csファイルで定義されている)を使っていて、ストアフロントに公開せずにカタログをインポートしたい場合、InitializeCatalogBlockブロックに追加のコードを追加して明示的にAutoApprovePolicyを削除する必要があります。これは、最初に動作するInitializeEnvironmentがすでに追加・設定AutoApprovePolicyを設定しているため、必要です。

ストアフロントに公開せずにカタログをインポートするには、自動承認ポリシーを解除する文を追加し、それを有効と無効にする2つの文をコメントアウトしてInitializeCatalogBlockを変更してください。以下の例のように:

context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy));
//context.CommerceContext.Environment.SetPolicy(new AutoApprovePolicy());
await \_importCatalogsPipeline.RunAsync(argument, contextOptions).ConfigureAwait(false);
//context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy));